summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--js/prefs.js25
-rw-r--r--js/tt-rss.js25
-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
-rwxr-xr-xlib/dojo-src/rebuild-dojo.sh10
-rw-r--r--lib/dojo-src/tt-rss.profile.js (renamed from lib/dojo-src/profile.js)25
-rw-r--r--lib/dojo/AdapterRegistry.js103
-rw-r--r--lib/dojo/AdapterRegistry.js.uncompressed.js113
-rw-r--r--lib/dojo/DeferredList.js81
-rw-r--r--lib/dojo/DeferredList.js.uncompressed.js86
-rw-r--r--lib/dojo/Evented.js8
-rw-r--r--lib/dojo/Evented.js.uncompressed.js32
-rw-r--r--lib/dojo/NodeList-data.js171
-rw-r--r--lib/dojo/NodeList-data.js.uncompressed.js181
-rw-r--r--lib/dojo/NodeList-dom.js8
-rw-r--r--lib/dojo/NodeList-dom.js.uncompressed.js454
-rw-r--r--lib/dojo/NodeList-fx.js215
-rw-r--r--lib/dojo/NodeList-fx.js.uncompressed.js222
-rw-r--r--lib/dojo/NodeList-html.js46
-rw-r--r--lib/dojo/NodeList-html.js.uncompressed.js55
-rw-r--r--lib/dojo/NodeList-manipulate.js728
-rw-r--r--lib/dojo/NodeList-manipulate.js.uncompressed.js730
-rw-r--r--lib/dojo/NodeList-traverse.js504
-rw-r--r--lib/dojo/NodeList-traverse.js.uncompressed.js508
-rw-r--r--lib/dojo/OpenAjax.js47
-rw-r--r--lib/dojo/Stateful.js137
-rw-r--r--lib/dojo/Stateful.js.uncompressed.js139
-rw-r--r--lib/dojo/_base.js22
-rw-r--r--lib/dojo/_base/Color.js224
-rw-r--r--lib/dojo/_base/Color.js.uncompressed.js220
-rw-r--r--lib/dojo/_base/Deferred.js342
-rw-r--r--lib/dojo/_base/Deferred.js.uncompressed.js366
-rw-r--r--lib/dojo/_base/NodeList.js1009
-rw-r--r--lib/dojo/_base/NodeList.js.uncompressed.js100
-rw-r--r--lib/dojo/_base/_loader/bootstrap.js505
-rw-r--r--lib/dojo/_base/_loader/hostenv_browser.js477
-rw-r--r--lib/dojo/_base/_loader/hostenv_rhino.js214
-rw-r--r--lib/dojo/_base/_loader/loader.js816
-rw-r--r--lib/dojo/_base/_loader/loader_debug.js86
-rw-r--r--lib/dojo/_base/_loader/loader_xd.js727
-rw-r--r--lib/dojo/_base/array.js259
-rw-r--r--lib/dojo/_base/array.js.uncompressed.js343
-rw-r--r--lib/dojo/_base/browser.js24
-rw-r--r--lib/dojo/_base/browser.js.uncompressed.js21
-rw-r--r--lib/dojo/_base/config.js8
-rw-r--r--lib/dojo/_base/config.js.uncompressed.js174
-rw-r--r--lib/dojo/_base/configFirefoxExtension.js (renamed from lib/dojo/_base/_loader/hostenv_ff_ext.js)92
-rw-r--r--lib/dojo/_base/configNode.js87
-rw-r--r--lib/dojo/_base/configRhino.js121
-rw-r--r--lib/dojo/_base/configSpidermonkey.js (renamed from lib/dojo/_base/_loader/hostenv_spidermonkey.js)33
-rw-r--r--lib/dojo/_base/connect.js307
-rw-r--r--lib/dojo/_base/connect.js.uncompressed.js400
-rw-r--r--lib/dojo/_base/declare.js1044
-rw-r--r--lib/dojo/_base/declare.js.uncompressed.js1050
-rw-r--r--lib/dojo/_base/event.js645
-rw-r--r--lib/dojo/_base/event.js.uncompressed.js51
-rw-r--r--lib/dojo/_base/fx.js666
-rw-r--r--lib/dojo/_base/fx.js.uncompressed.js666
-rw-r--r--lib/dojo/_base/html.js1832
-rw-r--r--lib/dojo/_base/html.js.uncompressed.js389
-rw-r--r--lib/dojo/_base/json.js151
-rw-r--r--lib/dojo/_base/json.js.uncompressed.js85
-rw-r--r--lib/dojo/_base/kernel.js8
-rw-r--r--lib/dojo/_base/kernel.js.uncompressed.js302
-rw-r--r--lib/dojo/_base/lang.js393
-rw-r--r--lib/dojo/_base/lang.js.uncompressed.js707
-rw-r--r--lib/dojo/_base/loader.js8
-rw-r--r--lib/dojo/_base/loader.js.uncompressed.js718
-rw-r--r--lib/dojo/_base/query-sizzle.js877
-rw-r--r--lib/dojo/_base/query.js1597
-rw-r--r--lib/dojo/_base/query.js.uncompressed.js3
-rw-r--r--lib/dojo/_base/sniff.js8
-rw-r--r--lib/dojo/_base/sniff.js.uncompressed.js187
-rw-r--r--lib/dojo/_base/unload.js8
-rw-r--r--lib/dojo/_base/unload.js.uncompressed.js81
-rw-r--r--lib/dojo/_base/url.js8
-rw-r--r--lib/dojo/_base/url.js.uncompressed.js111
-rw-r--r--lib/dojo/_base/window.js104
-rw-r--r--lib/dojo/_base/window.js.uncompressed.js126
-rw-r--r--lib/dojo/_base/xhr.js938
-rw-r--r--lib/dojo/_base/xhr.js.uncompressed.js830
-rw-r--r--lib/dojo/_firebug/firebug.css2
-rw-r--r--lib/dojo/_firebug/firebug.js1222
-rw-r--r--lib/dojo/_firebug/firebug.js.uncompressed.js1183
-rw-r--r--lib/dojo/aspect.js8
-rw-r--r--lib/dojo/aspect.js.uncompressed.js207
-rw-r--r--lib/dojo/back.js395
-rw-r--r--lib/dojo/back.js.uncompressed.js397
-rw-r--r--lib/dojo/behavior.js247
-rw-r--r--lib/dojo/behavior.js.uncompressed.js248
-rw-r--r--lib/dojo/build.txt126
-rw-r--r--lib/dojo/cache.js122
-rw-r--r--lib/dojo/cache.js.uncompressed.js9
-rw-r--r--lib/dojo/cldr/monetary.js35
-rw-r--r--lib/dojo/cldr/monetary.js.uncompressed.js35
-rw-r--r--lib/dojo/cldr/nls/ar/buddhist.js9
-rw-r--r--lib/dojo/cldr/nls/ar/buddhist.js.uncompressed.js115
-rw-r--r--lib/dojo/cldr/nls/ar/currency.js9
-rw-r--r--lib/dojo/cldr/nls/ar/currency.js.uncompressed.js16
-rw-r--r--lib/dojo/cldr/nls/ar/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/ar/gregorian.js.uncompressed.js240
-rw-r--r--lib/dojo/cldr/nls/ar/hebrew.js9
-rw-r--r--lib/dojo/cldr/nls/ar/hebrew.js.uncompressed.js124
-rw-r--r--lib/dojo/cldr/nls/ar/islamic-civil.js1
-rw-r--r--lib/dojo/cldr/nls/ar/islamic.js9
-rw-r--r--lib/dojo/cldr/nls/ar/islamic.js.uncompressed.js156
-rw-r--r--lib/dojo/cldr/nls/ar/number.js9
-rw-r--r--lib/dojo/cldr/nls/ar/number.js.uncompressed.js18
-rw-r--r--lib/dojo/cldr/nls/buddhist.js9
-rw-r--r--lib/dojo/cldr/nls/buddhist.js.uncompressed.js267
-rw-r--r--lib/dojo/cldr/nls/ca/currency.js9
-rw-r--r--lib/dojo/cldr/nls/ca/currency.js.uncompressed.js15
-rw-r--r--lib/dojo/cldr/nls/ca/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/ca/gregorian.js.uncompressed.js235
-rw-r--r--lib/dojo/cldr/nls/ca/number.js9
-rw-r--r--lib/dojo/cldr/nls/ca/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/cs/currency.js9
-rw-r--r--lib/dojo/cldr/nls/cs/currency.js.uncompressed.js15
-rw-r--r--lib/dojo/cldr/nls/cs/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/cs/gregorian.js.uncompressed.js215
-rw-r--r--lib/dojo/cldr/nls/cs/number.js9
-rw-r--r--lib/dojo/cldr/nls/cs/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/currency.js9
-rw-r--r--lib/dojo/cldr/nls/currency.js.uncompressed.js48
-rw-r--r--lib/dojo/cldr/nls/da/buddhist.js9
-rw-r--r--lib/dojo/cldr/nls/da/buddhist.js.uncompressed.js141
-rw-r--r--lib/dojo/cldr/nls/da/currency.js9
-rw-r--r--lib/dojo/cldr/nls/da/currency.js.uncompressed.js16
-rw-r--r--lib/dojo/cldr/nls/da/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/da/gregorian.js.uncompressed.js237
-rw-r--r--lib/dojo/cldr/nls/da/islamic.js9
-rw-r--r--lib/dojo/cldr/nls/da/islamic.js.uncompressed.js87
-rw-r--r--lib/dojo/cldr/nls/da/number.js9
-rw-r--r--lib/dojo/cldr/nls/da/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/de/buddhist.js9
-rw-r--r--lib/dojo/cldr/nls/de/buddhist.js.uncompressed.js130
-rw-r--r--lib/dojo/cldr/nls/de/currency.js9
-rw-r--r--lib/dojo/cldr/nls/de/currency.js.uncompressed.js17
-rw-r--r--lib/dojo/cldr/nls/de/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/de/gregorian.js.uncompressed.js237
-rw-r--r--lib/dojo/cldr/nls/de/islamic.js9
-rw-r--r--lib/dojo/cldr/nls/de/islamic.js.uncompressed.js172
-rw-r--r--lib/dojo/cldr/nls/de/number.js9
-rw-r--r--lib/dojo/cldr/nls/de/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/el/buddhist.js9
-rw-r--r--lib/dojo/cldr/nls/el/buddhist.js.uncompressed.js120
-rw-r--r--lib/dojo/cldr/nls/el/currency.js9
-rw-r--r--lib/dojo/cldr/nls/el/currency.js.uncompressed.js15
-rw-r--r--lib/dojo/cldr/nls/el/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/el/gregorian.js.uncompressed.js241
-rw-r--r--lib/dojo/cldr/nls/el/hebrew.js9
-rw-r--r--lib/dojo/cldr/nls/el/hebrew.js.uncompressed.js73
-rw-r--r--lib/dojo/cldr/nls/el/number.js9
-rw-r--r--lib/dojo/cldr/nls/el/number.js.uncompressed.js20
-rw-r--r--lib/dojo/cldr/nls/en-au/currency.js9
-rw-r--r--lib/dojo/cldr/nls/en-au/currency.js.uncompressed.js8
-rw-r--r--lib/dojo/cldr/nls/en-au/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/en-au/gregorian.js.uncompressed.js17
-rw-r--r--lib/dojo/cldr/nls/en-au/number.js9
-rw-r--r--lib/dojo/cldr/nls/en-au/number.js.uncompressed.js7
-rw-r--r--lib/dojo/cldr/nls/en-ca/currency.js9
-rw-r--r--lib/dojo/cldr/nls/en-ca/currency.js.uncompressed.js8
-rw-r--r--lib/dojo/cldr/nls/en-ca/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/en-ca/gregorian.js.uncompressed.js20
-rw-r--r--lib/dojo/cldr/nls/en-gb/buddhist.js9
-rw-r--r--lib/dojo/cldr/nls/en-gb/buddhist.js.uncompressed.js101
-rw-r--r--lib/dojo/cldr/nls/en-gb/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/en-gb/gregorian.js.uncompressed.js23
-rw-r--r--lib/dojo/cldr/nls/en-gb/islamic.js9
-rw-r--r--lib/dojo/cldr/nls/en-gb/islamic.js.uncompressed.js153
-rw-r--r--lib/dojo/cldr/nls/en-gb/number.js9
-rw-r--r--lib/dojo/cldr/nls/en-gb/number.js.uncompressed.js7
-rw-r--r--lib/dojo/cldr/nls/en/buddhist.js9
-rw-r--r--lib/dojo/cldr/nls/en/buddhist.js.uncompressed.js109
-rw-r--r--lib/dojo/cldr/nls/en/currency.js9
-rw-r--r--lib/dojo/cldr/nls/en/currency.js.uncompressed.js17
-rw-r--r--lib/dojo/cldr/nls/en/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/en/gregorian.js.uncompressed.js229
-rw-r--r--lib/dojo/cldr/nls/en/islamic.js9
-rw-r--r--lib/dojo/cldr/nls/en/islamic.js.uncompressed.js166
-rw-r--r--lib/dojo/cldr/nls/en/number.js9
-rw-r--r--lib/dojo/cldr/nls/en/number.js.uncompressed.js23
-rw-r--r--lib/dojo/cldr/nls/es/buddhist.js9
-rw-r--r--lib/dojo/cldr/nls/es/buddhist.js.uncompressed.js125
-rw-r--r--lib/dojo/cldr/nls/es/currency.js9
-rw-r--r--lib/dojo/cldr/nls/es/currency.js.uncompressed.js15
-rw-r--r--lib/dojo/cldr/nls/es/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/es/gregorian.js.uncompressed.js238
-rw-r--r--lib/dojo/cldr/nls/es/islamic.js9
-rw-r--r--lib/dojo/cldr/nls/es/islamic.js.uncompressed.js179
-rw-r--r--lib/dojo/cldr/nls/es/number.js9
-rw-r--r--lib/dojo/cldr/nls/es/number.js.uncompressed.js21
-rw-r--r--lib/dojo/cldr/nls/fi/buddhist.js9
-rw-r--r--lib/dojo/cldr/nls/fi/buddhist.js.uncompressed.js166
-rw-r--r--lib/dojo/cldr/nls/fi/currency.js9
-rw-r--r--lib/dojo/cldr/nls/fi/currency.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/fi/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/fi/gregorian.js.uncompressed.js239
-rw-r--r--lib/dojo/cldr/nls/fi/hebrew.js9
-rw-r--r--lib/dojo/cldr/nls/fi/hebrew.js.uncompressed.js176
-rw-r--r--lib/dojo/cldr/nls/fi/islamic.js9
-rw-r--r--lib/dojo/cldr/nls/fi/islamic.js.uncompressed.js155
-rw-r--r--lib/dojo/cldr/nls/fi/number.js9
-rw-r--r--lib/dojo/cldr/nls/fi/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/fr-ch/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/fr-ch/gregorian.js.uncompressed.js9
-rw-r--r--lib/dojo/cldr/nls/fr-ch/number.js9
-rw-r--r--lib/dojo/cldr/nls/fr-ch/number.js.uncompressed.js9
-rw-r--r--lib/dojo/cldr/nls/fr/currency.js9
-rw-r--r--lib/dojo/cldr/nls/fr/currency.js.uncompressed.js23
-rw-r--r--lib/dojo/cldr/nls/fr/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/fr/gregorian.js.uncompressed.js247
-rw-r--r--lib/dojo/cldr/nls/fr/number.js9
-rw-r--r--lib/dojo/cldr/nls/fr/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/gregorian.js.uncompressed.js294
-rw-r--r--lib/dojo/cldr/nls/he/currency.js9
-rw-r--r--lib/dojo/cldr/nls/he/currency.js.uncompressed.js15
-rw-r--r--lib/dojo/cldr/nls/he/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/he/gregorian.js.uncompressed.js213
-rw-r--r--lib/dojo/cldr/nls/he/hebrew.js9
-rw-r--r--lib/dojo/cldr/nls/he/hebrew.js.uncompressed.js125
-rw-r--r--lib/dojo/cldr/nls/he/islamic.js9
-rw-r--r--lib/dojo/cldr/nls/he/islamic.js.uncompressed.js119
-rw-r--r--lib/dojo/cldr/nls/he/number.js9
-rw-r--r--lib/dojo/cldr/nls/he/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/hebrew.js9
-rw-r--r--lib/dojo/cldr/nls/hebrew.js.uncompressed.js265
-rw-r--r--lib/dojo/cldr/nls/hu/currency.js9
-rw-r--r--lib/dojo/cldr/nls/hu/currency.js.uncompressed.js17
-rw-r--r--lib/dojo/cldr/nls/hu/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/hu/gregorian.js.uncompressed.js227
-rw-r--r--lib/dojo/cldr/nls/hu/number.js9
-rw-r--r--lib/dojo/cldr/nls/hu/number.js.uncompressed.js21
-rw-r--r--lib/dojo/cldr/nls/islamic.js9
-rw-r--r--lib/dojo/cldr/nls/islamic.js.uncompressed.js264
-rw-r--r--lib/dojo/cldr/nls/it/currency.js9
-rw-r--r--lib/dojo/cldr/nls/it/currency.js.uncompressed.js15
-rw-r--r--lib/dojo/cldr/nls/it/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/it/gregorian.js.uncompressed.js235
-rw-r--r--lib/dojo/cldr/nls/it/number.js9
-rw-r--r--lib/dojo/cldr/nls/it/number.js.uncompressed.js12
-rw-r--r--lib/dojo/cldr/nls/ja/currency.js9
-rw-r--r--lib/dojo/cldr/nls/ja/currency.js.uncompressed.js18
-rw-r--r--lib/dojo/cldr/nls/ja/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/ja/gregorian.js.uncompressed.js222
-rw-r--r--lib/dojo/cldr/nls/ja/number.js9
-rw-r--r--lib/dojo/cldr/nls/ja/number.js.uncompressed.js12
-rw-r--r--lib/dojo/cldr/nls/ko/currency.js9
-rw-r--r--lib/dojo/cldr/nls/ko/currency.js.uncompressed.js15
-rw-r--r--lib/dojo/cldr/nls/ko/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/ko/gregorian.js.uncompressed.js243
-rw-r--r--lib/dojo/cldr/nls/ko/number.js9
-rw-r--r--lib/dojo/cldr/nls/ko/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/nb/currency.js9
-rw-r--r--lib/dojo/cldr/nls/nb/currency.js.uncompressed.js23
-rw-r--r--lib/dojo/cldr/nls/nb/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/nb/gregorian.js.uncompressed.js234
-rw-r--r--lib/dojo/cldr/nls/nb/number.js9
-rw-r--r--lib/dojo/cldr/nls/nb/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/nl/currency.js9
-rw-r--r--lib/dojo/cldr/nls/nl/currency.js.uncompressed.js15
-rw-r--r--lib/dojo/cldr/nls/nl/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/nl/gregorian.js.uncompressed.js233
-rw-r--r--lib/dojo/cldr/nls/nl/number.js9
-rw-r--r--lib/dojo/cldr/nls/nl/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/number.js9
-rw-r--r--lib/dojo/cldr/nls/number.js.uncompressed.js64
-rw-r--r--lib/dojo/cldr/nls/pl/currency.js9
-rw-r--r--lib/dojo/cldr/nls/pl/currency.js.uncompressed.js15
-rw-r--r--lib/dojo/cldr/nls/pl/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/pl/gregorian.js.uncompressed.js242
-rw-r--r--lib/dojo/cldr/nls/pl/number.js9
-rw-r--r--lib/dojo/cldr/nls/pl/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/pt-pt/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/pt-pt/gregorian.js.uncompressed.js141
-rw-r--r--lib/dojo/cldr/nls/pt-pt/number.js9
-rw-r--r--lib/dojo/cldr/nls/pt-pt/number.js.uncompressed.js8
-rw-r--r--lib/dojo/cldr/nls/pt/currency.js9
-rw-r--r--lib/dojo/cldr/nls/pt/currency.js.uncompressed.js15
-rw-r--r--lib/dojo/cldr/nls/pt/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/pt/gregorian.js.uncompressed.js237
-rw-r--r--lib/dojo/cldr/nls/pt/number.js9
-rw-r--r--lib/dojo/cldr/nls/pt/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/ro/buddhist.js9
-rw-r--r--lib/dojo/cldr/nls/ro/buddhist.js.uncompressed.js121
-rw-r--r--lib/dojo/cldr/nls/ro/currency.js9
-rw-r--r--lib/dojo/cldr/nls/ro/currency.js.uncompressed.js15
-rw-r--r--lib/dojo/cldr/nls/ro/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/ro/gregorian.js.uncompressed.js251
-rw-r--r--lib/dojo/cldr/nls/ro/number.js9
-rw-r--r--lib/dojo/cldr/nls/ro/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/ru/currency.js9
-rw-r--r--lib/dojo/cldr/nls/ru/currency.js.uncompressed.js16
-rw-r--r--lib/dojo/cldr/nls/ru/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/ru/gregorian.js.uncompressed.js232
-rw-r--r--lib/dojo/cldr/nls/ru/number.js9
-rw-r--r--lib/dojo/cldr/nls/ru/number.js.uncompressed.js21
-rw-r--r--lib/dojo/cldr/nls/sk/currency.js9
-rw-r--r--lib/dojo/cldr/nls/sk/currency.js.uncompressed.js15
-rw-r--r--lib/dojo/cldr/nls/sk/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/sk/gregorian.js.uncompressed.js225
-rw-r--r--lib/dojo/cldr/nls/sk/number.js9
-rw-r--r--lib/dojo/cldr/nls/sk/number.js.uncompressed.js9
-rw-r--r--lib/dojo/cldr/nls/sl/currency.js9
-rw-r--r--lib/dojo/cldr/nls/sl/currency.js.uncompressed.js17
-rw-r--r--lib/dojo/cldr/nls/sl/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/sl/gregorian.js.uncompressed.js218
-rw-r--r--lib/dojo/cldr/nls/sl/number.js9
-rw-r--r--lib/dojo/cldr/nls/sl/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/sv/currency.js9
-rw-r--r--lib/dojo/cldr/nls/sv/currency.js.uncompressed.js18
-rw-r--r--lib/dojo/cldr/nls/sv/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/sv/gregorian.js.uncompressed.js245
-rw-r--r--lib/dojo/cldr/nls/sv/number.js9
-rw-r--r--lib/dojo/cldr/nls/sv/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/th/buddhist.js9
-rw-r--r--lib/dojo/cldr/nls/th/buddhist.js.uncompressed.js118
-rw-r--r--lib/dojo/cldr/nls/th/currency.js9
-rw-r--r--lib/dojo/cldr/nls/th/currency.js.uncompressed.js16
-rw-r--r--lib/dojo/cldr/nls/th/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/th/gregorian.js.uncompressed.js232
-rw-r--r--lib/dojo/cldr/nls/th/number.js9
-rw-r--r--lib/dojo/cldr/nls/th/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/tr/currency.js9
-rw-r--r--lib/dojo/cldr/nls/tr/currency.js.uncompressed.js17
-rw-r--r--lib/dojo/cldr/nls/tr/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/tr/gregorian.js.uncompressed.js239
-rw-r--r--lib/dojo/cldr/nls/tr/number.js9
-rw-r--r--lib/dojo/cldr/nls/tr/number.js.uncompressed.js22
-rw-r--r--lib/dojo/cldr/nls/zh-hant/buddhist.js9
-rw-r--r--lib/dojo/cldr/nls/zh-hant/buddhist.js.uncompressed.js146
-rw-r--r--lib/dojo/cldr/nls/zh-hant/currency.js9
-rw-r--r--lib/dojo/cldr/nls/zh-hant/currency.js.uncompressed.js16
-rw-r--r--lib/dojo/cldr/nls/zh-hant/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/zh-hant/gregorian.js.uncompressed.js228
-rw-r--r--lib/dojo/cldr/nls/zh-hant/islamic.js9
-rw-r--r--lib/dojo/cldr/nls/zh-hant/islamic.js.uncompressed.js87
-rw-r--r--lib/dojo/cldr/nls/zh-hant/number.js9
-rw-r--r--lib/dojo/cldr/nls/zh-hant/number.js.uncompressed.js7
-rw-r--r--lib/dojo/cldr/nls/zh-hk/currency.js9
-rw-r--r--lib/dojo/cldr/nls/zh-hk/currency.js.uncompressed.js15
-rw-r--r--lib/dojo/cldr/nls/zh-hk/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/zh-hk/gregorian.js.uncompressed.js85
-rw-r--r--lib/dojo/cldr/nls/zh-hk/number.js9
-rw-r--r--lib/dojo/cldr/nls/zh-hk/number.js.uncompressed.js7
-rw-r--r--lib/dojo/cldr/nls/zh-tw/currency.js9
-rw-r--r--lib/dojo/cldr/nls/zh-tw/currency.js.uncompressed.js14
-rw-r--r--lib/dojo/cldr/nls/zh-tw/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/zh-tw/gregorian.js.uncompressed.js80
-rw-r--r--lib/dojo/cldr/nls/zh/currency.js9
-rw-r--r--lib/dojo/cldr/nls/zh/currency.js.uncompressed.js16
-rw-r--r--lib/dojo/cldr/nls/zh/gregorian.js9
-rw-r--r--lib/dojo/cldr/nls/zh/gregorian.js.uncompressed.js247
-rw-r--r--lib/dojo/cldr/nls/zh/number.js9
-rw-r--r--lib/dojo/cldr/nls/zh/number.js.uncompressed.js12
-rw-r--r--lib/dojo/cldr/supplemental.js78
-rw-r--r--lib/dojo/cldr/supplemental.js.uncompressed.js77
-rw-r--r--lib/dojo/colors.js234
-rw-r--r--lib/dojo/colors.js.uncompressed.js232
-rw-r--r--lib/dojo/cookie.js98
-rw-r--r--lib/dojo/cookie.js.uncompressed.js98
-rw-r--r--lib/dojo/currency.js136
-rw-r--r--lib/dojo/currency.js.uncompressed.js132
-rw-r--r--lib/dojo/data/ItemFileReadStore.js946
-rw-r--r--lib/dojo/data/ItemFileReadStore.js.uncompressed.js945
-rw-r--r--lib/dojo/data/ItemFileWriteStore.js814
-rw-r--r--lib/dojo/data/ItemFileWriteStore.js.uncompressed.js805
-rw-r--r--lib/dojo/data/ObjectStore.js483
-rw-r--r--lib/dojo/data/ObjectStore.js.uncompressed.js505
-rw-r--r--lib/dojo/data/api/Identity.js111
-rw-r--r--lib/dojo/data/api/Identity.js.uncompressed.js107
-rw-r--r--lib/dojo/data/api/Notification.js123
-rw-r--r--lib/dojo/data/api/Notification.js.uncompressed.js122
-rw-r--r--lib/dojo/data/api/Read.js510
-rw-r--r--lib/dojo/data/api/Read.js.uncompressed.js485
-rw-r--r--lib/dojo/data/api/Request.js36
-rw-r--r--lib/dojo/data/api/Request.js.uncompressed.js36
-rw-r--r--lib/dojo/data/api/Write.js230
-rw-r--r--lib/dojo/data/api/Write.js.uncompressed.js221
-rw-r--r--lib/dojo/data/util/filter.js74
-rw-r--r--lib/dojo/data/util/filter.js.uncompressed.js74
-rw-r--r--lib/dojo/data/util/simpleFetch.js95
-rw-r--r--lib/dojo/data/util/simpleFetch.js.uncompressed.js95
-rw-r--r--lib/dojo/data/util/sorter.js100
-rw-r--r--lib/dojo/data/util/sorter.js.uncompressed.js99
-rw-r--r--lib/dojo/date.js347
-rw-r--r--lib/dojo/date.js.uncompressed.js347
-rw-r--r--lib/dojo/date/locale.js673
-rw-r--r--lib/dojo/date/locale.js.uncompressed.js670
-rw-r--r--lib/dojo/date/stamp.js146
-rw-r--r--lib/dojo/date/stamp.js.uncompressed.js146
-rw-r--r--lib/dojo/dnd/AutoSource.js8
-rw-r--r--lib/dojo/dnd/AutoSource.js.uncompressed.js13
-rw-r--r--lib/dojo/dnd/Avatar.js112
-rw-r--r--lib/dojo/dnd/Avatar.js.uncompressed.js111
-rw-r--r--lib/dojo/dnd/Container.js434
-rw-r--r--lib/dojo/dnd/Container.js.uncompressed.js432
-rw-r--r--lib/dojo/dnd/Manager.js216
-rw-r--r--lib/dojo/dnd/Manager.js.uncompressed.js213
-rw-r--r--lib/dojo/dnd/Moveable.js179
-rw-r--r--lib/dojo/dnd/Moveable.js.uncompressed.js173
-rw-r--r--lib/dojo/dnd/Mover.js127
-rw-r--r--lib/dojo/dnd/Mover.js.uncompressed.js119
-rw-r--r--lib/dojo/dnd/Selector.js332
-rw-r--r--lib/dojo/dnd/Selector.js.uncompressed.js324
-rw-r--r--lib/dojo/dnd/Source.js545
-rw-r--r--lib/dojo/dnd/Source.js.uncompressed.js513
-rw-r--r--lib/dojo/dnd/Target.js8
-rw-r--r--lib/dojo/dnd/Target.js.uncompressed.js13
-rw-r--r--lib/dojo/dnd/TimedMoveable.js77
-rw-r--r--lib/dojo/dnd/TimedMoveable.js.uncompressed.js69
-rw-r--r--lib/dojo/dnd/autoscroll.js98
-rw-r--r--lib/dojo/dnd/autoscroll.js.uncompressed.js118
-rw-r--r--lib/dojo/dnd/common.js35
-rw-r--r--lib/dojo/dnd/common.js.uncompressed.js35
-rw-r--r--lib/dojo/dnd/move.js160
-rw-r--r--lib/dojo/dnd/move.js.uncompressed.js143
-rw-r--r--lib/dojo/dojo.js3
-rw-r--r--lib/dojo/dojo.js.uncompressed.js19790
-rw-r--r--lib/dojo/dojo.profile.js40
-rw-r--r--lib/dojo/dom-attr.js8
-rw-r--r--lib/dojo/dom-attr.js.uncompressed.js238
-rw-r--r--lib/dojo/dom-class.js8
-rw-r--r--lib/dojo/dom-class.js.uncompressed.js320
-rw-r--r--lib/dojo/dom-construct.js8
-rw-r--r--lib/dojo/dom-construct.js.uncompressed.js376
-rw-r--r--lib/dojo/dom-form.js8
-rw-r--r--lib/dojo/dom-form.js.uncompressed.js166
-rw-r--r--lib/dojo/dom-geometry.js8
-rw-r--r--lib/dojo/dom-geometry.js.uncompressed.js751
-rw-r--r--lib/dojo/dom-prop.js8
-rw-r--r--lib/dojo/dom-prop.js.uncompressed.js190
-rw-r--r--lib/dojo/dom-style.js8
-rw-r--r--lib/dojo/dom-style.js.uncompressed.js321
-rw-r--r--lib/dojo/dom.js8
-rw-r--r--lib/dojo/dom.js.uncompressed.js156
-rw-r--r--lib/dojo/domReady.js8
-rw-r--r--lib/dojo/domReady.js.uncompressed.js95
-rw-r--r--lib/dojo/fx.js402
-rw-r--r--lib/dojo/fx.js.uncompressed.js426
-rw-r--r--lib/dojo/fx/Toggler.js104
-rw-r--r--lib/dojo/fx/Toggler.js.uncompressed.js103
-rw-r--r--lib/dojo/fx/easing.js284
-rw-r--r--lib/dojo/fx/easing.js.uncompressed.js284
-rw-r--r--lib/dojo/gears.js61
-rw-r--r--lib/dojo/gears.js.uncompressed.js61
-rw-r--r--lib/dojo/has.js8
-rw-r--r--lib/dojo/has.js.uncompressed.js178
-rw-r--r--lib/dojo/hash.js243
-rw-r--r--lib/dojo/hash.js.uncompressed.js243
-rw-r--r--lib/dojo/html.js346
-rw-r--r--lib/dojo/html.js.uncompressed.js342
-rw-r--r--lib/dojo/i18n.js258
-rw-r--r--lib/dojo/i18n.js.uncompressed.js514
-rw-r--r--lib/dojo/io-query.js8
-rw-r--r--lib/dojo/io-query.js.uncompressed.js98
-rw-r--r--lib/dojo/io/iframe.js379
-rw-r--r--lib/dojo/io/iframe.js.uncompressed.js376
-rw-r--r--lib/dojo/io/script.js258
-rw-r--r--lib/dojo/io/script.js.uncompressed.js256
-rw-r--r--lib/dojo/jaxer.js19
-rw-r--r--lib/dojo/jaxer.js.uncompressed.js19
-rw-r--r--lib/dojo/json.js8
-rw-r--r--lib/dojo/json.js.uncompressed.js149
-rw-r--r--lib/dojo/keys.js8
-rw-r--r--lib/dojo/keys.js.uncompressed.js80
-rw-r--r--lib/dojo/lib/backCompat.js283
-rw-r--r--lib/dojo/lib/kernel.js26
-rw-r--r--lib/dojo/lib/main-browser.js61
-rw-r--r--lib/dojo/lib/plugins/i18n.js94
-rw-r--r--lib/dojo/lib/plugins/text.js70
-rw-r--r--lib/dojo/loadInit.js8
-rw-r--r--lib/dojo/loadInit.js.uncompressed.js7
-rw-r--r--lib/dojo/main.js8
-rw-r--r--lib/dojo/main.js.uncompressed.js50
-rw-r--r--lib/dojo/mouse.js8
-rw-r--r--lib/dojo/mouse.js.uncompressed.js127
-rw-r--r--lib/dojo/nls/ar/colors.js9
-rw-r--r--lib/dojo/nls/ar/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/az/colors.js8
-rw-r--r--lib/dojo/nls/az/colors.js.uncompressed.js153
-rw-r--r--lib/dojo/nls/ca/colors.js9
-rw-r--r--lib/dojo/nls/ca/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/colors.js9
-rw-r--r--lib/dojo/nls/colors.js.uncompressed.js191
-rw-r--r--lib/dojo/nls/cs/colors.js9
-rw-r--r--lib/dojo/nls/cs/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/da/colors.js9
-rw-r--r--lib/dojo/nls/da/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/de/colors.js9
-rw-r--r--lib/dojo/nls/de/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/el/colors.js9
-rw-r--r--lib/dojo/nls/el/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/es/colors.js9
-rw-r--r--lib/dojo/nls/es/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/fi/colors.js9
-rw-r--r--lib/dojo/nls/fi/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/fr/colors.js9
-rw-r--r--lib/dojo/nls/fr/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/he/colors.js9
-rw-r--r--lib/dojo/nls/he/colors.js.uncompressed.js158
-rw-r--r--lib/dojo/nls/hr/colors.js8
-rw-r--r--lib/dojo/nls/hr/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/hu/colors.js9
-rw-r--r--lib/dojo/nls/hu/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/it/colors.js9
-rw-r--r--lib/dojo/nls/it/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/ja/colors.js9
-rw-r--r--lib/dojo/nls/ja/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/kk/colors.js9
-rw-r--r--lib/dojo/nls/kk/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/ko/colors.js9
-rw-r--r--lib/dojo/nls/ko/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/nb/colors.js9
-rw-r--r--lib/dojo/nls/nb/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/nl/colors.js9
-rw-r--r--lib/dojo/nls/nl/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/pl/colors.js9
-rw-r--r--lib/dojo/nls/pl/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/pt-pt/colors.js9
-rw-r--r--lib/dojo/nls/pt-pt/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/pt/colors.js9
-rw-r--r--lib/dojo/nls/pt/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/ro/colors.js9
-rw-r--r--lib/dojo/nls/ro/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/ru/colors.js9
-rw-r--r--lib/dojo/nls/ru/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/sk/colors.js9
-rw-r--r--lib/dojo/nls/sk/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/sl/colors.js9
-rw-r--r--lib/dojo/nls/sl/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/sv/colors.js9
-rw-r--r--lib/dojo/nls/sv/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/th/colors.js9
-rw-r--r--lib/dojo/nls/th/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/tr/colors.js9
-rw-r--r--lib/dojo/nls/tr/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/tt-rss-layer_ROOT.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_ROOT.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_ar.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_ar.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_ca.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_ca.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_cs.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_cs.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_da.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_da.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_de-de.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_de-de.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_de.js1
-rw-r--r--lib/dojo/nls/tt-rss-layer_el.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_el.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_en-gb.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_en-gb.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_en-us.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_en-us.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_en.js1
-rw-r--r--lib/dojo/nls/tt-rss-layer_es-es.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_es-es.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_es.js1
-rw-r--r--lib/dojo/nls/tt-rss-layer_fi-fi.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_fi-fi.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_fi.js1
-rw-r--r--lib/dojo/nls/tt-rss-layer_fr-fr.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_fr-fr.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_fr.js1
-rw-r--r--lib/dojo/nls/tt-rss-layer_he-il.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_he-il.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_he.js1
-rw-r--r--lib/dojo/nls/tt-rss-layer_hu.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_hu.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_it-it.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_it-it.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_it.js1
-rw-r--r--lib/dojo/nls/tt-rss-layer_ja-jp.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_ja-jp.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_ja.js1
-rw-r--r--lib/dojo/nls/tt-rss-layer_ko-kr.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_ko-kr.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_ko.js1
-rw-r--r--lib/dojo/nls/tt-rss-layer_nb.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_nb.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_nl-nl.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_nl-nl.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_nl.js1
-rw-r--r--lib/dojo/nls/tt-rss-layer_pl.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_pl.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_pt-br.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_pt-br.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_pt-pt.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_pt-pt.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_pt.js1
-rw-r--r--lib/dojo/nls/tt-rss-layer_ru.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_ru.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_sk.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_sk.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_sl.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_sl.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_sv.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_sv.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_th.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_th.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_tr.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_tr.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_xx.js1
-rw-r--r--lib/dojo/nls/tt-rss-layer_zh-cn.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_zh-cn.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_zh-tw.js9
-rw-r--r--lib/dojo/nls/tt-rss-layer_zh-tw.js.uncompressed.js13
-rw-r--r--lib/dojo/nls/tt-rss-layer_zh.js1
-rw-r--r--lib/dojo/nls/zh-tw/colors.js9
-rw-r--r--lib/dojo/nls/zh-tw/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/nls/zh/colors.js9
-rw-r--r--lib/dojo/nls/zh/colors.js.uncompressed.js156
-rw-r--r--lib/dojo/number.js580
-rw-r--r--lib/dojo/number.js.uncompressed.js576
-rw-r--r--lib/dojo/on.js8
-rw-r--r--lib/dojo/on.js.uncompressed.js474
-rw-r--r--lib/dojo/package.json42
-rw-r--r--lib/dojo/parser.js558
-rw-r--r--lib/dojo/parser.js.uncompressed.js594
-rw-r--r--lib/dojo/query.js8
-rw-r--r--lib/dojo/query.js.uncompressed.js713
-rw-r--r--lib/dojo/ready.js8
-rw-r--r--lib/dojo/ready.js.uncompressed.js138
-rw-r--r--lib/dojo/regexp.js73
-rw-r--r--lib/dojo/regexp.js.uncompressed.js73
-rw-r--r--lib/dojo/require.js8
-rw-r--r--lib/dojo/require.js.uncompressed.js7
-rw-r--r--lib/dojo/resources/_modules.js7
-rw-r--r--lib/dojo/resources/dnd.css2
-rw-r--r--lib/dojo/robot.js187
-rw-r--r--lib/dojo/robotx.js173
-rw-r--r--lib/dojo/rpc/JsonService.js87
-rw-r--r--lib/dojo/rpc/JsonService.js.uncompressed.js85
-rw-r--r--lib/dojo/rpc/JsonpService.js69
-rw-r--r--lib/dojo/rpc/JsonpService.js.uncompressed.js67
-rw-r--r--lib/dojo/rpc/RpcService.js176
-rw-r--r--lib/dojo/rpc/RpcService.js.uncompressed.js175
-rw-r--r--lib/dojo/selector/_loader.js8
-rw-r--r--lib/dojo/selector/_loader.js.uncompressed.js45
-rw-r--r--lib/dojo/selector/acme.js8
-rw-r--r--lib/dojo/selector/acme.js.uncompressed.js1480
-rw-r--r--lib/dojo/selector/lite.js8
-rw-r--r--lib/dojo/selector/lite.js.uncompressed.js264
-rw-r--r--lib/dojo/store/Cache.js148
-rw-r--r--lib/dojo/store/Cache.js.uncompressed.js148
-rw-r--r--lib/dojo/store/DataStore.js138
-rw-r--r--lib/dojo/store/DataStore.js.uncompressed.js170
-rw-r--r--lib/dojo/store/JsonRest.js142
-rw-r--r--lib/dojo/store/JsonRest.js.uncompressed.js155
-rw-r--r--lib/dojo/store/Memory.js160
-rw-r--r--lib/dojo/store/Memory.js.uncompressed.js161
-rw-r--r--lib/dojo/store/Observable.js169
-rw-r--r--lib/dojo/store/Observable.js.uncompressed.js175
-rw-r--r--lib/dojo/store/api/Store.js300
-rw-r--r--lib/dojo/store/api/Store.js.uncompressed.js297
-rw-r--r--lib/dojo/store/util/QueryResults.js63
-rw-r--r--lib/dojo/store/util/QueryResults.js.uncompressed.js64
-rw-r--r--lib/dojo/store/util/SimpleQueryEngine.js112
-rw-r--r--lib/dojo/store/util/SimpleQueryEngine.js.uncompressed.js108
-rw-r--r--lib/dojo/string.js162
-rw-r--r--lib/dojo/string.js.uncompressed.js162
-rw-r--r--lib/dojo/text.js8
-rw-r--r--lib/dojo/text.js.uncompressed.js212
-rw-r--r--lib/dojo/topic.js8
-rw-r--r--lib/dojo/topic.js.uncompressed.js33
-rw-r--r--lib/dojo/touch.js8
-rw-r--r--lib/dojo/touch.js.uncompressed.js89
-rw-r--r--lib/dojo/tt-rss-layer.js3
-rw-r--r--lib/dojo/tt-rss-layer.js.uncompressed.js46469
-rw-r--r--lib/dojo/uacss.js72
-rw-r--r--lib/dojo/uacss.js.uncompressed.js66
-rw-r--r--lib/dojo/window.js141
-rw-r--r--lib/dojo/window.js.uncompressed.js169
-rw-r--r--tt-rss.css2
1616 files changed, 132385 insertions, 95001 deletions
diff --git a/js/prefs.js b/js/prefs.js
index 2a2f359eb..4ca3ec182 100644
--- a/js/prefs.js
+++ b/js/prefs.js
@@ -918,6 +918,31 @@ function init() {
dojo.registerModulePath("lib", "..");
dojo.registerModulePath("fox", "../../js/");
+ dojo.require("dijit.ColorPalette");
+ dojo.require("dijit.Dialog");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.form.CheckBox");
+ dojo.require("dijit.form.DropDownButton");
+ dojo.require("dijit.form.FilteringSelect");
+ dojo.require("dijit.form.Form");
+ dojo.require("dijit.form.RadioButton");
+ dojo.require("dijit.form.Select");
+ dojo.require("dijit.form.SimpleTextarea");
+ dojo.require("dijit.form.TextBox");
+ dojo.require("dijit.form.ValidationTextBox");
+ dojo.require("dijit.InlineEditBox");
+ dojo.require("dijit.layout.AccordionContainer");
+ dojo.require("dijit.layout.BorderContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.Menu");
+ dojo.require("dijit.ProgressBar");
+ dojo.require("dijit.ProgressBar");
+ dojo.require("dijit.Toolbar");
+ dojo.require("dijit.Tree");
+ dojo.require("dijit.tree.dndSource");
+ dojo.require("dojo.data.ItemFileWriteStore");
+
dojo.require("lib.CheckBoxTree");
dojo.require("fox.PrefFeedTree");
dojo.require("fox.PrefFilterTree");
diff --git a/js/tt-rss.js b/js/tt-rss.js
index 8a82e4c7d..1c6f121cf 100644
--- a/js/tt-rss.js
+++ b/js/tt-rss.js
@@ -286,6 +286,31 @@ function init() {
themeBeforeLayout();
}
+ dojo.require("dijit.ColorPalette");
+ dojo.require("dijit.Dialog");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.form.CheckBox");
+ dojo.require("dijit.form.DropDownButton");
+ dojo.require("dijit.form.FilteringSelect");
+ dojo.require("dijit.form.Form");
+ dojo.require("dijit.form.RadioButton");
+ dojo.require("dijit.form.Select");
+ dojo.require("dijit.form.SimpleTextarea");
+ dojo.require("dijit.form.TextBox");
+ dojo.require("dijit.form.ValidationTextBox");
+ dojo.require("dijit.InlineEditBox");
+ dojo.require("dijit.layout.AccordionContainer");
+ dojo.require("dijit.layout.BorderContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.Menu");
+ dojo.require("dijit.ProgressBar");
+ dojo.require("dijit.ProgressBar");
+ dojo.require("dijit.Toolbar");
+ dojo.require("dijit.Tree");
+ dojo.require("dijit.tree.dndSource");
+ dojo.require("dojo.data.ItemFileWriteStore");
+
dojo.parser.parse();
if (!genericSanityCheck())
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;
+
+});
diff --git a/lib/dojo-src/rebuild-dojo.sh b/lib/dojo-src/rebuild-dojo.sh
index 8ed5baba2..12d4d8e59 100755
--- a/lib/dojo-src/rebuild-dojo.sh
+++ b/lib/dojo-src/rebuild-dojo.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
# This script rebuilds customized layer of Dojo for tt-rss
# Place unpacked Dojo source release in this directory and run this script.
@@ -8,14 +8,16 @@
# is available here: http://dojotoolkit.org/reference-guide/build/index.html
if [ -d util/buildscripts/ ]; then
+ rm -rf release/dojo
+
pushd util/buildscripts
- ./build.sh profileFile=../../profile.js action=clean,release version=1.6.1 releaseName=
+ ./build.sh profile=../../tt-rss action=clean,release optimize=shrinksafe
popd
if [ -d release/dojo ]; then
rm -rf ../dojo ../dijit
- cp -r release/dojo ..
- cp -r release/dijit ..
+ cp -r release/dojo/dojo ..
+ cp -r release/dojo/dijit ..
else
echo $0: ERROR: Dojo build seems to have failed.
fi
diff --git a/lib/dojo-src/profile.js b/lib/dojo-src/tt-rss.profile.js
index 572b94230..32fe53781 100644
--- a/lib/dojo-src/profile.js
+++ b/lib/dojo-src/tt-rss.profile.js
@@ -2,11 +2,30 @@ dependencies = {
layers: [
{
name: "tt-rss-layer.js",
- resourceName: "tt-rss-layer",
dependencies: [
+ "dojo._base.url",
+ "dojo.cache",
+ "dojo.dojo",
+ "dojo.parser",
+ "dojo.data.ItemFileWriteStore",
+ "dojo.selector.acme",
+ "dojo.Stateful",
+ "dojo.string",
+ "dojo.text",
+ "dojo.touch",
+ "dojo.uacss",
+ "dojo.window",
"dojo.parser",
- "dijit.dijit",
"dojo.NodeList-fx",
+ "dojo.dnd.Moveable",
+ "dojo.dnd.move",
+ "dojo.dnd.Mover",
+ "dojo.dnd.TimedMoveable",
+ "dojo.fx.Toggler",
+ "dojo.html",
+ "dojo.i18n",
+ "dojo.date.stamp",
+ "dijit.dijit",
"dijit.ColorPalette",
"dijit.Dialog",
"dijit.form.Button",
@@ -30,8 +49,6 @@ dependencies = {
"dijit.Toolbar",
"dijit.Tree",
"dijit.tree.dndSource",
- "dojo.data.ItemFileWriteStore",
- "dojo.parser",
]
}
],
diff --git a/lib/dojo/AdapterRegistry.js b/lib/dojo/AdapterRegistry.js
index 1d688a3b1..f81a33051 100644
--- a/lib/dojo/AdapterRegistry.js
+++ b/lib/dojo/AdapterRegistry.js
@@ -4,104 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.AdapterRegistry"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.AdapterRegistry"] = true;
-dojo.provide("dojo.AdapterRegistry");
-
-
-dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){
- // summary:
- // A registry to make contextual calling/searching easier.
- // description:
- // Objects of this class keep list of arrays in the form [name, check,
- // wrap, directReturn] that are used to determine what the contextual
- // result of a set of checked arguments is. All check/wrap functions
- // in this registry should be of the same arity.
- // example:
- // | // create a new registry
- // | var reg = new dojo.AdapterRegistry();
- // | reg.register("handleString",
- // | dojo.isString,
- // | function(str){
- // | // do something with the string here
- // | }
- // | );
- // | reg.register("handleArr",
- // | dojo.isArray,
- // | function(arr){
- // | // do something with the array here
- // | }
- // | );
- // |
- // | // now we can pass reg.match() *either* an array or a string and
- // | // the value we pass will get handled by the right function
- // | reg.match("someValue"); // will call the first function
- // | reg.match(["someValue"]); // will call the second
-
- this.pairs = [];
- this.returnWrappers = returnWrappers || false; // Boolean
-};
-
-dojo.extend(dojo.AdapterRegistry, {
- register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){
- // summary:
- // register a check function to determine if the wrap function or
- // object gets selected
- // name:
- // a way to identify this matcher.
- // check:
- // a function that arguments are passed to from the adapter's
- // match() function. The check function should return true if the
- // given arguments are appropriate for the wrap function.
- // directReturn:
- // If directReturn is true, the value passed in for wrap will be
- // returned instead of being called. Alternately, the
- // AdapterRegistry can be set globally to "return not call" using
- // the returnWrappers property. Either way, this behavior allows
- // the registry to act as a "search" function instead of a
- // function interception library.
- // override:
- // If override is given and true, the check function will be given
- // highest priority. Otherwise, it will be the lowest priority
- // adapter.
- this.pairs[((override) ? "unshift" : "push")]([name, check, wrap, directReturn]);
- },
-
- match: function(/* ... */){
- // summary:
- // Find an adapter for the given arguments. If no suitable adapter
- // is found, throws an exception. match() accepts any number of
- // arguments, all of which are passed to all matching functions
- // from the registered pairs.
- for(var i = 0; i < this.pairs.length; i++){
- var pair = this.pairs[i];
- if(pair[1].apply(this, arguments)){
- if((pair[3])||(this.returnWrappers)){
- return pair[2];
- }else{
- return pair[2].apply(this, arguments);
- }
- }
- }
- throw new Error("No match found");
- },
-
- unregister: function(name){
- // summary: Remove a named adapter from the registry
-
- // FIXME: this is kind of a dumb way to handle this. On a large
- // registry this will be slow-ish and we can use the name as a lookup
- // should we choose to trade memory for speed.
- for(var i = 0; i < this.pairs.length; i++){
- var pair = this.pairs[i];
- if(pair[0] == name){
- this.pairs.splice(i, 1);
- return true;
- }
- }
- return false;
- }
-});
-
-}
+//>>built
+define("dojo/AdapterRegistry",["./_base/kernel","./_base/lang"],function(_1,_2){var _3=_1.AdapterRegistry=function(_4){this.pairs=[];this.returnWrappers=_4||false;};_2.extend(_3,{register:function(_5,_6,_7,_8,_9){this.pairs[((_9)?"unshift":"push")]([_5,_6,_7,_8]);},match:function(){for(var i=0;i<this.pairs.length;i++){var _a=this.pairs[i];if(_a[1].apply(this,arguments)){if((_a[3])||(this.returnWrappers)){return _a[2];}else{return _a[2].apply(this,arguments);}}}throw new Error("No match found");},unregister:function(_b){for(var i=0;i<this.pairs.length;i++){var _c=this.pairs[i];if(_c[0]==_b){this.pairs.splice(i,1);return true;}}return false;}});return _3;}); \ No newline at end of file
diff --git a/lib/dojo/AdapterRegistry.js.uncompressed.js b/lib/dojo/AdapterRegistry.js.uncompressed.js
new file mode 100644
index 000000000..23a6a0f0a
--- /dev/null
+++ b/lib/dojo/AdapterRegistry.js.uncompressed.js
@@ -0,0 +1,113 @@
+define("dojo/AdapterRegistry", ["./_base/kernel", "./_base/lang"], function(dojo, lang) {
+ // module:
+ // dojo/AdapterRegistry
+ // summary:
+ // TODOC
+
+var AdapterRegistry = dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){
+ // summary:
+ // A registry to make contextual calling/searching easier.
+ // description:
+ // Objects of this class keep list of arrays in the form [name, check,
+ // wrap, directReturn] that are used to determine what the contextual
+ // result of a set of checked arguments is. All check/wrap functions
+ // in this registry should be of the same arity.
+ // example:
+ // | // create a new registry
+ // | var reg = new dojo.AdapterRegistry();
+ // | reg.register("handleString",
+ // | dojo.isString,
+ // | function(str){
+ // | // do something with the string here
+ // | }
+ // | );
+ // | reg.register("handleArr",
+ // | dojo.isArray,
+ // | function(arr){
+ // | // do something with the array here
+ // | }
+ // | );
+ // |
+ // | // now we can pass reg.match() *either* an array or a string and
+ // | // the value we pass will get handled by the right function
+ // | reg.match("someValue"); // will call the first function
+ // | reg.match(["someValue"]); // will call the second
+
+ this.pairs = [];
+ this.returnWrappers = returnWrappers || false; // Boolean
+};
+
+/*=====
+// doc alias helpers:
+AdapterRegistry = dojo.AdapterRegistry;
+=====*/
+
+lang.extend(AdapterRegistry, {
+ register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){
+ // summary:
+ // register a check function to determine if the wrap function or
+ // object gets selected
+ // name:
+ // a way to identify this matcher.
+ // check:
+ // a function that arguments are passed to from the adapter's
+ // match() function. The check function should return true if the
+ // given arguments are appropriate for the wrap function.
+ // directReturn:
+ // If directReturn is true, the value passed in for wrap will be
+ // returned instead of being called. Alternately, the
+ // AdapterRegistry can be set globally to "return not call" using
+ // the returnWrappers property. Either way, this behavior allows
+ // the registry to act as a "search" function instead of a
+ // function interception library.
+ // override:
+ // If override is given and true, the check function will be given
+ // highest priority. Otherwise, it will be the lowest priority
+ // adapter.
+ this.pairs[((override) ? "unshift" : "push")]([name, check, wrap, directReturn]);
+ },
+
+ match: function(/* ... */){
+ // summary:
+ // Find an adapter for the given arguments. If no suitable adapter
+ // is found, throws an exception. match() accepts any number of
+ // arguments, all of which are passed to all matching functions
+ // from the registered pairs.
+ for(var i = 0; i < this.pairs.length; i++){
+ var pair = this.pairs[i];
+ if(pair[1].apply(this, arguments)){
+ if((pair[3])||(this.returnWrappers)){
+ return pair[2];
+ }else{
+ return pair[2].apply(this, arguments);
+ }
+ }
+ }
+ throw new Error("No match found");
+ },
+
+ unregister: function(name){
+ // summary:
+ // Remove a named adapter from the registry
+ // name: String
+ // The name of the adapter.
+ // returns: Boolean
+ // Returns true if operation is successful.
+ // Returns false if operation fails.
+
+ // FIXME: this is kind of a dumb way to handle this. On a large
+ // registry this will be slow-ish and we can use the name as a lookup
+ // should we choose to trade memory for speed.
+ for(var i = 0; i < this.pairs.length; i++){
+ var pair = this.pairs[i];
+ if(pair[0] == name){
+ this.pairs.splice(i, 1);
+ return true;
+ }
+ }
+ return false;
+ }
+});
+
+return AdapterRegistry;
+});
diff --git a/lib/dojo/DeferredList.js b/lib/dojo/DeferredList.js
index afe6638a1..a7fa0f172 100644
--- a/lib/dojo/DeferredList.js
+++ b/lib/dojo/DeferredList.js
@@ -4,82 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.DeferredList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.DeferredList"] = true;
-dojo.provide("dojo.DeferredList");
-
-
-dojo.DeferredList = function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*Boolean?*/ fireOnOneErrback, /*Boolean?*/ consumeErrors, /*Function?*/ canceller){
- // summary:
- // Provides event handling for a group of Deferred objects.
- // description:
- // DeferredList takes an array of existing deferreds and returns a new deferred of its own
- // this new deferred will typically have its callback fired when all of the deferreds in
- // the given list have fired their own deferreds. The parameters `fireOnOneCallback` and
- // fireOnOneErrback, will fire before all the deferreds as appropriate
- //
- // list:
- // The list of deferreds to be synchronizied with this DeferredList
- // fireOnOneCallback:
- // Will cause the DeferredLists callback to be fired as soon as any
- // of the deferreds in its list have been fired instead of waiting until
- // the entire list has finished
- // fireonOneErrback:
- // Will cause the errback to fire upon any of the deferreds errback
- // canceller:
- // A deferred canceller function, see dojo.Deferred
- var resultList = [];
- dojo.Deferred.call(this);
- var self = this;
- if(list.length === 0 && !fireOnOneCallback){
- this.resolve([0, []]);
- }
- var finished = 0;
- dojo.forEach(list, function(item, i){
- item.then(function(result){
- if(fireOnOneCallback){
- self.resolve([i, result]);
- }else{
- addResult(true, result);
- }
- },function(error){
- if(fireOnOneErrback){
- self.reject(error);
- }else{
- addResult(false, error);
- }
- if(consumeErrors){
- return null;
- }
- throw error;
- });
- function addResult(succeeded, result){
- resultList[i] = [succeeded, result];
- finished++;
- if(finished === list.length){
- self.resolve(resultList);
- }
-
- }
- });
-};
-dojo.DeferredList.prototype = new dojo.Deferred();
-
-dojo.DeferredList.prototype.gatherResults= function(deferredList){
- // summary:
- // Gathers the results of the deferreds for packaging
- // as the parameters to the Deferred Lists' callback
-
- var d = new dojo.DeferredList(deferredList, false, true, false);
- d.addCallback(function(results){
- var ret = [];
- dojo.forEach(results, function(result){
- ret.push(result[1]);
- });
- return ret;
- });
- return d;
-};
-
-}
+//>>built
+define("dojo/DeferredList",["./_base/kernel","./_base/Deferred","./_base/array"],function(_1,_2,_3){_1.DeferredList=function(_4,_5,_6,_7,_8){var _9=[];_2.call(this);var _a=this;if(_4.length===0&&!_5){this.resolve([0,[]]);}var _b=0;_3.forEach(_4,function(_c,i){_c.then(function(_d){if(_5){_a.resolve([i,_d]);}else{_e(true,_d);}},function(_f){if(_6){_a.reject(_f);}else{_e(false,_f);}if(_7){return null;}throw _f;});function _e(_10,_11){_9[i]=[_10,_11];_b++;if(_b===_4.length){_a.resolve(_9);}};});};_1.DeferredList.prototype=new _2();_1.DeferredList.prototype.gatherResults=function(_12){var d=new _1.DeferredList(_12,false,true,false);d.addCallback(function(_13){var ret=[];_3.forEach(_13,function(_14){ret.push(_14[1]);});return ret;});return d;};return _1.DeferredList;}); \ No newline at end of file
diff --git a/lib/dojo/DeferredList.js.uncompressed.js b/lib/dojo/DeferredList.js.uncompressed.js
new file mode 100644
index 000000000..589ed18b2
--- /dev/null
+++ b/lib/dojo/DeferredList.js.uncompressed.js
@@ -0,0 +1,86 @@
+define("dojo/DeferredList", ["./_base/kernel", "./_base/Deferred", "./_base/array"], function(dojo, Deferred, darray) {
+ // module:
+ // dojo/DeferredList
+ // summary:
+ // TODOC
+
+
+dojo.DeferredList = function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*Boolean?*/ fireOnOneErrback, /*Boolean?*/ consumeErrors, /*Function?*/ canceller){
+ // summary:
+ // Provides event handling for a group of Deferred objects.
+ // description:
+ // DeferredList takes an array of existing deferreds and returns a new deferred of its own
+ // this new deferred will typically have its callback fired when all of the deferreds in
+ // the given list have fired their own deferreds. The parameters `fireOnOneCallback` and
+ // fireOnOneErrback, will fire before all the deferreds as appropriate
+ //
+ // list:
+ // The list of deferreds to be synchronizied with this DeferredList
+ // fireOnOneCallback:
+ // Will cause the DeferredLists callback to be fired as soon as any
+ // of the deferreds in its list have been fired instead of waiting until
+ // the entire list has finished
+ // fireonOneErrback:
+ // Will cause the errback to fire upon any of the deferreds errback
+ // canceller:
+ // A deferred canceller function, see dojo.Deferred
+ var resultList = [];
+ Deferred.call(this);
+ var self = this;
+ if(list.length === 0 && !fireOnOneCallback){
+ this.resolve([0, []]);
+ }
+ var finished = 0;
+ darray.forEach(list, function(item, i){
+ item.then(function(result){
+ if(fireOnOneCallback){
+ self.resolve([i, result]);
+ }else{
+ addResult(true, result);
+ }
+ },function(error){
+ if(fireOnOneErrback){
+ self.reject(error);
+ }else{
+ addResult(false, error);
+ }
+ if(consumeErrors){
+ return null;
+ }
+ throw error;
+ });
+ function addResult(succeeded, result){
+ resultList[i] = [succeeded, result];
+ finished++;
+ if(finished === list.length){
+ self.resolve(resultList);
+ }
+
+ }
+ });
+};
+dojo.DeferredList.prototype = new Deferred();
+
+dojo.DeferredList.prototype.gatherResults = function(deferredList){
+ // summary:
+ // Gathers the results of the deferreds for packaging
+ // as the parameters to the Deferred Lists' callback
+ // deferredList: dojo.DeferredList
+ // The deferred list from which this function gathers results.
+ // returns: dojo.DeferredList
+ // The newly created deferred list which packs results as
+ // parameters to its callback.
+
+ var d = new dojo.DeferredList(deferredList, false, true, false);
+ d.addCallback(function(results){
+ var ret = [];
+ darray.forEach(results, function(result){
+ ret.push(result[1]);
+ });
+ return ret;
+ });
+ return d;
+};
+
+return dojo.DeferredList;
+});
diff --git a/lib/dojo/Evented.js b/lib/dojo/Evented.js
new file mode 100644
index 000000000..d3c8930cc
--- /dev/null
+++ b/lib/dojo/Evented.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/Evented",["./aspect","./on"],function(_1,on){"use strict";var _2=_1.after;function _3(){};_3.prototype={on:function(_4,_5){return on.parse(this,_4,_5,function(_6,_7){return _2(_6,"on"+_7,_5,true);});},emit:function(_8,_9){var _a=[this];_a.push.apply(_a,arguments);return on.emit.apply(on,_a);}};return _3;}); \ No newline at end of file
diff --git a/lib/dojo/Evented.js.uncompressed.js b/lib/dojo/Evented.js.uncompressed.js
new file mode 100644
index 000000000..c39c9e71a
--- /dev/null
+++ b/lib/dojo/Evented.js.uncompressed.js
@@ -0,0 +1,32 @@
+define("dojo/Evented", ["./aspect", "./on"], function(aspect, on){
+ // summary:
+ // The export of this module is a class that can be used as a mixin or base class,
+ // to add on() and emit() methods to a class
+ // for listening for events and emiting events:
+ // |define(["dojo/Evented"], function(Evented){
+ // | var EventedWidget = dojo.declare([Evented, dijit._Widget], {...});
+ // | widget = new EventedWidget();
+ // | widget.on("open", function(event){
+ // | ... do something with event
+ // | });
+ // |
+ // | widget.emit("open", {name:"some event", ...});
+
+ "use strict";
+ var after = aspect.after;
+ function Evented(){
+ }
+ Evented.prototype = {
+ on: function(type, listener){
+ return on.parse(this, type, listener, function(target, type){
+ return after(target, 'on' + type, listener, true);
+ });
+ },
+ emit: function(type, event){
+ var args = [this];
+ args.push.apply(args, arguments);
+ return on.emit.apply(on, args);
+ }
+ };
+ return Evented;
+});
diff --git a/lib/dojo/NodeList-data.js b/lib/dojo/NodeList-data.js
index 0126448d2..5f6b4fb7e 100644
--- a/lib/dojo/NodeList-data.js
+++ b/lib/dojo/NodeList-data.js
@@ -4,172 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.NodeList-data"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.NodeList-data"] = true;
-dojo.provide("dojo.NodeList-data");
-
-(function(d){
-
-/*=====
- dojo.NodeList.prototype.data = function(key, value){
- // summary: stash or get some arbitrary data on/from these nodes.
- //
- // description:
- // Stash or get some arbirtrary data on/from these nodes. This private _data function is
- // exposed publicly on `dojo.NodeList`, eg: as the result of a `dojo.query` call.
- // DIFFERS from jQuery.data in that when used as a getter, the entire list is ALWAYS
- // returned. EVEN WHEN THE LIST IS length == 1.
- //
- // A single-node version of this function is provided as `dojo._nodeData`, which follows
- // the same signature, though expects a String ID or DomNode reference in the first
- // position, before key/value arguments.
- //
- // node: String|DomNode
- // The node to associate data with
- //
- // key: Object?|String?
- // If an object, act as a setter and iterate over said object setting data items as defined.
- // If a string, and `value` present, set the data for defined `key` to `value`
- // If a string, and `value` absent, act as a getter, returning the data associated with said `key`
- //
- // value: Anything?
- // The value to set for said `key`, provided `key` is a string (and not an object)
- //
- // example:
- // Set a key `bar` to some data, then retrieve it.
- // | dojo.query(".foo").data("bar", "touched");
- // | var touched = dojo.query(".foo").data("bar");
- // | if(touched[0] == "touched"){ alert('win'); }
- //
- // example:
- // Get all the data items for a given node.
- // | var list = dojo.query(".foo").data();
- // | var first = list[0];
- //
- // example:
- // Set the data to a complex hash. Overwrites existing keys with new value
- // | dojo.query(".foo").data({ bar:"baz", foo:"bar" });
- // Then get some random key:
- // | dojo.query(".foo").data("foo"); // returns [`bar`]
- //
- // returns: Object|Anything|Nothing
- // When used as a setter via `dojo.NodeList`, a NodeList instance is returned
- // for further chaning. When used as a getter via `dojo.NodeList` an ARRAY
- // of items is returned. The items in the array correspond to the elements
- // in the original list. This is true even when the list length is 1, eg:
- // when looking up a node by ID (#foo)
- };
-
- dojo.NodeList.prototype.removeData = function(key){
- // summary: Remove the data associated with these nodes.
- // key: String?
- // If ommitted, clean all data for this node.
- // If passed, remove the data item found at `key`
- };
-
- dojo._nodeDataCache = {
- // summary: An alias to the private dataCache for NodeList-data. NEVER USE THIS!
- // This private is only exposed for the benefit of unit testing, and is
- // removed during the build process.
- };
-
-=====*/
-
- var dataCache = {}, x = 0, dataattr = "data-dojo-dataid", nl = d.NodeList,
- dopid = function(node){
- // summary: Return a uniqueish ID for the passed node reference
- var pid = d.attr(node, dataattr);
- if(!pid){
- pid = "pid" + (x++);
- d.attr(node, dataattr, pid);
- }
- return pid;
- }
- ;
-
-
- var dodata = d._nodeData = function(node, key, value){
-
- var pid = dopid(node), r;
- if(!dataCache[pid]){ dataCache[pid] = {}; }
-
- // API discrepency: calling with only a node returns the whole object. $.data throws
- if(arguments.length == 1){ r = dataCache[pid]; }
- if(typeof key == "string"){
- // either getter or setter, based on `value` presence
- if(arguments.length > 2){
- dataCache[pid][key] = value;
- }else{
- r = dataCache[pid][key];
- }
- }else{
- // must be a setter, mix `value` into data hash
- // API discrepency: using object as setter works here
- r = d._mixin(dataCache[pid], key);
- }
-
- return r; // Object|Anything|Nothing
- };
-
- var removeData = d._removeNodeData = function(node, key){
- // summary: Remove some data from this node
- // node: String|DomNode
- // The node reference to remove data from
- // key: String?
- // If omitted, remove all data in this dataset.
- // If passed, remove only the passed `key` in the associated dataset
- var pid = dopid(node);
- if(dataCache[pid]){
- if(key){
- delete dataCache[pid][key];
- }else{
- delete dataCache[pid];
- }
- }
- };
-
- d._gcNodeData = function(){
- // summary: super expensive: GC all data in the data for nodes that no longer exist in the dom.
- // description:
- // super expensive: GC all data in the data for nodes that no longer exist in the dom.
- // MUCH safer to do this yourself, manually, on a per-node basis (via `NodeList.removeData()`)
- // provided as a stop-gap for exceptionally large/complex applications with constantly changing
- // content regions (eg: a dijit.layout.ContentPane with replacing data)
- // There is NO automatic GC going on. If you dojo.destroy() a node, you should _removeNodeData
- // prior to destruction.
- var livePids = dojo.query("[" + dataattr + "]").map(dopid);
- for(var i in dataCache){
- if(dojo.indexOf(livePids, i) < 0){ delete dataCache[i]; }
- }
- };
-
- // make nodeData and removeNodeData public on dojo.NodeList:
- d.extend(nl, {
- data: nl._adaptWithCondition(dodata, function(a){
- return a.length === 0 || a.length == 1 && (typeof a[0] == "string");
- }),
- removeData: nl._adaptAsForEach(removeData)
- });
-
-// TODO: this is the basic implemetation of adaptWithCondtionAndWhenMappedConsiderLength, for lack of a better API name
-// it conflicts with the the `dojo.NodeList` way: always always return an arrayLike thinger. Consider for 2.0:
-//
-// nl.prototype.data = function(key, value){
-// var a = arguments, r;
-// if(a.length === 0 || a.length == 1 && (typeof a[0] == "string")){
-// r = this.map(function(node){
-// return d._data(node, key);
-// });
-// if(r.length == 1){ r = r[0]; } // the offending line, and the diff on adaptWithCondition
-// }else{
-// r = this.forEach(function(node){
-// d._data(node, key, value);
-// });
-// }
-// return r; // dojo.NodeList|Array|SingleItem
-// };
-
-})(dojo);
-
-}
+//>>built
+define("dojo/NodeList-data",["./_base/kernel","./query","./_base/lang","./_base/array","./dom-attr"],function(_1,_2,_3,_4,_5){var _6=_2.NodeList;var _7={},x=0,_8="data-dojo-dataid",_9=function(_a){var _b=_5.get(_a,_8);if(!_b){_b="pid"+(x++);_5.set(_a,_8,_b);}return _b;};var _c=_1._nodeData=function(_d,_e,_f){var pid=_9(_d),r;if(!_7[pid]){_7[pid]={};}if(arguments.length==1){r=_7[pid];}if(typeof _e=="string"){if(arguments.length>2){_7[pid][_e]=_f;}else{r=_7[pid][_e];}}else{r=_3.mixin(_7[pid],_e);}return r;};var _10=_1._removeNodeData=function(_11,key){var pid=_9(_11);if(_7[pid]){if(key){delete _7[pid][key];}else{delete _7[pid];}}};_1._gcNodeData=function(){var _12=_2("["+_8+"]").map(_9);for(var i in _7){if(_4.indexOf(_12,i)<0){delete _7[i];}}};_3.extend(_6,{data:_6._adaptWithCondition(_c,function(a){return a.length===0||a.length==1&&(typeof a[0]=="string");}),removeData:_6._adaptAsForEach(_10)});return _6;}); \ No newline at end of file
diff --git a/lib/dojo/NodeList-data.js.uncompressed.js b/lib/dojo/NodeList-data.js.uncompressed.js
new file mode 100644
index 000000000..b8c76b0b0
--- /dev/null
+++ b/lib/dojo/NodeList-data.js.uncompressed.js
@@ -0,0 +1,181 @@
+define("dojo/NodeList-data", [
+ "./_base/kernel", "./query", "./_base/lang", "./_base/array", "./dom-attr"
+], function(dojo, query, lang, array, attr) {
+ // module:
+ // dojo/NodeList-data
+ // summary:
+ // TODOC
+
+var NodeList = query.NodeList;
+/*=====
+// doc alias helpers:
+var NodeList = dojo.NodeList;
+
+ dojo.NodeList.prototype.data = function(key, value){
+ // summary: stash or get some arbitrary data on/from these nodes.
+ //
+ // description:
+ // Stash or get some arbirtrary data on/from these nodes. This private _data function is
+ // exposed publicly on `dojo.NodeList`, eg: as the result of a `dojo.query` call.
+ // DIFFERS from jQuery.data in that when used as a getter, the entire list is ALWAYS
+ // returned. EVEN WHEN THE LIST IS length == 1.
+ //
+ // A single-node version of this function is provided as `dojo._nodeData`, which follows
+ // the same signature, though expects a String ID or DomNode reference in the first
+ // position, before key/value arguments.
+ //
+ // node: String|DomNode
+ // The node to associate data with
+ //
+ // key: Object?|String?
+ // If an object, act as a setter and iterate over said object setting data items as defined.
+ // If a string, and `value` present, set the data for defined `key` to `value`
+ // If a string, and `value` absent, act as a getter, returning the data associated with said `key`
+ //
+ // value: Anything?
+ // The value to set for said `key`, provided `key` is a string (and not an object)
+ //
+ // example:
+ // Set a key `bar` to some data, then retrieve it.
+ // | dojo.query(".foo").data("bar", "touched");
+ // | var touched = dojo.query(".foo").data("bar");
+ // | if(touched[0] == "touched"){ alert('win'); }
+ //
+ // example:
+ // Get all the data items for a given node.
+ // | var list = dojo.query(".foo").data();
+ // | var first = list[0];
+ //
+ // example:
+ // Set the data to a complex hash. Overwrites existing keys with new value
+ // | dojo.query(".foo").data({ bar:"baz", foo:"bar" });
+ // Then get some random key:
+ // | dojo.query(".foo").data("foo"); // returns [`bar`]
+ //
+ // returns: Object|Anything|Nothing
+ // When used as a setter via `dojo.NodeList`, a NodeList instance is returned
+ // for further chaning. When used as a getter via `dojo.NodeList` an ARRAY
+ // of items is returned. The items in the array correspond to the elements
+ // in the original list. This is true even when the list length is 1, eg:
+ // when looking up a node by ID (#foo)
+ };
+
+ dojo.NodeList.prototype.removeData = function(key){
+ // summary: Remove the data associated with these nodes.
+ // key: String?
+ // If ommitted, clean all data for this node.
+ // If passed, remove the data item found at `key`
+ };
+
+=====*/
+
+ var dataCache = {}, x = 0, dataattr = "data-dojo-dataid",
+ dopid = function(node){
+ // summary: Return a uniqueish ID for the passed node reference
+ var pid = attr.get(node, dataattr);
+ if(!pid){
+ pid = "pid" + (x++);
+ attr.set(node, dataattr, pid);
+ }
+ return pid;
+ }
+ ;
+
+
+ var dodata = dojo._nodeData = function(node, key, value){
+ // summary: Private helper for dojo.NodeList.data for single node data access. Refer to NodeList.data
+ // documentation for more information.
+ //
+ // node: String|DomNode
+ // The node to associate data with
+ //
+ // key: Object?|String?
+ // If an object, act as a setter and iterate over said object setting data items as defined.
+ // If a string, and `value` present, set the data for defined `key` to `value`
+ // If a string, and `value` absent, act as a getter, returning the data associated with said `key`
+ //
+ // value: Anything?
+ // The value to set for said `key`, provided `key` is a string (and not an object)
+ //
+ var pid = dopid(node), r;
+ if(!dataCache[pid]){ dataCache[pid] = {}; }
+
+ // API discrepency: calling with only a node returns the whole object. $.data throws
+ if(arguments.length == 1){ r = dataCache[pid]; }
+ if(typeof key == "string"){
+ // either getter or setter, based on `value` presence
+ if(arguments.length > 2){
+ dataCache[pid][key] = value;
+ }else{
+ r = dataCache[pid][key];
+ }
+ }else{
+ // must be a setter, mix `value` into data hash
+ // API discrepency: using object as setter works here
+ r = lang.mixin(dataCache[pid], key);
+ }
+
+ return r; // Object|Anything|Nothing
+ };
+
+ var removeData = dojo._removeNodeData = function(node, key){
+ // summary: Remove some data from this node
+ // node: String|DomNode
+ // The node reference to remove data from
+ // key: String?
+ // If omitted, remove all data in this dataset.
+ // If passed, remove only the passed `key` in the associated dataset
+ var pid = dopid(node);
+ if(dataCache[pid]){
+ if(key){
+ delete dataCache[pid][key];
+ }else{
+ delete dataCache[pid];
+ }
+ }
+ };
+
+ dojo._gcNodeData = function(){
+ // summary: super expensive: GC all data in the data for nodes that no longer exist in the dom.
+ // description:
+ // super expensive: GC all data in the data for nodes that no longer exist in the dom.
+ // MUCH safer to do this yourself, manually, on a per-node basis (via `NodeList.removeData()`)
+ // provided as a stop-gap for exceptionally large/complex applications with constantly changing
+ // content regions (eg: a dijit.layout.ContentPane with replacing data)
+ // There is NO automatic GC going on. If you dojo.destroy() a node, you should _removeNodeData
+ // prior to destruction.
+ var livePids = query("[" + dataattr + "]").map(dopid);
+ for(var i in dataCache){
+ if(array.indexOf(livePids, i) < 0){ delete dataCache[i]; }
+ }
+ };
+
+ // make nodeData and removeNodeData public on dojo.NodeList:
+ lang.extend(NodeList, {
+ data: NodeList._adaptWithCondition(dodata, function(a){
+ return a.length === 0 || a.length == 1 && (typeof a[0] == "string");
+ }),
+ removeData: NodeList._adaptAsForEach(removeData)
+ });
+
+// TODO: this is the basic implemetation of adaptWithCondtionAndWhenMappedConsiderLength, for lack of a better API name
+// it conflicts with the the `dojo.NodeList` way: always always return an arrayLike thinger. Consider for 2.0:
+//
+// NodeList.prototype.data = function(key, value){
+// var a = arguments, r;
+// if(a.length === 0 || a.length == 1 && (typeof a[0] == "string")){
+// r = this.map(function(node){
+// return d._data(node, key);
+// });
+// if(r.length == 1){ r = r[0]; } // the offending line, and the diff on adaptWithCondition
+// }else{
+// r = this.forEach(function(node){
+// d._data(node, key, value);
+// });
+// }
+// return r; // dojo.NodeList|Array|SingleItem
+// };
+
+ return NodeList;
+
+});
diff --git a/lib/dojo/NodeList-dom.js b/lib/dojo/NodeList-dom.js
new file mode 100644
index 000000000..cc0faebb6
--- /dev/null
+++ b/lib/dojo/NodeList-dom.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/NodeList-dom",["./_base/kernel","./query","./_base/array","./_base/lang","./dom-class","./dom-construct","./dom-geometry","./dom-attr","./dom-style"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){var _a=function(a){return a.length==1&&(typeof a[0]=="string");};var _b=function(_c){var p=_c.parentNode;if(p){p.removeChild(_c);}};var _d=_2.NodeList,_e=_d._adaptWithCondition,_f=_d._adaptAsForEach,aam=_d._adaptAsMap;function _10(_11){return function(_12,_13,_14){if(arguments.length==2){return _11[typeof _13=="string"?"get":"set"](_12,_13);}return _11.set(_12,_13,_14);};};_4.extend(_d,{_normalize:function(_15,_16){var _17=_15.parse===true;if(typeof _15.template=="string"){var _18=_15.templateFunc||(_1.string&&_1.string.substitute);_15=_18?_18(_15.template,_15):_15;}var _19=(typeof _15);if(_19=="string"||_19=="number"){_15=_6.toDom(_15,(_16&&_16.ownerDocument));if(_15.nodeType==11){_15=_4._toArray(_15.childNodes);}else{_15=[_15];}}else{if(!_4.isArrayLike(_15)){_15=[_15];}else{if(!_4.isArray(_15)){_15=_4._toArray(_15);}}}if(_17){_15._runParse=true;}return _15;},_cloneNode:function(_1a){return _1a.cloneNode(true);},_place:function(ary,_1b,_1c,_1d){if(_1b.nodeType!=1&&_1c=="only"){return;}var _1e=_1b,_1f;var _20=ary.length;for(var i=_20-1;i>=0;i--){var _21=(_1d?this._cloneNode(ary[i]):ary[i]);if(ary._runParse&&_1.parser&&_1.parser.parse){if(!_1f){_1f=_1e.ownerDocument.createElement("div");}_1f.appendChild(_21);_1.parser.parse(_1f);_21=_1f.firstChild;while(_1f.firstChild){_1f.removeChild(_1f.firstChild);}}if(i==_20-1){_6.place(_21,_1e,_1c);}else{_1e.parentNode.insertBefore(_21,_1e);}_1e=_21;}},attr:_e(_10(_8),_a),style:_e(_10(_9),_a),addClass:_f(_5.add),removeClass:_f(_5.remove),replaceClass:_f(_5.replace),toggleClass:_f(_5.toggle),empty:_f(_6.empty),removeAttr:_f(_8.remove),position:aam(_7.position),marginBox:aam(_7.getMarginBox),place:function(_22,_23){var _24=_2(_22)[0];return this.forEach(function(_25){_6.place(_25,_24,_23);});},orphan:function(_26){return (_26?_2._filterResult(this,_26):this).forEach(_b);},adopt:function(_27,_28){return _2(_27).place(this[0],_28)._stash(this);},query:function(_29){if(!_29){return this;}var ret=new _d;this.map(function(_2a){_2(_29,_2a).forEach(function(_2b){if(_2b!==undefined){ret.push(_2b);}});});return ret._stash(this);},filter:function(_2c){var a=arguments,_2d=this,_2e=0;if(typeof _2c=="string"){_2d=_2._filterResult(this,a[0]);if(a.length==1){return _2d._stash(this);}_2e=1;}return this._wrap(_3.filter(_2d,a[_2e],a[_2e+1]),this);},addContent:function(_2f,_30){_2f=this._normalize(_2f,this[0]);for(var i=0,_31;(_31=this[i]);i++){this._place(_2f,_31,_30,i>0);}return this;}});return _d;}); \ No newline at end of file
diff --git a/lib/dojo/NodeList-dom.js.uncompressed.js b/lib/dojo/NodeList-dom.js.uncompressed.js
new file mode 100644
index 000000000..2460c79c9
--- /dev/null
+++ b/lib/dojo/NodeList-dom.js.uncompressed.js
@@ -0,0 +1,454 @@
+define("dojo/NodeList-dom", ["./_base/kernel", "./query", "./_base/array", "./_base/lang", "./dom-class", "./dom-construct", "./dom-geometry", "./dom-attr", "./dom-style"], function(dojo, query, array, lang, domCls, domCtr, domGeom, domAttr, domStyle){
+ /*===== var NodeList = dojo.NodeList; =====*/
+ var magicGuard = function(a){
+ // summary:
+ // the guard function for dojo.attr() and dojo.style()
+ return a.length == 1 && (typeof a[0] == "string"); // inline'd type check
+ };
+
+ var orphan = function(node){
+ // summary:
+ // function to orphan nodes
+ var p = node.parentNode;
+ if(p){
+ p.removeChild(node);
+ }
+ };
+ // FIXME: should we move orphan() to dojo.html?
+
+ var NodeList = query.NodeList,
+ awc = NodeList._adaptWithCondition,
+ aafe = NodeList._adaptAsForEach,
+ aam = NodeList._adaptAsMap;
+
+ function getSet(module){
+ return function(node, name, value){
+ if(arguments.length == 2){
+ return module[typeof name == "string" ? "get" : "set"](node, name);
+ }
+ // setter
+ return module.set(node, name, value);
+ };
+ }
+
+ lang.extend(NodeList, {
+ _normalize: function(/*String||Element||Object||NodeList*/content, /*DOMNode?*/refNode){
+ // summary:
+ // normalizes data to an array of items to insert.
+ // description:
+ // If content is an object, it can have special properties "template" and
+ // "parse". If "template" is defined, then the template value is run through
+ // dojo.string.substitute (if dojo.string.substitute has been dojo.required elsewhere),
+ // or if templateFunc is a function on the content, that function will be used to
+ // transform the template into a final string to be used for for passing to dojo._toDom.
+ // If content.parse is true, then it is remembered for later, for when the content
+ // nodes are inserted into the DOM. At that point, the nodes will be parsed for widgets
+ // (if dojo.parser has been dojo.required elsewhere).
+
+ //Wanted to just use a DocumentFragment, but for the array/NodeList
+ //case that meant using cloneNode, but we may not want that.
+ //Cloning should only happen if the node operations span
+ //multiple refNodes. Also, need a real array, not a NodeList from the
+ //DOM since the node movements could change those NodeLists.
+
+ var parse = content.parse === true;
+
+ //Do we have an object that needs to be run through a template?
+ if(typeof content.template == "string"){
+ var templateFunc = content.templateFunc || (dojo.string && dojo.string.substitute);
+ content = templateFunc ? templateFunc(content.template, content) : content;
+ }
+
+ var type = (typeof content);
+ if(type == "string" || type == "number"){
+ content = domCtr.toDom(content, (refNode && refNode.ownerDocument));
+ if(content.nodeType == 11){
+ //DocumentFragment. It cannot handle cloneNode calls, so pull out the children.
+ content = lang._toArray(content.childNodes);
+ }else{
+ content = [content];
+ }
+ }else if(!lang.isArrayLike(content)){
+ content = [content];
+ }else if(!lang.isArray(content)){
+ //To get to this point, content is array-like, but
+ //not an array, which likely means a DOM NodeList. Convert it now.
+ content = lang._toArray(content);
+ }
+
+ //Pass around the parse info
+ if(parse){
+ content._runParse = true;
+ }
+ return content; //Array
+ },
+
+ _cloneNode: function(/*DOMNode*/ node){
+ // summary:
+ // private utility to clone a node. Not very interesting in the vanilla
+ // dojo.NodeList case, but delegates could do interesting things like
+ // clone event handlers if that is derivable from the node.
+ return node.cloneNode(true);
+ },
+
+ _place: function(/*Array*/ary, /*DOMNode*/refNode, /*String*/position, /*Boolean*/useClone){
+ // summary:
+ // private utility to handle placing an array of nodes relative to another node.
+ // description:
+ // Allows for cloning the nodes in the array, and for
+ // optionally parsing widgets, if ary._runParse is true.
+
+ //Avoid a disallowed operation if trying to do an innerHTML on a non-element node.
+ if(refNode.nodeType != 1 && position == "only"){
+ return;
+ }
+ var rNode = refNode, tempNode;
+
+ //Always cycle backwards in case the array is really a
+ //DOM NodeList and the DOM operations take it out of the live collection.
+ var length = ary.length;
+ for(var i = length - 1; i >= 0; i--){
+ var node = (useClone ? this._cloneNode(ary[i]) : ary[i]);
+
+ //If need widget parsing, use a temp node, instead of waiting after inserting into
+ //real DOM because we need to start widget parsing at one node up from current node,
+ //which could cause some already parsed widgets to be parsed again.
+ if(ary._runParse && dojo.parser && dojo.parser.parse){
+ if(!tempNode){
+ tempNode = rNode.ownerDocument.createElement("div");
+ }
+ tempNode.appendChild(node);
+ dojo.parser.parse(tempNode);
+ node = tempNode.firstChild;
+ while(tempNode.firstChild){
+ tempNode.removeChild(tempNode.firstChild);
+ }
+ }
+
+ if(i == length - 1){
+ domCtr.place(node, rNode, position);
+ }else{
+ rNode.parentNode.insertBefore(node, rNode);
+ }
+ rNode = node;
+ }
+ },
+
+ /*=====
+ position: function(){
+ // summary:
+ // Returns border-box objects (x/y/w/h) of all elements in a node list
+ // as an Array (*not* a NodeList). Acts like `dojo.position`, though
+ // assumes the node passed is each node in this list.
+
+ return dojo.map(this, dojo.position); // Array
+ },
+
+ attr: function(property, value){
+ // summary:
+ // gets or sets the DOM attribute for every element in the
+ // NodeList. See also `dojo.attr`
+ // property: String
+ // the attribute to get/set
+ // value: String?
+ // optional. The value to set the property to
+ // returns:
+ // if no value is passed, the result is an array of attribute values
+ // If a value is passed, the return is this NodeList
+ // example:
+ // Make all nodes with a particular class focusable:
+ // | dojo.query(".focusable").attr("tabIndex", -1);
+ // example:
+ // Disable a group of buttons:
+ // | dojo.query("button.group").attr("disabled", true);
+ // example:
+ // innerHTML can be assigned or retrieved as well:
+ // | // get the innerHTML (as an array) for each list item
+ // | var ih = dojo.query("li.replaceable").attr("innerHTML");
+ return; // dojo.NodeList
+ return; // Array
+ },
+
+ style: function(property, value){
+ // summary:
+ // gets or sets the CSS property for every element in the NodeList
+ // property: String
+ // the CSS property to get/set, in JavaScript notation
+ // ("lineHieght" instead of "line-height")
+ // value: String?
+ // optional. The value to set the property to
+ // returns:
+ // if no value is passed, the result is an array of strings.
+ // If a value is passed, the return is this NodeList
+ return; // dojo.NodeList
+ return; // Array
+ },
+
+ addClass: function(className){
+ // summary:
+ // adds the specified class to every node in the list
+ // className: String|Array
+ // A String class name to add, or several space-separated class names,
+ // or an array of class names.
+ return; // dojo.NodeList
+ },
+
+ removeClass: function(className){
+ // summary:
+ // removes the specified class from every node in the list
+ // className: String|Array?
+ // An optional String class name to remove, or several space-separated
+ // class names, or an array of class names. If omitted, all class names
+ // will be deleted.
+ // returns:
+ // dojo.NodeList, this list
+ return; // dojo.NodeList
+ },
+
+ toggleClass: function(className, condition){
+ // summary:
+ // Adds a class to node if not present, or removes if present.
+ // Pass a boolean condition if you want to explicitly add or remove.
+ // condition: Boolean?
+ // If passed, true means to add the class, false means to remove.
+ // className: String
+ // the CSS class to add
+ return; // dojo.NodeList
+ },
+
+ empty: function(){
+ // summary:
+ // clears all content from each node in the list. Effectively
+ // equivalent to removing all child nodes from every item in
+ // the list.
+ return this.forEach("item.innerHTML='';"); // dojo.NodeList
+ // FIXME: should we be checking for and/or disposing of widgets below these nodes?
+ },
+ =====*/
+
+ // useful html methods
+ attr: awc(getSet(domAttr), magicGuard),
+ style: awc(getSet(domStyle), magicGuard),
+
+ addClass: aafe(domCls.add),
+ removeClass: aafe(domCls.remove),
+ replaceClass: aafe(domCls.replace),
+ toggleClass: aafe(domCls.toggle),
+
+ empty: aafe(domCtr.empty),
+ removeAttr: aafe(domAttr.remove),
+
+ position: aam(domGeom.position),
+ marginBox: aam(domGeom.getMarginBox),
+
+ // FIXME: connectPublisher()? connectRunOnce()?
+
+ /*
+ destroy: function(){
+ // summary:
+ // destroys every item in the list.
+ this.forEach(d.destroy);
+ // FIXME: should we be checking for and/or disposing of widgets below these nodes?
+ },
+ */
+
+ place: function(/*String||Node*/ queryOrNode, /*String*/ position){
+ // summary:
+ // places elements of this node list relative to the first element matched
+ // by queryOrNode. Returns the original NodeList. See: `dojo.place`
+ // queryOrNode:
+ // may be a string representing any valid CSS3 selector or a DOM node.
+ // In the selector case, only the first matching element will be used
+ // for relative positioning.
+ // position:
+ // can be one of:
+ // | "last" (default)
+ // | "first"
+ // | "before"
+ // | "after"
+ // | "only"
+ // | "replace"
+ // or an offset in the childNodes property
+ var item = query(queryOrNode)[0];
+ return this.forEach(function(node){ domCtr.place(node, item, position); }); // dojo.NodeList
+ },
+
+ orphan: function(/*String?*/ filter){
+ // summary:
+ // removes elements in this list that match the filter
+ // from their parents and returns them as a new NodeList.
+ // filter:
+ // CSS selector like ".foo" or "div > span"
+ // returns:
+ // `dojo.NodeList` containing the orphaned elements
+ return (filter ? query._filterResult(this, filter) : this).forEach(orphan); // dojo.NodeList
+ },
+
+ adopt: function(/*String||Array||DomNode*/ queryOrListOrNode, /*String?*/ position){
+ // summary:
+ // places any/all elements in queryOrListOrNode at a
+ // position relative to the first element in this list.
+ // Returns a dojo.NodeList of the adopted elements.
+ // queryOrListOrNode:
+ // a DOM node or a query string or a query result.
+ // Represents the nodes to be adopted relative to the
+ // first element of this NodeList.
+ // position:
+ // can be one of:
+ // | "last" (default)
+ // | "first"
+ // | "before"
+ // | "after"
+ // | "only"
+ // | "replace"
+ // or an offset in the childNodes property
+ return query(queryOrListOrNode).place(this[0], position)._stash(this); // dojo.NodeList
+ },
+
+ // FIXME: do we need this?
+ query: function(/*String*/ queryStr){
+ // summary:
+ // Returns a new list whose members match the passed query,
+ // assuming elements of the current NodeList as the root for
+ // each search.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div id="foo">
+ // | <p>
+ // | bacon is tasty, <span>dontcha think?</span>
+ // | </p>
+ // | </div>
+ // | <div id="bar">
+ // | <p>great comedians may not be funny <span>in person</span></p>
+ // | </div>
+ // If we are presented with the following definition for a NodeList:
+ // | var l = new dojo.NodeList(dojo.byId("foo"), dojo.byId("bar"));
+ // it's possible to find all span elements under paragraphs
+ // contained by these elements with this sub-query:
+ // | var spans = l.query("p span");
+
+ // FIXME: probably slow
+ if(!queryStr){ return this; }
+ var ret = new NodeList;
+ this.map(function(node){
+ // FIXME: why would we ever get undefined here?
+ query(queryStr, node).forEach(function(subNode){
+ if(subNode !== undefined){
+ ret.push(subNode);
+ }
+ });
+ });
+ return ret._stash(this); // dojo.NodeList
+ },
+
+ filter: function(/*String|Function*/ filter){
+ // summary:
+ // "masks" the built-in javascript filter() method (supported
+ // in Dojo via `dojo.filter`) to support passing a simple
+ // string filter in addition to supporting filtering function
+ // objects.
+ // filter:
+ // If a string, a CSS rule like ".thinger" or "div > span".
+ // example:
+ // "regular" JS filter syntax as exposed in dojo.filter:
+ // | dojo.query("*").filter(function(item){
+ // | // highlight every paragraph
+ // | return (item.nodeName == "p");
+ // | }).style("backgroundColor", "yellow");
+ // example:
+ // the same filtering using a CSS selector
+ // | dojo.query("*").filter("p").styles("backgroundColor", "yellow");
+
+ var a = arguments, items = this, start = 0;
+ if(typeof filter == "string"){ // inline'd type check
+ items = query._filterResult(this, a[0]);
+ if(a.length == 1){
+ // if we only got a string query, pass back the filtered results
+ return items._stash(this); // dojo.NodeList
+ }
+ // if we got a callback, run it over the filtered items
+ start = 1;
+ }
+ return this._wrap(array.filter(items, a[start], a[start + 1]), this); // dojo.NodeList
+ },
+
+ /*
+ // FIXME: should this be "copyTo" and include parenting info?
+ clone: function(){
+ // summary:
+ // creates node clones of each element of this list
+ // and returns a new list containing the clones
+ },
+ */
+
+ addContent: function(/*String||DomNode||Object||dojo.NodeList*/ content, /*String||Integer?*/ position){
+ // summary:
+ // add a node, NodeList or some HTML as a string to every item in the
+ // list. Returns the original list.
+ // description:
+ // a copy of the HTML content is added to each item in the
+ // list, with an optional position argument. If no position
+ // argument is provided, the content is appended to the end of
+ // each item.
+ // content:
+ // DOM node, HTML in string format, a NodeList or an Object. If a DOM node or
+ // NodeList, the content will be cloned if the current NodeList has more than one
+ // element. Only the DOM nodes are cloned, no event handlers. If it is an Object,
+ // it should be an object with at "template" String property that has the HTML string
+ // to insert. If dojo.string has already been dojo.required, then dojo.string.substitute
+ // will be used on the "template" to generate the final HTML string. Other allowed
+ // properties on the object are: "parse" if the HTML
+ // string should be parsed for widgets (dojo.require("dojo.parser") to get that
+ // option to work), and "templateFunc" if a template function besides dojo.string.substitute
+ // should be used to transform the "template".
+ // position:
+ // can be one of:
+ // | "last"||"end" (default)
+ // | "first||"start"
+ // | "before"
+ // | "after"
+ // | "replace" (replaces nodes in this NodeList with new content)
+ // | "only" (removes other children of the nodes so new content is the only child)
+ // or an offset in the childNodes property
+ // example:
+ // appends content to the end if the position is omitted
+ // | dojo.query("h3 > p").addContent("hey there!");
+ // example:
+ // add something to the front of each element that has a
+ // "thinger" property:
+ // | dojo.query("[thinger]").addContent("...", "first");
+ // example:
+ // adds a header before each element of the list
+ // | dojo.query(".note").addContent("<h4>NOTE:</h4>", "before");
+ // example:
+ // add a clone of a DOM node to the end of every element in
+ // the list, removing it from its existing parent.
+ // | dojo.query(".note").addContent(dojo.byId("foo"));
+ // example:
+ // Append nodes from a templatized string.
+ // dojo.require("dojo.string");
+ // dojo.query(".note").addContent({
+ // template: '<b>${id}: </b><span>${name}</span>',
+ // id: "user332",
+ // name: "Mr. Anderson"
+ // });
+ // example:
+ // Append nodes from a templatized string that also has widgets parsed.
+ // dojo.require("dojo.string");
+ // dojo.require("dojo.parser");
+ // var notes = dojo.query(".note").addContent({
+ // template: '<button dojoType="dijit.form.Button">${text}</button>',
+ // parse: true,
+ // text: "Send"
+ // });
+ content = this._normalize(content, this[0]);
+ for(var i = 0, node; (node = this[i]); i++){
+ this._place(content, node, position, i > 0);
+ }
+ return this; //dojo.NodeList
+ }
+ });
+
+ /*===== return dojo.NodeList; =====*/
+ return NodeList;
+});
diff --git a/lib/dojo/NodeList-fx.js b/lib/dojo/NodeList-fx.js
index b9ec76647..8663bebf6 100644
--- a/lib/dojo/NodeList-fx.js
+++ b/lib/dojo/NodeList-fx.js
@@ -4,216 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.NodeList-fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.NodeList-fx"] = true;
-dojo.provide("dojo.NodeList-fx");
-dojo.require("dojo.fx");
-
-
-/*=====
-dojo["NodeList-fx"] = {
- // summary: Adds dojo.fx animation support to dojo.query()
-};
-=====*/
-
-dojo.extend(dojo.NodeList, {
- _anim: function(obj, method, args){
- args = args||{};
- var a = dojo.fx.combine(
- this.map(function(item){
- var tmpArgs = { node: item };
- dojo.mixin(tmpArgs, args);
- return obj[method](tmpArgs);
- })
- );
- return args.auto ? a.play() && this : a; // dojo.Animation|dojo.NodeList
- },
-
- wipeIn: function(args){
- // summary:
- // wipe in all elements of this NodeList via `dojo.fx.wipeIn`
- //
- // args: Object?
- // Additional dojo.Animation arguments to mix into this set with the addition of
- // an `auto` parameter.
- //
- // returns: dojo.Animation|dojo.NodeList
- // A special args member `auto` can be passed to automatically play the animation.
- // If args.auto is present, the original dojo.NodeList will be returned for further
- // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
- //
- // example:
- // Fade in all tables with class "blah":
- // | dojo.query("table.blah").wipeIn().play();
- //
- // example:
- // Utilizing `auto` to get the NodeList back:
- // | dojo.query(".titles").wipeIn({ auto:true }).onclick(someFunction);
- //
- return this._anim(dojo.fx, "wipeIn", args); // dojo.Animation|dojo.NodeList
- },
-
- wipeOut: function(args){
- // summary:
- // wipe out all elements of this NodeList via `dojo.fx.wipeOut`
- //
- // args: Object?
- // Additional dojo.Animation arguments to mix into this set with the addition of
- // an `auto` parameter.
- //
- // returns: dojo.Animation|dojo.NodeList
- // A special args member `auto` can be passed to automatically play the animation.
- // If args.auto is present, the original dojo.NodeList will be returned for further
- // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
- //
- // example:
- // Wipe out all tables with class "blah":
- // | dojo.query("table.blah").wipeOut().play();
- return this._anim(dojo.fx, "wipeOut", args); // dojo.Animation|dojo.NodeList
- },
-
- slideTo: function(args){
- // summary:
- // slide all elements of the node list to the specified place via `dojo.fx.slideTo`
- //
- // args: Object?
- // Additional dojo.Animation arguments to mix into this set with the addition of
- // an `auto` parameter.
- //
- // returns: dojo.Animation|dojo.NodeList
- // A special args member `auto` can be passed to automatically play the animation.
- // If args.auto is present, the original dojo.NodeList will be returned for further
- // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
- //
- // example:
- // | Move all tables with class "blah" to 300/300:
- // | dojo.query("table.blah").slideTo({
- // | left: 40,
- // | top: 50
- // | }).play();
- return this._anim(dojo.fx, "slideTo", args); // dojo.Animation|dojo.NodeList
- },
-
-
- fadeIn: function(args){
- // summary:
- // fade in all elements of this NodeList via `dojo.fadeIn`
- //
- // args: Object?
- // Additional dojo.Animation arguments to mix into this set with the addition of
- // an `auto` parameter.
- //
- // returns: dojo.Animation|dojo.NodeList
- // A special args member `auto` can be passed to automatically play the animation.
- // If args.auto is present, the original dojo.NodeList will be returned for further
- // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
- //
- // example:
- // Fade in all tables with class "blah":
- // | dojo.query("table.blah").fadeIn().play();
- return this._anim(dojo, "fadeIn", args); // dojo.Animation|dojo.NodeList
- },
-
- fadeOut: function(args){
- // summary:
- // fade out all elements of this NodeList via `dojo.fadeOut`
- //
- // args: Object?
- // Additional dojo.Animation arguments to mix into this set with the addition of
- // an `auto` parameter.
- //
- // returns: dojo.Animation|dojo.NodeList
- // A special args member `auto` can be passed to automatically play the animation.
- // If args.auto is present, the original dojo.NodeList will be returned for further
- // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
- //
- // example:
- // Fade out all elements with class "zork":
- // | dojo.query(".zork").fadeOut().play();
- // example:
- // Fade them on a delay and do something at the end:
- // | var fo = dojo.query(".zork").fadeOut();
- // | dojo.connect(fo, "onEnd", function(){ /*...*/ });
- // | fo.play();
- // example:
- // Using `auto`:
- // | dojo.query("li").fadeOut({ auto:true }).filter(filterFn).forEach(doit);
- //
- return this._anim(dojo, "fadeOut", args); // dojo.Animation|dojo.NodeList
- },
-
- animateProperty: function(args){
- // summary:
- // Animate all elements of this NodeList across the properties specified.
- // syntax identical to `dojo.animateProperty`
- //
- // returns: dojo.Animation|dojo.NodeList
- // A special args member `auto` can be passed to automatically play the animation.
- // If args.auto is present, the original dojo.NodeList will be returned for further
- // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
- //
- // example:
- // | dojo.query(".zork").animateProperty({
- // | duration: 500,
- // | properties: {
- // | color: { start: "black", end: "white" },
- // | left: { end: 300 }
- // | }
- // | }).play();
- //
- // example:
- // | dojo.query(".grue").animateProperty({
- // | auto:true,
- // | properties: {
- // | height:240
- // | }
- // | }).onclick(handler);
- return this._anim(dojo, "animateProperty", args); // dojo.Animation|dojo.NodeList
- },
-
- anim: function( /*Object*/ properties,
- /*Integer?*/ duration,
- /*Function?*/ easing,
- /*Function?*/ onEnd,
- /*Integer?*/ delay){
- // summary:
- // Animate one or more CSS properties for all nodes in this list.
- // The returned animation object will already be playing when it
- // is returned. See the docs for `dojo.anim` for full details.
- // properties: Object
- // the properties to animate. does NOT support the `auto` parameter like other
- // NodeList-fx methods.
- // duration: Integer?
- // Optional. The time to run the animations for
- // easing: Function?
- // Optional. The easing function to use.
- // onEnd: Function?
- // A function to be called when the animation ends
- // delay:
- // how long to delay playing the returned animation
- // example:
- // Another way to fade out:
- // | dojo.query(".thinger").anim({ opacity: 0 });
- // example:
- // animate all elements with the "thigner" class to a width of 500
- // pixels over half a second
- // | dojo.query(".thinger").anim({ width: 500 }, 700);
- var canim = dojo.fx.combine(
- this.map(function(item){
- return dojo.animateProperty({
- node: item,
- properties: properties,
- duration: duration||350,
- easing: easing
- });
- })
- );
- if(onEnd){
- dojo.connect(canim, "onEnd", onEnd);
- }
- return canim.play(delay||0); // dojo.Animation
- }
-});
-
-}
+//>>built
+define("dojo/NodeList-fx",["dojo/_base/NodeList","./_base/lang","./_base/connect","./_base/fx","./fx"],function(_1,_2,_3,_4,_5){_2.extend(_1,{_anim:function(_6,_7,_8){_8=_8||{};var a=_5.combine(this.map(function(_9){var _a={node:_9};_2.mixin(_a,_8);return _6[_7](_a);}));return _8.auto?a.play()&&this:a;},wipeIn:function(_b){return this._anim(_5,"wipeIn",_b);},wipeOut:function(_c){return this._anim(_5,"wipeOut",_c);},slideTo:function(_d){return this._anim(_5,"slideTo",_d);},fadeIn:function(_e){return this._anim(_4,"fadeIn",_e);},fadeOut:function(_f){return this._anim(_4,"fadeOut",_f);},animateProperty:function(_10){return this._anim(_4,"animateProperty",_10);},anim:function(_11,_12,_13,_14,_15){var _16=_5.combine(this.map(function(_17){return _4.animateProperty({node:_17,properties:_11,duration:_12||350,easing:_13});}));if(_14){_3.connect(_16,"onEnd",_14);}return _16.play(_15||0);}});return _1;}); \ No newline at end of file
diff --git a/lib/dojo/NodeList-fx.js.uncompressed.js b/lib/dojo/NodeList-fx.js.uncompressed.js
new file mode 100644
index 000000000..ec81392e0
--- /dev/null
+++ b/lib/dojo/NodeList-fx.js.uncompressed.js
@@ -0,0 +1,222 @@
+define("dojo/NodeList-fx", ["dojo/_base/NodeList", "./_base/lang", "./_base/connect", "./_base/fx", "./fx"],
+ function(NodeList, lang, connectLib, baseFx, coreFx) {
+ // module:
+ // dojo/NodeList-fx
+ // summary:
+ // TODOC
+
+/*=====
+dojo["NodeList-fx"] = {
+ // summary: Adds dojo.fx animation support to dojo.query() by extending the NodeList class
+ // with additional FX functions. NodeList is the array-like object used to hold query results.
+};
+
+// doc alias helpers:
+NodeList = dojo.NodeList;
+=====*/
+
+lang.extend(NodeList, {
+ _anim: function(obj, method, args){
+ args = args||{};
+ var a = coreFx.combine(
+ this.map(function(item){
+ var tmpArgs = { node: item };
+ lang.mixin(tmpArgs, args);
+ return obj[method](tmpArgs);
+ })
+ );
+ return args.auto ? a.play() && this : a; // dojo.Animation|dojo.NodeList
+ },
+
+ wipeIn: function(args){
+ // summary:
+ // wipe in all elements of this NodeList via `dojo.fx.wipeIn`
+ //
+ // args: Object?
+ // Additional dojo.Animation arguments to mix into this set with the addition of
+ // an `auto` parameter.
+ //
+ // returns: dojo.Animation|dojo.NodeList
+ // A special args member `auto` can be passed to automatically play the animation.
+ // If args.auto is present, the original dojo.NodeList will be returned for further
+ // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
+ //
+ // example:
+ // Fade in all tables with class "blah":
+ // | dojo.query("table.blah").wipeIn().play();
+ //
+ // example:
+ // Utilizing `auto` to get the NodeList back:
+ // | dojo.query(".titles").wipeIn({ auto:true }).onclick(someFunction);
+ //
+ return this._anim(coreFx, "wipeIn", args); // dojo.Animation|dojo.NodeList
+ },
+
+ wipeOut: function(args){
+ // summary:
+ // wipe out all elements of this NodeList via `dojo.fx.wipeOut`
+ //
+ // args: Object?
+ // Additional dojo.Animation arguments to mix into this set with the addition of
+ // an `auto` parameter.
+ //
+ // returns: dojo.Animation|dojo.NodeList
+ // A special args member `auto` can be passed to automatically play the animation.
+ // If args.auto is present, the original dojo.NodeList will be returned for further
+ // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
+ //
+ // example:
+ // Wipe out all tables with class "blah":
+ // | dojo.query("table.blah").wipeOut().play();
+ return this._anim(coreFx, "wipeOut", args); // dojo.Animation|dojo.NodeList
+ },
+
+ slideTo: function(args){
+ // summary:
+ // slide all elements of the node list to the specified place via `dojo.fx.slideTo`
+ //
+ // args: Object?
+ // Additional dojo.Animation arguments to mix into this set with the addition of
+ // an `auto` parameter.
+ //
+ // returns: dojo.Animation|dojo.NodeList
+ // A special args member `auto` can be passed to automatically play the animation.
+ // If args.auto is present, the original dojo.NodeList will be returned for further
+ // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
+ //
+ // example:
+ // | Move all tables with class "blah" to 300/300:
+ // | dojo.query("table.blah").slideTo({
+ // | left: 40,
+ // | top: 50
+ // | }).play();
+ return this._anim(coreFx, "slideTo", args); // dojo.Animation|dojo.NodeList
+ },
+
+
+ fadeIn: function(args){
+ // summary:
+ // fade in all elements of this NodeList via `dojo.fadeIn`
+ //
+ // args: Object?
+ // Additional dojo.Animation arguments to mix into this set with the addition of
+ // an `auto` parameter.
+ //
+ // returns: dojo.Animation|dojo.NodeList
+ // A special args member `auto` can be passed to automatically play the animation.
+ // If args.auto is present, the original dojo.NodeList will be returned for further
+ // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
+ //
+ // example:
+ // Fade in all tables with class "blah":
+ // | dojo.query("table.blah").fadeIn().play();
+ return this._anim(baseFx, "fadeIn", args); // dojo.Animation|dojo.NodeList
+ },
+
+ fadeOut: function(args){
+ // summary:
+ // fade out all elements of this NodeList via `dojo.fadeOut`
+ //
+ // args: Object?
+ // Additional dojo.Animation arguments to mix into this set with the addition of
+ // an `auto` parameter.
+ //
+ // returns: dojo.Animation|dojo.NodeList
+ // A special args member `auto` can be passed to automatically play the animation.
+ // If args.auto is present, the original dojo.NodeList will be returned for further
+ // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
+ //
+ // example:
+ // Fade out all elements with class "zork":
+ // | dojo.query(".zork").fadeOut().play();
+ // example:
+ // Fade them on a delay and do something at the end:
+ // | var fo = dojo.query(".zork").fadeOut();
+ // | dojo.connect(fo, "onEnd", function(){ /*...*/ });
+ // | fo.play();
+ // example:
+ // Using `auto`:
+ // | dojo.query("li").fadeOut({ auto:true }).filter(filterFn).forEach(doit);
+ //
+ return this._anim(baseFx, "fadeOut", args); // dojo.Animation|dojo.NodeList
+ },
+
+ animateProperty: function(args){
+ // summary:
+ // Animate all elements of this NodeList across the properties specified.
+ // syntax identical to `dojo.animateProperty`
+ //
+ // args: Object?
+ // Additional dojo.Animation arguments to mix into this set with the addition of
+ // an `auto` parameter.
+ //
+ // returns: dojo.Animation|dojo.NodeList
+ // A special args member `auto` can be passed to automatically play the animation.
+ // If args.auto is present, the original dojo.NodeList will be returned for further
+ // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
+ //
+ // example:
+ // | dojo.query(".zork").animateProperty({
+ // | duration: 500,
+ // | properties: {
+ // | color: { start: "black", end: "white" },
+ // | left: { end: 300 }
+ // | }
+ // | }).play();
+ //
+ // example:
+ // | dojo.query(".grue").animateProperty({
+ // | auto:true,
+ // | properties: {
+ // | height:240
+ // | }
+ // | }).onclick(handler);
+ return this._anim(baseFx, "animateProperty", args); // dojo.Animation|dojo.NodeList
+ },
+
+ anim: function( /*Object*/ properties,
+ /*Integer?*/ duration,
+ /*Function?*/ easing,
+ /*Function?*/ onEnd,
+ /*Integer?*/ delay){
+ // summary:
+ // Animate one or more CSS properties for all nodes in this list.
+ // The returned animation object will already be playing when it
+ // is returned. See the docs for `dojo.anim` for full details.
+ // properties: Object
+ // the properties to animate. does NOT support the `auto` parameter like other
+ // NodeList-fx methods.
+ // duration: Integer?
+ // Optional. The time to run the animations for
+ // easing: Function?
+ // Optional. The easing function to use.
+ // onEnd: Function?
+ // A function to be called when the animation ends
+ // delay:
+ // how long to delay playing the returned animation
+ // example:
+ // Another way to fade out:
+ // | dojo.query(".thinger").anim({ opacity: 0 });
+ // example:
+ // animate all elements with the "thigner" class to a width of 500
+ // pixels over half a second
+ // | dojo.query(".thinger").anim({ width: 500 }, 700);
+ var canim = coreFx.combine(
+ this.map(function(item){
+ return baseFx.animateProperty({
+ node: item,
+ properties: properties,
+ duration: duration||350,
+ easing: easing
+ });
+ })
+ );
+ if(onEnd){
+ connectLib.connect(canim, "onEnd", onEnd);
+ }
+ return canim.play(delay||0); // dojo.Animation
+ }
+});
+
+return NodeList;
+});
diff --git a/lib/dojo/NodeList-html.js b/lib/dojo/NodeList-html.js
index bc8da9d86..ba84ee772 100644
--- a/lib/dojo/NodeList-html.js
+++ b/lib/dojo/NodeList-html.js
@@ -4,47 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.NodeList-html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.NodeList-html"] = true;
-dojo.provide("dojo.NodeList-html");
-dojo.require("dojo.html");
-
-
-/*=====
-dojo["NodeList-html"] = {
- // summary: Adds a chainable html method to dojo.query() / Nodelist instances for setting/replacing node content
-};
-=====*/
-
-dojo.extend(dojo.NodeList, {
- html: function(content, /* Object? */params){
- // summary:
- // see `dojo.html.set()`. Set the content of all elements of this NodeList
- //
- // description:
- // Based around `dojo.html.set()`, set the content of the Elements in a
- // NodeList to the given content (string/node/nodelist), with optional arguments
- // to further tune the set content behavior.
- //
- // example:
- // | dojo.query(".thingList").html("<li dojoType='dojo.dnd.Moveable'>1</li><li dojoType='dojo.dnd.Moveable'>2</li><li dojoType='dojo.dnd.Moveable'>3</li>",
- // | {
- // | parseContent: true,
- // | onBegin: function(){
- // | this.content = this.content.replace(/([0-9])/g, this.id + ": $1");
- // | this.inherited("onBegin", arguments);
- // | }
- // | }).removeClass("notdone").addClass("done");
-
- var dhs = new dojo.html._ContentSetter(params || {});
- this.forEach(function(elm){
- dhs.node = elm;
- dhs.set(content);
- dhs.tearDown();
- });
- return this; // dojo.NodeList
- }
-});
-
-}
+//>>built
+define("dojo/NodeList-html",["./query","./_base/lang","./html"],function(_1,_2,_3){var _4=_1.NodeList;_2.extend(_4,{html:function(_5,_6){var _7=new _3._ContentSetter(_6||{});this.forEach(function(_8){_7.node=_8;_7.set(_5);_7.tearDown();});return this;}});return _4;}); \ No newline at end of file
diff --git a/lib/dojo/NodeList-html.js.uncompressed.js b/lib/dojo/NodeList-html.js.uncompressed.js
new file mode 100644
index 000000000..9e7312d8b
--- /dev/null
+++ b/lib/dojo/NodeList-html.js.uncompressed.js
@@ -0,0 +1,55 @@
+define("dojo/NodeList-html", ["./query", "./_base/lang", "./html"], function(query, lang, html) {
+ // module:
+ // dojo/NodeList-html
+ // summary:
+ // TODOC
+
+var NodeList = query.NodeList;
+
+/*=====
+dojo["NodeList-html"] = {
+ // summary: Adds a chainable html method to dojo.query() / Nodelist instances for setting/replacing node content
+};
+
+// doc helper aliases:
+NodeList = dojo.NodeList;
+=====*/
+
+lang.extend(NodeList, {
+ html: function(/* String|DomNode|NodeList? */ content, /* Object? */params){
+ // summary:
+ // see `dojo.html.set()`. Set the content of all elements of this NodeList
+ //
+ // content:
+ // An html string, node or enumerable list of nodes for insertion into the dom
+ //
+ // params:
+ // Optional flags/properties to configure the content-setting. See dojo.html._ContentSetter
+ //
+ // description:
+ // Based around `dojo.html.set()`, set the content of the Elements in a
+ // NodeList to the given content (string/node/nodelist), with optional arguments
+ // to further tune the set content behavior.
+ //
+ // example:
+ // | dojo.query(".thingList").html("<li dojoType='dojo.dnd.Moveable'>1</li><li dojoType='dojo.dnd.Moveable'>2</li><li dojoType='dojo.dnd.Moveable'>3</li>",
+ // | {
+ // | parseContent: true,
+ // | onBegin: function(){
+ // | this.content = this.content.replace(/([0-9])/g, this.id + ": $1");
+ // | this.inherited("onBegin", arguments);
+ // | }
+ // | }).removeClass("notdone").addClass("done");
+
+ var dhs = new html._ContentSetter(params || {});
+ this.forEach(function(elm){
+ dhs.node = elm;
+ dhs.set(content);
+ dhs.tearDown();
+ });
+ return this; // dojo.NodeList
+ }
+});
+
+return NodeList;
+});
diff --git a/lib/dojo/NodeList-manipulate.js b/lib/dojo/NodeList-manipulate.js
index 8a4603843..d436a7fc1 100644
--- a/lib/dojo/NodeList-manipulate.js
+++ b/lib/dojo/NodeList-manipulate.js
@@ -4,729 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.NodeList-manipulate"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.NodeList-manipulate"] = true;
-dojo.provide("dojo.NodeList-manipulate");
-
-
-/*=====
-dojo["NodeList-manipulate"] = {
- // summary: Adds a chainable methods to dojo.query() / Nodelist instances for manipulating HTML
- // and DOM nodes and their properties.
-};
-=====*/
-
-//TODO: add a way to parse for widgets in the injected markup?
-
-(function(){
- function getText(/*DOMNode*/node){
- // summary:
- // recursion method for text() to use. Gets text value for a node.
- // description:
- // Juse uses nodedValue so things like <br/> tags do not end up in
- // the text as any sort of line return.
- var text = "", ch = node.childNodes;
- for(var i = 0, n; n = ch[i]; i++){
- //Skip comments.
- if(n.nodeType != 8){
- if(n.nodeType == 1){
- text += getText(n);
- }else{
- text += n.nodeValue;
- }
- }
- }
- return text;
- }
-
- function getWrapInsertion(/*DOMNode*/node){
- // summary:
- // finds the innermost element to use for wrap insertion.
-
- //Make it easy, assume single nesting, no siblings.
- while(node.childNodes[0] && node.childNodes[0].nodeType == 1){
- node = node.childNodes[0];
- }
- return node; //DOMNode
- }
-
- function makeWrapNode(/*DOMNode||String*/html, /*DOMNode*/refNode){
- // summary:
- // convert HTML into nodes if it is not already a node.
- if(typeof html == "string"){
- html = dojo._toDom(html, (refNode && refNode.ownerDocument));
- if(html.nodeType == 11){
- //DocumentFragment cannot handle cloneNode, so choose first child.
- html = html.childNodes[0];
- }
- }else if(html.nodeType == 1 && html.parentNode){
- //This element is already in the DOM clone it, but not its children.
- html = html.cloneNode(false);
- }
- return html; /*DOMNode*/
- }
-
- dojo.extend(dojo.NodeList, {
- _placeMultiple: function(/*String||Node||NodeList*/query, /*String*/position){
- // summary:
- // private method for inserting queried nodes into all nodes in this NodeList
- // at different positions. Differs from NodeList.place because it will clone
- // the nodes in this NodeList if the query matches more than one element.
- var nl2 = typeof query == "string" || query.nodeType ? dojo.query(query) : query;
- var toAdd = [];
- for(var i = 0; i < nl2.length; i++){
- //Go backwards in DOM to make dom insertions easier via insertBefore
- var refNode = nl2[i];
- var length = this.length;
- for(var j = length - 1, item; item = this[j]; j--){
- if(i > 0){
- //Need to clone the item. This also means
- //it needs to be added to the current NodeList
- //so it can also be the target of other chaining operations.
- item = this._cloneNode(item);
- toAdd.unshift(item);
- }
- if(j == length - 1){
- dojo.place(item, refNode, position);
- }else{
- refNode.parentNode.insertBefore(item, refNode);
- }
- refNode = item;
- }
- }
-
- if(toAdd.length){
- //Add the toAdd items to the current NodeList. Build up list of args
- //to pass to splice.
- toAdd.unshift(0);
- toAdd.unshift(this.length - 1);
- Array.prototype.splice.apply(this, toAdd);
- }
-
- return this; //dojo.NodeList
- },
-
- innerHTML: function(/*String?||DOMNode?|NodeList?*/value){
- // summary:
- // allows setting the innerHTML of each node in the NodeList,
- // if there is a value passed in, otherwise, reads the innerHTML value of the first node.
- // description:
- // This method is simpler than the dojo.NodeList.html() method provided by
- // `dojo.NodeList-html`. This method just does proper innerHTML insertion of HTML fragments,
- // and it allows for the innerHTML to be read for the first node in the node list.
- // Since dojo.NodeList-html already took the "html" name, this method is called
- // "innerHTML". However, if dojo.NodeList-html has not been loaded yet, this
- // module will define an "html" method that can be used instead. Be careful if you
- // are working in an environment where it is possible that dojo.NodeList-html could
- // have been loaded, since its definition of "html" will take precedence.
- // The nodes represented by the value argument will be cloned if more than one
- // node is in this NodeList. The nodes in this NodeList are returned in the "set"
- // usage of this method, not the HTML that was inserted.
- // returns:
- // if no value is passed, the result is String, the innerHTML of the first node.
- // If a value is passed, the return is this dojo.NodeList
- // example:
- // assume a DOM created by this markup:
- // | <div id="foo"></div>
- // | <div id="bar"></div>
- // This code inserts <p>Hello World</p> into both divs:
- // | dojo.query("div").innerHTML("<p>Hello World</p>");
- // example:
- // assume a DOM created by this markup:
- // | <div id="foo"><p>Hello Mars</p></div>
- // | <div id="bar"><p>Hello World</p></div>
- // This code returns "<p>Hello Mars</p>":
- // | var message = dojo.query("div").innerHTML();
- if(arguments.length){
- return this.addContent(value, "only"); //dojo.NodeList
- }else{
- return this[0].innerHTML; //String
- }
- },
-
- /*=====
- html: function(value){
- // summary:
- // see the information for "innerHTML". "html" is an alias for "innerHTML", but is
- // only defined if dojo.NodeList-html has not been loaded.
- // description:
- // An alias for the "innerHTML" method, but only defined if there is not an existing
- // "html" method on dojo.NodeList. Be careful if you are working in an environment
- // where it is possible that dojo.NodeList-html could have been loaded, since its
- // definition of "html" will take precedence. If you are not sure if dojo.NodeList-html
- // could be loaded, use the "innerHTML" method.
- // value: String?||DOMNode?||NodeList?
- // optional. The HTML fragment to use as innerHTML. If value is not passed, then the innerHTML
- // of the first element in this NodeList is returned.
- // returns:
- // if no value is passed, the result is String, the innerHTML of the first node.
- // If a value is passed, the return is this dojo.NodeList
- return; // dojo.NodeList
- return; // String
- },
- =====*/
-
- text: function(/*String*/value){
- // summary:
- // allows setting the text value of each node in the NodeList,
- // if there is a value passed in, otherwise, returns the text value for all the
- // nodes in the NodeList in one string.
- // example:
- // assume a DOM created by this markup:
- // | <div id="foo"></div>
- // | <div id="bar"></div>
- // This code inserts "Hello World" into both divs:
- // | dojo.query("div").text("Hello World");
- // example:
- // assume a DOM created by this markup:
- // | <div id="foo"><p>Hello Mars <span>today</span></p></div>
- // | <div id="bar"><p>Hello World</p></div>
- // This code returns "Hello Mars today":
- // | var message = dojo.query("div").text();
- // returns:
- // if no value is passed, the result is String, the text value of the first node.
- // If a value is passed, the return is this dojo.NodeList
- if(arguments.length){
- for(var i = 0, node; node = this[i]; i++){
- if(node.nodeType == 1){
- dojo.empty(node);
- node.appendChild(node.ownerDocument.createTextNode(value));
- }
- }
- return this; //dojo.NodeList
- }else{
- var result = "";
- for(i = 0; node = this[i]; i++){
- result += getText(node);
- }
- return result; //String
- }
- },
-
- val: function(/*String||Array*/value){
- // summary:
- // If a value is passed, allows seting the value property of form elements in this
- // NodeList, or properly selecting/checking the right value for radio/checkbox/select
- // elements. If no value is passed, the value of the first node in this NodeList
- // is returned.
- // returns:
- // if no value is passed, the result is String or an Array, for the value of the
- // first node.
- // If a value is passed, the return is this dojo.NodeList
- // example:
- // assume a DOM created by this markup:
- // | <input type="text" value="foo">
- // | <select multiple>
- // | <option value="red" selected>Red</option>
- // | <option value="blue">Blue</option>
- // | <option value="yellow" selected>Yellow</option>
- // | </select>
- // This code gets and sets the values for the form fields above:
- // | dojo.query('[type="text"]').val(); //gets value foo
- // | dojo.query('[type="text"]').val("bar"); //sets the input's value to "bar"
- // | dojo.query("select").val() //gets array value ["red", "yellow"]
- // | dojo.query("select").val(["blue", "yellow"]) //Sets the blue and yellow options to selected.
-
- //Special work for input elements.
- if(arguments.length){
- var isArray = dojo.isArray(value);
- for(var index = 0, node; node = this[index]; index++){
- var name = node.nodeName.toUpperCase();
- var type = node.type;
- var newValue = isArray ? value[index] : value;
-
- if(name == "SELECT"){
- var opts = node.options;
- for(var i = 0; i < opts.length; i++){
- var opt = opts[i];
- if(node.multiple){
- opt.selected = (dojo.indexOf(value, opt.value) != -1);
- }else{
- opt.selected = (opt.value == newValue);
- }
- }
- }else if(type == "checkbox" || type == "radio"){
- node.checked = (node.value == newValue);
- }else{
- node.value = newValue;
- }
- }
- return this; //dojo.NodeList
- }else{
- //node already declared above.
- node = this[0];
- if(!node || node.nodeType != 1){
- return undefined;
- }
- value = node.value || "";
- if(node.nodeName.toUpperCase() == "SELECT" && node.multiple){
- //A multivalued selectbox. Do the pain.
- value = [];
- //opts declared above in if block.
- opts = node.options;
- //i declared above in if block;
- for(i = 0; i < opts.length; i++){
- //opt declared above in if block
- opt = opts[i];
- if(opt.selected){
- value.push(opt.value);
- }
- }
- if(!value.length){
- value = null;
- }
- }
- return value; //String||Array
- }
- },
-
- append: function(/*String||DOMNode||NodeList*/content){
- // summary:
- // appends the content to every node in the NodeList.
- // description:
- // The content will be cloned if the length of NodeList
- // is greater than 1. Only the DOM nodes are cloned, not
- // any attached event handlers.
- // returns:
- // dojo.NodeList, the nodes currently in this NodeList will be returned,
- // not the appended content.
- // example:
- // assume a DOM created by this markup:
- // | <div id="foo"><p>Hello Mars</p></div>
- // | <div id="bar"><p>Hello World</p></div>
- // Running this code:
- // | dojo.query("div").append("<span>append</span>");
- // Results in this DOM structure:
- // | <div id="foo"><p>Hello Mars</p><span>append</span></div>
- // | <div id="bar"><p>Hello World</p><span>append</span></div>
- return this.addContent(content, "last"); //dojo.NodeList
- },
-
- appendTo: function(/*String*/query){
- // summary:
- // appends nodes in this NodeList to the nodes matched by
- // the query passed to appendTo.
- // description:
- // The nodes in this NodeList will be cloned if the query
- // matches more than one element. Only the DOM nodes are cloned, not
- // any attached event handlers.
- // returns:
- // dojo.NodeList, the nodes currently in this NodeList will be returned,
- // not the matched nodes from the query.
- // example:
- // assume a DOM created by this markup:
- // | <span>append</span>
- // | <p>Hello Mars</p>
- // | <p>Hello World</p>
- // Running this code:
- // | dojo.query("span").appendTo("p");
- // Results in this DOM structure:
- // | <p>Hello Mars<span>append</span></p>
- // | <p>Hello World<span>append</span></p>
- return this._placeMultiple(query, "last"); //dojo.NodeList
- },
-
- prepend: function(/*String||DOMNode||NodeList*/content){
- // summary:
- // prepends the content to every node in the NodeList.
- // description:
- // The content will be cloned if the length of NodeList
- // is greater than 1. Only the DOM nodes are cloned, not
- // any attached event handlers.
- // returns:
- // dojo.NodeList, the nodes currently in this NodeList will be returned,
- // not the appended content.
- // assume a DOM created by this markup:
- // | <div id="foo"><p>Hello Mars</p></div>
- // | <div id="bar"><p>Hello World</p></div>
- // Running this code:
- // | dojo.query("div").prepend("<span>prepend</span>");
- // Results in this DOM structure:
- // | <div id="foo"><span>prepend</span><p>Hello Mars</p></div>
- // | <div id="bar"><span>prepend</span><p>Hello World</p></div>
- return this.addContent(content, "first"); //dojo.NodeList
- },
-
- prependTo: function(/*String*/query){
- // summary:
- // prepends nodes in this NodeList to the nodes matched by
- // the query passed to prependTo.
- // description:
- // The nodes in this NodeList will be cloned if the query
- // matches more than one element. Only the DOM nodes are cloned, not
- // any attached event handlers.
- // returns:
- // dojo.NodeList, the nodes currently in this NodeList will be returned,
- // not the matched nodes from the query.
- // example:
- // assume a DOM created by this markup:
- // | <span>prepend</span>
- // | <p>Hello Mars</p>
- // | <p>Hello World</p>
- // Running this code:
- // | dojo.query("span").prependTo("p");
- // Results in this DOM structure:
- // | <p><span>prepend</span>Hello Mars</p>
- // | <p><span>prepend</span>Hello World</p>
- return this._placeMultiple(query, "first"); //dojo.NodeList
- },
-
- after: function(/*String||Element||NodeList*/content){
- // summary:
- // Places the content after every node in the NodeList.
- // description:
- // The content will be cloned if the length of NodeList
- // is greater than 1. Only the DOM nodes are cloned, not
- // any attached event handlers.
- // returns:
- // dojo.NodeList, the nodes currently in this NodeList will be returned,
- // not the appended content.
- // example:
- // assume a DOM created by this markup:
- // | <div id="foo"><p>Hello Mars</p></div>
- // | <div id="bar"><p>Hello World</p></div>
- // Running this code:
- // | dojo.query("div").after("<span>after</span>");
- // Results in this DOM structure:
- // | <div id="foo"><p>Hello Mars</p></div><span>after</span>
- // | <div id="bar"><p>Hello World</p></div><span>after</span>
- return this.addContent(content, "after"); //dojo.NodeList
- },
-
- insertAfter: function(/*String*/query){
- // summary:
- // The nodes in this NodeList will be placed after the nodes
- // matched by the query passed to insertAfter.
- // description:
- // The nodes in this NodeList will be cloned if the query
- // matches more than one element. Only the DOM nodes are cloned, not
- // any attached event handlers.
- // returns:
- // dojo.NodeList, the nodes currently in this NodeList will be returned,
- // not the matched nodes from the query.
- // example:
- // assume a DOM created by this markup:
- // | <span>after</span>
- // | <p>Hello Mars</p>
- // | <p>Hello World</p>
- // Running this code:
- // | dojo.query("span").insertAfter("p");
- // Results in this DOM structure:
- // | <p>Hello Mars</p><span>after</span>
- // | <p>Hello World</p><span>after</span>
- return this._placeMultiple(query, "after"); //dojo.NodeList
- },
-
- before: function(/*String||DOMNode||NodeList*/content){
- // summary:
- // Places the content before every node in the NodeList.
- // description:
- // The content will be cloned if the length of NodeList
- // is greater than 1. Only the DOM nodes are cloned, not
- // any attached event handlers.
- // returns:
- // dojo.NodeList, the nodes currently in this NodeList will be returned,
- // not the appended content.
- // example:
- // assume a DOM created by this markup:
- // | <div id="foo"><p>Hello Mars</p></div>
- // | <div id="bar"><p>Hello World</p></div>
- // Running this code:
- // | dojo.query("div").before("<span>before</span>");
- // Results in this DOM structure:
- // | <span>before</span><div id="foo"><p>Hello Mars</p></div>
- // | <span>before</span><div id="bar"><p>Hello World</p></div>
- return this.addContent(content, "before"); //dojo.NodeList
- },
-
- insertBefore: function(/*String*/query){
- // summary:
- // The nodes in this NodeList will be placed after the nodes
- // matched by the query passed to insertAfter.
- // description:
- // The nodes in this NodeList will be cloned if the query
- // matches more than one element. Only the DOM nodes are cloned, not
- // any attached event handlers.
- // returns:
- // dojo.NodeList, the nodes currently in this NodeList will be returned,
- // not the matched nodes from the query.
- // example:
- // assume a DOM created by this markup:
- // | <span>before</span>
- // | <p>Hello Mars</p>
- // | <p>Hello World</p>
- // Running this code:
- // | dojo.query("span").insertBefore("p");
- // Results in this DOM structure:
- // | <span>before</span><p>Hello Mars</p>
- // | <span>before</span><p>Hello World</p>
- return this._placeMultiple(query, "before"); //dojo.NodeList
- },
-
- /*=====
- remove: function(simpleFilter){
- // summary:
- // alias for dojo.NodeList's orphan method. Removes elements
- // in this list that match the simple filter from their parents
- // and returns them as a new NodeList.
- // simpleFilter: String
- // single-expression CSS rule. For example, ".thinger" or
- // "#someId[attrName='value']" but not "div > span". In short,
- // anything which does not invoke a descent to evaluate but
- // can instead be used to test a single node is acceptable.
- // returns:
- // dojo.NodeList
- return; // dojo.NodeList
- },
- =====*/
- remove: dojo.NodeList.prototype.orphan,
-
- wrap: function(/*String||DOMNode*/html){
- // summary:
- // Wrap each node in the NodeList with html passed to wrap.
- // description:
- // html will be cloned if the NodeList has more than one
- // element. Only DOM nodes are cloned, not any attached
- // event handlers.
- // returns:
- // dojo.NodeList, the nodes in the current NodeList will be returned,
- // not the nodes from html argument.
- // example:
- // assume a DOM created by this markup:
- // | <b>one</b>
- // | <b>two</b>
- // Running this code:
- // | dojo.query("b").wrap("<div><span></span></div>");
- // Results in this DOM structure:
- // | <div><span><b>one</b></span></div>
- // | <div><span><b>two</b></span></div>
- if(this[0]){
- html = makeWrapNode(html, this[0]);
-
- //Now cycle through the elements and do the insertion.
- for(var i = 0, node; node = this[i]; i++){
- //Always clone because if html is used to hold one of
- //the "this" nodes, then on the clone of html it will contain
- //that "this" node, and that would be bad.
- var clone = this._cloneNode(html);
- if(node.parentNode){
- node.parentNode.replaceChild(clone, node);
- }
- //Find deepest element and insert old node in it.
- var insertion = getWrapInsertion(clone);
- insertion.appendChild(node);
- }
- }
- return this; //dojo.NodeList
- },
-
- wrapAll: function(/*String||DOMNode*/html){
- // summary:
- // Insert html where the first node in this NodeList lives, then place all
- // nodes in this NodeList as the child of the html.
- // returns:
- // dojo.NodeList, the nodes in the current NodeList will be returned,
- // not the nodes from html argument.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | <div class="blue">Blue One</div>
- // | <div class="red">Red Two</div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".red").wrapAll('<div class="allRed"></div>');
- // Results in this DOM structure:
- // | <div class="container">
- // | <div class="allRed">
- // | <div class="red">Red One</div>
- // | <div class="red">Red Two</div>
- // | </div>
- // | <div class="blue">Blue One</div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- if(this[0]){
- html = makeWrapNode(html, this[0]);
-
- //Place the wrap HTML in place of the first node.
- this[0].parentNode.replaceChild(html, this[0]);
-
- //Now cycle through the elements and move them inside
- //the wrap.
- var insertion = getWrapInsertion(html);
- for(var i = 0, node; node = this[i]; i++){
- insertion.appendChild(node);
- }
- }
- return this; //dojo.NodeList
- },
-
- wrapInner: function(/*String||DOMNode*/html){
- // summary:
- // For each node in the NodeList, wrap all its children with the passed in html.
- // description:
- // html will be cloned if the NodeList has more than one
- // element. Only DOM nodes are cloned, not any attached
- // event handlers.
- // returns:
- // dojo.NodeList, the nodes in the current NodeList will be returned,
- // not the nodes from html argument.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | <div class="blue">Blue One</div>
- // | <div class="red">Red Two</div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".red").wrapInner('<span class="special"></span>');
- // Results in this DOM structure:
- // | <div class="container">
- // | <div class="red"><span class="special">Red One</span></div>
- // | <div class="blue">Blue One</div>
- // | <div class="red"><span class="special">Red Two</span></div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- if(this[0]){
- html = makeWrapNode(html, this[0]);
- for(var i = 0; i < this.length; i++){
- //Always clone because if html is used to hold one of
- //the "this" nodes, then on the clone of html it will contain
- //that "this" node, and that would be bad.
- var clone = this._cloneNode(html);
-
- //Need to convert the childNodes to an array since wrapAll modifies the
- //DOM and can change the live childNodes NodeList.
- this._wrap(dojo._toArray(this[i].childNodes), null, this._NodeListCtor).wrapAll(clone);
- }
- }
- return this; //dojo.NodeList
- },
-
- replaceWith: function(/*String||DOMNode||NodeList*/content){
- // summary:
- // Replaces each node in ths NodeList with the content passed to replaceWith.
- // description:
- // The content will be cloned if the length of NodeList
- // is greater than 1. Only the DOM nodes are cloned, not
- // any attached event handlers.
- // returns:
- // The nodes currently in this NodeList will be returned, not the replacing content.
- // Note that the returned nodes have been removed from the DOM.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | <div class="blue">Blue One</div>
- // | <div class="red">Red Two</div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".red").replaceWith('<div class="green">Green</div>');
- // Results in this DOM structure:
- // | <div class="container">
- // | <div class="green">Green</div>
- // | <div class="blue">Blue One</div>
- // | <div class="green">Green</div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- content = this._normalize(content, this[0]);
- for(var i = 0, node; node = this[i]; i++){
- this._place(content, node, "before", i > 0);
- node.parentNode.removeChild(node);
- }
- return this; //dojo.NodeList
- },
-
- replaceAll: function(/*String*/query){
- // summary:
- // replaces nodes matched by the query passed to replaceAll with the nodes
- // in this NodeList.
- // description:
- // The nodes in this NodeList will be cloned if the query
- // matches more than one element. Only the DOM nodes are cloned, not
- // any attached event handlers.
- // returns:
- // The nodes currently in this NodeList will be returned, not the matched nodes
- // from the query. The nodes currently in this NodeLIst could have
- // been cloned, so the returned NodeList will include the cloned nodes.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="spacer">___</div>
- // | <div class="red">Red One</div>
- // | <div class="spacer">___</div>
- // | <div class="blue">Blue One</div>
- // | <div class="spacer">___</div>
- // | <div class="red">Red Two</div>
- // | <div class="spacer">___</div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".red").replaceAll(".blue");
- // Results in this DOM structure:
- // | <div class="container">
- // | <div class="spacer">___</div>
- // | <div class="spacer">___</div>
- // | <div class="red">Red One</div>
- // | <div class="red">Red Two</div>
- // | <div class="spacer">___</div>
- // | <div class="spacer">___</div>
- // | <div class="red">Red One</div>
- // | <div class="red">Red Two</div>
- // | </div>
- var nl = dojo.query(query);
- var content = this._normalize(this, this[0]);
- for(var i = 0, node; node = nl[i]; i++){
- this._place(content, node, "before", i > 0);
- node.parentNode.removeChild(node);
- }
- return this; //dojo.NodeList
- },
-
- clone: function(){
- // summary:
- // Clones all the nodes in this NodeList and returns them as a new NodeList.
- // description:
- // Only the DOM nodes are cloned, not any attached event handlers.
- // returns:
- // dojo.NodeList, a cloned set of the original nodes.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | <div class="blue">Blue One</div>
- // | <div class="red">Red Two</div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".red").clone().appendTo(".container");
- // Results in this DOM structure:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | <div class="blue">Blue One</div>
- // | <div class="red">Red Two</div>
- // | <div class="blue">Blue Two</div>
- // | <div class="red">Red One</div>
- // | <div class="red">Red Two</div>
- // | </div>
-
- //TODO: need option to clone events?
- var ary = [];
- for(var i = 0; i < this.length; i++){
- ary.push(this._cloneNode(this[i]));
- }
- return this._wrap(ary, this, this._NodeListCtor); //dojo.NodeList
- }
- });
-
- //set up html method if one does not exist
- if(!dojo.NodeList.prototype.html){
- dojo.NodeList.prototype.html = dojo.NodeList.prototype.innerHTML;
- }
-})();
-
-}
+//>>built
+define("dojo/NodeList-manipulate",["./query","./_base/lang","./_base/array","./dom-construct","./NodeList-dom"],function(_1,_2,_3,_4){var _5=_1.NodeList;function _6(_7){var _8="",ch=_7.childNodes;for(var i=0,n;n=ch[i];i++){if(n.nodeType!=8){if(n.nodeType==1){_8+=_6(n);}else{_8+=n.nodeValue;}}}return _8;};function _9(_a){while(_a.childNodes[0]&&_a.childNodes[0].nodeType==1){_a=_a.childNodes[0];}return _a;};function _b(_c,_d){if(typeof _c=="string"){_c=_4.toDom(_c,(_d&&_d.ownerDocument));if(_c.nodeType==11){_c=_c.childNodes[0];}}else{if(_c.nodeType==1&&_c.parentNode){_c=_c.cloneNode(false);}}return _c;};_2.extend(_5,{_placeMultiple:function(_e,_f){var nl2=typeof _e=="string"||_e.nodeType?_1(_e):_e;var _10=[];for(var i=0;i<nl2.length;i++){var _11=nl2[i];var _12=this.length;for(var j=_12-1,_13;_13=this[j];j--){if(i>0){_13=this._cloneNode(_13);_10.unshift(_13);}if(j==_12-1){_4.place(_13,_11,_f);}else{_11.parentNode.insertBefore(_13,_11);}_11=_13;}}if(_10.length){_10.unshift(0);_10.unshift(this.length-1);Array.prototype.splice.apply(this,_10);}return this;},innerHTML:function(_14){if(arguments.length){return this.addContent(_14,"only");}else{return this[0].innerHTML;}},text:function(_15){if(arguments.length){for(var i=0,_16;_16=this[i];i++){if(_16.nodeType==1){_4.empty(_16);_16.appendChild(_16.ownerDocument.createTextNode(_15));}}return this;}else{var _17="";for(i=0;_16=this[i];i++){_17+=_6(_16);}return _17;}},val:function(_18){if(arguments.length){var _19=_2.isArray(_18);for(var _1a=0,_1b;_1b=this[_1a];_1a++){var _1c=_1b.nodeName.toUpperCase();var _1d=_1b.type;var _1e=_19?_18[_1a]:_18;if(_1c=="SELECT"){var _1f=_1b.options;for(var i=0;i<_1f.length;i++){var opt=_1f[i];if(_1b.multiple){opt.selected=(_3.indexOf(_18,opt.value)!=-1);}else{opt.selected=(opt.value==_1e);}}}else{if(_1d=="checkbox"||_1d=="radio"){_1b.checked=(_1b.value==_1e);}else{_1b.value=_1e;}}}return this;}else{_1b=this[0];if(!_1b||_1b.nodeType!=1){return undefined;}_18=_1b.value||"";if(_1b.nodeName.toUpperCase()=="SELECT"&&_1b.multiple){_18=[];_1f=_1b.options;for(i=0;i<_1f.length;i++){opt=_1f[i];if(opt.selected){_18.push(opt.value);}}if(!_18.length){_18=null;}}return _18;}},append:function(_20){return this.addContent(_20,"last");},appendTo:function(_21){return this._placeMultiple(_21,"last");},prepend:function(_22){return this.addContent(_22,"first");},prependTo:function(_23){return this._placeMultiple(_23,"first");},after:function(_24){return this.addContent(_24,"after");},insertAfter:function(_25){return this._placeMultiple(_25,"after");},before:function(_26){return this.addContent(_26,"before");},insertBefore:function(_27){return this._placeMultiple(_27,"before");},remove:_5.prototype.orphan,wrap:function(_28){if(this[0]){_28=_b(_28,this[0]);for(var i=0,_29;_29=this[i];i++){var _2a=this._cloneNode(_28);if(_29.parentNode){_29.parentNode.replaceChild(_2a,_29);}var _2b=_9(_2a);_2b.appendChild(_29);}}return this;},wrapAll:function(_2c){if(this[0]){_2c=_b(_2c,this[0]);this[0].parentNode.replaceChild(_2c,this[0]);var _2d=_9(_2c);for(var i=0,_2e;_2e=this[i];i++){_2d.appendChild(_2e);}}return this;},wrapInner:function(_2f){if(this[0]){_2f=_b(_2f,this[0]);for(var i=0;i<this.length;i++){var _30=this._cloneNode(_2f);this._wrap(_2._toArray(this[i].childNodes),null,this._NodeListCtor).wrapAll(_30);}}return this;},replaceWith:function(_31){_31=this._normalize(_31,this[0]);for(var i=0,_32;_32=this[i];i++){this._place(_31,_32,"before",i>0);_32.parentNode.removeChild(_32);}return this;},replaceAll:function(_33){var nl=_1(_33);var _34=this._normalize(this,this[0]);for(var i=0,_35;_35=nl[i];i++){this._place(_34,_35,"before",i>0);_35.parentNode.removeChild(_35);}return this;},clone:function(){var ary=[];for(var i=0;i<this.length;i++){ary.push(this._cloneNode(this[i]));}return this._wrap(ary,this,this._NodeListCtor);}});if(!_5.prototype.html){_5.prototype.html=_5.prototype.innerHTML;}return _5;}); \ No newline at end of file
diff --git a/lib/dojo/NodeList-manipulate.js.uncompressed.js b/lib/dojo/NodeList-manipulate.js.uncompressed.js
new file mode 100644
index 000000000..47e32c1b6
--- /dev/null
+++ b/lib/dojo/NodeList-manipulate.js.uncompressed.js
@@ -0,0 +1,730 @@
+define("dojo/NodeList-manipulate", ["./query", "./_base/lang", "./_base/array", "./dom-construct", "./NodeList-dom"], function(dquery, lang, array, construct) {
+ // module:
+ // dojo/NodeList-manipulate
+ // summary:
+ // TODOC
+
+var NodeList = dquery.NodeList;
+
+/*=====
+dojo["NodeList-manipulate"] = {
+ // summary: Adds a chainable methods to dojo.query() / Nodelist instances for manipulating HTML
+ // and DOM nodes and their properties.
+};
+
+// doc alias helpers:
+NodeList = dojo.NodeList;
+=====*/
+
+//TODO: add a way to parse for widgets in the injected markup?
+
+ function getText(/*DOMNode*/node){
+ // summary:
+ // recursion method for text() to use. Gets text value for a node.
+ // description:
+ // Juse uses nodedValue so things like <br/> tags do not end up in
+ // the text as any sort of line return.
+ var text = "", ch = node.childNodes;
+ for(var i = 0, n; n = ch[i]; i++){
+ //Skip comments.
+ if(n.nodeType != 8){
+ if(n.nodeType == 1){
+ text += getText(n);
+ }else{
+ text += n.nodeValue;
+ }
+ }
+ }
+ return text;
+ }
+
+ function getWrapInsertion(/*DOMNode*/node){
+ // summary:
+ // finds the innermost element to use for wrap insertion.
+
+ //Make it easy, assume single nesting, no siblings.
+ while(node.childNodes[0] && node.childNodes[0].nodeType == 1){
+ node = node.childNodes[0];
+ }
+ return node; //DOMNode
+ }
+
+ function makeWrapNode(/*DOMNode||String*/html, /*DOMNode*/refNode){
+ // summary:
+ // convert HTML into nodes if it is not already a node.
+ if(typeof html == "string"){
+ html = construct.toDom(html, (refNode && refNode.ownerDocument));
+ if(html.nodeType == 11){
+ //DocumentFragment cannot handle cloneNode, so choose first child.
+ html = html.childNodes[0];
+ }
+ }else if(html.nodeType == 1 && html.parentNode){
+ //This element is already in the DOM clone it, but not its children.
+ html = html.cloneNode(false);
+ }
+ return html; /*DOMNode*/
+ }
+
+ lang.extend(NodeList, {
+ _placeMultiple: function(/*String||Node||NodeList*/query, /*String*/position){
+ // summary:
+ // private method for inserting queried nodes into all nodes in this NodeList
+ // at different positions. Differs from NodeList.place because it will clone
+ // the nodes in this NodeList if the query matches more than one element.
+ var nl2 = typeof query == "string" || query.nodeType ? dquery(query) : query;
+ var toAdd = [];
+ for(var i = 0; i < nl2.length; i++){
+ //Go backwards in DOM to make dom insertions easier via insertBefore
+ var refNode = nl2[i];
+ var length = this.length;
+ for(var j = length - 1, item; item = this[j]; j--){
+ if(i > 0){
+ //Need to clone the item. This also means
+ //it needs to be added to the current NodeList
+ //so it can also be the target of other chaining operations.
+ item = this._cloneNode(item);
+ toAdd.unshift(item);
+ }
+ if(j == length - 1){
+ construct.place(item, refNode, position);
+ }else{
+ refNode.parentNode.insertBefore(item, refNode);
+ }
+ refNode = item;
+ }
+ }
+
+ if(toAdd.length){
+ //Add the toAdd items to the current NodeList. Build up list of args
+ //to pass to splice.
+ toAdd.unshift(0);
+ toAdd.unshift(this.length - 1);
+ Array.prototype.splice.apply(this, toAdd);
+ }
+
+ return this; //dojo.NodeList
+ },
+
+ innerHTML: function(/*String?||DOMNode?|NodeList?*/value){
+ // summary:
+ // allows setting the innerHTML of each node in the NodeList,
+ // if there is a value passed in, otherwise, reads the innerHTML value of the first node.
+ // description:
+ // This method is simpler than the dojo.NodeList.html() method provided by
+ // `dojo.NodeList-html`. This method just does proper innerHTML insertion of HTML fragments,
+ // and it allows for the innerHTML to be read for the first node in the node list.
+ // Since dojo.NodeList-html already took the "html" name, this method is called
+ // "innerHTML". However, if dojo.NodeList-html has not been loaded yet, this
+ // module will define an "html" method that can be used instead. Be careful if you
+ // are working in an environment where it is possible that dojo.NodeList-html could
+ // have been loaded, since its definition of "html" will take precedence.
+ // The nodes represented by the value argument will be cloned if more than one
+ // node is in this NodeList. The nodes in this NodeList are returned in the "set"
+ // usage of this method, not the HTML that was inserted.
+ // returns:
+ // if no value is passed, the result is String, the innerHTML of the first node.
+ // If a value is passed, the return is this dojo.NodeList
+ // example:
+ // assume a DOM created by this markup:
+ // | <div id="foo"></div>
+ // | <div id="bar"></div>
+ // This code inserts <p>Hello World</p> into both divs:
+ // | dojo.query("div").innerHTML("<p>Hello World</p>");
+ // example:
+ // assume a DOM created by this markup:
+ // | <div id="foo"><p>Hello Mars</p></div>
+ // | <div id="bar"><p>Hello World</p></div>
+ // This code returns "<p>Hello Mars</p>":
+ // | var message = dojo.query("div").innerHTML();
+ if(arguments.length){
+ return this.addContent(value, "only"); //dojo.NodeList
+ }else{
+ return this[0].innerHTML; //String
+ }
+ },
+
+ /*=====
+ html: function(value){
+ // summary:
+ // see the information for "innerHTML". "html" is an alias for "innerHTML", but is
+ // only defined if dojo.NodeList-html has not been loaded.
+ // description:
+ // An alias for the "innerHTML" method, but only defined if there is not an existing
+ // "html" method on dojo.NodeList. Be careful if you are working in an environment
+ // where it is possible that dojo.NodeList-html could have been loaded, since its
+ // definition of "html" will take precedence. If you are not sure if dojo.NodeList-html
+ // could be loaded, use the "innerHTML" method.
+ // value: String?||DOMNode?||NodeList?
+ // optional. The HTML fragment to use as innerHTML. If value is not passed, then the innerHTML
+ // of the first element in this NodeList is returned.
+ // returns:
+ // if no value is passed, the result is String, the innerHTML of the first node.
+ // If a value is passed, the return is this dojo.NodeList
+ return; // dojo.NodeList
+ return; // String
+ },
+ =====*/
+
+ text: function(/*String*/value){
+ // summary:
+ // allows setting the text value of each node in the NodeList,
+ // if there is a value passed in, otherwise, returns the text value for all the
+ // nodes in the NodeList in one string.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div id="foo"></div>
+ // | <div id="bar"></div>
+ // This code inserts "Hello World" into both divs:
+ // | dojo.query("div").text("Hello World");
+ // example:
+ // assume a DOM created by this markup:
+ // | <div id="foo"><p>Hello Mars <span>today</span></p></div>
+ // | <div id="bar"><p>Hello World</p></div>
+ // This code returns "Hello Mars today":
+ // | var message = dojo.query("div").text();
+ // returns:
+ // if no value is passed, the result is String, the text value of the first node.
+ // If a value is passed, the return is this dojo.NodeList
+ if(arguments.length){
+ for(var i = 0, node; node = this[i]; i++){
+ if(node.nodeType == 1){
+ construct.empty(node);
+ node.appendChild(node.ownerDocument.createTextNode(value));
+ }
+ }
+ return this; //dojo.NodeList
+ }else{
+ var result = "";
+ for(i = 0; node = this[i]; i++){
+ result += getText(node);
+ }
+ return result; //String
+ }
+ },
+
+ val: function(/*String||Array*/value){
+ // summary:
+ // If a value is passed, allows seting the value property of form elements in this
+ // NodeList, or properly selecting/checking the right value for radio/checkbox/select
+ // elements. If no value is passed, the value of the first node in this NodeList
+ // is returned.
+ // returns:
+ // if no value is passed, the result is String or an Array, for the value of the
+ // first node.
+ // If a value is passed, the return is this dojo.NodeList
+ // example:
+ // assume a DOM created by this markup:
+ // | <input type="text" value="foo">
+ // | <select multiple>
+ // | <option value="red" selected>Red</option>
+ // | <option value="blue">Blue</option>
+ // | <option value="yellow" selected>Yellow</option>
+ // | </select>
+ // This code gets and sets the values for the form fields above:
+ // | dojo.query('[type="text"]').val(); //gets value foo
+ // | dojo.query('[type="text"]').val("bar"); //sets the input's value to "bar"
+ // | dojo.query("select").val() //gets array value ["red", "yellow"]
+ // | dojo.query("select").val(["blue", "yellow"]) //Sets the blue and yellow options to selected.
+
+ //Special work for input elements.
+ if(arguments.length){
+ var isArray = lang.isArray(value);
+ for(var index = 0, node; node = this[index]; index++){
+ var name = node.nodeName.toUpperCase();
+ var type = node.type;
+ var newValue = isArray ? value[index] : value;
+
+ if(name == "SELECT"){
+ var opts = node.options;
+ for(var i = 0; i < opts.length; i++){
+ var opt = opts[i];
+ if(node.multiple){
+ opt.selected = (array.indexOf(value, opt.value) != -1);
+ }else{
+ opt.selected = (opt.value == newValue);
+ }
+ }
+ }else if(type == "checkbox" || type == "radio"){
+ node.checked = (node.value == newValue);
+ }else{
+ node.value = newValue;
+ }
+ }
+ return this; //dojo.NodeList
+ }else{
+ //node already declared above.
+ node = this[0];
+ if(!node || node.nodeType != 1){
+ return undefined;
+ }
+ value = node.value || "";
+ if(node.nodeName.toUpperCase() == "SELECT" && node.multiple){
+ //A multivalued selectbox. Do the pain.
+ value = [];
+ //opts declared above in if block.
+ opts = node.options;
+ //i declared above in if block;
+ for(i = 0; i < opts.length; i++){
+ //opt declared above in if block
+ opt = opts[i];
+ if(opt.selected){
+ value.push(opt.value);
+ }
+ }
+ if(!value.length){
+ value = null;
+ }
+ }
+ return value; //String||Array
+ }
+ },
+
+ append: function(/*String||DOMNode||NodeList*/content){
+ // summary:
+ // appends the content to every node in the NodeList.
+ // description:
+ // The content will be cloned if the length of NodeList
+ // is greater than 1. Only the DOM nodes are cloned, not
+ // any attached event handlers.
+ // returns:
+ // dojo.NodeList, the nodes currently in this NodeList will be returned,
+ // not the appended content.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div id="foo"><p>Hello Mars</p></div>
+ // | <div id="bar"><p>Hello World</p></div>
+ // Running this code:
+ // | dojo.query("div").append("<span>append</span>");
+ // Results in this DOM structure:
+ // | <div id="foo"><p>Hello Mars</p><span>append</span></div>
+ // | <div id="bar"><p>Hello World</p><span>append</span></div>
+ return this.addContent(content, "last"); //dojo.NodeList
+ },
+
+ appendTo: function(/*String*/query){
+ // summary:
+ // appends nodes in this NodeList to the nodes matched by
+ // the query passed to appendTo.
+ // description:
+ // The nodes in this NodeList will be cloned if the query
+ // matches more than one element. Only the DOM nodes are cloned, not
+ // any attached event handlers.
+ // returns:
+ // dojo.NodeList, the nodes currently in this NodeList will be returned,
+ // not the matched nodes from the query.
+ // example:
+ // assume a DOM created by this markup:
+ // | <span>append</span>
+ // | <p>Hello Mars</p>
+ // | <p>Hello World</p>
+ // Running this code:
+ // | dojo.query("span").appendTo("p");
+ // Results in this DOM structure:
+ // | <p>Hello Mars<span>append</span></p>
+ // | <p>Hello World<span>append</span></p>
+ return this._placeMultiple(query, "last"); //dojo.NodeList
+ },
+
+ prepend: function(/*String||DOMNode||NodeList*/content){
+ // summary:
+ // prepends the content to every node in the NodeList.
+ // description:
+ // The content will be cloned if the length of NodeList
+ // is greater than 1. Only the DOM nodes are cloned, not
+ // any attached event handlers.
+ // returns:
+ // dojo.NodeList, the nodes currently in this NodeList will be returned,
+ // not the appended content.
+ // assume a DOM created by this markup:
+ // | <div id="foo"><p>Hello Mars</p></div>
+ // | <div id="bar"><p>Hello World</p></div>
+ // Running this code:
+ // | dojo.query("div").prepend("<span>prepend</span>");
+ // Results in this DOM structure:
+ // | <div id="foo"><span>prepend</span><p>Hello Mars</p></div>
+ // | <div id="bar"><span>prepend</span><p>Hello World</p></div>
+ return this.addContent(content, "first"); //dojo.NodeList
+ },
+
+ prependTo: function(/*String*/query){
+ // summary:
+ // prepends nodes in this NodeList to the nodes matched by
+ // the query passed to prependTo.
+ // description:
+ // The nodes in this NodeList will be cloned if the query
+ // matches more than one element. Only the DOM nodes are cloned, not
+ // any attached event handlers.
+ // returns:
+ // dojo.NodeList, the nodes currently in this NodeList will be returned,
+ // not the matched nodes from the query.
+ // example:
+ // assume a DOM created by this markup:
+ // | <span>prepend</span>
+ // | <p>Hello Mars</p>
+ // | <p>Hello World</p>
+ // Running this code:
+ // | dojo.query("span").prependTo("p");
+ // Results in this DOM structure:
+ // | <p><span>prepend</span>Hello Mars</p>
+ // | <p><span>prepend</span>Hello World</p>
+ return this._placeMultiple(query, "first"); //dojo.NodeList
+ },
+
+ after: function(/*String||Element||NodeList*/content){
+ // summary:
+ // Places the content after every node in the NodeList.
+ // description:
+ // The content will be cloned if the length of NodeList
+ // is greater than 1. Only the DOM nodes are cloned, not
+ // any attached event handlers.
+ // returns:
+ // dojo.NodeList, the nodes currently in this NodeList will be returned,
+ // not the appended content.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div id="foo"><p>Hello Mars</p></div>
+ // | <div id="bar"><p>Hello World</p></div>
+ // Running this code:
+ // | dojo.query("div").after("<span>after</span>");
+ // Results in this DOM structure:
+ // | <div id="foo"><p>Hello Mars</p></div><span>after</span>
+ // | <div id="bar"><p>Hello World</p></div><span>after</span>
+ return this.addContent(content, "after"); //dojo.NodeList
+ },
+
+ insertAfter: function(/*String*/query){
+ // summary:
+ // The nodes in this NodeList will be placed after the nodes
+ // matched by the query passed to insertAfter.
+ // description:
+ // The nodes in this NodeList will be cloned if the query
+ // matches more than one element. Only the DOM nodes are cloned, not
+ // any attached event handlers.
+ // returns:
+ // dojo.NodeList, the nodes currently in this NodeList will be returned,
+ // not the matched nodes from the query.
+ // example:
+ // assume a DOM created by this markup:
+ // | <span>after</span>
+ // | <p>Hello Mars</p>
+ // | <p>Hello World</p>
+ // Running this code:
+ // | dojo.query("span").insertAfter("p");
+ // Results in this DOM structure:
+ // | <p>Hello Mars</p><span>after</span>
+ // | <p>Hello World</p><span>after</span>
+ return this._placeMultiple(query, "after"); //dojo.NodeList
+ },
+
+ before: function(/*String||DOMNode||NodeList*/content){
+ // summary:
+ // Places the content before every node in the NodeList.
+ // description:
+ // The content will be cloned if the length of NodeList
+ // is greater than 1. Only the DOM nodes are cloned, not
+ // any attached event handlers.
+ // returns:
+ // dojo.NodeList, the nodes currently in this NodeList will be returned,
+ // not the appended content.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div id="foo"><p>Hello Mars</p></div>
+ // | <div id="bar"><p>Hello World</p></div>
+ // Running this code:
+ // | dojo.query("div").before("<span>before</span>");
+ // Results in this DOM structure:
+ // | <span>before</span><div id="foo"><p>Hello Mars</p></div>
+ // | <span>before</span><div id="bar"><p>Hello World</p></div>
+ return this.addContent(content, "before"); //dojo.NodeList
+ },
+
+ insertBefore: function(/*String*/query){
+ // summary:
+ // The nodes in this NodeList will be placed after the nodes
+ // matched by the query passed to insertAfter.
+ // description:
+ // The nodes in this NodeList will be cloned if the query
+ // matches more than one element. Only the DOM nodes are cloned, not
+ // any attached event handlers.
+ // returns:
+ // dojo.NodeList, the nodes currently in this NodeList will be returned,
+ // not the matched nodes from the query.
+ // example:
+ // assume a DOM created by this markup:
+ // | <span>before</span>
+ // | <p>Hello Mars</p>
+ // | <p>Hello World</p>
+ // Running this code:
+ // | dojo.query("span").insertBefore("p");
+ // Results in this DOM structure:
+ // | <span>before</span><p>Hello Mars</p>
+ // | <span>before</span><p>Hello World</p>
+ return this._placeMultiple(query, "before"); //dojo.NodeList
+ },
+
+ /*=====
+ remove: function(simpleFilter){
+ // summary:
+ // alias for dojo.NodeList's orphan method. Removes elements
+ // in this list that match the simple filter from their parents
+ // and returns them as a new NodeList.
+ // simpleFilter: String
+ // single-expression CSS rule. For example, ".thinger" or
+ // "#someId[attrName='value']" but not "div > span". In short,
+ // anything which does not invoke a descent to evaluate but
+ // can instead be used to test a single node is acceptable.
+ // returns:
+ // dojo.NodeList
+ return; // dojo.NodeList
+ },
+ =====*/
+ remove: NodeList.prototype.orphan,
+
+ wrap: function(/*String||DOMNode*/html){
+ // summary:
+ // Wrap each node in the NodeList with html passed to wrap.
+ // description:
+ // html will be cloned if the NodeList has more than one
+ // element. Only DOM nodes are cloned, not any attached
+ // event handlers.
+ // returns:
+ // dojo.NodeList, the nodes in the current NodeList will be returned,
+ // not the nodes from html argument.
+ // example:
+ // assume a DOM created by this markup:
+ // | <b>one</b>
+ // | <b>two</b>
+ // Running this code:
+ // | dojo.query("b").wrap("<div><span></span></div>");
+ // Results in this DOM structure:
+ // | <div><span><b>one</b></span></div>
+ // | <div><span><b>two</b></span></div>
+ if(this[0]){
+ html = makeWrapNode(html, this[0]);
+
+ //Now cycle through the elements and do the insertion.
+ for(var i = 0, node; node = this[i]; i++){
+ //Always clone because if html is used to hold one of
+ //the "this" nodes, then on the clone of html it will contain
+ //that "this" node, and that would be bad.
+ var clone = this._cloneNode(html);
+ if(node.parentNode){
+ node.parentNode.replaceChild(clone, node);
+ }
+ //Find deepest element and insert old node in it.
+ var insertion = getWrapInsertion(clone);
+ insertion.appendChild(node);
+ }
+ }
+ return this; //dojo.NodeList
+ },
+
+ wrapAll: function(/*String||DOMNode*/html){
+ // summary:
+ // Insert html where the first node in this NodeList lives, then place all
+ // nodes in this NodeList as the child of the html.
+ // returns:
+ // dojo.NodeList, the nodes in the current NodeList will be returned,
+ // not the nodes from html argument.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | <div class="blue">Blue One</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".red").wrapAll('<div class="allRed"></div>');
+ // Results in this DOM structure:
+ // | <div class="container">
+ // | <div class="allRed">
+ // | <div class="red">Red One</div>
+ // | <div class="red">Red Two</div>
+ // | </div>
+ // | <div class="blue">Blue One</div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ if(this[0]){
+ html = makeWrapNode(html, this[0]);
+
+ //Place the wrap HTML in place of the first node.
+ this[0].parentNode.replaceChild(html, this[0]);
+
+ //Now cycle through the elements and move them inside
+ //the wrap.
+ var insertion = getWrapInsertion(html);
+ for(var i = 0, node; node = this[i]; i++){
+ insertion.appendChild(node);
+ }
+ }
+ return this; //dojo.NodeList
+ },
+
+ wrapInner: function(/*String||DOMNode*/html){
+ // summary:
+ // For each node in the NodeList, wrap all its children with the passed in html.
+ // description:
+ // html will be cloned if the NodeList has more than one
+ // element. Only DOM nodes are cloned, not any attached
+ // event handlers.
+ // returns:
+ // dojo.NodeList, the nodes in the current NodeList will be returned,
+ // not the nodes from html argument.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | <div class="blue">Blue One</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".red").wrapInner('<span class="special"></span>');
+ // Results in this DOM structure:
+ // | <div class="container">
+ // | <div class="red"><span class="special">Red One</span></div>
+ // | <div class="blue">Blue One</div>
+ // | <div class="red"><span class="special">Red Two</span></div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ if(this[0]){
+ html = makeWrapNode(html, this[0]);
+ for(var i = 0; i < this.length; i++){
+ //Always clone because if html is used to hold one of
+ //the "this" nodes, then on the clone of html it will contain
+ //that "this" node, and that would be bad.
+ var clone = this._cloneNode(html);
+
+ //Need to convert the childNodes to an array since wrapAll modifies the
+ //DOM and can change the live childNodes NodeList.
+ this._wrap(lang._toArray(this[i].childNodes), null, this._NodeListCtor).wrapAll(clone);
+ }
+ }
+ return this; //dojo.NodeList
+ },
+
+ replaceWith: function(/*String||DOMNode||NodeList*/content){
+ // summary:
+ // Replaces each node in ths NodeList with the content passed to replaceWith.
+ // description:
+ // The content will be cloned if the length of NodeList
+ // is greater than 1. Only the DOM nodes are cloned, not
+ // any attached event handlers.
+ // returns:
+ // The nodes currently in this NodeList will be returned, not the replacing content.
+ // Note that the returned nodes have been removed from the DOM.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | <div class="blue">Blue One</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".red").replaceWith('<div class="green">Green</div>');
+ // Results in this DOM structure:
+ // | <div class="container">
+ // | <div class="green">Green</div>
+ // | <div class="blue">Blue One</div>
+ // | <div class="green">Green</div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ content = this._normalize(content, this[0]);
+ for(var i = 0, node; node = this[i]; i++){
+ this._place(content, node, "before", i > 0);
+ node.parentNode.removeChild(node);
+ }
+ return this; //dojo.NodeList
+ },
+
+ replaceAll: function(/*String*/query){
+ // summary:
+ // replaces nodes matched by the query passed to replaceAll with the nodes
+ // in this NodeList.
+ // description:
+ // The nodes in this NodeList will be cloned if the query
+ // matches more than one element. Only the DOM nodes are cloned, not
+ // any attached event handlers.
+ // returns:
+ // The nodes currently in this NodeList will be returned, not the matched nodes
+ // from the query. The nodes currently in this NodeLIst could have
+ // been cloned, so the returned NodeList will include the cloned nodes.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="spacer">___</div>
+ // | <div class="red">Red One</div>
+ // | <div class="spacer">___</div>
+ // | <div class="blue">Blue One</div>
+ // | <div class="spacer">___</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="spacer">___</div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".red").replaceAll(".blue");
+ // Results in this DOM structure:
+ // | <div class="container">
+ // | <div class="spacer">___</div>
+ // | <div class="spacer">___</div>
+ // | <div class="red">Red One</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="spacer">___</div>
+ // | <div class="spacer">___</div>
+ // | <div class="red">Red One</div>
+ // | <div class="red">Red Two</div>
+ // | </div>
+ var nl = dquery(query);
+ var content = this._normalize(this, this[0]);
+ for(var i = 0, node; node = nl[i]; i++){
+ this._place(content, node, "before", i > 0);
+ node.parentNode.removeChild(node);
+ }
+ return this; //dojo.NodeList
+ },
+
+ clone: function(){
+ // summary:
+ // Clones all the nodes in this NodeList and returns them as a new NodeList.
+ // description:
+ // Only the DOM nodes are cloned, not any attached event handlers.
+ // returns:
+ // dojo.NodeList, a cloned set of the original nodes.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | <div class="blue">Blue One</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".red").clone().appendTo(".container");
+ // Results in this DOM structure:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | <div class="blue">Blue One</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue">Blue Two</div>
+ // | <div class="red">Red One</div>
+ // | <div class="red">Red Two</div>
+ // | </div>
+
+ //TODO: need option to clone events?
+ var ary = [];
+ for(var i = 0; i < this.length; i++){
+ ary.push(this._cloneNode(this[i]));
+ }
+ return this._wrap(ary, this, this._NodeListCtor); //dojo.NodeList
+ }
+ });
+
+ //set up html method if one does not exist
+ if(!NodeList.prototype.html){
+ NodeList.prototype.html = NodeList.prototype.innerHTML;
+ }
+
+return NodeList;
+});
diff --git a/lib/dojo/NodeList-traverse.js b/lib/dojo/NodeList-traverse.js
index b6167ad0e..ee42c0149 100644
--- a/lib/dojo/NodeList-traverse.js
+++ b/lib/dojo/NodeList-traverse.js
@@ -4,505 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.NodeList-traverse"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.NodeList-traverse"] = true;
-dojo.provide("dojo.NodeList-traverse");
-
-
-/*=====
-dojo["NodeList-traverse"] = {
- // summary: Adds a chainable methods to dojo.query() / Nodelist instances for traversing the DOM
-};
-=====*/
-
-dojo.extend(dojo.NodeList, {
- _buildArrayFromCallback: function(/*Function*/callback){
- // summary:
- // builds a new array of possibly differing size based on the input list.
- // Since the returned array is likely of different size than the input array,
- // the array's map function cannot be used.
- var ary = [];
- for(var i = 0; i < this.length; i++){
- var items = callback.call(this[i], this[i], ary);
- if(items){
- ary = ary.concat(items);
- }
- }
- return ary;
- },
-
- _getUniqueAsNodeList: function(nodes){
- // summary:
- // given a list of nodes, make sure only unique
- // elements are returned as our NodeList object.
- // Does not call _stash().
- var ary = [];
- //Using for loop for better speed.
- for(var i = 0, node; node = nodes[i]; i++){
- //Should be a faster way to do this. dojo.query has a private
- //_zip function that may be inspirational, but there are pathways
- //in query that force nozip?
- if(node.nodeType == 1 && dojo.indexOf(ary, node) == -1){
- ary.push(node);
- }
- }
- return this._wrap(ary, null, this._NodeListCtor); //dojo.NodeList
- },
-
- _getUniqueNodeListWithParent: function(nodes, query){
- // summary:
- // gets unique element nodes, filters them further
- // with an optional query and then calls _stash to track parent NodeList.
- var ary = this._getUniqueAsNodeList(nodes);
- ary = (query ? dojo._filterQueryResult(ary, query) : ary);
- return ary._stash(this); //dojo.NodeList
- },
-
- _getRelatedUniqueNodes: function(/*String?*/query, /*Function*/callback){
- // summary:
- // cycles over all the nodes and calls a callback
- // to collect nodes for a possible inclusion in a result.
- // The callback will get two args: callback(node, ary),
- // where ary is the array being used to collect the nodes.
- return this._getUniqueNodeListWithParent(this._buildArrayFromCallback(callback), query); //dojo.NodeList
- },
-
- children: function(/*String?*/query){
- // summary:
- // Returns all immediate child elements for nodes in this dojo.NodeList.
- // Optionally takes a query to filter the child elements.
- // description:
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // query:
- // a CSS selector.
- // returns:
- // dojo.NodeList, all immediate child elements for the nodes in this dojo.NodeList.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | Some Text
- // | <div class="blue">Blue One</div>
- // | <div class="red">Red Two</div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".container").children();
- // returns the four divs that are children of the container div.
- // Running this code:
- // | dojo.query(".container").children(".red");
- // returns the two divs that have the class "red".
- return this._getRelatedUniqueNodes(query, function(node, ary){
- return dojo._toArray(node.childNodes);
- }); //dojo.NodeList
- },
-
- closest: function(/*String*/query, /*String|DOMNode?*/ root){
- // summary:
- // Returns closest parent that matches query, including current node in this
- // dojo.NodeList if it matches the query.
- // description:
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // query:
- // a CSS selector.
- // root:
- // If specified, query is relative to "root" rather than document body.
- // returns:
- // dojo.NodeList, the closest parent that matches the query, including the current
- // node in this dojo.NodeList if it matches the query.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | Some Text
- // | <div class="blue">Blue One</div>
- // | <div class="red">Red Two</div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".red").closest(".container");
- // returns the div with class "container".
- return this._getRelatedUniqueNodes(null, function(node, ary){
- do{
- if(dojo._filterQueryResult([node], query, root).length){
- return node;
- }
- }while(node != root && (node = node.parentNode) && node.nodeType == 1);
- return null; //To make rhino strict checking happy.
- }); //dojo.NodeList
- },
-
- parent: function(/*String?*/query){
- // summary:
- // Returns immediate parent elements for nodes in this dojo.NodeList.
- // Optionally takes a query to filter the parent elements.
- // description:
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // query:
- // a CSS selector.
- // returns:
- // dojo.NodeList, immediate parent elements for nodes in this dojo.NodeList.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | <div class="blue first"><span class="text">Blue One</span></div>
- // | <div class="red">Red Two</div>
- // | <div class="blue"><span class="text">Blue Two</span></div>
- // | </div>
- // Running this code:
- // | dojo.query(".text").parent();
- // returns the two divs with class "blue".
- // Running this code:
- // | dojo.query(".text").parent(".first");
- // returns the one div with class "blue" and "first".
- return this._getRelatedUniqueNodes(query, function(node, ary){
- return node.parentNode;
- }); //dojo.NodeList
- },
-
- parents: function(/*String?*/query){
- // summary:
- // Returns all parent elements for nodes in this dojo.NodeList.
- // Optionally takes a query to filter the child elements.
- // description:
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // query:
- // a CSS selector.
- // returns:
- // dojo.NodeList, all parent elements for nodes in this dojo.NodeList.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | <div class="blue first"><span class="text">Blue One</span></div>
- // | <div class="red">Red Two</div>
- // | <div class="blue"><span class="text">Blue Two</span></div>
- // | </div>
- // Running this code:
- // | dojo.query(".text").parents();
- // returns the two divs with class "blue", the div with class "container",
- // | the body element and the html element.
- // Running this code:
- // | dojo.query(".text").parents(".container");
- // returns the one div with class "container".
- return this._getRelatedUniqueNodes(query, function(node, ary){
- var pary = []
- while(node.parentNode){
- node = node.parentNode;
- pary.push(node);
- }
- return pary;
- }); //dojo.NodeList
- },
-
- siblings: function(/*String?*/query){
- // summary:
- // Returns all sibling elements for nodes in this dojo.NodeList.
- // Optionally takes a query to filter the sibling elements.
- // description:
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // query:
- // a CSS selector.
- // returns:
- // dojo.NodeList, all sibling elements for nodes in this dojo.NodeList.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | Some Text
- // | <div class="blue first">Blue One</div>
- // | <div class="red">Red Two</div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".first").siblings();
- // returns the two divs with class "red" and the other div
- // | with class "blue" that does not have "first".
- // Running this code:
- // | dojo.query(".first").siblings(".red");
- // returns the two div with class "red".
- return this._getRelatedUniqueNodes(query, function(node, ary){
- var pary = []
- var nodes = (node.parentNode && node.parentNode.childNodes);
- for(var i = 0; i < nodes.length; i++){
- if(nodes[i] != node){
- pary.push(nodes[i]);
- }
- }
- return pary;
- }); //dojo.NodeList
- },
-
- next: function(/*String?*/query){
- // summary:
- // Returns the next element for nodes in this dojo.NodeList.
- // Optionally takes a query to filter the next elements.
- // description:
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // query:
- // a CSS selector.
- // returns:
- // dojo.NodeList, the next element for nodes in this dojo.NodeList.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | Some Text
- // | <div class="blue first">Blue One</div>
- // | <div class="red">Red Two</div>
- // | <div class="blue last">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".first").next();
- // returns the div with class "red" and has innerHTML of "Red Two".
- // Running this code:
- // | dojo.query(".last").next(".red");
- // does not return any elements.
- return this._getRelatedUniqueNodes(query, function(node, ary){
- var next = node.nextSibling;
- while(next && next.nodeType != 1){
- next = next.nextSibling;
- }
- return next;
- }); //dojo.NodeList
- },
-
- nextAll: function(/*String?*/query){
- // summary:
- // Returns all sibling elements that come after the nodes in this dojo.NodeList.
- // Optionally takes a query to filter the sibling elements.
- // description:
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // query:
- // a CSS selector.
- // returns:
- // dojo.NodeList, all sibling elements that come after the nodes in this dojo.NodeList.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | Some Text
- // | <div class="blue first">Blue One</div>
- // | <div class="red next">Red Two</div>
- // | <div class="blue next">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".first").nextAll();
- // returns the two divs with class of "next".
- // Running this code:
- // | dojo.query(".first").nextAll(".red");
- // returns the one div with class "red" and innerHTML "Red Two".
- return this._getRelatedUniqueNodes(query, function(node, ary){
- var pary = []
- var next = node;
- while((next = next.nextSibling)){
- if(next.nodeType == 1){
- pary.push(next);
- }
- }
- return pary;
- }); //dojo.NodeList
- },
-
- prev: function(/*String?*/query){
- // summary:
- // Returns the previous element for nodes in this dojo.NodeList.
- // Optionally takes a query to filter the previous elements.
- // description:
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // query:
- // a CSS selector.
- // returns:
- // dojo.NodeList, the previous element for nodes in this dojo.NodeList.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | Some Text
- // | <div class="blue first">Blue One</div>
- // | <div class="red">Red Two</div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".first").prev();
- // returns the div with class "red" and has innerHTML of "Red One".
- // Running this code:
- // | dojo.query(".first").prev(".blue");
- // does not return any elements.
- return this._getRelatedUniqueNodes(query, function(node, ary){
- var prev = node.previousSibling;
- while(prev && prev.nodeType != 1){
- prev = prev.previousSibling;
- }
- return prev;
- }); //dojo.NodeList
- },
-
- prevAll: function(/*String?*/query){
- // summary:
- // Returns all sibling elements that come before the nodes in this dojo.NodeList.
- // Optionally takes a query to filter the sibling elements.
- // description:
- // The returned nodes will be in reverse DOM order -- the first node in the list will
- // be the node closest to the original node/NodeList.
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // query:
- // a CSS selector.
- // returns:
- // dojo.NodeList, all sibling elements that come before the nodes in this dojo.NodeList.
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red prev">Red One</div>
- // | Some Text
- // | <div class="blue prev">Blue One</div>
- // | <div class="red second">Red Two</div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".second").prevAll();
- // returns the two divs with class of "prev".
- // Running this code:
- // | dojo.query(".first").prevAll(".red");
- // returns the one div with class "red prev" and innerHTML "Red One".
- return this._getRelatedUniqueNodes(query, function(node, ary){
- var pary = []
- var prev = node;
- while((prev = prev.previousSibling)){
- if(prev.nodeType == 1){
- pary.push(prev);
- }
- }
- return pary;
- }); //dojo.NodeList
- },
-
- andSelf: function(){
- // summary:
- // Adds the nodes from the previous dojo.NodeList to the current dojo.NodeList.
- // description:
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // returns:
- // dojo.NodeList
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red prev">Red One</div>
- // | Some Text
- // | <div class="blue prev">Blue One</div>
- // | <div class="red second">Red Two</div>
- // | <div class="blue">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".second").prevAll().andSelf();
- // returns the two divs with class of "prev", as well as the div with class "second".
- return this.concat(this._parent);
- },
-
- //Alternate methods for the :first/:last/:even/:odd pseudos.
- first: function(){
- // summary:
- // Returns the first node in this dojo.NodeList as a dojo.NodeList.
- // description:
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // returns:
- // dojo.NodeList, with the first node in this dojo.NodeList
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | <div class="blue first">Blue One</div>
- // | <div class="red">Red Two</div>
- // | <div class="blue last">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".blue").first();
- // returns the div with class "blue" and "first".
- return this._wrap(((this[0] && [this[0]]) || []), this); //dojo.NodeList
- },
-
- last: function(){
- // summary:
- // Returns the last node in this dojo.NodeList as a dojo.NodeList.
- // description:
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // returns:
- // dojo.NodeList, with the last node in this dojo.NodeList
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="red">Red One</div>
- // | <div class="blue first">Blue One</div>
- // | <div class="red">Red Two</div>
- // | <div class="blue last">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".blue").last();
- // returns the last div with class "blue",
- return this._wrap((this.length ? [this[this.length - 1]] : []), this); //dojo.NodeList
- },
-
- even: function(){
- // summary:
- // Returns the even nodes in this dojo.NodeList as a dojo.NodeList.
- // description:
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // returns:
- // dojo.NodeList, with the even nodes in this dojo.NodeList
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="interior red">Red One</div>
- // | <div class="interior blue">Blue One</div>
- // | <div class="interior red">Red Two</div>
- // | <div class="interior blue">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".interior").even();
- // returns the two divs with class "blue"
- return this.filter(function(item, i){
- return i % 2 != 0;
- }); //dojo.NodeList
- },
-
- odd: function(){
- // summary:
- // Returns the odd nodes in this dojo.NodeList as a dojo.NodeList.
- // description:
- // .end() can be used on the returned dojo.NodeList to get back to the
- // original dojo.NodeList.
- // returns:
- // dojo.NodeList, with the odd nodes in this dojo.NodeList
- // example:
- // assume a DOM created by this markup:
- // | <div class="container">
- // | <div class="interior red">Red One</div>
- // | <div class="interior blue">Blue One</div>
- // | <div class="interior red">Red Two</div>
- // | <div class="interior blue">Blue Two</div>
- // | </div>
- // Running this code:
- // | dojo.query(".interior").odd();
- // returns the two divs with class "red"
- return this.filter(function(item, i){
- return i % 2 == 0;
- }); //dojo.NodeList
- }
-});
-
-}
+//>>built
+define("dojo/NodeList-traverse",["./query","./_base/lang","./_base/array"],function(_1,_2,_3){var _4=_1.NodeList;_2.extend(_4,{_buildArrayFromCallback:function(_5){var _6=[];for(var i=0;i<this.length;i++){var _7=_5.call(this[i],this[i],_6);if(_7){_6=_6.concat(_7);}}return _6;},_getUniqueAsNodeList:function(_8){var _9=[];for(var i=0,_a;_a=_8[i];i++){if(_a.nodeType==1&&_3.indexOf(_9,_a)==-1){_9.push(_a);}}return this._wrap(_9,null,this._NodeListCtor);},_getUniqueNodeListWithParent:function(_b,_c){var _d=this._getUniqueAsNodeList(_b);_d=(_c?_1._filterResult(_d,_c):_d);return _d._stash(this);},_getRelatedUniqueNodes:function(_e,_f){return this._getUniqueNodeListWithParent(this._buildArrayFromCallback(_f),_e);},children:function(_10){return this._getRelatedUniqueNodes(_10,function(_11,ary){return _2._toArray(_11.childNodes);});},closest:function(_12,_13){return this._getRelatedUniqueNodes(null,function(_14,ary){do{if(_1._filterResult([_14],_12,_13).length){return _14;}}while(_14!=_13&&(_14=_14.parentNode)&&_14.nodeType==1);return null;});},parent:function(_15){return this._getRelatedUniqueNodes(_15,function(_16,ary){return _16.parentNode;});},parents:function(_17){return this._getRelatedUniqueNodes(_17,function(_18,ary){var _19=[];while(_18.parentNode){_18=_18.parentNode;_19.push(_18);}return _19;});},siblings:function(_1a){return this._getRelatedUniqueNodes(_1a,function(_1b,ary){var _1c=[];var _1d=(_1b.parentNode&&_1b.parentNode.childNodes);for(var i=0;i<_1d.length;i++){if(_1d[i]!=_1b){_1c.push(_1d[i]);}}return _1c;});},next:function(_1e){return this._getRelatedUniqueNodes(_1e,function(_1f,ary){var _20=_1f.nextSibling;while(_20&&_20.nodeType!=1){_20=_20.nextSibling;}return _20;});},nextAll:function(_21){return this._getRelatedUniqueNodes(_21,function(_22,ary){var _23=[];var _24=_22;while((_24=_24.nextSibling)){if(_24.nodeType==1){_23.push(_24);}}return _23;});},prev:function(_25){return this._getRelatedUniqueNodes(_25,function(_26,ary){var _27=_26.previousSibling;while(_27&&_27.nodeType!=1){_27=_27.previousSibling;}return _27;});},prevAll:function(_28){return this._getRelatedUniqueNodes(_28,function(_29,ary){var _2a=[];var _2b=_29;while((_2b=_2b.previousSibling)){if(_2b.nodeType==1){_2a.push(_2b);}}return _2a;});},andSelf:function(){return this.concat(this._parent);},first:function(){return this._wrap(((this[0]&&[this[0]])||[]),this);},last:function(){return this._wrap((this.length?[this[this.length-1]]:[]),this);},even:function(){return this.filter(function(_2c,i){return i%2!=0;});},odd:function(){return this.filter(function(_2d,i){return i%2==0;});}});return _4;}); \ No newline at end of file
diff --git a/lib/dojo/NodeList-traverse.js.uncompressed.js b/lib/dojo/NodeList-traverse.js.uncompressed.js
new file mode 100644
index 000000000..41f850147
--- /dev/null
+++ b/lib/dojo/NodeList-traverse.js.uncompressed.js
@@ -0,0 +1,508 @@
+define("dojo/NodeList-traverse", ["./query", "./_base/lang", "./_base/array"], function(dquery, lang, array) {
+ // module:
+ // dojo/NodeList-traverse
+ // summary:
+ // TODOC
+
+var NodeList = dquery.NodeList;
+
+/*=====
+dojo["NodeList-traverse"] = {
+ // summary: Adds a chainable methods to dojo.query() / Nodelist instances for traversing the DOM
+};
+
+// doc alias helpers:
+NodeList = dojo.NodeList;
+=====*/
+
+lang.extend(NodeList, {
+ _buildArrayFromCallback: function(/*Function*/callback){
+ // summary:
+ // builds a new array of possibly differing size based on the input list.
+ // Since the returned array is likely of different size than the input array,
+ // the array's map function cannot be used.
+ var ary = [];
+ for(var i = 0; i < this.length; i++){
+ var items = callback.call(this[i], this[i], ary);
+ if(items){
+ ary = ary.concat(items);
+ }
+ }
+ return ary; //Array
+ },
+
+ _getUniqueAsNodeList: function(/*Array*/ nodes){
+ // summary:
+ // given a list of nodes, make sure only unique
+ // elements are returned as our NodeList object.
+ // Does not call _stash().
+ var ary = [];
+ //Using for loop for better speed.
+ for(var i = 0, node; node = nodes[i]; i++){
+ //Should be a faster way to do this. dojo.query has a private
+ //_zip function that may be inspirational, but there are pathways
+ //in query that force nozip?
+ if(node.nodeType == 1 && array.indexOf(ary, node) == -1){
+ ary.push(node);
+ }
+ }
+ return this._wrap(ary, null, this._NodeListCtor); //dojo.NodeList
+ },
+
+ _getUniqueNodeListWithParent: function(/*Array*/ nodes, /*String*/ query){
+ // summary:
+ // gets unique element nodes, filters them further
+ // with an optional query and then calls _stash to track parent NodeList.
+ var ary = this._getUniqueAsNodeList(nodes);
+ ary = (query ? dquery._filterResult(ary, query) : ary);
+ return ary._stash(this); //dojo.NodeList
+ },
+
+ _getRelatedUniqueNodes: function(/*String?*/ query, /*Function*/ callback){
+ // summary:
+ // cycles over all the nodes and calls a callback
+ // to collect nodes for a possible inclusion in a result.
+ // The callback will get two args: callback(node, ary),
+ // where ary is the array being used to collect the nodes.
+ return this._getUniqueNodeListWithParent(this._buildArrayFromCallback(callback), query); //dojo.NodeList
+ },
+
+ children: function(/*String?*/ query){
+ // summary:
+ // Returns all immediate child elements for nodes in this dojo.NodeList.
+ // Optionally takes a query to filter the child elements.
+ // description:
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // query:
+ // a CSS selector.
+ // returns:
+ // dojo.NodeList, all immediate child elements for the nodes in this dojo.NodeList.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | Some Text
+ // | <div class="blue">Blue One</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".container").children();
+ // returns the four divs that are children of the container div.
+ // Running this code:
+ // | dojo.query(".container").children(".red");
+ // returns the two divs that have the class "red".
+ return this._getRelatedUniqueNodes(query, function(node, ary){
+ return lang._toArray(node.childNodes);
+ }); //dojo.NodeList
+ },
+
+ closest: function(/*String*/ query, /*String|DOMNode?*/ root){
+ // summary:
+ // Returns closest parent that matches query, including current node in this
+ // dojo.NodeList if it matches the query.
+ // description:
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // query:
+ // a CSS selector.
+ // root:
+ // If specified, query is relative to "root" rather than document body.
+ // returns:
+ // dojo.NodeList, the closest parent that matches the query, including the current
+ // node in this dojo.NodeList if it matches the query.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | Some Text
+ // | <div class="blue">Blue One</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".red").closest(".container");
+ // returns the div with class "container".
+ return this._getRelatedUniqueNodes(null, function(node, ary){
+ do{
+ if(dquery._filterResult([node], query, root).length){
+ return node;
+ }
+ }while(node != root && (node = node.parentNode) && node.nodeType == 1);
+ return null; //To make rhino strict checking happy.
+ }); //dojo.NodeList
+ },
+
+ parent: function(/*String?*/ query){
+ // summary:
+ // Returns immediate parent elements for nodes in this dojo.NodeList.
+ // Optionally takes a query to filter the parent elements.
+ // description:
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // query:
+ // a CSS selector.
+ // returns:
+ // dojo.NodeList, immediate parent elements for nodes in this dojo.NodeList.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | <div class="blue first"><span class="text">Blue One</span></div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue"><span class="text">Blue Two</span></div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".text").parent();
+ // returns the two divs with class "blue".
+ // Running this code:
+ // | dojo.query(".text").parent(".first");
+ // returns the one div with class "blue" and "first".
+ return this._getRelatedUniqueNodes(query, function(node, ary){
+ return node.parentNode;
+ }); //dojo.NodeList
+ },
+
+ parents: function(/*String?*/ query){
+ // summary:
+ // Returns all parent elements for nodes in this dojo.NodeList.
+ // Optionally takes a query to filter the child elements.
+ // description:
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // query:
+ // a CSS selector.
+ // returns:
+ // dojo.NodeList, all parent elements for nodes in this dojo.NodeList.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | <div class="blue first"><span class="text">Blue One</span></div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue"><span class="text">Blue Two</span></div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".text").parents();
+ // returns the two divs with class "blue", the div with class "container",
+ // | the body element and the html element.
+ // Running this code:
+ // | dojo.query(".text").parents(".container");
+ // returns the one div with class "container".
+ return this._getRelatedUniqueNodes(query, function(node, ary){
+ var pary = [];
+ while(node.parentNode){
+ node = node.parentNode;
+ pary.push(node);
+ }
+ return pary;
+ }); //dojo.NodeList
+ },
+
+ siblings: function(/*String?*/ query){
+ // summary:
+ // Returns all sibling elements for nodes in this dojo.NodeList.
+ // Optionally takes a query to filter the sibling elements.
+ // description:
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // query:
+ // a CSS selector.
+ // returns:
+ // dojo.NodeList, all sibling elements for nodes in this dojo.NodeList.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | Some Text
+ // | <div class="blue first">Blue One</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".first").siblings();
+ // returns the two divs with class "red" and the other div
+ // | with class "blue" that does not have "first".
+ // Running this code:
+ // | dojo.query(".first").siblings(".red");
+ // returns the two div with class "red".
+ return this._getRelatedUniqueNodes(query, function(node, ary){
+ var pary = [];
+ var nodes = (node.parentNode && node.parentNode.childNodes);
+ for(var i = 0; i < nodes.length; i++){
+ if(nodes[i] != node){
+ pary.push(nodes[i]);
+ }
+ }
+ return pary;
+ }); //dojo.NodeList
+ },
+
+ next: function(/*String?*/ query){
+ // summary:
+ // Returns the next element for nodes in this dojo.NodeList.
+ // Optionally takes a query to filter the next elements.
+ // description:
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // query:
+ // a CSS selector.
+ // returns:
+ // dojo.NodeList, the next element for nodes in this dojo.NodeList.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | Some Text
+ // | <div class="blue first">Blue One</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue last">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".first").next();
+ // returns the div with class "red" and has innerHTML of "Red Two".
+ // Running this code:
+ // | dojo.query(".last").next(".red");
+ // does not return any elements.
+ return this._getRelatedUniqueNodes(query, function(node, ary){
+ var next = node.nextSibling;
+ while(next && next.nodeType != 1){
+ next = next.nextSibling;
+ }
+ return next;
+ }); //dojo.NodeList
+ },
+
+ nextAll: function(/*String?*/ query){
+ // summary:
+ // Returns all sibling elements that come after the nodes in this dojo.NodeList.
+ // Optionally takes a query to filter the sibling elements.
+ // description:
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // query:
+ // a CSS selector.
+ // returns:
+ // dojo.NodeList, all sibling elements that come after the nodes in this dojo.NodeList.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | Some Text
+ // | <div class="blue first">Blue One</div>
+ // | <div class="red next">Red Two</div>
+ // | <div class="blue next">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".first").nextAll();
+ // returns the two divs with class of "next".
+ // Running this code:
+ // | dojo.query(".first").nextAll(".red");
+ // returns the one div with class "red" and innerHTML "Red Two".
+ return this._getRelatedUniqueNodes(query, function(node, ary){
+ var pary = [];
+ var next = node;
+ while((next = next.nextSibling)){
+ if(next.nodeType == 1){
+ pary.push(next);
+ }
+ }
+ return pary;
+ }); //dojo.NodeList
+ },
+
+ prev: function(/*String?*/ query){
+ // summary:
+ // Returns the previous element for nodes in this dojo.NodeList.
+ // Optionally takes a query to filter the previous elements.
+ // description:
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // query:
+ // a CSS selector.
+ // returns:
+ // dojo.NodeList, the previous element for nodes in this dojo.NodeList.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | Some Text
+ // | <div class="blue first">Blue One</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".first").prev();
+ // returns the div with class "red" and has innerHTML of "Red One".
+ // Running this code:
+ // | dojo.query(".first").prev(".blue");
+ // does not return any elements.
+ return this._getRelatedUniqueNodes(query, function(node, ary){
+ var prev = node.previousSibling;
+ while(prev && prev.nodeType != 1){
+ prev = prev.previousSibling;
+ }
+ return prev;
+ }); //dojo.NodeList
+ },
+
+ prevAll: function(/*String?*/ query){
+ // summary:
+ // Returns all sibling elements that come before the nodes in this dojo.NodeList.
+ // Optionally takes a query to filter the sibling elements.
+ // description:
+ // The returned nodes will be in reverse DOM order -- the first node in the list will
+ // be the node closest to the original node/NodeList.
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // query:
+ // a CSS selector.
+ // returns:
+ // dojo.NodeList, all sibling elements that come before the nodes in this dojo.NodeList.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red prev">Red One</div>
+ // | Some Text
+ // | <div class="blue prev">Blue One</div>
+ // | <div class="red second">Red Two</div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".second").prevAll();
+ // returns the two divs with class of "prev".
+ // Running this code:
+ // | dojo.query(".first").prevAll(".red");
+ // returns the one div with class "red prev" and innerHTML "Red One".
+ return this._getRelatedUniqueNodes(query, function(node, ary){
+ var pary = [];
+ var prev = node;
+ while((prev = prev.previousSibling)){
+ if(prev.nodeType == 1){
+ pary.push(prev);
+ }
+ }
+ return pary;
+ }); //dojo.NodeList
+ },
+
+ andSelf: function(){
+ // summary:
+ // Adds the nodes from the previous dojo.NodeList to the current dojo.NodeList.
+ // description:
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // returns:
+ // dojo.NodeList
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red prev">Red One</div>
+ // | Some Text
+ // | <div class="blue prev">Blue One</div>
+ // | <div class="red second">Red Two</div>
+ // | <div class="blue">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".second").prevAll().andSelf();
+ // returns the two divs with class of "prev", as well as the div with class "second".
+ return this.concat(this._parent); //dojo.NodeList
+ },
+
+ //Alternate methods for the :first/:last/:even/:odd pseudos.
+ first: function(){
+ // summary:
+ // Returns the first node in this dojo.NodeList as a dojo.NodeList.
+ // description:
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // returns:
+ // dojo.NodeList, with the first node in this dojo.NodeList
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | <div class="blue first">Blue One</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue last">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".blue").first();
+ // returns the div with class "blue" and "first".
+ return this._wrap(((this[0] && [this[0]]) || []), this); //dojo.NodeList
+ },
+
+ last: function(){
+ // summary:
+ // Returns the last node in this dojo.NodeList as a dojo.NodeList.
+ // description:
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // returns:
+ // dojo.NodeList, with the last node in this dojo.NodeList
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="red">Red One</div>
+ // | <div class="blue first">Blue One</div>
+ // | <div class="red">Red Two</div>
+ // | <div class="blue last">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".blue").last();
+ // returns the last div with class "blue",
+ return this._wrap((this.length ? [this[this.length - 1]] : []), this); //dojo.NodeList
+ },
+
+ even: function(){
+ // summary:
+ // Returns the even nodes in this dojo.NodeList as a dojo.NodeList.
+ // description:
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // returns:
+ // dojo.NodeList, with the even nodes in this dojo.NodeList
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="interior red">Red One</div>
+ // | <div class="interior blue">Blue One</div>
+ // | <div class="interior red">Red Two</div>
+ // | <div class="interior blue">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".interior").even();
+ // returns the two divs with class "blue"
+ return this.filter(function(item, i){
+ return i % 2 != 0;
+ }); //dojo.NodeList
+ },
+
+ odd: function(){
+ // summary:
+ // Returns the odd nodes in this dojo.NodeList as a dojo.NodeList.
+ // description:
+ // .end() can be used on the returned dojo.NodeList to get back to the
+ // original dojo.NodeList.
+ // returns:
+ // dojo.NodeList, with the odd nodes in this dojo.NodeList
+ // example:
+ // assume a DOM created by this markup:
+ // | <div class="container">
+ // | <div class="interior red">Red One</div>
+ // | <div class="interior blue">Blue One</div>
+ // | <div class="interior red">Red Two</div>
+ // | <div class="interior blue">Blue Two</div>
+ // | </div>
+ // Running this code:
+ // | dojo.query(".interior").odd();
+ // returns the two divs with class "red"
+ return this.filter(function(item, i){
+ return i % 2 == 0;
+ }); //dojo.NodeList
+ }
+});
+
+return NodeList;
+});
diff --git a/lib/dojo/OpenAjax.js b/lib/dojo/OpenAjax.js
index f99af1a13..0733641ac 100644
--- a/lib/dojo/OpenAjax.js
+++ b/lib/dojo/OpenAjax.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
-*/
-
-
/*******************************************************************************
* OpenAjax.js
*
@@ -54,11 +47,11 @@ if(!window["OpenAjax"]){
extraData: extra
};
this.publish(ooh+"registerLibrary", libs[prefix]);
- }
+ };
h.unregisterLibrary = function(prefix){
this.publish(ooh+"unregisterLibrary", libs[prefix]);
delete libs[prefix];
- }
+ };
h._subscriptions = { c:{}, s:[] };
h._cleanup = [];
@@ -74,7 +67,7 @@ if(!window["OpenAjax"]){
var path = name.split(".");
this._subscribe(this._subscriptions, path, 0, sub);
return handle;
- }
+ };
h.publish = function(name, message){
var path = name.split(".");
@@ -88,13 +81,13 @@ if(!window["OpenAjax"]){
delete(this._cleanup);
this._cleanup = [];
}
- }
+ };
h.unsubscribe = function(sub){
var path = sub.split(".");
var sid = path.pop();
this._unsubscribe(this._subscriptions, path, 0, sid);
- }
+ };
h._subscribe = function(tree, path, index, sub){
var token = path[index];
@@ -102,21 +95,21 @@ if(!window["OpenAjax"]){
tree.s.push(sub);
}else{
if(typeof tree.c == "undefined"){
- tree.c = {};
+ tree.c = {};
}
if(typeof tree.c[token] == "undefined"){
tree.c[token] = { c: {}, s: [] };
this._subscribe(tree.c[token], path, index + 1, sub);
}else{
- this._subscribe( tree.c[token], path, index + 1, sub);
+ this._subscribe(tree.c[token], path, index + 1, sub);
}
}
- }
+ };
h._publish = function(tree, path, index, name, msg){
if(typeof tree != "undefined"){
var node;
- if(index == path.length) {
+ if(index == path.length){
node = tree;
}else{
this._publish(tree.c[path[index]], path, index + 1, name, msg);
@@ -141,33 +134,33 @@ if(!window["OpenAjax"]){
fcb = sc[fcb];
}
if((!fcb) ||
- (fcb.call(sc, name, msg, d))) {
+ (fcb.call(sc, name, msg, d))){
cb.call(sc, name, msg, d);
}
}
}
}
}
- }
+ };
- h._unsubscribe = function(tree, path, index, sid) {
- if(typeof tree != "undefined") {
- if(index < path.length) {
+ h._unsubscribe = function(tree, path, index, sid){
+ if(typeof tree != "undefined"){
+ if(index < path.length){
var childNode = tree.c[path[index]];
this._unsubscribe(childNode, path, index + 1, sid);
- if(childNode.s.length == 0) {
+ if(childNode.s.length == 0){
for(var x in childNode.c)
- return;
+ return;
delete tree.c[path[index]];
}
return;
}
- else {
+ else{
var callbacks = tree.s;
var max = callbacks.length;
for(var i = 0; i < max; i++)
- if(sid == callbacks[i].sid) {
- if(this._pubDepth > 0) {
+ if(sid == callbacks[i].sid){
+ if(this._pubDepth > 0){
callbacks[i].cb = null;
this._cleanup.push(callbacks[i]);
}
@@ -177,7 +170,7 @@ if(!window["OpenAjax"]){
}
}
}
- }
+ };
// The following function is provided for automatic testing purposes.
// It is not expected to be deployed in run-time OpenAjax Hub implementations.
h.reinit = function()
diff --git a/lib/dojo/Stateful.js b/lib/dojo/Stateful.js
index 147001962..c927128f6 100644
--- a/lib/dojo/Stateful.js
+++ b/lib/dojo/Stateful.js
@@ -4,138 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.Stateful"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.Stateful"] = true;
-dojo.provide("dojo.Stateful");
-
-
-dojo.declare("dojo.Stateful", null, {
- // summary:
- // Base class for objects that provide named properties with optional getter/setter
- // control and the ability to watch for property changes
- // example:
- // | var obj = new dojo.Stateful();
- // | obj.watch("foo", function(){
- // | console.log("foo changed to " + this.get("foo"));
- // | });
- // | obj.set("foo","bar");
- postscript: function(mixin){
- if(mixin){
- dojo.mixin(this, mixin);
- }
- },
-
- get: function(/*String*/name){
- // summary:
- // Get a property on a Stateful instance.
- // name:
- // The property to get.
- // description:
- // Get a named property on a Stateful object. The property may
- // potentially be retrieved via a getter method in subclasses. In the base class
- // this just retrieves the object's property.
- // For example:
- // | stateful = new dojo.Stateful({foo: 3});
- // | stateful.get("foo") // returns 3
- // | stateful.foo // returns 3
-
- return this[name];
- },
- set: function(/*String*/name, /*Object*/value){
- // summary:
- // Set a property on a Stateful instance
- // name:
- // The property to set.
- // value:
- // The value to set in the property.
- // description:
- // Sets named properties on a stateful object and notifies any watchers of
- // the property. A programmatic setter may be defined in subclasses.
- // For example:
- // | stateful = new dojo.Stateful();
- // | stateful.watch(function(name, oldValue, value){
- // | // this will be called on the set below
- // | }
- // | stateful.set(foo, 5);
- //
- // set() may also be called with a hash of name/value pairs, ex:
- // | myObj.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 oldValue = this[name];
- this[name] = value;
- if(this._watchCallbacks){
- this._watchCallbacks(name, oldValue, value);
- }
- return this;
- },
- watch: function(/*String?*/name, /*Function*/callback){
- // summary:
- // Watches a property for changes
- // name:
- // Indicates the property to watch. This is optional (the callback may be the
- // only parameter), and if omitted, all the properties will be watched
- // returns:
- // An object handle for the watch. The unwatch method of this object
- // can be used to discontinue watching this property:
- // | var watchHandle = obj.watch("foo", callback);
- // | watchHandle.unwatch(); // callback won't be called now
- // callback:
- // The function to execute when the property changes. This will be called after
- // the property has been changed. The callback will be called with the |this|
- // set to the instance, the first argument as the name of the property, the
- // second argument as the old value and the third argument as the new value.
-
- var callbacks = this._watchCallbacks;
- if(!callbacks){
- var self = this;
- callbacks = this._watchCallbacks = function(name, oldValue, value, ignoreCatchall){
- var notify = function(propertyCallbacks){
- if(propertyCallbacks){
- propertyCallbacks = propertyCallbacks.slice();
- for(var i = 0, l = propertyCallbacks.length; i < l; i++){
- try{
- propertyCallbacks[i].call(self, name, oldValue, value);
- }catch(e){
- console.error(e);
- }
- }
- }
- };
- notify(callbacks['_' + name]);
- if(!ignoreCatchall){
- notify(callbacks["*"]); // the catch-all
- }
- }; // we use a function instead of an object so it will be ignored by JSON conversion
- }
- if(!callback && typeof name === "function"){
- callback = name;
- name = "*";
- }else{
- // prepend with dash to prevent name conflicts with function (like "name" property)
- name = '_' + name;
- }
- var propertyCallbacks = callbacks[name];
- if(typeof propertyCallbacks !== "object"){
- propertyCallbacks = callbacks[name] = [];
- }
- propertyCallbacks.push(callback);
- return {
- unwatch: function(){
- propertyCallbacks.splice(dojo.indexOf(propertyCallbacks, callback), 1);
- }
- };
- }
-
-});
-
-}
+//>>built
+define("dojo/Stateful",["./_base/kernel","./_base/declare","./_base/lang","./_base/array"],function(_1,_2,_3,_4){return _1.declare("dojo.Stateful",null,{postscript:function(_5){if(_5){_3.mixin(this,_5);}},get:function(_6){return this[_6];},set:function(_7,_8){if(typeof _7==="object"){for(var x in _7){this.set(x,_7[x]);}return this;}var _9=this[_7];this[_7]=_8;if(this._watchCallbacks){this._watchCallbacks(_7,_9,_8);}return this;},watch:function(_a,_b){var _c=this._watchCallbacks;if(!_c){var _d=this;_c=this._watchCallbacks=function(_e,_f,_10,_11){var _12=function(_13){if(_13){_13=_13.slice();for(var i=0,l=_13.length;i<l;i++){try{_13[i].call(_d,_e,_f,_10);}catch(e){console.error(e);}}}};_12(_c["_"+_e]);if(!_11){_12(_c["*"]);}};}if(!_b&&typeof _a==="function"){_b=_a;_a="*";}else{_a="_"+_a;}var _14=_c[_a];if(typeof _14!=="object"){_14=_c[_a]=[];}_14.push(_b);return {unwatch:function(){_14.splice(_4.indexOf(_14,_b),1);}};}});}); \ No newline at end of file
diff --git a/lib/dojo/Stateful.js.uncompressed.js b/lib/dojo/Stateful.js.uncompressed.js
new file mode 100644
index 000000000..af5b70128
--- /dev/null
+++ b/lib/dojo/Stateful.js.uncompressed.js
@@ -0,0 +1,139 @@
+define("dojo/Stateful", ["./_base/kernel", "./_base/declare", "./_base/lang", "./_base/array"], function(dojo, declare, lang, array) {
+ // module:
+ // dojo/Stateful
+ // summary:
+ // TODOC
+
+return dojo.declare("dojo.Stateful", null, {
+ // summary:
+ // Base class for objects that provide named properties with optional getter/setter
+ // control and the ability to watch for property changes
+ // example:
+ // | var obj = new dojo.Stateful();
+ // | obj.watch("foo", function(){
+ // | console.log("foo changed to " + this.get("foo"));
+ // | });
+ // | obj.set("foo","bar");
+ postscript: function(mixin){
+ if(mixin){
+ lang.mixin(this, mixin);
+ }
+ },
+
+ get: function(/*String*/name){
+ // summary:
+ // Get a property on a Stateful instance.
+ // name:
+ // The property to get.
+ // returns:
+ // The property value on this Stateful instance.
+ // description:
+ // Get a named property on a Stateful object. The property may
+ // potentially be retrieved via a getter method in subclasses. In the base class
+ // this just retrieves the object's property.
+ // For example:
+ // | stateful = new dojo.Stateful({foo: 3});
+ // | stateful.get("foo") // returns 3
+ // | stateful.foo // returns 3
+
+ return this[name]; //Any
+ },
+ set: function(/*String*/name, /*Object*/value){
+ // summary:
+ // Set a property on a Stateful instance
+ // name:
+ // The property to set.
+ // value:
+ // The value to set in the property.
+ // returns:
+ // The function returns this dojo.Stateful instance.
+ // description:
+ // Sets named properties on a stateful object and notifies any watchers of
+ // the property. A programmatic setter may be defined in subclasses.
+ // For example:
+ // | stateful = new dojo.Stateful();
+ // | stateful.watch(function(name, oldValue, value){
+ // | // this will be called on the set below
+ // | }
+ // | stateful.set(foo, 5);
+ //
+ // set() may also be called with a hash of name/value pairs, ex:
+ // | myObj.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 oldValue = this[name];
+ this[name] = value;
+ if(this._watchCallbacks){
+ this._watchCallbacks(name, oldValue, value);
+ }
+ return this; //dojo.Stateful
+ },
+ watch: function(/*String?*/name, /*Function*/callback){
+ // summary:
+ // Watches a property for changes
+ // name:
+ // Indicates the property to watch. This is optional (the callback may be the
+ // only parameter), and if omitted, all the properties will be watched
+ // returns:
+ // An object handle for the watch. The unwatch method of this object
+ // can be used to discontinue watching this property:
+ // | var watchHandle = obj.watch("foo", callback);
+ // | watchHandle.unwatch(); // callback won't be called now
+ // callback:
+ // The function to execute when the property changes. This will be called after
+ // the property has been changed. The callback will be called with the |this|
+ // set to the instance, the first argument as the name of the property, the
+ // second argument as the old value and the third argument as the new value.
+
+ var callbacks = this._watchCallbacks;
+ if(!callbacks){
+ var self = this;
+ callbacks = this._watchCallbacks = function(name, oldValue, value, ignoreCatchall){
+ var notify = function(propertyCallbacks){
+ if(propertyCallbacks){
+ propertyCallbacks = propertyCallbacks.slice();
+ for(var i = 0, l = propertyCallbacks.length; i < l; i++){
+ try{
+ propertyCallbacks[i].call(self, name, oldValue, value);
+ }catch(e){
+ console.error(e);
+ }
+ }
+ }
+ };
+ notify(callbacks['_' + name]);
+ if(!ignoreCatchall){
+ notify(callbacks["*"]); // the catch-all
+ }
+ }; // we use a function instead of an object so it will be ignored by JSON conversion
+ }
+ if(!callback && typeof name === "function"){
+ callback = name;
+ name = "*";
+ }else{
+ // prepend with dash to prevent name conflicts with function (like "name" property)
+ name = '_' + name;
+ }
+ var propertyCallbacks = callbacks[name];
+ if(typeof propertyCallbacks !== "object"){
+ propertyCallbacks = callbacks[name] = [];
+ }
+ propertyCallbacks.push(callback);
+ return {
+ unwatch: function(){
+ propertyCallbacks.splice(array.indexOf(propertyCallbacks, callback), 1);
+ }
+ }; //Object
+ }
+
+});
+
+});
diff --git a/lib/dojo/_base.js b/lib/dojo/_base.js
deleted file mode 100644
index 78fc6064a..000000000
--- a/lib/dojo/_base.js
+++ /dev/null
@@ -1,22 +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["dojo._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base"] = true;
-dojo.provide("dojo._base");
-dojo.require("dojo._base.lang");
-dojo.require("dojo._base.array");
-dojo.require("dojo._base.declare");
-dojo.require("dojo._base.connect");
-dojo.require("dojo._base.Deferred");
-dojo.require("dojo._base.json");
-dojo.require("dojo._base.Color");
-dojo.require("dojo._base.browser");
-
-
-
-}
diff --git a/lib/dojo/_base/Color.js b/lib/dojo/_base/Color.js
index 4707fa582..ad8e0ab3c 100644
--- a/lib/dojo/_base/Color.js
+++ b/lib/dojo/_base/Color.js
@@ -4,225 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.Color"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.Color"] = true;
-dojo.provide("dojo._base.Color");
-dojo.require("dojo._base.array");
-dojo.require("dojo._base.lang");
-
-
-(function(){
-
- var d = dojo;
-
- dojo.Color = function(/*Array|String|Object*/ color){
- // summary:
- // Takes a named string, hex string, array of rgb or rgba values,
- // an object with r, g, b, and a properties, or another `dojo.Color` object
- // and creates a new Color instance to work from.
- //
- // example:
- // Work with a Color instance:
- // | var c = new dojo.Color();
- // | c.setColor([0,0,0]); // black
- // | var hex = c.toHex(); // #000000
- //
- // example:
- // Work with a node's color:
- // | var color = dojo.style("someNode", "backgroundColor");
- // | var n = new dojo.Color(color);
- // | // adjust the color some
- // | n.r *= .5;
- // | console.log(n.toString()); // rgb(128, 255, 255);
- if(color){ this.setColor(color); }
- };
-
- // FIXME:
- // there's got to be a more space-efficient way to encode or discover
- // these!! Use hex?
- dojo.Color.named = {
- black: [0,0,0],
- silver: [192,192,192],
- gray: [128,128,128],
- white: [255,255,255],
- maroon: [128,0,0],
- red: [255,0,0],
- purple: [128,0,128],
- fuchsia: [255,0,255],
- green: [0,128,0],
- lime: [0,255,0],
- olive: [128,128,0],
- yellow: [255,255,0],
- navy: [0,0,128],
- blue: [0,0,255],
- teal: [0,128,128],
- aqua: [0,255,255],
- transparent: d.config.transparentColor || [255,255,255]
- };
-
- dojo.extend(dojo.Color, {
- r: 255, g: 255, b: 255, a: 1,
- _set: function(r, g, b, a){
- var t = this; t.r = r; t.g = g; t.b = b; t.a = a;
- },
- setColor: function(/*Array|String|Object*/ color){
- // summary:
- // Takes a named string, hex string, array of rgb or rgba values,
- // an object with r, g, b, and a properties, or another `dojo.Color` object
- // and sets this color instance to that value.
- //
- // example:
- // | var c = new dojo.Color(); // no color
- // | c.setColor("#ededed"); // greyish
- if(d.isString(color)){
- d.colorFromString(color, this);
- }else if(d.isArray(color)){
- d.colorFromArray(color, this);
- }else{
- this._set(color.r, color.g, color.b, color.a);
- if(!(color instanceof d.Color)){ this.sanitize(); }
- }
- return this; // dojo.Color
- },
- sanitize: function(){
- // summary:
- // Ensures the object has correct attributes
- // description:
- // the default implementation does nothing, include dojo.colors to
- // augment it with real checks
- return this; // dojo.Color
- },
- toRgb: function(){
- // summary:
- // Returns 3 component array of rgb values
- // example:
- // | var c = new dojo.Color("#000000");
- // | console.log(c.toRgb()); // [0,0,0]
- var t = this;
- return [t.r, t.g, t.b]; // Array
- },
- toRgba: function(){
- // summary:
- // Returns a 4 component array of rgba values from the color
- // represented by this object.
- var t = this;
- return [t.r, t.g, t.b, t.a]; // Array
- },
- toHex: function(){
- // summary:
- // Returns a CSS color string in hexadecimal representation
- // example:
- // | console.log(new dojo.Color([0,0,0]).toHex()); // #000000
- var arr = d.map(["r", "g", "b"], function(x){
- var s = this[x].toString(16);
- return s.length < 2 ? "0" + s : s;
- }, this);
- return "#" + arr.join(""); // String
- },
- toCss: function(/*Boolean?*/ includeAlpha){
- // summary:
- // Returns a css color string in rgb(a) representation
- // example:
- // | var c = new dojo.Color("#FFF").toCss();
- // | console.log(c); // rgb('255','255','255')
- var t = this, rgb = t.r + ", " + t.g + ", " + t.b;
- return (includeAlpha ? "rgba(" + rgb + ", " + t.a : "rgb(" + rgb) + ")"; // String
- },
- toString: function(){
- // summary:
- // Returns a visual representation of the color
- return this.toCss(true); // String
- }
- });
-
- dojo.blendColors = function(
- /*dojo.Color*/ start,
- /*dojo.Color*/ end,
- /*Number*/ weight,
- /*dojo.Color?*/ obj
- ){
- // summary:
- // Blend colors end and start with weight from 0 to 1, 0.5 being a 50/50 blend,
- // can reuse a previously allocated dojo.Color object for the result
- var t = obj || new d.Color();
- d.forEach(["r", "g", "b", "a"], function(x){
- t[x] = start[x] + (end[x] - start[x]) * weight;
- if(x != "a"){ t[x] = Math.round(t[x]); }
- });
- return t.sanitize(); // dojo.Color
- };
-
- dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){
- // summary:
- // Returns a `dojo.Color` instance from a string of the form
- // "rgb(...)" or "rgba(...)". Optionally accepts a `dojo.Color`
- // object to update with the parsed value and return instead of
- // creating a new object.
- // returns:
- // A dojo.Color object. If obj is passed, it will be the return value.
- var m = color.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);
- return m && dojo.colorFromArray(m[1].split(/\s*,\s*/), obj); // dojo.Color
- };
-
- dojo.colorFromHex = function(/*String*/ color, /*dojo.Color?*/ obj){
- // summary:
- // Converts a hex string with a '#' prefix to a color object.
- // Supports 12-bit #rgb shorthand. Optionally accepts a
- // `dojo.Color` object to update with the parsed value.
- //
- // returns:
- // A dojo.Color object. If obj is passed, it will be the return value.
- //
- // example:
- // | var thing = dojo.colorFromHex("#ededed"); // grey, longhand
- //
- // example:
- // | var thing = dojo.colorFromHex("#000"); // black, shorthand
- var t = obj || new d.Color(),
- bits = (color.length == 4) ? 4 : 8,
- mask = (1 << bits) - 1;
- color = Number("0x" + color.substr(1));
- if(isNaN(color)){
- return null; // dojo.Color
- }
- d.forEach(["b", "g", "r"], function(x){
- var c = color & mask;
- color >>= bits;
- t[x] = bits == 4 ? 17 * c : c;
- });
- t.a = 1;
- return t; // dojo.Color
- };
-
- dojo.colorFromArray = function(/*Array*/ a, /*dojo.Color?*/ obj){
- // summary:
- // Builds a `dojo.Color` from a 3 or 4 element array, mapping each
- // element in sequence to the rgb(a) values of the color.
- // example:
- // | var myColor = dojo.colorFromArray([237,237,237,0.5]); // grey, 50% alpha
- // returns:
- // A dojo.Color object. If obj is passed, it will be the return value.
- var t = obj || new d.Color();
- t._set(Number(a[0]), Number(a[1]), Number(a[2]), Number(a[3]));
- if(isNaN(t.a)){ t.a = 1; }
- return t.sanitize(); // dojo.Color
- };
-
- dojo.colorFromString = function(/*String*/ str, /*dojo.Color?*/ obj){
- // summary:
- // Parses `str` for a color value. Accepts hex, rgb, and rgba
- // style color values.
- // description:
- // Acceptable input values for str may include arrays of any form
- // accepted by dojo.colorFromArray, hex strings such as "#aaaaaa", or
- // rgb or rgba strings such as "rgb(133, 200, 16)" or "rgba(10, 10,
- // 10, 50)"
- // returns:
- // A dojo.Color object. If obj is passed, it will be the return value.
- var a = d.Color.named[str];
- return a && d.colorFromArray(a, obj) || d.colorFromRgb(str, obj) || d.colorFromHex(str, obj);
- };
-})();
-
-}
+//>>built
+define("dojo/_base/Color",["./kernel","./lang","./array","./config"],function(_1,_2,_3,_4){var _5=_1.Color=function(_6){if(_6){this.setColor(_6);}};_5.named={"black":[0,0,0],"silver":[192,192,192],"gray":[128,128,128],"white":[255,255,255],"maroon":[128,0,0],"red":[255,0,0],"purple":[128,0,128],"fuchsia":[255,0,255],"green":[0,128,0],"lime":[0,255,0],"olive":[128,128,0],"yellow":[255,255,0],"navy":[0,0,128],"blue":[0,0,255],"teal":[0,128,128],"aqua":[0,255,255],"transparent":_4.transparentColor||[0,0,0,0]};_2.extend(_5,{r:255,g:255,b:255,a:1,_set:function(r,g,b,a){var t=this;t.r=r;t.g=g;t.b=b;t.a=a;},setColor:function(_7){if(_2.isString(_7)){_5.fromString(_7,this);}else{if(_2.isArray(_7)){_5.fromArray(_7,this);}else{this._set(_7.r,_7.g,_7.b,_7.a);if(!(_7 instanceof _5)){this.sanitize();}}}return this;},sanitize:function(){return this;},toRgb:function(){var t=this;return [t.r,t.g,t.b];},toRgba:function(){var t=this;return [t.r,t.g,t.b,t.a];},toHex:function(){var _8=_3.map(["r","g","b"],function(x){var s=this[x].toString(16);return s.length<2?"0"+s:s;},this);return "#"+_8.join("");},toCss:function(_9){var t=this,_a=t.r+", "+t.g+", "+t.b;return (_9?"rgba("+_a+", "+t.a:"rgb("+_a)+")";},toString:function(){return this.toCss(true);}});_5.blendColors=_1.blendColors=function(_b,_c,_d,_e){var t=_e||new _5();_3.forEach(["r","g","b","a"],function(x){t[x]=_b[x]+(_c[x]-_b[x])*_d;if(x!="a"){t[x]=Math.round(t[x]);}});return t.sanitize();};_5.fromRgb=_1.colorFromRgb=function(_f,obj){var m=_f.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);return m&&_5.fromArray(m[1].split(/\s*,\s*/),obj);};_5.fromHex=_1.colorFromHex=function(_10,obj){var t=obj||new _5(),_11=(_10.length==4)?4:8,_12=(1<<_11)-1;_10=Number("0x"+_10.substr(1));if(isNaN(_10)){return null;}_3.forEach(["b","g","r"],function(x){var c=_10&_12;_10>>=_11;t[x]=_11==4?17*c:c;});t.a=1;return t;};_5.fromArray=_1.colorFromArray=function(a,obj){var t=obj||new _5();t._set(Number(a[0]),Number(a[1]),Number(a[2]),Number(a[3]));if(isNaN(t.a)){t.a=1;}return t.sanitize();};_5.fromString=_1.colorFromString=function(str,obj){var a=_5.named[str];return a&&_5.fromArray(a,obj)||_5.fromRgb(str,obj)||_5.fromHex(str,obj);};return _5;}); \ No newline at end of file
diff --git a/lib/dojo/_base/Color.js.uncompressed.js b/lib/dojo/_base/Color.js.uncompressed.js
new file mode 100644
index 000000000..ed0918093
--- /dev/null
+++ b/lib/dojo/_base/Color.js.uncompressed.js
@@ -0,0 +1,220 @@
+define("dojo/_base/Color", ["./kernel", "./lang", "./array", "./config"], function(dojo, lang, ArrayUtil, config){
+
+ var Color = dojo.Color = function(/*Array|String|Object*/ color){
+ // summary:
+ // Takes a named string, hex string, array of rgb or rgba values,
+ // an object with r, g, b, and a properties, or another `dojo.Color` object
+ // and creates a new Color instance to work from.
+ //
+ // example:
+ // Work with a Color instance:
+ // | var c = new dojo.Color();
+ // | c.setColor([0,0,0]); // black
+ // | var hex = c.toHex(); // #000000
+ //
+ // example:
+ // Work with a node's color:
+ // | var color = dojo.style("someNode", "backgroundColor");
+ // | var n = new dojo.Color(color);
+ // | // adjust the color some
+ // | n.r *= .5;
+ // | console.log(n.toString()); // rgb(128, 255, 255);
+ if(color){ this.setColor(color); }
+ };
+
+ /*=====
+ lang.mixin(dojo.Color,{
+ named:{
+ // summary: Dictionary list of all CSS named colors, by name. Values are 3-item arrays with corresponding RG and B values.
+ }
+ });
+ =====*/
+
+ // FIXME:
+ // there's got to be a more space-efficient way to encode or discover
+ // these!! Use hex?
+ Color.named = {
+ "black": [0,0,0],
+ "silver": [192,192,192],
+ "gray": [128,128,128],
+ "white": [255,255,255],
+ "maroon": [128,0,0],
+ "red": [255,0,0],
+ "purple": [128,0,128],
+ "fuchsia":[255,0,255],
+ "green": [0,128,0],
+ "lime": [0,255,0],
+ "olive": [128,128,0],
+ "yellow": [255,255,0],
+ "navy": [0,0,128],
+ "blue": [0,0,255],
+ "teal": [0,128,128],
+ "aqua": [0,255,255],
+ "transparent": config.transparentColor || [0,0,0,0]
+ };
+
+ lang.extend(Color, {
+ r: 255, g: 255, b: 255, a: 1,
+ _set: function(r, g, b, a){
+ var t = this; t.r = r; t.g = g; t.b = b; t.a = a;
+ },
+ setColor: function(/*Array|String|Object*/ color){
+ // summary:
+ // Takes a named string, hex string, array of rgb or rgba values,
+ // an object with r, g, b, and a properties, or another `dojo.Color` object
+ // and sets this color instance to that value.
+ //
+ // example:
+ // | var c = new dojo.Color(); // no color
+ // | c.setColor("#ededed"); // greyish
+ if(lang.isString(color)){
+ Color.fromString(color, this);
+ }else if(lang.isArray(color)){
+ Color.fromArray(color, this);
+ }else{
+ this._set(color.r, color.g, color.b, color.a);
+ if(!(color instanceof Color)){ this.sanitize(); }
+ }
+ return this; // dojo.Color
+ },
+ sanitize: function(){
+ // summary:
+ // Ensures the object has correct attributes
+ // description:
+ // the default implementation does nothing, include dojo.colors to
+ // augment it with real checks
+ return this; // dojo.Color
+ },
+ toRgb: function(){
+ // summary:
+ // Returns 3 component array of rgb values
+ // example:
+ // | var c = new dojo.Color("#000000");
+ // | console.log(c.toRgb()); // [0,0,0]
+ var t = this;
+ return [t.r, t.g, t.b]; // Array
+ },
+ toRgba: function(){
+ // summary:
+ // Returns a 4 component array of rgba values from the color
+ // represented by this object.
+ var t = this;
+ return [t.r, t.g, t.b, t.a]; // Array
+ },
+ toHex: function(){
+ // summary:
+ // Returns a CSS color string in hexadecimal representation
+ // example:
+ // | console.log(new dojo.Color([0,0,0]).toHex()); // #000000
+ var arr = ArrayUtil.map(["r", "g", "b"], function(x){
+ var s = this[x].toString(16);
+ return s.length < 2 ? "0" + s : s;
+ }, this);
+ return "#" + arr.join(""); // String
+ },
+ toCss: function(/*Boolean?*/ includeAlpha){
+ // summary:
+ // Returns a css color string in rgb(a) representation
+ // example:
+ // | var c = new dojo.Color("#FFF").toCss();
+ // | console.log(c); // rgb('255','255','255')
+ var t = this, rgb = t.r + ", " + t.g + ", " + t.b;
+ return (includeAlpha ? "rgba(" + rgb + ", " + t.a : "rgb(" + rgb) + ")"; // String
+ },
+ toString: function(){
+ // summary:
+ // Returns a visual representation of the color
+ return this.toCss(true); // String
+ }
+ });
+
+ Color.blendColors = dojo.blendColors = function(
+ /*dojo.Color*/ start,
+ /*dojo.Color*/ end,
+ /*Number*/ weight,
+ /*dojo.Color?*/ obj
+ ){
+ // summary:
+ // Blend colors end and start with weight from 0 to 1, 0.5 being a 50/50 blend,
+ // can reuse a previously allocated dojo.Color object for the result
+ var t = obj || new Color();
+ ArrayUtil.forEach(["r", "g", "b", "a"], function(x){
+ t[x] = start[x] + (end[x] - start[x]) * weight;
+ if(x != "a"){ t[x] = Math.round(t[x]); }
+ });
+ return t.sanitize(); // dojo.Color
+ };
+
+ Color.fromRgb = dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){
+ // summary:
+ // Returns a `dojo.Color` instance from a string of the form
+ // "rgb(...)" or "rgba(...)". Optionally accepts a `dojo.Color`
+ // object to update with the parsed value and return instead of
+ // creating a new object.
+ // returns:
+ // A dojo.Color object. If obj is passed, it will be the return value.
+ var m = color.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);
+ return m && Color.fromArray(m[1].split(/\s*,\s*/), obj); // dojo.Color
+ };
+
+ Color.fromHex = dojo.colorFromHex = function(/*String*/ color, /*dojo.Color?*/ obj){
+ // summary:
+ // Converts a hex string with a '#' prefix to a color object.
+ // Supports 12-bit #rgb shorthand. Optionally accepts a
+ // `dojo.Color` object to update with the parsed value.
+ //
+ // returns:
+ // A dojo.Color object. If obj is passed, it will be the return value.
+ //
+ // example:
+ // | var thing = dojo.colorFromHex("#ededed"); // grey, longhand
+ //
+ // example:
+ // | var thing = dojo.colorFromHex("#000"); // black, shorthand
+ var t = obj || new Color(),
+ bits = (color.length == 4) ? 4 : 8,
+ mask = (1 << bits) - 1;
+ color = Number("0x" + color.substr(1));
+ if(isNaN(color)){
+ return null; // dojo.Color
+ }
+ ArrayUtil.forEach(["b", "g", "r"], function(x){
+ var c = color & mask;
+ color >>= bits;
+ t[x] = bits == 4 ? 17 * c : c;
+ });
+ t.a = 1;
+ return t; // dojo.Color
+ };
+
+ Color.fromArray = dojo.colorFromArray = function(/*Array*/ a, /*dojo.Color?*/ obj){
+ // summary:
+ // Builds a `dojo.Color` from a 3 or 4 element array, mapping each
+ // element in sequence to the rgb(a) values of the color.
+ // example:
+ // | var myColor = dojo.colorFromArray([237,237,237,0.5]); // grey, 50% alpha
+ // returns:
+ // A dojo.Color object. If obj is passed, it will be the return value.
+ var t = obj || new Color();
+ t._set(Number(a[0]), Number(a[1]), Number(a[2]), Number(a[3]));
+ if(isNaN(t.a)){ t.a = 1; }
+ return t.sanitize(); // dojo.Color
+ };
+
+ Color.fromString = dojo.colorFromString = function(/*String*/ str, /*dojo.Color?*/ obj){
+ // summary:
+ // Parses `str` for a color value. Accepts hex, rgb, and rgba
+ // style color values.
+ // description:
+ // Acceptable input values for str may include arrays of any form
+ // accepted by dojo.colorFromArray, hex strings such as "#aaaaaa", or
+ // rgb or rgba strings such as "rgb(133, 200, 16)" or "rgba(10, 10,
+ // 10, 50)"
+ // returns:
+ // A dojo.Color object. If obj is passed, it will be the return value.
+ var a = Color.named[str];
+ return a && Color.fromArray(a, obj) || Color.fromRgb(str, obj) || Color.fromHex(str, obj); // dojo.Color
+ };
+
+ return Color;
+});
diff --git a/lib/dojo/_base/Deferred.js b/lib/dojo/_base/Deferred.js
index c5992c966..13609f687 100644
--- a/lib/dojo/_base/Deferred.js
+++ b/lib/dojo/_base/Deferred.js
@@ -4,343 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.Deferred"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.Deferred"] = true;
-dojo.provide("dojo._base.Deferred");
-dojo.require("dojo._base.lang");
-
-
-(function(){
- var mutator = function(){};
- var freeze = Object.freeze || function(){};
- // A deferred provides an API for creating and resolving a promise.
- dojo.Deferred = function(/*Function?*/canceller){
- // summary:
- // Deferreds provide a generic means for encapsulating an asynchronous
- // operation and notifying users of the completion and result of the operation.
- // description:
- // The dojo.Deferred API is based on the concept of promises that provide a
- // generic interface into the eventual completion of an asynchronous action.
- // The motivation for promises fundamentally is about creating a
- // separation of concerns that allows one to achieve the same type of
- // call patterns and logical data flow in asynchronous code as can be
- // achieved in synchronous code. Promises allows one
- // to be able to call a function purely with arguments needed for
- // execution, without conflating the call with concerns of whether it is
- // sync or async. One shouldn't need to alter a call's arguments if the
- // implementation switches from sync to async (or vice versa). By having
- // async functions return promises, the concerns of making the call are
- // separated from the concerns of asynchronous interaction (which are
- // handled by the promise).
- //
- // The dojo.Deferred is a type of promise that provides methods for fulfilling the
- // promise with a successful result or an error. The most important method for
- // working with Dojo's promises is the then() method, which follows the
- // CommonJS proposed promise API. An example of using a Dojo promise:
- //
- // | var resultingPromise = someAsyncOperation.then(function(result){
- // | ... handle result ...
- // | },
- // | function(error){
- // | ... handle error ...
- // | });
- //
- // The .then() call returns a new promise that represents the result of the
- // execution of the callback. The callbacks will never affect the original promises value.
- //
- // The dojo.Deferred instances also provide the following functions for backwards compatibility:
- //
- // * addCallback(handler)
- // * addErrback(handler)
- // * callback(result)
- // * errback(result)
- //
- // Callbacks are allowed to return promises themselves, so
- // you can build complicated sequences of events with ease.
- //
- // The creator of the Deferred may specify a canceller. The canceller
- // is a function that will be called if Deferred.cancel is called
- // before the Deferred fires. You can use this to implement clean
- // aborting of an XMLHttpRequest, etc. Note that cancel will fire the
- // deferred with a CancelledError (unless your canceller returns
- // another kind of error), so the errbacks should be prepared to
- // handle that error for cancellable Deferreds.
- // example:
- // | var deferred = new dojo.Deferred();
- // | setTimeout(function(){ deferred.callback({success: true}); }, 1000);
- // | return deferred;
- // example:
- // Deferred objects are often used when making code asynchronous. It
- // may be easiest to write functions in a synchronous manner and then
- // split code using a deferred to trigger a response to a long-lived
- // operation. For example, instead of register a callback function to
- // denote when a rendering operation completes, the function can
- // simply return a deferred:
- //
- // | // callback style:
- // | function renderLotsOfData(data, callback){
- // | var success = false
- // | try{
- // | for(var x in data){
- // | renderDataitem(data[x]);
- // | }
- // | success = true;
- // | }catch(e){ }
- // | if(callback){
- // | callback(success);
- // | }
- // | }
- //
- // | // using callback style
- // | renderLotsOfData(someDataObj, function(success){
- // | // handles success or failure
- // | if(!success){
- // | promptUserToRecover();
- // | }
- // | });
- // | // NOTE: no way to add another callback here!!
- // example:
- // Using a Deferred doesn't simplify the sending code any, but it
- // provides a standard interface for callers and senders alike,
- // providing both with a simple way to service multiple callbacks for
- // an operation and freeing both sides from worrying about details
- // such as "did this get called already?". With Deferreds, new
- // callbacks can be added at any time.
- //
- // | // Deferred style:
- // | function renderLotsOfData(data){
- // | var d = new dojo.Deferred();
- // | try{
- // | for(var x in data){
- // | renderDataitem(data[x]);
- // | }
- // | d.callback(true);
- // | }catch(e){
- // | d.errback(new Error("rendering failed"));
- // | }
- // | return d;
- // | }
- //
- // | // using Deferred style
- // | renderLotsOfData(someDataObj).then(null, function(){
- // | promptUserToRecover();
- // | });
- // | // NOTE: addErrback and addCallback both return the Deferred
- // | // again, so we could chain adding callbacks or save the
- // | // deferred for later should we need to be notified again.
- // example:
- // In this example, renderLotsOfData is synchronous and so both
- // versions are pretty artificial. Putting the data display on a
- // timeout helps show why Deferreds rock:
- //
- // | // Deferred style and async func
- // | function renderLotsOfData(data){
- // | var d = new dojo.Deferred();
- // | setTimeout(function(){
- // | try{
- // | for(var x in data){
- // | renderDataitem(data[x]);
- // | }
- // | d.callback(true);
- // | }catch(e){
- // | d.errback(new Error("rendering failed"));
- // | }
- // | }, 100);
- // | return d;
- // | }
- //
- // | // using Deferred style
- // | renderLotsOfData(someDataObj).then(null, function(){
- // | promptUserToRecover();
- // | });
- //
- // Note that the caller doesn't have to change his code at all to
- // handle the asynchronous case.
- var result, finished, isError, head, nextListener;
- var promise = (this.promise = {});
-
- function complete(value){
- if(finished){
- throw new Error("This deferred has already been resolved");
- }
- result = value;
- finished = true;
- notify();
- }
- function notify(){
- var mutated;
- while(!mutated && nextListener){
- var listener = nextListener;
- nextListener = nextListener.next;
- if((mutated = (listener.progress == mutator))){ // assignment and check
- finished = false;
- }
- var func = (isError ? listener.error : listener.resolved);
- if (func) {
- try {
- var newResult = func(result);
- if (newResult && typeof newResult.then === "function") {
- newResult.then(dojo.hitch(listener.deferred, "resolve"), dojo.hitch(listener.deferred, "reject"));
- continue;
- }
- var unchanged = mutated && newResult === undefined;
- if(mutated && !unchanged){
- isError = newResult instanceof Error;
- }
- listener.deferred[unchanged && isError ? "reject" : "resolve"](unchanged ? result : newResult);
- }
- catch (e) {
- listener.deferred.reject(e);
- }
- }else {
- if(isError){
- listener.deferred.reject(result);
- }else{
- listener.deferred.resolve(result);
- }
- }
- }
- }
- // calling resolve will resolve the promise
- this.resolve = this.callback = function(value){
- // summary:
- // Fulfills the Deferred instance successfully with the provide value
- this.fired = 0;
- this.results = [value, null];
- complete(value);
- };
-
-
- // calling error will indicate that the promise failed
- this.reject = this.errback = function(error){
- // summary:
- // Fulfills the Deferred instance as an error with the provided error
- isError = true;
- this.fired = 1;
- complete(error);
- this.results = [null, error];
- if(!error || error.log !== false){
- (dojo.config.deferredOnError || function(x){ console.error(x); })(error);
- }
- };
- // call progress to provide updates on the progress on the completion of the promise
- this.progress = function(update){
- // summary
- // Send progress events to all listeners
- var listener = nextListener;
- while(listener){
- var progress = listener.progress;
- progress && progress(update);
- listener = listener.next;
- }
- };
- this.addCallbacks = function(/*Function?*/callback, /*Function?*/errback){
- this.then(callback, errback, mutator);
- return this;
- };
- // provide the implementation of the promise
- this.then = promise.then = function(/*Function?*/resolvedCallback, /*Function?*/errorCallback, /*Function?*/progressCallback){
- // summary:
- // Adds a fulfilledHandler, errorHandler, and progressHandler to be called for
- // completion of a promise. The fulfilledHandler is called when the promise
- // is fulfilled. The errorHandler is called when a promise fails. The
- // progressHandler is called for progress events. All arguments are optional
- // and non-function values are ignored. The progressHandler is not only an
- // optional argument, but progress events are purely optional. Promise
- // providers are not required to ever create progress events.
- //
- // This function will return a new promise that is fulfilled when the given
- // fulfilledHandler or errorHandler callback is finished. This allows promise
- // operations to be chained together. The value returned from the callback
- // handler is the fulfillment value for the returned promise. If the callback
- // throws an error, the returned promise will be moved to failed state.
- //
- // example:
- // An example of using a CommonJS compliant promise:
- // | asyncComputeTheAnswerToEverything().
- // | then(addTwo).
- // | then(printResult, onError);
- // | >44
- //
- var returnDeferred = progressCallback == mutator ? this : new dojo.Deferred(promise.cancel);
- var listener = {
- resolved: resolvedCallback,
- error: errorCallback,
- progress: progressCallback,
- deferred: returnDeferred
- };
- if(nextListener){
- head = head.next = listener;
- }
- else{
- nextListener = head = listener;
- }
- if(finished){
- notify();
- }
- return returnDeferred.promise;
- };
- var deferred = this;
- this.cancel = promise.cancel = function () {
- // summary:
- // Cancels the asynchronous operation
- if(!finished){
- var error = canceller && canceller(deferred);
- if(!finished){
- if (!(error instanceof Error)) {
- error = new Error(error);
- }
- error.log = false;
- deferred.reject(error);
- }
- }
- };
- freeze(promise);
- };
- dojo.extend(dojo.Deferred, {
- addCallback: function (/*Function*/callback) {
- return this.addCallbacks(dojo.hitch.apply(dojo, arguments));
- },
-
- addErrback: function (/*Function*/errback) {
- return this.addCallbacks(null, dojo.hitch.apply(dojo, arguments));
- },
-
- addBoth: function (/*Function*/callback) {
- var enclosed = dojo.hitch.apply(dojo, arguments);
- return this.addCallbacks(enclosed, enclosed);
- },
- fired: -1
- });
-})();
-dojo.when = function(promiseOrValue, /*Function?*/callback, /*Function?*/errback, /*Function?*/progressHandler){
- // summary:
- // This provides normalization between normal synchronous values and
- // asynchronous promises, so you can interact with them in a common way
- // example:
- // | function printFirstAndList(items){
- // | dojo.when(findFirst(items), console.log);
- // | dojo.when(findLast(items), console.log);
- // | }
- // | function findFirst(items){
- // | return dojo.when(items, function(items){
- // | return items[0];
- // | });
- // | }
- // | function findLast(items){
- // | return dojo.when(items, function(items){
- // | return items[items.length];
- // | });
- // | }
- // And now all three of his functions can be used sync or async.
- // | printFirstAndLast([1,2,3,4]) will work just as well as
- // | printFirstAndLast(dojo.xhrGet(...));
-
- if(promiseOrValue && typeof promiseOrValue.then === "function"){
- return promiseOrValue.then(callback, errback, progressHandler);
- }
- return callback(promiseOrValue);
-};
-
-}
+//>>built
+define("dojo/_base/Deferred",["./kernel","./lang"],function(_1,_2){var _3=function(){};var _4=Object.freeze||function(){};_1.Deferred=function(_5){var _6,_7,_8,_9,_a;var _b=(this.promise={});function _c(_d){if(_7){throw new Error("This deferred has already been resolved");}_6=_d;_7=true;_e();};function _e(){var _f;while(!_f&&_a){var _10=_a;_a=_a.next;if((_f=(_10.progress==_3))){_7=false;}var _11=(_8?_10.error:_10.resolved);if(_11){try{var _12=_11(_6);if(_12&&typeof _12.then==="function"){_12.then(_2.hitch(_10.deferred,"resolve"),_2.hitch(_10.deferred,"reject"),_2.hitch(_10.deferred,"progress"));continue;}var _13=_f&&_12===undefined;if(_f&&!_13){_8=_12 instanceof Error;}_10.deferred[_13&&_8?"reject":"resolve"](_13?_6:_12);}catch(e){_10.deferred.reject(e);}}else{if(_8){_10.deferred.reject(_6);}else{_10.deferred.resolve(_6);}}}};this.resolve=this.callback=function(_14){this.fired=0;this.results=[_14,null];_c(_14);};this.reject=this.errback=function(_15){_8=true;this.fired=1;_c(_15);this.results=[null,_15];if(!_15||_15.log!==false){(_1.config.deferredOnError||function(x){console.error(x);})(_15);}};this.progress=function(_16){var _17=_a;while(_17){var _18=_17.progress;_18&&_18(_16);_17=_17.next;}};this.addCallbacks=function(_19,_1a){this.then(_19,_1a,_3);return this;};_b.then=this.then=function(_1b,_1c,_1d){var _1e=_1d==_3?this:new _1.Deferred(_b.cancel);var _1f={resolved:_1b,error:_1c,progress:_1d,deferred:_1e};if(_a){_9=_9.next=_1f;}else{_a=_9=_1f;}if(_7){_e();}return _1e.promise;};var _20=this;_b.cancel=this.cancel=function(){if(!_7){var _21=_5&&_5(_20);if(!_7){if(!(_21 instanceof Error)){_21=new Error(_21);}_21.log=false;_20.reject(_21);}}};_4(_b);};_2.extend(_1.Deferred,{addCallback:function(_22){return this.addCallbacks(_2.hitch.apply(_1,arguments));},addErrback:function(_23){return this.addCallbacks(null,_2.hitch.apply(_1,arguments));},addBoth:function(_24){var _25=_2.hitch.apply(_1,arguments);return this.addCallbacks(_25,_25);},fired:-1});_1.Deferred.when=_1.when=function(_26,_27,_28,_29){if(_26&&typeof _26.then==="function"){return _26.then(_27,_28,_29);}return _27?_27(_26):_26;};return _1.Deferred;}); \ No newline at end of file
diff --git a/lib/dojo/_base/Deferred.js.uncompressed.js b/lib/dojo/_base/Deferred.js.uncompressed.js
new file mode 100644
index 000000000..6dc39e96c
--- /dev/null
+++ b/lib/dojo/_base/Deferred.js.uncompressed.js
@@ -0,0 +1,366 @@
+define("dojo/_base/Deferred", ["./kernel", "./lang"], function(dojo, lang){
+ // module:
+ // dojo/_base/Deferred
+ // summary:
+ // This module defines dojo.Deferred.
+
+ var mutator = function(){};
+ var freeze = Object.freeze || function(){};
+ // A deferred provides an API for creating and resolving a promise.
+ dojo.Deferred = function(/*Function?*/ canceller){
+ // summary:
+ // Deferreds provide a generic means for encapsulating an asynchronous
+ // operation and notifying users of the completion and result of the operation.
+ // description:
+ // The dojo.Deferred API is based on the concept of promises that provide a
+ // generic interface into the eventual completion of an asynchronous action.
+ // The motivation for promises fundamentally is about creating a
+ // separation of concerns that allows one to achieve the same type of
+ // call patterns and logical data flow in asynchronous code as can be
+ // achieved in synchronous code. Promises allows one
+ // to be able to call a function purely with arguments needed for
+ // execution, without conflating the call with concerns of whether it is
+ // sync or async. One shouldn't need to alter a call's arguments if the
+ // implementation switches from sync to async (or vice versa). By having
+ // async functions return promises, the concerns of making the call are
+ // separated from the concerns of asynchronous interaction (which are
+ // handled by the promise).
+ //
+ // The dojo.Deferred is a type of promise that provides methods for fulfilling the
+ // promise with a successful result or an error. The most important method for
+ // working with Dojo's promises is the then() method, which follows the
+ // CommonJS proposed promise API. An example of using a Dojo promise:
+ //
+ // | var resultingPromise = someAsyncOperation.then(function(result){
+ // | ... handle result ...
+ // | },
+ // | function(error){
+ // | ... handle error ...
+ // | });
+ //
+ // The .then() call returns a new promise that represents the result of the
+ // execution of the callback. The callbacks will never affect the original promises value.
+ //
+ // The dojo.Deferred instances also provide the following functions for backwards compatibility:
+ //
+ // * addCallback(handler)
+ // * addErrback(handler)
+ // * callback(result)
+ // * errback(result)
+ //
+ // Callbacks are allowed to return promises themselves, so
+ // you can build complicated sequences of events with ease.
+ //
+ // The creator of the Deferred may specify a canceller. The canceller
+ // is a function that will be called if Deferred.cancel is called
+ // before the Deferred fires. You can use this to implement clean
+ // aborting of an XMLHttpRequest, etc. Note that cancel will fire the
+ // deferred with a CancelledError (unless your canceller returns
+ // another kind of error), so the errbacks should be prepared to
+ // handle that error for cancellable Deferreds.
+ // example:
+ // | var deferred = new dojo.Deferred();
+ // | setTimeout(function(){ deferred.callback({success: true}); }, 1000);
+ // | return deferred;
+ // example:
+ // Deferred objects are often used when making code asynchronous. It
+ // may be easiest to write functions in a synchronous manner and then
+ // split code using a deferred to trigger a response to a long-lived
+ // operation. For example, instead of register a callback function to
+ // denote when a rendering operation completes, the function can
+ // simply return a deferred:
+ //
+ // | // callback style:
+ // | function renderLotsOfData(data, callback){
+ // | var success = false
+ // | try{
+ // | for(var x in data){
+ // | renderDataitem(data[x]);
+ // | }
+ // | success = true;
+ // | }catch(e){ }
+ // | if(callback){
+ // | callback(success);
+ // | }
+ // | }
+ //
+ // | // using callback style
+ // | renderLotsOfData(someDataObj, function(success){
+ // | // handles success or failure
+ // | if(!success){
+ // | promptUserToRecover();
+ // | }
+ // | });
+ // | // NOTE: no way to add another callback here!!
+ // example:
+ // Using a Deferred doesn't simplify the sending code any, but it
+ // provides a standard interface for callers and senders alike,
+ // providing both with a simple way to service multiple callbacks for
+ // an operation and freeing both sides from worrying about details
+ // such as "did this get called already?". With Deferreds, new
+ // callbacks can be added at any time.
+ //
+ // | // Deferred style:
+ // | function renderLotsOfData(data){
+ // | var d = new dojo.Deferred();
+ // | try{
+ // | for(var x in data){
+ // | renderDataitem(data[x]);
+ // | }
+ // | d.callback(true);
+ // | }catch(e){
+ // | d.errback(new Error("rendering failed"));
+ // | }
+ // | return d;
+ // | }
+ //
+ // | // using Deferred style
+ // | renderLotsOfData(someDataObj).then(null, function(){
+ // | promptUserToRecover();
+ // | });
+ // | // NOTE: addErrback and addCallback both return the Deferred
+ // | // again, so we could chain adding callbacks or save the
+ // | // deferred for later should we need to be notified again.
+ // example:
+ // In this example, renderLotsOfData is synchronous and so both
+ // versions are pretty artificial. Putting the data display on a
+ // timeout helps show why Deferreds rock:
+ //
+ // | // Deferred style and async func
+ // | function renderLotsOfData(data){
+ // | var d = new dojo.Deferred();
+ // | setTimeout(function(){
+ // | try{
+ // | for(var x in data){
+ // | renderDataitem(data[x]);
+ // | }
+ // | d.callback(true);
+ // | }catch(e){
+ // | d.errback(new Error("rendering failed"));
+ // | }
+ // | }, 100);
+ // | return d;
+ // | }
+ //
+ // | // using Deferred style
+ // | renderLotsOfData(someDataObj).then(null, function(){
+ // | promptUserToRecover();
+ // | });
+ //
+ // Note that the caller doesn't have to change his code at all to
+ // handle the asynchronous case.
+
+ var result, finished, isError, head, nextListener;
+ var promise = (this.promise = {});
+
+ function complete(value){
+ if(finished){
+ throw new Error("This deferred has already been resolved");
+ }
+ result = value;
+ finished = true;
+ notify();
+ }
+ function notify(){
+ var mutated;
+ while(!mutated && nextListener){
+ var listener = nextListener;
+ nextListener = nextListener.next;
+ if((mutated = (listener.progress == mutator))){ // assignment and check
+ finished = false;
+ }
+ var func = (isError ? listener.error : listener.resolved);
+ if(func){
+ try{
+ var newResult = func(result);
+ if (newResult && typeof newResult.then === "function"){
+ newResult.then(lang.hitch(listener.deferred, "resolve"), lang.hitch(listener.deferred, "reject"), lang.hitch(listener.deferred, "progress"));
+ continue;
+ }
+ var unchanged = mutated && newResult === undefined;
+ if(mutated && !unchanged){
+ isError = newResult instanceof Error;
+ }
+ listener.deferred[unchanged && isError ? "reject" : "resolve"](unchanged ? result : newResult);
+ }catch(e){
+ listener.deferred.reject(e);
+ }
+ }else{
+ if(isError){
+ listener.deferred.reject(result);
+ }else{
+ listener.deferred.resolve(result);
+ }
+ }
+ }
+ }
+ // calling resolve will resolve the promise
+ this.resolve = this.callback = function(value){
+ // summary:
+ // Fulfills the Deferred instance successfully with the provide value
+ this.fired = 0;
+ this.results = [value, null];
+ complete(value);
+ };
+
+
+ // calling error will indicate that the promise failed
+ this.reject = this.errback = function(error){
+ // summary:
+ // Fulfills the Deferred instance as an error with the provided error
+ isError = true;
+ this.fired = 1;
+ complete(error);
+ this.results = [null, error];
+ if(!error || error.log !== false){
+ (dojo.config.deferredOnError || function(x){ console.error(x); })(error);
+ }
+ };
+ // call progress to provide updates on the progress on the completion of the promise
+ this.progress = function(update){
+ // summary:
+ // Send progress events to all listeners
+ var listener = nextListener;
+ while(listener){
+ var progress = listener.progress;
+ progress && progress(update);
+ listener = listener.next;
+ }
+ };
+ this.addCallbacks = function(callback, errback){
+ // summary:
+ // Adds callback and error callback for this deferred instance.
+ // callback: Function?
+ // The callback attached to this deferred object.
+ // errback: Function?
+ // The error callback attached to this deferred object.
+ // returns:
+ // Returns this deferred object.
+ this.then(callback, errback, mutator);
+ return this; // dojo.Deferred
+ };
+ // provide the implementation of the promise
+ promise.then = this.then = function(/*Function?*/resolvedCallback, /*Function?*/errorCallback, /*Function?*/progressCallback){
+ // summary:
+ // Adds a fulfilledHandler, errorHandler, and progressHandler to be called for
+ // completion of a promise. The fulfilledHandler is called when the promise
+ // is fulfilled. The errorHandler is called when a promise fails. The
+ // progressHandler is called for progress events. All arguments are optional
+ // and non-function values are ignored. The progressHandler is not only an
+ // optional argument, but progress events are purely optional. Promise
+ // providers are not required to ever create progress events.
+ //
+ // This function will return a new promise that is fulfilled when the given
+ // fulfilledHandler or errorHandler callback is finished. This allows promise
+ // operations to be chained together. The value returned from the callback
+ // handler is the fulfillment value for the returned promise. If the callback
+ // throws an error, the returned promise will be moved to failed state.
+ //
+ // returns:
+ // Returns a new promise that represents the result of the
+ // execution of the callback. The callbacks will never affect the original promises value.
+ // example:
+ // An example of using a CommonJS compliant promise:
+ // | asyncComputeTheAnswerToEverything().
+ // | then(addTwo).
+ // | then(printResult, onError);
+ // | >44
+ //
+ var returnDeferred = progressCallback == mutator ? this : new dojo.Deferred(promise.cancel);
+ var listener = {
+ resolved: resolvedCallback,
+ error: errorCallback,
+ progress: progressCallback,
+ deferred: returnDeferred
+ };
+ if(nextListener){
+ head = head.next = listener;
+ }
+ else{
+ nextListener = head = listener;
+ }
+ if(finished){
+ notify();
+ }
+ return returnDeferred.promise; // Promise
+ };
+ var deferred = this;
+ promise.cancel = this.cancel = function (){
+ // summary:
+ // Cancels the asynchronous operation
+ if(!finished){
+ var error = canceller && canceller(deferred);
+ if(!finished){
+ if (!(error instanceof Error)){
+ error = new Error(error);
+ }
+ error.log = false;
+ deferred.reject(error);
+ }
+ }
+ };
+ freeze(promise);
+ };
+ lang.extend(dojo.Deferred, {
+ addCallback: function (/*Function*/ callback){
+ // summary:
+ // Adds successful callback for this deferred instance.
+ // returns:
+ // Returns this deferred object.
+ return this.addCallbacks(lang.hitch.apply(dojo, arguments)); // dojo.Deferred
+ },
+
+ addErrback: function (/*Function*/ errback){
+ // summary:
+ // Adds error callback for this deferred instance.
+ // returns:
+ // Returns this deferred object.
+ return this.addCallbacks(null, lang.hitch.apply(dojo, arguments)); // dojo.Deferred
+ },
+
+ addBoth: function (/*Function*/ callback){
+ // summary:
+ // Add handler as both successful callback and error callback for this deferred instance.
+ // returns:
+ // Returns this deferred object.
+ var enclosed = lang.hitch.apply(dojo, arguments);
+ return this.addCallbacks(enclosed, enclosed); // dojo.Deferred
+ },
+ fired: -1
+ });
+
+ dojo.Deferred.when = dojo.when = function(promiseOrValue, /*Function?*/ callback, /*Function?*/ errback, /*Function?*/ progressHandler){
+ // summary:
+ // This provides normalization between normal synchronous values and
+ // asynchronous promises, so you can interact with them in a common way
+ // returns:
+ // Returns a new promise that represents the result of the execution of callback
+ // when parameter "promiseOrValue" is promise.
+ // Returns the execution result of callback when parameter "promiseOrValue" is value.
+ // example:
+ // | function printFirstAndLast(items){
+ // | dojo.when(findFirst(items), console.log);
+ // | dojo.when(findLast(items), console.log);
+ // | }
+ // | function findFirst(items){
+ // | return dojo.when(items, function(items){
+ // | return items[0];
+ // | });
+ // | }
+ // | function findLast(items){
+ // | return dojo.when(items, function(items){
+ // | return items[items.length - 1];
+ // | });
+ // | }
+ // And now all three of his functions can be used sync or async.
+ // | printFirstAndLast([1,2,3,4]) will work just as well as
+ // | printFirstAndLast(dojo.xhrGet(...));
+
+ if(promiseOrValue && typeof promiseOrValue.then === "function"){
+ return promiseOrValue.then(callback, errback, progressHandler);
+ }
+ return callback ? callback(promiseOrValue) : promiseOrValue; // Promise
+ };
+
+ return dojo.Deferred;
+});
diff --git a/lib/dojo/_base/NodeList.js b/lib/dojo/_base/NodeList.js
index 8cdc1c0f7..4fa6b48a0 100644
--- a/lib/dojo/_base/NodeList.js
+++ b/lib/dojo/_base/NodeList.js
@@ -4,1010 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.NodeList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.NodeList"] = true;
-dojo.provide("dojo._base.NodeList");
-dojo.require("dojo._base.lang");
-dojo.require("dojo._base.array");
-dojo.require("dojo._base.connect");
-dojo.require("dojo._base.html");
-
-
-(function(){
-
- var d = dojo;
-
- var ap = Array.prototype, aps = ap.slice, apc = ap.concat;
-
- var tnl = function(/*Array*/ a, /*dojo.NodeList?*/ parent, /*Function?*/ NodeListCtor){
- // summary:
- // decorate an array to make it look like a `dojo.NodeList`.
- // a:
- // Array of nodes to decorate.
- // parent:
- // An optional parent NodeList that generated the current
- // list of nodes. Used to call _stash() so the parent NodeList
- // can be accessed via end() later.
- // NodeListCtor:
- // An optional constructor function to use for any
- // new NodeList calls. This allows a certain chain of
- // NodeList calls to use a different object than dojo.NodeList.
- if(!a.sort){
- // make sure it's a real array before we pass it on to be wrapped
- a = aps.call(a, 0);
- }
- var ctor = NodeListCtor || this._NodeListCtor || d._NodeListCtor;
- a.constructor = ctor;
- dojo._mixin(a, ctor.prototype);
- a._NodeListCtor = ctor;
- return parent ? a._stash(parent) : a;
- };
-
- var loopBody = function(f, a, o){
- a = [0].concat(aps.call(a, 0));
- o = o || d.global;
- return function(node){
- a[0] = node;
- return f.apply(o, a);
- };
- };
-
- // adapters
-
- var adaptAsForEach = function(f, o){
- // summary:
- // adapts a single node function to be used in the forEach-type
- // actions. The initial object is returned from the specialized
- // function.
- // f: Function
- // a function to adapt
- // o: Object?
- // an optional context for f
- return function(){
- this.forEach(loopBody(f, arguments, o));
- return this; // Object
- };
- };
-
- var adaptAsMap = function(f, o){
- // summary:
- // adapts a single node function to be used in the map-type
- // actions. The return is a new array of values, as via `dojo.map`
- // f: Function
- // a function to adapt
- // o: Object?
- // an optional context for f
- return function(){
- return this.map(loopBody(f, arguments, o));
- };
- };
-
- var adaptAsFilter = function(f, o){
- // summary:
- // adapts a single node function to be used in the filter-type actions
- // f: Function
- // a function to adapt
- // o: Object?
- // an optional context for f
- return function(){
- return this.filter(loopBody(f, arguments, o));
- };
- };
-
- var adaptWithCondition = function(f, g, o){
- // summary:
- // adapts a single node function to be used in the map-type
- // actions, behaves like forEach() or map() depending on arguments
- // f: Function
- // a function to adapt
- // g: Function
- // a condition function, if true runs as map(), otherwise runs as forEach()
- // o: Object?
- // an optional context for f and g
- return function(){
- var a = arguments, body = loopBody(f, a, o);
- if(g.call(o || d.global, a)){
- return this.map(body); // self
- }
- this.forEach(body);
- return this; // self
- };
- };
-
- var magicGuard = function(a){
- // summary:
- // the guard function for dojo.attr() and dojo.style()
- return a.length == 1 && (typeof a[0] == "string"); // inline'd type check
- };
-
- var orphan = function(node){
- // summary:
- // function to orphan nodes
- var p = node.parentNode;
- if(p){
- p.removeChild(node);
- }
- };
- // FIXME: should we move orphan() to dojo.html?
-
- dojo.NodeList = function(){
- // summary:
- // dojo.NodeList is an of Array subclass which adds syntactic
- // sugar for chaining, common iteration operations, animation, and
- // node manipulation. NodeLists are most often returned as the
- // result of dojo.query() calls.
- // description:
- // dojo.NodeList instances provide many utilities that reflect
- // core Dojo APIs for Array iteration and manipulation, DOM
- // manipulation, and event handling. Instead of needing to dig up
- // functions in the dojo.* namespace, NodeLists generally make the
- // full power of Dojo available for DOM manipulation tasks in a
- // simple, chainable way.
- // example:
- // create a node list from a node
- // | new dojo.NodeList(dojo.byId("foo"));
- // example:
- // get a NodeList from a CSS query and iterate on it
- // | var l = dojo.query(".thinger");
- // | l.forEach(function(node, index, nodeList){
- // | console.log(index, node.innerHTML);
- // | });
- // example:
- // use native and Dojo-provided array methods to manipulate a
- // NodeList without needing to use dojo.* functions explicitly:
- // | var l = dojo.query(".thinger");
- // | // since NodeLists are real arrays, they have a length
- // | // property that is both readable and writable and
- // | // push/pop/shift/unshift methods
- // | console.log(l.length);
- // | l.push(dojo.create("span"));
- // |
- // | // dojo's normalized array methods work too:
- // | console.log( l.indexOf(dojo.byId("foo")) );
- // | // ...including the special "function as string" shorthand
- // | console.log( l.every("item.nodeType == 1") );
- // |
- // | // NodeLists can be [..] indexed, or you can use the at()
- // | // function to get specific items wrapped in a new NodeList:
- // | var node = l[3]; // the 4th element
- // | var newList = l.at(1, 3); // the 2nd and 4th elements
- // example:
- // the style functions you expect are all there too:
- // | // style() as a getter...
- // | var borders = dojo.query(".thinger").style("border");
- // | // ...and as a setter:
- // | dojo.query(".thinger").style("border", "1px solid black");
- // | // class manipulation
- // | dojo.query("li:nth-child(even)").addClass("even");
- // | // even getting the coordinates of all the items
- // | var coords = dojo.query(".thinger").coords();
- // example:
- // DOM manipulation functions from the dojo.* namespace area also
- // available:
- // | // remove all of the elements in the list from their
- // | // parents (akin to "deleting" them from the document)
- // | dojo.query(".thinger").orphan();
- // | // place all elements in the list at the front of #foo
- // | dojo.query(".thinger").place("foo", "first");
- // example:
- // Event handling couldn't be easier. `dojo.connect` is mapped in,
- // and shortcut handlers are provided for most DOM events:
- // | // like dojo.connect(), but with implicit scope
- // | dojo.query("li").connect("onclick", console, "log");
- // |
- // | // many common event handlers are already available directly:
- // | dojo.query("li").onclick(console, "log");
- // | var toggleHovered = dojo.hitch(dojo, "toggleClass", "hovered");
- // | dojo.query("p")
- // | .onmouseenter(toggleHovered)
- // | .onmouseleave(toggleHovered);
- // example:
- // chainability is a key advantage of NodeLists:
- // | dojo.query(".thinger")
- // | .onclick(function(e){ /* ... */ })
- // | .at(1, 3, 8) // get a subset
- // | .style("padding", "5px")
- // | .forEach(console.log);
-
- return tnl(Array.apply(null, arguments));
- };
-
- //Allow things that new up a NodeList to use a delegated or alternate NodeList implementation.
- d._NodeListCtor = d.NodeList;
-
- var nl = d.NodeList, nlp = nl.prototype;
-
- // expose adapters and the wrapper as private functions
-
- nl._wrap = nlp._wrap = tnl;
- nl._adaptAsMap = adaptAsMap;
- nl._adaptAsForEach = adaptAsForEach;
- nl._adaptAsFilter = adaptAsFilter;
- nl._adaptWithCondition = adaptWithCondition;
-
- // mass assignment
-
- // add array redirectors
- d.forEach(["slice", "splice"], function(name){
- var f = ap[name];
- //Use a copy of the this array via this.slice() to allow .end() to work right in the splice case.
- // CANNOT apply ._stash()/end() to splice since it currently modifies
- // the existing this array -- it would break backward compatibility if we copy the array before
- // the splice so that we can use .end(). So only doing the stash option to this._wrap for slice.
- nlp[name] = function(){ return this._wrap(f.apply(this, arguments), name == "slice" ? this : null); };
- });
- // concat should be here but some browsers with native NodeList have problems with it
-
- // add array.js redirectors
- d.forEach(["indexOf", "lastIndexOf", "every", "some"], function(name){
- var f = d[name];
- nlp[name] = function(){ return f.apply(d, [this].concat(aps.call(arguments, 0))); };
- });
-
- // add conditional methods
- d.forEach(["attr", "style"], function(name){
- nlp[name] = adaptWithCondition(d[name], magicGuard);
- });
-
- // add forEach actions
- d.forEach(["connect", "addClass", "removeClass", "replaceClass", "toggleClass", "empty", "removeAttr"], function(name){
- nlp[name] = adaptAsForEach(d[name]);
- });
-
- dojo.extend(dojo.NodeList, {
- _normalize: function(/*String||Element||Object||NodeList*/content, /*DOMNode?*/refNode){
- // summary:
- // normalizes data to an array of items to insert.
- // description:
- // If content is an object, it can have special properties "template" and
- // "parse". If "template" is defined, then the template value is run through
- // dojo.string.substitute (if dojo.string.substitute has been dojo.required elsewhere),
- // or if templateFunc is a function on the content, that function will be used to
- // transform the template into a final string to be used for for passing to dojo._toDom.
- // If content.parse is true, then it is remembered for later, for when the content
- // nodes are inserted into the DOM. At that point, the nodes will be parsed for widgets
- // (if dojo.parser has been dojo.required elsewhere).
-
- //Wanted to just use a DocumentFragment, but for the array/NodeList
- //case that meant using cloneNode, but we may not want that.
- //Cloning should only happen if the node operations span
- //multiple refNodes. Also, need a real array, not a NodeList from the
- //DOM since the node movements could change those NodeLists.
-
- var parse = content.parse === true ? true : false;
-
- //Do we have an object that needs to be run through a template?
- if(typeof content.template == "string"){
- var templateFunc = content.templateFunc || (dojo.string && dojo.string.substitute);
- content = templateFunc ? templateFunc(content.template, content) : content;
- }
-
- var type = (typeof content);
- if(type == "string" || type == "number"){
- content = dojo._toDom(content, (refNode && refNode.ownerDocument));
- if(content.nodeType == 11){
- //DocumentFragment. It cannot handle cloneNode calls, so pull out the children.
- content = dojo._toArray(content.childNodes);
- }else{
- content = [content];
- }
- }else if(!dojo.isArrayLike(content)){
- content = [content];
- }else if(!dojo.isArray(content)){
- //To get to this point, content is array-like, but
- //not an array, which likely means a DOM NodeList. Convert it now.
- content = dojo._toArray(content);
- }
-
- //Pass around the parse info
- if(parse){
- content._runParse = true;
- }
- return content; //Array
- },
-
- _cloneNode: function(/*DOMNode*/ node){
- // summary:
- // private utility to clone a node. Not very interesting in the vanilla
- // dojo.NodeList case, but delegates could do interesting things like
- // clone event handlers if that is derivable from the node.
- return node.cloneNode(true);
- },
-
- _place: function(/*Array*/ary, /*DOMNode*/refNode, /*String*/position, /*Boolean*/useClone){
- // summary:
- // private utility to handle placing an array of nodes relative to another node.
- // description:
- // Allows for cloning the nodes in the array, and for
- // optionally parsing widgets, if ary._runParse is true.
-
- //Avoid a disallowed operation if trying to do an innerHTML on a non-element node.
- if(refNode.nodeType != 1 && position == "only"){
- return;
- }
- var rNode = refNode, tempNode;
-
- //Always cycle backwards in case the array is really a
- //DOM NodeList and the DOM operations take it out of the live collection.
- var length = ary.length;
- for(var i = length - 1; i >= 0; i--){
- var node = (useClone ? this._cloneNode(ary[i]) : ary[i]);
-
- //If need widget parsing, use a temp node, instead of waiting after inserting into
- //real DOM because we need to start widget parsing at one node up from current node,
- //which could cause some already parsed widgets to be parsed again.
- if(ary._runParse && dojo.parser && dojo.parser.parse){
- if(!tempNode){
- tempNode = rNode.ownerDocument.createElement("div");
- }
- tempNode.appendChild(node);
- dojo.parser.parse(tempNode);
- node = tempNode.firstChild;
- while(tempNode.firstChild){
- tempNode.removeChild(tempNode.firstChild);
- }
- }
-
- if(i == length - 1){
- dojo.place(node, rNode, position);
- }else{
- rNode.parentNode.insertBefore(node, rNode);
- }
- rNode = node;
- }
- },
-
- _stash: function(parent){
- // summary:
- // private function to hold to a parent NodeList. end() to return the parent NodeList.
- //
- // example:
- // How to make a `dojo.NodeList` method that only returns the third node in
- // the dojo.NodeList but allows access to the original NodeList by using this._stash:
- // | dojo.extend(dojo.NodeList, {
- // | third: function(){
- // | var newNodeList = dojo.NodeList(this[2]);
- // | return newNodeList._stash(this);
- // | }
- // | });
- // | // then see how _stash applies a sub-list, to be .end()'ed out of
- // | dojo.query(".foo")
- // | .third()
- // | .addClass("thirdFoo")
- // | .end()
- // | // access to the orig .foo list
- // | .removeClass("foo")
- // |
- //
- this._parent = parent;
- return this; //dojo.NodeList
- },
-
- end: function(){
- // summary:
- // Ends use of the current `dojo.NodeList` by returning the previous dojo.NodeList
- // that generated the current dojo.NodeList.
- // description:
- // Returns the `dojo.NodeList` that generated the current `dojo.NodeList`. If there
- // is no parent dojo.NodeList, an empty dojo.NodeList is returned.
- // example:
- // | dojo.query("a")
- // | .filter(".disabled")
- // | // operate on the anchors that only have a disabled class
- // | .style("color", "grey")
- // | .end()
- // | // jump back to the list of anchors
- // | .style(...)
- //
- if(this._parent){
- return this._parent;
- }else{
- //Just return empty list.
- return new this._NodeListCtor();
- }
- },
-
- // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Methods
-
- // FIXME: handle return values for #3244
- // http://trac.dojotoolkit.org/ticket/3244
-
- // FIXME:
- // need to wrap or implement:
- // join (perhaps w/ innerHTML/outerHTML overload for toString() of items?)
- // reduce
- // reduceRight
-
- /*=====
- slice: function(begin, end){
- // summary:
- // Returns a new NodeList, maintaining this one in place
- // description:
- // This method behaves exactly like the Array.slice method
- // with the caveat that it returns a dojo.NodeList and not a
- // raw Array. For more details, see Mozilla's (slice
- // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:slice]
- // begin: Integer
- // Can be a positive or negative integer, with positive
- // integers noting the offset to begin at, and negative
- // integers denoting an offset from the end (i.e., to the left
- // of the end)
- // end: Integer?
- // Optional parameter to describe what position relative to
- // the NodeList's zero index to end the slice at. Like begin,
- // can be positive or negative.
- return this._wrap(a.slice.apply(this, arguments));
- },
-
- splice: function(index, howmany, item){
- // summary:
- // Returns a new NodeList, manipulating this NodeList based on
- // the arguments passed, potentially splicing in new elements
- // at an offset, optionally deleting elements
- // description:
- // This method behaves exactly like the Array.splice method
- // with the caveat that it returns a dojo.NodeList and not a
- // raw Array. For more details, see Mozilla's (splice
- // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:splice]
- // For backwards compatibility, calling .end() on the spliced NodeList
- // does not return the original NodeList -- splice alters the NodeList in place.
- // index: Integer
- // begin can be a positive or negative integer, with positive
- // integers noting the offset to begin at, and negative
- // integers denoting an offset from the end (i.e., to the left
- // of the end)
- // howmany: Integer?
- // Optional parameter to describe what position relative to
- // the NodeList's zero index to end the slice at. Like begin,
- // can be positive or negative.
- // item: Object...?
- // Any number of optional parameters may be passed in to be
- // spliced into the NodeList
- // returns:
- // dojo.NodeList
- return this._wrap(a.splice.apply(this, arguments));
- },
-
- indexOf: function(value, fromIndex){
- // summary:
- // see dojo.indexOf(). The primary difference is that the acted-on
- // array is implicitly this NodeList
- // value: Object:
- // The value to search for.
- // fromIndex: Integer?:
- // The location to start searching from. Optional. Defaults to 0.
- // description:
- // For more details on the behavior of indexOf, see Mozilla's
- // (indexOf
- // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf]
- // returns:
- // Positive Integer or 0 for a match, -1 of not found.
- return d.indexOf(this, value, fromIndex); // Integer
- },
-
- lastIndexOf: function(value, fromIndex){
- // summary:
- // see dojo.lastIndexOf(). The primary difference is that the
- // acted-on array is implicitly this NodeList
- // description:
- // For more details on the behavior of lastIndexOf, see
- // Mozilla's (lastIndexOf
- // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:lastIndexOf]
- // value: Object
- // The value to search for.
- // fromIndex: Integer?
- // The location to start searching from. Optional. Defaults to 0.
- // returns:
- // Positive Integer or 0 for a match, -1 of not found.
- return d.lastIndexOf(this, value, fromIndex); // Integer
- },
-
- every: function(callback, thisObject){
- // summary:
- // see `dojo.every()` and the (Array.every
- // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every].
- // Takes the same structure of arguments and returns as
- // dojo.every() with the caveat that the passed array is
- // implicitly this NodeList
- // callback: Function: the callback
- // thisObject: Object?: the context
- return d.every(this, callback, thisObject); // Boolean
- },
-
- some: function(callback, thisObject){
- // summary:
- // Takes the same structure of arguments and returns as
- // `dojo.some()` with the caveat that the passed array is
- // implicitly this NodeList. See `dojo.some()` and Mozilla's
- // (Array.some
- // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some].
- // callback: Function: the callback
- // thisObject: Object?: the context
- return d.some(this, callback, thisObject); // Boolean
- },
- =====*/
-
- concat: function(item){
- // summary:
- // Returns a new NodeList comprised of items in this NodeList
- // as well as items passed in as parameters
- // description:
- // This method behaves exactly like the Array.concat method
- // with the caveat that it returns a `dojo.NodeList` and not a
- // raw Array. For more details, see the (Array.concat
- // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:concat]
- // item: Object?
- // Any number of optional parameters may be passed in to be
- // spliced into the NodeList
- // returns:
- // dojo.NodeList
-
- //return this._wrap(apc.apply(this, arguments));
- // the line above won't work for the native NodeList :-(
-
- // implementation notes:
- // 1) Native NodeList is not an array, and cannot be used directly
- // in concat() --- the latter doesn't recognize it as an array, and
- // does not inline it, but append as a single entity.
- // 2) On some browsers (e.g., Safari) the "constructor" property is
- // read-only and cannot be changed. So we have to test for both
- // native NodeList and dojo.NodeList in this property to recognize
- // the node list.
-
- var t = d.isArray(this) ? this : aps.call(this, 0),
- m = d.map(arguments, function(a){
- return a && !d.isArray(a) &&
- (typeof NodeList != "undefined" && a.constructor === NodeList || a.constructor === this._NodeListCtor) ?
- aps.call(a, 0) : a;
- });
- return this._wrap(apc.apply(t, m), this); // dojo.NodeList
- },
-
- map: function(/*Function*/ func, /*Function?*/ obj){
- // summary:
- // see dojo.map(). The primary difference is that the acted-on
- // array is implicitly this NodeList and the return is a
- // dojo.NodeList (a subclass of Array)
- ///return d.map(this, func, obj, d.NodeList); // dojo.NodeList
- return this._wrap(d.map(this, func, obj), this); // dojo.NodeList
- },
-
- forEach: function(callback, thisObj){
- // summary:
- // see `dojo.forEach()`. The primary difference is that the acted-on
- // array is implicitly this NodeList. If you want the option to break out
- // of the forEach loop, use every() or some() instead.
- d.forEach(this, callback, thisObj);
- // non-standard return to allow easier chaining
- return this; // dojo.NodeList
- },
-
- /*=====
- coords: function(){
- // summary:
- // Returns the box objects of all elements in a node list as
- // an Array (*not* a NodeList). Acts like `dojo.coords`, though assumes
- // the node passed is each node in this list.
-
- return d.map(this, d.coords); // Array
- },
-
- position: function(){
- // summary:
- // Returns border-box objects (x/y/w/h) of all elements in a node list
- // as an Array (*not* a NodeList). Acts like `dojo.position`, though
- // assumes the node passed is each node in this list.
-
- return d.map(this, d.position); // Array
- },
-
- attr: function(property, value){
- // summary:
- // gets or sets the DOM attribute for every element in the
- // NodeList. See also `dojo.attr`
- // property: String
- // the attribute to get/set
- // value: String?
- // optional. The value to set the property to
- // returns:
- // if no value is passed, the result is an array of attribute values
- // If a value is passed, the return is this NodeList
- // example:
- // Make all nodes with a particular class focusable:
- // | dojo.query(".focusable").attr("tabIndex", -1);
- // example:
- // Disable a group of buttons:
- // | dojo.query("button.group").attr("disabled", true);
- // example:
- // innerHTML can be assigned or retrieved as well:
- // | // get the innerHTML (as an array) for each list item
- // | var ih = dojo.query("li.replaceable").attr("innerHTML");
- return; // dojo.NodeList
- return; // Array
- },
-
- style: function(property, value){
- // summary:
- // gets or sets the CSS property for every element in the NodeList
- // property: String
- // the CSS property to get/set, in JavaScript notation
- // ("lineHieght" instead of "line-height")
- // value: String?
- // optional. The value to set the property to
- // returns:
- // if no value is passed, the result is an array of strings.
- // If a value is passed, the return is this NodeList
- return; // dojo.NodeList
- return; // Array
- },
-
- addClass: function(className){
- // summary:
- // adds the specified class to every node in the list
- // className: String|Array
- // A String class name to add, or several space-separated class names,
- // or an array of class names.
- return; // dojo.NodeList
- },
-
- removeClass: function(className){
- // summary:
- // removes the specified class from every node in the list
- // className: String|Array?
- // An optional String class name to remove, or several space-separated
- // class names, or an array of class names. If omitted, all class names
- // will be deleted.
- // returns:
- // dojo.NodeList, this list
- return; // dojo.NodeList
- },
-
- toggleClass: function(className, condition){
- // summary:
- // Adds a class to node if not present, or removes if present.
- // Pass a boolean condition if you want to explicitly add or remove.
- // condition: Boolean?
- // If passed, true means to add the class, false means to remove.
- // className: String
- // the CSS class to add
- return; // dojo.NodeList
- },
-
- connect: function(methodName, objOrFunc, funcName){
- // summary:
- // attach event handlers to every item of the NodeList. Uses dojo.connect()
- // so event properties are normalized
- // methodName: String
- // the name of the method to attach to. For DOM events, this should be
- // the lower-case name of the event
- // objOrFunc: Object|Function|String
- // if 2 arguments are passed (methodName, objOrFunc), objOrFunc should
- // reference a function or be the name of the function in the global
- // namespace to attach. If 3 arguments are provided
- // (methodName, objOrFunc, funcName), objOrFunc must be the scope to
- // locate the bound function in
- // funcName: String?
- // optional. A string naming the function in objOrFunc to bind to the
- // event. May also be a function reference.
- // example:
- // add an onclick handler to every button on the page
- // | dojo.query("div:nth-child(odd)").connect("onclick", function(e){
- // | console.log("clicked!");
- // | });
- // example:
- // attach foo.bar() to every odd div's onmouseover
- // | dojo.query("div:nth-child(odd)").connect("onmouseover", foo, "bar");
- },
-
- empty: function(){
- // summary:
- // clears all content from each node in the list. Effectively
- // equivalent to removing all child nodes from every item in
- // the list.
- return this.forEach("item.innerHTML='';"); // dojo.NodeList
- // FIXME: should we be checking for and/or disposing of widgets below these nodes?
- },
- =====*/
-
- // useful html methods
- coords: adaptAsMap(d.coords),
- position: adaptAsMap(d.position),
-
- // FIXME: connectPublisher()? connectRunOnce()?
-
- /*
- destroy: function(){
- // summary:
- // destroys every item in the list.
- this.forEach(d.destroy);
- // FIXME: should we be checking for and/or disposing of widgets below these nodes?
- },
- */
-
- place: function(/*String||Node*/ queryOrNode, /*String*/ position){
- // summary:
- // places elements of this node list relative to the first element matched
- // by queryOrNode. Returns the original NodeList. See: `dojo.place`
- // queryOrNode:
- // may be a string representing any valid CSS3 selector or a DOM node.
- // In the selector case, only the first matching element will be used
- // for relative positioning.
- // position:
- // can be one of:
- // | "last" (default)
- // | "first"
- // | "before"
- // | "after"
- // | "only"
- // | "replace"
- // or an offset in the childNodes property
- var item = d.query(queryOrNode)[0];
- return this.forEach(function(node){ d.place(node, item, position); }); // dojo.NodeList
- },
-
- orphan: function(/*String?*/ filter){
- // summary:
- // removes elements in this list that match the filter
- // from their parents and returns them as a new NodeList.
- // filter:
- // CSS selector like ".foo" or "div > span"
- // returns:
- // `dojo.NodeList` containing the orphaned elements
- return (filter ? d._filterQueryResult(this, filter) : this).forEach(orphan); // dojo.NodeList
- },
-
- adopt: function(/*String||Array||DomNode*/ queryOrListOrNode, /*String?*/ position){
- // summary:
- // places any/all elements in queryOrListOrNode at a
- // position relative to the first element in this list.
- // Returns a dojo.NodeList of the adopted elements.
- // queryOrListOrNode:
- // a DOM node or a query string or a query result.
- // Represents the nodes to be adopted relative to the
- // first element of this NodeList.
- // position:
- // can be one of:
- // | "last" (default)
- // | "first"
- // | "before"
- // | "after"
- // | "only"
- // | "replace"
- // or an offset in the childNodes property
- return d.query(queryOrListOrNode).place(this[0], position)._stash(this); // dojo.NodeList
- },
-
- // FIXME: do we need this?
- query: function(/*String*/ queryStr){
- // summary:
- // Returns a new list whose members match the passed query,
- // assuming elements of the current NodeList as the root for
- // each search.
- // example:
- // assume a DOM created by this markup:
- // | <div id="foo">
- // | <p>
- // | bacon is tasty, <span>dontcha think?</span>
- // | </p>
- // | </div>
- // | <div id="bar">
- // | <p>great comedians may not be funny <span>in person</span></p>
- // | </div>
- // If we are presented with the following definition for a NodeList:
- // | var l = new dojo.NodeList(dojo.byId("foo"), dojo.byId("bar"));
- // it's possible to find all span elements under paragraphs
- // contained by these elements with this sub-query:
- // | var spans = l.query("p span");
-
- // FIXME: probably slow
- if(!queryStr){ return this; }
- var ret = this.map(function(node){
- // FIXME: why would we ever get undefined here?
- return d.query(queryStr, node).filter(function(subNode){ return subNode !== undefined; });
- });
- return this._wrap(apc.apply([], ret), this); // dojo.NodeList
- },
-
- filter: function(/*String|Function*/ filter){
- // summary:
- // "masks" the built-in javascript filter() method (supported
- // in Dojo via `dojo.filter`) to support passing a simple
- // string filter in addition to supporting filtering function
- // objects.
- // filter:
- // If a string, a CSS rule like ".thinger" or "div > span".
- // example:
- // "regular" JS filter syntax as exposed in dojo.filter:
- // | dojo.query("*").filter(function(item){
- // | // highlight every paragraph
- // | return (item.nodeName == "p");
- // | }).style("backgroundColor", "yellow");
- // example:
- // the same filtering using a CSS selector
- // | dojo.query("*").filter("p").styles("backgroundColor", "yellow");
-
- var a = arguments, items = this, start = 0;
- if(typeof filter == "string"){ // inline'd type check
- items = d._filterQueryResult(this, a[0]);
- if(a.length == 1){
- // if we only got a string query, pass back the filtered results
- return items._stash(this); // dojo.NodeList
- }
- // if we got a callback, run it over the filtered items
- start = 1;
- }
- return this._wrap(d.filter(items, a[start], a[start + 1]), this); // dojo.NodeList
- },
-
- /*
- // FIXME: should this be "copyTo" and include parenting info?
- clone: function(){
- // summary:
- // creates node clones of each element of this list
- // and returns a new list containing the clones
- },
- */
-
- addContent: function(/*String||DomNode||Object||dojo.NodeList*/ content, /*String||Integer?*/ position){
- // summary:
- // add a node, NodeList or some HTML as a string to every item in the
- // list. Returns the original list.
- // description:
- // a copy of the HTML content is added to each item in the
- // list, with an optional position argument. If no position
- // argument is provided, the content is appended to the end of
- // each item.
- // content:
- // DOM node, HTML in string format, a NodeList or an Object. If a DOM node or
- // NodeList, the content will be cloned if the current NodeList has more than one
- // element. Only the DOM nodes are cloned, no event handlers. If it is an Object,
- // it should be an object with at "template" String property that has the HTML string
- // to insert. If dojo.string has already been dojo.required, then dojo.string.substitute
- // will be used on the "template" to generate the final HTML string. Other allowed
- // properties on the object are: "parse" if the HTML
- // string should be parsed for widgets (dojo.require("dojo.parser") to get that
- // option to work), and "templateFunc" if a template function besides dojo.string.substitute
- // should be used to transform the "template".
- // position:
- // can be one of:
- // | "last"||"end" (default)
- // | "first||"start"
- // | "before"
- // | "after"
- // | "replace" (replaces nodes in this NodeList with new content)
- // | "only" (removes other children of the nodes so new content is the only child)
- // or an offset in the childNodes property
- // example:
- // appends content to the end if the position is omitted
- // | dojo.query("h3 > p").addContent("hey there!");
- // example:
- // add something to the front of each element that has a
- // "thinger" property:
- // | dojo.query("[thinger]").addContent("...", "first");
- // example:
- // adds a header before each element of the list
- // | dojo.query(".note").addContent("<h4>NOTE:</h4>", "before");
- // example:
- // add a clone of a DOM node to the end of every element in
- // the list, removing it from its existing parent.
- // | dojo.query(".note").addContent(dojo.byId("foo"));
- // example:
- // Append nodes from a templatized string.
- // dojo.require("dojo.string");
- // dojo.query(".note").addContent({
- // template: '<b>${id}: </b><span>${name}</span>',
- // id: "user332",
- // name: "Mr. Anderson"
- // });
- // example:
- // Append nodes from a templatized string that also has widgets parsed.
- // dojo.require("dojo.string");
- // dojo.require("dojo.parser");
- // var notes = dojo.query(".note").addContent({
- // template: '<button dojoType="dijit.form.Button">${text}</button>',
- // parse: true,
- // text: "Send"
- // });
- content = this._normalize(content, this[0]);
- for(var i = 0, node; (node = this[i]); i++){
- this._place(content, node, position, i > 0);
- }
- return this; //dojo.NodeList
- },
-
- instantiate: function(/*String|Object*/ declaredClass, /*Object?*/ properties){
- // summary:
- // Create a new instance of a specified class, using the
- // specified properties and each node in the nodeList as a
- // srcNodeRef.
- // example:
- // Grabs all buttons in the page and converts them to diji.form.Buttons.
- // | var buttons = dojo.query("button").instantiate("dijit.form.Button", {showLabel: true});
- var c = d.isFunction(declaredClass) ? declaredClass : d.getObject(declaredClass);
- properties = properties || {};
- return this.forEach(function(node){
- new c(properties, node);
- }); // dojo.NodeList
- },
-
- at: function(/*===== index =====*/){
- // summary:
- // Returns a new NodeList comprised of items in this NodeList
- // at the given index or indices.
- //
- // index: Integer...
- // One or more 0-based indices of items in the current
- // NodeList. A negative index will start at the end of the
- // list and go backwards.
- //
- // example:
- // Shorten the list to the first, second, and third elements
- // | dojo.query("a").at(0, 1, 2).forEach(fn);
- //
- // example:
- // Retrieve the first and last elements of a unordered list:
- // | dojo.query("ul > li").at(0, -1).forEach(cb);
- //
- // example:
- // Do something for the first element only, but end() out back to
- // the original list and continue chaining:
- // | dojo.query("a").at(0).onclick(fn).end().forEach(function(n){
- // | console.log(n); // all anchors on the page.
- // | })
- //
- // returns:
- // dojo.NodeList
- var t = new this._NodeListCtor();
- d.forEach(arguments, function(i){
- if(i < 0){ i = this.length + i }
- if(this[i]){ t.push(this[i]); }
- }, this);
- return t._stash(this); // dojo.NodeList
- }
-
- });
-
- nl.events = [
- // summary:
- // list of all DOM events used in NodeList
- "blur", "focus", "change", "click", "error", "keydown", "keypress",
- "keyup", "load", "mousedown", "mouseenter", "mouseleave", "mousemove",
- "mouseout", "mouseover", "mouseup", "submit"
- ];
-
- // FIXME: pseudo-doc the above automatically generated on-event functions
-
- // syntactic sugar for DOM events
- d.forEach(nl.events, function(evt){
- var _oe = "on" + evt;
- nlp[_oe] = function(a, b){
- return this.connect(_oe, a, b);
- };
- // FIXME: should these events trigger publishes?
- /*
- return (a ? this.connect(_oe, a, b) :
- this.forEach(function(n){
- // FIXME:
- // listeners get buried by
- // addEventListener and can't be dug back
- // out to be triggered externally.
- // see:
- // http://developer.mozilla.org/en/docs/DOM:element
-
- console.log(n, evt, _oe);
-
- // FIXME: need synthetic event support!
- var _e = { target: n, faux: true, type: evt };
- // dojo._event_listener._synthesizeEvent({}, { target: n, faux: true, type: evt });
- try{ n[evt](_e); }catch(e){ console.log(e); }
- try{ n[_oe](_e); }catch(e){ console.log(e); }
- })
- );
- */
- }
- );
-
-})();
-
-}
+//>>built
+define("dojo/_base/NodeList",["./kernel","../query","./array","./html","../NodeList-dom"],function(_1,_2,_3){var _4=_2.NodeList;var _5=_4.prototype;_5.connect=_4._adaptAsForEach(function(){return _1.connect.apply(this,arguments);});_5.coords=_4._adaptAsMap(_1.coords);_4.events=["blur","focus","change","click","error","keydown","keypress","keyup","load","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","submit"];_3.forEach(_4.events,function(_6){var _7="on"+_6;_5[_7]=function(a,b){return this.connect(_7,a,b);};});_1.NodeList=_4;return _1.NodeList;}); \ No newline at end of file
diff --git a/lib/dojo/_base/NodeList.js.uncompressed.js b/lib/dojo/_base/NodeList.js.uncompressed.js
new file mode 100644
index 000000000..e723fa801
--- /dev/null
+++ b/lib/dojo/_base/NodeList.js.uncompressed.js
@@ -0,0 +1,100 @@
+define("dojo/_base/NodeList", ["./kernel", "../query", "./array", "./html", "../NodeList-dom"], function(dojo, query, array){
+ // module:
+ // dojo/_base/NodeList
+ // summary:
+ // This module defines dojo.NodeList.
+
+var NodeList = query.NodeList;
+
+ /*=====
+ dojo.extend(dojo.NodeList, {
+ connect: function(methodName, objOrFunc, funcName){
+ // summary:
+ // attach event handlers to every item of the NodeList. Uses dojo.connect()
+ // so event properties are normalized
+ // methodName: String
+ // the name of the method to attach to. For DOM events, this should be
+ // the lower-case name of the event
+ // objOrFunc: Object|Function|String
+ // if 2 arguments are passed (methodName, objOrFunc), objOrFunc should
+ // reference a function or be the name of the function in the global
+ // namespace to attach. If 3 arguments are provided
+ // (methodName, objOrFunc, funcName), objOrFunc must be the scope to
+ // locate the bound function in
+ // funcName: String?
+ // optional. A string naming the function in objOrFunc to bind to the
+ // event. May also be a function reference.
+ // example:
+ // add an onclick handler to every button on the page
+ // | dojo.query("div:nth-child(odd)").connect("onclick", function(e){
+ // | console.log("clicked!");
+ // | });
+ // example:
+ // attach foo.bar() to every odd div's onmouseover
+ // | dojo.query("div:nth-child(odd)").connect("onmouseover", foo, "bar");
+ },
+ coords: function(){
+ // summary:
+ // Deprecated: Use position() for border-box x/y/w/h
+ // or marginBox() for margin-box w/h/l/t.
+ // Returns the box objects of all elements in a node list as
+ // an Array (*not* a NodeList). Acts like `dojo.coords`, though assumes
+ // the node passed is each node in this list.
+
+ return dojo.map(this, dojo.coords); // Array
+ }
+ });
+
+ var NodeList = dojo.NodeList;
+ =====*/
+ var nlp = NodeList.prototype;
+
+ // don't bind early to dojo.connect since we no longer explicitly depend on it
+ nlp.connect = NodeList._adaptAsForEach(function(){
+ return dojo.connect.apply(this, arguments);
+ });
+ nlp.coords = NodeList._adaptAsMap(dojo.coords);
+
+ NodeList.events = [
+ // summary:
+ // list of all DOM events used in NodeList
+ "blur", "focus", "change", "click", "error", "keydown", "keypress",
+ "keyup", "load", "mousedown", "mouseenter", "mouseleave", "mousemove",
+ "mouseout", "mouseover", "mouseup", "submit"
+ ];
+
+ // FIXME: pseudo-doc the above automatically generated on-event functions
+
+ // syntactic sugar for DOM events
+ array.forEach(NodeList.events, function(evt){
+ var _oe = "on" + evt;
+ nlp[_oe] = function(a, b){
+ return this.connect(_oe, a, b);
+ };
+ // FIXME: should these events trigger publishes?
+ /*
+ return (a ? this.connect(_oe, a, b) :
+ this.forEach(function(n){
+ // FIXME:
+ // listeners get buried by
+ // addEventListener and can't be dug back
+ // out to be triggered externally.
+ // see:
+ // http://developer.mozilla.org/en/docs/DOM:element
+
+ console.log(n, evt, _oe);
+
+ // FIXME: need synthetic event support!
+ var _e = { target: n, faux: true, type: evt };
+ // dojo._event_listener._synthesizeEvent({}, { target: n, faux: true, type: evt });
+ try{ n[evt](_e); }catch(e){ console.log(e); }
+ try{ n[_oe](_e); }catch(e){ console.log(e); }
+ })
+ );
+ */
+ }
+ );
+
+ dojo.NodeList = NodeList;
+ return dojo.NodeList;
+});
diff --git a/lib/dojo/_base/_loader/bootstrap.js b/lib/dojo/_base/_loader/bootstrap.js
deleted file mode 100644
index a1f99276a..000000000
--- a/lib/dojo/_base/_loader/bootstrap.js
+++ /dev/null
@@ -1,505 +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
-*/
-
-
-/*=====
-// note:
-// 'djConfig' does not exist under 'dojo.*' so that it can be set before the
-// 'dojo' variable exists.
-// note:
-// Setting any of these variables *after* the library has loaded does
-// nothing at all.
-
-djConfig = {
- // summary:
- // Application code can set the global 'djConfig' prior to loading
- // the library to override certain global settings for how dojo works.
- //
- // isDebug: Boolean
- // Defaults to `false`. If set to `true`, ensures that Dojo provides
- // extended debugging feedback via Firebug. If Firebug is not available
- // on your platform, setting `isDebug` to `true` will force Dojo to
- // pull in (and display) the version of Firebug Lite which is
- // integrated into the Dojo distribution, thereby always providing a
- // debugging/logging console when `isDebug` is enabled. Note that
- // Firebug's `console.*` methods are ALWAYS defined by Dojo. If
- // `isDebug` is false and you are on a platform without Firebug, these
- // methods will be defined as no-ops.
- isDebug: false,
- // debugAtAllCosts: Boolean
- // Defaults to `false`. If set to `true`, this triggers an alternate
- // mode of the package system in which dependencies are detected and
- // only then are resources evaluated in dependency order via
- // `<script>` tag inclusion. This may double-request resources and
- // cause problems with scripts which expect `dojo.require()` to
- // preform synchronously. `debugAtAllCosts` can be an invaluable
- // debugging aid, but when using it, ensure that all code which
- // depends on Dojo modules is wrapped in `dojo.addOnLoad()` handlers.
- // Due to the somewhat unpredictable side-effects of using
- // `debugAtAllCosts`, it is strongly recommended that you enable this
- // flag as a last resort. `debugAtAllCosts` has no effect when loading
- // resources across domains. For usage information, see the
- // [Dojo Book](http://dojotoolkit.org/book/book-dojo/part-4-meta-dojo-making-your-dojo-code-run-faster-and-better/debugging-facilities/deb)
- debugAtAllCosts: false,
- // locale: String
- // The locale to assume for loading localized resources in this page,
- // specified according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).
- // Must be specified entirely in lowercase, e.g. `en-us` and `zh-cn`.
- // See the documentation for `dojo.i18n` and `dojo.requireLocalization`
- // for details on loading localized resources. If no locale is specified,
- // Dojo assumes the locale of the user agent, according to `navigator.userLanguage`
- // or `navigator.language` properties.
- locale: undefined,
- // extraLocale: Array
- // No default value. Specifies additional locales whose
- // resources should also be loaded alongside the default locale when
- // calls to `dojo.requireLocalization()` are processed.
- extraLocale: undefined,
- // baseUrl: String
- // The directory in which `dojo.js` is located. Under normal
- // conditions, Dojo auto-detects the correct location from which it
- // was loaded. You may need to manually configure `baseUrl` in cases
- // where you have renamed `dojo.js` or in which `<base>` tags confuse
- // some browsers (e.g. IE 6). The variable `dojo.baseUrl` is assigned
- // either the value of `djConfig.baseUrl` if one is provided or the
- // auto-detected root if not. Other modules are located relative to
- // this path. The path should end in a slash.
- baseUrl: undefined,
- // modulePaths: Object
- // A map of module names to paths relative to `dojo.baseUrl`. The
- // key/value pairs correspond directly to the arguments which
- // `dojo.registerModulePath` accepts. Specifiying
- // `djConfig.modulePaths = { "foo": "../../bar" }` is the equivalent
- // of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple
- // modules may be configured via `djConfig.modulePaths`.
- modulePaths: {},
- // afterOnLoad: Boolean
- // Indicates Dojo was added to the page after the page load. In this case
- // Dojo will not wait for the page DOMContentLoad/load events and fire
- // its dojo.addOnLoad callbacks after making sure all outstanding
- // dojo.required modules have loaded. Only works with a built dojo.js,
- // it does not work the dojo.js directly from source control.
- afterOnLoad: false,
- // addOnLoad: Function or Array
- // Adds a callback via dojo.addOnLoad. Useful when Dojo is added after
- // the page loads and djConfig.afterOnLoad is true. Supports the same
- // arguments as dojo.addOnLoad. When using a function reference, use
- // `djConfig.addOnLoad = function(){};`. For object with function name use
- // `djConfig.addOnLoad = [myObject, "functionName"];` and for object with
- // function reference use
- // `djConfig.addOnLoad = [myObject, function(){}];`
- addOnLoad: null,
- // require: Array
- // An array of module names to be loaded immediately after dojo.js has been included
- // in a page.
- require: [],
- // defaultDuration: Array
- // Default duration, in milliseconds, for wipe and fade animations within dijits.
- // Assigned to dijit.defaultDuration.
- defaultDuration: 200,
- // dojoBlankHtmlUrl: String
- // Used by some modules to configure an empty iframe. Used by dojo.io.iframe and
- // dojo.back, and dijit popup support in IE where an iframe is needed to make sure native
- // controls do not bleed through the popups. Normally this configuration variable
- // does not need to be set, except when using cross-domain/CDN Dojo builds.
- // Save dojo/resources/blank.html to your domain and set `djConfig.dojoBlankHtmlUrl`
- // to the path on your domain your copy of blank.html.
- dojoBlankHtmlUrl: undefined,
- // ioPublish: Boolean?
- // Set this to true to enable publishing of topics for the different phases of
- // IO operations. Publishing is done via dojo.publish. See dojo.__IoPublish for a list
- // of topics that are published.
- ioPublish: false,
- // useCustomLogger: Anything?
- // If set to a value that evaluates to true such as a string or array and
- // isDebug is true and Firebug is not available or running, then it bypasses
- // the creation of Firebug Lite allowing you to define your own console object.
- useCustomLogger: undefined,
- // transparentColor: Array
- // Array containing the r, g, b components used as transparent color in dojo.Color;
- // if undefined, [255,255,255] (white) will be used.
- transparentColor: undefined,
- // skipIeDomLoaded: Boolean
- // For IE only, skip the DOMContentLoaded hack used. Sometimes it can cause an Operation
- // Aborted error if the rest of the page triggers script defers before the DOM is ready.
- // If this is config value is set to true, then dojo.addOnLoad callbacks will not be
- // triggered until the page load event, which is after images and iframes load. If you
- // want to trigger the callbacks sooner, you can put a script block in the bottom of
- // your HTML that calls dojo._loadInit();. If you are using multiversion support, change
- // "dojo." to the appropriate scope name for dojo.
- skipIeDomLoaded: false
-}
-=====*/
-
-(function(){
- // firebug stubs
-
- if(typeof this["loadFirebugConsole"] == "function"){
- // for Firebug 1.2
- this["loadFirebugConsole"]();
- }else{
- this.console = this.console || {};
-
- // Be careful to leave 'log' always at the end
- var cn = [
- "assert", "count", "debug", "dir", "dirxml", "error", "group",
- "groupEnd", "info", "profile", "profileEnd", "time", "timeEnd",
- "trace", "warn", "log"
- ];
- var i = 0, tn;
- while((tn=cn[i++])){
- if(!console[tn]){
- (function(){
- var tcn = tn+"";
- console[tcn] = ('log' in console) ? function(){
- var a = Array.apply({}, arguments);
- a.unshift(tcn+":");
- console["log"](a.join(" "));
- } : function(){}
- console[tcn]._fake = true;
- })();
- }
- }
- }
-
- //TODOC: HOW TO DOC THIS?
- // dojo is the root variable of (almost all) our public symbols -- make sure it is defined.
- if(typeof dojo == "undefined"){
- dojo = {
- _scopeName: "dojo",
- _scopePrefix: "",
- _scopePrefixArgs: "",
- _scopeSuffix: "",
- _scopeMap: {},
- _scopeMapRev: {}
- };
- }
-
- var d = dojo;
-
- //Need placeholders for dijit and dojox for scoping code.
- if(typeof dijit == "undefined"){
- dijit = {_scopeName: "dijit"};
- }
- if(typeof dojox == "undefined"){
- dojox = {_scopeName: "dojox"};
- }
-
- if(!d._scopeArgs){
- d._scopeArgs = [dojo, dijit, dojox];
- }
-
-/*=====
-dojo.global = {
- // summary:
- // Alias for the global scope
- // (e.g. the window object in a browser).
- // description:
- // Refer to 'dojo.global' rather than referring to window to ensure your
- // code runs correctly in contexts other than web browsers (e.g. Rhino on a server).
-}
-=====*/
- d.global = this;
-
- d.config =/*===== djConfig = =====*/{
- isDebug: false,
- debugAtAllCosts: false
- };
-
- // FIXME: 2.0, drop djConfig support. Use dojoConfig exclusively for global config.
- var cfg = typeof djConfig != "undefined" ? djConfig :
- typeof dojoConfig != "undefined" ? dojoConfig : null;
-
- if(cfg){
- for(var c in cfg){
- d.config[c] = cfg[c];
- }
- }
-
-/*=====
- // Override locale setting, if specified
- dojo.locale = {
- // summary: the locale as defined by Dojo (read-only)
- };
-=====*/
- dojo.locale = d.config.locale;
-
- var rev = "$Rev: 24595 $".match(/\d+/);
-
-/*=====
- dojo.version = function(){
- // summary:
- // Version number of the Dojo Toolkit
- // major: Integer
- // Major version. If total version is "1.2.0beta1", will be 1
- // minor: Integer
- // Minor version. If total version is "1.2.0beta1", will be 2
- // patch: Integer
- // Patch version. If total version is "1.2.0beta1", will be 0
- // flag: String
- // Descriptor flag. If total version is "1.2.0beta1", will be "beta1"
- // revision: Number
- // The SVN rev from which dojo was pulled
- this.major = 0;
- this.minor = 0;
- this.patch = 0;
- this.flag = "";
- this.revision = 0;
- }
-=====*/
- dojo.version = {
- major: 1, minor: 6, patch: 1, flag: "",
- revision: rev ? +rev[0] : NaN,
- toString: function(){
- with(d.version){
- return major + "." + minor + "." + patch + flag + " (" + revision + ")"; // String
- }
- }
- }
-
- // Register with the OpenAjax hub
- if(typeof OpenAjax != "undefined"){
- OpenAjax.hub.registerLibrary(dojo._scopeName, "http://dojotoolkit.org", d.version.toString());
- }
-
- var extraNames, extraLen, empty = {};
- for(var i in {toString: 1}){ extraNames = []; break; }
- dojo._extraNames = extraNames = extraNames || ["hasOwnProperty", "valueOf", "isPrototypeOf",
- "propertyIsEnumerable", "toLocaleString", "toString", "constructor"];
- extraLen = extraNames.length;
-
- dojo._mixin = function(/*Object*/ target, /*Object*/ source){
- // summary:
- // Adds all properties and methods of source to target. This addition
- // is "prototype extension safe", so that instances of objects
- // will not pass along prototype defaults.
- var name, s, i;
- for(name in source){
- // the "tobj" condition avoid copying properties in "source"
- // inherited from Object.prototype. For example, if target has a custom
- // toString() method, don't overwrite it with the toString() method
- // that source inherited from Object.prototype
- s = source[name];
- if(!(name in target) || (target[name] !== s && (!(name in empty) || empty[name] !== s))){
- target[name] = s;
- }
- }
- // IE doesn't recognize some custom functions in for..in
- if(extraLen && source){
- for(i = 0; i < extraLen; ++i){
- name = extraNames[i];
- s = source[name];
- if(!(name in target) || (target[name] !== s && (!(name in empty) || empty[name] !== s))){
- target[name] = s;
- }
- }
- }
- return target; // Object
- }
-
- dojo.mixin = function(/*Object*/obj, /*Object...*/props){
- // summary:
- // Adds all properties and methods of props to obj and returns the
- // (now modified) obj.
- // description:
- // `dojo.mixin` can mix multiple source objects into a
- // destination object which is then returned. Unlike regular
- // `for...in` iteration, `dojo.mixin` is also smart about avoiding
- // extensions which other toolkits may unwisely add to the root
- // object prototype
- // obj:
- // The object to mix properties into. Also the return value.
- // props:
- // One or more objects whose values are successively copied into
- // obj. If more than one of these objects contain the same value,
- // the one specified last in the function call will "win".
- // example:
- // make a shallow copy of an object
- // | var copy = dojo.mixin({}, source);
- // example:
- // many class constructors often take an object which specifies
- // values to be configured on the object. In this case, it is
- // often simplest to call `dojo.mixin` on the `this` object:
- // | dojo.declare("acme.Base", null, {
- // | constructor: function(properties){
- // | // property configuration:
- // | dojo.mixin(this, properties);
- // |
- // | console.log(this.quip);
- // | // ...
- // | },
- // | quip: "I wasn't born yesterday, you know - I've seen movies.",
- // | // ...
- // | });
- // |
- // | // create an instance of the class and configure it
- // | var b = new acme.Base({quip: "That's what it does!" });
- // example:
- // copy in properties from multiple objects
- // | var flattened = dojo.mixin(
- // | {
- // | name: "Frylock",
- // | braces: true
- // | },
- // | {
- // | name: "Carl Brutanananadilewski"
- // | }
- // | );
- // |
- // | // will print "Carl Brutanananadilewski"
- // | console.log(flattened.name);
- // | // will print "true"
- // | console.log(flattened.braces);
- if(!obj){ obj = {}; }
- for(var i=1, l=arguments.length; i<l; i++){
- d._mixin(obj, arguments[i]);
- }
- return obj; // Object
- }
-
- dojo._getProp = function(/*Array*/parts, /*Boolean*/create, /*Object*/context){
- var obj=context || d.global;
- for(var i=0, p; obj && (p=parts[i]); i++){
- if(i == 0 && d._scopeMap[p]){
- p = d._scopeMap[p];
- }
- obj = (p in obj ? obj[p] : (create ? obj[p]={} : undefined));
- }
- return obj; // mixed
- }
-
- dojo.setObject = function(/*String*/name, /*Object*/value, /*Object?*/context){
- // summary:
- // Set a property from a dot-separated string, such as "A.B.C"
- // description:
- // Useful for longer api chains where you have to test each object in
- // the chain, or when you have an object reference in string format.
- // Objects are created as needed along `path`. Returns the passed
- // value if setting is successful or `undefined` if not.
- // name:
- // Path to a property, in the form "A.B.C".
- // context:
- // Optional. Object to use as root of path. Defaults to
- // `dojo.global`.
- // example:
- // set the value of `foo.bar.baz`, regardless of whether
- // intermediate objects already exist:
- // | dojo.setObject("foo.bar.baz", value);
- // example:
- // without `dojo.setObject`, we often see code like this:
- // | // ensure that intermediate objects are available
- // | if(!obj["parent"]){ obj.parent = {}; }
- // | if(!obj.parent["child"]){ obj.parent.child= {}; }
- // | // now we can safely set the property
- // | obj.parent.child.prop = "some value";
- // wheras with `dojo.setObject`, we can shorten that to:
- // | dojo.setObject("parent.child.prop", "some value", obj);
- var parts=name.split("."), p=parts.pop(), obj=d._getProp(parts, true, context);
- return obj && p ? (obj[p]=value) : undefined; // Object
- }
-
- dojo.getObject = function(/*String*/name, /*Boolean?*/create, /*Object?*/context){
- // summary:
- // Get a property from a dot-separated string, such as "A.B.C"
- // description:
- // Useful for longer api chains where you have to test each object in
- // the chain, or when you have an object reference in string format.
- // name:
- // Path to an property, in the form "A.B.C".
- // create:
- // Optional. Defaults to `false`. If `true`, Objects will be
- // created at any point along the 'path' that is undefined.
- // context:
- // Optional. Object to use as root of path. Defaults to
- // 'dojo.global'. Null may be passed.
- return d._getProp(name.split("."), create, context); // Object
- }
-
- dojo.exists = function(/*String*/name, /*Object?*/obj){
- // summary:
- // determine if an object supports a given method
- // description:
- // useful for longer api chains where you have to test each object in
- // the chain. Useful for object and method detection.
- // name:
- // Path to an object, in the form "A.B.C".
- // obj:
- // Object to use as root of path. Defaults to
- // 'dojo.global'. Null may be passed.
- // example:
- // | // define an object
- // | var foo = {
- // | bar: { }
- // | };
- // |
- // | // search the global scope
- // | dojo.exists("foo.bar"); // true
- // | dojo.exists("foo.bar.baz"); // false
- // |
- // | // search from a particular scope
- // | dojo.exists("bar", foo); // true
- // | dojo.exists("bar.baz", foo); // false
- return d.getObject(name, false, obj) !== undefined; // Boolean
- }
-
- dojo["eval"] = function(/*String*/ scriptFragment){
- // summary:
- // A legacy method created for use exclusively by internal Dojo methods. Do not use
- // this method directly, the behavior of this eval will differ from the normal
- // browser eval.
- // description:
- // Placed in a separate function to minimize size of trapped
- // exceptions. Calling eval() directly from some other scope may
- // complicate tracebacks on some platforms.
- // returns:
- // The result of the evaluation. Often `undefined`
- return d.global.eval ? d.global.eval(scriptFragment) : eval(scriptFragment); // Object
- }
-
- /*=====
- dojo.deprecated = function(behaviour, extra, removal){
- // summary:
- // Log a debug message to indicate that a behavior has been
- // deprecated.
- // behaviour: String
- // The API or behavior being deprecated. Usually in the form
- // of "myApp.someFunction()".
- // extra: String?
- // Text to append to the message. Often provides advice on a
- // new function or facility to achieve the same goal during
- // the deprecation period.
- // removal: String?
- // Text to indicate when in the future the behavior will be
- // removed. Usually a version number.
- // example:
- // | dojo.deprecated("myApp.getTemp()", "use myApp.getLocaleTemp() instead", "1.0");
- }
-
- dojo.experimental = function(moduleName, extra){
- // summary: Marks code as experimental.
- // description:
- // This can be used to mark a function, file, or module as
- // experimental. Experimental code is not ready to be used, and the
- // APIs are subject to change without notice. Experimental code may be
- // completed deleted without going through the normal deprecation
- // process.
- // moduleName: String
- // The name of a module, or the name of a module file or a specific
- // function
- // extra: String?
- // some additional message for the user
- // example:
- // | dojo.experimental("dojo.data.Result");
- // example:
- // | dojo.experimental("dojo.weather.toKelvin()", "PENDING approval from NOAA");
- }
- =====*/
-
- //Real functions declared in dojo._firebug.firebug.
- d.deprecated = d.experimental = function(){};
-
-})();
-// vim:ai:ts=4:noet
diff --git a/lib/dojo/_base/_loader/hostenv_browser.js b/lib/dojo/_base/_loader/hostenv_browser.js
deleted file mode 100644
index b31bd77dc..000000000
--- a/lib/dojo/_base/_loader/hostenv_browser.js
+++ /dev/null
@@ -1,477 +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
-*/
-
-
-/*=====
-dojo.isBrowser = {
- // example:
- // | if(dojo.isBrowser){ ... }
-};
-
-dojo.isFF = {
- // example:
- // | if(dojo.isFF > 1){ ... }
-};
-
-dojo.isIE = {
- // example:
- // | if(dojo.isIE > 6){
- // | // we are IE7
- // | }
-};
-
-dojo.isSafari = {
- // example:
- // | if(dojo.isSafari){ ... }
- // example:
- // Detect iPhone:
- // | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){
- // | // we are iPhone. Note, iPod touch reports "iPod" above and fails this test.
- // | }
-};
-
-dojo = {
- // isBrowser: Boolean
- // True if the client is a web-browser
- isBrowser: true,
- // isFF: Number | undefined
- // Version as a Number if client is FireFox. undefined otherwise. Corresponds to
- // major detected FireFox version (1.5, 2, 3, etc.)
- isFF: 2,
- // isIE: Number | undefined
- // Version as a Number if client is MSIE(PC). undefined otherwise. Corresponds to
- // major detected IE version (6, 7, 8, etc.)
- isIE: 6,
- // isKhtml: Number | undefined
- // Version as a Number if client is a KHTML browser. undefined otherwise. Corresponds to major
- // detected version.
- isKhtml: 0,
- // isWebKit: Number | undefined
- // Version as a Number if client is a WebKit-derived browser (Konqueror,
- // Safari, Chrome, etc.). undefined otherwise.
- isWebKit: 0,
- // isMozilla: Number | undefined
- // Version as a Number if client is a Mozilla-based browser (Firefox,
- // SeaMonkey). undefined otherwise. Corresponds to major detected version.
- isMozilla: 0,
- // isOpera: Number | undefined
- // Version as a Number if client is Opera. undefined otherwise. Corresponds to
- // major detected version.
- isOpera: 0,
- // isSafari: Number | undefined
- // Version as a Number if client is Safari or iPhone. undefined otherwise.
- isSafari: 0,
- // isChrome: Number | undefined
- // Version as a Number if client is Chrome browser. undefined otherwise.
- isChrome: 0
- // isMac: Boolean
- // True if the client runs on Mac
-}
-=====*/
-if(typeof window != 'undefined'){
- dojo.isBrowser = true;
- dojo._name = "browser";
-
-
- // attempt to figure out the path to dojo if it isn't set in the config
- (function(){
- var d = dojo;
-
- // this is a scope protection closure. We set browser versions and grab
- // the URL we were loaded from here.
-
- // grab the node we were loaded from
- if(document && document.getElementsByTagName){
- var scripts = document.getElementsByTagName("script");
- var rePkg = /dojo(\.xd)?\.js(\W|$)/i;
- for(var i = 0; i < scripts.length; i++){
- var src = scripts[i].getAttribute("src");
- if(!src){ continue; }
- var m = src.match(rePkg);
- if(m){
- // find out where we came from
- if(!d.config.baseUrl){
- d.config.baseUrl = src.substring(0, m.index);
- }
- // and find out if we need to modify our behavior
- var cfg = (scripts[i].getAttribute("djConfig") || scripts[i].getAttribute("data-dojo-config"));
- if(cfg){
- var cfgo = eval("({ "+cfg+" })");
- for(var x in cfgo){
- dojo.config[x] = cfgo[x];
- }
- }
- break; // "first Dojo wins"
- }
- }
- }
- d.baseUrl = d.config.baseUrl;
-
- // fill in the rendering support information in dojo.render.*
- var n = navigator;
- var dua = n.userAgent,
- dav = n.appVersion,
- tv = parseFloat(dav);
-
- if(dua.indexOf("Opera") >= 0){ d.isOpera = tv; }
- if(dua.indexOf("AdobeAIR") >= 0){ d.isAIR = 1; }
- d.isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : 0;
- d.isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined;
- d.isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined;
- d.isMac = dav.indexOf("Macintosh") >= 0;
-
- // safari detection derived from:
- // http://developer.apple.com/internet/safari/faq.html#anchor2
- // http://developer.apple.com/internet/safari/uamatrix.html
- var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);
- if(index && !dojo.isChrome){
- // try to grab the explicit Safari version first. If we don't get
- // one, look for less than 419.3 as the indication that we're on something
- // "Safari 2-ish".
- d.isSafari = parseFloat(dav.split("Version/")[1]);
- if(!d.isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){
- d.isSafari = 2;
- }
- }
-
- if(dua.indexOf("Gecko") >= 0 && !d.isKhtml && !d.isWebKit){ d.isMozilla = d.isMoz = tv; }
- if(d.isMoz){
- //We really need to get away from this. Consider a sane isGecko approach for the future.
- d.isFF = parseFloat(dua.split("Firefox/")[1] || dua.split("Minefield/")[1]) || undefined;
- }
- if(document.all && !d.isOpera){
- d.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined;
- //In cases where the page has an HTTP header or META tag with
- //X-UA-Compatible, then it is in emulation mode.
- //Make sure isIE reflects the desired version.
- //document.documentMode of 5 means quirks mode.
- //Only switch the value if documentMode's major version
- //is different from isIE's major version.
- var mode = document.documentMode;
- if(mode && mode != 5 && Math.floor(d.isIE) != mode){
- d.isIE = mode;
- }
- }
-
- //Workaround to get local file loads of dojo to work on IE 7
- //by forcing to not use native xhr.
- if(dojo.isIE && window.location.protocol === "file:"){
- dojo.config.ieForceActiveXXhr=true;
- }
-
- d.isQuirks = document.compatMode == "BackCompat";
-
- // TODO: is the HTML LANG attribute relevant?
- d.locale = dojo.config.locale || (d.isIE ? n.userLanguage : n.language).toLowerCase();
-
- // These are in order of decreasing likelihood; this will change in time.
- d._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
-
- d._xhrObj = function(){
- // summary:
- // does the work of portably generating a new XMLHTTPRequest object.
- var http, last_e;
- if(!dojo.isIE || !dojo.config.ieForceActiveXXhr){
- try{ http = new XMLHttpRequest(); }catch(e){}
- }
- if(!http){
- for(var i=0; i<3; ++i){
- var progid = d._XMLHTTP_PROGIDS[i];
- try{
- http = new ActiveXObject(progid);
- }catch(e){
- last_e = e;
- }
-
- if(http){
- d._XMLHTTP_PROGIDS = [progid]; // so faster next time
- break;
- }
- }
- }
-
- if(!http){
- throw new Error("XMLHTTP not available: "+last_e);
- }
-
- return http; // XMLHTTPRequest instance
- }
-
- d._isDocumentOk = function(http){
- var stat = http.status || 0,
- lp = location.protocol;
- return (stat >= 200 && stat < 300) || // Boolean
- stat == 304 || // allow any 2XX response code
- stat == 1223 || // get it out of the cache
- // Internet Explorer mangled the status code
- // Internet Explorer mangled the status code OR we're Titanium/browser chrome/chrome extension requesting a local file
- (!stat && (lp == "file:" || lp == "chrome:" || lp == "chrome-extension:" || lp == "app:"));
- }
-
- //See if base tag is in use.
- //This is to fix http://trac.dojotoolkit.org/ticket/3973,
- //but really, we need to find out how to get rid of the dojo._Url reference
- //below and still have DOH work with the dojo.i18n test following some other
- //test that uses the test frame to load a document (trac #2757).
- //Opera still has problems, but perhaps a larger issue of base tag support
- //with XHR requests (hasBase is true, but the request is still made to document
- //path, not base path).
- var owloc = window.location+"";
- var base = document.getElementsByTagName("base");
- var hasBase = (base && base.length > 0);
-
- d._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){
- // summary: Read the contents of the specified uri and return those contents.
- // uri:
- // A relative or absolute uri. If absolute, it still must be in
- // the same "domain" as we are.
- // fail_ok:
- // Default false. If fail_ok and loading fails, return null
- // instead of throwing.
- // returns: The response text. null is returned when there is a
- // failure and failure is okay (an exception otherwise)
-
- // NOTE: must be declared before scope switches ie. this._xhrObj()
- var http = d._xhrObj();
-
- if(!hasBase && dojo._Url){
- uri = (new dojo._Url(owloc, uri)).toString();
- }
-
- if(d.config.cacheBust){
- //Make sure we have a string before string methods are used on uri
- uri += "";
- uri += (uri.indexOf("?") == -1 ? "?" : "&") + String(d.config.cacheBust).replace(/\W+/g,"");
- }
-
- http.open('GET', uri, false);
- try{
- http.send(null);
- if(!d._isDocumentOk(http)){
- var err = Error("Unable to load "+uri+" status:"+ http.status);
- err.status = http.status;
- err.responseText = http.responseText;
- throw err;
- }
- }catch(e){
- if(fail_ok){ return null; } // null
- // rethrow the exception
- throw e;
- }
- return http.responseText; // String
- }
-
-
- var _w = window;
- var _handleNodeEvent = function(/*String*/evtName, /*Function*/fp){
- // summary:
- // non-destructively adds the specified function to the node's
- // evtName handler.
- // evtName: should be in the form "onclick" for "onclick" handlers.
- // Make sure you pass in the "on" part.
- var _a = _w.attachEvent || _w.addEventListener;
- evtName = _w.attachEvent ? evtName : evtName.substring(2);
- _a(evtName, function(){
- fp.apply(_w, arguments);
- }, false);
- };
-
-
- d._windowUnloaders = [];
-
- d.windowUnloaded = function(){
- // summary:
- // signal fired by impending window destruction. You may use
- // dojo.addOnWindowUnload() to register a listener for this
- // event. NOTE: if you wish to dojo.connect() to this method
- // to perform page/application cleanup, be aware that this
- // event WILL NOT fire if no handler has been registered with
- // dojo.addOnWindowUnload. This behavior started in Dojo 1.3.
- // Previous versions always triggered dojo.windowUnloaded. See
- // dojo.addOnWindowUnload for more info.
- var mll = d._windowUnloaders;
- while(mll.length){
- (mll.pop())();
- }
- d = null;
- };
-
- var _onWindowUnloadAttached = 0;
- d.addOnWindowUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
- // summary:
- // registers a function to be triggered when window.onunload
- // fires.
- // description:
- // The first time that addOnWindowUnload is called Dojo
- // will register a page listener to trigger your unload
- // handler with. Note that registering these handlers may
- // destory "fastback" page caching in browsers that support
- // it. Be careful trying to modify the DOM or access
- // JavaScript properties during this phase of page unloading:
- // they may not always be available. Consider
- // dojo.addOnUnload() if you need to modify the DOM or do
- // heavy JavaScript work since it fires at the eqivalent of
- // the page's "onbeforeunload" event.
- // example:
- // | dojo.addOnWindowUnload(functionPointer)
- // | dojo.addOnWindowUnload(object, "functionName");
- // | dojo.addOnWindowUnload(object, function(){ /* ... */});
-
- d._onto(d._windowUnloaders, obj, functionName);
- if(!_onWindowUnloadAttached){
- _onWindowUnloadAttached = 1;
- _handleNodeEvent("onunload", d.windowUnloaded);
- }
- };
-
- var _onUnloadAttached = 0;
- d.addOnUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
- // summary:
- // registers a function to be triggered when the page unloads.
- // description:
- // The first time that addOnUnload is called Dojo will
- // register a page listener to trigger your unload handler
- // with.
- //
- // In a browser enviroment, the functions will be triggered
- // during the window.onbeforeunload event. Be careful of doing
- // too much work in an unload handler. onbeforeunload can be
- // triggered if a link to download a file is clicked, or if
- // the link is a javascript: link. In these cases, the
- // onbeforeunload event fires, but the document is not
- // actually destroyed. So be careful about doing destructive
- // operations in a dojo.addOnUnload callback.
- //
- // Further note that calling dojo.addOnUnload will prevent
- // browsers from using a "fast back" cache to make page
- // loading via back button instantaneous.
- // example:
- // | dojo.addOnUnload(functionPointer)
- // | dojo.addOnUnload(object, "functionName")
- // | dojo.addOnUnload(object, function(){ /* ... */});
-
- d._onto(d._unloaders, obj, functionName);
- if(!_onUnloadAttached){
- _onUnloadAttached = 1;
- _handleNodeEvent("onbeforeunload", dojo.unloaded);
- }
- };
-
- })();
-
- //START DOMContentLoaded
- dojo._initFired = false;
- dojo._loadInit = function(e){
- if(dojo._scrollIntervalId){
- clearInterval(dojo._scrollIntervalId);
- dojo._scrollIntervalId = 0;
- }
-
- if(!dojo._initFired){
- dojo._initFired = true;
-
- //Help out IE to avoid memory leak.
- if(!dojo.config.afterOnLoad && window.detachEvent){
- window.detachEvent("onload", dojo._loadInit);
- }
-
- if(dojo._inFlightCount == 0){
- dojo._modulesLoaded();
- }
- }
- }
-
- if(!dojo.config.afterOnLoad){
- if(document.addEventListener){
- //Standards. Hooray! Assumption here that if standards based,
- //it knows about DOMContentLoaded. It is OK if it does not, the fall through
- //to window onload should be good enough.
- document.addEventListener("DOMContentLoaded", dojo._loadInit, false);
- window.addEventListener("load", dojo._loadInit, false);
- }else if(window.attachEvent){
- window.attachEvent("onload", dojo._loadInit);
-
- //DOMContentLoaded approximation. Diego Perini found this MSDN article
- //that indicates doScroll is available after DOM ready, so do a setTimeout
- //to check when it is available.
- //http://msdn.microsoft.com/en-us/library/ms531426.aspx
- if(!dojo.config.skipIeDomLoaded && self === self.top){
- dojo._scrollIntervalId = setInterval(function (){
- try{
- //When dojo is loaded into an iframe in an IE HTML Application
- //(HTA), such as in a selenium test, javascript in the iframe
- //can't see anything outside of it, so self===self.top is true,
- //but the iframe is not the top window and doScroll will be
- //available before document.body is set. Test document.body
- //before trying the doScroll trick
- if(document.body){
- document.documentElement.doScroll("left");
- dojo._loadInit();
- }
- }catch (e){}
- }, 30);
- }
- }
- }
-
- if(dojo.isIE){
- try{
- (function(){
- document.namespaces.add("v", "urn:schemas-microsoft-com:vml");
- var vmlElems = ["*", "group", "roundrect", "oval", "shape", "rect", "imagedata", "path", "textpath", "text"],
- i = 0, l = 1, s = document.createStyleSheet();
- if(dojo.isIE >= 8){
- i = 1;
- l = vmlElems.length;
- }
- for(; i < l; ++i){
- s.addRule("v\\:" + vmlElems[i], "behavior:url(#default#VML); display:inline-block");
- }
- })();
- }catch(e){}
- }
- //END DOMContentLoaded
-
-
- /*
- OpenAjax.subscribe("OpenAjax", "onload", function(){
- if(dojo._inFlightCount == 0){
- dojo._modulesLoaded();
- }
- });
-
- OpenAjax.subscribe("OpenAjax", "onunload", function(){
- dojo.unloaded();
- });
- */
-} //if (typeof window != 'undefined')
-
-//Register any module paths set up in djConfig. Need to do this
-//in the hostenvs since hostenv_browser can read djConfig from a
-//script tag's attribute.
-(function(){
- var mp = dojo.config["modulePaths"];
- if(mp){
- for(var param in mp){
- dojo.registerModulePath(param, mp[param]);
- }
- }
-})();
-
-//Load debug code if necessary.
-if(dojo.config.isDebug){
- dojo.require("dojo._firebug.firebug");
-}
-
-if(dojo.config.debugAtAllCosts){
- // this breaks the new AMD based module loader. The XDomain won't be necessary
- // anyway if you switch to the asynchronous loader
- //dojo.config.useXDomain = true;
- //dojo.require("dojo._base._loader.loader_xd");
- dojo.require("dojo._base._loader.loader_debug");
- dojo.require("dojo.i18n");
-}
-
diff --git a/lib/dojo/_base/_loader/hostenv_rhino.js b/lib/dojo/_base/_loader/hostenv_rhino.js
deleted file mode 100644
index e3aa78524..000000000
--- a/lib/dojo/_base/_loader/hostenv_rhino.js
+++ /dev/null
@@ -1,214 +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
-*/
-
-
-/*
-* Rhino host environment
-*/
-
-if(dojo.config["baseUrl"]){
- dojo.baseUrl = dojo.config["baseUrl"];
-}else{
- dojo.baseUrl = "./";
-}
-
-dojo.locale = dojo.locale || String(java.util.Locale.getDefault().toString().replace('_','-').toLowerCase());
-dojo._name = 'rhino';
-dojo.isRhino = true;
-
-if(typeof print == "function"){
- console.debug = print;
-}
-
-if(!("byId" in dojo)){
- dojo.byId = function(id, doc){
- if(id && (typeof id == "string" || id instanceof String)){
- if(!doc){ doc = document; }
- return doc.getElementById(id);
- }
- return id; // assume it's a node
- }
-}
-
-dojo._isLocalUrl = function(/*String*/ uri) {
- // summary:
- // determines if URI is local or not.
-
- var local = (new java.io.File(uri)).exists();
- if(!local){
- var stream;
- //Try remote URL. Allow this method to throw,
- //but still do cleanup.
- try{
- // try it as a file first, URL second
- stream = (new java.net.URL(uri)).openStream();
- // close the stream so we don't leak resources
- stream.close();
- }finally{
- if(stream && stream.close){
- stream.close();
- }
- }
- }
- return local;
-}
-
-// see comments in spidermonkey loadUri
-dojo._loadUri = function(uri, cb){
- if(dojo._loadedUrls[uri]){
- return true; // Boolean
- }
- try{
- var local;
- try{
- local = dojo._isLocalUrl(uri);
- }catch(e){
- // no debug output; this failure just means the uri was not found.
- return false;
- }
-
- dojo._loadedUrls[uri] = true;
- //FIXME: Use Rhino 1.6 native readFile/readUrl if available?
- if(cb){
- var contents = (local ? readText : readUri)(uri, "UTF-8");
-
- // patch up the input to eval until https://bugzilla.mozilla.org/show_bug.cgi?id=471005 is fixed.
- if(!eval("'\u200f'").length){
- contents = String(contents).replace(/[\u200E\u200F\u202A-\u202E]/g, function(match){
- return "\\u" + match.charCodeAt(0).toString(16);
- })
- }
- contents = /^define\(/.test(contents) ? contents : '('+contents+')';
- cb(eval(contents));
- }else{
- load(uri);
- }
- dojo._loadedUrls.push(uri);
- return true;
- }catch(e){
- dojo._loadedUrls[uri] = false;
- console.debug("rhino load('" + uri + "') failed. Exception: " + e);
- return false;
- }
-}
-
-dojo.exit = function(exitcode){
- quit(exitcode);
-}
-
-// reading a file from disk in Java is a humiliating experience by any measure.
-// Lets avoid that and just get the freaking text
-function readText(path, encoding){
- encoding = encoding || "utf-8";
- // NOTE: we intentionally avoid handling exceptions, since the caller will
- // want to know
- var jf = new java.io.File(path);
- var is = new java.io.FileInputStream(jf);
- return dj_readInputStream(is, encoding);
-}
-
-function readUri(uri, encoding){
- var conn = (new java.net.URL(uri)).openConnection();
- encoding = encoding || conn.getContentEncoding() || "utf-8";
- var is = conn.getInputStream();
- return dj_readInputStream(is, encoding);
-}
-
-function dj_readInputStream(is, encoding){
- var input = new java.io.BufferedReader(new java.io.InputStreamReader(is, encoding));
- try {
- var sb = new java.lang.StringBuffer();
- var line = "";
- while((line = input.readLine()) !== null){
- sb.append(line);
- sb.append(java.lang.System.getProperty("line.separator"));
- }
- return sb.toString();
- } finally {
- input.close();
- }
-}
-
-dojo._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){
- // summary: Read the contents of the specified uri and return those contents.
- // uri:
- // A relative or absolute uri.
- // fail_ok:
- // Default false. If fail_ok and loading fails, return null
- // instead of throwing.
- // returns: The response text. null is returned when there is a
- // failure and failure is okay (an exception otherwise)
- try{
- var local = dojo._isLocalUrl(uri);
- var text = (local ? readText : readUri)(uri, "UTF-8");
- if(text !== null){
- //Force JavaScript string.
- text += "";
- }
- return text;
- }catch(e){
- if(fail_ok){
- return null;
- }else{
- throw e;
- }
- }
-}
-
-// summary:
-// return the document object associated with the dojo.global
-dojo.doc = typeof document != "undefined" ? document : null;
-
-dojo.body = function(){
- return document.body;
-}
-
-// Supply setTimeout/clearTimeout implementations if they aren't already there
-// Note: this assumes that we define both if one is not provided... there might
-// be a better way to do this if there is a use case where one is defined but
-// not the other
-if(typeof setTimeout == "undefined" || typeof clearTimeout == "undefined"){
- dojo._timeouts = [];
- clearTimeout = function(idx){
- if(!dojo._timeouts[idx]){ return; }
- dojo._timeouts[idx].stop();
- }
-
- setTimeout = function(func, delay){
- // summary: provides timed callbacks using Java threads
-
- var def={
- sleepTime:delay,
- hasSlept:false,
-
- run:function(){
- if(!this.hasSlept){
- this.hasSlept=true;
- java.lang.Thread.currentThread().sleep(this.sleepTime);
- }
- try{
- func();
- }catch(e){
- console.debug("Error running setTimeout thread:" + e);
- }
- }
- };
-
- var runnable = new java.lang.Runnable(def);
- var thread = new java.lang.Thread(runnable);
- thread.start();
- return dojo._timeouts.push(thread)-1;
- }
-}
-
-//Register any module paths set up in djConfig. Need to do this
-//in the hostenvs since hostenv_browser can read djConfig from a
-//script tag's attribute.
-if(dojo.config["modulePaths"]){
- for(var param in dojo.config["modulePaths"]){
- dojo.registerModulePath(param, dojo.config["modulePaths"][param]);
- }
-}
diff --git a/lib/dojo/_base/_loader/loader.js b/lib/dojo/_base/_loader/loader.js
deleted file mode 100644
index 73df544fa..000000000
--- a/lib/dojo/_base/_loader/loader.js
+++ /dev/null
@@ -1,816 +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["dojo.foo"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.foo"] = true;
-/*
- * loader.js - A bootstrap module. Runs before the hostenv_*.js file. Contains
- * all of the package loading methods.
- */
-(function(){
- var d = dojo, currentModule;
-
- d.mixin(d, {
- _loadedModules: {},
- _inFlightCount: 0,
- _hasResource: {},
-
- _modulePrefixes: {
- dojo: { name: "dojo", value: "." },
- // dojox: { name: "dojox", value: "../dojox" },
- // dijit: { name: "dijit", value: "../dijit" },
- doh: { name: "doh", value: "../util/doh" },
- tests: { name: "tests", value: "tests" }
- },
-
- _moduleHasPrefix: function(/*String*/module){
- // summary: checks to see if module has been established
- var mp = d._modulePrefixes;
- return !!(mp[module] && mp[module].value); // Boolean
- },
-
- _getModulePrefix: function(/*String*/module){
- // summary: gets the prefix associated with module
- var mp = d._modulePrefixes;
- if(d._moduleHasPrefix(module)){
- return mp[module].value; // String
- }
- return module; // String
- },
-
- _loadedUrls: [],
-
- //WARNING:
- // This variable is referenced by packages outside of bootstrap:
- // FloatingPane.js and undo/browser.js
- _postLoad: false,
-
- //Egad! Lots of test files push on this directly instead of using dojo.addOnLoad.
- _loaders: [],
- _unloaders: [],
- _loadNotifying: false
- });
-
-
- dojo._loadPath = function(/*String*/relpath, /*String?*/module, /*Function?*/cb){
- // summary:
- // Load a Javascript module given a relative path
- //
- // description:
- // Loads and interprets the script located at relpath, which is
- // relative to the script root directory. If the script is found but
- // its interpretation causes a runtime exception, that exception is
- // not caught by us, so the caller will see it. We return a true
- // value if and only if the script is found.
- //
- // relpath:
- // A relative path to a script (no leading '/', and typically ending
- // in '.js').
- // module:
- // A module whose existance to check for after loading a path. Can be
- // used to determine success or failure of the load.
- // cb:
- // a callback function to pass the result of evaluating the script
-
- var uri = ((relpath.charAt(0) == '/' || relpath.match(/^\w+:/)) ? "" : d.baseUrl) + relpath;
- try{
- currentModule = module;
- return !module ? d._loadUri(uri, cb) : d._loadUriAndCheck(uri, module, cb); // Boolean
- }catch(e){
- console.error(e);
- return false; // Boolean
- }finally{
- currentModule = null;
- }
- }
-
- dojo._loadUri = function(/*String*/uri, /*Function?*/cb){
- // summary:
- // Loads JavaScript from a URI
- // description:
- // Reads the contents of the URI, and evaluates the contents. This is
- // used to load modules as well as resource bundles. Returns true if
- // it succeeded. Returns false if the URI reading failed. Throws if
- // the evaluation throws.
- // uri: a uri which points at the script to be loaded
- // cb:
- // a callback function to process the result of evaluating the script
- // as an expression, typically used by the resource bundle loader to
- // load JSON-style resources
-
- if(d._loadedUrls[uri]){
- return true; // Boolean
- }
- d._inFlightCount++; // block addOnLoad calls that arrive while we're busy downloading
- var contents = d._getText(uri, true);
- if(contents){ // not 404, et al
- d._loadedUrls[uri] = true;
- d._loadedUrls.push(uri);
- if(cb){
- //conditional to support script-inject i18n bundle format
- contents = /^define\(/.test(contents) ? contents : '('+contents+')';
- }else{
- //Only do the scoping if no callback. If a callback is specified,
- //it is most likely the i18n bundle stuff.
- contents = d._scopePrefix + contents + d._scopeSuffix;
- }
- if(!d.isIE){ contents += "\r\n//@ sourceURL=" + uri; } // debugging assist for Firebug
- var value = d["eval"](contents);
- if(cb){ cb(value); }
- }
- // Check to see if we need to call _callLoaded() due to an addOnLoad() that arrived while we were busy downloading
- if(--d._inFlightCount == 0 && d._postLoad && d._loaders.length){
- // We shouldn't be allowed to get here but Firefox allows an event
- // (mouse, keybd, async xhrGet) to interrupt a synchronous xhrGet.
- // If the current script block contains multiple require() statements, then after each
- // require() returns, inFlightCount == 0, but we want to hold the _callLoaded() until
- // all require()s are done since the out-of-sequence addOnLoad() presumably needs them all.
- // setTimeout allows the next require() to start (if needed), and then we check this again.
- setTimeout(function(){
- // If inFlightCount > 0, then multiple require()s are running sequentially and
- // the next require() started after setTimeout() was executed but before we got here.
- if(d._inFlightCount == 0){
- d._callLoaded();
- }
- }, 0);
- }
- return !!contents; // Boolean: contents? true : false
- }
-
- // FIXME: probably need to add logging to this method
- dojo._loadUriAndCheck = function(/*String*/uri, /*String*/moduleName, /*Function?*/cb){
- // summary: calls loadUri then findModule and returns true if both succeed
- var ok = false;
- try{
- ok = d._loadUri(uri, cb);
- }catch(e){
- console.error("failed loading " + uri + " with error: " + e);
- }
- return !!(ok && d._loadedModules[moduleName]); // Boolean
- }
-
- dojo.loaded = function(){
- // summary:
- // signal fired when initial environment and package loading is
- // complete. You should use dojo.addOnLoad() instead of doing a
- // direct dojo.connect() to this method in order to handle
- // initialization tasks that require the environment to be
- // initialized. In a browser host, declarative widgets will
- // be constructed when this function finishes runing.
- d._loadNotifying = true;
- d._postLoad = true;
- var mll = d._loaders;
-
- //Clear listeners so new ones can be added
- //For other xdomain package loads after the initial load.
- d._loaders = [];
-
- for(var x = 0; x < mll.length; x++){
- mll[x]();
- }
-
- d._loadNotifying = false;
-
- //Make sure nothing else got added to the onload queue
- //after this first run. If something did, and we are not waiting for any
- //more inflight resources, run again.
- if(d._postLoad && d._inFlightCount == 0 && mll.length){
- d._callLoaded();
- }
- }
-
- dojo.unloaded = function(){
- // summary:
- // signal fired by impending environment destruction. You should use
- // dojo.addOnUnload() instead of doing a direct dojo.connect() to this
- // method to perform page/application cleanup methods. See
- // dojo.addOnUnload for more info.
- var mll = d._unloaders;
- while(mll.length){
- (mll.pop())();
- }
- }
-
- d._onto = function(arr, obj, fn){
- if(!fn){
- arr.push(obj);
- }else if(fn){
- var func = (typeof fn == "string") ? obj[fn] : fn;
- arr.push(function(){ func.call(obj); });
- }
- }
-
- dojo.ready = dojo.addOnLoad = function(/*Object*/obj, /*String|Function?*/functionName){
- // summary:
- // Registers a function to be triggered after the DOM and dojo.require() calls
- // have finished loading.
- //
- // description:
- // Registers a function to be triggered after the DOM has finished
- // loading and `dojo.require` modules have loaded. Widgets declared in markup
- // have been instantiated if `djConfig.parseOnLoad` is true when this fires.
- //
- // Images and CSS files may or may not have finished downloading when
- // the specified function is called. (Note that widgets' CSS and HTML
- // code is guaranteed to be downloaded before said widgets are
- // instantiated, though including css resouces BEFORE any script elements
- // is highly recommended).
- //
- // example:
- // Register an anonymous function to run when everything is ready
- // | dojo.addOnLoad(function(){ doStuff(); });
- //
- // example:
- // Register a function to run when everything is ready by pointer:
- // | var init = function(){ doStuff(); }
- // | dojo.addOnLoad(init);
- //
- // example:
- // Register a function to run scoped to `object`, either by name or anonymously:
- // | dojo.addOnLoad(object, "functionName");
- // | dojo.addOnLoad(object, function(){ doStuff(); });
-
- d._onto(d._loaders, obj, functionName);
-
- //Added for xdomain loading. dojo.addOnLoad is used to
- //indicate callbacks after doing some dojo.require() statements.
- //In the xdomain case, if all the requires are loaded (after initial
- //page load), then immediately call any listeners.
- if(d._postLoad && d._inFlightCount == 0 && !d._loadNotifying){
- d._callLoaded();
- }
- }
-
- //Support calling dojo.addOnLoad via djConfig.addOnLoad. Support all the
- //call permutations of dojo.addOnLoad. Mainly useful when dojo is added
- //to the page after the page has loaded.
- var dca = d.config.addOnLoad;
- if(dca){
- d.addOnLoad[(dca instanceof Array ? "apply" : "call")](d, dca);
- }
-
- dojo._modulesLoaded = function(){
- if(d._postLoad){ return; }
- if(d._inFlightCount > 0){
- console.warn("files still in flight!");
- return;
- }
- d._callLoaded();
- }
-
- dojo._callLoaded = function(){
-
- // The "object" check is for IE, and the other opera check fixes an
- // issue in Opera where it could not find the body element in some
- // widget test cases. For 0.9, maybe route all browsers through the
- // setTimeout (need protection still for non-browser environments
- // though). This might also help the issue with FF 2.0 and freezing
- // issues where we try to do sync xhr while background css images are
- // being loaded (trac #2572)? Consider for 0.9.
- if(typeof setTimeout == "object" || (d.config.useXDomain && d.isOpera)){
- setTimeout(
- d.isAIR ? function(){ d.loaded(); } : d._scopeName + ".loaded();",
- 0);
- }else{
- d.loaded();
- }
- }
-
- dojo._getModuleSymbols = function(/*String*/modulename){
- // summary:
- // Converts a module name in dotted JS notation to an array
- // representing the path in the source tree
- var syms = modulename.split(".");
- for(var i = syms.length; i>0; i--){
- var parentModule = syms.slice(0, i).join(".");
- if(i == 1 && !d._moduleHasPrefix(parentModule)){
- // Support default module directory (sibling of dojo) for top-level modules
- syms[0] = "../" + syms[0];
- }else{
- var parentModulePath = d._getModulePrefix(parentModule);
- if(parentModulePath != parentModule){
- syms.splice(0, i, parentModulePath);
- break;
- }
- }
- }
- return syms; // Array
- }
-
- dojo._global_omit_module_check = false;
-
- dojo.loadInit = function(/*Function*/init){
- // summary:
- // Executes a function that needs to be executed for the loader's dojo.requireIf
- // resolutions to work. This is needed mostly for the xdomain loader case where
- // a function needs to be executed to set up the possible values for a dojo.requireIf
- // call.
- // init:
- // a function reference. Executed immediately.
- // description: This function is mainly a marker for the xdomain loader to know parts of
- // code that needs be executed outside the function wrappper that is placed around modules.
- // The init function could be executed more than once, and it should make no assumptions
- // on what is loaded, or what modules are available. Only the functionality in Dojo Base
- // is allowed to be used. Avoid using this method. For a valid use case,
- // see the source for dojox.gfx.
- init();
- }
-
- dojo._loadModule = dojo.require = function(/*String*/moduleName, /*Boolean?*/omitModuleCheck){
- // summary:
- // loads a Javascript module from the appropriate URI
- //
- // moduleName: String
- // module name to load, using periods for separators,
- // e.g. "dojo.date.locale". Module paths are de-referenced by dojo's
- // internal mapping of locations to names and are disambiguated by
- // longest prefix. See `dojo.registerModulePath()` for details on
- // registering new modules.
- //
- // omitModuleCheck: Boolean?
- // if `true`, omitModuleCheck skips the step of ensuring that the
- // loaded file actually defines the symbol it is referenced by.
- // For example if it called as `dojo.require("a.b.c")` and the
- // file located at `a/b/c.js` does not define an object `a.b.c`,
- // and exception will be throws whereas no exception is raised
- // when called as `dojo.require("a.b.c", true)`
- //
- // description:
- // Modules are loaded via dojo.require by using one of two loaders: the normal loader
- // and the xdomain loader. The xdomain loader is used when dojo was built with a
- // custom build that specified loader=xdomain and the module lives on a modulePath
- // that is a whole URL, with protocol and a domain. The versions of Dojo that are on
- // the Google and AOL CDNs use the xdomain loader.
- //
- // If the module is loaded via the xdomain loader, it is an asynchronous load, since
- // the module is added via a dynamically created script tag. This
- // means that dojo.require() can return before the module has loaded. However, this
- // should only happen in the case where you do dojo.require calls in the top-level
- // HTML page, or if you purposely avoid the loader checking for dojo.require
- // dependencies in your module by using a syntax like dojo["require"] to load the module.
- //
- // Sometimes it is useful to not have the loader detect the dojo.require calls in the
- // module so that you can dynamically load the modules as a result of an action on the
- // page, instead of right at module load time.
- //
- // Also, for script blocks in an HTML page, the loader does not pre-process them, so
- // it does not know to download the modules before the dojo.require calls occur.
- //
- // So, in those two cases, when you want on-the-fly module loading or for script blocks
- // in the HTML page, special care must be taken if the dojo.required code is loaded
- // asynchronously. To make sure you can execute code that depends on the dojo.required
- // modules, be sure to add the code that depends on the modules in a dojo.addOnLoad()
- // callback. dojo.addOnLoad waits for all outstanding modules to finish loading before
- // executing.
- //
- // This type of syntax works with both xdomain and normal loaders, so it is good
- // practice to always use this idiom for on-the-fly code loading and in HTML script
- // blocks. If at some point you change loaders and where the code is loaded from,
- // it will all still work.
- //
- // More on how dojo.require
- // `dojo.require("A.B")` first checks to see if symbol A.B is
- // defined. If it is, it is simply returned (nothing to do).
- //
- // If it is not defined, it will look for `A/B.js` in the script root
- // directory.
- //
- // `dojo.require` throws an exception if it cannot find a file
- // to load, or if the symbol `A.B` is not defined after loading.
- //
- // It returns the object `A.B`, but note the caveats above about on-the-fly loading and
- // HTML script blocks when the xdomain loader is loading a module.
- //
- // `dojo.require()` does nothing about importing symbols into
- // the current namespace. It is presumed that the caller will
- // take care of that.
- //
- // example:
- // To use dojo.require in conjunction with dojo.ready:
- //
- // | dojo.require("foo");
- // | dojo.require("bar");
- // | dojo.addOnLoad(function(){
- // | //you can now safely do something with foo and bar
- // | });
- //
- // example:
- // For example, to import all symbols into a local block, you might write:
- //
- // | with (dojo.require("A.B")) {
- // | ...
- // | }
- //
- // And to import just the leaf symbol to a local variable:
- //
- // | var B = dojo.require("A.B");
- // | ...
- //
- // returns:
- // the required namespace object
- omitModuleCheck = d._global_omit_module_check || omitModuleCheck;
-
- //Check if it is already loaded.
- var module = d._loadedModules[moduleName];
- if(module){
- return module;
- }
-
- // convert periods to slashes
- var relpath = d._getModuleSymbols(moduleName).join("/") + '.js';
- var modArg = !omitModuleCheck ? moduleName : null;
- var ok = d._loadPath(relpath, modArg);
- if(!ok && !omitModuleCheck){
- throw new Error("Could not load '" + moduleName + "'; last tried '" + relpath + "'");
- }
-
- // check that the symbol was defined
- // Don't bother if we're doing xdomain (asynchronous) loading.
- if(!omitModuleCheck && !d._isXDomain){
- // pass in false so we can give better error
- module = d._loadedModules[moduleName];
- if(!module){
- throw new Error("symbol '" + moduleName + "' is not defined after loading '" + relpath + "'");
- }
- }
-
- return module;
- }
-
- dojo.provide = function(/*String*/ resourceName){
- // summary:
- // Register a resource with the package system. Works in conjunction with `dojo.require`
- //
- // description:
- // Each javascript source file is called a resource. When a
- // resource is loaded by the browser, `dojo.provide()` registers
- // that it has been loaded.
- //
- // Each javascript source file must have at least one
- // `dojo.provide()` call at the top of the file, corresponding to
- // the file name. For example, `js/dojo/foo.js` must have
- // `dojo.provide("dojo.foo");` before any calls to
- // `dojo.require()` are made.
- //
- // For backwards compatibility reasons, in addition to registering
- // the resource, `dojo.provide()` also ensures that the javascript
- // object for the module exists. For example,
- // `dojo.provide("dojox.data.FlickrStore")`, in addition to
- // registering that `FlickrStore.js` is a resource for the
- // `dojox.data` module, will ensure that the `dojox.data`
- // javascript object exists, so that calls like
- // `dojo.data.foo = function(){ ... }` don't fail.
- //
- // In the case of a build where multiple javascript source files
- // are combined into one bigger file (similar to a .lib or .jar
- // file), that file may contain multiple dojo.provide() calls, to
- // note that it includes multiple resources.
- //
- // resourceName: String
- // A dot-sperated string identifying a resource.
- //
- // example:
- // Safely create a `my` object, and make dojo.require("my.CustomModule") work
- // | dojo.provide("my.CustomModule");
-
- //Make sure we have a string.
- resourceName = resourceName + "";
- return (d._loadedModules[resourceName] = d.getObject(resourceName, true)); // Object
- }
-
- //Start of old bootstrap2:
-
- dojo.platformRequire = function(/*Object*/modMap){
- // summary:
- // require one or more modules based on which host environment
- // Dojo is currently operating in
- // description:
- // This method takes a "map" of arrays which one can use to
- // optionally load dojo modules. The map is indexed by the
- // possible dojo.name_ values, with two additional values:
- // "default" and "common". The items in the "default" array will
- // be loaded if none of the other items have been choosen based on
- // dojo.name_, set by your host environment. The items in the
- // "common" array will *always* be loaded, regardless of which
- // list is chosen.
- // example:
- // | dojo.platformRequire({
- // | browser: [
- // | "foo.sample", // simple module
- // | "foo.test",
- // | ["foo.bar.baz", true] // skip object check in _loadModule (dojo.require)
- // | ],
- // | default: [ "foo.sample._base" ],
- // | common: [ "important.module.common" ]
- // | });
-
- var common = modMap.common || [];
- var result = common.concat(modMap[d._name] || modMap["default"] || []);
-
- for(var x=0; x<result.length; x++){
- var curr = result[x];
- if(curr.constructor == Array){
- d._loadModule.apply(d, curr);
- }else{
- d._loadModule(curr);
- }
- }
- }
-
- dojo.requireIf = function(/*Boolean*/ condition, /*String*/ resourceName){
- // summary:
- // If the condition is true then call `dojo.require()` for the specified
- // resource
- //
- // example:
- // | dojo.requireIf(dojo.isBrowser, "my.special.Module");
-
- if(condition === true){
- // FIXME: why do we support chained require()'s here? does the build system?
- var args = [];
- for(var i = 1; i < arguments.length; i++){
- args.push(arguments[i]);
- }
- d.require.apply(d, args);
- }
- }
-
- dojo.requireAfterIf = d.requireIf;
-
- dojo.registerModulePath = function(/*String*/module, /*String*/prefix){
- // summary:
- // Maps a module name to a path
- // description:
- // An unregistered module is given the default path of ../[module],
- // relative to Dojo root. For example, module acme is mapped to
- // ../acme. If you want to use a different module name, use
- // dojo.registerModulePath.
- // example:
- // If your dojo.js is located at this location in the web root:
- // | /myapp/js/dojo/dojo/dojo.js
- // and your modules are located at:
- // | /myapp/js/foo/bar.js
- // | /myapp/js/foo/baz.js
- // | /myapp/js/foo/thud/xyzzy.js
- // Your application can tell Dojo to locate the "foo" namespace by calling:
- // | dojo.registerModulePath("foo", "../../foo");
- // At which point you can then use dojo.require() to load the
- // modules (assuming they provide() the same things which are
- // required). The full code might be:
- // | <script type="text/javascript"
- // | src="/myapp/js/dojo/dojo/dojo.js"></script>
- // | <script type="text/javascript">
- // | dojo.registerModulePath("foo", "../../foo");
- // | dojo.require("foo.bar");
- // | dojo.require("foo.baz");
- // | dojo.require("foo.thud.xyzzy");
- // | </script>
- d._modulePrefixes[module] = { name: module, value: prefix };
- };
-
- dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){
- // summary:
- // Declares translated resources and loads them if necessary, in the
- // same style as dojo.require. Contents of the resource bundle are
- // typically strings, but may be any name/value pair, represented in
- // JSON format. See also `dojo.i18n.getLocalization`.
- //
- // description:
- // Load translated resource bundles provided underneath the "nls"
- // directory within a package. Translated resources may be located in
- // different packages throughout the source tree.
- //
- // Each directory is named for a locale as specified by RFC 3066,
- // (http://www.ietf.org/rfc/rfc3066.txt), normalized in lowercase.
- // Note that the two bundles in the example do not define all the
- // same variants. For a given locale, bundles will be loaded for
- // that locale and all more general locales above it, including a
- // fallback at the root directory. For example, a declaration for
- // the "de-at" locale will first load `nls/de-at/bundleone.js`,
- // then `nls/de/bundleone.js` and finally `nls/bundleone.js`. The
- // data will be flattened into a single Object so that lookups
- // will follow this cascading pattern. An optional build step can
- // preload the bundles to avoid data redundancy and the multiple
- // network hits normally required to load these resources.
- //
- // moduleName:
- // name of the package containing the "nls" directory in which the
- // bundle is found
- //
- // bundleName:
- // bundle name, i.e. the filename without the '.js' suffix. Using "nls" as a
- // a bundle name is not supported, since "nls" is the name of the folder
- // that holds bundles. Using "nls" as the bundle name will cause problems
- // with the custom build.
- //
- // locale:
- // the locale to load (optional) By default, the browser's user
- // locale as defined by dojo.locale
- //
- // availableFlatLocales:
- // A comma-separated list of the available, flattened locales for this
- // bundle. This argument should only be set by the build process.
- //
- // example:
- // A particular widget may define one or more resource bundles,
- // structured in a program as follows, where moduleName is
- // mycode.mywidget and bundleNames available include bundleone and
- // bundletwo:
- // | ...
- // | mycode/
- // | mywidget/
- // | nls/
- // | bundleone.js (the fallback translation, English in this example)
- // | bundletwo.js (also a fallback translation)
- // | de/
- // | bundleone.js
- // | bundletwo.js
- // | de-at/
- // | bundleone.js
- // | en/
- // | (empty; use the fallback translation)
- // | en-us/
- // | bundleone.js
- // | en-gb/
- // | bundleone.js
- // | es/
- // | bundleone.js
- // | bundletwo.js
- // | ...etc
- // | ...
- //
-
- d.require("dojo.i18n");
- d.i18n._requireLocalization.apply(d.hostenv, arguments);
- };
-
-
- var ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),
- ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$");
-
- dojo._Url = function(/*dojo._Url|String...*/){
- // summary:
- // Constructor to create an object representing a URL.
- // It is marked as private, since we might consider removing
- // or simplifying it.
- // description:
- // Each argument is evaluated in order relative to the next until
- // a canonical uri is produced. To get an absolute Uri relative to
- // the current document use:
- // new dojo._Url(document.baseURI, url)
-
- var n = null,
- _a = arguments,
- uri = [_a[0]];
- // resolve uri components relative to each other
- for(var i = 1; i<_a.length; i++){
- if(!_a[i]){ continue; }
-
- // Safari doesn't support this.constructor so we have to be explicit
- // FIXME: Tracked (and fixed) in Webkit bug 3537.
- // http://bugs.webkit.org/show_bug.cgi?id=3537
- var relobj = new d._Url(_a[i]+""),
- uriobj = new d._Url(uri[0]+"");
-
- if(
- relobj.path == "" &&
- !relobj.scheme &&
- !relobj.authority &&
- !relobj.query
- ){
- if(relobj.fragment != n){
- uriobj.fragment = relobj.fragment;
- }
- relobj = uriobj;
- }else if(!relobj.scheme){
- relobj.scheme = uriobj.scheme;
-
- if(!relobj.authority){
- relobj.authority = uriobj.authority;
-
- if(relobj.path.charAt(0) != "/"){
- var path = uriobj.path.substring(0,
- uriobj.path.lastIndexOf("/") + 1) + relobj.path;
-
- var segs = path.split("/");
- for(var j = 0; j < segs.length; j++){
- if(segs[j] == "."){
- // flatten "./" references
- if(j == segs.length - 1){
- segs[j] = "";
- }else{
- segs.splice(j, 1);
- j--;
- }
- }else if(j > 0 && !(j == 1 && segs[0] == "") &&
- segs[j] == ".." && segs[j-1] != ".."){
- // flatten "../" references
- if(j == (segs.length - 1)){
- segs.splice(j, 1);
- segs[j - 1] = "";
- }else{
- segs.splice(j - 1, 2);
- j -= 2;
- }
- }
- }
- relobj.path = segs.join("/");
- }
- }
- }
-
- uri = [];
- if(relobj.scheme){
- uri.push(relobj.scheme, ":");
- }
- if(relobj.authority){
- uri.push("//", relobj.authority);
- }
- uri.push(relobj.path);
- if(relobj.query){
- uri.push("?", relobj.query);
- }
- if(relobj.fragment){
- uri.push("#", relobj.fragment);
- }
- }
-
- this.uri = uri.join("");
-
- // break the uri into its main components
- var r = this.uri.match(ore);
-
- this.scheme = r[2] || (r[1] ? "" : n);
- this.authority = r[4] || (r[3] ? "" : n);
- this.path = r[5]; // can never be undefined
- this.query = r[7] || (r[6] ? "" : n);
- this.fragment = r[9] || (r[8] ? "" : n);
-
- if(this.authority != n){
- // server based naming authority
- r = this.authority.match(ire);
-
- this.user = r[3] || n;
- this.password = r[4] || n;
- this.host = r[6] || r[7]; // ipv6 || ipv4
- this.port = r[9] || n;
- }
- }
-
- dojo._Url.prototype.toString = function(){ return this.uri; };
-
- dojo.moduleUrl = function(/*String*/module, /*dojo._Url||String*/url){
- // summary:
- // Returns a `dojo._Url` object relative to a module.
- // example:
- // | var pngPath = dojo.moduleUrl("acme","images/small.png");
- // | console.dir(pngPath); // list the object properties
- // | // create an image and set it's source to pngPath's value:
- // | var img = document.createElement("img");
- // | // NOTE: we assign the string representation of the url object
- // | img.src = pngPath.toString();
- // | // add our image to the document
- // | dojo.body().appendChild(img);
- // example:
- // you may de-reference as far as you like down the package
- // hierarchy. This is sometimes handy to avoid lenghty relative
- // urls or for building portable sub-packages. In this example,
- // the `acme.widget` and `acme.util` directories may be located
- // under different roots (see `dojo.registerModulePath`) but the
- // the modules which reference them can be unaware of their
- // relative locations on the filesystem:
- // | // somewhere in a configuration block
- // | dojo.registerModulePath("acme.widget", "../../acme/widget");
- // | dojo.registerModulePath("acme.util", "../../util");
- // |
- // | // ...
- // |
- // | // code in a module using acme resources
- // | var tmpltPath = dojo.moduleUrl("acme.widget","templates/template.html");
- // | var dataPath = dojo.moduleUrl("acme.util","resources/data.json");
-
- var loc = d._getModuleSymbols(module).join('/');
- if(!loc){ return null; }
- if(loc.lastIndexOf("/") != loc.length-1){
- loc += "/";
- }
-
- //If the path is an absolute path (starts with a / or is on another
- //domain/xdomain) then don't add the baseUrl.
- var colonIndex = loc.indexOf(":");
- if(loc.charAt(0) != "/" && (colonIndex == -1 || colonIndex > loc.indexOf("/"))){
- loc = d.baseUrl + loc;
- }
-
- return new d._Url(loc, url); // dojo._Url
- };
-
-
-
-})();
-
-}
diff --git a/lib/dojo/_base/_loader/loader_debug.js b/lib/dojo/_base/_loader/loader_debug.js
deleted file mode 100644
index f2043e4de..000000000
--- a/lib/dojo/_base/_loader/loader_debug.js
+++ /dev/null
@@ -1,86 +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["dojo._base._loader.loader_debug"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base._loader.loader_debug"] = true;
-dojo.provide("dojo._base._loader.loader_debug");
-
-//Override dojo.provide, so we can trigger the next
-//script tag for the next local module. We can only add one
-//at a time because there are browsers that execute script tags
-//in the order that the code is received, and not in the DOM order.
-dojo.nonDebugProvide = dojo.provide;
-
-dojo.provide = function(resourceName){
- var dbgQueue = dojo["_xdDebugQueue"];
- if(dbgQueue && dbgQueue.length > 0 && resourceName == dbgQueue["currentResourceName"]){
- //Set a timeout so the module can be executed into existence. Normally the
- //dojo.provide call in a module is the first line. Don't want to risk attaching
- //another script tag until the current one finishes executing.
- if(dojo.isAIR){
- window.setTimeout(function(){dojo._xdDebugFileLoaded(resourceName);}, 1);
- }else{
- window.setTimeout(dojo._scopeName + "._xdDebugFileLoaded('" + resourceName + "')", 1);
- }
- }
-
- return dojo.nonDebugProvide.apply(dojo, arguments);
-}
-
-dojo._xdDebugFileLoaded = function(resourceName){
-
- if(!dojo._xdDebugScopeChecked){
- //If using a scoped dojo, we need to expose dojo as a real global
- //for the debugAtAllCosts stuff to work.
- if(dojo._scopeName != "dojo"){
- window.dojo = window[dojo.config.scopeMap[0][1]];
- window.dijit = window[dojo.config.scopeMap[1][1]];
- window.dojox = window[dojo.config.scopeMap[2][1]];
- }
-
- dojo._xdDebugScopeChecked = true;
- }
-
- var dbgQueue = dojo._xdDebugQueue;
-
- if(resourceName && resourceName == dbgQueue.currentResourceName){
- dbgQueue.shift();
- }
-
- if(dbgQueue.length == 0){
- //Check for more modules that need debug loading.
- //dojo._xdWatchInFlight will add more things to the debug
- //queue if they just recently loaded but it was not detected
- //between the dojo._xdWatchInFlight intervals.
- dojo._xdWatchInFlight();
- }
-
- if(dbgQueue.length == 0){
- dbgQueue.currentResourceName = null;
-
- //Make sure nothing else is in flight.
- //If something is still in flight, then it still
- //needs to be added to debug queue after it loads.
- for(var param in dojo._xdInFlight){
- if(dojo._xdInFlight[param] === true){
- return;
- }
- }
-
- dojo._xdNotifyLoaded();
- }else{
- if(resourceName == dbgQueue.currentResourceName){
- dbgQueue.currentResourceName = dbgQueue[0].resourceName;
- var element = document.createElement("script");
- element.type = "text/javascript";
- element.src = dbgQueue[0].resourcePath;
- document.getElementsByTagName("head")[0].appendChild(element);
- }
- }
-}
-
-}
diff --git a/lib/dojo/_base/_loader/loader_xd.js b/lib/dojo/_base/_loader/loader_xd.js
deleted file mode 100644
index e59f814c0..000000000
--- a/lib/dojo/_base/_loader/loader_xd.js
+++ /dev/null
@@ -1,727 +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["dojo._base._loader.loader_xd"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base._loader.loader_xd"] = true;
-//Cross-domain resource loader.
-dojo.provide("dojo._base._loader.loader_xd");
-
-dojo._xdReset = function(){
- //summary: Internal xd loader function. Resets the xd state.
-
- //This flag indicates where or not we have crossed into xdomain territory. Once any resource says
- //it is cross domain, then the rest of the resources have to be treated as xdomain because we need
- //to evaluate resources in order. If there is a xdomain resource followed by a xhr resource, we can't load
- //the xhr resource until the one before it finishes loading. The text of the xhr resource will be converted
- //to match the format for a xd resource and put in the xd load queue.
- dojo._isXDomain = dojo.config.useXDomain || false;
-
- dojo._xdClearInterval();
- dojo._xdInFlight = {};
- dojo._xdOrderedReqs = [];
- dojo._xdDepMap = {};
- dojo._xdContents = [];
- dojo._xdDefList = [];
-}
-
-dojo._xdClearInterval = function(){
- //summary: Internal xd loader function.
- //Clears the interval timer used to check on the
- //status of in-flight xd module resource requests.
- if(dojo._xdTimer){
- clearInterval(dojo._xdTimer);
- dojo._xdTimer = 0;
- }
-}
-
-
-//Call reset immediately to set the state.
-dojo._xdReset();
-
-dojo._xdCreateResource = function(/*String*/contents, /*String*/resourceName, /*String*/resourcePath){
- //summary: Internal xd loader function. Creates an xd module source given an
- //non-xd module contents.
-
- //Remove comments. Not perfect, but good enough for dependency resolution.
- var depContents = contents.replace(/(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg , "");
-
- //Find dependencies.
- var deps = [];
- var depRegExp = /dojo.(require|requireIf|provide|requireAfterIf|platformRequire|requireLocalization)\s*\(([\w\W]*?)\)/mg;
- var match;
- while((match = depRegExp.exec(depContents)) != null){
- if(match[1] == "requireLocalization"){
- //Need to load the local bundles asap, since they are not
- //part of the list of modules watched for loading.
- eval(match[0]);
- }else{
- deps.push('"' + match[1] + '", ' + match[2]);
- }
- }
-
- //Create resource object and the call to _xdResourceLoaded.
- var output = [];
- output.push(dojo._scopeName + "._xdResourceLoaded(function(" + dojo._scopePrefixArgs + "){\n");
-
- //See if there are any dojo.loadInit calls
- var loadInitCalls = dojo._xdExtractLoadInits(contents);
- if(loadInitCalls){
- //Adjust fileContents since extractLoadInits removed something.
- contents = loadInitCalls[0];
-
- //Add any loadInit calls to the top of the xd file.
- for(var i = 1; i < loadInitCalls.length; i++){
- output.push(loadInitCalls[i] + ";\n");
- }
- }
-
- output.push("return {");
-
- //Add dependencies
- if(deps.length > 0){
- output.push("depends: [");
- for(i = 0; i < deps.length; i++){
- if(i > 0){
- output.push(",\n");
- }
- output.push("[" + deps[i] + "]");
- }
- output.push("],");
- }
-
- //Add the contents of the file inside a function.
- //Pass in scope arguments so we can support multiple versions of the
- //same module on a page.
- output.push("\ndefineResource: function(" + dojo._scopePrefixArgs + "){");
-
- //Don't put in the contents in the debugAtAllCosts case
- //since the contents may have syntax errors. Let those
- //get pushed up when the script tags are added to the page
- //in the debugAtAllCosts case.
- if(!dojo.config["debugAtAllCosts"] || resourceName == "dojo._base._loader.loader_debug"){
- output.push(contents);
- }
- //Add isLocal property so we know if we have to do something different
- //in debugAtAllCosts situations.
- output.push("\n}, resourceName: '" + resourceName + "', resourcePath: '" + resourcePath + "'};});");
-
- return output.join(""); //String
-}
-
-dojo._xdExtractLoadInits = function(/*String*/fileContents){
- //Extracts
- var regexp = /dojo.loadInit\s*\(/g;
- regexp.lastIndex = 0;
-
- var parenRe = /[\(\)]/g;
- parenRe.lastIndex = 0;
-
- var results = [];
- var matches;
- while((matches = regexp.exec(fileContents))){
- //Find end of the call by finding the matching end paren
- parenRe.lastIndex = regexp.lastIndex;
- var matchCount = 1;
- var parenMatch;
- while((parenMatch = parenRe.exec(fileContents))){
- if(parenMatch[0] == ")"){
- matchCount -= 1;
- }else{
- matchCount += 1;
- }
- if(matchCount == 0){
- break;
- }
- }
-
- if(matchCount != 0){
- throw "unmatched paren around character " + parenRe.lastIndex + " in: " + fileContents;
- }
-
- //Put the master matching string in the results.
- var startIndex = regexp.lastIndex - matches[0].length;
- results.push(fileContents.substring(startIndex, parenRe.lastIndex));
-
- //Remove the matching section.
- var remLength = parenRe.lastIndex - startIndex;
- fileContents = fileContents.substring(0, startIndex) + fileContents.substring(parenRe.lastIndex, fileContents.length);
-
- //Move the master regexp past the last matching paren point.
- regexp.lastIndex = parenRe.lastIndex - remLength;
-
- regexp.lastIndex = parenRe.lastIndex;
- }
-
- if(results.length > 0){
- results.unshift(fileContents);
- }
-
- return (results.length ? results : null);
-}
-
-dojo._xdIsXDomainPath = function(/*string*/relpath) {
- //summary: Figure out whether the path is local or x-domain
- //If there is a colon before the first / then, we have a URL with a protocol.
-
- var colonIndex = relpath.indexOf(":");
- var slashIndex = relpath.indexOf("/");
-
- if(colonIndex > 0 && colonIndex < slashIndex || relpath.indexOf("//") === 0){
- return true;
- }else{
- //Is the base script URI-based URL a cross domain URL?
- //If so, then the relpath will be evaluated relative to
- //baseUrl, and therefore qualify as xdomain.
- //Only treat it as xdomain if the page does not have a
- //host (file:// url), if the baseUrl does not match the
- //current window's domain, or if the baseUrl starts with //.
- //If baseUrl starts with // then it probably means that xdomain
- //is wanted since it is such a specific path request. This is not completely robust,
- //but something more robust would require normalizing the protocol on baseUrl and on the location
- //to see if they differ. However, that requires more code, and // as a start path is unusual.
- var url = dojo.baseUrl;
- colonIndex = url.indexOf(":");
- slashIndex = url.indexOf("/");
- if(url.indexOf("//") === 0 || (colonIndex > 0 && colonIndex < slashIndex && (!location.host || url.indexOf("http://" + location.host) != 0))){
- return true;
- }
- }
- return false;
-}
-
-dojo._loadPath = function(/*String*/relpath, /*String?*/module, /*Function?*/cb){
- //summary: Internal xd loader function. Overrides loadPath() from loader.js.
- //xd loading requires slightly different behavior from loadPath().
-
- var currentIsXDomain = dojo._xdIsXDomainPath(relpath);
- dojo._isXDomain |= currentIsXDomain;
-
- var uri = ((relpath.charAt(0) == '/' || relpath.match(/^\w+:/)) ? "" : dojo.baseUrl) + relpath;
-
- try{
- return ((!module || dojo._isXDomain) ? dojo._loadUri(uri, cb, currentIsXDomain, module) : dojo._loadUriAndCheck(uri, module, cb)); //Boolean
- }catch(e){
- console.error(e);
- return false; //Boolean
- }
-}
-
-dojo._xdCharSet = "utf-8";
-
-dojo._loadUri = function(/*String*/uri, /*Function?*/cb, /*boolean*/currentIsXDomain, /*String?*/module){
- //summary: Internal xd loader function. Overrides loadUri() from loader.js.
- // xd loading requires slightly different behavior from loadPath().
- //description: Wanted to override getText(), but it is used by
- // the widget code in too many, synchronous ways right now.
- if(dojo._loadedUrls[uri]){
- return 1; //Boolean
- }
-
- //Add the module (resource) to the list of modules.
- //Only do this work if we have a modlue name. Otherwise,
- //it is a non-xd i18n bundle, which can load immediately and does not
- //need to be tracked. Also, don't track dojo.i18n, since it is a prerequisite
- //and will be loaded correctly if we load it right away: it has no dependencies.
- if(dojo._isXDomain && module && module != "dojo.i18n"){
- dojo._xdOrderedReqs.push(module);
-
- //Add to waiting resources if it is an xdomain resource.
- //Don't add non-xdomain i18n bundles, those get evaled immediately.
- if(currentIsXDomain || uri.indexOf("/nls/") == -1){
- dojo._xdInFlight[module] = true;
-
- //Increment inFlightCount
- //This will stop the modulesLoaded from firing all the way.
- dojo._inFlightCount++;
- }
-
- //Start timer
- if(!dojo._xdTimer){
- if(dojo.isAIR){
- dojo._xdTimer = setInterval(function(){dojo._xdWatchInFlight();}, 100);
- }else{
- dojo._xdTimer = setInterval(dojo._scopeName + "._xdWatchInFlight();", 100);
- }
- }
- dojo._xdStartTime = (new Date()).getTime();
- }
-
- if (currentIsXDomain){
- //Fix name to be a .xd.fileextension name.
- var lastIndex = uri.lastIndexOf('.');
- if(lastIndex <= 0){
- lastIndex = uri.length - 1;
- }
-
- var xdUri = uri.substring(0, lastIndex) + ".xd";
- if(lastIndex != uri.length - 1){
- xdUri += uri.substring(lastIndex, uri.length);
- }
-
- if (dojo.isAIR){
- xdUri = xdUri.replace("app:/", "/");
- }
-
- //Add to script src
- var element = document.createElement("script");
- element.type = "text/javascript";
- if(dojo._xdCharSet){
- element.charset = dojo._xdCharSet;
- }
- element.src = xdUri;
- if(!dojo.headElement){
- dojo._headElement = document.getElementsByTagName("head")[0];
-
- //Head element may not exist, particularly in html
- //html 4 or tag soup cases where the page does not
- //have a head tag in it. Use html element, since that will exist.
- //Seems to be an issue mostly with Opera 9 and to lesser extent Safari 2
- if(!dojo._headElement){
- dojo._headElement = document.getElementsByTagName("html")[0];
- }
- }
- dojo._headElement.appendChild(element);
- }else{
- var contents = dojo._getText(uri, null, true);
- if(contents == null){ return 0; /*boolean*/}
-
- //If this is not xdomain, or if loading a i18n resource bundle, then send it down
- //the normal eval/callback path.
- if(dojo._isXDomain
- && uri.indexOf("/nls/") == -1
- && module != "dojo.i18n"){
- var res = dojo._xdCreateResource(contents, module, uri);
- dojo.eval(res);
- }else{
- if(cb){
- contents = '('+contents+')';
- }else{
- //Only do the scoping if no callback. If a callback is specified,
- //it is most likely the i18n bundle stuff.
- contents = dojo._scopePrefix + contents + dojo._scopeSuffix;
- }
- var value = dojo["eval"](contents+"\r\n//@ sourceURL="+uri);
- if(cb){
- cb(value);
- }
- }
- }
-
- //These steps are done in the non-xd loader version of this function.
- //Maintain these steps to fit in with the existing system.
- dojo._loadedUrls[uri] = true;
- dojo._loadedUrls.push(uri);
- return true; //Boolean
-}
-
-dojo._xdResourceLoaded = function(/*Object*/res){
- //summary: Internal xd loader function. Called by an xd module resource when
- //it has been loaded via a script tag.
-
- //Evaluate the function with scopeArgs for multiversion support.
- res = res.apply(dojo.global, dojo._scopeArgs);
-
- //Work through dependencies.
- var deps = res.depends;
- var requireList = null;
- var requireAfterList = null;
- var provideList = [];
- if(deps && deps.length > 0){
- var dep = null;
- var insertHint = 0;
- var attachedResource = false;
- for(var i = 0; i < deps.length; i++){
- dep = deps[i];
-
- //Look for specific dependency indicators.
- if (dep[0] == "provide"){
- provideList.push(dep[1]);
- }else{
- if(!requireList){
- requireList = [];
- }
- if(!requireAfterList){
- requireAfterList = [];
- }
-
- var unpackedDeps = dojo._xdUnpackDependency(dep);
- if(unpackedDeps.requires){
- requireList = requireList.concat(unpackedDeps.requires);
- }
- if(unpackedDeps.requiresAfter){
- requireAfterList = requireAfterList.concat(unpackedDeps.requiresAfter);
- }
- }
-
- //Call the dependency indicator to allow for the normal dojo setup.
- //Only allow for one dot reference, for the i18n._preloadLocalizations calls
- //(and maybe future, one-dot things).
- var depType = dep[0];
- var objPath = depType.split(".");
- if(objPath.length == 2){
- dojo[objPath[0]][objPath[1]].apply(dojo[objPath[0]], dep.slice(1));
- }else{
- dojo[depType].apply(dojo, dep.slice(1));
- }
- }
-
-
- //If loading the debugAtAllCosts module, eval it right away since we need
- //its functions to properly load the other modules.
- if(provideList.length == 1 && provideList[0] == "dojo._base._loader.loader_debug"){
- res.defineResource(dojo);
- }else{
- //Save off the resource contents for definition later.
- var contentIndex = dojo._xdContents.push({
- content: res.defineResource,
- resourceName: res["resourceName"],
- resourcePath: res["resourcePath"],
- isDefined: false
- }) - 1;
-
- //Add provide/requires to dependency map.
- for(i = 0; i < provideList.length; i++){
- dojo._xdDepMap[provideList[i]] = { requires: requireList, requiresAfter: requireAfterList, contentIndex: contentIndex };
- }
- }
-
- //Now update the inflight status for any provided resources in this loaded resource.
- //Do this at the very end (in a *separate* for loop) to avoid shutting down the
- //inflight timer check too soon.
- for(i = 0; i < provideList.length; i++){
- dojo._xdInFlight[provideList[i]] = false;
- }
- }
-}
-
-dojo._xdLoadFlattenedBundle = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*Object*/bundleData){
- //summary: Internal xd loader function. Used when loading
- //a flattened localized bundle via a script tag.
- locale = locale || "root";
- var jsLoc = dojo.i18n.normalizeLocale(locale).replace('-', '_');
- var bundleResource = [moduleName, "nls", bundleName].join(".");
- var bundle = dojo["provide"](bundleResource);
- bundle[jsLoc] = bundleData;
-
- //Assign the bundle for the original locale(s) we wanted.
- var mapName = [moduleName, jsLoc, bundleName].join(".");
- var bundleMap = dojo._xdBundleMap[mapName];
- if(bundleMap){
- for(var param in bundleMap){
- bundle[param] = bundleData;
- }
- }
-};
-
-
-dojo._xdInitExtraLocales = function(){
- // Simulate the extra locale work that dojo.requireLocalization does.
-
- var extra = dojo.config.extraLocale;
- if(extra){
- if(!extra instanceof Array){
- extra = [extra];
- }
-
- dojo._xdReqLoc = dojo.xdRequireLocalization;
- dojo.xdRequireLocalization = function(m, b, locale, fLocales){
- dojo._xdReqLoc(m,b,locale, fLocales);
- if(locale){return;}
- for(var i=0; i<extra.length; i++){
- dojo._xdReqLoc(m,b,extra[i], fLocales);
- }
- };
- }
-}
-
-dojo._xdBundleMap = {};
-
-dojo.xdRequireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String*/availableFlatLocales){
- //summary: Internal xd loader function. The xd version of dojo.requireLocalization.
-
-
- //Account for allowing multiple extra locales. Do this here inside the function
- //since dojo._xdInitExtraLocales() depends on djConfig being set up, but that only
- //happens after hostenv_browser runs. loader_xd has to come before hostenv_browser
- //though since hostenv_browser can do a dojo.require for the debug module.
- if(dojo._xdInitExtraLocales){
- dojo._xdInitExtraLocales();
- dojo._xdInitExtraLocales = null;
- dojo.xdRequireLocalization.apply(dojo, arguments);
- return;
- }
-
- var locales = availableFlatLocales.split(",");
-
- //Find the best-match locale to load.
- //Assumes dojo.i18n has already been loaded. This is true for xdomain builds,
- //since it is included in dojo.xd.js.
- var jsLoc = dojo.i18n.normalizeLocale(locale);
-
- var bestLocale = "";
- for(var i = 0; i < locales.length; i++){
- //Locale must match from start of string.
- if(jsLoc.indexOf(locales[i]) == 0){
- if(locales[i].length > bestLocale.length){
- bestLocale = locales[i];
- }
- }
- }
-
- var fixedBestLocale = bestLocale.replace('-', '_');
- //See if the bundle we are going to use is already loaded.
- var bundleResource = dojo.getObject([moduleName, "nls", bundleName].join("."));
- if(!bundleResource || !bundleResource[fixedBestLocale]){
- //Need to remember what locale we wanted and which one we actually use.
- //Then when we load the one we are actually using, use that bundle for the one
- //we originally wanted.
- var mapName = [moduleName, (fixedBestLocale||"root"), bundleName].join(".");
- var bundleMap = dojo._xdBundleMap[mapName];
- if(!bundleMap){
- bundleMap = dojo._xdBundleMap[mapName] = {};
- }
- bundleMap[jsLoc.replace('-', '_')] = true;
-
- //Do just a normal dojo.require so the resource tracking stuff works as usual.
- dojo.require(moduleName + ".nls" + (bestLocale ? "." + bestLocale : "") + "." + bundleName);
- }
-}
-
-// Replace dojo.requireLocalization with a wrapper
-dojo._xdRealRequireLocalization = dojo.requireLocalization;
-dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String*/availableFlatLocales){
- // summary: loads a bundle intelligently based on whether the module is
- // local or xd. Overrides the local-case implementation.
-
- var modulePath = dojo.moduleUrl(moduleName).toString();
- if (dojo._xdIsXDomainPath(modulePath)) {
- // call cross-domain loader
- return dojo.xdRequireLocalization.apply(dojo, arguments);
- } else {
- // call local-loader
- return dojo._xdRealRequireLocalization.apply(dojo, arguments);
- }
-}
-
-//This is a bit brittle: it has to know about the dojo methods that deal with dependencies
-//It would be ideal to intercept the actual methods and do something fancy at that point,
-//but I have concern about knowing which provide to match to the dependency in that case,
-//since scripts can load whenever they want, and trigger new calls to dojo._xdResourceLoaded().
-dojo._xdUnpackDependency = function(/*Array*/dep){
- //summary: Internal xd loader function. Determines what to do with a dependency
- //that was listed in an xd version of a module contents.
-
- //Extract the dependency(ies).
- var newDeps = null;
- var newAfterDeps = null;
- switch(dep[0]){
- case "requireIf":
- case "requireAfterIf":
- //First arg (dep[1]) is the test. Depedency is dep[2].
- if(dep[1] === true){
- newDeps = [{name: dep[2], content: null}];
- }
- break;
- case "platformRequire":
- var modMap = dep[1];
- var common = modMap["common"]||[];
- newDeps = (modMap[dojo.hostenv.name_]) ? common.concat(modMap[dojo.hostenv.name_]||[]) : common.concat(modMap["default"]||[]);
- //Flatten the array of arrays into a one-level deep array.
- //Each result could be an array of 3 elements (the 3 arguments to dojo.require).
- //We only need the first one.
- if(newDeps){
- for(var i = 0; i < newDeps.length; i++){
- if(newDeps[i] instanceof Array){
- newDeps[i] = {name: newDeps[i][0], content: null};
- }else{
- newDeps[i] = {name: newDeps[i], content: null};
- }
- }
- }
- break;
- case "require":
- //Just worry about dep[1]
- newDeps = [{name: dep[1], content: null}];
- break;
- case "i18n._preloadLocalizations":
- //We can eval these immediately, since they load i18n bundles.
- //Since i18n bundles have no dependencies, whenever they are loaded
- //in a script tag, they are evaluated immediately, so we do not have to
- //treat them has an explicit dependency for the dependency mapping.
- //We can call it immediately since dojo.i18n is part of dojo.xd.js.
- dojo.i18n._preloadLocalizations.apply(dojo.i18n._preloadLocalizations, dep.slice(1));
- break;
- }
-
- //The requireIf and requireAfterIf needs to be evaluated after the current resource is evaluated.
- if(dep[0] == "requireAfterIf" || dep[0] == "requireIf"){
- newAfterDeps = newDeps;
- newDeps = null;
- }
- return {requires: newDeps, requiresAfter: newAfterDeps}; //Object
-}
-
-dojo._xdWalkReqs = function(){
- //summary: Internal xd loader function.
- //Walks the requires and evaluates module resource contents in
- //the right order.
- var reqChain = null;
- var req;
- for(var i = 0; i < dojo._xdOrderedReqs.length; i++){
- req = dojo._xdOrderedReqs[i];
- if(dojo._xdDepMap[req]){
- reqChain = [req];
- reqChain[req] = true; //Allow for fast lookup of the req in the array
- dojo._xdEvalReqs(reqChain);
- }
- }
-}
-
-dojo._xdEvalReqs = function(/*Array*/reqChain){
- //summary: Internal xd loader function.
- //Does a depth first, breadth second search and eval of required modules.
- while(reqChain.length > 0){
- var req = reqChain[reqChain.length - 1];
- var res = dojo._xdDepMap[req];
- var i, reqs, nextReq;
- if(res){
- //Trace down any requires for this resource.
- //START dojo._xdTraceReqs() inlining for small Safari 2.0 call stack
- reqs = res.requires;
- if(reqs && reqs.length > 0){
- for(i = 0; i < reqs.length; i++){
- nextReq = reqs[i].name;
- if(nextReq && !reqChain[nextReq]){
- //New req depedency. Follow it down.
- reqChain.push(nextReq);
- reqChain[nextReq] = true;
- dojo._xdEvalReqs(reqChain);
- }
- }
- }
- //END dojo._xdTraceReqs() inlining for small Safari 2.0 call stack
-
- //Evaluate the resource.
- var contents = dojo._xdContents[res.contentIndex];
- if(!contents.isDefined){
- var content = contents.content;
- content["resourceName"] = contents["resourceName"];
- content["resourcePath"] = contents["resourcePath"];
- dojo._xdDefList.push(content);
- contents.isDefined = true;
- }
- dojo._xdDepMap[req] = null;
-
- //Trace down any requireAfters for this resource.
- //START dojo._xdTraceReqs() inlining for small Safari 2.0 call stack
- reqs = res.requiresAfter;
- if(reqs && reqs.length > 0){
- for(i = 0; i < reqs.length; i++){
- nextReq = reqs[i].name;
- if(nextReq && !reqChain[nextReq]){
- //New req depedency. Follow it down.
- reqChain.push(nextReq);
- reqChain[nextReq] = true;
- dojo._xdEvalReqs(reqChain);
- }
- }
- }
- //END dojo._xdTraceReqs() inlining for small Safari 2.0 call stack
- }
-
- //Done with that require. Remove it and go to the next one.
- reqChain.pop();
- }
-}
-
-dojo._xdWatchInFlight = function(){
- //summary: Internal xd loader function.
- //Monitors in-flight requests for xd module resources.
-
- var noLoads = "";
- var waitInterval = (dojo.config.xdWaitSeconds || 15) * 1000;
- var expired = (dojo._xdStartTime + waitInterval) < (new Date()).getTime();
-
- //If any xdInFlight are true, then still waiting for something to load.
- //Come back later. If we timed out, report the things that did not load.
- for(var param in dojo._xdInFlight){
- if(dojo._xdInFlight[param] === true){
- if(expired){
- noLoads += param + " ";
- }else{
- return;
- }
- }
- }
-
- //All done. Clean up and notify.
- dojo._xdClearInterval();
-
- if(expired){
- throw "Could not load cross-domain resources: " + noLoads;
- }
-
- dojo._xdWalkReqs();
-
- var defLength = dojo._xdDefList.length;
- for(var i= 0; i < defLength; i++){
- var content = dojo._xdDefList[i];
- if(dojo.config["debugAtAllCosts"] && content["resourceName"]){
- if(!dojo["_xdDebugQueue"]){
- dojo._xdDebugQueue = [];
- }
- dojo._xdDebugQueue.push({resourceName: content.resourceName, resourcePath: content.resourcePath});
- }else{
- //Evaluate the resource to bring it into being.
- //Pass in scope args to allow multiple versions of modules in a page.
- content.apply(dojo.global, dojo._scopeArgs);
- }
- }
-
- //Evaluate any resources that were not evaled before.
- //This normally shouldn't happen with proper dojo.provide and dojo.require
- //usage, but providing it just in case. Note that these may not be executed
- //in the original order that the developer intended.
- for(i = 0; i < dojo._xdContents.length; i++){
- var current = dojo._xdContents[i];
- if(current.content && !current.isDefined){
- //Pass in scope args to allow multiple versions of modules in a page.
- current.content.apply(dojo.global, dojo._scopeArgs);
- }
- }
-
- //Clean up for the next round of xd loading.
- dojo._xdReset();
-
- if(dojo["_xdDebugQueue"] && dojo._xdDebugQueue.length > 0){
- dojo._xdDebugFileLoaded();
- }else{
- dojo._xdNotifyLoaded();
- }
-}
-
-dojo._xdNotifyLoaded = function(){
- //Clear inflight count so we will finally do finish work.
-
- //Just having a legitimate status (true or false) for an inflight item
- //means that it is still being processed. Do the typeof test
- //to avoid bad JavaScript that might tinker with Object.prototype.
- for(var prop in dojo._xdInFlight){
- if(typeof dojo._xdInFlight[prop] == "boolean"){
- return;
- }
- }
-
- dojo._inFlightCount = 0;
-
- //Only trigger call loaded if dj_load_init has run.
- if(dojo._initFired && !dojo._loadNotifying){
- dojo._callLoaded();
- }
-}
-
-}
diff --git a/lib/dojo/_base/array.js b/lib/dojo/_base/array.js
index 57cea4229..f25c2ad00 100644
--- a/lib/dojo/_base/array.js
+++ b/lib/dojo/_base/array.js
@@ -4,260 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.array"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.array"] = true;
-dojo.provide("dojo._base.array");
-dojo.require("dojo._base.lang");
-
-
-(function(){
- var _getParts = function(arr, obj, cb){
- return [
- (typeof arr == "string") ? arr.split("") : arr,
- obj || dojo.global,
- // FIXME: cache the anonymous functions we create here?
- (typeof cb == "string") ? new Function("item", "index", "array", cb) : cb
- ];
- };
-
- var everyOrSome = function(/*Boolean*/every, /*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
- var _p = _getParts(arr, thisObject, callback); arr = _p[0];
- for(var i=0,l=arr.length; i<l; ++i){
- var result = !!_p[2].call(_p[1], arr[i], i, arr);
- if(every ^ result){
- return result; // Boolean
- }
- }
- return every; // Boolean
- };
-
- dojo.mixin(dojo, {
- indexOf: function( /*Array*/ array,
- /*Object*/ value,
- /*Integer?*/ fromIndex,
- /*Boolean?*/ findLast){
- // summary:
- // locates the first index of the provided value in the
- // passed array. If the value is not found, -1 is returned.
- // description:
- // This method corresponds to the JavaScript 1.6 Array.indexOf method, with one difference: when
- // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript
- // 1.6's indexOf skips the holes in the sparse array.
- // For details on this method, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf
-
- var step = 1, end = array.length || 0, i = 0;
- if(findLast){
- i = end - 1;
- step = end = -1;
- }
- if(fromIndex != undefined){ i = fromIndex; }
- if((findLast && i > end) || i < end){
- for(; i != end; i += step){
- if(array[i] == value){ return i; }
- }
- }
- return -1; // Number
- },
-
- lastIndexOf: function(/*Array*/array, /*Object*/value, /*Integer?*/fromIndex){
- // summary:
- // locates the last index of the provided value in the passed
- // array. If the value is not found, -1 is returned.
- // description:
- // This method corresponds to the JavaScript 1.6 Array.lastIndexOf method, with one difference: when
- // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript
- // 1.6's lastIndexOf skips the holes in the sparse array.
- // For details on this method, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/lastIndexOf
- return dojo.indexOf(array, value, fromIndex, true); // Number
- },
-
- forEach: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
- // summary:
- // for every item in arr, callback is invoked. Return values are ignored.
- // If you want to break out of the loop, consider using dojo.every() or dojo.some().
- // forEach does not allow breaking out of the loop over the items in arr.
- // arr:
- // the array to iterate over. If a string, operates on individual characters.
- // callback:
- // a function is invoked with three arguments: item, index, and array
- // thisObject:
- // may be used to scope the call to callback
- // description:
- // This function corresponds to the JavaScript 1.6 Array.forEach() method, with one difference: when
- // run over sparse arrays, this implemenation passes the "holes" in the sparse array to
- // the callback function with a value of undefined. JavaScript 1.6's forEach skips the holes in the sparse array.
- // For more details, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach
- // example:
- // | // log out all members of the array:
- // | dojo.forEach(
- // | [ "thinger", "blah", "howdy", 10 ],
- // | function(item){
- // | console.log(item);
- // | }
- // | );
- // example:
- // | // log out the members and their indexes
- // | dojo.forEach(
- // | [ "thinger", "blah", "howdy", 10 ],
- // | function(item, idx, arr){
- // | console.log(item, "at index:", idx);
- // | }
- // | );
- // example:
- // | // use a scoped object member as the callback
- // |
- // | var obj = {
- // | prefix: "logged via obj.callback:",
- // | callback: function(item){
- // | console.log(this.prefix, item);
- // | }
- // | };
- // |
- // | // specifying the scope function executes the callback in that scope
- // | dojo.forEach(
- // | [ "thinger", "blah", "howdy", 10 ],
- // | obj.callback,
- // | obj
- // | );
- // |
- // | // alternately, we can accomplish the same thing with dojo.hitch()
- // | dojo.forEach(
- // | [ "thinger", "blah", "howdy", 10 ],
- // | dojo.hitch(obj, "callback")
- // | );
-
- // match the behavior of the built-in forEach WRT empty arrs
- if(!arr || !arr.length){ return; }
-
- // FIXME: there are several ways of handilng thisObject. Is
- // dojo.global always the default context?
- var _p = _getParts(arr, thisObject, callback); arr = _p[0];
- for(var i=0,l=arr.length; i<l; ++i){
- _p[2].call(_p[1], arr[i], i, arr);
- }
- },
-
- every: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
- // summary:
- // Determines whether or not every item in arr satisfies the
- // condition implemented by callback.
- // arr:
- // the array to iterate on. If a string, operates on individual characters.
- // callback:
- // a function is invoked with three arguments: item, index,
- // and array and returns true if the condition is met.
- // thisObject:
- // may be used to scope the call to callback
- // description:
- // This function corresponds to the JavaScript 1.6 Array.every() method, with one difference: when
- // run over sparse arrays, this implemenation passes the "holes" in the sparse array to
- // the callback function with a value of undefined. JavaScript 1.6's every skips the holes in the sparse array.
- // For more details, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/every
- // example:
- // | // returns false
- // | dojo.every([1, 2, 3, 4], function(item){ return item>1; });
- // example:
- // | // returns true
- // | dojo.every([1, 2, 3, 4], function(item){ return item>0; });
- return everyOrSome(true, arr, callback, thisObject); // Boolean
- },
-
- some: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
- // summary:
- // Determines whether or not any item in arr satisfies the
- // condition implemented by callback.
- // arr:
- // the array to iterate over. If a string, operates on individual characters.
- // callback:
- // a function is invoked with three arguments: item, index,
- // and array and returns true if the condition is met.
- // thisObject:
- // may be used to scope the call to callback
- // description:
- // This function corresponds to the JavaScript 1.6 Array.some() method, with one difference: when
- // run over sparse arrays, this implemenation passes the "holes" in the sparse array to
- // the callback function with a value of undefined. JavaScript 1.6's some skips the holes in the sparse array.
- // For more details, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/some
- // example:
- // | // is true
- // | dojo.some([1, 2, 3, 4], function(item){ return item>1; });
- // example:
- // | // is false
- // | dojo.some([1, 2, 3, 4], function(item){ return item<1; });
- return everyOrSome(false, arr, callback, thisObject); // Boolean
- },
-
- map: function(/*Array|String*/arr, /*Function|String*/callback, /*Function?*/thisObject){
- // summary:
- // applies callback to each element of arr and returns
- // an Array with the results
- // arr:
- // the array to iterate on. If a string, operates on
- // individual characters.
- // callback:
- // a function is invoked with three arguments, (item, index,
- // array), and returns a value
- // thisObject:
- // may be used to scope the call to callback
- // description:
- // This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when
- // run over sparse arrays, this implemenation passes the "holes" in the sparse array to
- // the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array.
- // For more details, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
- // example:
- // | // returns [2, 3, 4, 5]
- // | dojo.map([1, 2, 3, 4], function(item){ return item+1 });
-
- var _p = _getParts(arr, thisObject, callback); arr = _p[0];
- var outArr = (arguments[3] ? (new arguments[3]()) : []);
- for(var i=0,l=arr.length; i<l; ++i){
- outArr.push(_p[2].call(_p[1], arr[i], i, arr));
- }
- return outArr; // Array
- },
-
- filter: function(/*Array*/arr, /*Function|String*/callback, /*Object?*/thisObject){
- // summary:
- // Returns a new Array with those items from arr that match the
- // condition implemented by callback.
- // arr:
- // the array to iterate over.
- // callback:
- // a function that is invoked with three arguments (item,
- // index, array). The return of this function is expected to
- // be a boolean which determines whether the passed-in item
- // will be included in the returned array.
- // thisObject:
- // may be used to scope the call to callback
- // description:
- // This function corresponds to the JavaScript 1.6 Array.filter() method, with one difference: when
- // run over sparse arrays, this implemenation passes the "holes" in the sparse array to
- // the callback function with a value of undefined. JavaScript 1.6's filter skips the holes in the sparse array.
- // For more details, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
- // example:
- // | // returns [2, 3, 4]
- // | dojo.filter([1, 2, 3, 4], function(item){ return item>1; });
-
- var _p = _getParts(arr, thisObject, callback); arr = _p[0];
- var outArr = [];
- for(var i=0,l=arr.length; i<l; ++i){
- if(_p[2].call(_p[1], arr[i], i, arr)){
- outArr.push(arr[i]);
- }
- }
- return outArr; // Array
- }
- });
-})();
-/*
-*/
-
-}
+//>>built
+define("dojo/_base/array",["./kernel","../has","./lang"],function(_1,_2,_3){var _4={},u,_5;function _6(){_4={};};function _7(fn){return _4[fn]=new Function("item","index","array",fn);};function _8(_9){var _a=!_9;return function(a,fn,o){var i=0,l=a&&a.length||0,_b;if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_4[fn]||_7(fn);}if(o){for(;i<l;++i){_b=!fn.call(o,a[i],i,a);if(_9^_b){return !_b;}}}else{for(;i<l;++i){_b=!fn(a[i],i,a);if(_9^_b){return !_b;}}}return _a;};};function _c(up){var _d=1,_e=0,_f=0;if(!up){_d=_e=_f=-1;}return function(a,x,_10,_11){if(_11&&_d>0){return _5.lastIndexOf(a,x,_10);}var l=a&&a.length||0,end=up?l+_f:_e,i;if(_10===u){i=up?_e:l+_f;}else{if(_10<0){i=l+_10;if(i<0){i=_e;}}else{i=_10>=l?l+_f:_10;}}if(l&&typeof a=="string"){a=a.split("");}for(;i!=end;i+=_d){if(a[i]==x){return i;}}return -1;};};function _12(a,fn,o){var i=0,l=a&&a.length||0;if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_4[fn]||_7(fn);}if(o){for(;i<l;++i){fn.call(o,a[i],i,a);}}else{for(;i<l;++i){fn(a[i],i,a);}}};function map(a,fn,o,Ctr){var i=0,l=a&&a.length||0,out=new (Ctr||Array)(l);if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_4[fn]||_7(fn);}if(o){for(;i<l;++i){out[i]=fn.call(o,a[i],i,a);}}else{for(;i<l;++i){out[i]=fn(a[i],i,a);}}return out;};function _13(a,fn,o){var i=0,l=a&&a.length||0,out=[],_14;if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_4[fn]||_7(fn);}if(o){for(;i<l;++i){_14=a[i];if(fn.call(o,_14,i,a)){out.push(_14);}}}else{for(;i<l;++i){_14=a[i];if(fn(_14,i,a)){out.push(_14);}}}return out;};_5={every:_8(false),some:_8(true),indexOf:_c(true),lastIndexOf:_c(false),forEach:_12,map:map,filter:_13,clearCache:_6};1&&_3.mixin(_1,_5);return _5;}); \ No newline at end of file
diff --git a/lib/dojo/_base/array.js.uncompressed.js b/lib/dojo/_base/array.js.uncompressed.js
new file mode 100644
index 000000000..06e733b4b
--- /dev/null
+++ b/lib/dojo/_base/array.js.uncompressed.js
@@ -0,0 +1,343 @@
+define("dojo/_base/array", ["./kernel", "../has", "./lang"], function(dojo, has, lang){
+ // module:
+ // dojo/_base/array
+ // summary:
+ // This module defines the Javascript v1.6 array extensions.
+
+ /*=====
+ dojo.indexOf = function(arr, value, fromIndex, findLast){
+ // summary:
+ // locates the first index of the provided value in the
+ // passed array. If the value is not found, -1 is returned.
+ // description:
+ // This method corresponds to the JavaScript 1.6 Array.indexOf method, with one difference: when
+ // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript
+ // 1.6's indexOf skips the holes in the sparse array.
+ // For details on this method, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf
+ // arr: Array
+ // value: Object
+ // fromIndex: Integer?
+ // findLast: Boolean?
+ // returns: Number
+ };
+ dojo.lastIndexOf = function(arr, value, fromIndex){
+ // summary:
+ // locates the last index of the provided value in the passed
+ // array. If the value is not found, -1 is returned.
+ // description:
+ // This method corresponds to the JavaScript 1.6 Array.lastIndexOf method, with one difference: when
+ // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript
+ // 1.6's lastIndexOf skips the holes in the sparse array.
+ // For details on this method, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/lastIndexOf
+ // arr: Array,
+ // value: Object,
+ // fromIndex: Integer?
+ // returns: Number
+ };
+ dojo.forEach = function(arr, callback, thisObject){
+ // summary:
+ // for every item in arr, callback is invoked. Return values are ignored.
+ // If you want to break out of the loop, consider using dojo.every() or dojo.some().
+ // forEach does not allow breaking out of the loop over the items in arr.
+ // arr:
+ // the array to iterate over. If a string, operates on individual characters.
+ // callback:
+ // a function is invoked with three arguments: item, index, and array
+ // thisObject:
+ // may be used to scope the call to callback
+ // description:
+ // This function corresponds to the JavaScript 1.6 Array.forEach() method, with one difference: when
+ // run over sparse arrays, this implementation passes the "holes" in the sparse array to
+ // the callback function with a value of undefined. JavaScript 1.6's forEach skips the holes in the sparse array.
+ // For more details, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach
+ // example:
+ // | // log out all members of the array:
+ // | dojo.forEach(
+ // | [ "thinger", "blah", "howdy", 10 ],
+ // | function(item){
+ // | console.log(item);
+ // | }
+ // | );
+ // example:
+ // | // log out the members and their indexes
+ // | dojo.forEach(
+ // | [ "thinger", "blah", "howdy", 10 ],
+ // | function(item, idx, arr){
+ // | console.log(item, "at index:", idx);
+ // | }
+ // | );
+ // example:
+ // | // use a scoped object member as the callback
+ // |
+ // | var obj = {
+ // | prefix: "logged via obj.callback:",
+ // | callback: function(item){
+ // | console.log(this.prefix, item);
+ // | }
+ // | };
+ // |
+ // | // specifying the scope function executes the callback in that scope
+ // | dojo.forEach(
+ // | [ "thinger", "blah", "howdy", 10 ],
+ // | obj.callback,
+ // | obj
+ // | );
+ // |
+ // | // alternately, we can accomplish the same thing with dojo.hitch()
+ // | dojo.forEach(
+ // | [ "thinger", "blah", "howdy", 10 ],
+ // | dojo.hitch(obj, "callback")
+ // | );
+ // arr: Array|String
+ // callback: Function|String
+ // thisObject: Object?
+ };
+ dojo.every = function(arr, callback, thisObject){
+ // summary:
+ // Determines whether or not every item in arr satisfies the
+ // condition implemented by callback.
+ // arr: Array|String
+ // the array to iterate on. If a string, operates on individual characters.
+ // callback: Function|String
+ // a function is invoked with three arguments: item, index,
+ // and array and returns true if the condition is met.
+ // thisObject: Object?
+ // may be used to scope the call to callback
+ // returns: Boolean
+ // description:
+ // This function corresponds to the JavaScript 1.6 Array.every() method, with one difference: when
+ // run over sparse arrays, this implementation passes the "holes" in the sparse array to
+ // the callback function with a value of undefined. JavaScript 1.6's every skips the holes in the sparse array.
+ // For more details, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/every
+ // example:
+ // | // returns false
+ // | dojo.every([1, 2, 3, 4], function(item){ return item>1; });
+ // example:
+ // | // returns true
+ // | dojo.every([1, 2, 3, 4], function(item){ return item>0; });
+ };
+ dojo.some = function(arr, callback, thisObject){
+ // summary:
+ // Determines whether or not any item in arr satisfies the
+ // condition implemented by callback.
+ // arr: Array|String
+ // the array to iterate over. If a string, operates on individual characters.
+ // callback: Function|String
+ // a function is invoked with three arguments: item, index,
+ // and array and returns true if the condition is met.
+ // thisObject: Object?
+ // may be used to scope the call to callback
+ // returns: Boolean
+ // description:
+ // This function corresponds to the JavaScript 1.6 Array.some() method, with one difference: when
+ // run over sparse arrays, this implementation passes the "holes" in the sparse array to
+ // the callback function with a value of undefined. JavaScript 1.6's some skips the holes in the sparse array.
+ // For more details, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/some
+ // example:
+ // | // is true
+ // | dojo.some([1, 2, 3, 4], function(item){ return item>1; });
+ // example:
+ // | // is false
+ // | dojo.some([1, 2, 3, 4], function(item){ return item<1; });
+ };
+ dojo.map = function(arr, callback, thisObject){
+ // summary:
+ // applies callback to each element of arr and returns
+ // an Array with the results
+ // arr: Array|String
+ // the array to iterate on. If a string, operates on
+ // individual characters.
+ // callback: Function|String
+ // a function is invoked with three arguments, (item, index,
+ // array), and returns a value
+ // thisObject: Object?
+ // may be used to scope the call to callback
+ // returns: Array
+ // description:
+ // This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when
+ // run over sparse arrays, this implementation passes the "holes" in the sparse array to
+ // the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array.
+ // For more details, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
+ // example:
+ // | // returns [2, 3, 4, 5]
+ // | dojo.map([1, 2, 3, 4], function(item){ return item+1 });
+ };
+ dojo.filter = function(arr, callback, thisObject){
+ // summary:
+ // Returns a new Array with those items from arr that match the
+ // condition implemented by callback.
+ // arr: Array
+ // the array to iterate over.
+ // callback: Function|String
+ // a function that is invoked with three arguments (item,
+ // index, array). The return of this function is expected to
+ // be a boolean which determines whether the passed-in item
+ // will be included in the returned array.
+ // thisObject: Object?
+ // may be used to scope the call to callback
+ // returns: Array
+ // description:
+ // This function corresponds to the JavaScript 1.6 Array.filter() method, with one difference: when
+ // run over sparse arrays, this implementation passes the "holes" in the sparse array to
+ // the callback function with a value of undefined. JavaScript 1.6's filter skips the holes in the sparse array.
+ // For more details, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
+ // example:
+ // | // returns [2, 3, 4]
+ // | dojo.filter([1, 2, 3, 4], function(item){ return item>1; });
+ };
+ =====*/
+
+ // our old simple function builder stuff
+ var cache = {}, u, array; // the export object
+
+ function clearCache(){
+ cache = {};
+ }
+
+ function buildFn(fn){
+ return cache[fn] = new Function("item", "index", "array", fn); // Function
+ }
+ // magic snippet: if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
+
+ // every & some
+
+ function everyOrSome(some){
+ var every = !some;
+ return function(a, fn, o){
+ var i = 0, l = a && a.length || 0, result;
+ if(l && typeof a == "string") a = a.split("");
+ if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
+ if(o){
+ for(; i < l; ++i){
+ result = !fn.call(o, a[i], i, a);
+ if(some ^ result){
+ return !result;
+ }
+ }
+ }else{
+ for(; i < l; ++i){
+ result = !fn(a[i], i, a);
+ if(some ^ result){
+ return !result;
+ }
+ }
+ }
+ return every; // Boolean
+ }
+ }
+ // var every = everyOrSome(false), some = everyOrSome(true);
+
+ // indexOf, lastIndexOf
+
+ function index(up){
+ var delta = 1, lOver = 0, uOver = 0;
+ if(!up){
+ delta = lOver = uOver = -1;
+ }
+ return function(a, x, from, last){
+ if(last && delta > 0){
+ // TODO: why do we use a non-standard signature? why do we need "last"?
+ return array.lastIndexOf(a, x, from);
+ }
+ var l = a && a.length || 0, end = up ? l + uOver : lOver, i;
+ if(from === u){
+ i = up ? lOver : l + uOver;
+ }else{
+ if(from < 0){
+ i = l + from;
+ if(i < 0){
+ i = lOver;
+ }
+ }else{
+ i = from >= l ? l + uOver : from;
+ }
+ }
+ if(l && typeof a == "string") a = a.split("");
+ for(; i != end; i += delta){
+ if(a[i] == x){
+ return i; // Number
+ }
+ }
+ return -1; // Number
+ }
+ }
+ // var indexOf = index(true), lastIndexOf = index(false);
+
+ function forEach(a, fn, o){
+ var i = 0, l = a && a.length || 0;
+ if(l && typeof a == "string") a = a.split("");
+ if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
+ if(o){
+ for(; i < l; ++i){
+ fn.call(o, a[i], i, a);
+ }
+ }else{
+ for(; i < l; ++i){
+ fn(a[i], i, a);
+ }
+ }
+ }
+
+ function map(a, fn, o, Ctr){
+ // TODO: why do we have a non-standard signature here? do we need "Ctr"?
+ var i = 0, l = a && a.length || 0, out = new (Ctr || Array)(l);
+ if(l && typeof a == "string") a = a.split("");
+ if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
+ if(o){
+ for(; i < l; ++i){
+ out[i] = fn.call(o, a[i], i, a);
+ }
+ }else{
+ for(; i < l; ++i){
+ out[i] = fn(a[i], i, a);
+ }
+ }
+ return out; // Array
+ }
+
+ function filter(a, fn, o){
+ // TODO: do we need "Ctr" here like in map()?
+ var i = 0, l = a && a.length || 0, out = [], value;
+ if(l && typeof a == "string") a = a.split("");
+ if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
+ if(o){
+ for(; i < l; ++i){
+ value = a[i];
+ if(fn.call(o, value, i, a)){
+ out.push(value);
+ }
+ }
+ }else{
+ for(; i < l; ++i){
+ value = a[i];
+ if(fn(value, i, a)){
+ out.push(value);
+ }
+ }
+ }
+ return out; // Array
+ }
+
+ array = {
+ every: everyOrSome(false),
+ some: everyOrSome(true),
+ indexOf: index(true),
+ lastIndexOf: index(false),
+ forEach: forEach,
+ map: map,
+ filter: filter,
+ clearCache: clearCache
+ };
+
+ 1 && lang.mixin(dojo, array);
+
+ /*===== return dojo.array; =====*/
+ return array;
+});
diff --git a/lib/dojo/_base/browser.js b/lib/dojo/_base/browser.js
index 209330f0d..69d57f4cf 100644
--- a/lib/dojo/_base/browser.js
+++ b/lib/dojo/_base/browser.js
@@ -4,25 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.browser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.browser"] = true;
-dojo.provide("dojo._base.browser");
-dojo.require("dojo._base.window");
-dojo.require("dojo._base.connect");
-dojo.require("dojo._base.event");
-dojo.require("dojo._base.html");
-dojo.require("dojo._base.NodeList");
-dojo.require("dojo._base.query");
-dojo.require("dojo._base.xhr");
-dojo.require("dojo._base.fx");
-
- //Need this to be the last code segment in base, so do not place any
- //dojo/requireIf calls in this file/ Otherwise, due to how the build system
- //puts all requireIf dependencies after the current file, the require calls
- //could be called before all of base is defined/
- dojo.forEach(dojo.config.require, function(i){
- dojo["require"](i);
- });
-
-}
+//>>built
+if(require.has){require.has.add("config-selectorEngine","acme");}define("dojo/_base/browser",["../ready","./kernel","./connect","./unload","./window","./event","./html","./NodeList","../query","./xhr","./fx"],function(_1){return _1;}); \ No newline at end of file
diff --git a/lib/dojo/_base/browser.js.uncompressed.js b/lib/dojo/_base/browser.js.uncompressed.js
new file mode 100644
index 000000000..8f186e2a1
--- /dev/null
+++ b/lib/dojo/_base/browser.js.uncompressed.js
@@ -0,0 +1,21 @@
+if(require.has){
+ require.has.add("config-selectorEngine", "acme");
+}
+define("dojo/_base/browser", [
+ "../ready",
+ "./kernel",
+ "./connect", // until we decide if connect is going back into non-browser environments
+ "./unload",
+ "./window",
+ "./event",
+ "./html",
+ "./NodeList",
+ "../query",
+ "./xhr",
+ "./fx"], function(dojo) {
+ // module:
+ // dojo/_base/browser
+ // summary:
+ // This module causes the browser-only base modules to be loaded.
+ return dojo;
+});
diff --git a/lib/dojo/_base/config.js b/lib/dojo/_base/config.js
new file mode 100644
index 000000000..5c70ffd91
--- /dev/null
+++ b/lib/dojo/_base/config.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/_base/config",["../has","require"],function(_1,_2){var _3={};if(1){var _4=_2.rawConfig,p;for(p in _4){_3[p]=_4[p];}}else{var _5=function(_6,_7,_8){for(p in _6){p!="has"&&_1.add(_7+p,_6[p],0,_8);}};_3=1?_2.rawConfig:this.dojoConfig||this.djConfig||{};_5(_3,"config",1);_5(_3.has,"",1);}return _3;}); \ No newline at end of file
diff --git a/lib/dojo/_base/config.js.uncompressed.js b/lib/dojo/_base/config.js.uncompressed.js
new file mode 100644
index 000000000..290efd10a
--- /dev/null
+++ b/lib/dojo/_base/config.js.uncompressed.js
@@ -0,0 +1,174 @@
+define("dojo/_base/config", ["../has", "require"], function(has, require){
+ // module:
+ // dojo/_base/config
+ // summary:
+ // This module defines the user configuration during bootstrap.
+ // description:
+ // By defining user configuration as a module value, an entire configuration can be specified in a build,
+ // thereby eliminating the need for sniffing and or explicitly setting in the global variable dojoConfig.
+ // Also, when multiple instances of dojo exist in a single application, each will necessarily be located
+ // at an unique absolute module identifier as given by the package configuration. Implementing configuration
+ // as a module allows for specifying unique, per-instance configurations.
+ // example:
+ // Create a second instance of dojo with a different, instance-uniqe configuration (assume the loader and
+ // dojo.js are already loaded).
+ // | // specify a configuration that creates a new instance of dojo at the absolute module identifier "myDojo"
+ // | require({
+ // | packages:[{
+ // | name:"myDojo",
+ // | location:".", //assume baseUrl points to dojo.js
+ // | }]
+ // | });
+ // |
+ // | // specify a configuration for the myDojo instance
+ // | define("myDojo/config", {
+ // | // normal configuration variables go here, e.g.,
+ // | locale:"fr-ca"
+ // | });
+ // |
+ // | // load and use the new instance of dojo
+ // | require(["myDojo"], function(dojo) {
+ // | // dojo is the new instance of dojo
+ // | // use as required
+ // | });
+
+ var result = {};
+ if(1){
+ // must be the dojo loader; take a shallow copy of require.rawConfig
+ var src = require.rawConfig, p;
+ for(p in src){
+ result[p] = src[p];
+ }
+ }else{
+ var adviseHas = function(featureSet, prefix, booting){
+ for(p in featureSet){
+ p!="has" && has.add(prefix + p, featureSet[p], 0, booting);
+ }
+ };
+ result = 1 ?
+ // must be a built version of the dojo loader; all config stuffed in require.rawConfig
+ require.rawConfig :
+ // a foreign loader
+ this.dojoConfig || this.djConfig || {};
+ adviseHas(result, "config", 1);
+ adviseHas(result.has, "", 1);
+ }
+ return result;
+
+/*=====
+// note:
+// 'dojoConfig' does not exist under 'dojo.*' so that it can be set before the
+// 'dojo' variable exists.
+// note:
+// Setting any of these variables *after* the library has loaded does
+// nothing at all.
+
+// FIXME: can we document these on dojo.config object and explain they must be set via djConfig/dojoConfig global prior to loading dojo.js
+
+dojoConfig = {
+ // summary:
+ // Application code can set the global 'dojoConfig' prior to loading
+ // the library to control certain global settings for how dojo works.
+ //
+ // isDebug: Boolean
+ // Defaults to `false`. If set to `true`, ensures that Dojo provides
+ // extended debugging feedback via Firebug. If Firebug is not available
+ // on your platform, setting `isDebug` to `true` will force Dojo to
+ // pull in (and display) the version of Firebug Lite which is
+ // integrated into the Dojo distribution, thereby always providing a
+ // debugging/logging console when `isDebug` is enabled. Note that
+ // Firebug's `console.*` methods are ALWAYS defined by Dojo. If
+ // `isDebug` is false and you are on a platform without Firebug, these
+ // methods will be defined as no-ops.
+ isDebug: false,
+ // locale: String
+ // The locale to assume for loading localized resources in this page,
+ // specified according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).
+ // Must be specified entirely in lowercase, e.g. `en-us` and `zh-cn`.
+ // See the documentation for `dojo.i18n` and `dojo.requireLocalization`
+ // for details on loading localized resources. If no locale is specified,
+ // Dojo assumes the locale of the user agent, according to `navigator.userLanguage`
+ // or `navigator.language` properties.
+ locale: undefined,
+ // extraLocale: Array
+ // No default value. Specifies additional locales whose
+ // resources should also be loaded alongside the default locale when
+ // calls to `dojo.requireLocalization()` are processed.
+ extraLocale: undefined,
+ // baseUrl: String
+ // The directory in which `dojo.js` is located. Under normal
+ // conditions, Dojo auto-detects the correct location from which it
+ // was loaded. You may need to manually configure `baseUrl` in cases
+ // where you have renamed `dojo.js` or in which `<base>` tags confuse
+ // some browsers (e.g. IE 6). The variable `dojo.baseUrl` is assigned
+ // either the value of `djConfig.baseUrl` if one is provided or the
+ // auto-detected root if not. Other modules are located relative to
+ // this path. The path should end in a slash.
+ baseUrl: undefined,
+ // modulePaths: Object
+ // A map of module names to paths relative to `dojo.baseUrl`. The
+ // key/value pairs correspond directly to the arguments which
+ // `dojo.registerModulePath` accepts. Specifiying
+ // `djConfig.modulePaths = { "foo": "../../bar" }` is the equivalent
+ // of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple
+ // modules may be configured via `djConfig.modulePaths`.
+ modulePaths: {},
+ // afterOnLoad: Boolean
+ // Indicates Dojo was added to the page after the page load. In this case
+ // Dojo will not wait for the page DOMContentLoad/load events and fire
+ // its dojo.addOnLoad callbacks after making sure all outstanding
+ // dojo.required modules have loaded. Only works with a built dojo.js,
+ // it does not work the dojo.js directly from source control.
+ afterOnLoad: false,
+ // addOnLoad: Function or Array
+ // Adds a callback via dojo.addOnLoad. Useful when Dojo is added after
+ // the page loads and djConfig.afterOnLoad is true. Supports the same
+ // arguments as dojo.addOnLoad. When using a function reference, use
+ // `djConfig.addOnLoad = function(){};`. For object with function name use
+ // `djConfig.addOnLoad = [myObject, "functionName"];` and for object with
+ // function reference use
+ // `djConfig.addOnLoad = [myObject, function(){}];`
+ addOnLoad: null,
+ // require: Array
+ // An array of module names to be loaded immediately after dojo.js has been included
+ // in a page.
+ require: [],
+ // defaultDuration: Array
+ // Default duration, in milliseconds, for wipe and fade animations within dijits.
+ // Assigned to dijit.defaultDuration.
+ defaultDuration: 200,
+ // dojoBlankHtmlUrl: String
+ // Used by some modules to configure an empty iframe. Used by dojo.io.iframe and
+ // dojo.back, and dijit popup support in IE where an iframe is needed to make sure native
+ // controls do not bleed through the popups. Normally this configuration variable
+ // does not need to be set, except when using cross-domain/CDN Dojo builds.
+ // Save dojo/resources/blank.html to your domain and set `djConfig.dojoBlankHtmlUrl`
+ // to the path on your domain your copy of blank.html.
+ dojoBlankHtmlUrl: undefined,
+ // ioPublish: Boolean?
+ // Set this to true to enable publishing of topics for the different phases of
+ // IO operations. Publishing is done via dojo.publish. See dojo.__IoPublish for a list
+ // of topics that are published.
+ ioPublish: false,
+ // useCustomLogger: Anything?
+ // If set to a value that evaluates to true such as a string or array and
+ // isDebug is true and Firebug is not available or running, then it bypasses
+ // the creation of Firebug Lite allowing you to define your own console object.
+ useCustomLogger: undefined,
+ // transparentColor: Array
+ // Array containing the r, g, b components used as transparent color in dojo.Color;
+ // if undefined, [255,255,255] (white) will be used.
+ transparentColor: undefined,
+ // skipIeDomLoaded: Boolean
+ // For IE only, skip the DOMContentLoaded hack used. Sometimes it can cause an Operation
+ // Aborted error if the rest of the page triggers script defers before the DOM is ready.
+ // If this is config value is set to true, then dojo.addOnLoad callbacks will not be
+ // triggered until the page load event, which is after images and iframes load. If you
+ // want to trigger the callbacks sooner, you can put a script block in the bottom of
+ // your HTML that calls dojo._loadInit();. If you are using multiversion support, change
+ // "dojo." to the appropriate scope name for dojo.
+ skipIeDomLoaded: false
+}
+=====*/
+});
+
diff --git a/lib/dojo/_base/_loader/hostenv_ff_ext.js b/lib/dojo/_base/configFirefoxExtension.js
index ca47a4c1c..ce30c9153 100644
--- a/lib/dojo/_base/_loader/hostenv_ff_ext.js
+++ b/lib/dojo/_base/configFirefoxExtension.js
@@ -1,9 +1,4 @@
-/*
- 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
-*/
-
+// TODO: this file needs to be converted to the v1.7 loader
// a host environment specifically built for Mozilla extensions, but derived
// from the browser host environment
@@ -18,13 +13,12 @@ if(typeof window != 'undefined'){
// attempt to figure out the path to dojo if it isn't set in the config
(function(){
- var d = dojo;
// this is a scope protection closure. We set browser versions and grab
// the URL we were loaded from here.
// FIXME: need to probably use a different reference to "document" to get the hosting XUL environment
- d.baseUrl = d.config.baseUrl;
+ dojo.baseUrl = dojo.config.baseUrl;
// fill in the rendering support information in dojo.render.*
var n = navigator;
@@ -32,25 +26,25 @@ if(typeof window != 'undefined'){
var dav = n.appVersion;
var tv = parseFloat(dav);
- d.isMozilla = d.isMoz = tv;
- if(d.isMoz){
- d.isFF = parseFloat(dua.split("Firefox/")[1]) || undefined;
+ dojo.isMozilla = dojo.isMoz = tv;
+ if(dojo.isMoz){
+ dojo.isFF = parseFloat(dua.split("Firefox/")[1]) || undefined;
}
// FIXME
- d.isQuirks = document.compatMode == "BackCompat";
+ dojo.isQuirks = document.compatMode == "BackCompat";
// FIXME
// TODO: is the HTML LANG attribute relevant?
- d.locale = dojo.config.locale || n.language.toLowerCase();
+ dojo.locale = dojo.config.locale || n.language.toLowerCase();
- d._xhrObj = function(){
+ dojo._xhrObj = function(){
return new XMLHttpRequest();
- }
+ };
// monkey-patch _loadUri to handle file://, chrome://, and resource:// url's
- var oldLoadUri = d._loadUri;
- d._loadUri = function(uri, cb){
+ var oldLoadUri = dojo._loadUri;
+ dojo._loadUri = function(uri, cb){
var handleLocal = ["file:", "chrome:", "resource:"].some(function(prefix){
return String(uri).indexOf(prefix) == 0;
});
@@ -59,23 +53,23 @@ if(typeof window != 'undefined'){
// http://developer.mozilla.org/en/mozIJSSubScriptLoader
var l = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
.getService(Components.interfaces.mozIJSSubScriptLoader);
- var value = l.loadSubScript(uri, d.global)
+ var value = l.loadSubScript(uri, dojo.global);
if(cb){ cb(value); }
return true;
}else{
// otherwise, call the pre-existing version
- return oldLoadUri.apply(d, arguments);
+ return oldLoadUri.apply(dojo, arguments);
}
- }
+ };
// FIXME: PORTME
- d._isDocumentOk = function(http){
+ dojo._isDocumentOk = function(http){
var stat = http.status || 0;
return (stat >= 200 && stat < 300) || // Boolean
stat == 304 || // allow any 2XX response code
stat == 1223 || // get it out of the cache
- (!stat && (location.protocol=="file:" || location.protocol=="chrome:") );
- }
+ (!stat && (location.protocol == "file:" || location.protocol == "chrome:") );
+ };
// FIXME: PORTME
// var owloc = window.location+"";
@@ -83,7 +77,7 @@ if(typeof window != 'undefined'){
// var hasBase = (base && base.length > 0);
var hasBase = false;
- d._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){
+ dojo._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){
// summary: Read the contents of the specified uri and return those contents.
// uri:
// A relative or absolute uri. If absolute, it still must be in
@@ -97,15 +91,15 @@ if(typeof window != 'undefined'){
// alert("_getText: " + uri);
// NOTE: must be declared before scope switches ie. this._xhrObj()
- var http = d._xhrObj();
+ var http = dojo._xhrObj();
if(!hasBase && dojo._Url){
uri = (new dojo._Url(uri)).toString();
}
- if(d.config.cacheBust){
+ if(dojo.config.cacheBust){
//Make sure we have a string before string methods are used on uri
uri += "";
- uri += (uri.indexOf("?") == -1 ? "?" : "&") + String(d.config.cacheBust).replace(/\W+/g,"");
+ uri += (uri.indexOf("?") == -1 ? "?" : "&") + String(dojo.config.cacheBust).replace(/\W+/g, "");
}
var handleLocal = ["file:", "chrome:", "resource:"].some(function(prefix){
return String(uri).indexOf(prefix) == 0;
@@ -115,7 +109,7 @@ if(typeof window != 'undefined'){
// http://forums.mozillazine.org/viewtopic.php?p=921150#921150
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
- var scriptableStream=Components
+ var scriptableStream = Components
.classes["@mozilla.org/scriptableinputstream;1"]
.getService(Components.interfaces.nsIScriptableInputStream);
@@ -131,37 +125,39 @@ if(typeof window != 'undefined'){
try{
http.send(null);
// alert(http);
- if(!d._isDocumentOk(http)){
- var err = Error("Unable to load "+uri+" status:"+ http.status);
+ if(!dojo._isDocumentOk(http)){
+ var err = Error("Unable to load " + uri + " status:" + http.status);
err.status = http.status;
err.responseText = http.responseText;
throw err;
}
}catch(e){
- if(fail_ok){ return null; } // null
+ if(fail_ok){
+ return null;
+ } // null
// rethrow the exception
throw e;
}
return http.responseText; // String
}
- }
-
- d._windowUnloaders = [];
-
+ };
+
+ dojo._windowUnloaders = [];
+
// FIXME: PORTME
- d.windowUnloaded = function(){
+ dojo.windowUnloaded = function(){
// summary:
// signal fired by impending window destruction. You may use
// dojo.addOnWIndowUnload() or dojo.connect() to this method to perform
// page/application cleanup methods. See dojo.addOnWindowUnload for more info.
- var mll = d._windowUnloaders;
+ var mll = dojo._windowUnloaders;
while(mll.length){
(mll.pop())();
}
- }
+ };
// FIXME: PORTME
- d.addOnWindowUnload = function(/*Object?*/obj, /*String|Function?*/functionName){
+ dojo.addOnWindowUnload = function(/*Object?*/obj, /*String|Function?*/functionName){
// summary:
// registers a function to be triggered when window.onunload fires.
// Be careful trying to modify the DOM or access JavaScript properties
@@ -172,9 +168,9 @@ if(typeof window != 'undefined'){
// | dojo.addOnWindowUnload(functionPointer)
// | dojo.addOnWindowUnload(object, "functionName")
// | dojo.addOnWindowUnload(object, function(){ /* ... */});
-
- d._onto(d._windowUnloaders, obj, functionName);
- }
+
+ dojo._onto(dojo._windowUnloaders, obj, functionName);
+ };
// XUL specific APIs
var contexts = [];
@@ -271,7 +267,7 @@ if(typeof window != 'undefined'){
if(dojo._inFlightCount == 0){
dojo._modulesLoaded();
}
- }
+ };
/*
(function(){
@@ -294,7 +290,7 @@ if(typeof window != 'undefined'){
_handleNodeEvent("onunload", function() { dojo.windowUnloaded(); });
})();
*/
-
+
// FIXME: PORTME
// this event fires a lot, namely for all plugin XUL overlays and for
@@ -302,7 +298,7 @@ if(typeof window != 'undefined'){
// Dojo's to fire once..but we might care if pages navigate. We'll
// probably need an extension-specific API
if(!dojo.config.afterOnLoad){
- window.addEventListener("DOMContentLoaded",function(e){
+ window.addEventListener("DOMContentLoaded", function(e){
dojo._loadInit(e);
// console.log("DOM content loaded", e);
}, false);
@@ -328,11 +324,11 @@ if(dojo.config.isDebug){
console.log = function(m){
var s = Components.classes["@mozilla.org/consoleservice;1"].getService(
Components.interfaces.nsIConsoleService
- );
+ );
s.logStringMessage(m);
- }
+ };
console.debug = function(){
console.log(dojo._toArray(arguments).join(" "));
- }
+ };
// FIXME: what about the rest of the console.* methods? And is there any way to reach into firebug and log into it directly?
}
diff --git a/lib/dojo/_base/configNode.js b/lib/dojo/_base/configNode.js
new file mode 100644
index 000000000..7cd6f14f9
--- /dev/null
+++ b/lib/dojo/_base/configNode.js
@@ -0,0 +1,87 @@
+exports.config = function(config){
+ // summary:
+ // This module provides bootstrap configuration for running dojo in node.js
+
+ // any command line arguments with the load flag are pushed into deps
+ for(var deps = [], args = [], i = 0; i < process.argv.length; i++){
+ var arg = (process.argv[i] + "").split("=");
+ if(arg[0] == "load"){
+ deps.push(arg[1]);
+ }else{
+ args.push(arg);
+ }
+ }
+
+ var fs = require("fs");
+
+ // make sure global require exists
+ //if (typeof global.require=="undefined") {
+ // global.require= {};
+ //}
+
+ // reset the has cache with node-appropriate values;
+ var hasCache = {
+ "host-node":1,
+ "host-browser":0,
+ "dom":0,
+ "dojo-has-api":1,
+ "dojo-xhr-factory":0,
+ "dojo-inject-api":1,
+ "dojo-timeout-api":0,
+ "dojo-trace-api":1,
+ "dojo-dom-ready-api":0,
+ "dojo-publish-privates":1,
+ "dojo-sniff":0,
+ "dojo-loader":1,
+ "dojo-test-xd":0,
+ "dojo-test-sniff":0
+ };
+ for(var p in hasCache){
+ config.hasCache[p] = hasCache[p];
+ }
+
+ var vm = require('vm');
+
+
+ // reset some configuration switches with node-appropriate values
+ var nodeConfig = {
+ baseUrl: __dirname.match(/(.+)[\/\\]_base$/)[1],
+ commandLineArgs:args,
+ deps:deps,
+ timeout:0,
+
+ // TODO: really get the locale
+ locale:"en-us",
+
+ loaderPatch: {
+ log:function(item){
+ // define debug for console messages during dev instead of console.log
+ // (node's heavy async makes console.log confusing sometimes)
+ var util = require("util");
+ util.debug(util.inspect(item));
+ },
+
+ eval: function(__text, __urlHint){
+ return vm.runInThisContext(__text, __urlHint);
+ },
+
+ injectUrl: function(url, callback){
+ try{
+ vm.runInThisContext(fs.readFileSync(url, "utf8"), url);
+ callback();
+ }catch(e){
+ this.log("failed to load resource (" + url + ")");
+ this.log(e);
+ }
+ },
+
+ getText: function(url, sync, onLoad){
+ // TODO: implement async and http/https handling
+ onLoad(fs.readFileSync(url, "utf8"));
+ }
+ }
+ };
+ for(p in nodeConfig){
+ config[p] = nodeConfig[p];
+ }
+};
diff --git a/lib/dojo/_base/configRhino.js b/lib/dojo/_base/configRhino.js
new file mode 100644
index 000000000..ec6475997
--- /dev/null
+++ b/lib/dojo/_base/configRhino.js
@@ -0,0 +1,121 @@
+function rhinoDojoConfig(config, baseUrl, rhinoArgs){
+ // summary:
+ // This module provides bootstrap configuration for running dojo in rhino.
+
+ // TODO: v1.6 tries to set dojo.doc and dojo.body in rhino; why?
+
+ // get a minimal console up
+ var log = function(hint, args){
+ print((hint ? hint + ":" : "") + args[0]);
+ for(var i = 1; i < args.length; i++){
+ print(", " + args[i]);
+ }
+ };
+ // intentionally define console in the global namespace
+ console= {
+ log: function(){ log(0, arguments); },
+ error: function(){ log("ERROR", arguments); },
+ warn: function(){ log("WARN", arguments); }
+ };
+
+ // any command line arguments with the load flag are pushed into deps
+ for(var deps = [], i = 0; i < rhinoArgs.length; i++){
+ var arg = (rhinoArgs[i] + "").split("=");
+ if(arg[0] == "load"){
+ deps.push(arg[1]);
+ }
+ }
+
+ // provides timed callbacks using Java threads
+ if(typeof setTimeout == "undefined" || typeof clearTimeout == "undefined"){
+ var timeouts = [];
+ clearTimeout = function(idx){
+ if(!timeouts[idx]){ return; }
+ timeouts[idx].stop();
+ };
+
+ setTimeout = function(func, delay){
+ var def = {
+ sleepTime:delay,
+ hasSlept:false,
+
+ run:function(){
+ if(!this.hasSlept){
+ this.hasSlept = true;
+ java.lang.Thread.currentThread().sleep(this.sleepTime);
+ }
+ try{
+ func();
+ }catch(e){
+ console.debug("Error running setTimeout thread:" + e);
+ }
+ }
+ };
+
+ var runnable = new java.lang.Runnable(def);
+ var thread = new java.lang.Thread(runnable);
+ thread.start();
+ return timeouts.push(thread) - 1;
+ };
+ }
+
+ var isLocal = function(url){
+ return (new java.io.File(url)).exists();
+ };
+
+ // reset the has cache with node-appropriate values;
+ var hasCache = {
+ "host-rhino":1,
+ "host-browser":0,
+ "dom":0,
+ "dojo-has-api":1,
+ "dojo-xhr-factory":0,
+ "dojo-inject-api":1,
+ "dojo-timeout-api":0,
+ "dojo-trace-api":1,
+ "dojo-loader-catches":1,
+ "dojo-dom-ready-api":0,
+ "dojo-publish-privates":1,
+ "dojo-sniff":0,
+ "dojo-loader":1,
+ "dojo-test-xd":0,
+ "dojo-test-sniff":0
+ };
+ for(var p in hasCache){
+ config.hasCache[p] = hasCache[p];
+ }
+
+ // reset some configuration switches with rhino-appropriate values
+ var rhinoConfig = {
+ baseUrl:baseUrl,
+ commandLineArgs:rhinoArgs,
+ deps:deps,
+ timeout:0,
+ locale:String(java.util.Locale.getDefault().toString().replace('_', '-').toLowerCase()),
+
+ loaderPatch:{
+ injectUrl: function(url, callback){
+ try{
+ if(isLocal(url)){
+ load(url);
+ }else{
+ require.eval(readUrl(url, "UTF-8"));
+ }
+ callback();
+ }catch(e){
+ console.log("failed to load resource (" + url + ")");
+ console.log(e);
+ }
+ },
+
+ getText: function(url, sync, onLoad){
+ // TODO: test https://bugzilla.mozilla.org/show_bug.cgi?id=471005; see v1.6 hostenv_rhino
+ // note: async mode not supported in rhino
+ onLoad(isLocal(url) ? readFile(url, "UTF-8") : readUrl(url, "UTF-8"));
+ }
+ }
+ };
+ for(p in rhinoConfig){
+ config[p] = rhinoConfig[p];
+ }
+}
diff --git a/lib/dojo/_base/_loader/hostenv_spidermonkey.js b/lib/dojo/_base/configSpidermonkey.js
index a3d2dfc6f..0da0d7102 100644
--- a/lib/dojo/_base/_loader/hostenv_spidermonkey.js
+++ b/lib/dojo/_base/configSpidermonkey.js
@@ -1,8 +1,4 @@
-/*
- 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
-*/
+// TODO: this file needs to be converted to the v1.7 loader
/*
@@ -26,7 +22,7 @@ dojo.isSpidermonkey = {
dojo.isSpidermonkey = true;
dojo.exit = function(exitcode){
quit(exitcode);
-}
+};
if(typeof print == "function"){
console.debug = print;
@@ -46,24 +42,24 @@ dojo._spidermonkeyCurrentFile = function(depth){
// the stack, but that does require that you know how deep your stack is when you are
// calling.
//
- var s = '';
- try{
+ var s = '';
+ try{
throw Error("whatever");
}catch(e){
s = e.stack;
}
- // lines are like: bu_getCurrentScriptURI_spidermonkey("ScriptLoader.js")@burst/Runtime.js:101
- var matches = s.match(/[^@]*\.js/gi);
- if(!matches){
+ // lines are like: bu_getCurrentScriptURI_spidermonkey("ScriptLoader.js")@burst/Runtime.js:101
+ var matches = s.match(/[^@]*\.js/gi);
+ if(!matches){
throw Error("could not parse stack string: '" + s + "'");
}
- var fname = (typeof depth != 'undefined' && depth) ? matches[depth + 1] : matches[matches.length - 1];
- if(!fname){
+ var fname = (typeof depth != 'undefined' && depth) ? matches[depth + 1] : matches[matches.length - 1];
+ if(!fname){
throw Error("could not find file name in stack string '" + s + "'");
}
- //print("SpiderMonkeyRuntime got fname '" + fname + "' from stack string '" + s + "'");
- return fname;
-}
+ //print("SpiderMonkeyRuntime got fname '" + fname + "' from stack string '" + s + "'");
+ return fname;
+};
// print(dojo._spidermonkeyCurrentFile(0));
@@ -72,10 +68,11 @@ dojo._loadUri = function(uri){
// is what we want).
// TODO: sigh, load() does not return a useful value.
// Perhaps it is returning the value of the last thing evaluated?
- var ok = load(uri);
+ // var ok =
+ load(uri);
// console.log("spidermonkey load(", uri, ") returned ", ok);
return 1;
-}
+};
//Register any module paths set up in djConfig. Need to do this
//in the hostenvs since hostenv_browser can read djConfig from a
diff --git a/lib/dojo/_base/connect.js b/lib/dojo/_base/connect.js
index 7e8006221..6fa7aabc3 100644
--- a/lib/dojo/_base/connect.js
+++ b/lib/dojo/_base/connect.js
@@ -4,308 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.connect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.connect"] = true;
-dojo.provide("dojo._base.connect");
-dojo.require("dojo._base.lang");
-
-
-// this file courtesy of the TurboAjax Group, licensed under a Dojo CLA
-
-// low-level delegation machinery
-dojo._listener = {
- // create a dispatcher function
- getDispatcher: function(){
- // following comments pulled out-of-line to prevent cloning them
- // in the returned function.
- // - indices (i) that are really in the array of listeners (ls) will
- // not be in Array.prototype. This is the 'sparse array' trick
- // that keeps us safe from libs that take liberties with built-in
- // objects
- // - listener is invoked with current scope (this)
- return function(){
- var ap = Array.prototype, c = arguments.callee, ls = c._listeners, t = c.target,
- // return value comes from original target function
- r = t && t.apply(this, arguments),
- // make local copy of listener array so it is immutable during processing
- i, lls = [].concat(ls)
- ;
-
- // invoke listeners after target function
- for(i in lls){
- if(!(i in ap)){
- lls[i].apply(this, arguments);
- }
- }
- // return value comes from original target function
- return r;
- };
- },
- // add a listener to an object
- add: function(/*Object*/ source, /*String*/ method, /*Function*/ listener){
- // Whenever 'method' is invoked, 'listener' will have the same scope.
- // Trying to supporting a context object for the listener led to
- // complexity.
- // Non trivial to provide 'once' functionality here
- // because listener could be the result of a dojo.hitch call,
- // in which case two references to the same hitch target would not
- // be equivalent.
- source = source || dojo.global;
- // The source method is either null, a dispatcher, or some other function
- var f = source[method];
- // Ensure a dispatcher
- if(!f || !f._listeners){
- var d = dojo._listener.getDispatcher();
- // original target function is special
- d.target = f;
- // dispatcher holds a list of listeners
- d._listeners = [];
- // redirect source to dispatcher
- f = source[method] = d;
- }
- // The contract is that a handle is returned that can
- // identify this listener for disconnect.
- //
- // The type of the handle is private. Here is it implemented as Integer.
- // DOM event code has this same contract but handle is Function
- // in non-IE browsers.
- //
- // We could have separate lists of before and after listeners.
- return f._listeners.push(listener); /*Handle*/
- },
- // remove a listener from an object
- remove: function(/*Object*/ source, /*String*/ method, /*Handle*/ handle){
- var f = (source || dojo.global)[method];
- // remember that handle is the index+1 (0 is not a valid handle)
- if(f && f._listeners && handle--){
- delete f._listeners[handle];
- }
- }
-};
-
-// Multiple delegation for arbitrary methods.
-
-// This unit knows nothing about DOM, but we include DOM aware documentation
-// and dontFix argument here to help the autodocs. Actual DOM aware code is in
-// event.js.
-
-dojo.connect = function(/*Object|null*/ obj,
- /*String*/ event,
- /*Object|null*/ context,
- /*String|Function*/ method,
- /*Boolean?*/ dontFix){
- // summary:
- // `dojo.connect` is the core event handling and delegation method in
- // Dojo. It allows one function to "listen in" on the execution of
- // any other, triggering the second whenever the first is called. Many
- // listeners may be attached to a function, and source functions may
- // be either regular function calls or DOM events.
- //
- // description:
- // Connects listeners to actions, so that after event fires, a
- // listener is called with the same arguments passed to the original
- // function.
- //
- // Since `dojo.connect` allows the source of events to be either a
- // "regular" JavaScript function or a DOM event, it provides a uniform
- // interface for listening to all the types of events that an
- // application is likely to deal with though a single, unified
- // interface. DOM programmers may want to think of it as
- // "addEventListener for everything and anything".
- //
- // When setting up a connection, the `event` parameter must be a
- // string that is the name of the method/event to be listened for. If
- // `obj` is null, `dojo.global` is assumed, meaning that connections
- // to global methods are supported but also that you may inadvertently
- // connect to a global by passing an incorrect object name or invalid
- // reference.
- //
- // `dojo.connect` generally is forgiving. If you pass the name of a
- // function or method that does not yet exist on `obj`, connect will
- // not fail, but will instead set up a stub method. Similarly, null
- // arguments may simply be omitted such that fewer than 4 arguments
- // may be required to set up a connection See the examples for details.
- //
- // The return value is a handle that is needed to
- // remove this connection with `dojo.disconnect`.
- //
- // obj:
- // The source object for the event function.
- // Defaults to `dojo.global` if null.
- // If obj is a DOM node, the connection is delegated
- // to the DOM event manager (unless dontFix is true).
- //
- // event:
- // String name of the event function in obj.
- // I.e. identifies a property `obj[event]`.
- //
- // context:
- // The object that method will receive as "this".
- //
- // If context is null and method is a function, then method
- // inherits the context of event.
- //
- // If method is a string then context must be the source
- // object object for method (context[method]). If context is null,
- // dojo.global is used.
- //
- // method:
- // A function reference, or name of a function in context.
- // The function identified by method fires after event does.
- // method receives the same arguments as the event.
- // See context argument comments for information on method's scope.
- //
- // dontFix:
- // If obj is a DOM node, set dontFix to true to prevent delegation
- // of this connection to the DOM event manager.
- //
- // example:
- // When obj.onchange(), do ui.update():
- // | dojo.connect(obj, "onchange", ui, "update");
- // | dojo.connect(obj, "onchange", ui, ui.update); // same
- //
- // example:
- // Using return value for disconnect:
- // | var link = dojo.connect(obj, "onchange", ui, "update");
- // | ...
- // | dojo.disconnect(link);
- //
- // example:
- // When onglobalevent executes, watcher.handler is invoked:
- // | dojo.connect(null, "onglobalevent", watcher, "handler");
- //
- // example:
- // When ob.onCustomEvent executes, customEventHandler is invoked:
- // | dojo.connect(ob, "onCustomEvent", null, "customEventHandler");
- // | dojo.connect(ob, "onCustomEvent", "customEventHandler"); // same
- //
- // example:
- // When ob.onCustomEvent executes, customEventHandler is invoked
- // with the same scope (this):
- // | dojo.connect(ob, "onCustomEvent", null, customEventHandler);
- // | dojo.connect(ob, "onCustomEvent", customEventHandler); // same
- //
- // example:
- // When globalEvent executes, globalHandler is invoked
- // with the same scope (this):
- // | dojo.connect(null, "globalEvent", null, globalHandler);
- // | dojo.connect("globalEvent", globalHandler); // same
-
- // normalize arguments
- var a=arguments, args=[], i=0;
- // if a[0] is a String, obj was omitted
- args.push(dojo.isString(a[0]) ? null : a[i++], a[i++]);
- // if the arg-after-next is a String or Function, context was NOT omitted
- var a1 = a[i+1];
- args.push(dojo.isString(a1)||dojo.isFunction(a1) ? a[i++] : null, a[i++]);
- // absorb any additional arguments
- for(var l=a.length; i<l; i++){ args.push(a[i]); }
- // do the actual work
- return dojo._connect.apply(this, args); /*Handle*/
-}
-
-// used by non-browser hostenvs. always overriden by event.js
-dojo._connect = function(obj, event, context, method){
- var l=dojo._listener, h=l.add(obj, event, dojo.hitch(context, method));
- return [obj, event, h, l]; // Handle
-};
-
-dojo.disconnect = function(/*Handle*/ handle){
- // summary:
- // Remove a link created by dojo.connect.
- // description:
- // Removes the connection between event and the method referenced by handle.
- // handle:
- // the return value of the dojo.connect call that created the connection.
- if(handle && handle[0] !== undefined){
- dojo._disconnect.apply(this, handle);
- // let's not keep this reference
- delete handle[0];
- }
-};
-
-dojo._disconnect = function(obj, event, handle, listener){
- listener.remove(obj, event, handle);
-};
-
-// topic publish/subscribe
-
-dojo._topics = {};
-
-dojo.subscribe = function(/*String*/ topic, /*Object|null*/ context, /*String|Function*/ method){
- // summary:
- // Attach a listener to a named topic. The listener function is invoked whenever the
- // named topic is published (see: dojo.publish).
- // Returns a handle which is needed to unsubscribe this listener.
- // context:
- // Scope in which method will be invoked, or null for default scope.
- // method:
- // The name of a function in context, or a function reference. This is the function that
- // is invoked when topic is published.
- // example:
- // | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); });
- // | dojo.publish("alerts", [ "read this", "hello world" ]);
-
- // support for 2 argument invocation (omitting context) depends on hitch
- return [topic, dojo._listener.add(dojo._topics, topic, dojo.hitch(context, method))]; /*Handle*/
-};
-
-dojo.unsubscribe = function(/*Handle*/ handle){
- // summary:
- // Remove a topic listener.
- // handle:
- // The handle returned from a call to subscribe.
- // example:
- // | var alerter = dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
- // | ...
- // | dojo.unsubscribe(alerter);
- if(handle){
- dojo._listener.remove(dojo._topics, handle[0], handle[1]);
- }
-};
-
-dojo.publish = function(/*String*/ topic, /*Array*/ args){
- // summary:
- // Invoke all listener method subscribed to topic.
- // topic:
- // The name of the topic to publish.
- // args:
- // An array of arguments. The arguments will be applied
- // to each topic subscriber (as first class parameters, via apply).
- // example:
- // | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
- // | dojo.publish("alerts", [ "read this", "hello world" ]);
-
- // Note that args is an array, which is more efficient vs variable length
- // argument list. Ideally, var args would be implemented via Array
- // throughout the APIs.
- var f = dojo._topics[topic];
- if(f){
- f.apply(this, args||[]);
- }
-};
-
-dojo.connectPublisher = function( /*String*/ topic,
- /*Object|null*/ obj,
- /*String*/ event){
- // summary:
- // Ensure that every time obj.event() is called, a message is published
- // on the topic. Returns a handle which can be passed to
- // dojo.disconnect() to disable subsequent automatic publication on
- // the topic.
- // topic:
- // The name of the topic to publish.
- // obj:
- // The source object for the event function. Defaults to dojo.global
- // if null.
- // event:
- // The name of the event function in obj.
- // I.e. identifies a property obj[event].
- // example:
- // | dojo.connectPublisher("/ajax/start", dojo, "xhrGet");
- var pf = function(){ dojo.publish(topic, arguments); }
- return event ? dojo.connect(obj, event, pf) : dojo.connect(obj, pf); //Handle
-};
-
-}
+//>>built
+define("dojo/_base/connect",["./kernel","../on","../topic","../aspect","./event","../mouse","./sniff","./lang","../keys"],function(_1,on,_2,_3,_4,_5,_6,_7){_6.add("events-keypress-typed",function(){var _8={charCode:0};try{_8=document.createEvent("KeyboardEvent");(_8.initKeyboardEvent||_8.initKeyEvent).call(_8,"keypress",true,true,null,false,false,false,false,9,3);}catch(e){}return _8.charCode==0&&!_6("opera");});function _9(_a,_b,_c,_d,_e){_d=_7.hitch(_c,_d);if(!_a||!(_a.addEventListener||_a.attachEvent)){return _3.after(_a||_1.global,_b,_d,true);}if(typeof _b=="string"&&_b.substring(0,2)=="on"){_b=_b.substring(2);}if(!_a){_a=_1.global;}if(!_e){switch(_b){case "keypress":_b=_f;break;case "mouseenter":_b=_5.enter;break;case "mouseleave":_b=_5.leave;break;}}return on(_a,_b,_d,_e);};var _10={106:42,111:47,186:59,187:43,188:44,189:45,190:46,191:47,192:96,219:91,220:92,221:93,222:39,229:113};var _11=_6("mac")?"metaKey":"ctrlKey";var _12=function(evt,_13){var _14=_7.mixin({},evt,_13);_15(_14);_14.preventDefault=function(){evt.preventDefault();};_14.stopPropagation=function(){evt.stopPropagation();};return _14;};function _15(evt){evt.keyChar=evt.charCode?String.fromCharCode(evt.charCode):"";evt.charOrCode=evt.keyChar||evt.keyCode;};var _f;if(_6("events-keypress-typed")){var _16=function(e,_17){try{return (e.keyCode=_17);}catch(e){return 0;}};_f=function(_18,_19){var _1a=on(_18,"keydown",function(evt){var k=evt.keyCode;var _1b=(k!=13||(_6("ie")>=9&&!_6("quirks")))&&k!=32&&(k!=27||!_6("ie"))&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222)&&k!=229;if(_1b||evt.ctrlKey){var c=_1b?0:k;if(evt.ctrlKey){if(k==3||k==13){return _19.call(evt.currentTarget,evt);}else{if(c>95&&c<106){c-=48;}else{if((!evt.shiftKey)&&(c>=65&&c<=90)){c+=32;}else{c=_10[c]||c;}}}}var _1c=_12(evt,{type:"keypress",faux:true,charCode:c});_19.call(evt.currentTarget,_1c);if(_6("ie")){_16(evt,_1c.keyCode);}}});var _1d=on(_18,"keypress",function(evt){var c=evt.charCode;c=c>=32?c:0;evt=_12(evt,{charCode:c,faux:true});return _19.call(this,evt);});return {remove:function(){_1a.remove();_1d.remove();}};};}else{if(_6("opera")){_f=function(_1e,_1f){return on(_1e,"keypress",function(evt){var c=evt.which;if(c==3){c=99;}c=c<32&&!evt.shiftKey?0:c;if(evt.ctrlKey&&!evt.shiftKey&&c>=65&&c<=90){c+=32;}return _1f.call(this,_12(evt,{charCode:c}));});};}else{_f=function(_20,_21){return on(_20,"keypress",function(evt){_15(evt);return _21.call(this,evt);});};}}var _22={_keypress:_f,connect:function(obj,_23,_24,_25,_26){var a=arguments,_27=[],i=0;_27.push(typeof a[0]=="string"?null:a[i++],a[i++]);var a1=a[i+1];_27.push(typeof a1=="string"||typeof a1=="function"?a[i++]:null,a[i++]);for(var l=a.length;i<l;i++){_27.push(a[i]);}return _9.apply(this,_27);},disconnect:function(_28){if(_28){_28.remove();}},subscribe:function(_29,_2a,_2b){return _2.subscribe(_29,_7.hitch(_2a,_2b));},publish:function(_2c,_2d){return _2.publish.apply(_2,[_2c].concat(_2d));},connectPublisher:function(_2e,obj,_2f){var pf=function(){_22.publish(_2e,arguments);};return _2f?_22.connect(obj,_2f,pf):_22.connect(obj,pf);},isCopyKey:function(e){return e[_11];}};_22.unsubscribe=_22.disconnect;1&&_7.mixin(_1,_22);return _22;}); \ No newline at end of file
diff --git a/lib/dojo/_base/connect.js.uncompressed.js b/lib/dojo/_base/connect.js.uncompressed.js
new file mode 100644
index 000000000..69de83e70
--- /dev/null
+++ b/lib/dojo/_base/connect.js.uncompressed.js
@@ -0,0 +1,400 @@
+define("dojo/_base/connect", ["./kernel", "../on", "../topic", "../aspect", "./event", "../mouse", "./sniff", "./lang", "../keys"], function(kernel, on, hub, aspect, eventModule, mouse, has, lang){
+// module:
+// dojo/_base/connect
+// summary:
+// This module defines the dojo.connect API.
+// This modules also provides keyboard event handling helpers.
+// This module exports an extension event for emulating Firefox's keypress handling.
+// However, this extension event exists primarily for backwards compatibility and
+// is not recommended. WebKit and IE uses an alternate keypress handling (only
+// firing for printable characters, to distinguish from keydown events), and most
+// consider the WebKit/IE behavior more desirable.
+has.add("events-keypress-typed", function(){ // keypresses should only occur a printable character is hit
+ var testKeyEvent = {charCode: 0};
+ try{
+ testKeyEvent = document.createEvent("KeyboardEvent");
+ (testKeyEvent.initKeyboardEvent || testKeyEvent.initKeyEvent).call(testKeyEvent, "keypress", true, true, null, false, false, false, false, 9, 3);
+ }catch(e){}
+ return testKeyEvent.charCode == 0 && !has("opera");
+});
+
+function connect_(obj, event, context, method, dontFix){
+ method = lang.hitch(context, method);
+ if(!obj || !(obj.addEventListener || obj.attachEvent)){
+ // it is a not a DOM node and we are using the dojo.connect style of treating a
+ // method like an event, must go right to aspect
+ return aspect.after(obj || kernel.global, event, method, true);
+ }
+ if(typeof event == "string" && event.substring(0, 2) == "on"){
+ event = event.substring(2);
+ }
+ if(!obj){
+ obj = kernel.global;
+ }
+ if(!dontFix){
+ switch(event){
+ // dojo.connect has special handling for these event types
+ case "keypress":
+ event = keypress;
+ break;
+ case "mouseenter":
+ event = mouse.enter;
+ break;
+ case "mouseleave":
+ event = mouse.leave;
+ break;
+ }
+ }
+ return on(obj, event, method, dontFix);
+}
+
+var _punctMap = {
+ 106:42,
+ 111:47,
+ 186:59,
+ 187:43,
+ 188:44,
+ 189:45,
+ 190:46,
+ 191:47,
+ 192:96,
+ 219:91,
+ 220:92,
+ 221:93,
+ 222:39,
+ 229:113
+};
+var evtCopyKey = has("mac") ? "metaKey" : "ctrlKey";
+
+
+var _synthesizeEvent = function(evt, props){
+ var faux = lang.mixin({}, evt, props);
+ setKeyChar(faux);
+ // FIXME: would prefer to use lang.hitch: lang.hitch(evt, evt.preventDefault);
+ // but it throws an error when preventDefault is invoked on Safari
+ // does Event.preventDefault not support "apply" on Safari?
+ faux.preventDefault = function(){ evt.preventDefault(); };
+ faux.stopPropagation = function(){ evt.stopPropagation(); };
+ return faux;
+};
+function setKeyChar(evt){
+ evt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : '';
+ evt.charOrCode = evt.keyChar || evt.keyCode;
+}
+var keypress;
+if(has("events-keypress-typed")){
+ // this emulates Firefox's keypress behavior where every keydown can correspond to a keypress
+ var _trySetKeyCode = function(e, code){
+ try{
+ // squelch errors when keyCode is read-only
+ // (e.g. if keyCode is ctrl or shift)
+ return (e.keyCode = code);
+ }catch(e){
+ return 0;
+ }
+ };
+ keypress = function(object, listener){
+ var keydownSignal = on(object, "keydown", function(evt){
+ // munge key/charCode
+ var k=evt.keyCode;
+ // These are Windows Virtual Key Codes
+ // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp
+ var unprintable = (k!=13 || (has("ie") >= 9 && !has("quirks"))) && k!=32 && (k!=27||!has("ie")) && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222) && k!=229;
+ // synthesize keypress for most unprintables and CTRL-keys
+ if(unprintable||evt.ctrlKey){
+ var c = unprintable ? 0 : k;
+ if(evt.ctrlKey){
+ if(k==3 || k==13){
+ return listener.call(evt.currentTarget, evt); // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively
+ }else if(c>95 && c<106){
+ c -= 48; // map CTRL-[numpad 0-9] to ASCII
+ }else if((!evt.shiftKey)&&(c>=65&&c<=90)){
+ c += 32; // map CTRL-[A-Z] to lowercase
+ }else{
+ c = _punctMap[c] || c; // map other problematic CTRL combinations to ASCII
+ }
+ }
+ // simulate a keypress event
+ var faux = _synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c});
+ listener.call(evt.currentTarget, faux);
+ if(has("ie")){
+ _trySetKeyCode(evt, faux.keyCode);
+ }
+ }
+ });
+ var keypressSignal = on(object, "keypress", function(evt){
+ var c = evt.charCode;
+ c = c>=32 ? c : 0;
+ evt = _synthesizeEvent(evt, {charCode: c, faux: true});
+ return listener.call(this, evt);
+ });
+ return {
+ remove: function(){
+ keydownSignal.remove();
+ keypressSignal.remove();
+ }
+ };
+ };
+}else{
+ if(has("opera")){
+ keypress = function(object, listener){
+ return on(object, "keypress", function(evt){
+ var c = evt.which;
+ if(c==3){
+ c=99; // Mozilla maps CTRL-BREAK to CTRL-c
+ }
+ // can't trap some keys at all, like INSERT and DELETE
+ // there is no differentiating info between DELETE and ".", or INSERT and "-"
+ c = c<32 && !evt.shiftKey ? 0 : c;
+ if(evt.ctrlKey && !evt.shiftKey && c>=65 && c<=90){
+ // lowercase CTRL-[A-Z] keys
+ c += 32;
+ }
+ return listener.call(this, _synthesizeEvent(evt, { charCode: c }));
+ });
+ };
+ }else{
+ keypress = function(object, listener){
+ return on(object, "keypress", function(evt){
+ setKeyChar(evt);
+ return listener.call(this, evt);
+ });
+ };
+ }
+}
+
+var connect = {
+ _keypress:keypress,
+
+ connect:function(obj, event, context, method, dontFix){
+ // normalize arguments
+ var a=arguments, args=[], i=0;
+ // if a[0] is a String, obj was omitted
+ args.push(typeof a[0] == "string" ? null : a[i++], a[i++]);
+ // if the arg-after-next is a String or Function, context was NOT omitted
+ var a1 = a[i+1];
+ args.push(typeof a1 == "string" || typeof a1 == "function" ? a[i++] : null, a[i++]);
+ // absorb any additional arguments
+ for(var l=a.length; i<l; i++){ args.push(a[i]); }
+ return connect_.apply(this, args);
+ },
+
+ disconnect:function(handle){
+ if(handle){
+ handle.remove();
+ }
+ },
+
+ subscribe:function(topic, context, method){
+ return hub.subscribe(topic, lang.hitch(context, method));
+ },
+
+ publish:function(topic, args){
+ return hub.publish.apply(hub, [topic].concat(args));
+ },
+
+ connectPublisher:function(topic, obj, event){
+ var pf = function(){ connect.publish(topic, arguments); };
+ return event ? connect.connect(obj, event, pf) : connect.connect(obj, pf); //Handle
+ },
+
+ isCopyKey: function(e){
+ return e[evtCopyKey]; // Boolean
+ }
+};
+connect.unsubscribe = connect.disconnect;
+
+1 && lang.mixin(kernel, connect);
+return connect;
+
+/*=====
+dojo.connect = function(obj, event, context, method, dontFix){
+ // summary:
+ // `dojo.connect` is the core event handling and delegation method in
+ // Dojo. It allows one function to "listen in" on the execution of
+ // any other, triggering the second whenever the first is called. Many
+ // listeners may be attached to a function, and source functions may
+ // be either regular function calls or DOM events.
+ //
+ // description:
+ // Connects listeners to actions, so that after event fires, a
+ // listener is called with the same arguments passed to the original
+ // function.
+ //
+ // Since `dojo.connect` allows the source of events to be either a
+ // "regular" JavaScript function or a DOM event, it provides a uniform
+ // interface for listening to all the types of events that an
+ // application is likely to deal with though a single, unified
+ // interface. DOM programmers may want to think of it as
+ // "addEventListener for everything and anything".
+ //
+ // When setting up a connection, the `event` parameter must be a
+ // string that is the name of the method/event to be listened for. If
+ // `obj` is null, `kernel.global` is assumed, meaning that connections
+ // to global methods are supported but also that you may inadvertently
+ // connect to a global by passing an incorrect object name or invalid
+ // reference.
+ //
+ // `dojo.connect` generally is forgiving. If you pass the name of a
+ // function or method that does not yet exist on `obj`, connect will
+ // not fail, but will instead set up a stub method. Similarly, null
+ // arguments may simply be omitted such that fewer than 4 arguments
+ // may be required to set up a connection See the examples for details.
+ //
+ // The return value is a handle that is needed to
+ // remove this connection with `dojo.disconnect`.
+ //
+ // obj: Object|null:
+ // The source object for the event function.
+ // Defaults to `kernel.global` if null.
+ // If obj is a DOM node, the connection is delegated
+ // to the DOM event manager (unless dontFix is true).
+ //
+ // event: String:
+ // String name of the event function in obj.
+ // I.e. identifies a property `obj[event]`.
+ //
+ // context: Object|null
+ // The object that method will receive as "this".
+ //
+ // If context is null and method is a function, then method
+ // inherits the context of event.
+ //
+ // If method is a string then context must be the source
+ // object object for method (context[method]). If context is null,
+ // kernel.global is used.
+ //
+ // method: String|Function:
+ // A function reference, or name of a function in context.
+ // The function identified by method fires after event does.
+ // method receives the same arguments as the event.
+ // See context argument comments for information on method's scope.
+ //
+ // dontFix: Boolean?
+ // If obj is a DOM node, set dontFix to true to prevent delegation
+ // of this connection to the DOM event manager.
+ //
+ // example:
+ // When obj.onchange(), do ui.update():
+ // | dojo.connect(obj, "onchange", ui, "update");
+ // | dojo.connect(obj, "onchange", ui, ui.update); // same
+ //
+ // example:
+ // Using return value for disconnect:
+ // | var link = dojo.connect(obj, "onchange", ui, "update");
+ // | ...
+ // | dojo.disconnect(link);
+ //
+ // example:
+ // When onglobalevent executes, watcher.handler is invoked:
+ // | dojo.connect(null, "onglobalevent", watcher, "handler");
+ //
+ // example:
+ // When ob.onCustomEvent executes, customEventHandler is invoked:
+ // | dojo.connect(ob, "onCustomEvent", null, "customEventHandler");
+ // | dojo.connect(ob, "onCustomEvent", "customEventHandler"); // same
+ //
+ // example:
+ // When ob.onCustomEvent executes, customEventHandler is invoked
+ // with the same scope (this):
+ // | dojo.connect(ob, "onCustomEvent", null, customEventHandler);
+ // | dojo.connect(ob, "onCustomEvent", customEventHandler); // same
+ //
+ // example:
+ // When globalEvent executes, globalHandler is invoked
+ // with the same scope (this):
+ // | dojo.connect(null, "globalEvent", null, globalHandler);
+ // | dojo.connect("globalEvent", globalHandler); // same
+}
+=====*/
+
+/*=====
+dojo.disconnect = function(handle){
+ // summary:
+ // Remove a link created by dojo.connect.
+ // description:
+ // Removes the connection between event and the method referenced by handle.
+ // handle: Handle:
+ // the return value of the dojo.connect call that created the connection.
+}
+=====*/
+
+/*=====
+dojo.subscribe = function(topic, context, method){
+ // summary:
+ // Attach a listener to a named topic. The listener function is invoked whenever the
+ // named topic is published (see: dojo.publish).
+ // Returns a handle which is needed to unsubscribe this listener.
+ // topic: String:
+ // The topic to which to subscribe.
+ // context: Object|null:
+ // Scope in which method will be invoked, or null for default scope.
+ // method: String|Function:
+ // The name of a function in context, or a function reference. This is the function that
+ // is invoked when topic is published.
+ // example:
+ // | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); });
+ // | dojo.publish("alerts", [ "read this", "hello world" ]);
+}
+=====*/
+
+/*=====
+dojo.unsubscribe = function(handle){
+ // summary:
+ // Remove a topic listener.
+ // handle: Handle
+ // The handle returned from a call to subscribe.
+ // example:
+ // | var alerter = dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
+ // | ...
+ // | dojo.unsubscribe(alerter);
+}
+=====*/
+
+/*=====
+dojo.publish = function(topic, args){
+ // summary:
+ // Invoke all listener method subscribed to topic.
+ // topic: String:
+ // The name of the topic to publish.
+ // args: Array?
+ // An array of arguments. The arguments will be applied
+ // to each topic subscriber (as first class parameters, via apply).
+ // example:
+ // | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
+ // | dojo.publish("alerts", [ "read this", "hello world" ]);
+}
+=====*/
+
+/*=====
+dojo.connectPublisher = function(topic, obj, event){
+ // summary:
+ // Ensure that every time obj.event() is called, a message is published
+ // on the topic. Returns a handle which can be passed to
+ // dojo.disconnect() to disable subsequent automatic publication on
+ // the topic.
+ // topic: String:
+ // The name of the topic to publish.
+ // obj: Object|null:
+ // The source object for the event function. Defaults to kernel.global
+ // if null.
+ // event: String:
+ // The name of the event function in obj.
+ // I.e. identifies a property obj[event].
+ // example:
+ // | dojo.connectPublisher("/ajax/start", dojo, "xhrGet");
+}
+=====*/
+
+/*=====
+dojo.isCopyKey = function(e){
+ // summary:
+ // Checks an event for the copy key (meta on Mac, and ctrl anywhere else)
+ // e: Event
+ // Event object to examine
+}
+=====*/
+
+});
+
+
diff --git a/lib/dojo/_base/declare.js b/lib/dojo/_base/declare.js
index 437914870..9247fcc42 100644
--- a/lib/dojo/_base/declare.js
+++ b/lib/dojo/_base/declare.js
@@ -4,1045 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.declare"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.declare"] = true;
-dojo.provide("dojo._base.declare");
-dojo.require("dojo._base.lang");
-dojo.require("dojo._base.array");
-
-
-(function(){
- var d = dojo, mix = d._mixin, op = Object.prototype, opts = op.toString,
- xtor = new Function, counter = 0, cname = "constructor";
-
- function err(msg, cls){ throw new Error("declare" + (cls ? " " + cls : "") + ": " + msg); }
-
- // C3 Method Resolution Order (see http://www.python.org/download/releases/2.3/mro/)
- function c3mro(bases, className){
- var result = [], roots = [{cls: 0, refs: []}], nameMap = {}, clsCount = 1,
- l = bases.length, i = 0, j, lin, base, top, proto, rec, name, refs;
-
- // build a list of bases naming them if needed
- for(; i < l; ++i){
- base = bases[i];
- if(!base){
- err("mixin #" + i + " is unknown. Did you use dojo.require to pull it in?", className);
- }else if(opts.call(base) != "[object Function]"){
- err("mixin #" + i + " is not a callable constructor.", className);
- }
- lin = base._meta ? base._meta.bases : [base];
- top = 0;
- // add bases to the name map
- for(j = lin.length - 1; j >= 0; --j){
- proto = lin[j].prototype;
- if(!proto.hasOwnProperty("declaredClass")){
- proto.declaredClass = "uniqName_" + (counter++);
- }
- name = proto.declaredClass;
- if(!nameMap.hasOwnProperty(name)){
- nameMap[name] = {count: 0, refs: [], cls: lin[j]};
- ++clsCount;
- }
- rec = nameMap[name];
- if(top && top !== rec){
- rec.refs.push(top);
- ++top.count;
- }
- top = rec;
- }
- ++top.count;
- roots[0].refs.push(top);
- }
-
- // remove classes without external references recursively
- while(roots.length){
- top = roots.pop();
- result.push(top.cls);
- --clsCount;
- // optimization: follow a single-linked chain
- while(refs = top.refs, refs.length == 1){
- top = refs[0];
- if(!top || --top.count){
- // branch or end of chain => do not end to roots
- top = 0;
- break;
- }
- result.push(top.cls);
- --clsCount;
- }
- if(top){
- // branch
- for(i = 0, l = refs.length; i < l; ++i){
- top = refs[i];
- if(!--top.count){
- roots.push(top);
- }
- }
- }
- }
- if(clsCount){
- err("can't build consistent linearization", className);
- }
-
- // calculate the superclass offset
- base = bases[0];
- result[0] = base ?
- base._meta && base === result[result.length - base._meta.bases.length] ?
- base._meta.bases.length : 1 : 0;
-
- return result;
- }
-
- function inherited(args, a, f){
- var name, chains, bases, caller, meta, base, proto, opf, pos,
- cache = this._inherited = this._inherited || {};
-
- // crack arguments
- if(typeof args == "string"){
- name = args;
- args = a;
- a = f;
- }
- f = 0;
-
- caller = args.callee;
- name = name || caller.nom;
- if(!name){
- err("can't deduce a name to call inherited()", this.declaredClass);
- }
-
- meta = this.constructor._meta;
- bases = meta.bases;
-
- pos = cache.p;
- if(name != cname){
- // method
- if(cache.c !== caller){
- // cache bust
- pos = 0;
- base = bases[0];
- meta = base._meta;
- if(meta.hidden[name] !== caller){
- // error detection
- chains = meta.chains;
- if(chains && typeof chains[name] == "string"){
- err("calling chained method with inherited: " + name, this.declaredClass);
- }
- // find caller
- do{
- meta = base._meta;
- proto = base.prototype;
- if(meta && (proto[name] === caller && proto.hasOwnProperty(name) || meta.hidden[name] === caller)){
- break;
- }
- }while(base = bases[++pos]); // intentional assignment
- pos = base ? pos : -1;
- }
- }
- // find next
- base = bases[++pos];
- if(base){
- proto = base.prototype;
- if(base._meta && proto.hasOwnProperty(name)){
- f = proto[name];
- }else{
- opf = op[name];
- do{
- proto = base.prototype;
- f = proto[name];
- if(f && (base._meta ? proto.hasOwnProperty(name) : f !== opf)){
- break;
- }
- }while(base = bases[++pos]); // intentional assignment
- }
- }
- f = base && f || op[name];
- }else{
- // constructor
- if(cache.c !== caller){
- // cache bust
- pos = 0;
- meta = bases[0]._meta;
- if(meta && meta.ctor !== caller){
- // error detection
- chains = meta.chains;
- if(!chains || chains.constructor !== "manual"){
- err("calling chained constructor with inherited", this.declaredClass);
- }
- // find caller
- while(base = bases[++pos]){ // intentional assignment
- meta = base._meta;
- if(meta && meta.ctor === caller){
- break;
- }
- }
- pos = base ? pos : -1;
- }
- }
- // find next
- while(base = bases[++pos]){ // intentional assignment
- meta = base._meta;
- f = meta ? meta.ctor : base;
- if(f){
- break;
- }
- }
- f = base && f;
- }
-
- // cache the found super method
- cache.c = f;
- cache.p = pos;
-
- // now we have the result
- if(f){
- return a === true ? f : f.apply(this, a || args);
- }
- // intentionally if a super method was not found
- }
-
- function getInherited(name, args){
- if(typeof name == "string"){
- return this.inherited(name, args, true);
- }
- return this.inherited(name, true);
- }
-
- // emulation of "instanceof"
- function isInstanceOf(cls){
- var bases = this.constructor._meta.bases;
- for(var i = 0, l = bases.length; i < l; ++i){
- if(bases[i] === cls){
- return true;
- }
- }
- return this instanceof cls;
- }
-
- function mixOwn(target, source){
- var name, i = 0, l = d._extraNames.length;
- // add props adding metadata for incoming functions skipping a constructor
- for(name in source){
- if(name != cname && source.hasOwnProperty(name)){
- target[name] = source[name];
- }
- }
- // process unenumerable methods on IE
- for(; i < l; ++i){
- name = d._extraNames[i];
- if(name != cname && source.hasOwnProperty(name)){
- target[name] = source[name];
- }
- }
- }
-
- // implementation of safe mixin function
- function safeMixin(target, source){
- var name, t, i = 0, l = d._extraNames.length;
- // add props adding metadata for incoming functions skipping a constructor
- for(name in source){
- t = source[name];
- if((t !== op[name] || !(name in op)) && name != cname){
- if(opts.call(t) == "[object Function]"){
- // non-trivial function method => attach its name
- t.nom = name;
- }
- target[name] = t;
- }
- }
- // process unenumerable methods on IE
- for(; i < l; ++i){
- name = d._extraNames[i];
- t = source[name];
- if((t !== op[name] || !(name in op)) && name != cname){
- if(opts.call(t) == "[object Function]"){
- // non-trivial function method => attach its name
- t.nom = name;
- }
- target[name] = t;
- }
- }
- return target;
- }
-
- function extend(source){
- safeMixin(this.prototype, source);
- return this;
- }
-
- // chained constructor compatible with the legacy dojo.declare()
- function chainedConstructor(bases, ctorSpecial){
- return function(){
- var a = arguments, args = a, a0 = a[0], f, i, m,
- l = bases.length, preArgs;
-
- if(!(this instanceof a.callee)){
- // not called via new, so force it
- return applyNew(a);
- }
-
- //this._inherited = {};
- // perform the shaman's rituals of the original dojo.declare()
- // 1) call two types of the preamble
- if(ctorSpecial && (a0 && a0.preamble || this.preamble)){
- // full blown ritual
- preArgs = new Array(bases.length);
- // prepare parameters
- preArgs[0] = a;
- for(i = 0;;){
- // process the preamble of the 1st argument
- a0 = a[0];
- if(a0){
- f = a0.preamble;
- if(f){
- a = f.apply(this, a) || a;
- }
- }
- // process the preamble of this class
- f = bases[i].prototype;
- f = f.hasOwnProperty("preamble") && f.preamble;
- if(f){
- a = f.apply(this, a) || a;
- }
- // one peculiarity of the preamble:
- // it is called if it is not needed,
- // e.g., there is no constructor to call
- // let's watch for the last constructor
- // (see ticket #9795)
- if(++i == l){
- break;
- }
- preArgs[i] = a;
- }
- }
- // 2) call all non-trivial constructors using prepared arguments
- for(i = l - 1; i >= 0; --i){
- f = bases[i];
- m = f._meta;
- f = m ? m.ctor : f;
- if(f){
- f.apply(this, preArgs ? preArgs[i] : a);
- }
- }
- // 3) continue the original ritual: call the postscript
- f = this.postscript;
- if(f){
- f.apply(this, args);
- }
- };
- }
-
-
- // chained constructor compatible with the legacy dojo.declare()
- function singleConstructor(ctor, ctorSpecial){
- return function(){
- var a = arguments, t = a, a0 = a[0], f;
-
- if(!(this instanceof a.callee)){
- // not called via new, so force it
- return applyNew(a);
- }
-
- //this._inherited = {};
- // perform the shaman's rituals of the original dojo.declare()
- // 1) call two types of the preamble
- if(ctorSpecial){
- // full blown ritual
- if(a0){
- // process the preamble of the 1st argument
- f = a0.preamble;
- if(f){
- t = f.apply(this, t) || t;
- }
- }
- f = this.preamble;
- if(f){
- // process the preamble of this class
- f.apply(this, t);
- // one peculiarity of the preamble:
- // it is called even if it is not needed,
- // e.g., there is no constructor to call
- // let's watch for the last constructor
- // (see ticket #9795)
- }
- }
- // 2) call a constructor
- if(ctor){
- ctor.apply(this, a);
- }
- // 3) continue the original ritual: call the postscript
- f = this.postscript;
- if(f){
- f.apply(this, a);
- }
- };
- }
-
- // plain vanilla constructor (can use inherited() to call its base constructor)
- function simpleConstructor(bases){
- return function(){
- var a = arguments, i = 0, f, m;
-
- if(!(this instanceof a.callee)){
- // not called via new, so force it
- return applyNew(a);
- }
-
- //this._inherited = {};
- // perform the shaman's rituals of the original dojo.declare()
- // 1) do not call the preamble
- // 2) call the top constructor (it can use this.inherited())
- for(; f = bases[i]; ++i){ // intentional assignment
- m = f._meta;
- f = m ? m.ctor : f;
- if(f){
- f.apply(this, a);
- break;
- }
- }
- // 3) call the postscript
- f = this.postscript;
- if(f){
- f.apply(this, a);
- }
- };
- }
-
- function chain(name, bases, reversed){
- return function(){
- var b, m, f, i = 0, step = 1;
- if(reversed){
- i = bases.length - 1;
- step = -1;
- }
- for(; b = bases[i]; i += step){ // intentional assignment
- m = b._meta;
- f = (m ? m.hidden : b.prototype)[name];
- if(f){
- f.apply(this, arguments);
- }
- }
- };
- }
-
- // forceNew(ctor)
- // return a new object that inherits from ctor.prototype but
- // without actually running ctor on the object.
- function forceNew(ctor){
- // create object with correct prototype using a do-nothing
- // constructor
- xtor.prototype = ctor.prototype;
- var t = new xtor;
- xtor.prototype = null; // clean up
- return t;
- }
-
- // applyNew(args)
- // just like 'new ctor()' except that the constructor and its arguments come
- // from args, which must be an array or an arguments object
- function applyNew(args){
- // create an object with ctor's prototype but without
- // calling ctor on it.
- var ctor = args.callee, t = forceNew(ctor);
- // execute the real constructor on the new object
- ctor.apply(t, args);
- return t;
- }
-
- d.declare = function(className, superclass, props){
- // crack parameters
- if(typeof className != "string"){
- props = superclass;
- superclass = className;
- className = "";
- }
- props = props || {};
-
- var proto, i, t, ctor, name, bases, chains, mixins = 1, parents = superclass;
-
- // build a prototype
- if(opts.call(superclass) == "[object Array]"){
- // C3 MRO
- bases = c3mro(superclass, className);
- t = bases[0];
- mixins = bases.length - t;
- superclass = bases[mixins];
- }else{
- bases = [0];
- if(superclass){
- if(opts.call(superclass) == "[object Function]"){
- t = superclass._meta;
- bases = bases.concat(t ? t.bases : superclass);
- }else{
- err("base class is not a callable constructor.", className);
- }
- }else if(superclass !== null){
- err("unknown base class. Did you use dojo.require to pull it in?", className);
- }
- }
- if(superclass){
- for(i = mixins - 1;; --i){
- proto = forceNew(superclass);
- if(!i){
- // stop if nothing to add (the last base)
- break;
- }
- // mix in properties
- t = bases[i];
- (t._meta ? mixOwn : mix)(proto, t.prototype);
- // chain in new constructor
- ctor = new Function;
- ctor.superclass = superclass;
- ctor.prototype = proto;
- superclass = proto.constructor = ctor;
- }
- }else{
- proto = {};
- }
- // add all properties
- safeMixin(proto, props);
- // add constructor
- t = props.constructor;
- if(t !== op.constructor){
- t.nom = cname;
- proto.constructor = t;
- }
-
- // collect chains and flags
- for(i = mixins - 1; i; --i){ // intentional assignment
- t = bases[i]._meta;
- if(t && t.chains){
- chains = mix(chains || {}, t.chains);
- }
- }
- if(proto["-chains-"]){
- chains = mix(chains || {}, proto["-chains-"]);
- }
-
- // build ctor
- t = !chains || !chains.hasOwnProperty(cname);
- bases[0] = ctor = (chains && chains.constructor === "manual") ? simpleConstructor(bases) :
- (bases.length == 1 ? singleConstructor(props.constructor, t) : chainedConstructor(bases, t));
-
- // add meta information to the constructor
- ctor._meta = {bases: bases, hidden: props, chains: chains,
- parents: parents, ctor: props.constructor};
- ctor.superclass = superclass && superclass.prototype;
- ctor.extend = extend;
- ctor.prototype = proto;
- proto.constructor = ctor;
-
- // add "standard" methods to the prototype
- proto.getInherited = getInherited;
- proto.inherited = inherited;
- proto.isInstanceOf = isInstanceOf;
-
- // add name if specified
- if(className){
- proto.declaredClass = className;
- d.setObject(className, ctor);
- }
-
- // build chains and add them to the prototype
- if(chains){
- for(name in chains){
- if(proto[name] && typeof chains[name] == "string" && name != cname){
- t = proto[name] = chain(name, bases, chains[name] === "after");
- t.nom = name;
- }
- }
- }
- // chained methods do not return values
- // no need to chain "invisible" functions
-
- return ctor; // Function
- };
-
- d.safeMixin = safeMixin;
-
- /*=====
- dojo.declare = function(className, superclass, props){
- // summary:
- // Create a feature-rich constructor from compact notation.
- // className: String?:
- // The optional name of the constructor (loosely, a "class")
- // stored in the "declaredClass" property in the created prototype.
- // It will be used as a global name for a created constructor.
- // superclass: Function|Function[]:
- // May be null, a Function, or an Array of Functions. This argument
- // specifies a list of bases (the left-most one is the most deepest
- // base).
- // props: Object:
- // An object whose properties are copied to the created prototype.
- // Add an instance-initialization function by making it a property
- // named "constructor".
- // returns:
- // New constructor function.
- // description:
- // Create a constructor using a compact notation for inheritance and
- // prototype extension.
- //
- // Mixin ancestors provide a type of multiple inheritance.
- // Prototypes of mixin ancestors are copied to the new class:
- // changes to mixin prototypes will not affect classes to which
- // they have been mixed in.
- //
- // Ancestors can be compound classes created by this version of
- // dojo.declare. In complex cases all base classes are going to be
- // linearized according to C3 MRO algorithm
- // (see http://www.python.org/download/releases/2.3/mro/ for more
- // details).
- //
- // "className" is cached in "declaredClass" property of the new class,
- // if it was supplied. The immediate super class will be cached in
- // "superclass" property of the new class.
- //
- // Methods in "props" will be copied and modified: "nom" property
- // (the declared name of the method) will be added to all copied
- // functions to help identify them for the internal machinery. Be
- // very careful, while reusing methods: if you use the same
- // function under different names, it can produce errors in some
- // cases.
- //
- // It is possible to use constructors created "manually" (without
- // dojo.declare) as bases. They will be called as usual during the
- // creation of an instance, their methods will be chained, and even
- // called by "this.inherited()".
- //
- // Special property "-chains-" governs how to chain methods. It is
- // a dictionary, which uses method names as keys, and hint strings
- // as values. If a hint string is "after", this method will be
- // called after methods of its base classes. If a hint string is
- // "before", this method will be called before methods of its base
- // classes.
- //
- // If "constructor" is not mentioned in "-chains-" property, it will
- // be chained using the legacy mode: using "after" chaining,
- // calling preamble() method before each constructor, if available,
- // and calling postscript() after all constructors were executed.
- // If the hint is "after", it is chained as a regular method, but
- // postscript() will be called after the chain of constructors.
- // "constructor" cannot be chained "before", but it allows
- // a special hint string: "manual", which means that constructors
- // are not going to be chained in any way, and programmer will call
- // them manually using this.inherited(). In the latter case
- // postscript() will be called after the construction.
- //
- // All chaining hints are "inherited" from base classes and
- // potentially can be overridden. Be very careful when overriding
- // hints! Make sure that all chained methods can work in a proposed
- // manner of chaining.
- //
- // Once a method was chained, it is impossible to unchain it. The
- // only exception is "constructor". You don't need to define a
- // method in order to supply a chaining hint.
- //
- // If a method is chained, it cannot use this.inherited() because
- // all other methods in the hierarchy will be called automatically.
- //
- // Usually constructors and initializers of any kind are chained
- // using "after" and destructors of any kind are chained as
- // "before". Note that chaining assumes that chained methods do not
- // return any value: any returned value will be discarded.
- //
- // example:
- // | dojo.declare("my.classes.bar", my.classes.foo, {
- // | // properties to be added to the class prototype
- // | someValue: 2,
- // | // initialization function
- // | constructor: function(){
- // | this.myComplicatedObject = new ReallyComplicatedObject();
- // | },
- // | // other functions
- // | someMethod: function(){
- // | doStuff();
- // | }
- // | });
- //
- // example:
- // | var MyBase = dojo.declare(null, {
- // | // constructor, properties, and methods go here
- // | // ...
- // | });
- // | var MyClass1 = dojo.declare(MyBase, {
- // | // constructor, properties, and methods go here
- // | // ...
- // | });
- // | var MyClass2 = dojo.declare(MyBase, {
- // | // constructor, properties, and methods go here
- // | // ...
- // | });
- // | var MyDiamond = dojo.declare([MyClass1, MyClass2], {
- // | // constructor, properties, and methods go here
- // | // ...
- // | });
- //
- // example:
- // | var F = function(){ console.log("raw constructor"); };
- // | F.prototype.method = function(){
- // | console.log("raw method");
- // | };
- // | var A = dojo.declare(F, {
- // | constructor: function(){
- // | console.log("A.constructor");
- // | },
- // | method: function(){
- // | console.log("before calling F.method...");
- // | this.inherited(arguments);
- // | console.log("...back in A");
- // | }
- // | });
- // | new A().method();
- // | // will print:
- // | // raw constructor
- // | // A.constructor
- // | // before calling F.method...
- // | // raw method
- // | // ...back in A
- //
- // example:
- // | var A = dojo.declare(null, {
- // | "-chains-": {
- // | destroy: "before"
- // | }
- // | });
- // | var B = dojo.declare(A, {
- // | constructor: function(){
- // | console.log("B.constructor");
- // | },
- // | destroy: function(){
- // | console.log("B.destroy");
- // | }
- // | });
- // | var C = dojo.declare(B, {
- // | constructor: function(){
- // | console.log("C.constructor");
- // | },
- // | destroy: function(){
- // | console.log("C.destroy");
- // | }
- // | });
- // | new C().destroy();
- // | // prints:
- // | // B.constructor
- // | // C.constructor
- // | // C.destroy
- // | // B.destroy
- //
- // example:
- // | var A = dojo.declare(null, {
- // | "-chains-": {
- // | constructor: "manual"
- // | }
- // | });
- // | var B = dojo.declare(A, {
- // | constructor: function(){
- // | // ...
- // | // call the base constructor with new parameters
- // | this.inherited(arguments, [1, 2, 3]);
- // | // ...
- // | }
- // | });
- //
- // example:
- // | var A = dojo.declare(null, {
- // | "-chains-": {
- // | m1: "before"
- // | },
- // | m1: function(){
- // | console.log("A.m1");
- // | },
- // | m2: function(){
- // | console.log("A.m2");
- // | }
- // | });
- // | var B = dojo.declare(A, {
- // | "-chains-": {
- // | m2: "after"
- // | },
- // | m1: function(){
- // | console.log("B.m1");
- // | },
- // | m2: function(){
- // | console.log("B.m2");
- // | }
- // | });
- // | var x = new B();
- // | x.m1();
- // | // prints:
- // | // B.m1
- // | // A.m1
- // | x.m2();
- // | // prints:
- // | // A.m2
- // | // B.m2
- return new Function(); // Function
- };
- =====*/
-
- /*=====
- dojo.safeMixin = function(target, source){
- // summary:
- // Mix in properties skipping a constructor and decorating functions
- // like it is done by dojo.declare.
- // target: Object
- // Target object to accept new properties.
- // source: Object
- // Source object for new properties.
- // description:
- // This function is used to mix in properties like dojo._mixin does,
- // but it skips a constructor property and decorates functions like
- // dojo.declare does.
- //
- // It is meant to be used with classes and objects produced with
- // dojo.declare. Functions mixed in with dojo.safeMixin can use
- // this.inherited() like normal methods.
- //
- // This function is used to implement extend() method of a constructor
- // produced with dojo.declare().
- //
- // example:
- // | var A = dojo.declare(null, {
- // | m1: function(){
- // | console.log("A.m1");
- // | },
- // | m2: function(){
- // | console.log("A.m2");
- // | }
- // | });
- // | var B = dojo.declare(A, {
- // | m1: function(){
- // | this.inherited(arguments);
- // | console.log("B.m1");
- // | }
- // | });
- // | B.extend({
- // | m2: function(){
- // | this.inherited(arguments);
- // | console.log("B.m2");
- // | }
- // | });
- // | var x = new B();
- // | dojo.safeMixin(x, {
- // | m1: function(){
- // | this.inherited(arguments);
- // | console.log("X.m1");
- // | },
- // | m2: function(){
- // | this.inherited(arguments);
- // | console.log("X.m2");
- // | }
- // | });
- // | x.m2();
- // | // prints:
- // | // A.m1
- // | // B.m1
- // | // X.m1
- };
- =====*/
-
- /*=====
- Object.inherited = function(name, args, newArgs){
- // summary:
- // Calls a super method.
- // name: String?
- // The optional method name. Should be the same as the caller's
- // name. Usually "name" is specified in complex dynamic cases, when
- // the calling method was dynamically added, undecorated by
- // dojo.declare, and it cannot be determined.
- // args: Arguments
- // The caller supply this argument, which should be the original
- // "arguments".
- // newArgs: Object?
- // If "true", the found function will be returned without
- // executing it.
- // If Array, it will be used to call a super method. Otherwise
- // "args" will be used.
- // returns:
- // Whatever is returned by a super method, or a super method itself,
- // if "true" was specified as newArgs.
- // description:
- // This method is used inside method of classes produced with
- // dojo.declare to call a super method (next in the chain). It is
- // used for manually controlled chaining. Consider using the regular
- // chaining, because it is faster. Use "this.inherited()" only in
- // complex cases.
- //
- // This method cannot me called from automatically chained
- // constructors including the case of a special (legacy)
- // constructor chaining. It cannot be called from chained methods.
- //
- // If "this.inherited()" cannot find the next-in-chain method, it
- // does nothing and returns "undefined". The last method in chain
- // can be a default method implemented in Object, which will be
- // called last.
- //
- // If "name" is specified, it is assumed that the method that
- // received "args" is the parent method for this call. It is looked
- // up in the chain list and if it is found the next-in-chain method
- // is called. If it is not found, the first-in-chain method is
- // called.
- //
- // If "name" is not specified, it will be derived from the calling
- // method (using a methoid property "nom").
- //
- // example:
- // | var B = dojo.declare(A, {
- // | method1: function(a, b, c){
- // | this.inherited(arguments);
- // | },
- // | method2: function(a, b){
- // | return this.inherited(arguments, [a + b]);
- // | }
- // | });
- // | // next method is not in the chain list because it is added
- // | // manually after the class was created.
- // | B.prototype.method3 = function(){
- // | console.log("This is a dynamically-added method.");
- // | this.inherited("method3", arguments);
- // | };
- // example:
- // | var B = dojo.declare(A, {
- // | method: function(a, b){
- // | var super = this.inherited(arguments, true);
- // | // ...
- // | if(!super){
- // | console.log("there is no super method");
- // | return 0;
- // | }
- // | return super.apply(this, arguments);
- // | }
- // | });
- return {}; // Object
- }
- =====*/
-
- /*=====
- Object.getInherited = function(name, args){
- // summary:
- // Returns a super method.
- // name: String?
- // The optional method name. Should be the same as the caller's
- // name. Usually "name" is specified in complex dynamic cases, when
- // the calling method was dynamically added, undecorated by
- // dojo.declare, and it cannot be determined.
- // args: Arguments
- // The caller supply this argument, which should be the original
- // "arguments".
- // returns:
- // Returns a super method (Function) or "undefined".
- // description:
- // This method is a convenience method for "this.inherited()".
- // It uses the same algorithm but instead of executing a super
- // method, it returns it, or "undefined" if not found.
- //
- // example:
- // | var B = dojo.declare(A, {
- // | method: function(a, b){
- // | var super = this.getInherited(arguments);
- // | // ...
- // | if(!super){
- // | console.log("there is no super method");
- // | return 0;
- // | }
- // | return super.apply(this, arguments);
- // | }
- // | });
- return {}; // Object
- }
- =====*/
-
- /*=====
- Object.isInstanceOf = function(cls){
- // summary:
- // Checks the inheritance chain to see if it is inherited from this
- // class.
- // cls: Function
- // Class constructor.
- // returns:
- // "true", if this object is inherited from this class, "false"
- // otherwise.
- // description:
- // This method is used with instances of classes produced with
- // dojo.declare to determine of they support a certain interface or
- // not. It models "instanceof" operator.
- //
- // example:
- // | var A = dojo.declare(null, {
- // | // constructor, properties, and methods go here
- // | // ...
- // | });
- // | var B = dojo.declare(null, {
- // | // constructor, properties, and methods go here
- // | // ...
- // | });
- // | var C = dojo.declare([A, B], {
- // | // constructor, properties, and methods go here
- // | // ...
- // | });
- // | var D = dojo.declare(A, {
- // | // constructor, properties, and methods go here
- // | // ...
- // | });
- // |
- // | var a = new A(), b = new B(), c = new C(), d = new D();
- // |
- // | console.log(a.isInstanceOf(A)); // true
- // | console.log(b.isInstanceOf(A)); // false
- // | console.log(c.isInstanceOf(A)); // true
- // | console.log(d.isInstanceOf(A)); // true
- // |
- // | console.log(a.isInstanceOf(B)); // false
- // | console.log(b.isInstanceOf(B)); // true
- // | console.log(c.isInstanceOf(B)); // true
- // | console.log(d.isInstanceOf(B)); // false
- // |
- // | console.log(a.isInstanceOf(C)); // false
- // | console.log(b.isInstanceOf(C)); // false
- // | console.log(c.isInstanceOf(C)); // true
- // | console.log(d.isInstanceOf(C)); // false
- // |
- // | console.log(a.isInstanceOf(D)); // false
- // | console.log(b.isInstanceOf(D)); // false
- // | console.log(c.isInstanceOf(D)); // false
- // | console.log(d.isInstanceOf(D)); // true
- return {}; // Object
- }
- =====*/
-
- /*=====
- Object.extend = function(source){
- // summary:
- // Adds all properties and methods of source to constructor's
- // prototype, making them available to all instances created with
- // constructor. This method is specific to constructors created with
- // dojo.declare.
- // source: Object
- // Source object which properties are going to be copied to the
- // constructor's prototype.
- // description:
- // Adds source properties to the constructor's prototype. It can
- // override existing properties.
- //
- // This method is similar to dojo.extend function, but it is specific
- // to constructors produced by dojo.declare. It is implemented
- // using dojo.safeMixin, and it skips a constructor property,
- // and properly decorates copied functions.
- //
- // example:
- // | var A = dojo.declare(null, {
- // | m1: function(){},
- // | s1: "Popokatepetl"
- // | });
- // | A.extend({
- // | m1: function(){},
- // | m2: function(){},
- // | f1: true,
- // | d1: 42
- // | });
- };
- =====*/
-})();
-
-}
+//>>built
+define("dojo/_base/declare",["./kernel","../has","./lang"],function(_1,_2,_3){var _4=_3.mixin,op=Object.prototype,_5=op.toString,_6=new Function,_7=0,_8="constructor";function _9(_a,_b){throw new Error("declare"+(_b?" "+_b:"")+": "+_a);};function _c(_d,_e){var _f=[],_10=[{cls:0,refs:[]}],_11={},_12=1,l=_d.length,i=0,j,lin,_13,top,_14,rec,_15,_16;for(;i<l;++i){_13=_d[i];if(!_13){_9("mixin #"+i+" is unknown. Did you use dojo.require to pull it in?",_e);}else{if(_5.call(_13)!="[object Function]"){_9("mixin #"+i+" is not a callable constructor.",_e);}}lin=_13._meta?_13._meta.bases:[_13];top=0;for(j=lin.length-1;j>=0;--j){_14=lin[j].prototype;if(!_14.hasOwnProperty("declaredClass")){_14.declaredClass="uniqName_"+(_7++);}_15=_14.declaredClass;if(!_11.hasOwnProperty(_15)){_11[_15]={count:0,refs:[],cls:lin[j]};++_12;}rec=_11[_15];if(top&&top!==rec){rec.refs.push(top);++top.count;}top=rec;}++top.count;_10[0].refs.push(top);}while(_10.length){top=_10.pop();_f.push(top.cls);--_12;while(_16=top.refs,_16.length==1){top=_16[0];if(!top||--top.count){top=0;break;}_f.push(top.cls);--_12;}if(top){for(i=0,l=_16.length;i<l;++i){top=_16[i];if(!--top.count){_10.push(top);}}}}if(_12){_9("can't build consistent linearization",_e);}_13=_d[0];_f[0]=_13?_13._meta&&_13===_f[_f.length-_13._meta.bases.length]?_13._meta.bases.length:1:0;return _f;};function _17(_18,a,f){var _19,_1a,_1b,_1c,_1d,_1e,_1f,opf,pos,_20=this._inherited=this._inherited||{};if(typeof _18=="string"){_19=_18;_18=a;a=f;}f=0;_1c=_18.callee;_19=_19||_1c.nom;if(!_19){_9("can't deduce a name to call inherited()",this.declaredClass);}_1d=this.constructor._meta;_1b=_1d.bases;pos=_20.p;if(_19!=_8){if(_20.c!==_1c){pos=0;_1e=_1b[0];_1d=_1e._meta;if(_1d.hidden[_19]!==_1c){_1a=_1d.chains;if(_1a&&typeof _1a[_19]=="string"){_9("calling chained method with inherited: "+_19,this.declaredClass);}do{_1d=_1e._meta;_1f=_1e.prototype;if(_1d&&(_1f[_19]===_1c&&_1f.hasOwnProperty(_19)||_1d.hidden[_19]===_1c)){break;}}while(_1e=_1b[++pos]);pos=_1e?pos:-1;}}_1e=_1b[++pos];if(_1e){_1f=_1e.prototype;if(_1e._meta&&_1f.hasOwnProperty(_19)){f=_1f[_19];}else{opf=op[_19];do{_1f=_1e.prototype;f=_1f[_19];if(f&&(_1e._meta?_1f.hasOwnProperty(_19):f!==opf)){break;}}while(_1e=_1b[++pos]);}}f=_1e&&f||op[_19];}else{if(_20.c!==_1c){pos=0;_1d=_1b[0]._meta;if(_1d&&_1d.ctor!==_1c){_1a=_1d.chains;if(!_1a||_1a.constructor!=="manual"){_9("calling chained constructor with inherited",this.declaredClass);}while(_1e=_1b[++pos]){_1d=_1e._meta;if(_1d&&_1d.ctor===_1c){break;}}pos=_1e?pos:-1;}}while(_1e=_1b[++pos]){_1d=_1e._meta;f=_1d?_1d.ctor:_1e;if(f){break;}}f=_1e&&f;}_20.c=f;_20.p=pos;if(f){return a===true?f:f.apply(this,a||_18);}};function _21(_22,_23){if(typeof _22=="string"){return this.__inherited(_22,_23,true);}return this.__inherited(_22,true);};function _24(_25,a1,a2){var f=this.getInherited(_25,a1);if(f){return f.apply(this,a2||a1||_25);}};var _26=_1.config.isDebug?_24:_17;function _27(cls){var _28=this.constructor._meta.bases;for(var i=0,l=_28.length;i<l;++i){if(_28[i]===cls){return true;}}return this instanceof cls;};function _29(_2a,_2b){for(var _2c in _2b){if(_2c!=_8&&_2b.hasOwnProperty(_2c)){_2a[_2c]=_2b[_2c];}}if(_2("bug-for-in-skips-shadowed")){for(var _2d=_3._extraNames,i=_2d.length;i;){_2c=_2d[--i];if(_2c!=_8&&_2b.hasOwnProperty(_2c)){_2a[_2c]=_2b[_2c];}}}};function _2e(_2f,_30){var _31,t;for(_31 in _30){t=_30[_31];if((t!==op[_31]||!(_31 in op))&&_31!=_8){if(_5.call(t)=="[object Function]"){t.nom=_31;}_2f[_31]=t;}}if(_2("bug-for-in-skips-shadowed")){for(var _32=_3._extraNames,i=_32.length;i;){_31=_32[--i];t=_30[_31];if((t!==op[_31]||!(_31 in op))&&_31!=_8){if(_5.call(t)=="[object Function]"){t.nom=_31;}_2f[_31]=t;}}}return _2f;};function _33(_34){_35.safeMixin(this.prototype,_34);return this;};function _36(_37,_38){return function(){var a=arguments,_39=a,a0=a[0],f,i,m,l=_37.length,_3a;if(!(this instanceof a.callee)){return _3b(a);}if(_38&&(a0&&a0.preamble||this.preamble)){_3a=new Array(_37.length);_3a[0]=a;for(i=0;;){a0=a[0];if(a0){f=a0.preamble;if(f){a=f.apply(this,a)||a;}}f=_37[i].prototype;f=f.hasOwnProperty("preamble")&&f.preamble;if(f){a=f.apply(this,a)||a;}if(++i==l){break;}_3a[i]=a;}}for(i=l-1;i>=0;--i){f=_37[i];m=f._meta;f=m?m.ctor:f;if(f){f.apply(this,_3a?_3a[i]:a);}}f=this.postscript;if(f){f.apply(this,_39);}};};function _3c(_3d,_3e){return function(){var a=arguments,t=a,a0=a[0],f;if(!(this instanceof a.callee)){return _3b(a);}if(_3e){if(a0){f=a0.preamble;if(f){t=f.apply(this,t)||t;}}f=this.preamble;if(f){f.apply(this,t);}}if(_3d){_3d.apply(this,a);}f=this.postscript;if(f){f.apply(this,a);}};};function _3f(_40){return function(){var a=arguments,i=0,f,m;if(!(this instanceof a.callee)){return _3b(a);}for(;f=_40[i];++i){m=f._meta;f=m?m.ctor:f;if(f){f.apply(this,a);break;}}f=this.postscript;if(f){f.apply(this,a);}};};function _41(_42,_43,_44){return function(){var b,m,f,i=0,_45=1;if(_44){i=_43.length-1;_45=-1;}for(;b=_43[i];i+=_45){m=b._meta;f=(m?m.hidden:b.prototype)[_42];if(f){f.apply(this,arguments);}}};};function _46(_47){_6.prototype=_47.prototype;var t=new _6;_6.prototype=null;return t;};function _3b(_48){var _49=_48.callee,t=_46(_49);_49.apply(t,_48);return t;};function _35(_4a,_4b,_4c){if(typeof _4a!="string"){_4c=_4b;_4b=_4a;_4a="";}_4c=_4c||{};var _4d,i,t,_4e,_4f,_50,_51,_52=1,_53=_4b;if(_5.call(_4b)=="[object Array]"){_50=_c(_4b,_4a);t=_50[0];_52=_50.length-t;_4b=_50[_52];}else{_50=[0];if(_4b){if(_5.call(_4b)=="[object Function]"){t=_4b._meta;_50=_50.concat(t?t.bases:_4b);}else{_9("base class is not a callable constructor.",_4a);}}else{if(_4b!==null){_9("unknown base class. Did you use dojo.require to pull it in?",_4a);}}}if(_4b){for(i=_52-1;;--i){_4d=_46(_4b);if(!i){break;}t=_50[i];(t._meta?_29:_4)(_4d,t.prototype);_4e=new Function;_4e.superclass=_4b;_4e.prototype=_4d;_4b=_4d.constructor=_4e;}}else{_4d={};}_35.safeMixin(_4d,_4c);t=_4c.constructor;if(t!==op.constructor){t.nom=_8;_4d.constructor=t;}for(i=_52-1;i;--i){t=_50[i]._meta;if(t&&t.chains){_51=_4(_51||{},t.chains);}}if(_4d["-chains-"]){_51=_4(_51||{},_4d["-chains-"]);}t=!_51||!_51.hasOwnProperty(_8);_50[0]=_4e=(_51&&_51.constructor==="manual")?_3f(_50):(_50.length==1?_3c(_4c.constructor,t):_36(_50,t));_4e._meta={bases:_50,hidden:_4c,chains:_51,parents:_53,ctor:_4c.constructor};_4e.superclass=_4b&&_4b.prototype;_4e.extend=_33;_4e.prototype=_4d;_4d.constructor=_4e;_4d.getInherited=_21;_4d.isInstanceOf=_27;_4d.inherited=_26;_4d.__inherited=_17;if(_4a){_4d.declaredClass=_4a;_3.setObject(_4a,_4e);}if(_51){for(_4f in _51){if(_4d[_4f]&&typeof _51[_4f]=="string"&&_4f!=_8){t=_4d[_4f]=_41(_4f,_50,_51[_4f]==="after");t.nom=_4f;}}}return _4e;};_1.safeMixin=_35.safeMixin=_2e;_1.declare=_35;return _35;}); \ No newline at end of file
diff --git a/lib/dojo/_base/declare.js.uncompressed.js b/lib/dojo/_base/declare.js.uncompressed.js
new file mode 100644
index 000000000..838bf1c81
--- /dev/null
+++ b/lib/dojo/_base/declare.js.uncompressed.js
@@ -0,0 +1,1050 @@
+define("dojo/_base/declare", ["./kernel", "../has", "./lang"], function(dojo, has, lang){
+ // module:
+ // dojo/_base/declare
+ // summary:
+ // This module defines dojo.declare.
+
+ var mix = lang.mixin, op = Object.prototype, opts = op.toString,
+ xtor = new Function, counter = 0, cname = "constructor";
+
+ function err(msg, cls){ throw new Error("declare" + (cls ? " " + cls : "") + ": " + msg); }
+
+ // C3 Method Resolution Order (see http://www.python.org/download/releases/2.3/mro/)
+ function c3mro(bases, className){
+ var result = [], roots = [{cls: 0, refs: []}], nameMap = {}, clsCount = 1,
+ l = bases.length, i = 0, j, lin, base, top, proto, rec, name, refs;
+
+ // build a list of bases naming them if needed
+ for(; i < l; ++i){
+ base = bases[i];
+ if(!base){
+ err("mixin #" + i + " is unknown. Did you use dojo.require to pull it in?", className);
+ }else if(opts.call(base) != "[object Function]"){
+ err("mixin #" + i + " is not a callable constructor.", className);
+ }
+ lin = base._meta ? base._meta.bases : [base];
+ top = 0;
+ // add bases to the name map
+ for(j = lin.length - 1; j >= 0; --j){
+ proto = lin[j].prototype;
+ if(!proto.hasOwnProperty("declaredClass")){
+ proto.declaredClass = "uniqName_" + (counter++);
+ }
+ name = proto.declaredClass;
+ if(!nameMap.hasOwnProperty(name)){
+ nameMap[name] = {count: 0, refs: [], cls: lin[j]};
+ ++clsCount;
+ }
+ rec = nameMap[name];
+ if(top && top !== rec){
+ rec.refs.push(top);
+ ++top.count;
+ }
+ top = rec;
+ }
+ ++top.count;
+ roots[0].refs.push(top);
+ }
+
+ // remove classes without external references recursively
+ while(roots.length){
+ top = roots.pop();
+ result.push(top.cls);
+ --clsCount;
+ // optimization: follow a single-linked chain
+ while(refs = top.refs, refs.length == 1){
+ top = refs[0];
+ if(!top || --top.count){
+ // branch or end of chain => do not end to roots
+ top = 0;
+ break;
+ }
+ result.push(top.cls);
+ --clsCount;
+ }
+ if(top){
+ // branch
+ for(i = 0, l = refs.length; i < l; ++i){
+ top = refs[i];
+ if(!--top.count){
+ roots.push(top);
+ }
+ }
+ }
+ }
+ if(clsCount){
+ err("can't build consistent linearization", className);
+ }
+
+ // calculate the superclass offset
+ base = bases[0];
+ result[0] = base ?
+ base._meta && base === result[result.length - base._meta.bases.length] ?
+ base._meta.bases.length : 1 : 0;
+
+ return result;
+ }
+
+ function inherited(args, a, f){
+ var name, chains, bases, caller, meta, base, proto, opf, pos,
+ cache = this._inherited = this._inherited || {};
+
+ // crack arguments
+ if(typeof args == "string"){
+ name = args;
+ args = a;
+ a = f;
+ }
+ f = 0;
+
+ caller = args.callee;
+ name = name || caller.nom;
+ if(!name){
+ err("can't deduce a name to call inherited()", this.declaredClass);
+ }
+
+ meta = this.constructor._meta;
+ bases = meta.bases;
+
+ pos = cache.p;
+ if(name != cname){
+ // method
+ if(cache.c !== caller){
+ // cache bust
+ pos = 0;
+ base = bases[0];
+ meta = base._meta;
+ if(meta.hidden[name] !== caller){
+ // error detection
+ chains = meta.chains;
+ if(chains && typeof chains[name] == "string"){
+ err("calling chained method with inherited: " + name, this.declaredClass);
+ }
+ // find caller
+ do{
+ meta = base._meta;
+ proto = base.prototype;
+ if(meta && (proto[name] === caller && proto.hasOwnProperty(name) || meta.hidden[name] === caller)){
+ break;
+ }
+ }while(base = bases[++pos]); // intentional assignment
+ pos = base ? pos : -1;
+ }
+ }
+ // find next
+ base = bases[++pos];
+ if(base){
+ proto = base.prototype;
+ if(base._meta && proto.hasOwnProperty(name)){
+ f = proto[name];
+ }else{
+ opf = op[name];
+ do{
+ proto = base.prototype;
+ f = proto[name];
+ if(f && (base._meta ? proto.hasOwnProperty(name) : f !== opf)){
+ break;
+ }
+ }while(base = bases[++pos]); // intentional assignment
+ }
+ }
+ f = base && f || op[name];
+ }else{
+ // constructor
+ if(cache.c !== caller){
+ // cache bust
+ pos = 0;
+ meta = bases[0]._meta;
+ if(meta && meta.ctor !== caller){
+ // error detection
+ chains = meta.chains;
+ if(!chains || chains.constructor !== "manual"){
+ err("calling chained constructor with inherited", this.declaredClass);
+ }
+ // find caller
+ while(base = bases[++pos]){ // intentional assignment
+ meta = base._meta;
+ if(meta && meta.ctor === caller){
+ break;
+ }
+ }
+ pos = base ? pos : -1;
+ }
+ }
+ // find next
+ while(base = bases[++pos]){ // intentional assignment
+ meta = base._meta;
+ f = meta ? meta.ctor : base;
+ if(f){
+ break;
+ }
+ }
+ f = base && f;
+ }
+
+ // cache the found super method
+ cache.c = f;
+ cache.p = pos;
+
+ // now we have the result
+ if(f){
+ return a === true ? f : f.apply(this, a || args);
+ }
+ // intentionally no return if a super method was not found
+ }
+
+ function getInherited(name, args){
+ if(typeof name == "string"){
+ return this.__inherited(name, args, true);
+ }
+ return this.__inherited(name, true);
+ }
+
+ function inherited__debug(args, a1, a2){
+ var f = this.getInherited(args, a1);
+ if(f){ return f.apply(this, a2 || a1 || args); }
+ // intentionally no return if a super method was not found
+ }
+
+ var inheritedImpl = dojo.config.isDebug ? inherited__debug : inherited;
+
+ // emulation of "instanceof"
+ function isInstanceOf(cls){
+ var bases = this.constructor._meta.bases;
+ for(var i = 0, l = bases.length; i < l; ++i){
+ if(bases[i] === cls){
+ return true;
+ }
+ }
+ return this instanceof cls;
+ }
+
+ function mixOwn(target, source){
+ // add props adding metadata for incoming functions skipping a constructor
+ for(var name in source){
+ if(name != cname && source.hasOwnProperty(name)){
+ target[name] = source[name];
+ }
+ }
+ if(has("bug-for-in-skips-shadowed")){
+ for(var extraNames= lang._extraNames, i= extraNames.length; i;){
+ name = extraNames[--i];
+ if(name != cname && source.hasOwnProperty(name)){
+ target[name] = source[name];
+ }
+ }
+ }
+ }
+
+ // implementation of safe mixin function
+ function safeMixin(target, source){
+ var name, t;
+ // add props adding metadata for incoming functions skipping a constructor
+ for(name in source){
+ t = source[name];
+ if((t !== op[name] || !(name in op)) && name != cname){
+ if(opts.call(t) == "[object Function]"){
+ // non-trivial function method => attach its name
+ t.nom = name;
+ }
+ target[name] = t;
+ }
+ }
+ if(has("bug-for-in-skips-shadowed")){
+ for(var extraNames= lang._extraNames, i= extraNames.length; i;){
+ name = extraNames[--i];
+ t = source[name];
+ if((t !== op[name] || !(name in op)) && name != cname){
+ if(opts.call(t) == "[object Function]"){
+ // non-trivial function method => attach its name
+ t.nom = name;
+ }
+ target[name] = t;
+ }
+ }
+ }
+ return target;
+ }
+
+ function extend(source){
+ declare.safeMixin(this.prototype, source);
+ return this;
+ }
+
+ // chained constructor compatible with the legacy dojo.declare()
+ function chainedConstructor(bases, ctorSpecial){
+ return function(){
+ var a = arguments, args = a, a0 = a[0], f, i, m,
+ l = bases.length, preArgs;
+
+ if(!(this instanceof a.callee)){
+ // not called via new, so force it
+ return applyNew(a);
+ }
+
+ //this._inherited = {};
+ // perform the shaman's rituals of the original dojo.declare()
+ // 1) call two types of the preamble
+ if(ctorSpecial && (a0 && a0.preamble || this.preamble)){
+ // full blown ritual
+ preArgs = new Array(bases.length);
+ // prepare parameters
+ preArgs[0] = a;
+ for(i = 0;;){
+ // process the preamble of the 1st argument
+ a0 = a[0];
+ if(a0){
+ f = a0.preamble;
+ if(f){
+ a = f.apply(this, a) || a;
+ }
+ }
+ // process the preamble of this class
+ f = bases[i].prototype;
+ f = f.hasOwnProperty("preamble") && f.preamble;
+ if(f){
+ a = f.apply(this, a) || a;
+ }
+ // one peculiarity of the preamble:
+ // it is called if it is not needed,
+ // e.g., there is no constructor to call
+ // let's watch for the last constructor
+ // (see ticket #9795)
+ if(++i == l){
+ break;
+ }
+ preArgs[i] = a;
+ }
+ }
+ // 2) call all non-trivial constructors using prepared arguments
+ for(i = l - 1; i >= 0; --i){
+ f = bases[i];
+ m = f._meta;
+ f = m ? m.ctor : f;
+ if(f){
+ f.apply(this, preArgs ? preArgs[i] : a);
+ }
+ }
+ // 3) continue the original ritual: call the postscript
+ f = this.postscript;
+ if(f){
+ f.apply(this, args);
+ }
+ };
+ }
+
+
+ // chained constructor compatible with the legacy dojo.declare()
+ function singleConstructor(ctor, ctorSpecial){
+ return function(){
+ var a = arguments, t = a, a0 = a[0], f;
+
+ if(!(this instanceof a.callee)){
+ // not called via new, so force it
+ return applyNew(a);
+ }
+
+ //this._inherited = {};
+ // perform the shaman's rituals of the original dojo.declare()
+ // 1) call two types of the preamble
+ if(ctorSpecial){
+ // full blown ritual
+ if(a0){
+ // process the preamble of the 1st argument
+ f = a0.preamble;
+ if(f){
+ t = f.apply(this, t) || t;
+ }
+ }
+ f = this.preamble;
+ if(f){
+ // process the preamble of this class
+ f.apply(this, t);
+ // one peculiarity of the preamble:
+ // it is called even if it is not needed,
+ // e.g., there is no constructor to call
+ // let's watch for the last constructor
+ // (see ticket #9795)
+ }
+ }
+ // 2) call a constructor
+ if(ctor){
+ ctor.apply(this, a);
+ }
+ // 3) continue the original ritual: call the postscript
+ f = this.postscript;
+ if(f){
+ f.apply(this, a);
+ }
+ };
+ }
+
+ // plain vanilla constructor (can use inherited() to call its base constructor)
+ function simpleConstructor(bases){
+ return function(){
+ var a = arguments, i = 0, f, m;
+
+ if(!(this instanceof a.callee)){
+ // not called via new, so force it
+ return applyNew(a);
+ }
+
+ //this._inherited = {};
+ // perform the shaman's rituals of the original dojo.declare()
+ // 1) do not call the preamble
+ // 2) call the top constructor (it can use this.inherited())
+ for(; f = bases[i]; ++i){ // intentional assignment
+ m = f._meta;
+ f = m ? m.ctor : f;
+ if(f){
+ f.apply(this, a);
+ break;
+ }
+ }
+ // 3) call the postscript
+ f = this.postscript;
+ if(f){
+ f.apply(this, a);
+ }
+ };
+ }
+
+ function chain(name, bases, reversed){
+ return function(){
+ var b, m, f, i = 0, step = 1;
+ if(reversed){
+ i = bases.length - 1;
+ step = -1;
+ }
+ for(; b = bases[i]; i += step){ // intentional assignment
+ m = b._meta;
+ f = (m ? m.hidden : b.prototype)[name];
+ if(f){
+ f.apply(this, arguments);
+ }
+ }
+ };
+ }
+
+ // forceNew(ctor)
+ // return a new object that inherits from ctor.prototype but
+ // without actually running ctor on the object.
+ function forceNew(ctor){
+ // create object with correct prototype using a do-nothing
+ // constructor
+ xtor.prototype = ctor.prototype;
+ var t = new xtor;
+ xtor.prototype = null; // clean up
+ return t;
+ }
+
+ // applyNew(args)
+ // just like 'new ctor()' except that the constructor and its arguments come
+ // from args, which must be an array or an arguments object
+ function applyNew(args){
+ // create an object with ctor's prototype but without
+ // calling ctor on it.
+ var ctor = args.callee, t = forceNew(ctor);
+ // execute the real constructor on the new object
+ ctor.apply(t, args);
+ return t;
+ }
+
+ function declare(className, superclass, props){
+ // crack parameters
+ if(typeof className != "string"){
+ props = superclass;
+ superclass = className;
+ className = "";
+ }
+ props = props || {};
+
+ var proto, i, t, ctor, name, bases, chains, mixins = 1, parents = superclass;
+
+ // build a prototype
+ if(opts.call(superclass) == "[object Array]"){
+ // C3 MRO
+ bases = c3mro(superclass, className);
+ t = bases[0];
+ mixins = bases.length - t;
+ superclass = bases[mixins];
+ }else{
+ bases = [0];
+ if(superclass){
+ if(opts.call(superclass) == "[object Function]"){
+ t = superclass._meta;
+ bases = bases.concat(t ? t.bases : superclass);
+ }else{
+ err("base class is not a callable constructor.", className);
+ }
+ }else if(superclass !== null){
+ err("unknown base class. Did you use dojo.require to pull it in?", className);
+ }
+ }
+ if(superclass){
+ for(i = mixins - 1;; --i){
+ proto = forceNew(superclass);
+ if(!i){
+ // stop if nothing to add (the last base)
+ break;
+ }
+ // mix in properties
+ t = bases[i];
+ (t._meta ? mixOwn : mix)(proto, t.prototype);
+ // chain in new constructor
+ ctor = new Function;
+ ctor.superclass = superclass;
+ ctor.prototype = proto;
+ superclass = proto.constructor = ctor;
+ }
+ }else{
+ proto = {};
+ }
+ // add all properties
+ declare.safeMixin(proto, props);
+ // add constructor
+ t = props.constructor;
+ if(t !== op.constructor){
+ t.nom = cname;
+ proto.constructor = t;
+ }
+
+ // collect chains and flags
+ for(i = mixins - 1; i; --i){ // intentional assignment
+ t = bases[i]._meta;
+ if(t && t.chains){
+ chains = mix(chains || {}, t.chains);
+ }
+ }
+ if(proto["-chains-"]){
+ chains = mix(chains || {}, proto["-chains-"]);
+ }
+
+ // build ctor
+ t = !chains || !chains.hasOwnProperty(cname);
+ bases[0] = ctor = (chains && chains.constructor === "manual") ? simpleConstructor(bases) :
+ (bases.length == 1 ? singleConstructor(props.constructor, t) : chainedConstructor(bases, t));
+
+ // add meta information to the constructor
+ ctor._meta = {bases: bases, hidden: props, chains: chains,
+ parents: parents, ctor: props.constructor};
+ ctor.superclass = superclass && superclass.prototype;
+ ctor.extend = extend;
+ ctor.prototype = proto;
+ proto.constructor = ctor;
+
+ // add "standard" methods to the prototype
+ proto.getInherited = getInherited;
+ proto.isInstanceOf = isInstanceOf;
+ proto.inherited = inheritedImpl;
+ proto.__inherited = inherited;
+
+ // add name if specified
+ if(className){
+ proto.declaredClass = className;
+ lang.setObject(className, ctor);
+ }
+
+ // build chains and add them to the prototype
+ if(chains){
+ for(name in chains){
+ if(proto[name] && typeof chains[name] == "string" && name != cname){
+ t = proto[name] = chain(name, bases, chains[name] === "after");
+ t.nom = name;
+ }
+ }
+ }
+ // chained methods do not return values
+ // no need to chain "invisible" functions
+
+ return ctor; // Function
+ }
+
+ /*=====
+ dojo.declare = function(className, superclass, props){
+ // summary:
+ // Create a feature-rich constructor from compact notation.
+ // className: String?:
+ // The optional name of the constructor (loosely, a "class")
+ // stored in the "declaredClass" property in the created prototype.
+ // It will be used as a global name for a created constructor.
+ // superclass: Function|Function[]:
+ // May be null, a Function, or an Array of Functions. This argument
+ // specifies a list of bases (the left-most one is the most deepest
+ // base).
+ // props: Object:
+ // An object whose properties are copied to the created prototype.
+ // Add an instance-initialization function by making it a property
+ // named "constructor".
+ // returns:
+ // New constructor function.
+ // description:
+ // Create a constructor using a compact notation for inheritance and
+ // prototype extension.
+ //
+ // Mixin ancestors provide a type of multiple inheritance.
+ // Prototypes of mixin ancestors are copied to the new class:
+ // changes to mixin prototypes will not affect classes to which
+ // they have been mixed in.
+ //
+ // Ancestors can be compound classes created by this version of
+ // dojo.declare. In complex cases all base classes are going to be
+ // linearized according to C3 MRO algorithm
+ // (see http://www.python.org/download/releases/2.3/mro/ for more
+ // details).
+ //
+ // "className" is cached in "declaredClass" property of the new class,
+ // if it was supplied. The immediate super class will be cached in
+ // "superclass" property of the new class.
+ //
+ // Methods in "props" will be copied and modified: "nom" property
+ // (the declared name of the method) will be added to all copied
+ // functions to help identify them for the internal machinery. Be
+ // very careful, while reusing methods: if you use the same
+ // function under different names, it can produce errors in some
+ // cases.
+ //
+ // It is possible to use constructors created "manually" (without
+ // dojo.declare) as bases. They will be called as usual during the
+ // creation of an instance, their methods will be chained, and even
+ // called by "this.inherited()".
+ //
+ // Special property "-chains-" governs how to chain methods. It is
+ // a dictionary, which uses method names as keys, and hint strings
+ // as values. If a hint string is "after", this method will be
+ // called after methods of its base classes. If a hint string is
+ // "before", this method will be called before methods of its base
+ // classes.
+ //
+ // If "constructor" is not mentioned in "-chains-" property, it will
+ // be chained using the legacy mode: using "after" chaining,
+ // calling preamble() method before each constructor, if available,
+ // and calling postscript() after all constructors were executed.
+ // If the hint is "after", it is chained as a regular method, but
+ // postscript() will be called after the chain of constructors.
+ // "constructor" cannot be chained "before", but it allows
+ // a special hint string: "manual", which means that constructors
+ // are not going to be chained in any way, and programmer will call
+ // them manually using this.inherited(). In the latter case
+ // postscript() will be called after the construction.
+ //
+ // All chaining hints are "inherited" from base classes and
+ // potentially can be overridden. Be very careful when overriding
+ // hints! Make sure that all chained methods can work in a proposed
+ // manner of chaining.
+ //
+ // Once a method was chained, it is impossible to unchain it. The
+ // only exception is "constructor". You don't need to define a
+ // method in order to supply a chaining hint.
+ //
+ // If a method is chained, it cannot use this.inherited() because
+ // all other methods in the hierarchy will be called automatically.
+ //
+ // Usually constructors and initializers of any kind are chained
+ // using "after" and destructors of any kind are chained as
+ // "before". Note that chaining assumes that chained methods do not
+ // return any value: any returned value will be discarded.
+ //
+ // example:
+ // | dojo.declare("my.classes.bar", my.classes.foo, {
+ // | // properties to be added to the class prototype
+ // | someValue: 2,
+ // | // initialization function
+ // | constructor: function(){
+ // | this.myComplicatedObject = new ReallyComplicatedObject();
+ // | },
+ // | // other functions
+ // | someMethod: function(){
+ // | doStuff();
+ // | }
+ // | });
+ //
+ // example:
+ // | var MyBase = dojo.declare(null, {
+ // | // constructor, properties, and methods go here
+ // | // ...
+ // | });
+ // | var MyClass1 = dojo.declare(MyBase, {
+ // | // constructor, properties, and methods go here
+ // | // ...
+ // | });
+ // | var MyClass2 = dojo.declare(MyBase, {
+ // | // constructor, properties, and methods go here
+ // | // ...
+ // | });
+ // | var MyDiamond = dojo.declare([MyClass1, MyClass2], {
+ // | // constructor, properties, and methods go here
+ // | // ...
+ // | });
+ //
+ // example:
+ // | var F = function(){ console.log("raw constructor"); };
+ // | F.prototype.method = function(){
+ // | console.log("raw method");
+ // | };
+ // | var A = dojo.declare(F, {
+ // | constructor: function(){
+ // | console.log("A.constructor");
+ // | },
+ // | method: function(){
+ // | console.log("before calling F.method...");
+ // | this.inherited(arguments);
+ // | console.log("...back in A");
+ // | }
+ // | });
+ // | new A().method();
+ // | // will print:
+ // | // raw constructor
+ // | // A.constructor
+ // | // before calling F.method...
+ // | // raw method
+ // | // ...back in A
+ //
+ // example:
+ // | var A = dojo.declare(null, {
+ // | "-chains-": {
+ // | destroy: "before"
+ // | }
+ // | });
+ // | var B = dojo.declare(A, {
+ // | constructor: function(){
+ // | console.log("B.constructor");
+ // | },
+ // | destroy: function(){
+ // | console.log("B.destroy");
+ // | }
+ // | });
+ // | var C = dojo.declare(B, {
+ // | constructor: function(){
+ // | console.log("C.constructor");
+ // | },
+ // | destroy: function(){
+ // | console.log("C.destroy");
+ // | }
+ // | });
+ // | new C().destroy();
+ // | // prints:
+ // | // B.constructor
+ // | // C.constructor
+ // | // C.destroy
+ // | // B.destroy
+ //
+ // example:
+ // | var A = dojo.declare(null, {
+ // | "-chains-": {
+ // | constructor: "manual"
+ // | }
+ // | });
+ // | var B = dojo.declare(A, {
+ // | constructor: function(){
+ // | // ...
+ // | // call the base constructor with new parameters
+ // | this.inherited(arguments, [1, 2, 3]);
+ // | // ...
+ // | }
+ // | });
+ //
+ // example:
+ // | var A = dojo.declare(null, {
+ // | "-chains-": {
+ // | m1: "before"
+ // | },
+ // | m1: function(){
+ // | console.log("A.m1");
+ // | },
+ // | m2: function(){
+ // | console.log("A.m2");
+ // | }
+ // | });
+ // | var B = dojo.declare(A, {
+ // | "-chains-": {
+ // | m2: "after"
+ // | },
+ // | m1: function(){
+ // | console.log("B.m1");
+ // | },
+ // | m2: function(){
+ // | console.log("B.m2");
+ // | }
+ // | });
+ // | var x = new B();
+ // | x.m1();
+ // | // prints:
+ // | // B.m1
+ // | // A.m1
+ // | x.m2();
+ // | // prints:
+ // | // A.m2
+ // | // B.m2
+ return new Function(); // Function
+ };
+ =====*/
+
+ /*=====
+ dojo.safeMixin = function(target, source){
+ // summary:
+ // Mix in properties skipping a constructor and decorating functions
+ // like it is done by dojo.declare.
+ // target: Object
+ // Target object to accept new properties.
+ // source: Object
+ // Source object for new properties.
+ // description:
+ // This function is used to mix in properties like lang.mixin does,
+ // but it skips a constructor property and decorates functions like
+ // dojo.declare does.
+ //
+ // It is meant to be used with classes and objects produced with
+ // dojo.declare. Functions mixed in with dojo.safeMixin can use
+ // this.inherited() like normal methods.
+ //
+ // This function is used to implement extend() method of a constructor
+ // produced with dojo.declare().
+ //
+ // example:
+ // | var A = dojo.declare(null, {
+ // | m1: function(){
+ // | console.log("A.m1");
+ // | },
+ // | m2: function(){
+ // | console.log("A.m2");
+ // | }
+ // | });
+ // | var B = dojo.declare(A, {
+ // | m1: function(){
+ // | this.inherited(arguments);
+ // | console.log("B.m1");
+ // | }
+ // | });
+ // | B.extend({
+ // | m2: function(){
+ // | this.inherited(arguments);
+ // | console.log("B.m2");
+ // | }
+ // | });
+ // | var x = new B();
+ // | dojo.safeMixin(x, {
+ // | m1: function(){
+ // | this.inherited(arguments);
+ // | console.log("X.m1");
+ // | },
+ // | m2: function(){
+ // | this.inherited(arguments);
+ // | console.log("X.m2");
+ // | }
+ // | });
+ // | x.m2();
+ // | // prints:
+ // | // A.m1
+ // | // B.m1
+ // | // X.m1
+ };
+ =====*/
+
+ /*=====
+ Object.inherited = function(name, args, newArgs){
+ // summary:
+ // Calls a super method.
+ // name: String?
+ // The optional method name. Should be the same as the caller's
+ // name. Usually "name" is specified in complex dynamic cases, when
+ // the calling method was dynamically added, undecorated by
+ // dojo.declare, and it cannot be determined.
+ // args: Arguments
+ // The caller supply this argument, which should be the original
+ // "arguments".
+ // newArgs: Object?
+ // If "true", the found function will be returned without
+ // executing it.
+ // If Array, it will be used to call a super method. Otherwise
+ // "args" will be used.
+ // returns:
+ // Whatever is returned by a super method, or a super method itself,
+ // if "true" was specified as newArgs.
+ // description:
+ // This method is used inside method of classes produced with
+ // dojo.declare to call a super method (next in the chain). It is
+ // used for manually controlled chaining. Consider using the regular
+ // chaining, because it is faster. Use "this.inherited()" only in
+ // complex cases.
+ //
+ // This method cannot me called from automatically chained
+ // constructors including the case of a special (legacy)
+ // constructor chaining. It cannot be called from chained methods.
+ //
+ // If "this.inherited()" cannot find the next-in-chain method, it
+ // does nothing and returns "undefined". The last method in chain
+ // can be a default method implemented in Object, which will be
+ // called last.
+ //
+ // If "name" is specified, it is assumed that the method that
+ // received "args" is the parent method for this call. It is looked
+ // up in the chain list and if it is found the next-in-chain method
+ // is called. If it is not found, the first-in-chain method is
+ // called.
+ //
+ // If "name" is not specified, it will be derived from the calling
+ // method (using a methoid property "nom").
+ //
+ // example:
+ // | var B = dojo.declare(A, {
+ // | method1: function(a, b, c){
+ // | this.inherited(arguments);
+ // | },
+ // | method2: function(a, b){
+ // | return this.inherited(arguments, [a + b]);
+ // | }
+ // | });
+ // | // next method is not in the chain list because it is added
+ // | // manually after the class was created.
+ // | B.prototype.method3 = function(){
+ // | console.log("This is a dynamically-added method.");
+ // | this.inherited("method3", arguments);
+ // | };
+ // example:
+ // | var B = dojo.declare(A, {
+ // | method: function(a, b){
+ // | var super = this.inherited(arguments, true);
+ // | // ...
+ // | if(!super){
+ // | console.log("there is no super method");
+ // | return 0;
+ // | }
+ // | return super.apply(this, arguments);
+ // | }
+ // | });
+ return {}; // Object
+ }
+ =====*/
+
+ /*=====
+ Object.getInherited = function(name, args){
+ // summary:
+ // Returns a super method.
+ // name: String?
+ // The optional method name. Should be the same as the caller's
+ // name. Usually "name" is specified in complex dynamic cases, when
+ // the calling method was dynamically added, undecorated by
+ // dojo.declare, and it cannot be determined.
+ // args: Arguments
+ // The caller supply this argument, which should be the original
+ // "arguments".
+ // returns:
+ // Returns a super method (Function) or "undefined".
+ // description:
+ // This method is a convenience method for "this.inherited()".
+ // It uses the same algorithm but instead of executing a super
+ // method, it returns it, or "undefined" if not found.
+ //
+ // example:
+ // | var B = dojo.declare(A, {
+ // | method: function(a, b){
+ // | var super = this.getInherited(arguments);
+ // | // ...
+ // | if(!super){
+ // | console.log("there is no super method");
+ // | return 0;
+ // | }
+ // | return super.apply(this, arguments);
+ // | }
+ // | });
+ return {}; // Object
+ }
+ =====*/
+
+ /*=====
+ Object.isInstanceOf = function(cls){
+ // summary:
+ // Checks the inheritance chain to see if it is inherited from this
+ // class.
+ // cls: Function
+ // Class constructor.
+ // returns:
+ // "true", if this object is inherited from this class, "false"
+ // otherwise.
+ // description:
+ // This method is used with instances of classes produced with
+ // dojo.declare to determine of they support a certain interface or
+ // not. It models "instanceof" operator.
+ //
+ // example:
+ // | var A = dojo.declare(null, {
+ // | // constructor, properties, and methods go here
+ // | // ...
+ // | });
+ // | var B = dojo.declare(null, {
+ // | // constructor, properties, and methods go here
+ // | // ...
+ // | });
+ // | var C = dojo.declare([A, B], {
+ // | // constructor, properties, and methods go here
+ // | // ...
+ // | });
+ // | var D = dojo.declare(A, {
+ // | // constructor, properties, and methods go here
+ // | // ...
+ // | });
+ // |
+ // | var a = new A(), b = new B(), c = new C(), d = new D();
+ // |
+ // | console.log(a.isInstanceOf(A)); // true
+ // | console.log(b.isInstanceOf(A)); // false
+ // | console.log(c.isInstanceOf(A)); // true
+ // | console.log(d.isInstanceOf(A)); // true
+ // |
+ // | console.log(a.isInstanceOf(B)); // false
+ // | console.log(b.isInstanceOf(B)); // true
+ // | console.log(c.isInstanceOf(B)); // true
+ // | console.log(d.isInstanceOf(B)); // false
+ // |
+ // | console.log(a.isInstanceOf(C)); // false
+ // | console.log(b.isInstanceOf(C)); // false
+ // | console.log(c.isInstanceOf(C)); // true
+ // | console.log(d.isInstanceOf(C)); // false
+ // |
+ // | console.log(a.isInstanceOf(D)); // false
+ // | console.log(b.isInstanceOf(D)); // false
+ // | console.log(c.isInstanceOf(D)); // false
+ // | console.log(d.isInstanceOf(D)); // true
+ return {}; // Object
+ }
+ =====*/
+
+ /*=====
+ Object.extend = function(source){
+ // summary:
+ // Adds all properties and methods of source to constructor's
+ // prototype, making them available to all instances created with
+ // constructor. This method is specific to constructors created with
+ // dojo.declare.
+ // source: Object
+ // Source object which properties are going to be copied to the
+ // constructor's prototype.
+ // description:
+ // Adds source properties to the constructor's prototype. It can
+ // override existing properties.
+ //
+ // This method is similar to dojo.extend function, but it is specific
+ // to constructors produced by dojo.declare. It is implemented
+ // using dojo.safeMixin, and it skips a constructor property,
+ // and properly decorates copied functions.
+ //
+ // example:
+ // | var A = dojo.declare(null, {
+ // | m1: function(){},
+ // | s1: "Popokatepetl"
+ // | });
+ // | A.extend({
+ // | m1: function(){},
+ // | m2: function(){},
+ // | f1: true,
+ // | d1: 42
+ // | });
+ };
+ =====*/
+
+ dojo.safeMixin = declare.safeMixin = safeMixin;
+ dojo.declare = declare;
+
+ return declare;
+});
diff --git a/lib/dojo/_base/event.js b/lib/dojo/_base/event.js
index 65239bf50..522202d7b 100644
--- a/lib/dojo/_base/event.js
+++ b/lib/dojo/_base/event.js
@@ -4,646 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.event"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.event"] = true;
-dojo.provide("dojo._base.event");
-dojo.require("dojo._base.connect");
-
-
-// this file courtesy of the TurboAjax Group, licensed under a Dojo CLA
-
-(function(){
- // DOM event listener machinery
- var del = (dojo._event_listener = {
- add: function(/*DOMNode*/ node, /*String*/ name, /*Function*/ fp){
- if(!node){return;}
- name = del._normalizeEventName(name);
- fp = del._fixCallback(name, fp);
- if(
- !dojo.isIE &&
- (name == "mouseenter" || name == "mouseleave")
- ){
- var ofp = fp;
- name = (name == "mouseenter") ? "mouseover" : "mouseout";
- fp = function(e){
- if(!dojo.isDescendant(e.relatedTarget, node)){
- // e.type = oname; // FIXME: doesn't take? SJM: event.type is generally immutable.
- return ofp.call(this, e);
- }
- }
- }
- node.addEventListener(name, fp, false);
- return fp; /*Handle*/
- },
- remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
- // summary:
- // clobbers the listener from the node
- // node:
- // DOM node to attach the event to
- // event:
- // the name of the handler to remove the function from
- // handle:
- // the handle returned from add
- if(node){
- event = del._normalizeEventName(event);
- if(!dojo.isIE && (event == "mouseenter" || event == "mouseleave")){
- event = (event == "mouseenter") ? "mouseover" : "mouseout";
- }
-
- node.removeEventListener(event, handle, false);
- }
- },
- _normalizeEventName: function(/*String*/ name){
- // Generally, name should be lower case, unless it is special
- // somehow (e.g. a Mozilla DOM event).
- // Remove 'on'.
- return name.slice(0,2) =="on" ? name.slice(2) : name;
- },
- _fixCallback: function(/*String*/ name, fp){
- // By default, we only invoke _fixEvent for 'keypress'
- // If code is added to _fixEvent for other events, we have
- // to revisit this optimization.
- // This also applies to _fixEvent overrides for Safari and Opera
- // below.
- return name != "keypress" ? fp : function(e){ return fp.call(this, del._fixEvent(e, this)); };
- },
- _fixEvent: function(evt, sender){
- // _fixCallback only attaches us to keypress.
- // Switch on evt.type anyway because we might
- // be called directly from dojo.fixEvent.
- switch(evt.type){
- case "keypress":
- del._setKeyChar(evt);
- break;
- }
- return evt;
- },
- _setKeyChar: function(evt){
- evt.keyChar = evt.charCode >= 32 ? String.fromCharCode(evt.charCode) : '';
- evt.charOrCode = evt.keyChar || evt.keyCode;
- },
- // For IE and Safari: some ctrl-key combinations (mostly w/punctuation) do not emit a char code in IE
- // we map those virtual key codes to ascii here
- // not valid for all (non-US) keyboards, so maybe we shouldn't bother
- _punctMap: {
- 106:42,
- 111:47,
- 186:59,
- 187:43,
- 188:44,
- 189:45,
- 190:46,
- 191:47,
- 192:96,
- 219:91,
- 220:92,
- 221:93,
- 222:39
- }
- });
-
- // DOM events
-
- dojo.fixEvent = function(/*Event*/ evt, /*DOMNode*/ sender){
- // summary:
- // normalizes properties on the event object including event
- // bubbling methods, keystroke normalization, and x/y positions
- // evt: Event
- // native event object
- // sender: DOMNode
- // node to treat as "currentTarget"
- return del._fixEvent(evt, sender);
- };
-
- dojo.stopEvent = function(/*Event*/ evt){
- // summary:
- // prevents propagation and clobbers the default action of the
- // passed event
- // evt: Event
- // The event object. If omitted, window.event is used on IE.
- evt.preventDefault();
- evt.stopPropagation();
- // NOTE: below, this method is overridden for IE
- };
-
- // the default listener to use on dontFix nodes, overriden for IE
- var node_listener = dojo._listener;
-
- // Unify connect and event listeners
- dojo._connect = function(obj, event, context, method, dontFix){
- // FIXME: need a more strict test
- var isNode = obj && (obj.nodeType||obj.attachEvent||obj.addEventListener);
- // choose one of three listener options: raw (connect.js), DOM event on a Node, custom event on a Node
- // we need the third option to provide leak prevention on broken browsers (IE)
- var lid = isNode ? (dontFix ? 2 : 1) : 0, l = [dojo._listener, del, node_listener][lid];
- // create a listener
- var h = l.add(obj, event, dojo.hitch(context, method));
- // formerly, the disconnect package contained "l" directly, but if client code
- // leaks the disconnect package (by connecting it to a node), referencing "l"
- // compounds the problem.
- // instead we return a listener id, which requires custom _disconnect below.
- // return disconnect package
- return [ obj, event, h, lid ];
- };
-
- dojo._disconnect = function(obj, event, handle, listener){
- ([dojo._listener, del, node_listener][listener]).remove(obj, event, handle);
- };
-
- // Constants
-
- // Public: client code should test
- // keyCode against these named constants, as the
- // actual codes can vary by browser.
- dojo.keys = {
- // summary:
- // Definitions for common key values
- BACKSPACE: 8,
- TAB: 9,
- CLEAR: 12,
- ENTER: 13,
- SHIFT: 16,
- CTRL: 17,
- ALT: 18,
- META: dojo.isSafari ? 91 : 224, // the apple key on macs
- PAUSE: 19,
- CAPS_LOCK: 20,
- ESCAPE: 27,
- SPACE: 32,
- PAGE_UP: 33,
- PAGE_DOWN: 34,
- END: 35,
- HOME: 36,
- LEFT_ARROW: 37,
- UP_ARROW: 38,
- RIGHT_ARROW: 39,
- DOWN_ARROW: 40,
- INSERT: 45,
- DELETE: 46,
- HELP: 47,
- LEFT_WINDOW: 91,
- RIGHT_WINDOW: 92,
- SELECT: 93,
- NUMPAD_0: 96,
- NUMPAD_1: 97,
- NUMPAD_2: 98,
- NUMPAD_3: 99,
- NUMPAD_4: 100,
- NUMPAD_5: 101,
- NUMPAD_6: 102,
- NUMPAD_7: 103,
- NUMPAD_8: 104,
- NUMPAD_9: 105,
- NUMPAD_MULTIPLY: 106,
- NUMPAD_PLUS: 107,
- NUMPAD_ENTER: 108,
- NUMPAD_MINUS: 109,
- NUMPAD_PERIOD: 110,
- NUMPAD_DIVIDE: 111,
- F1: 112,
- F2: 113,
- F3: 114,
- F4: 115,
- F5: 116,
- F6: 117,
- F7: 118,
- F8: 119,
- F9: 120,
- F10: 121,
- F11: 122,
- F12: 123,
- F13: 124,
- F14: 125,
- F15: 126,
- NUM_LOCK: 144,
- SCROLL_LOCK: 145,
- // virtual key mapping
- copyKey: dojo.isMac && !dojo.isAIR ? (dojo.isSafari ? 91 : 224 ) : 17
- };
-
- var evtCopyKey = dojo.isMac ? "metaKey" : "ctrlKey";
-
- dojo.isCopyKey = function(e){
- // summary:
- // Checks an event for the copy key (meta on Mac, and ctrl anywhere else)
- // e: Event
- // Event object to examine
- return e[evtCopyKey]; // Boolean
- };
-
- // Public: decoding mouse buttons from events
-
-/*=====
- dojo.mouseButtons = {
- // LEFT: Number
- // Numeric value of the left mouse button for the platform.
- LEFT: 0,
- // MIDDLE: Number
- // Numeric value of the middle mouse button for the platform.
- MIDDLE: 1,
- // RIGHT: Number
- // Numeric value of the right mouse button for the platform.
- RIGHT: 2,
-
- isButton: function(e, button){
- // summary:
- // Checks an event object for a pressed button
- // e: Event
- // Event object to examine
- // button: Number
- // The button value (example: dojo.mouseButton.LEFT)
- return e.button == button; // Boolean
- },
- isLeft: function(e){
- // summary:
- // Checks an event object for the pressed left button
- // e: Event
- // Event object to examine
- return e.button == 0; // Boolean
- },
- isMiddle: function(e){
- // summary:
- // Checks an event object for the pressed middle button
- // e: Event
- // Event object to examine
- return e.button == 1; // Boolean
- },
- isRight: function(e){
- // summary:
- // Checks an event object for the pressed right button
- // e: Event
- // Event object to examine
- return e.button == 2; // Boolean
- }
- };
-=====*/
-
- if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){
- dojo.mouseButtons = {
- LEFT: 1,
- MIDDLE: 4,
- RIGHT: 2,
- // helper functions
- isButton: function(e, button){ return e.button & button; },
- isLeft: function(e){ return e.button & 1; },
- isMiddle: function(e){ return e.button & 4; },
- isRight: function(e){ return e.button & 2; }
- };
- }else{
- dojo.mouseButtons = {
- LEFT: 0,
- MIDDLE: 1,
- RIGHT: 2,
- // helper functions
- isButton: function(e, button){ return e.button == button; },
- isLeft: function(e){ return e.button == 0; },
- isMiddle: function(e){ return e.button == 1; },
- isRight: function(e){ return e.button == 2; }
- };
- }
-
- // IE event normalization
- if(dojo.isIE){
- var _trySetKeyCode = function(e, code){
- try{
- // squelch errors when keyCode is read-only
- // (e.g. if keyCode is ctrl or shift)
- return (e.keyCode = code);
- }catch(e){
- return 0;
- }
- };
-
- // by default, use the standard listener
- var iel = dojo._listener;
- var listenersName = (dojo._ieListenersName = "_" + dojo._scopeName + "_listeners");
- // dispatcher tracking property
- if(!dojo.config._allow_leaks){
- // custom listener that handles leak protection for DOM events
- node_listener = iel = dojo._ie_listener = {
- // support handler indirection: event handler functions are
- // referenced here. Event dispatchers hold only indices.
- handlers: [],
- // add a listener to an object
- add: function(/*Object*/ source, /*String*/ method, /*Function*/ listener){
- source = source || dojo.global;
- var f = source[method];
- if(!f||!f[listenersName]){
- var d = dojo._getIeDispatcher();
- // original target function is special
- d.target = f && (ieh.push(f) - 1);
- // dispatcher holds a list of indices into handlers table
- d[listenersName] = [];
- // redirect source to dispatcher
- f = source[method] = d;
- }
- return f[listenersName].push(ieh.push(listener) - 1) ; /*Handle*/
- },
- // remove a listener from an object
- remove: function(/*Object*/ source, /*String*/ method, /*Handle*/ handle){
- var f = (source||dojo.global)[method], l = f && f[listenersName];
- if(f && l && handle--){
- delete ieh[l[handle]];
- delete l[handle];
- }
- }
- };
- // alias used above
- var ieh = iel.handlers;
- }
-
- dojo.mixin(del, {
- add: function(/*DOMNode*/ node, /*String*/ event, /*Function*/ fp){
- if(!node){return;} // undefined
- event = del._normalizeEventName(event);
- if(event=="onkeypress"){
- // we need to listen to onkeydown to synthesize
- // keypress events that otherwise won't fire
- // on IE
- var kd = node.onkeydown;
- if(!kd || !kd[listenersName] || !kd._stealthKeydownHandle){
- var h = del.add(node, "onkeydown", del._stealthKeyDown);
- kd = node.onkeydown;
- kd._stealthKeydownHandle = h;
- kd._stealthKeydownRefs = 1;
- }else{
- kd._stealthKeydownRefs++;
- }
- }
- return iel.add(node, event, del._fixCallback(fp));
- },
- remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
- event = del._normalizeEventName(event);
- iel.remove(node, event, handle);
- if(event=="onkeypress"){
- var kd = node.onkeydown;
- if(--kd._stealthKeydownRefs <= 0){
- iel.remove(node, "onkeydown", kd._stealthKeydownHandle);
- delete kd._stealthKeydownHandle;
- }
- }
- },
- _normalizeEventName: function(/*String*/ eventName){
- // Generally, eventName should be lower case, unless it is
- // special somehow (e.g. a Mozilla event)
- // ensure 'on'
- return eventName.slice(0,2) != "on" ? "on" + eventName : eventName;
- },
- _nop: function(){},
- _fixEvent: function(/*Event*/ evt, /*DOMNode*/ sender){
- // summary:
- // normalizes properties on the event object including event
- // bubbling methods, keystroke normalization, and x/y positions
- // evt:
- // native event object
- // sender:
- // node to treat as "currentTarget"
- if(!evt){
- var w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window;
- evt = w.event;
- }
- if(!evt){return(evt);}
- evt.target = evt.srcElement;
- evt.currentTarget = (sender || evt.srcElement);
- evt.layerX = evt.offsetX;
- evt.layerY = evt.offsetY;
- // FIXME: scroll position query is duped from dojo.html to
- // avoid dependency on that entire module. Now that HTML is in
- // Base, we should convert back to something similar there.
- var se = evt.srcElement, doc = (se && se.ownerDocument) || document;
- // DO NOT replace the following to use dojo.body(), in IE, document.documentElement should be used
- // here rather than document.body
- var docBody = ((dojo.isIE < 6) || (doc["compatMode"] == "BackCompat")) ? doc.body : doc.documentElement;
- var offset = dojo._getIeDocumentElementOffset();
- evt.pageX = evt.clientX + dojo._fixIeBiDiScrollLeft(docBody.scrollLeft || 0) - offset.x;
- evt.pageY = evt.clientY + (docBody.scrollTop || 0) - offset.y;
- if(evt.type == "mouseover"){
- evt.relatedTarget = evt.fromElement;
- }
- if(evt.type == "mouseout"){
- evt.relatedTarget = evt.toElement;
- }
- if (dojo.isIE < 9 || dojo.isQuirks) {
- evt.stopPropagation = del._stopPropagation;
- evt.preventDefault = del._preventDefault;
- }
- return del._fixKeys(evt);
- },
- _fixKeys: function(evt){
- switch(evt.type){
- case "keypress":
- var c = ("charCode" in evt ? evt.charCode : evt.keyCode);
- if (c==10){
- // CTRL-ENTER is CTRL-ASCII(10) on IE, but CTRL-ENTER on Mozilla
- c=0;
- evt.keyCode = 13;
- }else if(c==13||c==27){
- c=0; // Mozilla considers ENTER and ESC non-printable
- }else if(c==3){
- c=99; // Mozilla maps CTRL-BREAK to CTRL-c
- }
- // Mozilla sets keyCode to 0 when there is a charCode
- // but that stops the event on IE.
- evt.charCode = c;
- del._setKeyChar(evt);
- break;
- }
- return evt;
- },
- _stealthKeyDown: function(evt){
- // IE doesn't fire keypress for most non-printable characters.
- // other browsers do, we simulate it here.
- var kp = evt.currentTarget.onkeypress;
- // only works if kp exists and is a dispatcher
- if(!kp || !kp[listenersName]){ return; }
- // munge key/charCode
- var k=evt.keyCode;
- // These are Windows Virtual Key Codes
- // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp
- var unprintable = (k!=13 || (dojo.isIE >= 9 && !dojo.isQuirks)) && k!=32 && k!=27 && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222);
-
- // synthesize keypress for most unprintables and CTRL-keys
- if(unprintable||evt.ctrlKey){
- var c = unprintable ? 0 : k;
- if(evt.ctrlKey){
- if(k==3 || k==13){
- return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively
- }else if(c>95 && c<106){
- c -= 48; // map CTRL-[numpad 0-9] to ASCII
- }else if((!evt.shiftKey)&&(c>=65&&c<=90)){
- c += 32; // map CTRL-[A-Z] to lowercase
- }else{
- c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII
- }
- }
- // simulate a keypress event
- var faux = del._synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c});
- kp.call(evt.currentTarget, faux);
- if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){
- evt.cancelBubble = faux.cancelBubble;
- }
- evt.returnValue = faux.returnValue;
- _trySetKeyCode(evt, faux.keyCode);
- }
- },
- // Called in Event scope
- _stopPropagation: function(){
- this.cancelBubble = true;
- },
- _preventDefault: function(){
- // Setting keyCode to 0 is the only way to prevent certain keypresses (namely
- // ctrl-combinations that correspond to menu accelerator keys).
- // Otoh, it prevents upstream listeners from getting this information
- // Try to split the difference here by clobbering keyCode only for ctrl
- // combinations. If you still need to access the key upstream, bubbledKeyCode is
- // provided as a workaround.
- this.bubbledKeyCode = this.keyCode;
- if(this.ctrlKey){_trySetKeyCode(this, 0);}
- this.returnValue = false;
- }
- });
-
- // override stopEvent for IE
- dojo.stopEvent = (dojo.isIE < 9 || dojo.isQuirks) ? function(evt){
- evt = evt || window.event;
- del._stopPropagation.call(evt);
- del._preventDefault.call(evt);
- } : dojo.stopEvent;
- }
-
- del._synthesizeEvent = function(evt, props){
- var faux = dojo.mixin({}, evt, props);
- del._setKeyChar(faux);
- // FIXME: would prefer to use dojo.hitch: dojo.hitch(evt, evt.preventDefault);
- // but it throws an error when preventDefault is invoked on Safari
- // does Event.preventDefault not support "apply" on Safari?
- faux.preventDefault = function(){ evt.preventDefault(); };
- faux.stopPropagation = function(){ evt.stopPropagation(); };
- return faux;
- };
-
- // Opera event normalization
- if(dojo.isOpera){
- dojo.mixin(del, {
- _fixEvent: function(evt, sender){
- switch(evt.type){
- case "keypress":
- var c = evt.which;
- if(c==3){
- c=99; // Mozilla maps CTRL-BREAK to CTRL-c
- }
- // can't trap some keys at all, like INSERT and DELETE
- // there is no differentiating info between DELETE and ".", or INSERT and "-"
- c = c<41 && !evt.shiftKey ? 0 : c;
- if(evt.ctrlKey && !evt.shiftKey && c>=65 && c<=90){
- // lowercase CTRL-[A-Z] keys
- c += 32;
- }
- return del._synthesizeEvent(evt, { charCode: c });
- }
- return evt;
- }
- });
- }
-
- // Webkit event normalization
- if(dojo.isWebKit){
- del._add = del.add;
- del._remove = del.remove;
-
- dojo.mixin(del, {
- add: function(/*DOMNode*/ node, /*String*/ event, /*Function*/ fp){
- if(!node){return;} // undefined
- var handle = del._add(node, event, fp);
- if(del._normalizeEventName(event) == "keypress"){
- // we need to listen to onkeydown to synthesize
- // keypress events that otherwise won't fire
- // in Safari 3.1+: https://lists.webkit.org/pipermail/webkit-dev/2007-December/002992.html
- handle._stealthKeyDownHandle = del._add(node, "keydown", function(evt){
- //A variation on the IE _stealthKeydown function
- //Synthesize an onkeypress event, but only for unprintable characters.
- var k=evt.keyCode;
- // These are Windows Virtual Key Codes
- // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp
- var unprintable = k!=13 && k!=32 && (k<48 || k>90) && (k<96 || k>111) && (k<186 || k>192) && (k<219 || k>222);
- // synthesize keypress for most unprintables and CTRL-keys
- if(unprintable || evt.ctrlKey){
- var c = unprintable ? 0 : k;
- if(evt.ctrlKey){
- if(k==3 || k==13){
- return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively
- }else if(c>95 && c<106){
- c -= 48; // map CTRL-[numpad 0-9] to ASCII
- }else if(!evt.shiftKey && c>=65 && c<=90){
- c += 32; // map CTRL-[A-Z] to lowercase
- }else{
- c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII
- }
- }
- // simulate a keypress event
- var faux = del._synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c});
- fp.call(evt.currentTarget, faux);
- }
- });
- }
- return handle; /*Handle*/
- },
-
- remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
- if(node){
- if(handle._stealthKeyDownHandle){
- del._remove(node, "keydown", handle._stealthKeyDownHandle);
- }
- del._remove(node, event, handle);
- }
- },
- _fixEvent: function(evt, sender){
- switch(evt.type){
- case "keypress":
- if(evt.faux){ return evt; }
- var c = evt.charCode;
- c = c>=32 ? c : 0;
- return del._synthesizeEvent(evt, {charCode: c, faux: true});
- }
- return evt;
- }
- });
- }
- })();
-
-if(dojo.isIE){
- // keep this out of the closure
- // closing over 'iel' or 'ieh' b0rks leak prevention
- // ls[i] is an index into the master handler array
- dojo._ieDispatcher = function(args, sender){
- var ap = Array.prototype,
- h = dojo._ie_listener.handlers,
- c = args.callee,
- ls = c[dojo._ieListenersName],
- t = h[c.target];
- // return value comes from original target function
- var r = t && t.apply(sender, args);
- // make local copy of listener array so it's immutable during processing
- var lls = [].concat(ls);
- // invoke listeners after target function
- for(var i in lls){
- var f = h[lls[i]];
- if(!(i in ap) && f){
- f.apply(sender, args);
- }
- }
- return r;
- };
- dojo._getIeDispatcher = function(){
- // ensure the returned function closes over nothing ("new Function" apparently doesn't close)
- return new Function(dojo._scopeName + "._ieDispatcher(arguments, this)"); // function
- };
- // keep this out of the closure to reduce RAM allocation
- dojo._event_listener._fixCallback = function(fp){
- var f = dojo._event_listener._fixEvent;
- return function(e){ return fp.call(this, f(e, this)); };
- };
-}
-
-}
+//>>built
+define("dojo/_base/event",["./kernel","../on","../has","../dom-geometry"],function(_1,on,_2,_3){if(on._fixEvent){var _4=on._fixEvent;on._fixEvent=function(_5,se){_5=_4(_5,se);if(_5){_3.normalizeEvent(_5);}return _5;};}_1.fixEvent=function(_6,_7){if(on._fixEvent){return on._fixEvent(_6,_7);}return _6;};_1.stopEvent=function(_8){if(_2("dom-addeventlistener")||(_8&&_8.preventDefault)){_8.preventDefault();_8.stopPropagation();}else{_8=_8||window.event;_8.cancelBubble=true;on._preventDefault.call(_8);}};return {fix:_1.fixEvent,stop:_1.stopEvent};}); \ No newline at end of file
diff --git a/lib/dojo/_base/event.js.uncompressed.js b/lib/dojo/_base/event.js.uncompressed.js
new file mode 100644
index 000000000..34b9ce8e6
--- /dev/null
+++ b/lib/dojo/_base/event.js.uncompressed.js
@@ -0,0 +1,51 @@
+define("dojo/_base/event", ["./kernel", "../on", "../has", "../dom-geometry"], function(dojo, on, has, dom){
+ // module:
+ // dojo/_base/event
+ // summary:
+ // This module defines dojo DOM event API.
+ if(on._fixEvent){
+ var fixEvent = on._fixEvent;
+ on._fixEvent = function(evt, se){
+ // add some additional normalization for back-compat, this isn't in on.js because it is somewhat more expensive
+ evt = fixEvent(evt, se);
+ if(evt){
+ dom.normalizeEvent(evt);
+ }
+ return evt;
+ };
+ }
+ dojo.fixEvent = function(/*Event*/ evt, /*DOMNode*/ sender){
+ // summary:
+ // normalizes properties on the event object including event
+ // bubbling methods, keystroke normalization, and x/y positions
+ // evt: Event
+ // native event object
+ // sender: DOMNode
+ // node to treat as "currentTarget"
+ if(on._fixEvent){
+ return on._fixEvent(evt, sender);
+ }
+ return evt; // Event
+ };
+
+ dojo.stopEvent = function(/*Event*/ evt){
+ // summary:
+ // prevents propagation and clobbers the default action of the
+ // passed event
+ // evt: Event
+ // The event object. If omitted, window.event is used on IE.
+ if(has("dom-addeventlistener") || (evt && evt.preventDefault)){
+ evt.preventDefault();
+ evt.stopPropagation();
+ }else{
+ evt = evt || window.event;
+ evt.cancelBubble = true;
+ on._preventDefault.call(evt);
+ }
+ };
+
+ return {
+ fix: dojo.fixEvent,
+ stop: dojo.stopEvent
+ };
+});
diff --git a/lib/dojo/_base/fx.js b/lib/dojo/_base/fx.js
index 860e0e18b..0ac96bc69 100644
--- a/lib/dojo/_base/fx.js
+++ b/lib/dojo/_base/fx.js
@@ -4,667 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.fx"] = true;
-dojo.provide("dojo._base.fx");
-dojo.require("dojo._base.Color");
-dojo.require("dojo._base.connect");
-dojo.require("dojo._base.lang");
-dojo.require("dojo._base.html");
-
-
-/*
- Animation loosely package based on Dan Pupius' work, contributed under CLA:
- http://pupius.co.uk/js/Toolkit.Drawing.js
-*/
-(function(){
- var d = dojo;
- var _mixin = d._mixin;
-
- dojo._Line = function(/*int*/ start, /*int*/ end){
- // summary:
- // dojo._Line is the object used to generate values from a start value
- // to an end value
- // start: int
- // Beginning value for range
- // end: int
- // Ending value for range
- this.start = start;
- this.end = end;
- };
-
- dojo._Line.prototype.getValue = function(/*float*/ n){
- // summary: Returns the point on the line
- // n: a floating point number greater than 0 and less than 1
- return ((this.end - this.start) * n) + this.start; // Decimal
- };
-
- dojo.Animation = function(args){
- // summary:
- // A generic animation class that fires callbacks into its handlers
- // object at various states.
- // description:
- // A generic animation class that fires callbacks into its handlers
- // object at various states. Nearly all dojo animation functions
- // return an instance of this method, usually without calling the
- // .play() method beforehand. Therefore, you will likely need to
- // call .play() on instances of `dojo.Animation` when one is
- // returned.
- // args: Object
- // The 'magic argument', mixing all the properties into this
- // animation instance.
-
- _mixin(this, args);
- if(d.isArray(this.curve)){
- this.curve = new d._Line(this.curve[0], this.curve[1]);
- }
-
- };
-
- // Alias to drop come 2.0:
- d._Animation = d.Animation;
-
- d.extend(dojo.Animation, {
- // duration: Integer
- // The time in milliseonds the animation will take to run
- duration: 350,
-
- /*=====
- // curve: dojo._Line|Array
- // A two element array of start and end values, or a `dojo._Line` instance to be
- // used in the Animation.
- curve: null,
-
- // easing: Function?
- // A Function to adjust the acceleration (or deceleration) of the progress
- // across a dojo._Line
- easing: null,
- =====*/
-
- // repeat: Integer?
- // The number of times to loop the animation
- repeat: 0,
-
- // rate: Integer?
- // the time in milliseconds to wait before advancing to next frame
- // (used as a fps timer: 1000/rate = fps)
- rate: 20 /* 50 fps */,
-
- /*=====
- // delay: Integer?
- // The time in milliseconds to wait before starting animation after it
- // has been .play()'ed
- delay: null,
-
- // beforeBegin: Event?
- // Synthetic event fired before a dojo.Animation begins playing (synchronous)
- beforeBegin: null,
-
- // onBegin: Event?
- // Synthetic event fired as a dojo.Animation begins playing (useful?)
- onBegin: null,
-
- // onAnimate: Event?
- // Synthetic event fired at each interval of a `dojo.Animation`
- onAnimate: null,
-
- // onEnd: Event?
- // Synthetic event fired after the final frame of a `dojo.Animation`
- onEnd: null,
-
- // onPlay: Event?
- // Synthetic event fired any time a `dojo.Animation` is play()'ed
- onPlay: null,
-
- // onPause: Event?
- // Synthetic event fired when a `dojo.Animation` is paused
- onPause: null,
-
- // onStop: Event
- // Synthetic event fires when a `dojo.Animation` is stopped
- onStop: null,
-
- =====*/
-
- _percent: 0,
- _startRepeatCount: 0,
-
- _getStep: function(){
- var _p = this._percent,
- _e = this.easing
- ;
- return _e ? _e(_p) : _p;
- },
- _fire: function(/*Event*/ evt, /*Array?*/ args){
- // summary:
- // Convenience function. Fire event "evt" and pass it the
- // arguments specified in "args".
- // description:
- // Convenience function. Fire event "evt" and pass it the
- // arguments specified in "args".
- // Fires the callback in the scope of the `dojo.Animation`
- // instance.
- // evt:
- // The event to fire.
- // args:
- // The arguments to pass to the event.
- var a = args||[];
- if(this[evt]){
- if(d.config.debugAtAllCosts){
- this[evt].apply(this, a);
- }else{
- try{
- this[evt].apply(this, a);
- }catch(e){
- // squelch and log because we shouldn't allow exceptions in
- // synthetic event handlers to cause the internal timer to run
- // amuck, potentially pegging the CPU. I'm not a fan of this
- // squelch, but hopefully logging will make it clear what's
- // going on
- console.error("exception in animation handler for:", evt);
- console.error(e);
- }
- }
- }
- return this; // dojo.Animation
- },
-
- play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
- // summary:
- // Start the animation.
- // delay:
- // How many milliseconds to delay before starting.
- // gotoStart:
- // If true, starts the animation from the beginning; otherwise,
- // starts it from its current position.
- // returns: dojo.Animation
- // The instance to allow chaining.
-
- var _t = this;
- if(_t._delayTimer){ _t._clearTimer(); }
- if(gotoStart){
- _t._stopTimer();
- _t._active = _t._paused = false;
- _t._percent = 0;
- }else if(_t._active && !_t._paused){
- return _t;
- }
-
- _t._fire("beforeBegin", [_t.node]);
-
- var de = delay || _t.delay,
- _p = dojo.hitch(_t, "_play", gotoStart);
-
- if(de > 0){
- _t._delayTimer = setTimeout(_p, de);
- return _t;
- }
- _p();
- return _t;
- },
-
- _play: function(gotoStart){
- var _t = this;
- if(_t._delayTimer){ _t._clearTimer(); }
- _t._startTime = new Date().valueOf();
- if(_t._paused){
- _t._startTime -= _t.duration * _t._percent;
- }
-
- _t._active = true;
- _t._paused = false;
- var value = _t.curve.getValue(_t._getStep());
- if(!_t._percent){
- if(!_t._startRepeatCount){
- _t._startRepeatCount = _t.repeat;
- }
- _t._fire("onBegin", [value]);
- }
-
- _t._fire("onPlay", [value]);
-
- _t._cycle();
- return _t; // dojo.Animation
- },
-
- pause: function(){
- // summary: Pauses a running animation.
- var _t = this;
- if(_t._delayTimer){ _t._clearTimer(); }
- _t._stopTimer();
- if(!_t._active){ return _t; /*dojo.Animation*/ }
- _t._paused = true;
- _t._fire("onPause", [_t.curve.getValue(_t._getStep())]);
- return _t; // dojo.Animation
- },
-
- gotoPercent: function(/*Decimal*/ percent, /*Boolean?*/ andPlay){
- // summary:
- // Sets the progress of the animation.
- // percent:
- // A percentage in decimal notation (between and including 0.0 and 1.0).
- // andPlay:
- // If true, play the animation after setting the progress.
- var _t = this;
- _t._stopTimer();
- _t._active = _t._paused = true;
- _t._percent = percent;
- if(andPlay){ _t.play(); }
- return _t; // dojo.Animation
- },
-
- stop: function(/*boolean?*/ gotoEnd){
- // summary: Stops a running animation.
- // gotoEnd: If true, the animation will end.
- var _t = this;
- if(_t._delayTimer){ _t._clearTimer(); }
- if(!_t._timer){ return _t; /* dojo.Animation */ }
- _t._stopTimer();
- if(gotoEnd){
- _t._percent = 1;
- }
- _t._fire("onStop", [_t.curve.getValue(_t._getStep())]);
- _t._active = _t._paused = false;
- return _t; // dojo.Animation
- },
-
- status: function(){
- // summary:
- // Returns a string token representation of the status of
- // the animation, one of: "paused", "playing", "stopped"
- if(this._active){
- return this._paused ? "paused" : "playing"; // String
- }
- return "stopped"; // String
- },
-
- _cycle: function(){
- var _t = this;
- if(_t._active){
- var curr = new Date().valueOf();
- var step = (curr - _t._startTime) / (_t.duration);
-
- if(step >= 1){
- step = 1;
- }
- _t._percent = step;
-
- // Perform easing
- if(_t.easing){
- step = _t.easing(step);
- }
-
- _t._fire("onAnimate", [_t.curve.getValue(step)]);
-
- if(_t._percent < 1){
- _t._startTimer();
- }else{
- _t._active = false;
-
- if(_t.repeat > 0){
- _t.repeat--;
- _t.play(null, true);
- }else if(_t.repeat == -1){
- _t.play(null, true);
- }else{
- if(_t._startRepeatCount){
- _t.repeat = _t._startRepeatCount;
- _t._startRepeatCount = 0;
- }
- }
- _t._percent = 0;
- _t._fire("onEnd", [_t.node]);
- !_t.repeat && _t._stopTimer();
- }
- }
- return _t; // dojo.Animation
- },
-
- _clearTimer: function(){
- // summary: Clear the play delay timer
- clearTimeout(this._delayTimer);
- delete this._delayTimer;
- }
-
- });
-
- // the local timer, stubbed into all Animation instances
- var ctr = 0,
- timer = null,
- runner = {
- run: function(){}
- };
-
- d.extend(d.Animation, {
-
- _startTimer: function(){
- if(!this._timer){
- this._timer = d.connect(runner, "run", this, "_cycle");
- ctr++;
- }
- if(!timer){
- timer = setInterval(d.hitch(runner, "run"), this.rate);
- }
- },
-
- _stopTimer: function(){
- if(this._timer){
- d.disconnect(this._timer);
- this._timer = null;
- ctr--;
- }
- if(ctr <= 0){
- clearInterval(timer);
- timer = null;
- ctr = 0;
- }
- }
-
- });
-
- var _makeFadeable =
- d.isIE ? function(node){
- // only set the zoom if the "tickle" value would be the same as the
- // default
- var ns = node.style;
- // don't set the width to auto if it didn't already cascade that way.
- // We don't want to f anyones designs
- if(!ns.width.length && d.style(node, "width") == "auto"){
- ns.width = "auto";
- }
- } :
- function(){};
-
- dojo._fade = function(/*Object*/ args){
- // summary:
- // Returns an animation that will fade the node defined by
- // args.node from the start to end values passed (args.start
- // args.end) (end is mandatory, start is optional)
-
- args.node = d.byId(args.node);
- var fArgs = _mixin({ properties: {} }, args),
- props = (fArgs.properties.opacity = {});
-
- props.start = !("start" in fArgs) ?
- function(){
- return +d.style(fArgs.node, "opacity")||0;
- } : fArgs.start;
- props.end = fArgs.end;
-
- var anim = d.animateProperty(fArgs);
- d.connect(anim, "beforeBegin", d.partial(_makeFadeable, fArgs.node));
-
- return anim; // dojo.Animation
- };
-
- /*=====
- dojo.__FadeArgs = function(node, duration, easing){
- // node: DOMNode|String
- // The node referenced in the animation
- // duration: Integer?
- // Duration of the animation in milliseconds.
- // easing: Function?
- // An easing function.
- this.node = node;
- this.duration = duration;
- this.easing = easing;
- }
- =====*/
-
- dojo.fadeIn = function(/*dojo.__FadeArgs*/ args){
- // summary:
- // Returns an animation that will fade node defined in 'args' from
- // its current opacity to fully opaque.
- return d._fade(_mixin({ end: 1 }, args)); // dojo.Animation
- };
-
- dojo.fadeOut = function(/*dojo.__FadeArgs*/ args){
- // summary:
- // Returns an animation that will fade node defined in 'args'
- // from its current opacity to fully transparent.
- return d._fade(_mixin({ end: 0 }, args)); // dojo.Animation
- };
-
- dojo._defaultEasing = function(/*Decimal?*/ n){
- // summary: The default easing function for dojo.Animation(s)
- return 0.5 + ((Math.sin((n + 1.5) * Math.PI)) / 2);
- };
-
- var PropLine = function(properties){
- // PropLine is an internal class which is used to model the values of
- // an a group of CSS properties across an animation lifecycle. In
- // particular, the "getValue" function handles getting interpolated
- // values between start and end for a particular CSS value.
- this._properties = properties;
- for(var p in properties){
- var prop = properties[p];
- if(prop.start instanceof d.Color){
- // create a reusable temp color object to keep intermediate results
- prop.tempColor = new d.Color();
- }
- }
- };
-
- PropLine.prototype.getValue = function(r){
- var ret = {};
- for(var p in this._properties){
- var prop = this._properties[p],
- start = prop.start;
- if(start instanceof d.Color){
- ret[p] = d.blendColors(start, prop.end, r, prop.tempColor).toCss();
- }else if(!d.isArray(start)){
- ret[p] = ((prop.end - start) * r) + start + (p != "opacity" ? prop.units || "px" : 0);
- }
- }
- return ret;
- };
-
- /*=====
- dojo.declare("dojo.__AnimArgs", [dojo.__FadeArgs], {
- // Properties: Object?
- // A hash map of style properties to Objects describing the transition,
- // such as the properties of dojo._Line with an additional 'units' property
- properties: {}
-
- //TODOC: add event callbacks
- });
- =====*/
-
- dojo.animateProperty = function(/*dojo.__AnimArgs*/ args){
- // summary:
- // Returns an animation that will transition the properties of
- // node defined in `args` depending how they are defined in
- // `args.properties`
- //
- // description:
- // `dojo.animateProperty` is the foundation of most `dojo.fx`
- // animations. It takes an object of "properties" corresponding to
- // style properties, and animates them in parallel over a set
- // duration.
- //
- // example:
- // A simple animation that changes the width of the specified node.
- // | dojo.animateProperty({
- // | node: "nodeId",
- // | properties: { width: 400 },
- // | }).play();
- // Dojo figures out the start value for the width and converts the
- // integer specified for the width to the more expressive but
- // verbose form `{ width: { end: '400', units: 'px' } }` which you
- // can also specify directly. Defaults to 'px' if ommitted.
- //
- // example:
- // Animate width, height, and padding over 2 seconds... the
- // pedantic way:
- // | dojo.animateProperty({ node: node, duration:2000,
- // | properties: {
- // | width: { start: '200', end: '400', units:"px" },
- // | height: { start:'200', end: '400', units:"px" },
- // | paddingTop: { start:'5', end:'50', units:"px" }
- // | }
- // | }).play();
- // Note 'paddingTop' is used over 'padding-top'. Multi-name CSS properties
- // are written using "mixed case", as the hyphen is illegal as an object key.
- //
- // example:
- // Plug in a different easing function and register a callback for
- // when the animation ends. Easing functions accept values between
- // zero and one and return a value on that basis. In this case, an
- // exponential-in curve.
- // | dojo.animateProperty({
- // | node: "nodeId",
- // | // dojo figures out the start value
- // | properties: { width: { end: 400 } },
- // | easing: function(n){
- // | return (n==0) ? 0 : Math.pow(2, 10 * (n - 1));
- // | },
- // | onEnd: function(node){
- // | // called when the animation finishes. The animation
- // | // target is passed to this function
- // | }
- // | }).play(500); // delay playing half a second
- //
- // example:
- // Like all `dojo.Animation`s, animateProperty returns a handle to the
- // Animation instance, which fires the events common to Dojo FX. Use `dojo.connect`
- // to access these events outside of the Animation definiton:
- // | var anim = dojo.animateProperty({
- // | node:"someId",
- // | properties:{
- // | width:400, height:500
- // | }
- // | });
- // | dojo.connect(anim,"onEnd", function(){
- // | console.log("animation ended");
- // | });
- // | // play the animation now:
- // | anim.play();
- //
- // example:
- // Each property can be a function whose return value is substituted along.
- // Additionally, each measurement (eg: start, end) can be a function. The node
- // reference is passed direcly to callbacks.
- // | dojo.animateProperty({
- // | node:"mine",
- // | properties:{
- // | height:function(node){
- // | // shrink this node by 50%
- // | return dojo.position(node).h / 2
- // | },
- // | width:{
- // | start:function(node){ return 100; },
- // | end:function(node){ return 200; }
- // | }
- // | }
- // | }).play();
- //
-
- var n = args.node = d.byId(args.node);
- if(!args.easing){ args.easing = d._defaultEasing; }
-
- var anim = new d.Animation(args);
- d.connect(anim, "beforeBegin", anim, function(){
- var pm = {};
- for(var p in this.properties){
- // Make shallow copy of properties into pm because we overwrite
- // some values below. In particular if start/end are functions
- // we don't want to overwrite them or the functions won't be
- // called if the animation is reused.
- if(p == "width" || p == "height"){
- this.node.display = "block";
- }
- var prop = this.properties[p];
- if(d.isFunction(prop)){
- prop = prop(n);
- }
- prop = pm[p] = _mixin({}, (d.isObject(prop) ? prop: { end: prop }));
-
- if(d.isFunction(prop.start)){
- prop.start = prop.start(n);
- }
- if(d.isFunction(prop.end)){
- prop.end = prop.end(n);
- }
- var isColor = (p.toLowerCase().indexOf("color") >= 0);
- function getStyle(node, p){
- // dojo.style(node, "height") can return "auto" or "" on IE; this is more reliable:
- var v = { height: node.offsetHeight, width: node.offsetWidth }[p];
- if(v !== undefined){ return v; }
- v = d.style(node, p);
- return (p == "opacity") ? +v : (isColor ? v : parseFloat(v));
- }
- if(!("end" in prop)){
- prop.end = getStyle(n, p);
- }else if(!("start" in prop)){
- prop.start = getStyle(n, p);
- }
-
- if(isColor){
- prop.start = new d.Color(prop.start);
- prop.end = new d.Color(prop.end);
- }else{
- prop.start = (p == "opacity") ? +prop.start : parseFloat(prop.start);
- }
- }
- this.curve = new PropLine(pm);
- });
- d.connect(anim, "onAnimate", d.hitch(d, "style", anim.node));
- return anim; // dojo.Animation
- };
-
- dojo.anim = function( /*DOMNode|String*/ node,
- /*Object*/ properties,
- /*Integer?*/ duration,
- /*Function?*/ easing,
- /*Function?*/ onEnd,
- /*Integer?*/ delay){
- // summary:
- // A simpler interface to `dojo.animateProperty()`, also returns
- // an instance of `dojo.Animation` but begins the animation
- // immediately, unlike nearly every other Dojo animation API.
- // description:
- // `dojo.anim` is a simpler (but somewhat less powerful) version
- // of `dojo.animateProperty`. It uses defaults for many basic properties
- // and allows for positional parameters to be used in place of the
- // packed "property bag" which is used for other Dojo animation
- // methods.
- //
- // The `dojo.Animation` object returned from `dojo.anim` will be
- // already playing when it is returned from this function, so
- // calling play() on it again is (usually) a no-op.
- // node:
- // a DOM node or the id of a node to animate CSS properties on
- // duration:
- // The number of milliseconds over which the animation
- // should run. Defaults to the global animation default duration
- // (350ms).
- // easing:
- // An easing function over which to calculate acceleration
- // and deceleration of the animation through its duration.
- // A default easing algorithm is provided, but you may
- // plug in any you wish. A large selection of easing algorithms
- // are available in `dojo.fx.easing`.
- // onEnd:
- // A function to be called when the animation finishes
- // running.
- // delay:
- // The number of milliseconds to delay beginning the
- // animation by. The default is 0.
- // example:
- // Fade out a node
- // | dojo.anim("id", { opacity: 0 });
- // example:
- // Fade out a node over a full second
- // | dojo.anim("id", { opacity: 0 }, 1000);
- return d.animateProperty({ // dojo.Animation
- node: node,
- duration: duration || d.Animation.prototype.duration,
- properties: properties,
- easing: easing,
- onEnd: onEnd
- }).play(delay || 0);
- };
-})();
-
-}
+//>>built
+define("dojo/_base/fx",["./kernel","./lang","../Evented","./Color","./connect","./sniff","../dom","../dom-style"],function(_1,_2,_3,_4,_5,_6,_7,_8){var _9=_2.mixin;_1._Line=function(_a,_b){this.start=_a;this.end=_b;};_1._Line.prototype.getValue=function(n){return ((this.end-this.start)*n)+this.start;};_1.Animation=function(_c){_9(this,_c);if(_2.isArray(this.curve)){this.curve=new _1._Line(this.curve[0],this.curve[1]);}};_1.Animation.prototype=new _3();_1._Animation=_1.Animation;_2.extend(_1.Animation,{duration:350,repeat:0,rate:20,_percent:0,_startRepeatCount:0,_getStep:function(){var _d=this._percent,_e=this.easing;return _e?_e(_d):_d;},_fire:function(_f,_10){var a=_10||[];if(this[_f]){if(_1.config.debugAtAllCosts){this[_f].apply(this,a);}else{try{this[_f].apply(this,a);}catch(e){console.error("exception in animation handler for:",_f);console.error(e);}}}return this;},play:function(_11,_12){var _13=this;if(_13._delayTimer){_13._clearTimer();}if(_12){_13._stopTimer();_13._active=_13._paused=false;_13._percent=0;}else{if(_13._active&&!_13._paused){return _13;}}_13._fire("beforeBegin",[_13.node]);var de=_11||_13.delay,_14=_2.hitch(_13,"_play",_12);if(de>0){_13._delayTimer=setTimeout(_14,de);return _13;}_14();return _13;},_play:function(_15){var _16=this;if(_16._delayTimer){_16._clearTimer();}_16._startTime=new Date().valueOf();if(_16._paused){_16._startTime-=_16.duration*_16._percent;}_16._active=true;_16._paused=false;var _17=_16.curve.getValue(_16._getStep());if(!_16._percent){if(!_16._startRepeatCount){_16._startRepeatCount=_16.repeat;}_16._fire("onBegin",[_17]);}_16._fire("onPlay",[_17]);_16._cycle();return _16;},pause:function(){var _18=this;if(_18._delayTimer){_18._clearTimer();}_18._stopTimer();if(!_18._active){return _18;}_18._paused=true;_18._fire("onPause",[_18.curve.getValue(_18._getStep())]);return _18;},gotoPercent:function(_19,_1a){var _1b=this;_1b._stopTimer();_1b._active=_1b._paused=true;_1b._percent=_19;if(_1a){_1b.play();}return _1b;},stop:function(_1c){var _1d=this;if(_1d._delayTimer){_1d._clearTimer();}if(!_1d._timer){return _1d;}_1d._stopTimer();if(_1c){_1d._percent=1;}_1d._fire("onStop",[_1d.curve.getValue(_1d._getStep())]);_1d._active=_1d._paused=false;return _1d;},status:function(){if(this._active){return this._paused?"paused":"playing";}return "stopped";},_cycle:function(){var _1e=this;if(_1e._active){var _1f=new Date().valueOf();var _20=(_1f-_1e._startTime)/(_1e.duration);if(_20>=1){_20=1;}_1e._percent=_20;if(_1e.easing){_20=_1e.easing(_20);}_1e._fire("onAnimate",[_1e.curve.getValue(_20)]);if(_1e._percent<1){_1e._startTimer();}else{_1e._active=false;if(_1e.repeat>0){_1e.repeat--;_1e.play(null,true);}else{if(_1e.repeat==-1){_1e.play(null,true);}else{if(_1e._startRepeatCount){_1e.repeat=_1e._startRepeatCount;_1e._startRepeatCount=0;}}}_1e._percent=0;_1e._fire("onEnd",[_1e.node]);!_1e.repeat&&_1e._stopTimer();}}return _1e;},_clearTimer:function(){clearTimeout(this._delayTimer);delete this._delayTimer;}});var ctr=0,_21=null,_22={run:function(){}};_2.extend(_1.Animation,{_startTimer:function(){if(!this._timer){this._timer=_5.connect(_22,"run",this,"_cycle");ctr++;}if(!_21){_21=setInterval(_2.hitch(_22,"run"),this.rate);}},_stopTimer:function(){if(this._timer){_5.disconnect(this._timer);this._timer=null;ctr--;}if(ctr<=0){clearInterval(_21);_21=null;ctr=0;}}});var _23=_6("ie")?function(_24){var ns=_24.style;if(!ns.width.length&&_8.get(_24,"width")=="auto"){ns.width="auto";}}:function(){};_1._fade=function(_25){_25.node=_7.byId(_25.node);var _26=_9({properties:{}},_25),_27=(_26.properties.opacity={});_27.start=!("start" in _26)?function(){return +_8.get(_26.node,"opacity")||0;}:_26.start;_27.end=_26.end;var _28=_1.animateProperty(_26);_5.connect(_28,"beforeBegin",_2.partial(_23,_26.node));return _28;};_1.fadeIn=function(_29){return _1._fade(_9({end:1},_29));};_1.fadeOut=function(_2a){return _1._fade(_9({end:0},_2a));};_1._defaultEasing=function(n){return 0.5+((Math.sin((n+1.5)*Math.PI))/2);};var _2b=function(_2c){this._properties=_2c;for(var p in _2c){var _2d=_2c[p];if(_2d.start instanceof _4){_2d.tempColor=new _4();}}};_2b.prototype.getValue=function(r){var ret={};for(var p in this._properties){var _2e=this._properties[p],_2f=_2e.start;if(_2f instanceof _4){ret[p]=_4.blendColors(_2f,_2e.end,r,_2e.tempColor).toCss();}else{if(!_2.isArray(_2f)){ret[p]=((_2e.end-_2f)*r)+_2f+(p!="opacity"?_2e.units||"px":0);}}}return ret;};_1.animateProperty=function(_30){var n=_30.node=_7.byId(_30.node);if(!_30.easing){_30.easing=_1._defaultEasing;}var _31=new _1.Animation(_30);_5.connect(_31,"beforeBegin",_31,function(){var pm={};for(var p in this.properties){if(p=="width"||p=="height"){this.node.display="block";}var _32=this.properties[p];if(_2.isFunction(_32)){_32=_32(n);}_32=pm[p]=_9({},(_2.isObject(_32)?_32:{end:_32}));if(_2.isFunction(_32.start)){_32.start=_32.start(n);}if(_2.isFunction(_32.end)){_32.end=_32.end(n);}var _33=(p.toLowerCase().indexOf("color")>=0);function _34(_35,p){var v={height:_35.offsetHeight,width:_35.offsetWidth}[p];if(v!==undefined){return v;}v=_8.get(_35,p);return (p=="opacity")?+v:(_33?v:parseFloat(v));};if(!("end" in _32)){_32.end=_34(n,p);}else{if(!("start" in _32)){_32.start=_34(n,p);}}if(_33){_32.start=new _4(_32.start);_32.end=new _4(_32.end);}else{_32.start=(p=="opacity")?+_32.start:parseFloat(_32.start);}}this.curve=new _2b(pm);});_5.connect(_31,"onAnimate",_2.hitch(_8,"set",_31.node));return _31;};_1.anim=function(_36,_37,_38,_39,_3a,_3b){return _1.animateProperty({node:_36,duration:_38||_1.Animation.prototype.duration,properties:_37,easing:_39,onEnd:_3a}).play(_3b||0);};return {_Line:_1._Line,Animation:_1.Animation,_fade:_1._fade,fadeIn:_1.fadeIn,fadeOut:_1.fadeOut,_defaultEasing:_1._defaultEasing,animateProperty:_1.animateProperty,anim:_1.anim};}); \ No newline at end of file
diff --git a/lib/dojo/_base/fx.js.uncompressed.js b/lib/dojo/_base/fx.js.uncompressed.js
new file mode 100644
index 000000000..cf52b0de1
--- /dev/null
+++ b/lib/dojo/_base/fx.js.uncompressed.js
@@ -0,0 +1,666 @@
+define("dojo/_base/fx", ["./kernel", "./lang", "../Evented", "./Color", "./connect", "./sniff", "../dom", "../dom-style"], function(dojo, lang, Evented, Color, connect, has, dom, style){
+ // module:
+ // dojo/_base/fx
+ // summary:
+ // This module defines the base dojo.fx implementation.
+ // notes:
+ // Animation loosely package based on Dan Pupius' work, contributed under CLA; see
+ // http://pupius.co.uk/js/Toolkit.Drawing.js
+
+ var _mixin = lang.mixin;
+
+ dojo._Line = function(/*int*/ start, /*int*/ end){
+ // summary:
+ // dojo._Line is the object used to generate values from a start value
+ // to an end value
+ // start: int
+ // Beginning value for range
+ // end: int
+ // Ending value for range
+ this.start = start;
+ this.end = end;
+ };
+
+ dojo._Line.prototype.getValue = function(/*float*/ n){
+ // summary: Returns the point on the line
+ // n: a floating point number greater than 0 and less than 1
+ return ((this.end - this.start) * n) + this.start; // Decimal
+ };
+
+ dojo.Animation = function(args){
+ // summary:
+ // A generic animation class that fires callbacks into its handlers
+ // object at various states.
+ // description:
+ // A generic animation class that fires callbacks into its handlers
+ // object at various states. Nearly all dojo animation functions
+ // return an instance of this method, usually without calling the
+ // .play() method beforehand. Therefore, you will likely need to
+ // call .play() on instances of `dojo.Animation` when one is
+ // returned.
+ // args: Object
+ // The 'magic argument', mixing all the properties into this
+ // animation instance.
+
+ _mixin(this, args);
+ if(lang.isArray(this.curve)){
+ this.curve = new dojo._Line(this.curve[0], this.curve[1]);
+ }
+
+ };
+ dojo.Animation.prototype = new Evented();
+ // Alias to drop come 2.0:
+ dojo._Animation = dojo.Animation;
+
+ lang.extend(dojo.Animation, {
+ // duration: Integer
+ // The time in milliseonds the animation will take to run
+ duration: 350,
+
+ /*=====
+ // curve: dojo._Line|Array
+ // A two element array of start and end values, or a `dojo._Line` instance to be
+ // used in the Animation.
+ curve: null,
+
+ // easing: Function?
+ // A Function to adjust the acceleration (or deceleration) of the progress
+ // across a dojo._Line
+ easing: null,
+ =====*/
+
+ // repeat: Integer?
+ // The number of times to loop the animation
+ repeat: 0,
+
+ // rate: Integer?
+ // the time in milliseconds to wait before advancing to next frame
+ // (used as a fps timer: 1000/rate = fps)
+ rate: 20 /* 50 fps */,
+
+ /*=====
+ // delay: Integer?
+ // The time in milliseconds to wait before starting animation after it
+ // has been .play()'ed
+ delay: null,
+
+ // beforeBegin: Event?
+ // Synthetic event fired before a dojo.Animation begins playing (synchronous)
+ beforeBegin: null,
+
+ // onBegin: Event?
+ // Synthetic event fired as a dojo.Animation begins playing (useful?)
+ onBegin: null,
+
+ // onAnimate: Event?
+ // Synthetic event fired at each interval of a `dojo.Animation`
+ onAnimate: null,
+
+ // onEnd: Event?
+ // Synthetic event fired after the final frame of a `dojo.Animation`
+ onEnd: null,
+
+ // onPlay: Event?
+ // Synthetic event fired any time a `dojo.Animation` is play()'ed
+ onPlay: null,
+
+ // onPause: Event?
+ // Synthetic event fired when a `dojo.Animation` is paused
+ onPause: null,
+
+ // onStop: Event
+ // Synthetic event fires when a `dojo.Animation` is stopped
+ onStop: null,
+
+ =====*/
+
+ _percent: 0,
+ _startRepeatCount: 0,
+
+ _getStep: function(){
+ var _p = this._percent,
+ _e = this.easing
+ ;
+ return _e ? _e(_p) : _p;
+ },
+ _fire: function(/*Event*/ evt, /*Array?*/ args){
+ // summary:
+ // Convenience function. Fire event "evt" and pass it the
+ // arguments specified in "args".
+ // description:
+ // Convenience function. Fire event "evt" and pass it the
+ // arguments specified in "args".
+ // Fires the callback in the scope of the `dojo.Animation`
+ // instance.
+ // evt:
+ // The event to fire.
+ // args:
+ // The arguments to pass to the event.
+ var a = args||[];
+ if(this[evt]){
+ if(dojo.config.debugAtAllCosts){
+ this[evt].apply(this, a);
+ }else{
+ try{
+ this[evt].apply(this, a);
+ }catch(e){
+ // squelch and log because we shouldn't allow exceptions in
+ // synthetic event handlers to cause the internal timer to run
+ // amuck, potentially pegging the CPU. I'm not a fan of this
+ // squelch, but hopefully logging will make it clear what's
+ // going on
+ console.error("exception in animation handler for:", evt);
+ console.error(e);
+ }
+ }
+ }
+ return this; // dojo.Animation
+ },
+
+ play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
+ // summary:
+ // Start the animation.
+ // delay:
+ // How many milliseconds to delay before starting.
+ // gotoStart:
+ // If true, starts the animation from the beginning; otherwise,
+ // starts it from its current position.
+ // returns: dojo.Animation
+ // The instance to allow chaining.
+
+ var _t = this;
+ if(_t._delayTimer){ _t._clearTimer(); }
+ if(gotoStart){
+ _t._stopTimer();
+ _t._active = _t._paused = false;
+ _t._percent = 0;
+ }else if(_t._active && !_t._paused){
+ return _t;
+ }
+
+ _t._fire("beforeBegin", [_t.node]);
+
+ var de = delay || _t.delay,
+ _p = lang.hitch(_t, "_play", gotoStart);
+
+ if(de > 0){
+ _t._delayTimer = setTimeout(_p, de);
+ return _t;
+ }
+ _p();
+ return _t; // dojo.Animation
+ },
+
+ _play: function(gotoStart){
+ var _t = this;
+ if(_t._delayTimer){ _t._clearTimer(); }
+ _t._startTime = new Date().valueOf();
+ if(_t._paused){
+ _t._startTime -= _t.duration * _t._percent;
+ }
+
+ _t._active = true;
+ _t._paused = false;
+ var value = _t.curve.getValue(_t._getStep());
+ if(!_t._percent){
+ if(!_t._startRepeatCount){
+ _t._startRepeatCount = _t.repeat;
+ }
+ _t._fire("onBegin", [value]);
+ }
+
+ _t._fire("onPlay", [value]);
+
+ _t._cycle();
+ return _t; // dojo.Animation
+ },
+
+ pause: function(){
+ // summary: Pauses a running animation.
+ var _t = this;
+ if(_t._delayTimer){ _t._clearTimer(); }
+ _t._stopTimer();
+ if(!_t._active){ return _t; /*dojo.Animation*/ }
+ _t._paused = true;
+ _t._fire("onPause", [_t.curve.getValue(_t._getStep())]);
+ return _t; // dojo.Animation
+ },
+
+ gotoPercent: function(/*Decimal*/ percent, /*Boolean?*/ andPlay){
+ // summary:
+ // Sets the progress of the animation.
+ // percent:
+ // A percentage in decimal notation (between and including 0.0 and 1.0).
+ // andPlay:
+ // If true, play the animation after setting the progress.
+ var _t = this;
+ _t._stopTimer();
+ _t._active = _t._paused = true;
+ _t._percent = percent;
+ if(andPlay){ _t.play(); }
+ return _t; // dojo.Animation
+ },
+
+ stop: function(/*boolean?*/ gotoEnd){
+ // summary: Stops a running animation.
+ // gotoEnd: If true, the animation will end.
+ var _t = this;
+ if(_t._delayTimer){ _t._clearTimer(); }
+ if(!_t._timer){ return _t; /* dojo.Animation */ }
+ _t._stopTimer();
+ if(gotoEnd){
+ _t._percent = 1;
+ }
+ _t._fire("onStop", [_t.curve.getValue(_t._getStep())]);
+ _t._active = _t._paused = false;
+ return _t; // dojo.Animation
+ },
+
+ status: function(){
+ // summary:
+ // Returns a string token representation of the status of
+ // the animation, one of: "paused", "playing", "stopped"
+ if(this._active){
+ return this._paused ? "paused" : "playing"; // String
+ }
+ return "stopped"; // String
+ },
+
+ _cycle: function(){
+ var _t = this;
+ if(_t._active){
+ var curr = new Date().valueOf();
+ var step = (curr - _t._startTime) / (_t.duration);
+
+ if(step >= 1){
+ step = 1;
+ }
+ _t._percent = step;
+
+ // Perform easing
+ if(_t.easing){
+ step = _t.easing(step);
+ }
+
+ _t._fire("onAnimate", [_t.curve.getValue(step)]);
+
+ if(_t._percent < 1){
+ _t._startTimer();
+ }else{
+ _t._active = false;
+
+ if(_t.repeat > 0){
+ _t.repeat--;
+ _t.play(null, true);
+ }else if(_t.repeat == -1){
+ _t.play(null, true);
+ }else{
+ if(_t._startRepeatCount){
+ _t.repeat = _t._startRepeatCount;
+ _t._startRepeatCount = 0;
+ }
+ }
+ _t._percent = 0;
+ _t._fire("onEnd", [_t.node]);
+ !_t.repeat && _t._stopTimer();
+ }
+ }
+ return _t; // dojo.Animation
+ },
+
+ _clearTimer: function(){
+ // summary: Clear the play delay timer
+ clearTimeout(this._delayTimer);
+ delete this._delayTimer;
+ }
+
+ });
+
+ // the local timer, stubbed into all Animation instances
+ var ctr = 0,
+ timer = null,
+ runner = {
+ run: function(){}
+ };
+
+ lang.extend(dojo.Animation, {
+
+ _startTimer: function(){
+ if(!this._timer){
+ this._timer = connect.connect(runner, "run", this, "_cycle");
+ ctr++;
+ }
+ if(!timer){
+ timer = setInterval(lang.hitch(runner, "run"), this.rate);
+ }
+ },
+
+ _stopTimer: function(){
+ if(this._timer){
+ connect.disconnect(this._timer);
+ this._timer = null;
+ ctr--;
+ }
+ if(ctr <= 0){
+ clearInterval(timer);
+ timer = null;
+ ctr = 0;
+ }
+ }
+
+ });
+
+ var _makeFadeable =
+ has("ie") ? function(node){
+ // only set the zoom if the "tickle" value would be the same as the
+ // default
+ var ns = node.style;
+ // don't set the width to auto if it didn't already cascade that way.
+ // We don't want to f anyones designs
+ if(!ns.width.length && style.get(node, "width") == "auto"){
+ ns.width = "auto";
+ }
+ } :
+ function(){};
+
+ dojo._fade = function(/*Object*/ args){
+ // summary:
+ // Returns an animation that will fade the node defined by
+ // args.node from the start to end values passed (args.start
+ // args.end) (end is mandatory, start is optional)
+
+ args.node = dom.byId(args.node);
+ var fArgs = _mixin({ properties: {} }, args),
+ props = (fArgs.properties.opacity = {});
+
+ props.start = !("start" in fArgs) ?
+ function(){
+ return +style.get(fArgs.node, "opacity")||0;
+ } : fArgs.start;
+ props.end = fArgs.end;
+
+ var anim = dojo.animateProperty(fArgs);
+ connect.connect(anim, "beforeBegin", lang.partial(_makeFadeable, fArgs.node));
+
+ return anim; // dojo.Animation
+ };
+
+ /*=====
+ dojo.__FadeArgs = function(node, duration, easing){
+ // node: DOMNode|String
+ // The node referenced in the animation
+ // duration: Integer?
+ // Duration of the animation in milliseconds.
+ // easing: Function?
+ // An easing function.
+ this.node = node;
+ this.duration = duration;
+ this.easing = easing;
+ }
+ =====*/
+
+ dojo.fadeIn = function(/*dojo.__FadeArgs*/ args){
+ // summary:
+ // Returns an animation that will fade node defined in 'args' from
+ // its current opacity to fully opaque.
+ return dojo._fade(_mixin({ end: 1 }, args)); // dojo.Animation
+ };
+
+ dojo.fadeOut = function(/*dojo.__FadeArgs*/ args){
+ // summary:
+ // Returns an animation that will fade node defined in 'args'
+ // from its current opacity to fully transparent.
+ return dojo._fade(_mixin({ end: 0 }, args)); // dojo.Animation
+ };
+
+ dojo._defaultEasing = function(/*Decimal?*/ n){
+ // summary: The default easing function for dojo.Animation(s)
+ return 0.5 + ((Math.sin((n + 1.5) * Math.PI)) / 2); // Decimal
+ };
+
+ var PropLine = function(properties){
+ // PropLine is an internal class which is used to model the values of
+ // an a group of CSS properties across an animation lifecycle. In
+ // particular, the "getValue" function handles getting interpolated
+ // values between start and end for a particular CSS value.
+ this._properties = properties;
+ for(var p in properties){
+ var prop = properties[p];
+ if(prop.start instanceof Color){
+ // create a reusable temp color object to keep intermediate results
+ prop.tempColor = new Color();
+ }
+ }
+ };
+
+ PropLine.prototype.getValue = function(r){
+ var ret = {};
+ for(var p in this._properties){
+ var prop = this._properties[p],
+ start = prop.start;
+ if(start instanceof Color){
+ ret[p] = Color.blendColors(start, prop.end, r, prop.tempColor).toCss();
+ }else if(!lang.isArray(start)){
+ ret[p] = ((prop.end - start) * r) + start + (p != "opacity" ? prop.units || "px" : 0);
+ }
+ }
+ return ret;
+ };
+
+ /*=====
+ dojo.declare("dojo.__AnimArgs", [dojo.__FadeArgs], {
+ // Properties: Object?
+ // A hash map of style properties to Objects describing the transition,
+ // such as the properties of dojo._Line with an additional 'units' property
+ properties: {}
+
+ //TODOC: add event callbacks
+ });
+ =====*/
+
+ dojo.animateProperty = function(/*dojo.__AnimArgs*/ args){
+ // summary:
+ // Returns an animation that will transition the properties of
+ // node defined in `args` depending how they are defined in
+ // `args.properties`
+ //
+ // description:
+ // `dojo.animateProperty` is the foundation of most `dojo.fx`
+ // animations. It takes an object of "properties" corresponding to
+ // style properties, and animates them in parallel over a set
+ // duration.
+ //
+ // example:
+ // A simple animation that changes the width of the specified node.
+ // | dojo.animateProperty({
+ // | node: "nodeId",
+ // | properties: { width: 400 },
+ // | }).play();
+ // Dojo figures out the start value for the width and converts the
+ // integer specified for the width to the more expressive but
+ // verbose form `{ width: { end: '400', units: 'px' } }` which you
+ // can also specify directly. Defaults to 'px' if ommitted.
+ //
+ // example:
+ // Animate width, height, and padding over 2 seconds... the
+ // pedantic way:
+ // | dojo.animateProperty({ node: node, duration:2000,
+ // | properties: {
+ // | width: { start: '200', end: '400', units:"px" },
+ // | height: { start:'200', end: '400', units:"px" },
+ // | paddingTop: { start:'5', end:'50', units:"px" }
+ // | }
+ // | }).play();
+ // Note 'paddingTop' is used over 'padding-top'. Multi-name CSS properties
+ // are written using "mixed case", as the hyphen is illegal as an object key.
+ //
+ // example:
+ // Plug in a different easing function and register a callback for
+ // when the animation ends. Easing functions accept values between
+ // zero and one and return a value on that basis. In this case, an
+ // exponential-in curve.
+ // | dojo.animateProperty({
+ // | node: "nodeId",
+ // | // dojo figures out the start value
+ // | properties: { width: { end: 400 } },
+ // | easing: function(n){
+ // | return (n==0) ? 0 : Math.pow(2, 10 * (n - 1));
+ // | },
+ // | onEnd: function(node){
+ // | // called when the animation finishes. The animation
+ // | // target is passed to this function
+ // | }
+ // | }).play(500); // delay playing half a second
+ //
+ // example:
+ // Like all `dojo.Animation`s, animateProperty returns a handle to the
+ // Animation instance, which fires the events common to Dojo FX. Use `dojo.connect`
+ // to access these events outside of the Animation definiton:
+ // | var anim = dojo.animateProperty({
+ // | node:"someId",
+ // | properties:{
+ // | width:400, height:500
+ // | }
+ // | });
+ // | dojo.connect(anim,"onEnd", function(){
+ // | console.log("animation ended");
+ // | });
+ // | // play the animation now:
+ // | anim.play();
+ //
+ // example:
+ // Each property can be a function whose return value is substituted along.
+ // Additionally, each measurement (eg: start, end) can be a function. The node
+ // reference is passed direcly to callbacks.
+ // | dojo.animateProperty({
+ // | node:"mine",
+ // | properties:{
+ // | height:function(node){
+ // | // shrink this node by 50%
+ // | return dojo.position(node).h / 2
+ // | },
+ // | width:{
+ // | start:function(node){ return 100; },
+ // | end:function(node){ return 200; }
+ // | }
+ // | }
+ // | }).play();
+ //
+
+ var n = args.node = dom.byId(args.node);
+ if(!args.easing){ args.easing = dojo._defaultEasing; }
+
+ var anim = new dojo.Animation(args);
+ connect.connect(anim, "beforeBegin", anim, function(){
+ var pm = {};
+ for(var p in this.properties){
+ // Make shallow copy of properties into pm because we overwrite
+ // some values below. In particular if start/end are functions
+ // we don't want to overwrite them or the functions won't be
+ // called if the animation is reused.
+ if(p == "width" || p == "height"){
+ this.node.display = "block";
+ }
+ var prop = this.properties[p];
+ if(lang.isFunction(prop)){
+ prop = prop(n);
+ }
+ prop = pm[p] = _mixin({}, (lang.isObject(prop) ? prop: { end: prop }));
+
+ if(lang.isFunction(prop.start)){
+ prop.start = prop.start(n);
+ }
+ if(lang.isFunction(prop.end)){
+ prop.end = prop.end(n);
+ }
+ var isColor = (p.toLowerCase().indexOf("color") >= 0);
+ function getStyle(node, p){
+ // dojo.style(node, "height") can return "auto" or "" on IE; this is more reliable:
+ var v = { height: node.offsetHeight, width: node.offsetWidth }[p];
+ if(v !== undefined){ return v; }
+ v = style.get(node, p);
+ return (p == "opacity") ? +v : (isColor ? v : parseFloat(v));
+ }
+ if(!("end" in prop)){
+ prop.end = getStyle(n, p);
+ }else if(!("start" in prop)){
+ prop.start = getStyle(n, p);
+ }
+
+ if(isColor){
+ prop.start = new Color(prop.start);
+ prop.end = new Color(prop.end);
+ }else{
+ prop.start = (p == "opacity") ? +prop.start : parseFloat(prop.start);
+ }
+ }
+ this.curve = new PropLine(pm);
+ });
+ connect.connect(anim, "onAnimate", lang.hitch(style, "set", anim.node));
+ return anim; // dojo.Animation
+ };
+
+ dojo.anim = function( /*DOMNode|String*/ node,
+ /*Object*/ properties,
+ /*Integer?*/ duration,
+ /*Function?*/ easing,
+ /*Function?*/ onEnd,
+ /*Integer?*/ delay){
+ // summary:
+ // A simpler interface to `dojo.animateProperty()`, also returns
+ // an instance of `dojo.Animation` but begins the animation
+ // immediately, unlike nearly every other Dojo animation API.
+ // description:
+ // `dojo.anim` is a simpler (but somewhat less powerful) version
+ // of `dojo.animateProperty`. It uses defaults for many basic properties
+ // and allows for positional parameters to be used in place of the
+ // packed "property bag" which is used for other Dojo animation
+ // methods.
+ //
+ // The `dojo.Animation` object returned from `dojo.anim` will be
+ // already playing when it is returned from this function, so
+ // calling play() on it again is (usually) a no-op.
+ // node:
+ // a DOM node or the id of a node to animate CSS properties on
+ // duration:
+ // The number of milliseconds over which the animation
+ // should run. Defaults to the global animation default duration
+ // (350ms).
+ // easing:
+ // An easing function over which to calculate acceleration
+ // and deceleration of the animation through its duration.
+ // A default easing algorithm is provided, but you may
+ // plug in any you wish. A large selection of easing algorithms
+ // are available in `dojo.fx.easing`.
+ // onEnd:
+ // A function to be called when the animation finishes
+ // running.
+ // delay:
+ // The number of milliseconds to delay beginning the
+ // animation by. The default is 0.
+ // example:
+ // Fade out a node
+ // | dojo.anim("id", { opacity: 0 });
+ // example:
+ // Fade out a node over a full second
+ // | dojo.anim("id", { opacity: 0 }, 1000);
+ return dojo.animateProperty({ // dojo.Animation
+ node: node,
+ duration: duration || dojo.Animation.prototype.duration,
+ properties: properties,
+ easing: easing,
+ onEnd: onEnd
+ }).play(delay || 0);
+ };
+
+ return {
+ _Line: dojo._Line,
+ Animation: dojo.Animation,
+ _fade: dojo._fade,
+ fadeIn: dojo.fadeIn,
+ fadeOut: dojo.fadeOut,
+ _defaultEasing: dojo._defaultEasing,
+ animateProperty: dojo.animateProperty,
+ anim: dojo.anim
+ };
+});
diff --git a/lib/dojo/_base/html.js b/lib/dojo/_base/html.js
index 8661b2b12..89f6a5192 100644
--- a/lib/dojo/_base/html.js
+++ b/lib/dojo/_base/html.js
@@ -4,1833 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.html"] = true;
-dojo.provide("dojo._base.html");
-dojo.require("dojo._base.lang");
-
-
-// FIXME: need to add unit tests for all the semi-public methods
-
-try{
- document.execCommand("BackgroundImageCache", false, true);
-}catch(e){
- // sane browsers don't have cache "issues"
-}
-
-// =============================
-// DOM Functions
-// =============================
-
-/*=====
-dojo.byId = function(id, doc){
- // summary:
- // Returns DOM node with matching `id` attribute or `null`
- // if not found. If `id` is a DomNode, this function is a no-op.
- //
- // id: String|DOMNode
- // A string to match an HTML id attribute or a reference to a DOM Node
- //
- // doc: Document?
- // Document to work in. Defaults to the current value of
- // dojo.doc. Can be used to retrieve
- // node references from other documents.
- //
- // example:
- // Look up a node by ID:
- // | var n = dojo.byId("foo");
- //
- // example:
- // Check if a node exists, and use it.
- // | var n = dojo.byId("bar");
- // | if(n){ doStuff() ... }
- //
- // example:
- // Allow string or DomNode references to be passed to a custom function:
- // | var foo = function(nodeOrId){
- // | nodeOrId = dojo.byId(nodeOrId);
- // | // ... more stuff
- // | }
-=====*/
-
-if(dojo.isIE){
- dojo.byId = function(id, doc){
- if(typeof id != "string"){
- return id;
- }
- var _d = doc || dojo.doc, te = _d.getElementById(id);
- // attributes.id.value is better than just id in case the
- // user has a name=id inside a form
- if(te && (te.attributes.id.value == id || te.id == id)){
- return te;
- }else{
- var eles = _d.all[id];
- if(!eles || eles.nodeName){
- eles = [eles];
- }
- // if more than 1, choose first with the correct id
- var i=0;
- while((te=eles[i++])){
- if((te.attributes && te.attributes.id && te.attributes.id.value == id)
- || te.id == id){
- return te;
- }
- }
- }
- };
-}else{
- dojo.byId = function(id, doc){
- // inline'd type check.
- // be sure to return null per documentation, to match IE branch.
- return ((typeof id == "string") ? (doc || dojo.doc).getElementById(id) : id) || null; // DomNode
- };
-}
-/*=====
-};
-=====*/
-
-(function(){
- var d = dojo;
- var byId = d.byId;
-
- var _destroyContainer = null,
- _destroyDoc;
- d.addOnWindowUnload(function(){
- _destroyContainer = null; //prevent IE leak
- });
-
-/*=====
- dojo._destroyElement = function(node){
- // summary:
- // Existing alias for `dojo.destroy`. Deprecated, will be removed
- // in 2.0
- }
-=====*/
- dojo._destroyElement = dojo.destroy = function(/*String|DomNode*/node){
- // summary:
- // Removes a node from its parent, clobbering it and all of its
- // children.
- //
- // description:
- // Removes a node from its parent, clobbering it and all of its
- // children. Function only works with DomNodes, and returns nothing.
- //
- // node:
- // A String ID or DomNode reference of the element to be destroyed
- //
- // example:
- // Destroy a node byId:
- // | dojo.destroy("someId");
- //
- // example:
- // Destroy all nodes in a list by reference:
- // | dojo.query(".someNode").forEach(dojo.destroy);
-
- node = byId(node);
- try{
- var doc = node.ownerDocument;
- // cannot use _destroyContainer.ownerDocument since this can throw an exception on IE
- if(!_destroyContainer || _destroyDoc != doc){
- _destroyContainer = doc.createElement("div");
- _destroyDoc = doc;
- }
- _destroyContainer.appendChild(node.parentNode ? node.parentNode.removeChild(node) : node);
- // NOTE: see http://trac.dojotoolkit.org/ticket/2931. This may be a bug and not a feature
- _destroyContainer.innerHTML = "";
- }catch(e){
- /* squelch */
- }
- };
-
- dojo.isDescendant = function(/*DomNode|String*/node, /*DomNode|String*/ancestor){
- // summary:
- // Returns true if node is a descendant of ancestor
- // node: string id or node reference to test
- // ancestor: string id or node reference of potential parent to test against
- //
- // example:
- // Test is node id="bar" is a descendant of node id="foo"
- // | if(dojo.isDescendant("bar", "foo")){ ... }
- try{
- node = byId(node);
- ancestor = byId(ancestor);
- while(node){
- if(node == ancestor){
- return true; // Boolean
- }
- node = node.parentNode;
- }
- }catch(e){ /* squelch, return false */ }
- return false; // Boolean
- };
-
- dojo.setSelectable = function(/*DomNode|String*/node, /*Boolean*/selectable){
- // summary:
- // Enable or disable selection on a node
- // node:
- // id or reference to node
- // selectable:
- // state to put the node in. false indicates unselectable, true
- // allows selection.
- // example:
- // Make the node id="bar" unselectable
- // | dojo.setSelectable("bar");
- // example:
- // Make the node id="bar" selectable
- // | dojo.setSelectable("bar", true);
- node = byId(node);
- if(d.isMozilla){
- node.style.MozUserSelect = selectable ? "" : "none";
- }else if(d.isKhtml || d.isWebKit){
- node.style.KhtmlUserSelect = selectable ? "auto" : "none";
- }else if(d.isIE){
- var v = (node.unselectable = selectable ? "" : "on");
- d.query("*", node).forEach("item.unselectable = '"+v+"'");
- }
- //FIXME: else? Opera?
- };
-
- var _insertBefore = function(/*DomNode*/node, /*DomNode*/ref){
- var parent = ref.parentNode;
- if(parent){
- parent.insertBefore(node, ref);
- }
- };
-
- var _insertAfter = function(/*DomNode*/node, /*DomNode*/ref){
- // summary:
- // Try to insert node after ref
- var parent = ref.parentNode;
- if(parent){
- if(parent.lastChild == ref){
- parent.appendChild(node);
- }else{
- parent.insertBefore(node, ref.nextSibling);
- }
- }
- };
-
- dojo.place = function(node, refNode, position){
- // summary:
- // Attempt to insert node into the DOM, choosing from various positioning options.
- // Returns the first argument resolved to a DOM node.
- //
- // node: String|DomNode
- // id or node reference, or HTML fragment starting with "<" to place relative to refNode
- //
- // refNode: String|DomNode
- // id or node reference to use as basis for placement
- //
- // position: String|Number?
- // string noting the position of node relative to refNode or a
- // number indicating the location in the childNodes collection of refNode.
- // Accepted string values are:
- // | * before
- // | * after
- // | * replace
- // | * only
- // | * first
- // | * last
- // "first" and "last" indicate positions as children of refNode, "replace" replaces refNode,
- // "only" replaces all children. position defaults to "last" if not specified
- //
- // returns: DomNode
- // Returned values is the first argument resolved to a DOM node.
- //
- // .place() is also a method of `dojo.NodeList`, allowing `dojo.query` node lookups.
- //
- // example:
- // Place a node by string id as the last child of another node by string id:
- // | dojo.place("someNode", "anotherNode");
- //
- // example:
- // Place a node by string id before another node by string id
- // | dojo.place("someNode", "anotherNode", "before");
- //
- // example:
- // Create a Node, and place it in the body element (last child):
- // | dojo.place("<div></div>", dojo.body());
- //
- // example:
- // Put a new LI as the first child of a list by id:
- // | dojo.place("<li></li>", "someUl", "first");
-
- refNode = byId(refNode);
- if(typeof node == "string"){ // inline'd type check
- node = /^\s*</.test(node) ? d._toDom(node, refNode.ownerDocument) : byId(node);
- }
- if(typeof position == "number"){ // inline'd type check
- var cn = refNode.childNodes;
- if(!cn.length || cn.length <= position){
- refNode.appendChild(node);
- }else{
- _insertBefore(node, cn[position < 0 ? 0 : position]);
- }
- }else{
- switch(position){
- case "before":
- _insertBefore(node, refNode);
- break;
- case "after":
- _insertAfter(node, refNode);
- break;
- case "replace":
- refNode.parentNode.replaceChild(node, refNode);
- break;
- case "only":
- d.empty(refNode);
- refNode.appendChild(node);
- break;
- case "first":
- if(refNode.firstChild){
- _insertBefore(node, refNode.firstChild);
- break;
- }
- // else fallthrough...
- default: // aka: last
- refNode.appendChild(node);
- }
- }
- return node; // DomNode
- };
-
- // Box functions will assume this model.
- // On IE/Opera, BORDER_BOX will be set if the primary document is in quirks mode.
- // Can be set to change behavior of box setters.
-
- // can be either:
- // "border-box"
- // "content-box" (default)
- dojo.boxModel = "content-box";
-
- // We punt per-node box mode testing completely.
- // If anybody cares, we can provide an additional (optional) unit
- // that overrides existing code to include per-node box sensitivity.
-
- // Opera documentation claims that Opera 9 uses border-box in BackCompat mode.
- // but experiments (Opera 9.10.8679 on Windows Vista) indicate that it actually continues to use content-box.
- // IIRC, earlier versions of Opera did in fact use border-box.
- // Opera guys, this is really confusing. Opera being broken in quirks mode is not our fault.
-
- if(d.isIE /*|| dojo.isOpera*/){
- // client code may have to adjust if compatMode varies across iframes
- d.boxModel = document.compatMode == "BackCompat" ? "border-box" : "content-box";
- }
-
- // =============================
- // Style Functions
- // =============================
-
- // getComputedStyle drives most of the style code.
- // Wherever possible, reuse the returned object.
- //
- // API functions below that need to access computed styles accept an
- // optional computedStyle parameter.
- // If this parameter is omitted, the functions will call getComputedStyle themselves.
- // This way, calling code can access computedStyle once, and then pass the reference to
- // multiple API functions.
-
-/*=====
- dojo.getComputedStyle = function(node){
- // summary:
- // Returns a "computed style" object.
- //
- // description:
- // Gets a "computed style" object which can be used to gather
- // information about the current state of the rendered node.
- //
- // Note that this may behave differently on different browsers.
- // Values may have different formats and value encodings across
- // browsers.
- //
- // Note also that this method is expensive. Wherever possible,
- // reuse the returned object.
- //
- // Use the dojo.style() method for more consistent (pixelized)
- // return values.
- //
- // node: DOMNode
- // A reference to a DOM node. Does NOT support taking an
- // ID string for speed reasons.
- // example:
- // | dojo.getComputedStyle(dojo.byId('foo')).borderWidth;
- //
- // example:
- // Reusing the returned object, avoiding multiple lookups:
- // | var cs = dojo.getComputedStyle(dojo.byId("someNode"));
- // | var w = cs.width, h = cs.height;
- return; // CSS2Properties
- }
-=====*/
-
- // Although we normally eschew argument validation at this
- // level, here we test argument 'node' for (duck)type,
- // by testing nodeType, ecause 'document' is the 'parentNode' of 'body'
- // it is frequently sent to this function even
- // though it is not Element.
- var gcs;
- if(d.isWebKit){
- gcs = function(/*DomNode*/node){
- var s;
- if(node.nodeType == 1){
- var dv = node.ownerDocument.defaultView;
- s = dv.getComputedStyle(node, null);
- if(!s && node.style){
- node.style.display = "";
- s = dv.getComputedStyle(node, null);
- }
- }
- return s || {};
- };
- }else if(d.isIE){
- gcs = function(node){
- // IE (as of 7) doesn't expose Element like sane browsers
- return node.nodeType == 1 /* ELEMENT_NODE*/ ? node.currentStyle : {};
- };
- }else{
- gcs = function(node){
- return node.nodeType == 1 ?
- node.ownerDocument.defaultView.getComputedStyle(node, null) : {};
- };
- }
- dojo.getComputedStyle = gcs;
-
- if(!d.isIE){
- d._toPixelValue = function(element, value){
- // style values can be floats, client code may want
- // to round for integer pixels.
- return parseFloat(value) || 0;
- };
- }else{
- d._toPixelValue = function(element, avalue){
- if(!avalue){ return 0; }
- // on IE7, medium is usually 4 pixels
- if(avalue == "medium"){ return 4; }
- // style values can be floats, client code may
- // want to round this value for integer pixels.
- if(avalue.slice && avalue.slice(-2) == 'px'){ return parseFloat(avalue); }
- with(element){
- var sLeft = style.left;
- var rsLeft = runtimeStyle.left;
- runtimeStyle.left = currentStyle.left;
- try{
- // 'avalue' may be incompatible with style.left, which can cause IE to throw
- // this has been observed for border widths using "thin", "medium", "thick" constants
- // those particular constants could be trapped by a lookup
- // but perhaps there are more
- style.left = avalue;
- avalue = style.pixelLeft;
- }catch(e){
- avalue = 0;
- }
- style.left = sLeft;
- runtimeStyle.left = rsLeft;
- }
- return avalue;
- };
- }
- var px = d._toPixelValue;
-
- // FIXME: there opacity quirks on FF that we haven't ported over. Hrm.
- /*=====
- dojo._getOpacity = function(node){
- // summary:
- // Returns the current opacity of the passed node as a
- // floating-point value between 0 and 1.
- // node: DomNode
- // a reference to a DOM node. Does NOT support taking an
- // ID string for speed reasons.
- // returns: Number between 0 and 1
- return; // Number
- }
- =====*/
-
- var astr = "DXImageTransform.Microsoft.Alpha";
- var af = function(n, f){
- try{
- return n.filters.item(astr);
- }catch(e){
- return f ? {} : null;
- }
- };
-
- dojo._getOpacity =
- d.isIE < 9 ? function(node){
- try{
- return af(node).Opacity / 100; // Number
- }catch(e){
- return 1; // Number
- }
- } :
- function(node){
- return gcs(node).opacity;
- };
-
- /*=====
- dojo._setOpacity = function(node, opacity){
- // summary:
- // set the opacity of the passed node portably. Returns the
- // new opacity of the node.
- // node: DOMNode
- // a reference to a DOM node. Does NOT support taking an
- // ID string for performance reasons.
- // opacity: Number
- // A Number between 0 and 1. 0 specifies transparent.
- // returns: Number between 0 and 1
- return; // Number
- }
- =====*/
-
- dojo._setOpacity =
- d.isIE < 9 ? function(/*DomNode*/node, /*Number*/opacity){
- var ov = opacity * 100, opaque = opacity == 1;
- node.style.zoom = opaque ? "" : 1;
-
- if(!af(node)){
- if(opaque){
- return opacity;
- }
- node.style.filter += " progid:" + astr + "(Opacity=" + ov + ")";
- }else{
- af(node, 1).Opacity = ov;
- }
-
- // on IE7 Alpha(Filter opacity=100) makes text look fuzzy so disable it altogether (bug #2661),
- //but still update the opacity value so we can get a correct reading if it is read later.
- af(node, 1).Enabled = !opaque;
-
- if(node.nodeName.toLowerCase() == "tr"){
- d.query("> td", node).forEach(function(i){
- d._setOpacity(i, opacity);
- });
- }
- return opacity;
- } :
- function(node, opacity){
- return node.style.opacity = opacity;
- };
-
- var _pixelNamesCache = {
- left: true, top: true
- };
- var _pixelRegExp = /margin|padding|width|height|max|min|offset/; // |border
- var _toStyleValue = function(node, type, value){
- type = type.toLowerCase(); // FIXME: should we really be doing string case conversion here? Should we cache it? Need to profile!
- if(d.isIE){
- if(value == "auto"){
- if(type == "height"){ return node.offsetHeight; }
- if(type == "width"){ return node.offsetWidth; }
- }
- if(type == "fontweight"){
- switch(value){
- case 700: return "bold";
- case 400:
- default: return "normal";
- }
- }
- }
- if(!(type in _pixelNamesCache)){
- _pixelNamesCache[type] = _pixelRegExp.test(type);
- }
- return _pixelNamesCache[type] ? px(node, value) : value;
- };
-
- var _floatStyle = d.isIE ? "styleFloat" : "cssFloat",
- _floatAliases = { "cssFloat": _floatStyle, "styleFloat": _floatStyle, "float": _floatStyle }
- ;
-
- // public API
-
- dojo.style = function( /*DomNode|String*/ node,
- /*String?|Object?*/ style,
- /*String?*/ value){
- // summary:
- // Accesses styles on a node. If 2 arguments are
- // passed, acts as a getter. If 3 arguments are passed, acts
- // as a setter.
- // description:
- // Getting the style value uses the computed style for the node, so the value
- // will be a calculated value, not just the immediate node.style value.
- // Also when getting values, use specific style names,
- // like "borderBottomWidth" instead of "border" since compound values like
- // "border" are not necessarily reflected as expected.
- // If you want to get node dimensions, use `dojo.marginBox()`,
- // `dojo.contentBox()` or `dojo.position()`.
- // node:
- // id or reference to node to get/set style for
- // style:
- // the style property to set in DOM-accessor format
- // ("borderWidth", not "border-width") or an object with key/value
- // pairs suitable for setting each property.
- // value:
- // If passed, sets value on the node for style, handling
- // cross-browser concerns. When setting a pixel value,
- // be sure to include "px" in the value. For instance, top: "200px".
- // Otherwise, in some cases, some browsers will not apply the style.
- // example:
- // Passing only an ID or node returns the computed style object of
- // the node:
- // | dojo.style("thinger");
- // example:
- // Passing a node and a style property returns the current
- // normalized, computed value for that property:
- // | dojo.style("thinger", "opacity"); // 1 by default
- //
- // example:
- // Passing a node, a style property, and a value changes the
- // current display of the node and returns the new computed value
- // | dojo.style("thinger", "opacity", 0.5); // == 0.5
- //
- // example:
- // Passing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node:
- // | dojo.style("thinger", {
- // | "opacity": 0.5,
- // | "border": "3px solid black",
- // | "height": "300px"
- // | });
- //
- // example:
- // When the CSS style property is hyphenated, the JavaScript property is camelCased.
- // font-size becomes fontSize, and so on.
- // | dojo.style("thinger",{
- // | fontSize:"14pt",
- // | letterSpacing:"1.2em"
- // | });
- //
- // example:
- // dojo.NodeList implements .style() using the same syntax, omitting the "node" parameter, calling
- // dojo.style() on every element of the list. See: `dojo.query()` and `dojo.NodeList()`
- // | dojo.query(".someClassName").style("visibility","hidden");
- // | // or
- // | dojo.query("#baz > div").style({
- // | opacity:0.75,
- // | fontSize:"13pt"
- // | });
-
- var n = byId(node), args = arguments.length, op = (style == "opacity");
- style = _floatAliases[style] || style;
- if(args == 3){
- return op ? d._setOpacity(n, value) : n.style[style] = value; /*Number*/
- }
- if(args == 2 && op){
- return d._getOpacity(n);
- }
- var s = gcs(n);
- if(args == 2 && typeof style != "string"){ // inline'd type check
- for(var x in style){
- d.style(node, x, style[x]);
- }
- return s;
- }
- return (args == 1) ? s : _toStyleValue(n, style, s[style] || n.style[style]); /* CSS2Properties||String||Number */
- };
-
- // =============================
- // Box Functions
- // =============================
-
- dojo._getPadExtents = function(/*DomNode*/n, /*Object*/computedStyle){
- // summary:
- // Returns object with special values specifically useful for node
- // fitting.
- // description:
- // Returns an object with `w`, `h`, `l`, `t` properties:
- // | l/t = left/top padding (respectively)
- // | w = the total of the left and right padding
- // | h = the total of the top and bottom padding
- // If 'node' has position, l/t forms the origin for child nodes.
- // The w/h are used for calculating boxes.
- // Normally application code will not need to invoke this
- // directly, and will use the ...box... functions instead.
- var
- s = computedStyle||gcs(n),
- l = px(n, s.paddingLeft),
- t = px(n, s.paddingTop);
- return {
- l: l,
- t: t,
- w: l+px(n, s.paddingRight),
- h: t+px(n, s.paddingBottom)
- };
- };
-
- dojo._getBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){
- // summary:
- // returns an object with properties useful for noting the border
- // dimensions.
- // description:
- // * l/t = the sum of left/top border (respectively)
- // * w = the sum of the left and right border
- // * h = the sum of the top and bottom border
- //
- // The w/h are used for calculating boxes.
- // Normally application code will not need to invoke this
- // directly, and will use the ...box... functions instead.
- var
- ne = "none",
- s = computedStyle||gcs(n),
- bl = (s.borderLeftStyle != ne ? px(n, s.borderLeftWidth) : 0),
- bt = (s.borderTopStyle != ne ? px(n, s.borderTopWidth) : 0);
- return {
- l: bl,
- t: bt,
- w: bl + (s.borderRightStyle!=ne ? px(n, s.borderRightWidth) : 0),
- h: bt + (s.borderBottomStyle!=ne ? px(n, s.borderBottomWidth) : 0)
- };
- };
-
- dojo._getPadBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){
- // summary:
- // Returns object with properties useful for box fitting with
- // regards to padding.
- // description:
- // * l/t = the sum of left/top padding and left/top border (respectively)
- // * w = the sum of the left and right padding and border
- // * h = the sum of the top and bottom padding and border
- //
- // The w/h are used for calculating boxes.
- // Normally application code will not need to invoke this
- // directly, and will use the ...box... functions instead.
- var
- s = computedStyle||gcs(n),
- p = d._getPadExtents(n, s),
- b = d._getBorderExtents(n, s);
- return {
- l: p.l + b.l,
- t: p.t + b.t,
- w: p.w + b.w,
- h: p.h + b.h
- };
- };
-
- dojo._getMarginExtents = function(n, computedStyle){
- // summary:
- // returns object with properties useful for box fitting with
- // regards to box margins (i.e., the outer-box).
- //
- // * l/t = marginLeft, marginTop, respectively
- // * w = total width, margin inclusive
- // * h = total height, margin inclusive
- //
- // The w/h are used for calculating boxes.
- // Normally application code will not need to invoke this
- // directly, and will use the ...box... functions instead.
- var
- s = computedStyle||gcs(n),
- l = px(n, s.marginLeft),
- t = px(n, s.marginTop),
- r = px(n, s.marginRight),
- b = px(n, s.marginBottom);
- if(d.isWebKit && (s.position != "absolute")){
- // FIXME: Safari's version of the computed right margin
- // is the space between our right edge and the right edge
- // of our offsetParent.
- // What we are looking for is the actual margin value as
- // determined by CSS.
- // Hack solution is to assume left/right margins are the same.
- r = l;
- }
- return {
- l: l,
- t: t,
- w: l+r,
- h: t+b
- };
- };
-
- // Box getters work in any box context because offsetWidth/clientWidth
- // are invariant wrt box context
- //
- // They do *not* work for display: inline objects that have padding styles
- // because the user agent ignores padding (it's bogus styling in any case)
- //
- // Be careful with IMGs because they are inline or block depending on
- // browser and browser mode.
-
- // Although it would be easier to read, there are not separate versions of
- // _getMarginBox for each browser because:
- // 1. the branching is not expensive
- // 2. factoring the shared code wastes cycles (function call overhead)
- // 3. duplicating the shared code wastes bytes
-
- dojo._getMarginBox = function(/*DomNode*/node, /*Object*/computedStyle){
- // summary:
- // returns an object that encodes the width, height, left and top
- // positions of the node's margin box.
- var s = computedStyle || gcs(node), me = d._getMarginExtents(node, s);
- var l = node.offsetLeft - me.l, t = node.offsetTop - me.t, p = node.parentNode;
- if(d.isMoz){
- // Mozilla:
- // If offsetParent has a computed overflow != visible, the offsetLeft is decreased
- // by the parent's border.
- // We don't want to compute the parent's style, so instead we examine node's
- // computed left/top which is more stable.
- var sl = parseFloat(s.left), st = parseFloat(s.top);
- if(!isNaN(sl) && !isNaN(st)){
- l = sl, t = st;
- }else{
- // If child's computed left/top are not parseable as a number (e.g. "auto"), we
- // have no choice but to examine the parent's computed style.
- if(p && p.style){
- var pcs = gcs(p);
- if(pcs.overflow != "visible"){
- var be = d._getBorderExtents(p, pcs);
- l += be.l, t += be.t;
- }
- }
- }
- }else if(d.isOpera || (d.isIE > 7 && !d.isQuirks)){
- // On Opera and IE 8, offsetLeft/Top includes the parent's border
- if(p){
- be = d._getBorderExtents(p);
- l -= be.l;
- t -= be.t;
- }
- }
- return {
- l: l,
- t: t,
- w: node.offsetWidth + me.w,
- h: node.offsetHeight + me.h
- };
- }
-
- dojo._getMarginSize = function(/*DomNode*/node, /*Object*/computedStyle){
- // summary:
- // returns an object that encodes the width and height of
- // the node's margin box
- node = byId(node);
- var me = d._getMarginExtents(node, computedStyle || gcs(node));
-
- var size = node.getBoundingClientRect();
- return {
- w: (size.right - size.left) + me.w,
- h: (size.bottom - size.top) + me.h
- }
- }
-
- dojo._getContentBox = function(node, computedStyle){
- // summary:
- // Returns an object that encodes the width, height, left and top
- // positions of the node's content box, irrespective of the
- // current box model.
-
- // clientWidth/Height are important since the automatically account for scrollbars
- // fallback to offsetWidth/Height for special cases (see #3378)
- var s = computedStyle || gcs(node),
- pe = d._getPadExtents(node, s),
- be = d._getBorderExtents(node, s),
- w = node.clientWidth,
- h
- ;
- if(!w){
- w = node.offsetWidth, h = node.offsetHeight;
- }else{
- h = node.clientHeight, be.w = be.h = 0;
- }
- // On Opera, offsetLeft includes the parent's border
- if(d.isOpera){ pe.l += be.l; pe.t += be.t; };
- return {
- l: pe.l,
- t: pe.t,
- w: w - pe.w - be.w,
- h: h - pe.h - be.h
- };
- };
-
- dojo._getBorderBox = function(node, computedStyle){
- var s = computedStyle || gcs(node),
- pe = d._getPadExtents(node, s),
- cb = d._getContentBox(node, s)
- ;
- return {
- l: cb.l - pe.l,
- t: cb.t - pe.t,
- w: cb.w + pe.w,
- h: cb.h + pe.h
- };
- };
-
- // Box setters depend on box context because interpretation of width/height styles
- // vary wrt box context.
- //
- // The value of dojo.boxModel is used to determine box context.
- // dojo.boxModel can be set directly to change behavior.
- //
- // Beware of display: inline objects that have padding styles
- // because the user agent ignores padding (it's a bogus setup anyway)
- //
- // Be careful with IMGs because they are inline or block depending on
- // browser and browser mode.
- //
- // Elements other than DIV may have special quirks, like built-in
- // margins or padding, or values not detectable via computedStyle.
- // In particular, margins on TABLE do not seems to appear
- // at all in computedStyle on Mozilla.
-
- dojo._setBox = function(/*DomNode*/node, /*Number?*/l, /*Number?*/t, /*Number?*/w, /*Number?*/h, /*String?*/u){
- // summary:
- // sets width/height/left/top in the current (native) box-model
- // dimentions. Uses the unit passed in u.
- // node:
- // DOM Node reference. Id string not supported for performance
- // reasons.
- // l:
- // left offset from parent.
- // t:
- // top offset from parent.
- // w:
- // width in current box model.
- // h:
- // width in current box model.
- // u:
- // unit measure to use for other measures. Defaults to "px".
- u = u || "px";
- var s = node.style;
- if(!isNaN(l)){ s.left = l + u; }
- if(!isNaN(t)){ s.top = t + u; }
- if(w >= 0){ s.width = w + u; }
- if(h >= 0){ s.height = h + u; }
- };
-
- dojo._isButtonTag = function(/*DomNode*/node) {
- // summary:
- // True if the node is BUTTON or INPUT.type="button".
- return node.tagName == "BUTTON"
- || node.tagName=="INPUT" && (node.getAttribute("type")||'').toUpperCase() == "BUTTON"; // boolean
- };
-
- dojo._usesBorderBox = function(/*DomNode*/node){
- // summary:
- // True if the node uses border-box layout.
-
- // We could test the computed style of node to see if a particular box
- // has been specified, but there are details and we choose not to bother.
-
- // TABLE and BUTTON (and INPUT type=button) are always border-box by default.
- // If you have assigned a different box to either one via CSS then
- // box functions will break.
-
- var n = node.tagName;
- return d.boxModel=="border-box" || n=="TABLE" || d._isButtonTag(node); // boolean
- };
-
- dojo._setContentSize = function(/*DomNode*/node, /*Number*/widthPx, /*Number*/heightPx, /*Object*/computedStyle){
- // summary:
- // Sets the size of the node's contents, irrespective of margins,
- // padding, or borders.
- if(d._usesBorderBox(node)){
- var pb = d._getPadBorderExtents(node, computedStyle);
- if(widthPx >= 0){ widthPx += pb.w; }
- if(heightPx >= 0){ heightPx += pb.h; }
- }
- d._setBox(node, NaN, NaN, widthPx, heightPx);
- };
-
- dojo._setMarginBox = function(/*DomNode*/node, /*Number?*/leftPx, /*Number?*/topPx,
- /*Number?*/widthPx, /*Number?*/heightPx,
- /*Object*/computedStyle){
- // summary:
- // sets the size of the node's margin box and placement
- // (left/top), irrespective of box model. Think of it as a
- // passthrough to dojo._setBox that handles box-model vagaries for
- // you.
-
- var s = computedStyle || gcs(node),
- // Some elements have special padding, margin, and box-model settings.
- // To use box functions you may need to set padding, margin explicitly.
- // Controlling box-model is harder, in a pinch you might set dojo.boxModel.
- bb = d._usesBorderBox(node),
- pb = bb ? _nilExtents : d._getPadBorderExtents(node, s)
- ;
- if(d.isWebKit){
- // on Safari (3.1.2), button nodes with no explicit size have a default margin
- // setting an explicit size eliminates the margin.
- // We have to swizzle the width to get correct margin reading.
- if(d._isButtonTag(node)){
- var ns = node.style;
- if(widthPx >= 0 && !ns.width) { ns.width = "4px"; }
- if(heightPx >= 0 && !ns.height) { ns.height = "4px"; }
- }
- }
- var mb = d._getMarginExtents(node, s);
- if(widthPx >= 0){ widthPx = Math.max(widthPx - pb.w - mb.w, 0); }
- if(heightPx >= 0){ heightPx = Math.max(heightPx - pb.h - mb.h, 0); }
- d._setBox(node, leftPx, topPx, widthPx, heightPx);
- };
-
- var _nilExtents = { l:0, t:0, w:0, h:0 };
-
- // public API
-
- dojo.marginBox = function(/*DomNode|String*/node, /*Object?*/box){
- // summary:
- // Getter/setter for the margin-box of node.
- // description:
- // Getter/setter for the margin-box of node.
- // Returns an object in the expected format of box (regardless
- // if box is passed). The object might look like:
- // `{ l: 50, t: 200, w: 300: h: 150 }`
- // for a node offset from its parent 50px to the left, 200px from
- // the top with a margin width of 300px and a margin-height of
- // 150px.
- // node:
- // id or reference to DOM Node to get/set box for
- // box:
- // If passed, denotes that dojo.marginBox() should
- // update/set the margin box for node. Box is an object in the
- // above format. All properties are optional if passed.
- // example:
- // Retrieve the marginbox of a passed node
- // | var box = dojo.marginBox("someNodeId");
- // | console.dir(box);
- //
- // example:
- // Set a node's marginbox to the size of another node
- // | var box = dojo.marginBox("someNodeId");
- // | dojo.marginBox("someOtherNode", box);
-
- var n = byId(node), s = gcs(n), b = box;
- return !b ? d._getMarginBox(n, s) : d._setMarginBox(n, b.l, b.t, b.w, b.h, s); // Object
- };
-
- dojo.contentBox = function(/*DomNode|String*/node, /*Object?*/box){
- // summary:
- // Getter/setter for the content-box of node.
- // description:
- // Returns an object in the expected format of box (regardless if box is passed).
- // The object might look like:
- // `{ l: 50, t: 200, w: 300: h: 150 }`
- // for a node offset from its parent 50px to the left, 200px from
- // the top with a content width of 300px and a content-height of
- // 150px. Note that the content box may have a much larger border
- // or margin box, depending on the box model currently in use and
- // CSS values set/inherited for node.
- // While the getter will return top and left values, the
- // setter only accepts setting the width and height.
- // node:
- // id or reference to DOM Node to get/set box for
- // box:
- // If passed, denotes that dojo.contentBox() should
- // update/set the content box for node. Box is an object in the
- // above format, but only w (width) and h (height) are supported.
- // All properties are optional if passed.
- var n = byId(node), s = gcs(n), b = box;
- return !b ? d._getContentBox(n, s) : d._setContentSize(n, b.w, b.h, s); // Object
- };
-
- // =============================
- // Positioning
- // =============================
-
- var _sumAncestorProperties = function(node, prop){
- if(!(node = (node||0).parentNode)){return 0;}
- var val, retVal = 0, _b = d.body();
- while(node && node.style){
- if(gcs(node).position == "fixed"){
- return 0;
- }
- val = node[prop];
- if(val){
- retVal += val - 0;
- // opera and khtml #body & #html has the same values, we only
- // need one value
- if(node == _b){ break; }
- }
- node = node.parentNode;
- }
- return retVal; // integer
- };
-
- dojo._docScroll = function(){
- var n = d.global;
- return "pageXOffset" in n
- ? { x:n.pageXOffset, y:n.pageYOffset }
- : (n = d.isQuirks? d.doc.body : d.doc.documentElement, { x:d._fixIeBiDiScrollLeft(n.scrollLeft || 0), y:n.scrollTop || 0 });
- };
-
- dojo._isBodyLtr = function(){
- return "_bodyLtr" in d? d._bodyLtr :
- d._bodyLtr = (d.body().dir || d.doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean
- };
-
- dojo._getIeDocumentElementOffset = function(){
- // summary:
- // returns the offset in x and y from the document body to the
- // visual edge of the page
- // description:
- // The following values in IE contain an offset:
- // | event.clientX
- // | event.clientY
- // | node.getBoundingClientRect().left
- // | node.getBoundingClientRect().top
- // But other position related values do not contain this offset,
- // such as node.offsetLeft, node.offsetTop, node.style.left and
- // node.style.top. The offset is always (2, 2) in LTR direction.
- // When the body is in RTL direction, the offset counts the width
- // of left scroll bar's width. This function computes the actual
- // offset.
-
- //NOTE: assumes we're being called in an IE browser
-
- var de = d.doc.documentElement; // only deal with HTML element here, _abs handles body/quirks
-
- if(d.isIE < 8){
- var r = de.getBoundingClientRect(); // works well for IE6+
- //console.debug('rect left,top = ' + r.left+','+r.top + ', html client left/top = ' + de.clientLeft+','+de.clientTop + ', rtl = ' + (!d._isBodyLtr()) + ', quirks = ' + d.isQuirks);
- var l = r.left,
- t = r.top;
- if(d.isIE < 7){
- l += de.clientLeft; // scrollbar size in strict/RTL, or,
- t += de.clientTop; // HTML border size in strict
- }
- return {
- x: l < 0? 0 : l, // FRAME element border size can lead to inaccurate negative values
- y: t < 0? 0 : t
- };
- }else{
- return {
- x: 0,
- y: 0
- };
- }
-
- };
-
- dojo._fixIeBiDiScrollLeft = function(/*Integer*/ scrollLeft){
- // In RTL direction, scrollLeft should be a negative value, but IE
- // returns a positive one. All codes using documentElement.scrollLeft
- // must call this function to fix this error, otherwise the position
- // will offset to right when there is a horizontal scrollbar.
-
- var ie = d.isIE;
- if(ie && !d._isBodyLtr()){
- var qk = d.isQuirks,
- de = qk ? d.doc.body : d.doc.documentElement;
- if(ie == 6 && !qk && d.global.frameElement && de.scrollHeight > de.clientHeight){
- scrollLeft += de.clientLeft; // workaround ie6+strict+rtl+iframe+vertical-scrollbar bug where clientWidth is too small by clientLeft pixels
- }
- return (ie < 8 || qk) ? (scrollLeft + de.clientWidth - de.scrollWidth) : -scrollLeft; // Integer
- }
- return scrollLeft; // Integer
- };
-
- // FIXME: need a setter for coords or a moveTo!!
- dojo._abs = dojo.position = function(/*DomNode*/node, /*Boolean?*/includeScroll){
- // summary:
- // Gets the position and size of the passed element relative to
- // the viewport (if includeScroll==false), or relative to the
- // document root (if includeScroll==true).
- //
- // description:
- // Returns an object of the form:
- // { x: 100, y: 300, w: 20, h: 15 }
- // If includeScroll==true, the x and y values will include any
- // document offsets that may affect the position relative to the
- // viewport.
- // Uses the border-box model (inclusive of border and padding but
- // not margin). Does not act as a setter.
-
- node = byId(node);
- var db = d.body(),
- dh = db.parentNode,
- ret = node.getBoundingClientRect();
- ret = { x: ret.left, y: ret.top, w: ret.right - ret.left, h: ret.bottom - ret.top };
- if(d.isIE){
- // On IE there's a 2px offset that we need to adjust for, see _getIeDocumentElementOffset()
- var offset = d._getIeDocumentElementOffset();
-
- // fixes the position in IE, quirks mode
- ret.x -= offset.x + (d.isQuirks ? db.clientLeft+db.offsetLeft : 0);
- ret.y -= offset.y + (d.isQuirks ? db.clientTop+db.offsetTop : 0);
- }else if(d.isFF == 3){
- // In FF3 you have to subtract the document element margins.
- // Fixed in FF3.5 though.
- var cs = gcs(dh);
- ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth);
- ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth);
- }
- // account for document scrolling
- if(includeScroll){
- var scroll = d._docScroll();
- ret.x += scroll.x;
- ret.y += scroll.y;
- }
-
- return ret; // Object
- };
-
- dojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){
- // summary:
- // Deprecated: Use position() for border-box x/y/w/h
- // or marginBox() for margin-box w/h/l/t.
- // Returns an object representing a node's size and position.
- //
- // description:
- // Returns an object that measures margin-box (w)idth/(h)eight
- // and absolute position x/y of the border-box. Also returned
- // is computed (l)eft and (t)op values in pixels from the
- // node's offsetParent as returned from marginBox().
- // Return value will be in the form:
- //| { l: 50, t: 200, w: 300: h: 150, x: 100, y: 300 }
- // Does not act as a setter. If includeScroll is passed, the x and
- // y params are affected as one would expect in dojo.position().
- var n = byId(node), s = gcs(n), mb = d._getMarginBox(n, s);
- var abs = d.position(n, includeScroll);
- mb.x = abs.x;
- mb.y = abs.y;
- return mb;
- };
-
- // =============================
- // Element attribute Functions
- // =============================
-
- // dojo.attr() should conform to http://www.w3.org/TR/DOM-Level-2-Core/
-
- var _propNames = {
- // properties renamed to avoid clashes with reserved words
- "class": "className",
- "for": "htmlFor",
- // properties written as camelCase
- tabindex: "tabIndex",
- readonly: "readOnly",
- colspan: "colSpan",
- frameborder: "frameBorder",
- rowspan: "rowSpan",
- valuetype: "valueType"
- },
- _attrNames = {
- // original attribute names
- classname: "class",
- htmlfor: "for",
- // for IE
- tabindex: "tabIndex",
- readonly: "readOnly"
- },
- _forcePropNames = {
- innerHTML: 1,
- className: 1,
- htmlFor: d.isIE,
- value: 1
- };
-
- var _fixAttrName = function(/*String*/ name){
- return _attrNames[name.toLowerCase()] || name;
- };
-
- var _hasAttr = function(node, name){
- var attr = node.getAttributeNode && node.getAttributeNode(name);
- return attr && attr.specified; // Boolean
- };
-
- // There is a difference in the presence of certain properties and their default values
- // between browsers. For example, on IE "disabled" is present on all elements,
- // but it is value is "false"; "tabIndex" of <div> returns 0 by default on IE, yet other browsers
- // can return -1.
-
- dojo.hasAttr = function(/*DomNode|String*/node, /*String*/name){
- // summary:
- // Returns true if the requested attribute is specified on the
- // given element, and false otherwise.
- // node:
- // id or reference to the element to check
- // name:
- // the name of the attribute
- // returns:
- // true if the requested attribute is specified on the
- // given element, and false otherwise
- var lc = name.toLowerCase();
- return _forcePropNames[_propNames[lc] || name] || _hasAttr(byId(node), _attrNames[lc] || name); // Boolean
- };
-
- var _evtHdlrMap = {}, _ctr = 0,
- _attrId = dojo._scopeName + "attrid",
- // the next dictionary lists elements with read-only innerHTML on IE
- _roInnerHtml = {col: 1, colgroup: 1,
- // frameset: 1, head: 1, html: 1, style: 1,
- table: 1, tbody: 1, tfoot: 1, thead: 1, tr: 1, title: 1};
-
- dojo.attr = function(/*DomNode|String*/node, /*String|Object*/name, /*String?*/value){
- // summary:
- // Gets or sets an attribute on an HTML element.
- // description:
- // Handles normalized getting and setting of attributes on DOM
- // Nodes. If 2 arguments are passed, and a the second argumnt is a
- // string, acts as a getter.
- //
- // If a third argument is passed, or if the second argument is a
- // map of attributes, acts as a setter.
- //
- // When passing functions as values, note that they will not be
- // directly assigned to slots on the node, but rather the default
- // behavior will be removed and the new behavior will be added
- // using `dojo.connect()`, meaning that event handler properties
- // will be normalized and that some caveats with regards to
- // non-standard behaviors for onsubmit apply. Namely that you
- // should cancel form submission using `dojo.stopEvent()` on the
- // passed event object instead of returning a boolean value from
- // the handler itself.
- // node:
- // id or reference to the element to get or set the attribute on
- // name:
- // the name of the attribute to get or set.
- // value:
- // The value to set for the attribute
- // returns:
- // when used as a getter, the value of the requested attribute
- // or null if that attribute does not have a specified or
- // default value;
- //
- // when used as a setter, the DOM node
- //
- // example:
- // | // get the current value of the "foo" attribute on a node
- // | dojo.attr(dojo.byId("nodeId"), "foo");
- // | // or we can just pass the id:
- // | dojo.attr("nodeId", "foo");
- //
- // example:
- // | // use attr() to set the tab index
- // | dojo.attr("nodeId", "tabIndex", 3);
- // |
- //
- // example:
- // Set multiple values at once, including event handlers:
- // | dojo.attr("formId", {
- // | "foo": "bar",
- // | "tabIndex": -1,
- // | "method": "POST",
- // | "onsubmit": function(e){
- // | // stop submitting the form. Note that the IE behavior
- // | // of returning true or false will have no effect here
- // | // since our handler is connect()ed to the built-in
- // | // onsubmit behavior and so we need to use
- // | // dojo.stopEvent() to ensure that the submission
- // | // doesn't proceed.
- // | dojo.stopEvent(e);
- // |
- // | // submit the form with Ajax
- // | dojo.xhrPost({ form: "formId" });
- // | }
- // | });
- //
- // example:
- // Style is s special case: Only set with an object hash of styles
- // | dojo.attr("someNode",{
- // | id:"bar",
- // | style:{
- // | width:"200px", height:"100px", color:"#000"
- // | }
- // | });
- //
- // example:
- // Again, only set style as an object hash of styles:
- // | var obj = { color:"#fff", backgroundColor:"#000" };
- // | dojo.attr("someNode", "style", obj);
- // |
- // | // though shorter to use `dojo.style()` in this case:
- // | dojo.style("someNode", obj);
-
- node = byId(node);
- var args = arguments.length, prop;
- if(args == 2 && typeof name != "string"){ // inline'd type check
- // the object form of setter: the 2nd argument is a dictionary
- for(var x in name){
- d.attr(node, x, name[x]);
- }
- return node; // DomNode
- }
- var lc = name.toLowerCase(),
- propName = _propNames[lc] || name,
- forceProp = _forcePropNames[propName],
- attrName = _attrNames[lc] || name;
- if(args == 3){
- // setter
- do{
- if(propName == "style" && typeof value != "string"){ // inline'd type check
- // special case: setting a style
- d.style(node, value);
- break;
- }
- if(propName == "innerHTML"){
- // special case: assigning HTML
- if(d.isIE && node.tagName.toLowerCase() in _roInnerHtml){
- d.empty(node);
- node.appendChild(d._toDom(value, node.ownerDocument));
- }else{
- node[propName] = value;
- }
- break;
- }
- if(d.isFunction(value)){
- // special case: assigning an event handler
- // clobber if we can
- var attrId = d.attr(node, _attrId);
- if(!attrId){
- attrId = _ctr++;
- d.attr(node, _attrId, attrId);
- }
- if(!_evtHdlrMap[attrId]){
- _evtHdlrMap[attrId] = {};
- }
- var h = _evtHdlrMap[attrId][propName];
- if(h){
- d.disconnect(h);
- }else{
- try{
- delete node[propName];
- }catch(e){}
- }
- // ensure that event objects are normalized, etc.
- _evtHdlrMap[attrId][propName] = d.connect(node, propName, value);
- break;
- }
- if(forceProp || typeof value == "boolean"){
- // special case: forcing assignment to the property
- // special case: setting boolean to a property instead of attribute
- node[propName] = value;
- break;
- }
- // node's attribute
- node.setAttribute(attrName, value);
- }while(false);
- return node; // DomNode
- }
- // getter
- // should we access this attribute via a property or
- // via getAttribute()?
- value = node[propName];
- if(forceProp && typeof value != "undefined"){
- // node's property
- return value; // Anything
- }
- if(propName != "href" && (typeof value == "boolean" || d.isFunction(value))){
- // node's property
- return value; // Anything
- }
- // node's attribute
- // we need _hasAttr() here to guard against IE returning a default value
- return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything
- };
-
- dojo.removeAttr = function(/*DomNode|String*/ node, /*String*/ name){
- // summary:
- // Removes an attribute from an HTML element.
- // node:
- // id or reference to the element to remove the attribute from
- // name:
- // the name of the attribute to remove
- byId(node).removeAttribute(_fixAttrName(name));
- };
-
- dojo.getNodeProp = function(/*DomNode|String*/ node, /*String*/ name){
- // summary:
- // Returns an effective value of a property or an attribute.
- // node:
- // id or reference to the element to remove the attribute from
- // name:
- // the name of the attribute
- node = byId(node);
- var lc = name.toLowerCase(),
- propName = _propNames[lc] || name;
- if((propName in node) && propName != "href"){
- // node's property
- return node[propName]; // Anything
- }
- // node's attribute
- var attrName = _attrNames[lc] || name;
- return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything
- };
-
- dojo.create = function(tag, attrs, refNode, pos){
- // summary:
- // Create an element, allowing for optional attribute decoration
- // and placement.
- //
- // description:
- // A DOM Element creation function. A shorthand method for creating a node or
- // a fragment, and allowing for a convenient optional attribute setting step,
- // as well as an optional DOM placement reference.
- //|
- // Attributes are set by passing the optional object through `dojo.attr`.
- // See `dojo.attr` for noted caveats and nuances, and API if applicable.
- //|
- // Placement is done via `dojo.place`, assuming the new node to be the action
- // node, passing along the optional reference node and position.
- //
- // tag: String|DomNode
- // A string of the element to create (eg: "div", "a", "p", "li", "script", "br"),
- // or an existing DOM node to process.
- //
- // attrs: Object
- // An object-hash of attributes to set on the newly created node.
- // Can be null, if you don't want to set any attributes/styles.
- // See: `dojo.attr` for a description of available attributes.
- //
- // refNode: String?|DomNode?
- // Optional reference node. Used by `dojo.place` to place the newly created
- // node somewhere in the dom relative to refNode. Can be a DomNode reference
- // or String ID of a node.
- //
- // pos: String?
- // Optional positional reference. Defaults to "last" by way of `dojo.place`,
- // though can be set to "first","after","before","last", "replace" or "only"
- // to further control the placement of the new node relative to the refNode.
- // 'refNode' is required if a 'pos' is specified.
- //
- // returns: DomNode
- //
- // example:
- // Create a DIV:
- // | var n = dojo.create("div");
- //
- // example:
- // Create a DIV with content:
- // | var n = dojo.create("div", { innerHTML:"<p>hi</p>" });
- //
- // example:
- // Place a new DIV in the BODY, with no attributes set
- // | var n = dojo.create("div", null, dojo.body());
- //
- // example:
- // Create an UL, and populate it with LI's. Place the list as the first-child of a
- // node with id="someId":
- // | var ul = dojo.create("ul", null, "someId", "first");
- // | var items = ["one", "two", "three", "four"];
- // | dojo.forEach(items, function(data){
- // | dojo.create("li", { innerHTML: data }, ul);
- // | });
- //
- // example:
- // Create an anchor, with an href. Place in BODY:
- // | dojo.create("a", { href:"foo.html", title:"Goto FOO!" }, dojo.body());
- //
- // example:
- // Create a `dojo.NodeList()` from a new element (for syntatic sugar):
- // | dojo.query(dojo.create('div'))
- // | .addClass("newDiv")
- // | .onclick(function(e){ console.log('clicked', e.target) })
- // | .place("#someNode"); // redundant, but cleaner.
-
- var doc = d.doc;
- if(refNode){
- refNode = byId(refNode);
- doc = refNode.ownerDocument;
- }
- if(typeof tag == "string"){ // inline'd type check
- tag = doc.createElement(tag);
- }
- if(attrs){ d.attr(tag, attrs); }
- if(refNode){ d.place(tag, refNode, pos); }
- return tag; // DomNode
- };
-
- /*=====
- dojo.empty = function(node){
- // summary:
- // safely removes all children of the node.
- // node: DOMNode|String
- // a reference to a DOM node or an id.
- // example:
- // Destroy node's children byId:
- // | dojo.empty("someId");
- //
- // example:
- // Destroy all nodes' children in a list by reference:
- // | dojo.query(".someNode").forEach(dojo.empty);
- }
- =====*/
-
- d.empty =
- d.isIE ? function(node){
- node = byId(node);
- for(var c; c = node.lastChild;){ // intentional assignment
- d.destroy(c);
- }
- } :
- function(node){
- byId(node).innerHTML = "";
- };
-
- /*=====
- dojo._toDom = function(frag, doc){
- // summary:
- // instantiates an HTML fragment returning the corresponding DOM.
- // frag: String
- // the HTML fragment
- // doc: DocumentNode?
- // optional document to use when creating DOM nodes, defaults to
- // dojo.doc if not specified.
- // returns: DocumentFragment
- //
- // example:
- // Create a table row:
- // | var tr = dojo._toDom("<tr><td>First!</td></tr>");
- }
- =====*/
-
- // support stuff for dojo._toDom
- var tagWrap = {
- option: ["select"],
- tbody: ["table"],
- thead: ["table"],
- tfoot: ["table"],
- tr: ["table", "tbody"],
- td: ["table", "tbody", "tr"],
- th: ["table", "thead", "tr"],
- legend: ["fieldset"],
- caption: ["table"],
- colgroup: ["table"],
- col: ["table", "colgroup"],
- li: ["ul"]
- },
- reTag = /<\s*([\w\:]+)/,
- masterNode = {}, masterNum = 0,
- masterName = "__" + d._scopeName + "ToDomId";
-
- // generate start/end tag strings to use
- // for the injection for each special tag wrap case.
- for(var param in tagWrap){
- if(tagWrap.hasOwnProperty(param)){
- var tw = tagWrap[param];
- tw.pre = param == "option" ? '<select multiple="multiple">' : "<" + tw.join("><") + ">";
- tw.post = "</" + tw.reverse().join("></") + ">";
- // the last line is destructive: it reverses the array,
- // but we don't care at this point
- }
- }
-
- d._toDom = function(frag, doc){
- // summary:
- // converts HTML string into DOM nodes.
-
- doc = doc || d.doc;
- var masterId = doc[masterName];
- if(!masterId){
- doc[masterName] = masterId = ++masterNum + "";
- masterNode[masterId] = doc.createElement("div");
- }
-
- // make sure the frag is a string.
- frag += "";
-
- // find the starting tag, and get node wrapper
- var match = frag.match(reTag),
- tag = match ? match[1].toLowerCase() : "",
- master = masterNode[masterId],
- wrap, i, fc, df;
- if(match && tagWrap[tag]){
- wrap = tagWrap[tag];
- master.innerHTML = wrap.pre + frag + wrap.post;
- for(i = wrap.length; i; --i){
- master = master.firstChild;
- }
- }else{
- master.innerHTML = frag;
- }
-
- // one node shortcut => return the node itself
- if(master.childNodes.length == 1){
- return master.removeChild(master.firstChild); // DOMNode
- }
-
- // return multiple nodes as a document fragment
- df = doc.createDocumentFragment();
- while(fc = master.firstChild){ // intentional assignment
- df.appendChild(fc);
- }
- return df; // DOMNode
- };
-
- // =============================
- // (CSS) Class Functions
- // =============================
- var _className = "className";
-
- dojo.hasClass = function(/*DomNode|String*/node, /*String*/classStr){
- // summary:
- // Returns whether or not the specified classes are a portion of the
- // class list currently applied to the node.
- //
- // node:
- // String ID or DomNode reference to check the class for.
- //
- // classStr:
- // A string class name to look for.
- //
- // example:
- // Do something if a node with id="someNode" has class="aSillyClassName" present
- // | if(dojo.hasClass("someNode","aSillyClassName")){ ... }
-
- return ((" "+ byId(node)[_className] +" ").indexOf(" " + classStr + " ") >= 0); // Boolean
- };
-
- var spaces = /\s+/, a1 = [""],
- fakeNode = {},
- str2array = function(s){
- if(typeof s == "string" || s instanceof String){
- if(s.indexOf(" ") < 0){
- a1[0] = s;
- return a1;
- }else{
- return s.split(spaces);
- }
- }
- // assumed to be an array
- return s || "";
- };
-
- dojo.addClass = function(/*DomNode|String*/node, /*String|Array*/classStr){
- // summary:
- // Adds the specified classes to the end of the class list on the
- // passed node. Will not re-apply duplicate classes.
- //
- // node:
- // String ID or DomNode reference to add a class string too
- //
- // classStr:
- // A String class name to add, or several space-separated class names,
- // or an array of class names.
- //
- // example:
- // Add a class to some node:
- // | dojo.addClass("someNode", "anewClass");
- //
- // example:
- // Add two classes at once:
- // | dojo.addClass("someNode", "firstClass secondClass");
- //
- // example:
- // Add two classes at once (using array):
- // | dojo.addClass("someNode", ["firstClass", "secondClass"]);
- //
- // example:
- // Available in `dojo.NodeList` for multiple additions
- // | dojo.query("ul > li").addClass("firstLevel");
-
- node = byId(node);
- classStr = str2array(classStr);
- var cls = node[_className], oldLen;
- cls = cls ? " " + cls + " " : " ";
- oldLen = cls.length;
- for(var i = 0, len = classStr.length, c; i < len; ++i){
- c = classStr[i];
- if(c && cls.indexOf(" " + c + " ") < 0){
- cls += c + " ";
- }
- }
- if(oldLen < cls.length){
- node[_className] = cls.substr(1, cls.length - 2);
- }
- };
-
- dojo.removeClass = function(/*DomNode|String*/node, /*String|Array?*/classStr){
- // summary:
- // Removes the specified classes from node. No `dojo.hasClass`
- // check is required.
- //
- // node:
- // String ID or DomNode reference to remove the class from.
- //
- // classStr:
- // An optional String class name to remove, or several space-separated
- // class names, or an array of class names. If omitted, all class names
- // will be deleted.
- //
- // example:
- // Remove a class from some node:
- // | dojo.removeClass("someNode", "firstClass");
- //
- // example:
- // Remove two classes from some node:
- // | dojo.removeClass("someNode", "firstClass secondClass");
- //
- // example:
- // Remove two classes from some node (using array):
- // | dojo.removeClass("someNode", ["firstClass", "secondClass"]);
- //
- // example:
- // Remove all classes from some node:
- // | dojo.removeClass("someNode");
- //
- // example:
- // Available in `dojo.NodeList()` for multiple removal
- // | dojo.query(".foo").removeClass("foo");
-
- node = byId(node);
- var cls;
- if(classStr !== undefined){
- classStr = str2array(classStr);
- cls = " " + node[_className] + " ";
- for(var i = 0, len = classStr.length; i < len; ++i){
- cls = cls.replace(" " + classStr[i] + " ", " ");
- }
- cls = d.trim(cls);
- }else{
- cls = "";
- }
- if(node[_className] != cls){ node[_className] = cls; }
- };
-
- dojo.replaceClass = function(/*DomNode|String*/node, /*String|Array*/addClassStr, /*String|Array?*/removeClassStr){
- // summary:
- // Replaces one or more classes on a node if not present.
- // Operates more quickly than calling dojo.removeClass and dojo.addClass
- // node:
- // String ID or DomNode reference to remove the class from.
- // addClassStr:
- // A String class name to add, or several space-separated class names,
- // or an array of class names.
- // removeClassStr:
- // A String class name to remove, or several space-separated class names,
- // or an array of class names.
- //
- // example:
- // | dojo.replaceClass("someNode", "add1 add2", "remove1 remove2");
- //
- // example:
- // Replace all classes with addMe
- // | dojo.replaceClass("someNode", "addMe");
- //
- // example:
- // Available in `dojo.NodeList()` for multiple toggles
- // | dojo.query(".findMe").replaceClass("addMe", "removeMe");
-
- node = byId(node);
- fakeNode.className = node.className;
- dojo.removeClass(fakeNode, removeClassStr);
- dojo.addClass(fakeNode, addClassStr);
- if(node.className !== fakeNode.className){
- node.className = fakeNode.className;
- }
- };
-
- dojo.toggleClass = function(/*DomNode|String*/node, /*String|Array*/classStr, /*Boolean?*/condition){
- // summary:
- // Adds a class to node if not present, or removes if present.
- // Pass a boolean condition if you want to explicitly add or remove.
- // condition:
- // If passed, true means to add the class, false means to remove.
- //
- // example:
- // | dojo.toggleClass("someNode", "hovered");
- //
- // example:
- // Forcefully add a class
- // | dojo.toggleClass("someNode", "hovered", true);
- //
- // example:
- // Available in `dojo.NodeList()` for multiple toggles
- // | dojo.query(".toggleMe").toggleClass("toggleMe");
-
- if(condition === undefined){
- condition = !d.hasClass(node, classStr);
- }
- d[condition ? "addClass" : "removeClass"](node, classStr);
- };
-
-})();
-
-}
+//>>built
+define("dojo/_base/html",["./kernel","../dom","../dom-style","../dom-attr","../dom-prop","../dom-class","../dom-construct","../dom-geometry"],function(_1,_2,_3,_4,_5,_6,_7,_8){_1.byId=_2.byId;_1.isDescendant=_2.isDescendant;_1.setSelectable=_2.setSelectable;_1.getAttr=_4.get;_1.setAttr=_4.set;_1.hasAttr=_4.has;_1.removeAttr=_4.remove;_1.getNodeProp=_4.getNodeProp;_1.attr=function(_9,_a,_b){if(arguments.length==2){return _4[typeof _a=="string"?"get":"set"](_9,_a);}return _4.set(_9,_a,_b);};_1.hasClass=_6.contains;_1.addClass=_6.add;_1.removeClass=_6.remove;_1.toggleClass=_6.toggle;_1.replaceClass=_6.replace;_1._toDom=_1.toDom=_7.toDom;_1.place=_7.place;_1.create=_7.create;_1.empty=function(_c){_7.empty(_c);};_1._destroyElement=_1.destroy=function(_d){_7.destroy(_d);};_1._getPadExtents=_1.getPadExtents=_8.getPadExtents;_1._getBorderExtents=_1.getBorderExtents=_8.getBorderExtents;_1._getPadBorderExtents=_1.getPadBorderExtents=_8.getPadBorderExtents;_1._getMarginExtents=_1.getMarginExtents=_8.getMarginExtents;_1._getMarginSize=_1.getMarginSize=_8.getMarginSize;_1._getMarginBox=_1.getMarginBox=_8.getMarginBox;_1.setMarginBox=_8.setMarginBox;_1._getContentBox=_1.getContentBox=_8.getContentBox;_1.setContentSize=_8.setContentSize;_1._isBodyLtr=_1.isBodyLtr=_8.isBodyLtr;_1._docScroll=_1.docScroll=_8.docScroll;_1._getIeDocumentElementOffset=_1.getIeDocumentElementOffset=_8.getIeDocumentElementOffset;_1._fixIeBiDiScrollLeft=_1.fixIeBiDiScrollLeft=_8.fixIeBiDiScrollLeft;_1.position=_8.position;_1.marginBox=function marginBox(_e,_f){return _f?_8.setMarginBox(_e,_f):_8.getMarginBox(_e);};_1.contentBox=function contentBox(_10,box){return box?_8.setContentSize(_10,box):_8.getContentBox(_10);};_1.coords=function(_11,_12){_1.deprecated("dojo.coords()","Use dojo.position() or dojo.marginBox().");_11=_2.byId(_11);var s=_3.getComputedStyle(_11),mb=_8.getMarginBox(_11,s);var abs=_8.position(_11,_12);mb.x=abs.x;mb.y=abs.y;return mb;};_1.getProp=_5.get;_1.setProp=_5.set;_1.prop=function(_13,_14,_15){if(arguments.length==2){return _5[typeof _14=="string"?"get":"set"](_13,_14);}return _5.set(_13,_14,_15);};_1.getStyle=_3.get;_1.setStyle=_3.set;_1.getComputedStyle=_3.getComputedStyle;_1.__toPixelValue=_1.toPixelValue=_3.toPixelValue;_1.style=function(_16,_17,_18){switch(arguments.length){case 1:return _3.get(_16);case 2:return _3[typeof _17=="string"?"get":"set"](_16,_17);}return _3.set(_16,_17,_18);};return _1;}); \ No newline at end of file
diff --git a/lib/dojo/_base/html.js.uncompressed.js b/lib/dojo/_base/html.js.uncompressed.js
new file mode 100644
index 000000000..63e3bee46
--- /dev/null
+++ b/lib/dojo/_base/html.js.uncompressed.js
@@ -0,0 +1,389 @@
+define("dojo/_base/html", ["./kernel", "../dom", "../dom-style", "../dom-attr", "../dom-prop", "../dom-class", "../dom-construct", "../dom-geometry"], function(dojo, dom, style, attr, prop, cls, ctr, geom){
+ // module:
+ // dojo/dom
+ // summary:
+ // This module is a stub for the core dojo DOM API.
+
+ // mix-in dom
+ dojo.byId = dom.byId;
+ dojo.isDescendant = dom.isDescendant;
+ dojo.setSelectable = dom.setSelectable;
+
+ // mix-in dom-attr
+ dojo.getAttr = attr.get;
+ dojo.setAttr = attr.set;
+ dojo.hasAttr = attr.has;
+ dojo.removeAttr = attr.remove;
+ dojo.getNodeProp = attr.getNodeProp;
+
+ dojo.attr = function(node, name, value){
+ // summary:
+ // Gets or sets an attribute on an HTML element.
+ // description:
+ // Handles normalized getting and setting of attributes on DOM
+ // Nodes. If 2 arguments are passed, and a the second argument is a
+ // string, acts as a getter.
+ //
+ // If a third argument is passed, or if the second argument is a
+ // map of attributes, acts as a setter.
+ //
+ // When passing functions as values, note that they will not be
+ // directly assigned to slots on the node, but rather the default
+ // behavior will be removed and the new behavior will be added
+ // using `dojo.connect()`, meaning that event handler properties
+ // will be normalized and that some caveats with regards to
+ // non-standard behaviors for onsubmit apply. Namely that you
+ // should cancel form submission using `dojo.stopEvent()` on the
+ // passed event object instead of returning a boolean value from
+ // the handler itself.
+ // node: DOMNode|String
+ // id or reference to the element to get or set the attribute on
+ // name: String|Object
+ // the name of the attribute to get or set.
+ // value: String?
+ // The value to set for the attribute
+ // returns:
+ // when used as a getter, the value of the requested attribute
+ // or null if that attribute does not have a specified or
+ // default value;
+ //
+ // when used as a setter, the DOM node
+ //
+ // example:
+ // | // get the current value of the "foo" attribute on a node
+ // | dojo.attr(dojo.byId("nodeId"), "foo");
+ // | // or we can just pass the id:
+ // | dojo.attr("nodeId", "foo");
+ //
+ // example:
+ // | // use attr() to set the tab index
+ // | dojo.attr("nodeId", "tabIndex", 3);
+ // |
+ //
+ // example:
+ // Set multiple values at once, including event handlers:
+ // | dojo.attr("formId", {
+ // | "foo": "bar",
+ // | "tabIndex": -1,
+ // | "method": "POST",
+ // | "onsubmit": function(e){
+ // | // stop submitting the form. Note that the IE behavior
+ // | // of returning true or false will have no effect here
+ // | // since our handler is connect()ed to the built-in
+ // | // onsubmit behavior and so we need to use
+ // | // dojo.stopEvent() to ensure that the submission
+ // | // doesn't proceed.
+ // | dojo.stopEvent(e);
+ // |
+ // | // submit the form with Ajax
+ // | dojo.xhrPost({ form: "formId" });
+ // | }
+ // | });
+ //
+ // example:
+ // Style is s special case: Only set with an object hash of styles
+ // | dojo.attr("someNode",{
+ // | id:"bar",
+ // | style:{
+ // | width:"200px", height:"100px", color:"#000"
+ // | }
+ // | });
+ //
+ // example:
+ // Again, only set style as an object hash of styles:
+ // | var obj = { color:"#fff", backgroundColor:"#000" };
+ // | dojo.attr("someNode", "style", obj);
+ // |
+ // | // though shorter to use `dojo.style()` in this case:
+ // | dojo.style("someNode", obj);
+
+ if(arguments.length == 2){
+ return attr[typeof name == "string" ? "get" : "set"](node, name);
+ }
+ return attr.set(node, name, value);
+ };
+
+ // mix-in dom-class
+ dojo.hasClass = cls.contains;
+ dojo.addClass = cls.add;
+ dojo.removeClass = cls.remove;
+ dojo.toggleClass = cls.toggle;
+ dojo.replaceClass = cls.replace;
+
+ // mix-in dom-construct
+ dojo._toDom = dojo.toDom = ctr.toDom;
+ dojo.place = ctr.place;
+ dojo.create = ctr.create;
+ dojo.empty = function(node){ ctr.empty(node); };
+ dojo._destroyElement = dojo.destroy = function(node){ ctr.destroy(node); };
+
+ // mix-in dom-geometry
+ dojo._getPadExtents = dojo.getPadExtents = geom.getPadExtents;
+ dojo._getBorderExtents = dojo.getBorderExtents = geom.getBorderExtents;
+ dojo._getPadBorderExtents = dojo.getPadBorderExtents = geom.getPadBorderExtents;
+ dojo._getMarginExtents = dojo.getMarginExtents = geom.getMarginExtents;
+ dojo._getMarginSize = dojo.getMarginSize = geom.getMarginSize;
+ dojo._getMarginBox = dojo.getMarginBox = geom.getMarginBox;
+ dojo.setMarginBox = geom.setMarginBox;
+ dojo._getContentBox = dojo.getContentBox = geom.getContentBox;
+ dojo.setContentSize = geom.setContentSize;
+ dojo._isBodyLtr = dojo.isBodyLtr = geom.isBodyLtr;
+ dojo._docScroll = dojo.docScroll = geom.docScroll;
+ dojo._getIeDocumentElementOffset = dojo.getIeDocumentElementOffset = geom.getIeDocumentElementOffset;
+ dojo._fixIeBiDiScrollLeft = dojo.fixIeBiDiScrollLeft = geom.fixIeBiDiScrollLeft;
+ dojo.position = geom.position;
+
+ dojo.marginBox = function marginBox(/*DomNode|String*/node, /*Object?*/box){
+ // summary:
+ // Getter/setter for the margin-box of node.
+ // description:
+ // Getter/setter for the margin-box of node.
+ // Returns an object in the expected format of box (regardless
+ // if box is passed). The object might look like:
+ // `{ l: 50, t: 200, w: 300: h: 150 }`
+ // for a node offset from its parent 50px to the left, 200px from
+ // the top with a margin width of 300px and a margin-height of
+ // 150px.
+ // node:
+ // id or reference to DOM Node to get/set box for
+ // box:
+ // If passed, denotes that dojo.marginBox() should
+ // update/set the margin box for node. Box is an object in the
+ // above format. All properties are optional if passed.
+ // example:
+ // Retrieve the margin box of a passed node
+ // | var box = dojo.marginBox("someNodeId");
+ // | console.dir(box);
+ //
+ // example:
+ // Set a node's margin box to the size of another node
+ // | var box = dojo.marginBox("someNodeId");
+ // | dojo.marginBox("someOtherNode", box);
+ return box ? geom.setMarginBox(node, box) : geom.getMarginBox(node); // Object
+ };
+
+ dojo.contentBox = function contentBox(/*DomNode|String*/node, /*Object?*/box){
+ // summary:
+ // Getter/setter for the content-box of node.
+ // description:
+ // Returns an object in the expected format of box (regardless if box is passed).
+ // The object might look like:
+ // `{ l: 50, t: 200, w: 300: h: 150 }`
+ // for a node offset from its parent 50px to the left, 200px from
+ // the top with a content width of 300px and a content-height of
+ // 150px. Note that the content box may have a much larger border
+ // or margin box, depending on the box model currently in use and
+ // CSS values set/inherited for node.
+ // While the getter will return top and left values, the
+ // setter only accepts setting the width and height.
+ // node:
+ // id or reference to DOM Node to get/set box for
+ // box:
+ // If passed, denotes that dojo.contentBox() should
+ // update/set the content box for node. Box is an object in the
+ // above format, but only w (width) and h (height) are supported.
+ // All properties are optional if passed.
+ return box ? geom.setContentSize(node, box) : geom.getContentBox(node); // Object
+ };
+
+ dojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){
+ // summary:
+ // Deprecated: Use position() for border-box x/y/w/h
+ // or marginBox() for margin-box w/h/l/t.
+ // Returns an object representing a node's size and position.
+ //
+ // description:
+ // Returns an object that measures margin-box (w)idth/(h)eight
+ // and absolute position x/y of the border-box. Also returned
+ // is computed (l)eft and (t)op values in pixels from the
+ // node's offsetParent as returned from marginBox().
+ // Return value will be in the form:
+ //| { l: 50, t: 200, w: 300: h: 150, x: 100, y: 300 }
+ // Does not act as a setter. If includeScroll is passed, the x and
+ // y params are affected as one would expect in dojo.position().
+ dojo.deprecated("dojo.coords()", "Use dojo.position() or dojo.marginBox().");
+ node = dom.byId(node);
+ var s = style.getComputedStyle(node), mb = geom.getMarginBox(node, s);
+ var abs = geom.position(node, includeScroll);
+ mb.x = abs.x;
+ mb.y = abs.y;
+ return mb; // Object
+ };
+
+ // mix-in dom-prop
+ dojo.getProp = prop.get;
+ dojo.setProp = prop.set;
+
+ dojo.prop = function(/*DomNode|String*/node, /*String|Object*/name, /*String?*/value){
+ // summary:
+ // Gets or sets a property on an HTML element.
+ // description:
+ // Handles normalized getting and setting of properties on DOM
+ // Nodes. If 2 arguments are passed, and a the second argument is a
+ // string, acts as a getter.
+ //
+ // If a third argument is passed, or if the second argument is a
+ // map of attributes, acts as a setter.
+ //
+ // When passing functions as values, note that they will not be
+ // directly assigned to slots on the node, but rather the default
+ // behavior will be removed and the new behavior will be added
+ // using `dojo.connect()`, meaning that event handler properties
+ // will be normalized and that some caveats with regards to
+ // non-standard behaviors for onsubmit apply. Namely that you
+ // should cancel form submission using `dojo.stopEvent()` on the
+ // passed event object instead of returning a boolean value from
+ // the handler itself.
+ // node:
+ // id or reference to the element to get or set the property on
+ // name:
+ // the name of the property to get or set.
+ // value:
+ // The value to set for the property
+ // returns:
+ // when used as a getter, the value of the requested property
+ // or null if that attribute does not have a specified or
+ // default value;
+ //
+ // when used as a setter, the DOM node
+ //
+ // example:
+ // | // get the current value of the "foo" property on a node
+ // | dojo.prop(dojo.byId("nodeId"), "foo");
+ // | // or we can just pass the id:
+ // | dojo.prop("nodeId", "foo");
+ //
+ // example:
+ // | // use prop() to set the tab index
+ // | dojo.prop("nodeId", "tabIndex", 3);
+ // |
+ //
+ // example:
+ // Set multiple values at once, including event handlers:
+ // | dojo.prop("formId", {
+ // | "foo": "bar",
+ // | "tabIndex": -1,
+ // | "method": "POST",
+ // | "onsubmit": function(e){
+ // | // stop submitting the form. Note that the IE behavior
+ // | // of returning true or false will have no effect here
+ // | // since our handler is connect()ed to the built-in
+ // | // onsubmit behavior and so we need to use
+ // | // dojo.stopEvent() to ensure that the submission
+ // | // doesn't proceed.
+ // | dojo.stopEvent(e);
+ // |
+ // | // submit the form with Ajax
+ // | dojo.xhrPost({ form: "formId" });
+ // | }
+ // | });
+ //
+ // example:
+ // Style is s special case: Only set with an object hash of styles
+ // | dojo.prop("someNode",{
+ // | id:"bar",
+ // | style:{
+ // | width:"200px", height:"100px", color:"#000"
+ // | }
+ // | });
+ //
+ // example:
+ // Again, only set style as an object hash of styles:
+ // | var obj = { color:"#fff", backgroundColor:"#000" };
+ // | dojo.prop("someNode", "style", obj);
+ // |
+ // | // though shorter to use `dojo.style()` in this case:
+ // | dojo.style("someNode", obj);
+
+ if(arguments.length == 2){
+ return prop[typeof name == "string" ? "get" : "set"](node, name);
+ }
+ // setter
+ return prop.set(node, name, value);
+ };
+
+ // mix-in dom-style
+ dojo.getStyle = style.get;
+ dojo.setStyle = style.set;
+ dojo.getComputedStyle = style.getComputedStyle;
+ dojo.__toPixelValue = dojo.toPixelValue = style.toPixelValue;
+
+ dojo.style = function(node, name, value){
+ // summary:
+ // Accesses styles on a node. If 2 arguments are
+ // passed, acts as a getter. If 3 arguments are passed, acts
+ // as a setter.
+ // description:
+ // Getting the style value uses the computed style for the node, so the value
+ // will be a calculated value, not just the immediate node.style value.
+ // Also when getting values, use specific style names,
+ // like "borderBottomWidth" instead of "border" since compound values like
+ // "border" are not necessarily reflected as expected.
+ // If you want to get node dimensions, use `dojo.marginBox()`,
+ // `dojo.contentBox()` or `dojo.position()`.
+ // node: DOMNode|String
+ // id or reference to node to get/set style for
+ // name: String?|Object?
+ // the style property to set in DOM-accessor format
+ // ("borderWidth", not "border-width") or an object with key/value
+ // pairs suitable for setting each property.
+ // value: String?
+ // If passed, sets value on the node for style, handling
+ // cross-browser concerns. When setting a pixel value,
+ // be sure to include "px" in the value. For instance, top: "200px".
+ // Otherwise, in some cases, some browsers will not apply the style.
+ // returns:
+ // when used as a getter, return the computed style of the node if passing in an ID or node,
+ // or return the normalized, computed value for the property when passing in a node and a style property
+ // example:
+ // Passing only an ID or node returns the computed style object of
+ // the node:
+ // | dojo.style("thinger");
+ // example:
+ // Passing a node and a style property returns the current
+ // normalized, computed value for that property:
+ // | dojo.style("thinger", "opacity"); // 1 by default
+ //
+ // example:
+ // Passing a node, a style property, and a value changes the
+ // current display of the node and returns the new computed value
+ // | dojo.style("thinger", "opacity", 0.5); // == 0.5
+ //
+ // example:
+ // Passing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node:
+ // | dojo.style("thinger", {
+ // | "opacity": 0.5,
+ // | "border": "3px solid black",
+ // | "height": "300px"
+ // | });
+ //
+ // example:
+ // When the CSS style property is hyphenated, the JavaScript property is camelCased.
+ // font-size becomes fontSize, and so on.
+ // | dojo.style("thinger",{
+ // | fontSize:"14pt",
+ // | letterSpacing:"1.2em"
+ // | });
+ //
+ // example:
+ // dojo.NodeList implements .style() using the same syntax, omitting the "node" parameter, calling
+ // dojo.style() on every element of the list. See: `dojo.query()` and `dojo.NodeList()`
+ // | dojo.query(".someClassName").style("visibility","hidden");
+ // | // or
+ // | dojo.query("#baz > div").style({
+ // | opacity:0.75,
+ // | fontSize:"13pt"
+ // | });
+
+ switch(arguments.length){
+ case 1:
+ return style.get(node);
+ case 2:
+ return style[typeof name == "string" ? "get" : "set"](node, name);
+ }
+ // setter
+ return style.set(node, name, value);
+ };
+
+ return dojo;
+});
diff --git a/lib/dojo/_base/json.js b/lib/dojo/_base/json.js
index 4267c225e..b644339f7 100644
--- a/lib/dojo/_base/json.js
+++ b/lib/dojo/_base/json.js
@@ -4,152 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.json"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.json"] = true;
-dojo.provide("dojo._base.json");
-
-
-dojo.fromJson = function(/*String*/ json){
- // summary:
- // Parses a [JSON](http://json.org) string to return a JavaScript object.
- // description:
- // Throws for invalid JSON strings, but it does not use a strict JSON parser. It
- // delegates to eval(). The content passed to this method must therefore come
- // from a trusted source.
- // json:
- // a string literal of a JSON item, for instance:
- // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'`
-
- return eval("(" + json + ")"); // Object
-};
-
-dojo._escapeString = function(/*String*/str){
- //summary:
- // Adds escape sequences for non-visual characters, double quote and
- // backslash and surrounds with double quotes to form a valid string
- // literal.
- return ('"' + str.replace(/(["\\])/g, '\\$1') + '"').
- replace(/[\f]/g, "\\f").replace(/[\b]/g, "\\b").replace(/[\n]/g, "\\n").
- replace(/[\t]/g, "\\t").replace(/[\r]/g, "\\r"); // string
-};
-
-dojo.toJsonIndentStr = "\t";
-dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _indentStr){
- // summary:
- // Returns a [JSON](http://json.org) serialization of an object.
- // description:
- // Returns a [JSON](http://json.org) serialization of an object.
- // Note that this doesn't check for infinite recursion, so don't do that!
- // it:
- // an object to be serialized. Objects may define their own
- // serialization via a special "__json__" or "json" function
- // property. If a specialized serializer has been defined, it will
- // be used as a fallback.
- // prettyPrint:
- // if true, we indent objects and arrays to make the output prettier.
- // The variable `dojo.toJsonIndentStr` is used as the indent string --
- // to use something other than the default (tab), change that variable
- // before calling dojo.toJson().
- // _indentStr:
- // private variable for recursive calls when pretty printing, do not use.
- // example:
- // simple serialization of a trivial object
- // | var jsonStr = dojo.toJson({ howdy: "stranger!", isStrange: true });
- // | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr);
- // example:
- // a custom serializer for an objects of a particular class:
- // | dojo.declare("Furby", null, {
- // | furbies: "are strange",
- // | furbyCount: 10,
- // | __json__: function(){
- // | },
- // | });
-
- if(it === undefined){
- return "undefined";
- }
- var objtype = typeof it;
- if(objtype == "number" || objtype == "boolean"){
- return it + "";
- }
- if(it === null){
- return "null";
- }
- if(dojo.isString(it)){
- return dojo._escapeString(it);
- }
- // recurse
- var recurse = arguments.callee;
- // short-circuit for objects that support "json" serialization
- // if they return "self" then just pass-through...
- var newObj;
- _indentStr = _indentStr || "";
- var nextIndent = prettyPrint ? _indentStr + dojo.toJsonIndentStr : "";
- var tf = it.__json__||it.json;
- if(dojo.isFunction(tf)){
- newObj = tf.call(it);
- if(it !== newObj){
- return recurse(newObj, prettyPrint, nextIndent);
- }
- }
- if(it.nodeType && it.cloneNode){ // isNode
- // we can't seriailize DOM nodes as regular objects because they have cycles
- // DOM nodes could be serialized with something like outerHTML, but
- // that can be provided by users in the form of .json or .__json__ function.
- throw new Error("Can't serialize DOM nodes");
- }
-
- var sep = prettyPrint ? " " : "";
- var newLine = prettyPrint ? "\n" : "";
-
- // array
- if(dojo.isArray(it)){
- var res = dojo.map(it, function(obj){
- var val = recurse(obj, prettyPrint, nextIndent);
- if(typeof val != "string"){
- val = "undefined";
- }
- return newLine + nextIndent + val;
- });
- return "[" + res.join("," + sep) + newLine + _indentStr + "]";
- }
- /*
- // look in the registry
- try {
- window.o = it;
- newObj = dojo.json.jsonRegistry.match(it);
- return recurse(newObj, prettyPrint, nextIndent);
- }catch(e){
- // console.log(e);
- }
- // it's a function with no adapter, skip it
- */
- if(objtype == "function"){
- return null; // null
- }
- // generic object code path
- var output = [], key;
- for(key in it){
- var keyStr, val;
- if(typeof key == "number"){
- keyStr = '"' + key + '"';
- }else if(typeof key == "string"){
- keyStr = dojo._escapeString(key);
- }else{
- // skip non-string or number keys
- continue;
- }
- val = recurse(it[key], prettyPrint, nextIndent);
- if(typeof val != "string"){
- // skip non-serializable values
- continue;
- }
- // FIXME: use += on Moz!!
- // MOW NOTE: using += is a pain because you have to account for the dangling comma...
- output.push(newLine + nextIndent + keyStr + ":" + sep + val);
- }
- return "{" + output.join("," + sep) + newLine + _indentStr + "}"; // String
-};
-
-}
+//>>built
+define("dojo/_base/json",["./kernel","../json"],function(_1,_2){_1.fromJson=function(js){return eval("("+js+")");};_1._escapeString=_2.stringify;_1.toJsonIndentStr="\t";_1.toJson=function(it,_3){return _2.stringify(it,function(_4,_5){if(_5){var tf=_5.__json__||_5.json;if(typeof tf=="function"){return tf.call(_5);}}return _5;},_3&&_1.toJsonIndentStr);};return _1;}); \ No newline at end of file
diff --git a/lib/dojo/_base/json.js.uncompressed.js b/lib/dojo/_base/json.js.uncompressed.js
new file mode 100644
index 000000000..b70d4ebb8
--- /dev/null
+++ b/lib/dojo/_base/json.js.uncompressed.js
@@ -0,0 +1,85 @@
+define("dojo/_base/json", ["./kernel", "../json"], function(dojo, json){
+ // module:
+ // dojo/_base/json
+ // summary:
+ // This module defines the dojo JSON API.
+
+dojo.fromJson = function(/*String*/ js){
+ // summary:
+ // Parses a JavaScript expression and returns a JavaScript value.
+ // description:
+ // Throws for invalid JavaScript expressions. It does not use a strict JSON parser. It
+ // always delegates to eval(). The content passed to this method must therefore come
+ // from a trusted source.
+ // It is recommend that you use dojo/json's parse function for an
+ // implementation uses the (faster) native JSON parse when available.
+ // js:
+ // a string literal of a JavaScript expression, for instance:
+ // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'`
+
+ return eval("(" + js + ")"); // Object
+};
+
+/*=====
+dojo._escapeString = function(){
+ // summary:
+ // Adds escape sequences for non-visual characters, double quote and
+ // backslash and surrounds with double quotes to form a valid string
+ // literal.
+};
+=====*/
+dojo._escapeString = json.stringify; // just delegate to json.stringify
+
+dojo.toJsonIndentStr = "\t";
+dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint){
+ // summary:
+ // Returns a [JSON](http://json.org) serialization of an object.
+ // description:
+ // Returns a [JSON](http://json.org) serialization of an object.
+ // Note that this doesn't check for infinite recursion, so don't do that!
+ // It is recommend that you use dojo/json's stringify function for an lighter
+ // and faster implementation that matches the native JSON API and uses the
+ // native JSON serializer when available.
+ // it:
+ // an object to be serialized. Objects may define their own
+ // serialization via a special "__json__" or "json" function
+ // property. If a specialized serializer has been defined, it will
+ // be used as a fallback.
+ // Note that in 1.6, toJson would serialize undefined, but this no longer supported
+ // since it is not supported by native JSON serializer.
+ // prettyPrint:
+ // if true, we indent objects and arrays to make the output prettier.
+ // The variable `dojo.toJsonIndentStr` is used as the indent string --
+ // to use something other than the default (tab), change that variable
+ // before calling dojo.toJson().
+ // Note that if native JSON support is available, it will be used for serialization,
+ // and native implementations vary on the exact spacing used in pretty printing.
+ // returns:
+ // A JSON string serialization of the passed-in object.
+ // example:
+ // simple serialization of a trivial object
+ // | var jsonStr = dojo.toJson({ howdy: "stranger!", isStrange: true });
+ // | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr);
+ // example:
+ // a custom serializer for an objects of a particular class:
+ // | dojo.declare("Furby", null, {
+ // | furbies: "are strange",
+ // | furbyCount: 10,
+ // | __json__: function(){
+ // | },
+ // | });
+
+ // use dojo/json
+ return json.stringify(it, function(key, value){
+ if(value){
+ var tf = value.__json__||value.json;
+ if(typeof tf == "function"){
+ return tf.call(value);
+ }
+ }
+ return value;
+ }, prettyPrint && dojo.toJsonIndentStr); // String
+};
+
+return dojo;
+});
diff --git a/lib/dojo/_base/kernel.js b/lib/dojo/_base/kernel.js
new file mode 100644
index 000000000..f574dadd2
--- /dev/null
+++ b/lib/dojo/_base/kernel.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/_base/kernel",["../has","./config","require","module"],function(_1,_2,_3,_4){var i,p,_5={},_6={},_7={config:_2,global:this,dijit:_5,dojox:_6};var _8={dojo:["dojo",_7],dijit:["dijit",_5],dojox:["dojox",_6]},_9=(_3.packs&&_3.packs[_4.id.match(/[^\/]+/)[0]].packageMap)||{},_a;for(p in _9){if(_8[p]){_8[p][0]=_9[p];}else{_8[p]=[_9[p],{}];}}for(p in _8){_a=_8[p];_a[1]._scopeName=_a[0];if(!_2.noGlobals){this[_a[0]]=_a[1];}}_7.scopeMap=_8;_7.baseUrl=_7.config.baseUrl=_3.baseUrl;_7.isAsync=!1||_3.async;_7.locale=_2.locale;var _b="$Rev: 28982 $".match(/\d+/);_7.version={major:1,minor:7,patch:3,flag:"",revision:_b?+_b[0]:NaN,toString:function(){var v=_7.version;return v.major+"."+v.minor+"."+v.patch+v.flag+" ("+v.revision+")";}};true||_1.add("extend-dojo",1);_7.eval=function(_c){};(Function("d","d.eval = function(){return d.global.eval ? d.global.eval(arguments[0]) : eval(arguments[0]);}"))(_7);if(0){_7.exit=function(_d){quit(_d);};}else{_7.exit=function(){};}true||_1.add("dojo-guarantee-console",1);if(1){typeof console!="undefined"||(console={});var cn=["assert","count","debug","dir","dirxml","error","group","groupEnd","info","profile","profileEnd","time","timeEnd","trace","warn","log"];var tn;i=0;while((tn=cn[i++])){if(!console[tn]){(function(){var _e=tn+"";console[_e]=("log" in console)?function(){var a=Array.apply({},arguments);a.unshift(_e+":");console["log"](a.join(" "));}:function(){};console[_e]._fake=true;})();}}}_1.add("dojo-debug-messages",!!_2.isDebug);if(_1("dojo-debug-messages")){_7.deprecated=function(_f,_10,_11){var _12="DEPRECATED: "+_f;if(_10){_12+=" "+_10;}if(_11){_12+=" -- will be removed in version: "+_11;}console.warn(_12);};_7.experimental=function(_13,_14){var _15="EXPERIMENTAL: "+_13+" -- APIs subject to change without notice.";if(_14){_15+=" "+_14;}console.warn(_15);};}else{_7.deprecated=_7.experimental=function(){};}true||_1.add("dojo-modulePaths",1);if(1){if(_2.modulePaths){_7.deprecated("dojo.modulePaths","use paths configuration");var _16={};for(p in _2.modulePaths){_16[p.replace(/\./g,"/")]=_2.modulePaths[p];}_3({paths:_16});}}true||_1.add("dojo-moduleUrl",1);if(1){_7.moduleUrl=function(_17,url){_7.deprecated("dojo.moduleUrl()","use require.toUrl","2.0");var _18=null;if(_17){_18=_3.toUrl(_17.replace(/\./g,"/")+(url?("/"+url):"")+"/*.*").replace(/\/\*\.\*/,"")+(url?"":"/");}return _18;};}_7._hasResource={};return _7;}); \ No newline at end of file
diff --git a/lib/dojo/_base/kernel.js.uncompressed.js b/lib/dojo/_base/kernel.js.uncompressed.js
new file mode 100644
index 000000000..30465dbb1
--- /dev/null
+++ b/lib/dojo/_base/kernel.js.uncompressed.js
@@ -0,0 +1,302 @@
+define("dojo/_base/kernel", ["../has", "./config", "require", "module"], function(has, config, require, module){
+ // module:
+ // dojo/_base/kernel
+ // summary:
+ // This module is the foundational module of the dojo boot sequence; it defines the dojo object.
+ var
+ // loop variables for this module
+ i, p,
+
+ // create dojo, dijit, and dojox
+ // FIXME: in 2.0 remove dijit, dojox being created by dojo
+ dijit = {},
+ dojox = {},
+ dojo = {
+ // notice dojo takes ownership of the value of the config module
+ config:config,
+ global:this,
+ dijit:dijit,
+ dojox:dojox
+ };
+
+
+ // Configure the scope map. For a 100% AMD application, the scope map is not needed other than to provide
+ // a _scopeName property for the dojo, dijit, and dojox root object so those packages can create
+ // unique names in the global space.
+ //
+ // Built, legacy modules use the scope map to allow those modules to be expressed as if dojo, dijit, and dojox,
+ // where global when in fact they are either global under different names or not global at all. In v1.6-, the
+ // config variable "scopeMap" was used to map names as used within a module to global names. This has been
+ // subsumed by the dojo packageMap configuration variable which relocates packages to different names. See
+ // http://livedocs.dojotoolkit.org/developer/design/loader#legacy-cross-domain-mode for details.
+ //
+ // The following computations contort the packageMap for this dojo instance into a scopeMap.
+ var scopeMap =
+ // a map from a name used in a legacy module to the (global variable name, object addressed by that name)
+ // always map dojo, dijit, and dojox
+ {
+ dojo:["dojo", dojo],
+ dijit:["dijit", dijit],
+ dojox:["dojox", dojox]
+ },
+
+ packageMap =
+ // the package map for this dojo instance; note, a foreign loader or no pacakgeMap results in the above default config
+ (require.packs && require.packs[module.id.match(/[^\/]+/)[0]].packageMap) || {},
+
+ item;
+
+ // process all mapped top-level names for this instance of dojo
+ for(p in packageMap){
+ if(scopeMap[p]){
+ // mapped dojo, dijit, or dojox
+ scopeMap[p][0] = packageMap[p];
+ }else{
+ // some other top-level name
+ scopeMap[p] = [packageMap[p], {}];
+ }
+ }
+
+ // publish those names to _scopeName and, optionally, the global namespace
+ for(p in scopeMap){
+ item = scopeMap[p];
+ item[1]._scopeName = item[0];
+ if(!config.noGlobals){
+ this[item[0]] = item[1];
+ }
+ }
+ dojo.scopeMap = scopeMap;
+
+ // FIXME: dojo.baseUrl and dojo.config.baseUrl should be deprecated
+ dojo.baseUrl = dojo.config.baseUrl = require.baseUrl;
+ dojo.isAsync = !1 || require.async;
+ dojo.locale = config.locale;
+
+ /*=====
+ dojo.version = function(){
+ // summary:
+ // Version number of the Dojo Toolkit
+ // major: Integer
+ // Major version. If total version is "1.2.0beta1", will be 1
+ // minor: Integer
+ // Minor version. If total version is "1.2.0beta1", will be 2
+ // patch: Integer
+ // Patch version. If total version is "1.2.0beta1", will be 0
+ // flag: String
+ // Descriptor flag. If total version is "1.2.0beta1", will be "beta1"
+ // revision: Number
+ // The SVN rev from which dojo was pulled
+ this.major = 0;
+ this.minor = 0;
+ this.patch = 0;
+ this.flag = "";
+ this.revision = 0;
+ }
+ =====*/
+ var rev = "$Rev: 28982 $".match(/\d+/);
+ dojo.version = {
+ major: 1, minor: 7, patch: 3, flag: "",
+ revision: rev ? +rev[0] : NaN,
+ toString: function(){
+ var v = dojo.version;
+ return v.major + "." + v.minor + "." + v.patch + v.flag + " (" + v.revision + ")"; // String
+ }
+ };
+
+
+ // If 1 is truthy, then as a dojo module is defined it should push it's definitions
+ // into the dojo object, and conversely. In 2.0, it will likely be unusual to augment another object
+ // as a result of defining a module. This has feature gives a way to force 2.0 behavior as the code
+ // is migrated. Absent specific advice otherwise, set extend-dojo to truthy.
+ true || has.add("extend-dojo", 1);
+
+
+ dojo.eval = function(scriptText){
+ // summary:
+ // A legacy method created for use exclusively by internal Dojo methods. Do not use this method
+ // directly unless you understand its possibly-different implications on the platforms your are targeting.
+ // description:
+ // Makes an attempt to evaluate scriptText in the global scope. The function works correctly for browsers
+ // that support indirect eval.
+ //
+ // As usual, IE does not. On IE, the only way to implement global eval is to
+ // use execScript. Unfortunately, execScript does not return a value and breaks some current usages of dojo.eval.
+ // This implementation uses the technique of executing eval in the scope of a function that is a single scope
+ // frame below the global scope; thereby coming close to the global scope. Note carefully that
+ //
+ // dojo.eval("var pi = 3.14;");
+ //
+ // will define global pi in non-IE environments, but define pi only in a temporary local scope for IE. If you want
+ // to define a global variable using dojo.eval, write something like
+ //
+ // dojo.eval("window.pi = 3.14;")
+ // scriptText:
+ // The text to evaluation.
+ // returns:
+ // The result of the evaluation. Often `undefined`
+ };
+
+ (Function("d", "d.eval = function(){return d.global.eval ? d.global.eval(arguments[0]) : eval(arguments[0]);}"))(dojo);
+
+
+ if(0){
+ dojo.exit = function(exitcode){
+ quit(exitcode);
+ };
+ } else{
+ dojo.exit = function(){
+ };
+ }
+
+ true || has.add("dojo-guarantee-console",
+ // ensure that console.log, console.warn, etc. are defined
+ 1
+ );
+ if(1){
+ typeof console != "undefined" || (console = {});
+ // Be careful to leave 'log' always at the end
+ var cn = [
+ "assert", "count", "debug", "dir", "dirxml", "error", "group",
+ "groupEnd", "info", "profile", "profileEnd", "time", "timeEnd",
+ "trace", "warn", "log"
+ ];
+ var tn;
+ i = 0;
+ while((tn = cn[i++])){
+ if(!console[tn]){
+ (function(){
+ var tcn = tn + "";
+ console[tcn] = ('log' in console) ? function(){
+ var a = Array.apply({}, arguments);
+ a.unshift(tcn + ":");
+ console["log"](a.join(" "));
+ } : function(){};
+ console[tcn]._fake = true;
+ })();
+ }
+ }
+ }
+
+ has.add("dojo-debug-messages",
+ // include dojo.deprecated/dojo.experimental implementations
+ !!config.isDebug
+ );
+ if(has("dojo-debug-messages")){
+ dojo.deprecated = function(/*String*/ behaviour, /*String?*/ extra, /*String?*/ removal){
+ // summary:
+ // Log a debug message to indicate that a behavior has been
+ // deprecated.
+ // behaviour: String
+ // The API or behavior being deprecated. Usually in the form
+ // of "myApp.someFunction()".
+ // extra: String?
+ // Text to append to the message. Often provides advice on a
+ // new function or facility to achieve the same goal during
+ // the deprecation period.
+ // removal: String?
+ // Text to indicate when in the future the behavior will be
+ // removed. Usually a version number.
+ // example:
+ // | dojo.deprecated("myApp.getTemp()", "use myApp.getLocaleTemp() instead", "1.0");
+
+ var message = "DEPRECATED: " + behaviour;
+ if(extra){ message += " " + extra; }
+ if(removal){ message += " -- will be removed in version: " + removal; }
+ console.warn(message);
+ };
+
+ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
+ // summary: Marks code as experimental.
+ // description:
+ // This can be used to mark a function, file, or module as
+ // experimental. Experimental code is not ready to be used, and the
+ // APIs are subject to change without notice. Experimental code may be
+ // completed deleted without going through the normal deprecation
+ // process.
+ // moduleName: String
+ // The name of a module, or the name of a module file or a specific
+ // function
+ // extra: String?
+ // some additional message for the user
+ // example:
+ // | dojo.experimental("dojo.data.Result");
+ // example:
+ // | dojo.experimental("dojo.weather.toKelvin()", "PENDING approval from NOAA");
+
+ var message = "EXPERIMENTAL: " + moduleName + " -- APIs subject to change without notice.";
+ if(extra){ message += " " + extra; }
+ console.warn(message);
+ };
+ }else{
+ dojo.deprecated = dojo.experimental = function(){};
+ }
+
+ true || has.add("dojo-modulePaths",
+ // consume dojo.modulePaths processing
+ 1
+ );
+ if(1){
+ // notice that modulePaths won't be applied to any require's before the dojo/_base/kernel factory is run;
+ // this is the v1.6- behavior.
+ if(config.modulePaths){
+ dojo.deprecated("dojo.modulePaths", "use paths configuration");
+ var paths = {};
+ for(p in config.modulePaths){
+ paths[p.replace(/\./g, "/")] = config.modulePaths[p];
+ }
+ require({paths:paths});
+ }
+ }
+
+ true || has.add("dojo-moduleUrl",
+ // include dojo.moduleUrl
+ 1
+ );
+ if(1){
+ dojo.moduleUrl = function(/*String*/module, /*String?*/url){
+ // summary:
+ // Returns a URL relative to a module.
+ // example:
+ // | var pngPath = dojo.moduleUrl("acme","images/small.png");
+ // | console.dir(pngPath); // list the object properties
+ // | // create an image and set it's source to pngPath's value:
+ // | var img = document.createElement("img");
+ // | img.src = pngPath;
+ // | // add our image to the document
+ // | dojo.body().appendChild(img);
+ // example:
+ // you may de-reference as far as you like down the package
+ // hierarchy. This is sometimes handy to avoid lenghty relative
+ // urls or for building portable sub-packages. In this example,
+ // the `acme.widget` and `acme.util` directories may be located
+ // under different roots (see `dojo.registerModulePath`) but the
+ // the modules which reference them can be unaware of their
+ // relative locations on the filesystem:
+ // | // somewhere in a configuration block
+ // | dojo.registerModulePath("acme.widget", "../../acme/widget");
+ // | dojo.registerModulePath("acme.util", "../../util");
+ // |
+ // | // ...
+ // |
+ // | // code in a module using acme resources
+ // | var tmpltPath = dojo.moduleUrl("acme.widget","templates/template.html");
+ // | var dataPath = dojo.moduleUrl("acme.util","resources/data.json");
+
+ dojo.deprecated("dojo.moduleUrl()", "use require.toUrl", "2.0");
+
+ // require.toUrl requires a filetype; therefore, just append the suffix "/*.*" to guarantee a filetype, then
+ // remove the suffix from the result. This way clients can request a url w/out a filetype. This should be
+ // rare, but it maintains backcompat for the v1.x line (note: dojo.moduleUrl will be removed in v2.0).
+ // Notice * is an illegal filename so it won't conflict with any real path map that may exist the paths config.
+ var result = null;
+ if(module){
+ result = require.toUrl(module.replace(/\./g, "/") + (url ? ("/" + url) : "") + "/*.*").replace(/\/\*\.\*/, "") + (url ? "" : "/");
+ }
+ return result;
+ };
+ }
+
+ dojo._hasResource = {}; // for backward compatibility with layers built with 1.6 tooling
+
+ return dojo;
+});
diff --git a/lib/dojo/_base/lang.js b/lib/dojo/_base/lang.js
index 9061de01e..bc88c7cde 100644
--- a/lib/dojo/_base/lang.js
+++ b/lib/dojo/_base/lang.js
@@ -4,394 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.lang"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.lang"] = true;
-dojo.provide("dojo._base.lang");
-
-
-(function(){
- var d = dojo, opts = Object.prototype.toString;
-
- // Crockford (ish) functions
-
- dojo.isString = function(/*anything*/ it){
- // summary:
- // Return true if it is a String
- return (typeof it == "string" || it instanceof String); // Boolean
- };
-
- dojo.isArray = function(/*anything*/ it){
- // summary:
- // Return true if it is an Array.
- // Does not work on Arrays created in other windows.
- return it && (it instanceof Array || typeof it == "array"); // Boolean
- };
-
- dojo.isFunction = function(/*anything*/ it){
- // summary:
- // Return true if it is a Function
- return opts.call(it) === "[object Function]";
- };
-
- dojo.isObject = function(/*anything*/ it){
- // summary:
- // Returns true if it is a JavaScript object (or an Array, a Function
- // or null)
- return it !== undefined &&
- (it === null || typeof it == "object" || d.isArray(it) || d.isFunction(it)); // Boolean
- };
-
- dojo.isArrayLike = function(/*anything*/ it){
- // summary:
- // similar to dojo.isArray() but more permissive
- // description:
- // Doesn't strongly test for "arrayness". Instead, settles for "isn't
- // a string or number and has a length property". Arguments objects
- // and DOM collections will return true when passed to
- // dojo.isArrayLike(), but will return false when passed to
- // dojo.isArray().
- // returns:
- // If it walks like a duck and quacks like a duck, return `true`
- return it && it !== undefined && // Boolean
- // keep out built-in constructors (Number, String, ...) which have length
- // properties
- !d.isString(it) && !d.isFunction(it) &&
- !(it.tagName && it.tagName.toLowerCase() == 'form') &&
- (d.isArray(it) || isFinite(it.length));
- };
-
- dojo.isAlien = function(/*anything*/ it){
- // summary:
- // Returns true if it is a built-in function or some other kind of
- // oddball that *should* report as a function but doesn't
- return it && !d.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean
- };
-
- dojo.extend = function(/*Object*/ constructor, /*Object...*/ props){
- // summary:
- // Adds all properties and methods of props to constructor's
- // prototype, making them available to all instances created with
- // constructor.
- for(var i=1, l=arguments.length; i<l; i++){
- d._mixin(constructor.prototype, arguments[i]);
- }
- return constructor; // Object
- };
-
- dojo._hitchArgs = function(scope, method /*,...*/){
- var pre = d._toArray(arguments, 2);
- var named = d.isString(method);
- return function(){
- // arrayify arguments
- var args = d._toArray(arguments);
- // locate our method
- var f = named ? (scope||d.global)[method] : method;
- // invoke with collected args
- return f && f.apply(scope || this, pre.concat(args)); // mixed
- }; // Function
- };
-
- dojo.hitch = function(/*Object*/scope, /*Function|String*/method /*,...*/){
- // summary:
- // Returns a function that will only ever execute in the a given scope.
- // This allows for easy use of object member functions
- // in callbacks and other places in which the "this" keyword may
- // otherwise not reference the expected scope.
- // Any number of default positional arguments may be passed as parameters
- // beyond "method".
- // Each of these values will be used to "placehold" (similar to curry)
- // for the hitched function.
- // scope:
- // The scope to use when method executes. If method is a string,
- // scope is also the object containing method.
- // method:
- // A function to be hitched to scope, or the name of the method in
- // scope to be hitched.
- // example:
- // | dojo.hitch(foo, "bar")();
- // runs foo.bar() in the scope of foo
- // example:
- // | dojo.hitch(foo, myFunction);
- // returns a function that runs myFunction in the scope of foo
- // example:
- // Expansion on the default positional arguments passed along from
- // hitch. Passed args are mixed first, additional args after.
- // | var foo = { bar: function(a, b, c){ console.log(a, b, c); } };
- // | var fn = dojo.hitch(foo, "bar", 1, 2);
- // | fn(3); // logs "1, 2, 3"
- // example:
- // | var foo = { bar: 2 };
- // | dojo.hitch(foo, function(){ this.bar = 10; })();
- // execute an anonymous function in scope of foo
-
- if(arguments.length > 2){
- return d._hitchArgs.apply(d, arguments); // Function
- }
- if(!method){
- method = scope;
- scope = null;
- }
- if(d.isString(method)){
- scope = scope || d.global;
- if(!scope[method]){ throw(['dojo.hitch: scope["', method, '"] is null (scope="', scope, '")'].join('')); }
- return function(){ return scope[method].apply(scope, arguments || []); }; // Function
- }
- return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function
- };
-
- /*=====
- dojo.delegate = function(obj, props){
- // summary:
- // Returns a new object which "looks" to obj for properties which it
- // does not have a value for. Optionally takes a bag of properties to
- // seed the returned object with initially.
- // description:
- // This is a small implementaton of the Boodman/Crockford delegation
- // pattern in JavaScript. An intermediate object constructor mediates
- // the prototype chain for the returned object, using it to delegate
- // down to obj for property lookup when object-local lookup fails.
- // This can be thought of similarly to ES4's "wrap", save that it does
- // not act on types but rather on pure objects.
- // obj:
- // The object to delegate to for properties not found directly on the
- // return object or in props.
- // props:
- // an object containing properties to assign to the returned object
- // returns:
- // an Object of anonymous type
- // example:
- // | var foo = { bar: "baz" };
- // | var thinger = dojo.delegate(foo, { thud: "xyzzy"});
- // | thinger.bar == "baz"; // delegated to foo
- // | foo.thud == undefined; // by definition
- // | thinger.thud == "xyzzy"; // mixed in from props
- // | foo.bar = "thonk";
- // | thinger.bar == "thonk"; // still delegated to foo's bar
- }
- =====*/
-
- dojo.delegate = dojo._delegate = (function(){
- // boodman/crockford delegation w/ cornford optimization
- function TMP(){}
- return function(obj, props){
- TMP.prototype = obj;
- var tmp = new TMP();
- TMP.prototype = null;
- if(props){
- d._mixin(tmp, props);
- }
- return tmp; // Object
- };
- })();
-
- /*=====
- dojo._toArray = function(obj, offset, startWith){
- // summary:
- // Converts an array-like object (i.e. arguments, DOMCollection) to an
- // array. Returns a new Array with the elements of obj.
- // obj: Object
- // the object to "arrayify". We expect the object to have, at a
- // minimum, a length property which corresponds to integer-indexed
- // properties.
- // offset: Number?
- // the location in obj to start iterating from. Defaults to 0.
- // Optional.
- // startWith: Array?
- // An array to pack with the properties of obj. If provided,
- // properties in obj are appended at the end of startWith and
- // startWith is the returned array.
- }
- =====*/
-
- var efficient = function(obj, offset, startWith){
- return (startWith||[]).concat(Array.prototype.slice.call(obj, offset||0));
- };
-
- var slow = function(obj, offset, startWith){
- var arr = startWith||[];
- for(var x = offset || 0; x < obj.length; x++){
- arr.push(obj[x]);
- }
- return arr;
- };
-
- dojo._toArray =
- d.isIE ? function(obj){
- return ((obj.item) ? slow : efficient).apply(this, arguments);
- } :
- efficient;
-
- dojo.partial = function(/*Function|String*/method /*, ...*/){
- // summary:
- // similar to hitch() except that the scope object is left to be
- // whatever the execution context eventually becomes.
- // description:
- // Calling dojo.partial is the functional equivalent of calling:
- // | dojo.hitch(null, funcName, ...);
- var arr = [ null ];
- return d.hitch.apply(d, arr.concat(d._toArray(arguments))); // Function
- };
-
- var extraNames = d._extraNames, extraLen = extraNames.length, empty = {};
-
- dojo.clone = function(/*anything*/ o){
- // summary:
- // Clones objects (including DOM nodes) and all children.
- // Warning: do not clone cyclic structures.
- if(!o || typeof o != "object" || d.isFunction(o)){
- // null, undefined, any non-object, or function
- return o; // anything
- }
- if(o.nodeType && "cloneNode" in o){
- // DOM Node
- return o.cloneNode(true); // Node
- }
- if(o instanceof Date){
- // Date
- return new Date(o.getTime()); // Date
- }
- if(o instanceof RegExp){
- // RegExp
- return new RegExp(o); // RegExp
- }
- var r, i, l, s, name;
- if(d.isArray(o)){
- // array
- r = [];
- for(i = 0, l = o.length; i < l; ++i){
- if(i in o){
- r.push(d.clone(o[i]));
- }
- }
-// we don't clone functions for performance reasons
-// }else if(d.isFunction(o)){
-// // function
-// r = function(){ return o.apply(this, arguments); };
- }else{
- // generic objects
- r = o.constructor ? new o.constructor() : {};
- }
- for(name in o){
- // the "tobj" condition avoid copying properties in "source"
- // inherited from Object.prototype. For example, if target has a custom
- // toString() method, don't overwrite it with the toString() method
- // that source inherited from Object.prototype
- s = o[name];
- if(!(name in r) || (r[name] !== s && (!(name in empty) || empty[name] !== s))){
- r[name] = d.clone(s);
- }
- }
- // IE doesn't recognize some custom functions in for..in
- if(extraLen){
- for(i = 0; i < extraLen; ++i){
- name = extraNames[i];
- s = o[name];
- if(!(name in r) || (r[name] !== s && (!(name in empty) || empty[name] !== s))){
- r[name] = s; // functions only, we don't clone them
- }
- }
- }
- return r; // Object
- };
-
- /*=====
- dojo.trim = function(str){
- // summary:
- // Trims whitespace from both sides of the string
- // str: String
- // String to be trimmed
- // returns: String
- // Returns the trimmed string
- // description:
- // This version of trim() was selected for inclusion into the base due
- // to its compact size and relatively good performance
- // (see [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript)
- // Uses String.prototype.trim instead, if available.
- // The fastest but longest version of this function is located at
- // dojo.string.trim()
- return ""; // String
- }
- =====*/
-
- dojo.trim = String.prototype.trim ?
- function(str){ return str.trim(); } :
- function(str){ return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); };
-
- /*=====
- dojo.replace = function(tmpl, map, pattern){
- // summary:
- // Performs parameterized substitutions on a string. Throws an
- // exception if any parameter is unmatched.
- // tmpl: String
- // String to be used as a template.
- // map: Object|Function
- // If an object, it is used as a dictionary to look up substitutions.
- // If a function, it is called for every substitution with following
- // parameters: a whole match, a name, an offset, and the whole template
- // string (see https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace
- // for more details).
- // pattern: RegEx?
- // Optional regular expression objects that overrides the default pattern.
- // Must be global and match one item. The default is: /\{([^\}]+)\}/g,
- // which matches patterns like that: "{xxx}", where "xxx" is any sequence
- // of characters, which doesn't include "}".
- // returns: String
- // Returns the substituted string.
- // example:
- // | // uses a dictionary for substitutions:
- // | dojo.replace("Hello, {name.first} {name.last} AKA {nick}!",
- // | {
- // | nick: "Bob",
- // | name: {
- // | first: "Robert",
- // | middle: "X",
- // | last: "Cringely"
- // | }
- // | });
- // | // returns: Hello, Robert Cringely AKA Bob!
- // example:
- // | // uses an array for substitutions:
- // | dojo.replace("Hello, {0} {2}!",
- // | ["Robert", "X", "Cringely"]);
- // | // returns: Hello, Robert Cringely!
- // example:
- // | // uses a function for substitutions:
- // | function sum(a){
- // | var t = 0;
- // | dojo.forEach(a, function(x){ t += x; });
- // | return t;
- // | }
- // | dojo.replace(
- // | "{count} payments averaging {avg} USD per payment.",
- // | dojo.hitch(
- // | { payments: [11, 16, 12] },
- // | function(_, key){
- // | switch(key){
- // | case "count": return this.payments.length;
- // | case "min": return Math.min.apply(Math, this.payments);
- // | case "max": return Math.max.apply(Math, this.payments);
- // | case "sum": return sum(this.payments);
- // | case "avg": return sum(this.payments) / this.payments.length;
- // | }
- // | }
- // | )
- // | );
- // | // prints: 3 payments averaging 13 USD per payment.
- // example:
- // | // uses an alternative PHP-like pattern for substitutions:
- // | dojo.replace("Hello, ${0} ${2}!",
- // | ["Robert", "X", "Cringely"], /\$\{([^\}]+)\}/g);
- // | // returns: Hello, Robert Cringely!
- return ""; // String
- }
- =====*/
-
- var _pattern = /\{([^\}]+)\}/g;
- dojo.replace = function(tmpl, map, pattern){
- return tmpl.replace(pattern || _pattern, d.isFunction(map) ?
- map : function(_, k){ return d.getObject(k, false, map); });
- };
-})();
-
-}
+//>>built
+define("dojo/_base/lang",["./kernel","../has","./sniff"],function(_1,_2){_2.add("bug-for-in-skips-shadowed",function(){for(var i in {toString:1}){return 0;}return 1;});var _3=_2("bug-for-in-skips-shadowed")?"hasOwnProperty.valueOf.isPrototypeOf.propertyIsEnumerable.toLocaleString.toString.constructor".split("."):[],_4=_3.length,_5=function(_6,_7,_8){var _9,s,i,_a={};for(_9 in _7){s=_7[_9];if(!(_9 in _6)||(_6[_9]!==s&&(!(_9 in _a)||_a[_9]!==s))){_6[_9]=_8?_8(s):s;}}if(_2("bug-for-in-skips-shadowed")){if(_7){for(i=0;i<_4;++i){_9=_3[i];s=_7[_9];if(!(_9 in _6)||(_6[_9]!==s&&(!(_9 in _a)||_a[_9]!==s))){_6[_9]=_8?_8(s):s;}}}}return _6;},_b=function(_c,_d){if(!_c){_c={};}for(var i=1,l=arguments.length;i<l;i++){_e._mixin(_c,arguments[i]);}return _c;},_f=function(_10,_11,_12){var p,i=0,_13=_1.global;if(!_12){if(!_10.length){return _13;}else{p=_10[i++];try{_12=_1.scopeMap[p]&&_1.scopeMap[p][1];}catch(e){}_12=_12||(p in _13?_13[p]:(_11?_13[p]={}:undefined));}}while(_12&&(p=_10[i++])){_12=(p in _12?_12[p]:(_11?_12[p]={}:undefined));}return _12;},_14=function(_15,_16,_17){var _18=_15.split("."),p=_18.pop(),obj=_f(_18,true,_17);return obj&&p?(obj[p]=_16):undefined;},_19=function(_1a,_1b,_1c){return _f(_1a.split("."),_1b,_1c);},_1d=function(_1e,obj){return _e.getObject(_1e,false,obj)!==undefined;},_1f=Object.prototype.toString,_20=function(it){return (typeof it=="string"||it instanceof String);},_21=function(it){return it&&(it instanceof Array||typeof it=="array");},_22=function(it){return _1f.call(it)==="[object Function]";},_23=function(it){return it!==undefined&&(it===null||typeof it=="object"||_e.isArray(it)||_e.isFunction(it));},_24=function(it){return it&&it!==undefined&&!_e.isString(it)&&!_e.isFunction(it)&&!(it.tagName&&it.tagName.toLowerCase()=="form")&&(_e.isArray(it)||isFinite(it.length));},_25=function(it){return it&&!_e.isFunction(it)&&/\{\s*\[native code\]\s*\}/.test(String(it));},_26=function(_27,_28){for(var i=1,l=arguments.length;i<l;i++){_e._mixin(_27.prototype,arguments[i]);}return _27;},_29=function(_2a,_2b){var pre=_2c(arguments,2);var _2d=_e.isString(_2b);return function(){var _2e=_2c(arguments);var f=_2d?(_2a||_1.global)[_2b]:_2b;return f&&f.apply(_2a||this,pre.concat(_2e));};},_2f=function(_30,_31){if(arguments.length>2){return _e._hitchArgs.apply(_1,arguments);}if(!_31){_31=_30;_30=null;}if(_e.isString(_31)){_30=_30||_1.global;if(!_30[_31]){throw (["dojo.hitch: scope[\"",_31,"\"] is null (scope=\"",_30,"\")"].join(""));}return function(){return _30[_31].apply(_30,arguments||[]);};}return !_30?_31:function(){return _31.apply(_30,arguments||[]);};},_32=(function(){function TMP(){};return function(obj,_33){TMP.prototype=obj;var tmp=new TMP();TMP.prototype=null;if(_33){_e._mixin(tmp,_33);}return tmp;};})(),_34=function(obj,_35,_36){return (_36||[]).concat(Array.prototype.slice.call(obj,_35||0));},_2c=_2("ie")?(function(){function _37(obj,_38,_39){var arr=_39||[];for(var x=_38||0;x<obj.length;x++){arr.push(obj[x]);}return arr;};return function(obj){return ((obj.item)?_37:_34).apply(this,arguments);};})():_34,_3a=function(_3b){var arr=[null];return _e.hitch.apply(_1,arr.concat(_e._toArray(arguments)));},_3c=function(src){if(!src||typeof src!="object"||_e.isFunction(src)){return src;}if(src.nodeType&&"cloneNode" in src){return src.cloneNode(true);}if(src instanceof Date){return new Date(src.getTime());}if(src instanceof RegExp){return new RegExp(src);}var r,i,l;if(_e.isArray(src)){r=[];for(i=0,l=src.length;i<l;++i){if(i in src){r.push(_3c(src[i]));}}}else{r=src.constructor?new src.constructor():{};}return _e._mixin(r,src,_3c);},_3d=String.prototype.trim?function(str){return str.trim();}:function(str){return str.replace(/^\s\s*/,"").replace(/\s\s*$/,"");},_3e=/\{([^\}]+)\}/g,_3f=function(_40,map,_41){return _40.replace(_41||_3e,_e.isFunction(map)?map:function(_42,k){return _19(k,false,map);});},_e={_extraNames:_3,_mixin:_5,mixin:_b,setObject:_14,getObject:_19,exists:_1d,isString:_20,isArray:_21,isFunction:_22,isObject:_23,isArrayLike:_24,isAlien:_25,extend:_26,_hitchArgs:_29,hitch:_2f,delegate:_32,_toArray:_2c,partial:_3a,clone:_3c,trim:_3d,replace:_3f};1&&_b(_1,_e);return _e;}); \ No newline at end of file
diff --git a/lib/dojo/_base/lang.js.uncompressed.js b/lib/dojo/_base/lang.js.uncompressed.js
new file mode 100644
index 000000000..503606040
--- /dev/null
+++ b/lib/dojo/_base/lang.js.uncompressed.js
@@ -0,0 +1,707 @@
+define("dojo/_base/lang", ["./kernel", "../has", "./sniff"], function(dojo, has){
+ // module:
+ // dojo/_base/lang
+ // summary:
+ // This module defines Javascript language extensions.
+
+ has.add("bug-for-in-skips-shadowed", function(){
+ // if true, the for-in interator skips object properties that exist in Object's prototype (IE 6 - ?)
+ for(var i in {toString: 1}){
+ return 0;
+ }
+ return 1;
+ });
+
+ var _extraNames =
+ has("bug-for-in-skips-shadowed") ?
+ "hasOwnProperty.valueOf.isPrototypeOf.propertyIsEnumerable.toLocaleString.toString.constructor".split(".") : [],
+
+ _extraLen = _extraNames.length,
+
+ _mixin = function(dest, source, copyFunc){
+ var name, s, i, empty = {};
+ for(name in source){
+ // the (!(name in empty) || empty[name] !== s) condition avoids copying properties in "source"
+ // inherited from Object.prototype. For example, if dest has a custom toString() method,
+ // don't overwrite it with the toString() method that source inherited from Object.prototype
+ s = source[name];
+ if(!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))){
+ dest[name] = copyFunc ? copyFunc(s) : s;
+ }
+ }
+
+ if(has("bug-for-in-skips-shadowed")){
+ if(source){
+ for(i = 0; i < _extraLen; ++i){
+ name = _extraNames[i];
+ s = source[name];
+ if(!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))){
+ dest[name] = copyFunc ? copyFunc(s) : s;
+ }
+ }
+ }
+ }
+
+ return dest; // Object
+ },
+
+ mixin = function(dest, sources){
+ if(!dest){ dest = {}; }
+ for(var i = 1, l = arguments.length; i < l; i++){
+ lang._mixin(dest, arguments[i]);
+ }
+ return dest; // Object
+ },
+
+ getProp = function(/*Array*/parts, /*Boolean*/create, /*Object*/context){
+ var p, i = 0, dojoGlobal = dojo.global;
+ if(!context){
+ if(!parts.length){
+ return dojoGlobal;
+ }else{
+ p = parts[i++];
+ try{
+ context = dojo.scopeMap[p] && dojo.scopeMap[p][1];
+ }catch(e){}
+ context = context || (p in dojoGlobal ? dojoGlobal[p] : (create ? dojoGlobal[p] = {} : undefined));
+ }
+ }
+ while(context && (p = parts[i++])){
+ context = (p in context ? context[p] : (create ? context[p] = {} : undefined));
+ }
+ return context; // mixed
+ },
+
+ setObject = function(name, value, context){
+ var parts = name.split("."), p = parts.pop(), obj = getProp(parts, true, context);
+ return obj && p ? (obj[p] = value) : undefined; // Object
+ },
+
+ getObject = function(name, create, context){
+ return getProp(name.split("."), create, context); // Object
+ },
+
+ exists = function(name, obj){
+ return lang.getObject(name, false, obj) !== undefined; // Boolean
+ },
+
+ opts = Object.prototype.toString,
+
+ // Crockford (ish) functions
+
+ isString = function(it){
+ return (typeof it == "string" || it instanceof String); // Boolean
+ },
+
+ isArray = function(it){
+ return it && (it instanceof Array || typeof it == "array"); // Boolean
+ },
+
+ isFunction = function(it){
+ return opts.call(it) === "[object Function]";
+ },
+
+ isObject = function(it){
+ return it !== undefined &&
+ (it === null || typeof it == "object" || lang.isArray(it) || lang.isFunction(it)); // Boolean
+ },
+
+ isArrayLike = function(it){
+ return it && it !== undefined && // Boolean
+ // keep out built-in constructors (Number, String, ...) which have length
+ // properties
+ !lang.isString(it) && !lang.isFunction(it) &&
+ !(it.tagName && it.tagName.toLowerCase() == 'form') &&
+ (lang.isArray(it) || isFinite(it.length));
+ },
+
+ isAlien = function(it){
+ return it && !lang.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean
+ },
+
+ extend = function(constructor, props){
+ for(var i=1, l=arguments.length; i<l; i++){
+ lang._mixin(constructor.prototype, arguments[i]);
+ }
+ return constructor; // Object
+ },
+
+ _hitchArgs = function(scope, method){
+ var pre = _toArray(arguments, 2);
+ var named = lang.isString(method);
+ return function(){
+ // arrayify arguments
+ var args = _toArray(arguments);
+ // locate our method
+ var f = named ? (scope||dojo.global)[method] : method;
+ // invoke with collected args
+ return f && f.apply(scope || this, pre.concat(args)); // mixed
+ }; // Function
+ },
+
+ hitch = function(scope, method){
+ if(arguments.length > 2){
+ return lang._hitchArgs.apply(dojo, arguments); // Function
+ }
+ if(!method){
+ method = scope;
+ scope = null;
+ }
+ if(lang.isString(method)){
+ scope = scope || dojo.global;
+ if(!scope[method]){ throw(['dojo.hitch: scope["', method, '"] is null (scope="', scope, '")'].join('')); }
+ return function(){ return scope[method].apply(scope, arguments || []); }; // Function
+ }
+ return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function
+ },
+
+ delegate = (function(){
+ // boodman/crockford delegation w/ cornford optimization
+ function TMP(){}
+ return function(obj, props){
+ TMP.prototype = obj;
+ var tmp = new TMP();
+ TMP.prototype = null;
+ if(props){
+ lang._mixin(tmp, props);
+ }
+ return tmp; // Object
+ };
+ })(),
+
+ efficient = function(obj, offset, startWith){
+ return (startWith||[]).concat(Array.prototype.slice.call(obj, offset||0));
+ },
+
+ _toArray =
+ has("ie") ?
+ (function(){
+ function slow(obj, offset, startWith){
+ var arr = startWith||[];
+ for(var x = offset || 0; x < obj.length; x++){
+ arr.push(obj[x]);
+ }
+ return arr;
+ }
+ return function(obj){
+ return ((obj.item) ? slow : efficient).apply(this, arguments);
+ };
+ })() : efficient,
+
+ partial = function(/*Function|String*/method /*, ...*/){
+ var arr = [ null ];
+ return lang.hitch.apply(dojo, arr.concat(lang._toArray(arguments))); // Function
+ },
+
+ clone = function(/*anything*/ src){
+ if(!src || typeof src != "object" || lang.isFunction(src)){
+ // null, undefined, any non-object, or function
+ return src; // anything
+ }
+ if(src.nodeType && "cloneNode" in src){
+ // DOM Node
+ return src.cloneNode(true); // Node
+ }
+ if(src instanceof Date){
+ // Date
+ return new Date(src.getTime()); // Date
+ }
+ if(src instanceof RegExp){
+ // RegExp
+ return new RegExp(src); // RegExp
+ }
+ var r, i, l;
+ if(lang.isArray(src)){
+ // array
+ r = [];
+ for(i = 0, l = src.length; i < l; ++i){
+ if(i in src){
+ r.push(clone(src[i]));
+ }
+ }
+ // we don't clone functions for performance reasons
+ // }else if(d.isFunction(src)){
+ // // function
+ // r = function(){ return src.apply(this, arguments); };
+ }else{
+ // generic objects
+ r = src.constructor ? new src.constructor() : {};
+ }
+ return lang._mixin(r, src, clone);
+ },
+
+
+ trim = String.prototype.trim ?
+ function(str){ return str.trim(); } :
+ function(str){ return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); },
+
+
+ _pattern = /\{([^\}]+)\}/g,
+
+ replace = function(tmpl, map, pattern){
+ return tmpl.replace(pattern || _pattern, lang.isFunction(map) ?
+ map : function(_, k){ return getObject(k, false, map); });
+ },
+
+ lang = {
+ _extraNames:_extraNames,
+ _mixin:_mixin,
+ mixin:mixin,
+ setObject:setObject,
+ getObject:getObject,
+ exists:exists,
+ isString:isString,
+ isArray:isArray,
+ isFunction:isFunction,
+ isObject:isObject,
+ isArrayLike:isArrayLike,
+ isAlien:isAlien,
+ extend:extend,
+ _hitchArgs:_hitchArgs,
+ hitch:hitch,
+ delegate:delegate,
+ _toArray:_toArray,
+ partial:partial,
+ clone:clone,
+ trim:trim,
+ replace:replace
+ };
+
+ 1 && mixin(dojo, lang);
+ return lang;
+
+ /*=====
+ dojo._extraNames
+ // summary:
+ // Array of strings. Lists property names that must be explicitly processed during for-in interation
+ // in environments that have has("bug-for-in-skips-shadowed") true.
+ =====*/
+
+ /*=====
+ dojo._mixin = function(dest, source, copyFunc){
+ // summary:
+ // Copies/adds all properties of source to dest; returns dest.
+ // dest: Object:
+ // The object to which to copy/add all properties contained in source.
+ // source: Object:
+ // The object from which to draw all properties to copy into dest.
+ // copyFunc: Function?:
+ // The process used to copy/add a property in source; defaults to the Javascript assignment operator.
+ // returns:
+ // dest, as modified
+ // description:
+ // All properties, including functions (sometimes termed "methods"), excluding any non-standard extensions
+ // found in Object.prototype, are copied/added to dest. Copying/adding each particular property is
+ // delegated to copyFunc (if any); copyFunc defaults to the Javascript assignment operator if not provided.
+ // Notice that by default, _mixin executes a so-called "shallow copy" and aggregate types are copied/added by reference.
+ }
+ =====*/
+
+ /*=====
+ dojo.mixin = function(dest, sources){
+ // summary:
+ // Copies/adds all properties of one or more sources to dest; returns dest.
+ // dest: Object
+ // The object to which to copy/add all properties contained in source. If dest is falsy, then
+ // a new object is manufactured before copying/adding properties begins.
+ // sources: Object...
+ // One of more objects from which to draw all properties to copy into dest. sources are processed
+ // left-to-right and if more than one of these objects contain the same property name, the right-most
+ // value "wins".
+ // returns: Object
+ // dest, as modified
+ // description:
+ // All properties, including functions (sometimes termed "methods"), excluding any non-standard extensions
+ // found in Object.prototype, are copied/added from sources to dest. sources are processed left to right.
+ // The Javascript assignment operator is used to copy/add each property; therefore, by default, mixin
+ // executes a so-called "shallow copy" and aggregate types are copied/added by reference.
+ // example:
+ // make a shallow copy of an object
+ // | var copy = lang.mixin({}, source);
+ // example:
+ // many class constructors often take an object which specifies
+ // values to be configured on the object. In this case, it is
+ // often simplest to call `lang.mixin` on the `this` object:
+ // | dojo.declare("acme.Base", null, {
+ // | constructor: function(properties){
+ // | // property configuration:
+ // | lang.mixin(this, properties);
+ // |
+ // | console.log(this.quip);
+ // | // ...
+ // | },
+ // | quip: "I wasn't born yesterday, you know - I've seen movies.",
+ // | // ...
+ // | });
+ // |
+ // | // create an instance of the class and configure it
+ // | var b = new acme.Base({quip: "That's what it does!" });
+ // example:
+ // copy in properties from multiple objects
+ // | var flattened = lang.mixin(
+ // | {
+ // | name: "Frylock",
+ // | braces: true
+ // | },
+ // | {
+ // | name: "Carl Brutanananadilewski"
+ // | }
+ // | );
+ // |
+ // | // will print "Carl Brutanananadilewski"
+ // | console.log(flattened.name);
+ // | // will print "true"
+ // | console.log(flattened.braces);
+ }
+ =====*/
+
+ /*=====
+ dojo.setObject = function(name, value, context){
+ // summary:
+ // Set a property from a dot-separated string, such as "A.B.C"
+ // description:
+ // Useful for longer api chains where you have to test each object in
+ // the chain, or when you have an object reference in string format.
+ // Objects are created as needed along `path`. Returns the passed
+ // value if setting is successful or `undefined` if not.
+ // name: String
+ // Path to a property, in the form "A.B.C".
+ // value: anything
+ // value or object to place at location given by name
+ // context: Object?
+ // Optional. Object to use as root of path. Defaults to
+ // `dojo.global`.
+ // example:
+ // set the value of `foo.bar.baz`, regardless of whether
+ // intermediate objects already exist:
+ // | lang.setObject("foo.bar.baz", value);
+ // example:
+ // without `lang.setObject`, we often see code like this:
+ // | // ensure that intermediate objects are available
+ // | if(!obj["parent"]){ obj.parent = {}; }
+ // | if(!obj.parent["child"]){ obj.parent.child = {}; }
+ // | // now we can safely set the property
+ // | obj.parent.child.prop = "some value";
+ // whereas with `lang.setObject`, we can shorten that to:
+ // | lang.setObject("parent.child.prop", "some value", obj);
+ }
+ =====*/
+
+ /*=====
+ dojo.getObject = function(name, create, context){
+ // summary:
+ // Get a property from a dot-separated string, such as "A.B.C"
+ // description:
+ // Useful for longer api chains where you have to test each object in
+ // the chain, or when you have an object reference in string format.
+ // name: String
+ // Path to an property, in the form "A.B.C".
+ // create: Boolean?
+ // Optional. Defaults to `false`. If `true`, Objects will be
+ // created at any point along the 'path' that is undefined.
+ // context: Object?
+ // Optional. Object to use as root of path. Defaults to
+ // 'dojo.global'. Null may be passed.
+ }
+ =====*/
+
+ /*=====
+ dojo.exists = function(name, obj){
+ // summary:
+ // determine if an object supports a given method
+ // description:
+ // useful for longer api chains where you have to test each object in
+ // the chain. Useful for object and method detection.
+ // name: String
+ // Path to an object, in the form "A.B.C".
+ // obj: Object?
+ // Object to use as root of path. Defaults to
+ // 'dojo.global'. Null may be passed.
+ // example:
+ // | // define an object
+ // | var foo = {
+ // | bar: { }
+ // | };
+ // |
+ // | // search the global scope
+ // | lang.exists("foo.bar"); // true
+ // | lang.exists("foo.bar.baz"); // false
+ // |
+ // | // search from a particular scope
+ // | lang.exists("bar", foo); // true
+ // | lang.exists("bar.baz", foo); // false
+ }
+ =====*/
+
+ /*=====
+ dojo.isString = function(it){
+ // summary:
+ // Return true if it is a String
+ // it: anything
+ // Item to test.
+ }
+ =====*/
+
+ /*=====
+ dojo.isArray = function(it){
+ // summary:
+ // Return true if it is an Array.
+ // Does not work on Arrays created in other windows.
+ // it: anything
+ // Item to test.
+ }
+ =====*/
+
+ /*=====
+ dojo.isFunction = function(it){
+ // summary:
+ // Return true if it is a Function
+ // it: anything
+ // Item to test.
+ }
+ =====*/
+
+ /*=====
+ dojo.isObject = function(it){
+ // summary:
+ // Returns true if it is a JavaScript object (or an Array, a Function
+ // or null)
+ // it: anything
+ // Item to test.
+ }
+ =====*/
+
+ /*=====
+ dojo.isArrayLike = function(it){
+ // summary:
+ // similar to dojo.isArray() but more permissive
+ // it: anything
+ // Item to test.
+ // returns:
+ // If it walks like a duck and quacks like a duck, return `true`
+ // description:
+ // Doesn't strongly test for "arrayness". Instead, settles for "isn't
+ // a string or number and has a length property". Arguments objects
+ // and DOM collections will return true when passed to
+ // dojo.isArrayLike(), but will return false when passed to
+ // dojo.isArray().
+ }
+ =====*/
+
+ /*=====
+ dojo.isAlien = function(it){
+ // summary:
+ // Returns true if it is a built-in function or some other kind of
+ // oddball that *should* report as a function but doesn't
+ }
+ =====*/
+
+ /*=====
+ dojo.extend = function(constructor, props){
+ // summary:
+ // Adds all properties and methods of props to constructor's
+ // prototype, making them available to all instances created with
+ // constructor.
+ // constructor: Object
+ // Target constructor to extend.
+ // props: Object...
+ // One or more objects to mix into constructor.prototype
+ }
+ =====*/
+
+ /*=====
+ dojo.hitch = function(scope, method){
+ // summary:
+ // Returns a function that will only ever execute in the a given scope.
+ // This allows for easy use of object member functions
+ // in callbacks and other places in which the "this" keyword may
+ // otherwise not reference the expected scope.
+ // Any number of default positional arguments may be passed as parameters
+ // beyond "method".
+ // Each of these values will be used to "placehold" (similar to curry)
+ // for the hitched function.
+ // scope: Object
+ // The scope to use when method executes. If method is a string,
+ // scope is also the object containing method.
+ // method: Function|String...
+ // A function to be hitched to scope, or the name of the method in
+ // scope to be hitched.
+ // example:
+ // | dojo.hitch(foo, "bar")();
+ // runs foo.bar() in the scope of foo
+ // example:
+ // | dojo.hitch(foo, myFunction);
+ // returns a function that runs myFunction in the scope of foo
+ // example:
+ // Expansion on the default positional arguments passed along from
+ // hitch. Passed args are mixed first, additional args after.
+ // | var foo = { bar: function(a, b, c){ console.log(a, b, c); } };
+ // | var fn = dojo.hitch(foo, "bar", 1, 2);
+ // | fn(3); // logs "1, 2, 3"
+ // example:
+ // | var foo = { bar: 2 };
+ // | dojo.hitch(foo, function(){ this.bar = 10; })();
+ // execute an anonymous function in scope of foo
+ }
+ =====*/
+
+ /*=====
+ dojo.delegate = function(obj, props){
+ // summary:
+ // Returns a new object which "looks" to obj for properties which it
+ // does not have a value for. Optionally takes a bag of properties to
+ // seed the returned object with initially.
+ // description:
+ // This is a small implementaton of the Boodman/Crockford delegation
+ // pattern in JavaScript. An intermediate object constructor mediates
+ // the prototype chain for the returned object, using it to delegate
+ // down to obj for property lookup when object-local lookup fails.
+ // This can be thought of similarly to ES4's "wrap", save that it does
+ // not act on types but rather on pure objects.
+ // obj: Object
+ // The object to delegate to for properties not found directly on the
+ // return object or in props.
+ // props: Object...
+ // an object containing properties to assign to the returned object
+ // returns:
+ // an Object of anonymous type
+ // example:
+ // | var foo = { bar: "baz" };
+ // | var thinger = dojo.delegate(foo, { thud: "xyzzy"});
+ // | thinger.bar == "baz"; // delegated to foo
+ // | foo.thud == undefined; // by definition
+ // | thinger.thud == "xyzzy"; // mixed in from props
+ // | foo.bar = "thonk";
+ // | thinger.bar == "thonk"; // still delegated to foo's bar
+ }
+ =====*/
+
+ /*=====
+ dojo.partial = function(method){
+ // summary:
+ // similar to hitch() except that the scope object is left to be
+ // whatever the execution context eventually becomes.
+ // method: Function|String
+ // description:
+ // Calling dojo.partial is the functional equivalent of calling:
+ // | dojo.hitch(null, funcName, ...);
+ }
+ =====*/
+
+ /*=====
+ dojo.trim = function(str){
+ // summary:
+ // Trims whitespace from both sides of the string
+ // str: String
+ // String to be trimmed
+ // returns: String
+ // Returns the trimmed string
+ // description:
+ // This version of trim() was selected for inclusion into the base due
+ // to its compact size and relatively good performance
+ // (see [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript)
+ // Uses String.prototype.trim instead, if available.
+ // The fastest but longest version of this function is located at
+ // dojo.string.trim()
+ }
+ =====*/
+
+ /*=====
+ dojo.clone = function(src){
+ // summary:
+ // Clones objects (including DOM nodes) and all children.
+ // Warning: do not clone cyclic structures.
+ // src:
+ // The object to clone
+ }
+ =====*/
+
+ /*=====
+ dojo._toArray = function(obj, offset, startWith){
+ // summary:
+ // Converts an array-like object (i.e. arguments, DOMCollection) to an
+ // array. Returns a new Array with the elements of obj.
+ // obj: Object
+ // the object to "arrayify". We expect the object to have, at a
+ // minimum, a length property which corresponds to integer-indexed
+ // properties.
+ // offset: Number?
+ // the location in obj to start iterating from. Defaults to 0.
+ // Optional.
+ // startWith: Array?
+ // An array to pack with the properties of obj. If provided,
+ // properties in obj are appended at the end of startWith and
+ // startWith is the returned array.
+ }
+ =====*/
+
+ /*=====
+ dojo.replace = function(tmpl, map, pattern){
+ // summary:
+ // Performs parameterized substitutions on a string. Throws an
+ // exception if any parameter is unmatched.
+ // tmpl: String
+ // String to be used as a template.
+ // map: Object|Function
+ // If an object, it is used as a dictionary to look up substitutions.
+ // If a function, it is called for every substitution with following
+ // parameters: a whole match, a name, an offset, and the whole template
+ // string (see https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace
+ // for more details).
+ // pattern: RegEx?
+ // Optional regular expression objects that overrides the default pattern.
+ // Must be global and match one item. The default is: /\{([^\}]+)\}/g,
+ // which matches patterns like that: "{xxx}", where "xxx" is any sequence
+ // of characters, which doesn't include "}".
+ // returns: String
+ // Returns the substituted string.
+ // example:
+ // | // uses a dictionary for substitutions:
+ // | dojo.replace("Hello, {name.first} {name.last} AKA {nick}!",
+ // | {
+ // | nick: "Bob",
+ // | name: {
+ // | first: "Robert",
+ // | middle: "X",
+ // | last: "Cringely"
+ // | }
+ // | });
+ // | // returns: Hello, Robert Cringely AKA Bob!
+ // example:
+ // | // uses an array for substitutions:
+ // | dojo.replace("Hello, {0} {2}!",
+ // | ["Robert", "X", "Cringely"]);
+ // | // returns: Hello, Robert Cringely!
+ // example:
+ // | // uses a function for substitutions:
+ // | function sum(a){
+ // | var t = 0;
+ // | dojo.forEach(a, function(x){ t += x; });
+ // | return t;
+ // | }
+ // | dojo.replace(
+ // | "{count} payments averaging {avg} USD per payment.",
+ // | dojo.hitch(
+ // | { payments: [11, 16, 12] },
+ // | function(_, key){
+ // | switch(key){
+ // | case "count": return this.payments.length;
+ // | case "min": return Math.min.apply(Math, this.payments);
+ // | case "max": return Math.max.apply(Math, this.payments);
+ // | case "sum": return sum(this.payments);
+ // | case "avg": return sum(this.payments) / this.payments.length;
+ // | }
+ // | }
+ // | )
+ // | );
+ // | // prints: 3 payments averaging 13 USD per payment.
+ // example:
+ // | // uses an alternative PHP-like pattern for substitutions:
+ // | dojo.replace("Hello, ${0} ${2}!",
+ // | ["Robert", "X", "Cringely"], /\$\{([^\}]+)\}/g);
+ // | // returns: Hello, Robert Cringely!
+ return ""; // String
+ }
+ =====*/
+});
+
diff --git a/lib/dojo/_base/loader.js b/lib/dojo/_base/loader.js
new file mode 100644
index 000000000..fd9b8f3df
--- /dev/null
+++ b/lib/dojo/_base/loader.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/_base/loader",["./kernel","../has","require","module","./json","./lang","./array"],function(_1,_2,_3,_4,_5,_6,_7){if(!1){console.error("cannot load the Dojo v1.x loader with a foreign loader");return 0;}var _8=function(id){return {src:_4.id,id:id};},_9=function(_a){return _a.replace(/\./g,"/");},_b=/\/\/>>built/,_c=[],_d=[],_e=function(_f,_10,_11){_c.push(_11);_7.forEach(_f.split(","),function(mid){var _12=_13(mid,_10.module);_d.push(_12);_14(_12);});_15();},_16,_17=function(m){_16[m.mid]=1;for(var t,_18,_19=m.deps||[],i=0;i<_19.length;i++){_18=_19[i];if(!(t=_16[_18.mid])){if(t===0||!_17(_18)){_16[m.mid]=0;return false;}}}return true;},_15=function(){var _1a,mid;_16={};for(mid in _1b){_1a=_1b[mid];if(_1a.executed||_1a.noReqPluginCheck){_16[mid]=1;}else{if(_1a.noReqPluginCheck!==0){_1a.noReqPluginCheck=/loadInit\!/.test(mid)||/require\!/.test(mid)?1:0;}if(_1a.noReqPluginCheck){_16[mid]=1;}else{if(_1a.injected!==_1c){_16[mid]=0;}}}}for(var t,i=0,end=_d.length;i<end;i++){_1a=_d[i];if(!(t=_16[_1a.mid])){if(t===0||!_17(_1a)){return;}}}_1d.holdIdle();var _1e=_c;_c=[];_7.forEach(_1e,function(cb){cb(1);});_1d.releaseIdle();},_1f=function(mid,_20,_21){_20([mid],function(_22){_20(_22.names,function(){for(var _23="",_24=[],i=0;i<arguments.length;i++){_23+="var "+_22.names[i]+"= arguments["+i+"]; ";_24.push(arguments[i]);}eval(_23);var _25=_20.module,_26=[],_27={},_28=[],p,_29={provide:function(_2a){_2a=_9(_2a);var _2b=_13(_2a,_25);if(_2b!==_25){_53(_2b);}},require:function(_2c,_2d){_2c=_9(_2c);_2d&&(_13(_2c,_25).result=_4e);_28.push(_2c);},requireLocalization:function(_2e,_2f,_30){_26.length||(_26=["dojo/i18n"]);_30=(_30||_1.locale).toLowerCase();_2e=_9(_2e)+"/nls/"+(/root/i.test(_30)?"":_30+"/")+_9(_2f);if(_13(_2e,_25).isXd){_26.push("dojo/i18n!"+_2e);}},loadInit:function(f){f();}};try{for(p in _29){_27[p]=_1[p];_1[p]=_29[p];}_22.def.apply(null,_24);}catch(e){_54("error",[_8("failedDojoLoadInit"),e]);}finally{for(p in _29){_1[p]=_27[p];}}_28.length&&_26.push("dojo/require!"+_28.join(","));_c.push(_21);_7.forEach(_28,function(mid){var _31=_13(mid,_20.module);_d.push(_31);_14(_31);});_15();});});},_32=function(_33,_34,_35){var _36=/\(|\)/g,_37=1,_38;_36.lastIndex=_34;while((_38=_36.exec(_33))){if(_38[0]==")"){_37-=1;}else{_37+=1;}if(_37==0){break;}}if(_37!=0){throw "unmatched paren around character "+_36.lastIndex+" in: "+_33;}return [_1.trim(_33.substring(_35,_36.lastIndex))+";\n",_36.lastIndex];},_39=/(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg,_3a=/(^|\s)dojo\.(loadInit|require|provide|requireLocalization|requireIf|requireAfterIf|platformRequire)\s*\(/mg,_3b=/(^|\s)(require|define)\s*\(/m,_3c=function(_3d,_3e){var _3f,_40,_41,_42,_43=[],_44=[],_45=[];_3e=_3e||_3d.replace(_39,function(_46){_3a.lastIndex=_3b.lastIndex=0;return (_3a.test(_46)||_3b.test(_46))?"":_46;});while((_3f=_3a.exec(_3e))){_40=_3a.lastIndex;_41=_40-_3f[0].length;_42=_32(_3e,_40,_41);if(_3f[2]=="loadInit"){_43.push(_42[0]);}else{_44.push(_42[0]);}_3a.lastIndex=_42[1];}_45=_43.concat(_44);if(_45.length||!_3b.test(_3e)){return [_3d.replace(/(^|\s)dojo\.loadInit\s*\(/g,"\n0 && dojo.loadInit("),_45.join(""),_45];}else{return 0;}},_47=function(_48,_49){var _4a,id,_4b=[],_4c=[];if(_b.test(_49)||!(_4a=_3c(_49))){return 0;}id=_48.mid+"-*loadInit";for(var p in _13("dojo",_48).result.scopeMap){_4b.push(p);_4c.push("\""+p+"\"");}return "// xdomain rewrite of "+_48.path+"\n"+"define('"+id+"',{\n"+"\tnames:"+_1.toJson(_4b)+",\n"+"\tdef:function("+_4b.join(",")+"){"+_4a[1]+"}"+"});\n\n"+"define("+_1.toJson(_4b.concat(["dojo/loadInit!"+id]))+", function("+_4b.join(",")+"){\n"+_4a[0]+"});";},_1d=_3.initSyncLoader(_e,_15,_47),_4d=_1d.sync,xd=_1d.xd,_1c=_1d.arrived,_4e=_1d.nonmodule,_4f=_1d.executing,_50=_1d.executed,_51=_1d.syncExecStack,_1b=_1d.modules,_52=_1d.execQ,_13=_1d.getModule,_14=_1d.injectModule,_53=_1d.setArrived,_54=_1d.signal,_55=_1d.finishExec,_56=_1d.execModule,_57=_1d.getLegacyMode;_1.provide=function(mid){var _58=_51[0],_59=_6.mixin(_13(_9(mid),_3.module),{executed:_4f,result:_6.getObject(mid,true)});_53(_59);if(_58){(_58.provides||(_58.provides=[])).push(function(){_59.result=_6.getObject(mid);delete _59.provides;_59.executed!==_50&&_55(_59);});}return _59.result;};_2.add("config-publishRequireResult",1,0,0);_1.require=function(_5a,_5b){function _5c(mid,_5d){var _5e=_13(_9(mid),_3.module);if(_51.length&&_51[0].finish){_51[0].finish.push(mid);return undefined;}if(_5e.executed){return _5e.result;}_5d&&(_5e.result=_4e);var _5f=_57();_14(_5e);_5f=_57();if(_5e.executed!==_50&&_5e.injected===_1c){_1d.holdIdle();_56(_5e);_1d.releaseIdle();}if(_5e.executed){return _5e.result;}if(_5f==_4d){if(_5e.cjs){_52.unshift(_5e);}else{_51.length&&(_51[0].finish=[mid]);}}else{_52.push(_5e);}return undefined;};var _60=_5c(_5a,_5b);if(_2("config-publishRequireResult")&&!_6.exists(_5a)&&_60!==undefined){_6.setObject(_5a,_60);}return _60;};_1.loadInit=function(f){f();};_1.registerModulePath=function(_61,_62){var _63={};_63[_61.replace(/\./g,"/")]=_62;_3({paths:_63});};_1.platformRequire=function(_64){var _65=(_64.common||[]).concat(_64[_1._name]||_64["default"]||[]),_66;while(_65.length){if(_6.isArray(_66=_65.shift())){_1.require.apply(_1,_66);}else{_1.require(_66);}}};_1.requireIf=_1.requireAfterIf=function(_67,_68,_69){if(_67){_1.require(_68,_69);}};_1.requireLocalization=function(_6a,_6b,_6c){_3(["../i18n"],function(_6d){_6d.getLocalization(_6a,_6b,_6c);});};return {extractLegacyApiApplications:_3c,require:_1d.dojoRequirePlugin,loadInit:_1f};}); \ No newline at end of file
diff --git a/lib/dojo/_base/loader.js.uncompressed.js b/lib/dojo/_base/loader.js.uncompressed.js
new file mode 100644
index 000000000..0bc2cc5b3
--- /dev/null
+++ b/lib/dojo/_base/loader.js.uncompressed.js
@@ -0,0 +1,718 @@
+define("dojo/_base/loader", ["./kernel", "../has", "require", "module", "./json", "./lang", "./array"], function(dojo, has, require, thisModule, json, lang, array) {
+ // module:
+ // dojo/_base/lader
+ // summary:
+ // This module defines the v1.x synchronous loader API.
+
+ // signal the loader in sync mode...
+ //>>pure-amd
+
+ if (!1){
+ console.error("cannot load the Dojo v1.x loader with a foreign loader");
+ return 0;
+ }
+
+ var makeErrorToken = function(id){
+ return {src:thisModule.id, id:id};
+ },
+
+ slashName = function(name){
+ return name.replace(/\./g, "/");
+ },
+
+ buildDetectRe = /\/\/>>built/,
+
+ dojoRequireCallbacks = [],
+ dojoRequireModuleStack = [],
+
+ dojoRequirePlugin = function(mid, require, loaded){
+ dojoRequireCallbacks.push(loaded);
+ array.forEach(mid.split(","), function(mid){
+ var module = getModule(mid, require.module);
+ dojoRequireModuleStack.push(module);
+ injectModule(module);
+ });
+ checkDojoRequirePlugin();
+ },
+
+ // checkDojoRequirePlugin inspects all of the modules demanded by a dojo/require!<module-list> dependency
+ // to see if they have arrived. The loader does not release *any* of these modules to be instantiated
+ // until *all* of these modules are on board, thereby preventing the evaluation of a module with dojo.require's
+ // that reference modules that are not available.
+ //
+ // The algorithm works by traversing the dependency graphs (remember, there can be cycles so they are not trees)
+ // of each module in the dojoRequireModuleStack array (which contains the list of modules demanded by dojo/require!).
+ // The moment a single module is discovered that is missing, the algorithm gives up and indicates that not all
+ // modules are on board. dojo/loadInit! and dojo/require! are ignored because there dependencies are inserted
+ // directly in dojoRequireModuleStack. For example, if "your/module" module depends on "dojo/require!my/module", then
+ // *both* "dojo/require!my/module" and "my/module" will be in dojoRequireModuleStack. Obviously, if "my/module"
+ // is on board, then "dojo/require!my/module" is also satisfied, so the algorithm doesn't check for "dojo/require!my/module".
+ //
+ // Note: inserting a dojo/require!<some-module-list> dependency in the dojoRequireModuleStack achieves nothing
+ // with the current algorithm; however, having such modules present makes it possible to optimize the algorithm
+ //
+ // Note: prior versions of this algorithm had an optimization that signaled loaded on dojo/require! dependencies
+ // individually (rather than waiting for them all to be resolved). The implementation proved problematic with cycles
+ // and plugins. However, it is possible to reattach that strategy in the future.
+
+ // a set from module-id to {undefined | 1 | 0}, where...
+ // undefined => the module has not been inspected
+ // 0 => the module or at least one of its dependencies has not arrived
+ // 1 => the module is a loadInit! or require! plugin resource, or is currently being traversed (therefore, assume
+ // OK until proven otherwise), or has been completely traversed and all dependencies have arrived
+ touched,
+
+ traverse = function(m){
+ touched[m.mid] = 1;
+ for(var t, module, deps = m.deps || [], i= 0; i<deps.length; i++){
+ module = deps[i];
+ if(!(t = touched[module.mid])){
+ if(t===0 || !traverse(module)){
+ touched[m.mid] = 0;
+ return false;
+ }
+ }
+ }
+ return true;
+ },
+
+ checkDojoRequirePlugin = function(){
+ // initialize the touched hash with easy-to-compute values that help short circuit recursive algorithm;
+ // recall loadInit/require plugin modules are dependencies of modules in dojoRequireModuleStack...
+ // which would cause a circular dependency chain that would never be resolved if checked here
+ // notice all dependencies of any particular loadInit/require plugin module will already
+ // be checked since those are pushed into dojoRequireModuleStack explicitly by the
+ // plugin...so if a particular loadInitPlugin module's dependencies are not really
+ // on board, that *will* be detected elsewhere in the traversal.
+ var module, mid;
+ touched = {};
+ for(mid in modules){
+ module = modules[mid];
+ // this could be improved by remembering the result of the regex tests
+ if(module.executed || module.noReqPluginCheck){
+ touched[mid] = 1;
+ }else{
+ if(module.noReqPluginCheck!==0){
+ // tag the module as either a loadInit or require plugin or not for future reference
+ module.noReqPluginCheck = /loadInit\!/.test(mid) || /require\!/.test(mid) ? 1 : 0;
+ }
+ if(module.noReqPluginCheck){
+ touched[mid] = 1;
+ }else if(module.injected!==arrived){
+ // not executed, has not arrived, and is not a loadInit or require plugin resource
+ touched[mid] = 0;
+ }// else, leave undefined and we'll traverse the dependencies
+ }
+ }
+
+ for(var t, i = 0, end = dojoRequireModuleStack.length; i<end; i++){
+ module = dojoRequireModuleStack[i];
+ if(!(t = touched[module.mid])){
+ if(t===0 || !traverse(module)){
+ return;
+ }
+ }
+ }
+ loaderVars.holdIdle();
+ var oldCallbacks = dojoRequireCallbacks;
+ dojoRequireCallbacks = [];
+ array.forEach(oldCallbacks, function(cb){cb(1);});
+ loaderVars.releaseIdle();
+ },
+
+ dojoLoadInitPlugin = function(mid, require, loaded){
+ // mid names a module that defines a "dojo load init" bundle, an object with two properties:
+ //
+ // * names: a vector of module ids that give top-level names to define in the lexical scope of def
+ // * def: a function that contains some some legacy loader API applications
+ //
+ // The point of def is to possibly cause some modules to be loaded (but not executed) by dojo/require! where the module
+ // ids are possibly-determined at runtime. For example, here is dojox.gfx from v1.6 expressed as an AMD module using the dojo/loadInit
+ // and dojo/require plugins.
+ //
+ // // dojox/gfx:
+ //
+ // define("*loadInit_12, {
+ // names:["dojo", "dijit", "dojox"],
+ // def: function(){
+ // dojo.loadInit(function(){
+ // var gfx = lang.getObject("dojox.gfx", true);
+ //
+ // //
+ // // code required to set gfx properties ommitted...
+ // //
+ //
+ // // now use the calculations to include the runtime-dependent module
+ // dojo.require("dojox.gfx." + gfx.renderer);
+ // });
+ // }
+ // });
+ //
+ // define(["dojo", "dojo/loadInit!" + id].concat("dojo/require!dojox/gfx/matric,dojox/gfx/_base"), function(dojo){
+ // // when this AMD factory function is executed, the following modules are guaranteed downloaded but not executed:
+ // // "dojox.gfx." + gfx.renderer
+ // // dojox.gfx.matrix
+ // // dojox.gfx._base
+ // dojo.provide("dojo.gfx");
+ // dojo.require("dojox.gfx.matrix");
+ // dojo.require("dojox.gfx._base");
+ // dojo.require("dojox.gfx." + gfx.renderer);
+ // return lang.getObject("dojo.gfx");
+ // });
+ // })();
+ //
+ // The idea is to run the legacy loader API with global variables shadowed, which allows these variables to
+ // be relocated. For example, dojox and dojo could be relocated to different names by giving a packageMap and the code above will
+ // execute properly (because the plugin below resolves the load init bundle.names module with respect to the module that demanded
+ // the plugin resource).
+ //
+ // Note that the relocation is specified in the runtime configuration; relocated names need not be set at build-time.
+ //
+ // Warning: this is not the best way to express dojox.gfx as and AMD module. In fact, the module has been properly converted in
+ // v1.7. However, this technique allows the builder to convert legacy modules into AMD modules and guarantee the codepath is the
+ // same in the converted AMD module.
+ require([mid], function(bundle){
+ // notice how names is resolved with respect to the module that demanded the plugin resource
+ require(bundle.names, function(){
+ // bring the bundle names into scope
+ for(var scopeText = "", args= [], i = 0; i<arguments.length; i++){
+ scopeText+= "var " + bundle.names[i] + "= arguments[" + i + "]; ";
+ args.push(arguments[i]);
+ }
+ eval(scopeText);
+
+ var callingModule = require.module,
+ deps = [],
+ hold = {},
+ requireList = [],
+ p,
+ syncLoaderApi = {
+ provide:function(moduleName){
+ // mark modules that arrive consequent to multiple provides in this module as arrived since they can't be injected
+ moduleName = slashName(moduleName);
+ var providedModule = getModule(moduleName, callingModule);
+ if(providedModule!==callingModule){
+ setArrived(providedModule);
+ }
+ },
+ require:function(moduleName, omitModuleCheck){
+ moduleName = slashName(moduleName);
+ omitModuleCheck && (getModule(moduleName, callingModule).result = nonmodule);
+ requireList.push(moduleName);
+ },
+ requireLocalization:function(moduleName, bundleName, locale){
+ // since we're going to need dojo/i8n, add it to deps if not already there
+ deps.length || (deps = ["dojo/i18n"]);
+
+ // figure out if the bundle is xdomain; if so, add it to the depsSet
+ locale = (locale || dojo.locale).toLowerCase();
+ moduleName = slashName(moduleName) + "/nls/" + (/root/i.test(locale) ? "" : locale + "/") + slashName(bundleName);
+ if(getModule(moduleName, callingModule).isXd){
+ deps.push("dojo/i18n!" + moduleName);
+ }// else the bundle will be loaded synchronously when the module is evaluated
+ },
+ loadInit:function(f){
+ f();
+ }
+ };
+
+ // hijack the correct dojo and apply bundle.def
+ try{
+ for(p in syncLoaderApi){
+ hold[p] = dojo[p];
+ dojo[p] = syncLoaderApi[p];
+ }
+ bundle.def.apply(null, args);
+ }catch(e){
+ signal("error", [makeErrorToken("failedDojoLoadInit"), e]);
+ }finally{
+ for(p in syncLoaderApi){
+ dojo[p] = hold[p];
+ }
+ }
+
+ // requireList is the list of modules that need to be downloaded but not executed before the callingModule can be executed
+ requireList.length && deps.push("dojo/require!" + requireList.join(","));
+
+ dojoRequireCallbacks.push(loaded);
+ array.forEach(requireList, function(mid){
+ var module = getModule(mid, require.module);
+ dojoRequireModuleStack.push(module);
+ injectModule(module);
+ });
+ checkDojoRequirePlugin();
+ });
+ });
+ },
+
+ extractApplication = function(
+ text, // the text to search
+ startSearch, // the position in text to start looking for the closing paren
+ startApplication // the position in text where the function application expression starts
+ ){
+ // find end of the call by finding the matching end paren
+ // Warning: as usual, this will fail in the presense of unmatched right parans contained in strings, regexs, or unremoved comments
+ var parenRe = /\(|\)/g,
+ matchCount = 1,
+ match;
+ parenRe.lastIndex = startSearch;
+ while((match = parenRe.exec(text))){
+ if(match[0] == ")"){
+ matchCount -= 1;
+ }else{
+ matchCount += 1;
+ }
+ if(matchCount == 0){
+ break;
+ }
+ }
+
+ if(matchCount != 0){
+ throw "unmatched paren around character " + parenRe.lastIndex + " in: " + text;
+ }
+
+ //Put the master matching string in the results.
+ return [dojo.trim(text.substring(startApplication, parenRe.lastIndex))+";\n", parenRe.lastIndex];
+ },
+
+ // the following regex is taken from 1.6. It is a very poor technique to remove comments and
+ // will fail in some cases; for example, consider the code...
+ //
+ // var message = "Category-1 */* Category-2";
+ //
+ // The regex that follows will see a /* comment and trash the code accordingly. In fact, there are all
+ // kinds of cases like this with strings and regexs that will cause this design to fail miserably.
+ //
+ // Alternative regex designs exist that will result in less-likely failures, but will still fail in many cases.
+ // The only solution guaranteed 100% correct is to parse the code and that seems overkill for this
+ // backcompat/unbuilt-xdomain layer. In the end, since it's been this way for a while, we won't change it.
+ // See the opening paragraphs of Chapter 7 or ECME-262 which describes the lexical abiguity further.
+ removeCommentRe = /(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg,
+
+ syncLoaderApiRe = /(^|\s)dojo\.(loadInit|require|provide|requireLocalization|requireIf|requireAfterIf|platformRequire)\s*\(/mg,
+
+ amdLoaderApiRe = /(^|\s)(require|define)\s*\(/m,
+
+ extractLegacyApiApplications = function(text, noCommentText){
+ // scan the noCommentText for any legacy loader API applications. Copy such applications into result (this is
+ // used by the builder). Move dojo.loadInit applications to loadInitApplications string. Copy all other applications
+ // to otherApplications string. If no applications were found, return 0, signalling an AMD module. Otherwise, return
+ // loadInitApplications + otherApplications. Fixup text by replacing
+ //
+ // dojo.loadInit(// etc...
+ //
+ // with
+ //
+ // \n 0 && dojo.loadInit(// etc...
+ //
+ // Which results in the dojo.loadInit from *not* being applied. This design goes a long way towards protecting the
+ // code from an over-agressive removeCommentRe. However...
+ //
+ // WARNING: the removeCommentRe will cause an error if a detected comment removes all or part of a legacy-loader application
+ // that is not in a comment.
+
+ var match, startSearch, startApplication, application,
+ loadInitApplications = [],
+ otherApplications = [],
+ allApplications = [];
+
+ // noCommentText may be provided by a build app with comments extracted by a better method than regex (hopefully)
+ noCommentText = noCommentText || text.replace(removeCommentRe, function(match){
+ // remove iff the detected comment has text that looks like a sync loader API application; this helps by
+ // removing as little as possible, minimizing the changes the janky regex will kill the module
+ syncLoaderApiRe.lastIndex = amdLoaderApiRe.lastIndex = 0;
+ return (syncLoaderApiRe.test(match) || amdLoaderApiRe.test(match)) ? "" : match;
+ });
+
+ // find and extract all dojo.loadInit applications
+ while((match = syncLoaderApiRe.exec(noCommentText))){
+ startSearch = syncLoaderApiRe.lastIndex;
+ startApplication = startSearch - match[0].length;
+ application = extractApplication(noCommentText, startSearch, startApplication);
+ if(match[2]=="loadInit"){
+ loadInitApplications.push(application[0]);
+ }else{
+ otherApplications.push(application[0]);
+ }
+ syncLoaderApiRe.lastIndex = application[1];
+ }
+ allApplications = loadInitApplications.concat(otherApplications);
+ if(allApplications.length || !amdLoaderApiRe.test(noCommentText)){
+ // either there were some legacy loader API applications or there were no AMD API applications
+ return [text.replace(/(^|\s)dojo\.loadInit\s*\(/g, "\n0 && dojo.loadInit("), allApplications.join(""), allApplications];
+ }else{
+ // legacy loader API *was not* detected and AMD API *was* detected; therefore, assume it's an AMD module
+ return 0;
+ }
+ },
+
+ transformToAmd = function(module, text){
+ // This is roughly the equivalent of dojo._xdCreateResource in 1.6-; however, it expresses a v1.6- dojo
+ // module in terms of AMD define instead of creating the dojo proprietary xdomain module expression.
+ // The module could have originated from several sources:
+ //
+ // * amd require() a module, e.g., require(["my/module"])
+ // * amd require() a nonmodule, e.g., require(["my/resource.js"')
+ // * amd define() deps vector (always a module)
+ // * dojo.require() a module, e.g. dojo.require("my.module")
+ // * dojo.require() a nonmodule, e.g., dojo.require("my.module", true)
+ // * dojo.requireIf/requireAfterIf/platformRequire a module
+ //
+ // The module is scanned for legacy loader API applications; if none are found, then assume the module is an
+ // AMD module and return 0. Otherwise, a synthetic dojo/loadInit plugin resource is created and the module text
+ // is rewritten as an AMD module with the single dependency of this synthetic resource. When the dojo/loadInit
+ // plugin loaded the synthetic resource, it will cause all dojo.loadInit's to be executed, find all dojo.require's
+ // (either directly consequent to dojo.require or indirectly consequent to dojo.require[After]If or
+ // dojo.platformRequire, and finally cause loading of all dojo.required modules with the dojo/require plugin. Thus,
+ // when the dojo/loadInit plugin reports it has been loaded, all modules required by the given module are guaranteed
+ // loaded (but not executed). This then allows the module to execute it's code path without interupts, thereby
+ // following the synchronous code path.
+
+ var extractResult, id, names = [], namesAsStrings = [];
+ if(buildDetectRe.test(text) || !(extractResult = extractLegacyApiApplications(text))){
+ // buildDetectRe.test(text) => a built module, always AMD
+ // extractResult==0 => no sync API
+ return 0;
+ }
+
+ // manufacture a synthetic module id that can never be a real mdule id (just like require does)
+ id = module.mid + "-*loadInit";
+
+ // construct the dojo/loadInit names vector which causes any relocated names to be defined as lexical variables under their not-relocated name
+ // the dojo/loadInit plugin assumes the first name in names is "dojo"
+
+ for(var p in getModule("dojo", module).result.scopeMap){
+ names.push(p);
+ namesAsStrings.push('"' + p + '"');
+ }
+
+ // rewrite the module as a synthetic dojo/loadInit plugin resource + the module expressed as an AMD module that depends on this synthetic resource
+ return "// xdomain rewrite of " + module.path + "\n" +
+ "define('" + id + "',{\n" +
+ "\tnames:" + dojo.toJson(names) + ",\n" +
+ "\tdef:function(" + names.join(",") + "){" + extractResult[1] + "}" +
+ "});\n\n" +
+ "define(" + dojo.toJson(names.concat(["dojo/loadInit!"+id])) + ", function(" + names.join(",") + "){\n" + extractResult[0] + "});";
+ },
+
+ loaderVars = require.initSyncLoader(dojoRequirePlugin, checkDojoRequirePlugin, transformToAmd),
+
+ sync =
+ loaderVars.sync,
+
+ xd =
+ loaderVars.xd,
+
+ arrived =
+ loaderVars.arrived,
+
+ nonmodule =
+ loaderVars.nonmodule,
+
+ executing =
+ loaderVars.executing,
+
+ executed =
+ loaderVars.executed,
+
+ syncExecStack =
+ loaderVars.syncExecStack,
+
+ modules =
+ loaderVars.modules,
+
+ execQ =
+ loaderVars.execQ,
+
+ getModule =
+ loaderVars.getModule,
+
+ injectModule =
+ loaderVars.injectModule,
+
+ setArrived =
+ loaderVars.setArrived,
+
+ signal =
+ loaderVars.signal,
+
+ finishExec =
+ loaderVars.finishExec,
+
+ execModule =
+ loaderVars.execModule,
+
+ getLegacyMode =
+ loaderVars.getLegacyMode;
+
+ dojo.provide = function(mid){
+ var executingModule = syncExecStack[0],
+ module = lang.mixin(getModule(slashName(mid), require.module), {
+ executed:executing,
+ result:lang.getObject(mid, true)
+ });
+ setArrived(module);
+ if(executingModule){
+ (executingModule.provides || (executingModule.provides = [])).push(function(){
+ module.result = lang.getObject(mid);
+ delete module.provides;
+ module.executed!==executed && finishExec(module);
+ });
+ }// else dojo.provide called not consequent to loading; therefore, give up trying to publish module value to loader namespace
+ return module.result;
+ };
+
+ has.add("config-publishRequireResult", 1, 0, 0);
+
+ dojo.require = function(moduleName, omitModuleCheck) {
+ // summary:
+ // loads a Javascript module from the appropriate URI
+ //
+ // moduleName: String
+ // module name to load, using periods for separators,
+ // e.g. "dojo.date.locale". Module paths are de-referenced by dojo's
+ // internal mapping of locations to names and are disambiguated by
+ // longest prefix. See `dojo.registerModulePath()` for details on
+ // registering new modules.
+ //
+ // omitModuleCheck: Boolean?
+ // if `true`, omitModuleCheck skips the step of ensuring that the
+ // loaded file actually defines the symbol it is referenced by.
+ // For example if it called as `dojo.require("a.b.c")` and the
+ // file located at `a/b/c.js` does not define an object `a.b.c`,
+ // and exception will be throws whereas no exception is raised
+ // when called as `dojo.require("a.b.c", true)`
+ //
+ // description:
+ // Modules are loaded via dojo.require by using one of two loaders: the normal loader
+ // and the xdomain loader. The xdomain loader is used when dojo was built with a
+ // custom build that specified loader=xdomain and the module lives on a modulePath
+ // that is a whole URL, with protocol and a domain. The versions of Dojo that are on
+ // the Google and AOL CDNs use the xdomain loader.
+ //
+ // If the module is loaded via the xdomain loader, it is an asynchronous load, since
+ // the module is added via a dynamically created script tag. This
+ // means that dojo.require() can return before the module has loaded. However, this
+ // should only happen in the case where you do dojo.require calls in the top-level
+ // HTML page, or if you purposely avoid the loader checking for dojo.require
+ // dependencies in your module by using a syntax like dojo["require"] to load the module.
+ //
+ // Sometimes it is useful to not have the loader detect the dojo.require calls in the
+ // module so that you can dynamically load the modules as a result of an action on the
+ // page, instead of right at module load time.
+ //
+ // Also, for script blocks in an HTML page, the loader does not pre-process them, so
+ // it does not know to download the modules before the dojo.require calls occur.
+ //
+ // So, in those two cases, when you want on-the-fly module loading or for script blocks
+ // in the HTML page, special care must be taken if the dojo.required code is loaded
+ // asynchronously. To make sure you can execute code that depends on the dojo.required
+ // modules, be sure to add the code that depends on the modules in a dojo.addOnLoad()
+ // callback. dojo.addOnLoad waits for all outstanding modules to finish loading before
+ // executing.
+ //
+ // This type of syntax works with both xdomain and normal loaders, so it is good
+ // practice to always use this idiom for on-the-fly code loading and in HTML script
+ // blocks. If at some point you change loaders and where the code is loaded from,
+ // it will all still work.
+ //
+ // More on how dojo.require
+ // `dojo.require("A.B")` first checks to see if symbol A.B is
+ // defined. If it is, it is simply returned (nothing to do).
+ //
+ // If it is not defined, it will look for `A/B.js` in the script root
+ // directory.
+ //
+ // `dojo.require` throws an exception if it cannot find a file
+ // to load, or if the symbol `A.B` is not defined after loading.
+ //
+ // It returns the object `A.B`, but note the caveats above about on-the-fly loading and
+ // HTML script blocks when the xdomain loader is loading a module.
+ //
+ // `dojo.require()` does nothing about importing symbols into
+ // the current namespace. It is presumed that the caller will
+ // take care of that.
+ //
+ // example:
+ // To use dojo.require in conjunction with dojo.ready:
+ //
+ // | dojo.require("foo");
+ // | dojo.require("bar");
+ // | dojo.addOnLoad(function(){
+ // | //you can now safely do something with foo and bar
+ // | });
+ //
+ // example:
+ // For example, to import all symbols into a local block, you might write:
+ //
+ // | with (dojo.require("A.B")) {
+ // | ...
+ // | }
+ //
+ // And to import just the leaf symbol to a local variable:
+ //
+ // | var B = dojo.require("A.B");
+ // | ...
+ //
+ // returns:
+ // the required namespace object
+ function doRequire(mid, omitModuleCheck){
+ var module = getModule(slashName(mid), require.module);
+ if(syncExecStack.length && syncExecStack[0].finish){
+ // switched to async loading in the middle of evaluating a legacy module; stop
+ // applying dojo.require so the remaining dojo.requires are applied in order
+ syncExecStack[0].finish.push(mid);
+ return undefined;
+ }
+
+ // recall module.executed has values {0, executing, executed}; therefore, truthy indicates executing or executed
+ if(module.executed){
+ return module.result;
+ }
+ omitModuleCheck && (module.result = nonmodule);
+
+ var currentMode = getLegacyMode();
+
+ // recall, in sync mode to inject is to *eval* the module text
+ // if the module is a legacy module, this is the same as executing
+ // but if the module is an AMD module, this means defining, not executing
+ injectModule(module);
+ // the inject may have changed the mode
+ currentMode = getLegacyMode();
+
+ // in sync mode to dojo.require is to execute
+ if(module.executed!==executed && module.injected===arrived){
+ // the module was already here before injectModule was called probably finishing up a xdomain
+ // load, but maybe a module given to the loader directly rather than having the loader retrieve it
+ loaderVars.holdIdle();
+ execModule(module);
+ loaderVars.releaseIdle();
+ }
+ if(module.executed){
+ return module.result;
+ }
+
+ if(currentMode==sync){
+ // the only way to get here is in sync mode and dojo.required a module that
+ // * was loaded async in the injectModule application a few lines up
+ // * was an AMD module that had deps that are being loaded async and therefore couldn't execute
+ if(module.cjs){
+ // the module was an AMD module; unshift, not push, which causes the current traversal to be reattempted from the top
+ execQ.unshift(module);
+ }else{
+ // the module was a legacy module
+ syncExecStack.length && (syncExecStack[0].finish= [mid]);
+ }
+ }else{
+ // the loader wasn't in sync mode on entry; probably async mode; therefore, no expectation of getting
+ // the module value synchronously; make sure it gets executed though
+ execQ.push(module);
+ }
+ return undefined;
+ }
+
+ var result = doRequire(moduleName, omitModuleCheck);
+ if(has("config-publishRequireResult") && !lang.exists(moduleName) && result!==undefined){
+ lang.setObject(moduleName, result);
+ }
+ return result;
+ };
+
+ dojo.loadInit = function(f) {
+ f();
+ };
+
+ dojo.registerModulePath = function(/*String*/moduleName, /*String*/prefix){
+ // summary:
+ // Maps a module name to a path
+ // description:
+ // An unregistered module is given the default path of ../[module],
+ // relative to Dojo root. For example, module acme is mapped to
+ // ../acme. If you want to use a different module name, use
+ // dojo.registerModulePath.
+ // example:
+ // If your dojo.js is located at this location in the web root:
+ // | /myapp/js/dojo/dojo/dojo.js
+ // and your modules are located at:
+ // | /myapp/js/foo/bar.js
+ // | /myapp/js/foo/baz.js
+ // | /myapp/js/foo/thud/xyzzy.js
+ // Your application can tell Dojo to locate the "foo" namespace by calling:
+ // | dojo.registerModulePath("foo", "../../foo");
+ // At which point you can then use dojo.require() to load the
+ // modules (assuming they provide() the same things which are
+ // required). The full code might be:
+ // | <script type="text/javascript"
+ // | src="/myapp/js/dojo/dojo/dojo.js"></script>
+ // | <script type="text/javascript">
+ // | dojo.registerModulePath("foo", "../../foo");
+ // | dojo.require("foo.bar");
+ // | dojo.require("foo.baz");
+ // | dojo.require("foo.thud.xyzzy");
+ // | </script>
+
+ var paths = {};
+ paths[moduleName.replace(/\./g, "/")] = prefix;
+ require({paths:paths});
+ };
+
+ dojo.platformRequire = function(/*Object*/modMap){
+ // summary:
+ // require one or more modules based on which host environment
+ // Dojo is currently operating in
+ // description:
+ // This method takes a "map" of arrays which one can use to
+ // optionally load dojo modules. The map is indexed by the
+ // possible dojo.name_ values, with two additional values:
+ // "default" and "common". The items in the "default" array will
+ // be loaded if none of the other items have been choosen based on
+ // dojo.name_, set by your host environment. The items in the
+ // "common" array will *always* be loaded, regardless of which
+ // list is chosen.
+ // example:
+ // | dojo.platformRequire({
+ // | browser: [
+ // | "foo.sample", // simple module
+ // | "foo.test",
+ // | ["foo.bar.baz", true] // skip object check in _loadModule (dojo.require)
+ // | ],
+ // | default: [ "foo.sample._base" ],
+ // | common: [ "important.module.common" ]
+ // | });
+
+ var result = (modMap.common || []).concat(modMap[dojo._name] || modMap["default"] || []),
+ temp;
+ while(result.length){
+ if(lang.isArray(temp = result.shift())){
+ dojo.require.apply(dojo, temp);
+ }else{
+ dojo.require(temp);
+ }
+ }
+ };
+
+ dojo.requireIf = dojo.requireAfterIf = function(/*Boolean*/ condition, /*String*/ moduleName, /*Boolean?*/omitModuleCheck){
+ // summary:
+ // If the condition is true then call `dojo.require()` for the specified
+ // resource
+ //
+ // example:
+ // | dojo.requireIf(dojo.isBrowser, "my.special.Module");
+
+ if(condition){
+ dojo.require(moduleName, omitModuleCheck);
+ }
+ };
+
+ dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale){
+ require(["../i18n"], function(i18n){
+ i18n.getLocalization(moduleName, bundleName, locale);
+ });
+ };
+
+ return {
+ extractLegacyApiApplications:extractLegacyApiApplications,
+ require:loaderVars.dojoRequirePlugin,
+ loadInit:dojoLoadInitPlugin
+ };
+});
diff --git a/lib/dojo/_base/query-sizzle.js b/lib/dojo/_base/query-sizzle.js
deleted file mode 100644
index aad4e824d..000000000
--- a/lib/dojo/_base/query-sizzle.js
+++ /dev/null
@@ -1,877 +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["dojo._base.query"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.query"] = true;
-/*!
- * Sizzle CSS Selector Engine - v0.9
- * Copyright 2009, John Resig
- * Redistributed with the Dojo Toolkit under the terms of the New BSD license.
- * More information: http://sizzlejs.com/
- *
- * This version from github, dated 1/23/2009, commit: e374a73bbffc12ec3b5f252e7f76e593c508dfa5
- * Modified for dojo loader, and to fit into dojo namespace. This was done by passing
- * dojo object to anonymous function, then assigning Sizzle to dojo.Sizzle instead of window.Sizzle.
- * Then an alias for dojo.query and dojo._filterQueryResult(). dojo.psuedos is not mapped.
- * Finally, dojo.provide/require added.
- */
-
-var startDojoMappings= function(dojo) {
- //Start Dojo mappings.
- dojo.query = function(/*String*/ query, /*String|DOMNode?*/ root, /*Function?*/listCtor){
- listCtor = listCtor || dojo.NodeList;
-
- if(!query){
- return new listCtor();
- }
-
- if(query.constructor == listCtor){
- return query;
- }
- if(!dojo.isString(query)){
- return new listCtor(query); // dojo.NodeList
- }
- if(dojo.isString(root)){
- root = dojo.byId(root);
- if(!root){ return new listCtor(); }
- }
-
- return dojo.Sizzle(query, root, new listCtor());
- };
-
- dojo._filterQueryResult = function(nodeList, simpleFilter){
- return dojo.Sizzle.filter(simpleFilter, nodeList);
- };
-};
-
-//Main Sizzle code follows...
-//ns argument, added for dojo, used at the end of the file.
-var defineSizzle= function(ns){
-
-var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,
- done = 0,
- toString = Object.prototype.toString;
-
-var Sizzle = function(selector, context, results, seed) {
- results = results || [];
- context = context || document;
-
- if ( context.nodeType !== 1 && context.nodeType !== 9 )
- return [];
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- var parts = [], m, set, checkSet, check, mode, extra, prune = true;
-
- // Reset the position of the chunker regexp (start from head)
- chunker.lastIndex = 0;
-
- while ( (m = chunker.exec(selector)) !== null ) {
- parts.push( m[1] );
-
- if ( m[2] ) {
- extra = RegExp.rightContext;
- break;
- }
- }
-
- if ( parts.length > 1 && Expr.match.POS.exec( selector ) ) {
- if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
- var later = "", match;
-
- // Position selectors must be done after the filter
- while ( (match = Expr.match.POS.exec( selector )) ) {
- later += match[0];
- selector = selector.replace( Expr.match.POS, "" );
- }
-
- set = Sizzle.filter( later, Sizzle( selector, context ) );
- } else {
- set = Expr.relative[ parts[0] ] ?
- [ context ] :
- Sizzle( parts.shift(), context );
-
- while ( parts.length ) {
- var tmpSet = [];
-
- selector = parts.shift();
- if ( Expr.relative[ selector ] )
- selector += parts.shift();
-
- for ( var i = 0, l = set.length; i < l; i++ ) {
- Sizzle( selector, set[i], tmpSet );
- }
-
- set = tmpSet;
- }
- }
- } else {
- var ret = seed ?
- { expr: parts.pop(), set: makeArray(seed) } :
- Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context );
- set = Sizzle.filter( ret.expr, ret.set );
-
- if ( parts.length > 0 ) {
- checkSet = makeArray(set);
- } else {
- prune = false;
- }
-
- while ( parts.length ) {
- var cur = parts.pop(), pop = cur;
-
- if ( !Expr.relative[ cur ] ) {
- cur = "";
- } else {
- pop = parts.pop();
- }
-
- if ( pop == null ) {
- pop = context;
- }
-
- Expr.relative[ cur ]( checkSet, pop );
- }
- }
-
- if ( !checkSet ) {
- checkSet = set;
- }
-
- if ( !checkSet ) {
- throw "Syntax error, unrecognized expression: " + (cur || selector);
- }
-
- if ( toString.call(checkSet) === "[object Array]" ) {
- if ( !prune ) {
- results.push.apply( results, checkSet );
- } else if ( context.nodeType === 1 ) {
- for ( var i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
- results.push( set[i] );
- }
- }
- } else {
- for ( var i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
- results.push( set[i] );
- }
- }
- }
- } else {
- makeArray( checkSet, results );
- }
-
- if ( extra ) {
- Sizzle( extra, context, results, seed );
- }
-
- return results;
-};
-
-Sizzle.matches = function(expr, set){
- return Sizzle(expr, null, null, set);
-};
-
-Sizzle.find = function(expr, context){
- var set, match;
-
- if ( !expr ) {
- return [];
- }
-
- for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
- var type = Expr.order[i], match;
-
- if ( (match = Expr.match[ type ].exec( expr )) ) {
- var left = RegExp.leftContext;
-
- if ( left.substr( left.length - 1 ) !== "\\" ) {
- match[1] = (match[1] || "").replace(/\\/g, "");
- set = Expr.find[ type ]( match, context );
- if ( set != null ) {
- expr = expr.replace( Expr.match[ type ], "" );
- break;
- }
- }
- }
- }
-
- if ( !set ) {
- set = context.getElementsByTagName("*");
- }
-
- return {set: set, expr: expr};
-};
-
-Sizzle.filter = function(expr, set, inplace, not){
- var old = expr, result = [], curLoop = set, match, anyFound;
-
- while ( expr && set.length ) {
- for ( var type in Expr.filter ) {
- if ( (match = Expr.match[ type ].exec( expr )) != null ) {
- var filter = Expr.filter[ type ], goodArray = null, goodPos = 0, found, item;
- anyFound = false;
-
- if ( curLoop == result ) {
- result = [];
- }
-
- if ( Expr.preFilter[ type ] ) {
- match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not );
-
- if ( !match ) {
- anyFound = found = true;
- } else if ( match[0] === true ) {
- goodArray = [];
- var last = null, elem;
- for ( var i = 0; (elem = curLoop[i]) !== undefined; i++ ) {
- if ( elem && last !== elem ) {
- goodArray.push( elem );
- last = elem;
- }
- }
- }
- }
-
- if ( match ) {
- for ( var i = 0; (item = curLoop[i]) !== undefined; i++ ) {
- if ( item ) {
- if ( goodArray && item != goodArray[goodPos] ) {
- goodPos++;
- }
-
- found = filter( item, match, goodPos, goodArray );
- var pass = not ^ !!found;
-
- if ( inplace && found != null ) {
- if ( pass ) {
- anyFound = true;
- } else {
- curLoop[i] = false;
- }
- } else if ( pass ) {
- result.push( item );
- anyFound = true;
- }
- }
- }
- }
-
- if ( found !== undefined ) {
- if ( !inplace ) {
- curLoop = result;
- }
-
- expr = expr.replace( Expr.match[ type ], "" );
-
- if ( !anyFound ) {
- return [];
- }
-
- break;
- }
- }
- }
-
- expr = expr.replace(/\s*,\s*/, "");
-
- // Improper expression
- if ( expr == old ) {
- if ( anyFound == null ) {
- throw "Syntax error, unrecognized expression: " + expr;
- } else {
- break;
- }
- }
-
- old = expr;
- }
-
- return curLoop;
-};
-
-var Expr = Sizzle.selectors = {
- order: [ "ID", "NAME", "TAG" ],
- match: {
- ID: /#((?:[\w\u0128-\uFFFF_-]|\\.)+)/,
- CLASS: /\.((?:[\w\u0128-\uFFFF_-]|\\.)+)/,
- NAME: /\[name=['"]*((?:[\w\u0128-\uFFFF_-]|\\.)+)['"]*\]/,
- ATTR: /\[((?:[\w\u0128-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\]/,
- TAG: /^((?:[\w\u0128-\uFFFF\*_-]|\\.)+)/,
- CHILD: /:(only|nth|last|first)-child\(?(even|odd|[\dn+-]*)\)?/,
- POS: /:(nth|eq|gt|lt|first|last|even|odd)\(?(\d*)\)?(?:[^-]|$)/,
- PSEUDO: /:((?:[\w\u0128-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
- },
- attrMap: {
- "class": "className",
- "for": "htmlFor"
- },
- relative: {
- "+": function(checkSet, part){
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
- if ( elem ) {
- var cur = elem.previousSibling;
- while ( cur && cur.nodeType !== 1 ) {
- cur = cur.previousSibling;
- }
- checkSet[i] = typeof part === "string" ?
- cur || false :
- cur === part;
- }
- }
-
- if ( typeof part === "string" ) {
- Sizzle.filter( part, checkSet, true );
- }
- },
- ">": function(checkSet, part){
- if ( typeof part === "string" && !/\W/.test(part) ) {
- part = part.toUpperCase();
-
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
- if ( elem ) {
- var parent = elem.parentNode;
- checkSet[i] = parent.nodeName === part ? parent : false;
- }
- }
- } else {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
- if ( elem ) {
- checkSet[i] = typeof part === "string" ?
- elem.parentNode :
- elem.parentNode === part;
- }
- }
-
- if ( typeof part === "string" ) {
- Sizzle.filter( part, checkSet, true );
- }
- }
- },
- "": function(checkSet, part){
- var doneName = "done" + (done++), checkFn = dirCheck;
-
- if ( !part.match(/\W/) ) {
- var nodeCheck = part = part.toUpperCase();
- checkFn = dirNodeCheck;
- }
-
- checkFn("parentNode", part, doneName, checkSet, nodeCheck);
- },
- "~": function(checkSet, part){
- var doneName = "done" + (done++), checkFn = dirCheck;
-
- if ( typeof part === "string" && !part.match(/\W/) ) {
- var nodeCheck = part = part.toUpperCase();
- checkFn = dirNodeCheck;
- }
-
- checkFn("previousSibling", part, doneName, checkSet, nodeCheck);
- }
- },
- find: {
- ID: function(match, context){
- if ( context.getElementById ) {
- var m = context.getElementById(match[1]);
- return m ? [m] : [];
- }
- },
- NAME: function(match, context){
- return context.getElementsByName ? context.getElementsByName(match[1]) : null;
- },
- TAG: function(match, context){
- return context.getElementsByTagName(match[1]);
- }
- },
- preFilter: {
- CLASS: function(match, curLoop, inplace, result, not){
- match = " " + match[1].replace(/\\/g, "") + " ";
-
- for ( var i = 0; curLoop[i]; i++ ) {
- if ( not ^ (" " + curLoop[i].className + " ").indexOf(match) >= 0 ) {
- if ( !inplace )
- result.push( curLoop[i] );
- } else if ( inplace ) {
- curLoop[i] = false;
- }
- }
-
- return false;
- },
- ID: function(match){
- return match[1];
- },
- TAG: function(match){
- return match[1].toUpperCase();
- },
- CHILD: function(match){
- if ( match[1] == "nth" ) {
- // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
- var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
- match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
- !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
- // calculate the numbers (first)n+(last) including if they are negative
- match[2] = (test[1] + (test[2] || 1)) - 0;
- match[3] = test[3] - 0;
- }
-
- // TODO: Move to normal caching system
- match[0] = "done" + (done++);
-
- return match;
- },
- ATTR: function(match){
- var name = match[1];
-
- if ( Expr.attrMap[name] ) {
- match[1] = Expr.attrMap[name];
- }
-
- if ( match[2] === "~=" ) {
- match[4] = " " + match[4] + " ";
- }
-
- return match;
- },
- PSEUDO: function(match, curLoop, inplace, result, not){
- if ( match[1] === "not" ) {
- // If we're dealing with a complex expression, or a simple one
- if ( match[3].match(chunker).length > 1 ) {
- match[3] = Sizzle(match[3], null, null, curLoop);
- } else {
- var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
- if ( !inplace ) {
- result.push.apply( result, ret );
- }
- return false;
- }
- }
-
- return match;
- },
- POS: function(match){
- match.unshift( true );
- return match;
- }
- },
- filters: {
- enabled: function(elem){
- return elem.disabled === false && elem.type !== "hidden";
- },
- disabled: function(elem){
- return elem.disabled === true;
- },
- checked: function(elem){
- return elem.checked === true;
- },
- selected: function(elem){
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- elem.parentNode.selectedIndex;
- return elem.selected === true;
- },
- parent: function(elem){
- return !!elem.firstChild;
- },
- empty: function(elem){
- return !elem.firstChild;
- },
- has: function(elem, i, match){
- return !!Sizzle( match[3], elem ).length;
- },
- header: function(elem){
- return /h\d/i.test( elem.nodeName );
- },
- text: function(elem){
- return "text" === elem.type;
- },
- radio: function(elem){
- return "radio" === elem.type;
- },
- checkbox: function(elem){
- return "checkbox" === elem.type;
- },
- file: function(elem){
- return "file" === elem.type;
- },
- password: function(elem){
- return "password" === elem.type;
- },
- submit: function(elem){
- return "submit" === elem.type;
- },
- image: function(elem){
- return "image" === elem.type;
- },
- reset: function(elem){
- return "reset" === elem.type;
- },
- button: function(elem){
- return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
- },
- input: function(elem){
- return /input|select|textarea|button/i.test(elem.nodeName);
- }
- },
- setFilters: {
- first: function(elem, i){
- return i === 0;
- },
- last: function(elem, i, match, array){
- return i === array.length - 1;
- },
- even: function(elem, i){
- return i % 2 === 0;
- },
- odd: function(elem, i){
- return i % 2 === 1;
- },
- lt: function(elem, i, match){
- return i < match[3] - 0;
- },
- gt: function(elem, i, match){
- return i > match[3] - 0;
- },
- nth: function(elem, i, match){
- return match[3] - 0 == i;
- },
- eq: function(elem, i, match){
- return match[3] - 0 == i;
- }
- },
- filter: {
- CHILD: function(elem, match){
- var type = match[1], parent = elem.parentNode;
-
- var doneName = match[0];
-
- if ( parent && !parent[ doneName ] ) {
- var count = 1;
-
- for ( var node = parent.firstChild; node; node = node.nextSibling ) {
- if ( node.nodeType == 1 ) {
- node.nodeIndex = count++;
- }
- }
-
- parent[ doneName ] = count - 1;
- }
-
- if ( type == "first" ) {
- return elem.nodeIndex == 1;
- } else if ( type == "last" ) {
- return elem.nodeIndex == parent[ doneName ];
- } else if ( type == "only" ) {
- return parent[ doneName ] == 1;
- } else if ( type == "nth" ) {
- var add = false, first = match[2], last = match[3];
-
- if ( first == 1 && last == 0 ) {
- return true;
- }
-
- if ( first == 0 ) {
- if ( elem.nodeIndex == last ) {
- add = true;
- }
- } else if ( (elem.nodeIndex - last) % first == 0 && (elem.nodeIndex - last) / first >= 0 ) {
- add = true;
- }
-
- return add;
- }
- },
- PSEUDO: function(elem, match, i, array){
- var name = match[1], filter = Expr.filters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
- } else if ( name === "contains" ) {
- return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
- } else if ( name === "not" ) {
- var not = match[3];
-
- for ( var i = 0, l = not.length; i < l; i++ ) {
- if ( not[i] === elem ) {
- return false;
- }
- }
-
- return true;
- }
- },
- ID: function(elem, match){
- return elem.nodeType === 1 && elem.getAttribute("id") === match;
- },
- TAG: function(elem, match){
- return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
- },
- CLASS: function(elem, match){
- return match.test( elem.className );
- },
- ATTR: function(elem, match){
- var result = elem[ match[1] ] || elem.getAttribute( match[1] ), value = result + "", type = match[2], check = match[4];
- return result == null ?
- false :
- type === "=" ?
- value === check :
- type === "*=" ?
- value.indexOf(check) >= 0 :
- type === "~=" ?
- (" " + value + " ").indexOf(check) >= 0 :
- !match[4] ?
- result :
- type === "!=" ?
- value != check :
- type === "^=" ?
- value.indexOf(check) === 0 :
- type === "$=" ?
- value.substr(value.length - check.length) === check :
- type === "|=" ?
- value === check || value.substr(0, check.length + 1) === check + "-" :
- false;
- },
- POS: function(elem, match, i, array){
- var name = match[2], filter = Expr.setFilters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
- }
- }
- }
-};
-
-for ( var type in Expr.match ) {
- Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
-}
-
-var makeArray = function(array, results) {
- array = Array.prototype.slice.call( array );
-
- if ( results ) {
- results.push.apply( results, array );
- return results;
- }
-
- return array;
-};
-
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-try {
- Array.prototype.slice.call( document.documentElement.childNodes );
-
-// Provide a fallback method if it does not work
-} catch(e){
- makeArray = function(array, results) {
- var ret = results || [];
-
- if ( toString.call(array) === "[object Array]" ) {
- Array.prototype.push.apply( ret, array );
- } else {
- if ( typeof array.length === "number" ) {
- for ( var i = 0, l = array.length; i < l; i++ ) {
- ret.push( array[i] );
- }
- } else {
- for ( var i = 0; array[i]; i++ ) {
- ret.push( array[i] );
- }
- }
- }
-
- return ret;
- };
-}
-
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
-(function(){
- // We're going to inject a fake input element with a specified name
- var form = document.createElement("form"),
- id = "script" + (new Date).getTime();
- form.innerHTML = "<input name='" + id + "'/>";
-
- // Inject it into the root element, check its status, and remove it quickly
- var root = document.documentElement;
- root.insertBefore( form, root.firstChild );
-
- // The workaround has to do additional checks after a getElementById
- // Which slows things down for other browsers (hence the branching)
- if ( !!document.getElementById( id ) ) {
- Expr.find.ID = function(match, context){
- if ( context.getElementById ) {
- var m = context.getElementById(match[1]);
- return m ? m.id === match[1] || m.getAttributeNode && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
- }
- };
-
- Expr.filter.ID = function(elem, match){
- var node = elem.getAttributeNode && elem.getAttributeNode("id");
- return elem.nodeType === 1 && node && node.nodeValue === match;
- };
- }
-
- root.removeChild( form );
-})();
-
-// Check to see if the browser returns only elements
-// when doing getElementsByTagName("*")
-(function(){
- // Create a fake element
- var div = document.createElement("div");
- div.appendChild( document.createComment("") );
-
- // Make sure no comments are found
- if ( div.getElementsByTagName("*").length > 0 ) {
- Expr.find.TAG = function(match, context){
- var results = context.getElementsByTagName(match[1]);
-
- // Filter out possible comments
- if ( match[1] === "*" ) {
- var tmp = [];
-
- for ( var i = 0; results[i]; i++ ) {
- if ( results[i].nodeType === 1 ) {
- tmp.push( results[i] );
- }
- }
-
- results = tmp;
- }
-
- return results;
- };
- }
-})();
-
-if ( document.querySelectorAll ) (function(){
- var oldSizzle = Sizzle;
-
- Sizzle = function(query, context, extra, seed){
- context = context || document;
-
- if ( !seed && context.nodeType === 9 ) {
- try {
- return makeArray( context.querySelectorAll(query), extra );
- } catch(e){}
- }
-
- return oldSizzle(query, context, extra, seed);
- };
-
- Sizzle.find = oldSizzle.find;
- Sizzle.filter = oldSizzle.filter;
- Sizzle.selectors = oldSizzle.selectors;
- Sizzle.matches = oldSizzle.matches;
-})();
-
-if ( document.documentElement.getElementsByClassName ) {
- Expr.order.splice(1, 0, "CLASS");
- Expr.find.CLASS = function(match, context) {
- return context.getElementsByClassName(match[1]);
- };
-}
-
-function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
- if ( elem ) {
- elem = elem[dir];
- var match = false;
-
- while ( elem && elem.nodeType ) {
- var done = elem[doneName];
- if ( done ) {
- match = checkSet[ done ];
- break;
- }
-
- if ( elem.nodeType === 1 )
- elem[doneName] = i;
-
- if ( elem.nodeName === cur ) {
- match = elem;
- break;
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-function dirCheck( dir, cur, doneName, checkSet, nodeCheck ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
- if ( elem ) {
- elem = elem[dir];
- var match = false;
-
- while ( elem && elem.nodeType ) {
- if ( elem[doneName] ) {
- match = checkSet[ elem[doneName] ];
- break;
- }
-
- if ( elem.nodeType === 1 ) {
- elem[doneName] = i;
-
- if ( typeof cur !== "string" ) {
- if ( elem === cur ) {
- match = true;
- break;
- }
-
- } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
- match = elem;
- break;
- }
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-var contains = document.compareDocumentPosition ? function(a, b){
- return a.compareDocumentPosition(b) & 16;
-} : function(a, b){
- return a !== b && (a.contains ? a.contains(b) : true);
-};
-
-// EXPOSE
-
-ns.Sizzle = Sizzle;
-
-};
-
-if (this["dojo"]) {
- var defined= 0;
- if (!defined) {
- // must be in a built version that stripped out the define above
- dojo.provide("dojo._base.query");
- dojo.require("dojo._base.NodeList");
- defineSizzle(dojo);
- } // else must be in a source version (or a build that likes define)
-} else {
- defineSizzle(window);
-}
-
-}
diff --git a/lib/dojo/_base/query.js b/lib/dojo/_base/query.js
index 59411952f..f6ee04bc8 100644
--- a/lib/dojo/_base/query.js
+++ b/lib/dojo/_base/query.js
@@ -4,1598 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.query"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.query"] = true;
-(function(){
-
-/*
- dojo.query() architectural overview:
-
- dojo.query is a relatively full-featured CSS3 query library. It is
- designed to take any valid CSS3 selector and return the nodes matching
- the selector. To do this quickly, it processes queries in several
- steps, applying caching where profitable.
-
- The steps (roughly in reverse order of the way they appear in the code):
- 1.) check to see if we already have a "query dispatcher"
- - if so, use that with the given parameterization. Skip to step 4.
- 2.) attempt to determine which branch to dispatch the query to:
- - JS (optimized DOM iteration)
- - native (FF3.1+, Safari 3.1+, IE 8+)
- 3.) tokenize and convert to executable "query dispatcher"
- - this is where the lion's share of the complexity in the
- system lies. In the DOM version, the query dispatcher is
- assembled as a chain of "yes/no" test functions pertaining to
- a section of a simple query statement (".blah:nth-child(odd)"
- but not "div div", which is 2 simple statements). Individual
- statement dispatchers are cached (to prevent re-definition)
- as are entire dispatch chains (to make re-execution of the
- same query fast)
- 4.) the resulting query dispatcher is called in the passed scope
- (by default the top-level document)
- - for DOM queries, this results in a recursive, top-down
- evaluation of nodes based on each simple query section
- - for native implementations, this may mean working around spec
- bugs. So be it.
- 5.) matched nodes are pruned to ensure they are unique (if necessary)
-*/
-
-var defineQuery= function(d){
- // define everything in a closure for compressability reasons. "d" is an
- // alias to "dojo" (or the toolkit alias object, e.g., "acme").
-
- ////////////////////////////////////////////////////////////////////////
- // Toolkit aliases
- ////////////////////////////////////////////////////////////////////////
-
- // if you are extracting dojo.query for use in your own system, you will
- // need to provide these methods and properties. No other porting should be
- // necessary, save for configuring the system to use a class other than
- // dojo.NodeList as the return instance instantiator
- var trim = d.trim;
- var each = d.forEach;
- // d.isIE; // float
- // d.isSafari; // float
- // d.isOpera; // float
- // d.isWebKit; // float
- // d.doc ; // document element
- var qlc = (d._NodeListCtor = d.NodeList);
-
- var getDoc = function(){ return d.doc; };
- // NOTE(alex): the spec is idiotic. CSS queries should ALWAYS be case-sensitive, but nooooooo
- var cssCaseBug = ((d.isWebKit||d.isMozilla) && ((getDoc().compatMode) == "BackCompat"));
-
- ////////////////////////////////////////////////////////////////////////
- // Global utilities
- ////////////////////////////////////////////////////////////////////////
-
-
- // on browsers that support the "children" collection we can avoid a lot of
- // iteration on chaff (non-element) nodes.
- // why.
- var childNodesName = !!getDoc().firstChild["children"] ? "children" : "childNodes";
-
- var specials = ">~+";
-
- // global thunk to determine whether we should treat the current query as
- // case sensitive or not. This switch is flipped by the query evaluator
- // based on the document passed as the context to search.
- var caseSensitive = false;
-
- // how high?
- var yesman = function(){ return true; };
-
- ////////////////////////////////////////////////////////////////////////
- // Tokenizer
- ////////////////////////////////////////////////////////////////////////
-
- var getQueryParts = function(query){
- // summary:
- // state machine for query tokenization
- // description:
- // instead of using a brittle and slow regex-based CSS parser,
- // dojo.query implements an AST-style query representation. This
- // representation is only generated once per query. For example,
- // the same query run multiple times or under different root nodes
- // does not re-parse the selector expression but instead uses the
- // cached data structure. The state machine implemented here
- // terminates on the last " " (space) character and returns an
- // ordered array of query component structures (or "parts"). Each
- // part represents an operator or a simple CSS filtering
- // expression. The structure for parts is documented in the code
- // below.
-
-
- // NOTE:
- // this code is designed to run fast and compress well. Sacrifices
- // to readability and maintainability have been made. Your best
- // bet when hacking the tokenizer is to put The Donnas on *really*
- // loud (may we recommend their "Spend The Night" release?) and
- // just assume you're gonna make mistakes. Keep the unit tests
- // open and run them frequently. Knowing is half the battle ;-)
- if(specials.indexOf(query.slice(-1)) >= 0){
- // if we end with a ">", "+", or "~", that means we're implicitly
- // searching all children, so make it explicit
- query += " * "
- }else{
- // if you have not provided a terminator, one will be provided for
- // you...
- query += " ";
- }
-
- var ts = function(/*Integer*/ s, /*Integer*/ e){
- // trim and slice.
-
- // take an index to start a string slice from and an end position
- // and return a trimmed copy of that sub-string
- return trim(query.slice(s, e));
- }
-
- // the overall data graph of the full query, as represented by queryPart objects
- var queryParts = [];
-
-
- // state keeping vars
- var inBrackets = -1, inParens = -1, inMatchFor = -1,
- inPseudo = -1, inClass = -1, inId = -1, inTag = -1,
- lc = "", cc = "", pStart;
-
- // iteration vars
- var x = 0, // index in the query
- ql = query.length,
- currentPart = null, // data structure representing the entire clause
- _cp = null; // the current pseudo or attr matcher
-
- // several temporary variables are assigned to this structure during a
- // potential sub-expression match:
- // attr:
- // a string representing the current full attribute match in a
- // bracket expression
- // type:
- // if there's an operator in a bracket expression, this is
- // used to keep track of it
- // value:
- // the internals of parenthetical expression for a pseudo. for
- // :nth-child(2n+1), value might be "2n+1"
-
- var endTag = function(){
- // called when the tokenizer hits the end of a particular tag name.
- // Re-sets state variables for tag matching and sets up the matcher
- // to handle the next type of token (tag or operator).
- if(inTag >= 0){
- var tv = (inTag == x) ? null : ts(inTag, x); // .toLowerCase();
- currentPart[ (specials.indexOf(tv) < 0) ? "tag" : "oper" ] = tv;
- inTag = -1;
- }
- }
-
- var endId = function(){
- // called when the tokenizer might be at the end of an ID portion of a match
- if(inId >= 0){
- currentPart.id = ts(inId, x).replace(/\\/g, "");
- inId = -1;
- }
- }
-
- var endClass = function(){
- // called when the tokenizer might be at the end of a class name
- // match. CSS allows for multiple classes, so we augment the
- // current item with another class in its list
- if(inClass >= 0){
- currentPart.classes.push(ts(inClass+1, x).replace(/\\/g, ""));
- inClass = -1;
- }
- }
-
- var endAll = function(){
- // at the end of a simple fragment, so wall off the matches
- endId(); endTag(); endClass();
- }
-
- var endPart = function(){
- endAll();
- if(inPseudo >= 0){
- currentPart.pseudos.push({ name: ts(inPseudo+1, x) });
- }
- // hint to the selector engine to tell it whether or not it
- // needs to do any iteration. Many simple selectors don't, and
- // we can avoid significant construction-time work by advising
- // the system to skip them
- currentPart.loops = (
- currentPart.pseudos.length ||
- currentPart.attrs.length ||
- currentPart.classes.length );
-
- currentPart.oquery = currentPart.query = ts(pStart, x); // save the full expression as a string
-
-
- // otag/tag are hints to suggest to the system whether or not
- // it's an operator or a tag. We save a copy of otag since the
- // tag name is cast to upper-case in regular HTML matches. The
- // system has a global switch to figure out if the current
- // expression needs to be case sensitive or not and it will use
- // otag or tag accordingly
- currentPart.otag = currentPart.tag = (currentPart["oper"]) ? null : (currentPart.tag || "*");
-
- if(currentPart.tag){
- // if we're in a case-insensitive HTML doc, we likely want
- // the toUpperCase when matching on element.tagName. If we
- // do it here, we can skip the string op per node
- // comparison
- currentPart.tag = currentPart.tag.toUpperCase();
- }
-
- // add the part to the list
- if(queryParts.length && (queryParts[queryParts.length-1].oper)){
- // operators are always infix, so we remove them from the
- // list and attach them to the next match. The evaluator is
- // responsible for sorting out how to handle them.
- currentPart.infixOper = queryParts.pop();
- currentPart.query = currentPart.infixOper.query + " " + currentPart.query;
- /*
- console.debug( "swapping out the infix",
- currentPart.infixOper,
- "and attaching it to",
- currentPart);
- */
- }
- queryParts.push(currentPart);
-
- currentPart = null;
- }
-
- // iterate over the query, character by character, building up a
- // list of query part objects
- for(; lc=cc, cc=query.charAt(x), x < ql; x++){
- // cc: the current character in the match
- // lc: the last character (if any)
-
- // someone is trying to escape something, so don't try to match any
- // fragments. We assume we're inside a literal.
- if(lc == "\\"){ continue; }
- if(!currentPart){ // a part was just ended or none has yet been created
- // NOTE: I hate all this alloc, but it's shorter than writing tons of if's
- pStart = x;
- // rules describe full CSS sub-expressions, like:
- // #someId
- // .className:first-child
- // but not:
- // thinger > div.howdy[type=thinger]
- // the indidual components of the previous query would be
- // split into 3 parts that would be represented a structure
- // like:
- // [
- // {
- // query: "thinger",
- // tag: "thinger",
- // },
- // {
- // query: "div.howdy[type=thinger]",
- // classes: ["howdy"],
- // infixOper: {
- // query: ">",
- // oper: ">",
- // }
- // },
- // ]
- currentPart = {
- query: null, // the full text of the part's rule
- pseudos: [], // CSS supports multiple pseud-class matches in a single rule
- attrs: [], // CSS supports multi-attribute match, so we need an array
- classes: [], // class matches may be additive, e.g.: .thinger.blah.howdy
- tag: null, // only one tag...
- oper: null, // ...or operator per component. Note that these wind up being exclusive.
- id: null, // the id component of a rule
- getTag: function(){
- return (caseSensitive) ? this.otag : this.tag;
- }
- };
-
- // if we don't have a part, we assume we're going to start at
- // the beginning of a match, which should be a tag name. This
- // might fault a little later on, but we detect that and this
- // iteration will still be fine.
- inTag = x;
- }
-
- if(inBrackets >= 0){
- // look for a the close first
- if(cc == "]"){ // if we're in a [...] clause and we end, do assignment
- if(!_cp.attr){
- // no attribute match was previously begun, so we
- // assume this is an attribute existence match in the
- // form of [someAttributeName]
- _cp.attr = ts(inBrackets+1, x);
- }else{
- // we had an attribute already, so we know that we're
- // matching some sort of value, as in [attrName=howdy]
- _cp.matchFor = ts((inMatchFor||inBrackets+1), x);
- }
- var cmf = _cp.matchFor;
- if(cmf){
- // try to strip quotes from the matchFor value. We want
- // [attrName=howdy] to match the same
- // as [attrName = 'howdy' ]
- if( (cmf.charAt(0) == '"') || (cmf.charAt(0) == "'") ){
- _cp.matchFor = cmf.slice(1, -1);
- }
- }
- // end the attribute by adding it to the list of attributes.
- currentPart.attrs.push(_cp);
- _cp = null; // necessary?
- inBrackets = inMatchFor = -1;
- }else if(cc == "="){
- // if the last char was an operator prefix, make sure we
- // record it along with the "=" operator.
- var addToCc = ("|~^$*".indexOf(lc) >=0 ) ? lc : "";
- _cp.type = addToCc+cc;
- _cp.attr = ts(inBrackets+1, x-addToCc.length);
- inMatchFor = x+1;
- }
- // now look for other clause parts
- }else if(inParens >= 0){
- // if we're in a parenthetical expression, we need to figure
- // out if it's attached to a pseudo-selector rule like
- // :nth-child(1)
- if(cc == ")"){
- if(inPseudo >= 0){
- _cp.value = ts(inParens+1, x);
- }
- inPseudo = inParens = -1;
- }
- }else if(cc == "#"){
- // start of an ID match
- endAll();
- inId = x+1;
- }else if(cc == "."){
- // start of a class match
- endAll();
- inClass = x;
- }else if(cc == ":"){
- // start of a pseudo-selector match
- endAll();
- inPseudo = x;
- }else if(cc == "["){
- // start of an attribute match.
- endAll();
- inBrackets = x;
- // provide a new structure for the attribute match to fill-in
- _cp = {
- /*=====
- attr: null, type: null, matchFor: null
- =====*/
- };
- }else if(cc == "("){
- // we really only care if we've entered a parenthetical
- // expression if we're already inside a pseudo-selector match
- if(inPseudo >= 0){
- // provide a new structure for the pseudo match to fill-in
- _cp = {
- name: ts(inPseudo+1, x),
- value: null
- }
- currentPart.pseudos.push(_cp);
- }
- inParens = x;
- }else if(
- (cc == " ") &&
- // if it's a space char and the last char is too, consume the
- // current one without doing more work
- (lc != cc)
- ){
- endPart();
- }
- }
- return queryParts;
- };
-
-
- ////////////////////////////////////////////////////////////////////////
- // DOM query infrastructure
- ////////////////////////////////////////////////////////////////////////
-
- var agree = function(first, second){
- // the basic building block of the yes/no chaining system. agree(f1,
- // f2) generates a new function which returns the boolean results of
- // both of the passed functions to a single logical-anded result. If
- // either are not passed, the other is used exclusively.
- if(!first){ return second; }
- if(!second){ return first; }
-
- return function(){
- return first.apply(window, arguments) && second.apply(window, arguments);
- }
- };
-
- var getArr = function(i, arr){
- // helps us avoid array alloc when we don't need it
- var r = arr||[]; // FIXME: should this be 'new d._NodeListCtor()' ?
- if(i){ r.push(i); }
- return r;
- };
-
- var _isElement = function(n){ return (1 == n.nodeType); };
-
- // FIXME: need to coalesce _getAttr with defaultGetter
- var blank = "";
- var _getAttr = function(elem, attr){
- if(!elem){ return blank; }
- if(attr == "class"){
- return elem.className || blank;
- }
- if(attr == "for"){
- return elem.htmlFor || blank;
- }
- if(attr == "style"){
- return elem.style.cssText || blank;
- }
- return (caseSensitive ? elem.getAttribute(attr) : elem.getAttribute(attr, 2)) || blank;
- };
-
- var attrs = {
- "*=": function(attr, value){
- return function(elem){
- // E[foo*="bar"]
- // an E element whose "foo" attribute value contains
- // the substring "bar"
- return (_getAttr(elem, attr).indexOf(value)>=0);
- }
- },
- "^=": function(attr, value){
- // E[foo^="bar"]
- // an E element whose "foo" attribute value begins exactly
- // with the string "bar"
- return function(elem){
- return (_getAttr(elem, attr).indexOf(value)==0);
- }
- },
- "$=": function(attr, value){
- // E[foo$="bar"]
- // an E element whose "foo" attribute value ends exactly
- // with the string "bar"
- var tval = " "+value;
- return function(elem){
- var ea = " "+_getAttr(elem, attr);
- return (ea.lastIndexOf(value)==(ea.length-value.length));
- }
- },
- "~=": function(attr, value){
- // E[foo~="bar"]
- // an E element whose "foo" attribute value is a list of
- // space-separated values, one of which is exactly equal
- // to "bar"
-
- // return "[contains(concat(' ',@"+attr+",' '), ' "+ value +" ')]";
- var tval = " "+value+" ";
- return function(elem){
- var ea = " "+_getAttr(elem, attr)+" ";
- return (ea.indexOf(tval)>=0);
- }
- },
- "|=": function(attr, value){
- // E[hreflang|="en"]
- // an E element whose "hreflang" attribute has a
- // hyphen-separated list of values beginning (from the
- // left) with "en"
- var valueDash = " "+value+"-";
- return function(elem){
- var ea = " "+_getAttr(elem, attr);
- return (
- (ea == value) ||
- (ea.indexOf(valueDash)==0)
- );
- }
- },
- "=": function(attr, value){
- return function(elem){
- return (_getAttr(elem, attr) == value);
- }
- }
- };
-
- // avoid testing for node type if we can. Defining this in the negative
- // here to avoid negation in the fast path.
- var _noNES = (typeof getDoc().firstChild.nextElementSibling == "undefined");
- var _ns = !_noNES ? "nextElementSibling" : "nextSibling";
- var _ps = !_noNES ? "previousElementSibling" : "previousSibling";
- var _simpleNodeTest = (_noNES ? _isElement : yesman);
-
- var _lookLeft = function(node){
- // look left
- while(node = node[_ps]){
- if(_simpleNodeTest(node)){ return false; }
- }
- return true;
- };
-
- var _lookRight = function(node){
- // look right
- while(node = node[_ns]){
- if(_simpleNodeTest(node)){ return false; }
- }
- return true;
- };
-
- var getNodeIndex = function(node){
- var root = node.parentNode;
- var i = 0,
- tret = root[childNodesName],
- ci = (node["_i"]||-1),
- cl = (root["_l"]||-1);
-
- if(!tret){ return -1; }
- var l = tret.length;
-
- // we calculate the parent length as a cheap way to invalidate the
- // cache. It's not 100% accurate, but it's much more honest than what
- // other libraries do
- if( cl == l && ci >= 0 && cl >= 0 ){
- // if it's legit, tag and release
- return ci;
- }
-
- // else re-key things
- root["_l"] = l;
- ci = -1;
- for(var te = root["firstElementChild"]||root["firstChild"]; te; te = te[_ns]){
- if(_simpleNodeTest(te)){
- te["_i"] = ++i;
- if(node === te){
- // NOTE:
- // shortcutting the return at this step in indexing works
- // very well for benchmarking but we avoid it here since
- // it leads to potential O(n^2) behavior in sequential
- // getNodexIndex operations on a previously un-indexed
- // parent. We may revisit this at a later time, but for
- // now we just want to get the right answer more often
- // than not.
- ci = i;
- }
- }
- }
- return ci;
- };
-
- var isEven = function(elem){
- return !((getNodeIndex(elem)) % 2);
- };
-
- var isOdd = function(elem){
- return ((getNodeIndex(elem)) % 2);
- };
-
- var pseudos = {
- "checked": function(name, condition){
- return function(elem){
- return !!("checked" in elem ? elem.checked : elem.selected);
- }
- },
- "first-child": function(){ return _lookLeft; },
- "last-child": function(){ return _lookRight; },
- "only-child": function(name, condition){
- return function(node){
- if(!_lookLeft(node)){ return false; }
- if(!_lookRight(node)){ return false; }
- return true;
- };
- },
- "empty": function(name, condition){
- return function(elem){
- // DomQuery and jQuery get this wrong, oddly enough.
- // The CSS 3 selectors spec is pretty explicit about it, too.
- var cn = elem.childNodes;
- var cnl = elem.childNodes.length;
- // if(!cnl){ return true; }
- for(var x=cnl-1; x >= 0; x--){
- var nt = cn[x].nodeType;
- if((nt === 1)||(nt == 3)){ return false; }
- }
- return true;
- }
- },
- "contains": function(name, condition){
- var cz = condition.charAt(0);
- if( cz == '"' || cz == "'" ){ //remove quote
- condition = condition.slice(1, -1);
- }
- return function(elem){
- return (elem.innerHTML.indexOf(condition) >= 0);
- }
- },
- "not": function(name, condition){
- var p = getQueryParts(condition)[0];
- var ignores = { el: 1 };
- if(p.tag != "*"){
- ignores.tag = 1;
- }
- if(!p.classes.length){
- ignores.classes = 1;
- }
- var ntf = getSimpleFilterFunc(p, ignores);
- return function(elem){
- return (!ntf(elem));
- }
- },
- "nth-child": function(name, condition){
- var pi = parseInt;
- // avoid re-defining function objects if we can
- if(condition == "odd"){
- return isOdd;
- }else if(condition == "even"){
- return isEven;
- }
- // FIXME: can we shorten this?
- if(condition.indexOf("n") != -1){
- var tparts = condition.split("n", 2);
- var pred = tparts[0] ? ((tparts[0] == '-') ? -1 : pi(tparts[0])) : 1;
- var idx = tparts[1] ? pi(tparts[1]) : 0;
- var lb = 0, ub = -1;
- if(pred > 0){
- if(idx < 0){
- idx = (idx % pred) && (pred + (idx % pred));
- }else if(idx>0){
- if(idx >= pred){
- lb = idx - idx % pred;
- }
- idx = idx % pred;
- }
- }else if(pred<0){
- pred *= -1;
- // idx has to be greater than 0 when pred is negative;
- // shall we throw an error here?
- if(idx > 0){
- ub = idx;
- idx = idx % pred;
- }
- }
- if(pred > 0){
- return function(elem){
- var i = getNodeIndex(elem);
- return (i>=lb) && (ub<0 || i<=ub) && ((i % pred) == idx);
- }
- }else{
- condition = idx;
- }
- }
- var ncount = pi(condition);
- return function(elem){
- return (getNodeIndex(elem) == ncount);
- }
- }
- };
-
- var defaultGetter = (d.isIE < 9 || (dojo.isIE && dojo.isQuirks)) ? function(cond){
- var clc = cond.toLowerCase();
- if(clc == "class"){ cond = "className"; }
- return function(elem){
- return (caseSensitive ? elem.getAttribute(cond) : elem[cond]||elem[clc]);
- }
- } : function(cond){
- return function(elem){
- return (elem && elem.getAttribute && elem.hasAttribute(cond));
- }
- };
-
- var getSimpleFilterFunc = function(query, ignores){
- // generates a node tester function based on the passed query part. The
- // query part is one of the structures generated by the query parser
- // when it creates the query AST. The "ignores" object specifies which
- // (if any) tests to skip, allowing the system to avoid duplicating
- // work where it may have already been taken into account by other
- // factors such as how the nodes to test were fetched in the first
- // place
- if(!query){ return yesman; }
- ignores = ignores||{};
-
- var ff = null;
-
- if(!("el" in ignores)){
- ff = agree(ff, _isElement);
- }
-
- if(!("tag" in ignores)){
- if(query.tag != "*"){
- ff = agree(ff, function(elem){
- return (elem && (elem.tagName == query.getTag()));
- });
- }
- }
-
- if(!("classes" in ignores)){
- each(query.classes, function(cname, idx, arr){
- // get the class name
- /*
- var isWildcard = cname.charAt(cname.length-1) == "*";
- if(isWildcard){
- cname = cname.substr(0, cname.length-1);
- }
- // I dislike the regex thing, even if memoized in a cache, but it's VERY short
- var re = new RegExp("(?:^|\\s)" + cname + (isWildcard ? ".*" : "") + "(?:\\s|$)");
- */
- var re = new RegExp("(?:^|\\s)" + cname + "(?:\\s|$)");
- ff = agree(ff, function(elem){
- return re.test(elem.className);
- });
- ff.count = idx;
- });
- }
-
- if(!("pseudos" in ignores)){
- each(query.pseudos, function(pseudo){
- var pn = pseudo.name;
- if(pseudos[pn]){
- ff = agree(ff, pseudos[pn](pn, pseudo.value));
- }
- });
- }
-
- if(!("attrs" in ignores)){
- each(query.attrs, function(attr){
- var matcher;
- var a = attr.attr;
- // type, attr, matchFor
- if(attr.type && attrs[attr.type]){
- matcher = attrs[attr.type](a, attr.matchFor);
- }else if(a.length){
- matcher = defaultGetter(a);
- }
- if(matcher){
- ff = agree(ff, matcher);
- }
- });
- }
-
- if(!("id" in ignores)){
- if(query.id){
- ff = agree(ff, function(elem){
- return (!!elem && (elem.id == query.id));
- });
- }
- }
-
- if(!ff){
- if(!("default" in ignores)){
- ff = yesman;
- }
- }
- return ff;
- };
-
- var _nextSibling = function(filterFunc){
- return function(node, ret, bag){
- while(node = node[_ns]){
- if(_noNES && (!_isElement(node))){ continue; }
- if(
- (!bag || _isUnique(node, bag)) &&
- filterFunc(node)
- ){
- ret.push(node);
- }
- break;
- }
- return ret;
- }
- };
-
- var _nextSiblings = function(filterFunc){
- return function(root, ret, bag){
- var te = root[_ns];
- while(te){
- if(_simpleNodeTest(te)){
- if(bag && !_isUnique(te, bag)){
- break;
- }
- if(filterFunc(te)){
- ret.push(te);
- }
- }
- te = te[_ns];
- }
- return ret;
- }
- };
-
- // get an array of child *elements*, skipping text and comment nodes
- var _childElements = function(filterFunc){
- filterFunc = filterFunc||yesman;
- return function(root, ret, bag){
- // get an array of child elements, skipping text and comment nodes
- var te, x = 0, tret = root[childNodesName];
- while(te = tret[x++]){
- if(
- _simpleNodeTest(te) &&
- (!bag || _isUnique(te, bag)) &&
- (filterFunc(te, x))
- ){
- ret.push(te);
- }
- }
- return ret;
- };
- };
-
- /*
- // thanks, Dean!
- var itemIsAfterRoot = d.isIE ? function(item, root){
- return (item.sourceIndex > root.sourceIndex);
- } : function(item, root){
- return (item.compareDocumentPosition(root) == 2);
- };
- */
-
- // test to see if node is below root
- var _isDescendant = function(node, root){
- var pn = node.parentNode;
- while(pn){
- if(pn == root){
- break;
- }
- pn = pn.parentNode;
- }
- return !!pn;
- };
-
- var _getElementsFuncCache = {};
-
- var getElementsFunc = function(query){
- var retFunc = _getElementsFuncCache[query.query];
- // if we've got a cached dispatcher, just use that
- if(retFunc){ return retFunc; }
- // else, generate a new on
-
- // NOTE:
- // this function returns a function that searches for nodes and
- // filters them. The search may be specialized by infix operators
- // (">", "~", or "+") else it will default to searching all
- // descendants (the " " selector). Once a group of children is
- // found, a test function is applied to weed out the ones we
- // don't want. Many common cases can be fast-pathed. We spend a
- // lot of cycles to create a dispatcher that doesn't do more work
- // than necessary at any point since, unlike this function, the
- // dispatchers will be called every time. The logic of generating
- // efficient dispatchers looks like this in pseudo code:
- //
- // # if it's a purely descendant query (no ">", "+", or "~" modifiers)
- // if infixOperator == " ":
- // if only(id):
- // return def(root):
- // return d.byId(id, root);
- //
- // elif id:
- // return def(root):
- // return filter(d.byId(id, root));
- //
- // elif cssClass && getElementsByClassName:
- // return def(root):
- // return filter(root.getElementsByClassName(cssClass));
- //
- // elif only(tag):
- // return def(root):
- // return root.getElementsByTagName(tagName);
- //
- // else:
- // # search by tag name, then filter
- // return def(root):
- // return filter(root.getElementsByTagName(tagName||"*"));
- //
- // elif infixOperator == ">":
- // # search direct children
- // return def(root):
- // return filter(root.children);
- //
- // elif infixOperator == "+":
- // # search next sibling
- // return def(root):
- // return filter(root.nextElementSibling);
- //
- // elif infixOperator == "~":
- // # search rightward siblings
- // return def(root):
- // return filter(nextSiblings(root));
-
- var io = query.infixOper;
- var oper = (io ? io.oper : "");
- // the default filter func which tests for all conditions in the query
- // part. This is potentially inefficient, so some optimized paths may
- // re-define it to test fewer things.
- var filterFunc = getSimpleFilterFunc(query, { el: 1 });
- var qt = query.tag;
- var wildcardTag = ("*" == qt);
- var ecs = getDoc()["getElementsByClassName"];
-
- if(!oper){
- // if there's no infix operator, then it's a descendant query. ID
- // and "elements by class name" variants can be accelerated so we
- // call them out explicitly:
- if(query.id){
- // testing shows that the overhead of yesman() is acceptable
- // and can save us some bytes vs. re-defining the function
- // everywhere.
- filterFunc = (!query.loops && wildcardTag) ?
- yesman :
- getSimpleFilterFunc(query, { el: 1, id: 1 });
-
- retFunc = function(root, arr){
- var te = d.byId(query.id, (root.ownerDocument||root));
- if(!te || !filterFunc(te)){ return; }
- if(9 == root.nodeType){ // if root's a doc, we just return directly
- return getArr(te, arr);
- }else{ // otherwise check ancestry
- if(_isDescendant(te, root)){
- return getArr(te, arr);
- }
- }
- }
- }else if(
- ecs &&
- // isAlien check. Workaround for Prototype.js being totally evil/dumb.
- /\{\s*\[native code\]\s*\}/.test(String(ecs)) &&
- query.classes.length &&
- !cssCaseBug
- ){
- // it's a class-based query and we've got a fast way to run it.
-
- // ignore class and ID filters since we will have handled both
- filterFunc = getSimpleFilterFunc(query, { el: 1, classes: 1, id: 1 });
- var classesString = query.classes.join(" ");
- retFunc = function(root, arr, bag){
- var ret = getArr(0, arr), te, x=0;
- var tret = root.getElementsByClassName(classesString);
- while((te = tret[x++])){
- if(filterFunc(te, root) && _isUnique(te, bag)){
- ret.push(te);
- }
- }
- return ret;
- };
-
- }else if(!wildcardTag && !query.loops){
- // it's tag only. Fast-path it.
- retFunc = function(root, arr, bag){
- var ret = getArr(0, arr), te, x=0;
- var tret = root.getElementsByTagName(query.getTag());
- while((te = tret[x++])){
- if(_isUnique(te, bag)){
- ret.push(te);
- }
- }
- return ret;
- };
- }else{
- // the common case:
- // a descendant selector without a fast path. By now it's got
- // to have a tag selector, even if it's just "*" so we query
- // by that and filter
- filterFunc = getSimpleFilterFunc(query, { el: 1, tag: 1, id: 1 });
- retFunc = function(root, arr, bag){
- var ret = getArr(0, arr), te, x=0;
- // we use getTag() to avoid case sensitivity issues
- var tret = root.getElementsByTagName(query.getTag());
- while((te = tret[x++])){
- if(filterFunc(te, root) && _isUnique(te, bag)){
- ret.push(te);
- }
- }
- return ret;
- };
- }
- }else{
- // the query is scoped in some way. Instead of querying by tag we
- // use some other collection to find candidate nodes
- var skipFilters = { el: 1 };
- if(wildcardTag){
- skipFilters.tag = 1;
- }
- filterFunc = getSimpleFilterFunc(query, skipFilters);
- if("+" == oper){
- retFunc = _nextSibling(filterFunc);
- }else if("~" == oper){
- retFunc = _nextSiblings(filterFunc);
- }else if(">" == oper){
- retFunc = _childElements(filterFunc);
- }
- }
- // cache it and return
- return _getElementsFuncCache[query.query] = retFunc;
- };
-
- var filterDown = function(root, queryParts){
- // NOTE:
- // this is the guts of the DOM query system. It takes a list of
- // parsed query parts and a root and finds children which match
- // the selector represented by the parts
- var candidates = getArr(root), qp, x, te, qpl = queryParts.length, bag, ret;
-
- for(var i = 0; i < qpl; i++){
- ret = [];
- qp = queryParts[i];
- x = candidates.length - 1;
- if(x > 0){
- // if we have more than one root at this level, provide a new
- // hash to use for checking group membership but tell the
- // system not to post-filter us since we will already have been
- // gauranteed to be unique
- bag = {};
- ret.nozip = true;
- }
- var gef = getElementsFunc(qp);
- for(var j = 0; (te = candidates[j]); j++){
- // for every root, get the elements that match the descendant
- // selector, adding them to the "ret" array and filtering them
- // via membership in this level's bag. If there are more query
- // parts, then this level's return will be used as the next
- // level's candidates
- gef(te, ret, bag);
- }
- if(!ret.length){ break; }
- candidates = ret;
- }
- return ret;
- };
-
- ////////////////////////////////////////////////////////////////////////
- // the query runner
- ////////////////////////////////////////////////////////////////////////
-
- // these are the primary caches for full-query results. The query
- // dispatcher functions are generated then stored here for hash lookup in
- // the future
- var _queryFuncCacheDOM = {},
- _queryFuncCacheQSA = {};
-
- // this is the second level of spliting, from full-length queries (e.g.,
- // "div.foo .bar") into simple query expressions (e.g., ["div.foo",
- // ".bar"])
- var getStepQueryFunc = function(query){
- var qparts = getQueryParts(trim(query));
-
- // if it's trivial, avoid iteration and zipping costs
- if(qparts.length == 1){
- // we optimize this case here to prevent dispatch further down the
- // chain, potentially slowing things down. We could more elegantly
- // handle this in filterDown(), but it's slower for simple things
- // that need to be fast (e.g., "#someId").
- var tef = getElementsFunc(qparts[0]);
- return function(root){
- var r = tef(root, new qlc());
- if(r){ r.nozip = true; }
- return r;
- }
- }
-
- // otherwise, break it up and return a runner that iterates over the parts recursively
- return function(root){
- return filterDown(root, qparts);
- }
- };
-
- // NOTES:
- // * we can't trust QSA for anything but document-rooted queries, so
- // caching is split into DOM query evaluators and QSA query evaluators
- // * caching query results is dirty and leak-prone (or, at a minimum,
- // prone to unbounded growth). Other toolkits may go this route, but
- // they totally destroy their own ability to manage their memory
- // footprint. If we implement it, it should only ever be with a fixed
- // total element reference # limit and an LRU-style algorithm since JS
- // has no weakref support. Caching compiled query evaluators is also
- // potentially problematic, but even on large documents the size of the
- // query evaluators is often < 100 function objects per evaluator (and
- // LRU can be applied if it's ever shown to be an issue).
- // * since IE's QSA support is currently only for HTML documents and even
- // then only in IE 8's "standards mode", we have to detect our dispatch
- // route at query time and keep 2 separate caches. Ugg.
-
- // we need to determine if we think we can run a given query via
- // querySelectorAll or if we'll need to fall back on DOM queries to get
- // there. We need a lot of information about the environment and the query
- // to make the determiniation (e.g. does it support QSA, does the query in
- // question work in the native QSA impl, etc.).
- var nua = navigator.userAgent;
- // some versions of Safari provided QSA, but it was buggy and crash-prone.
- // We need te detect the right "internal" webkit version to make this work.
- var wk = "WebKit/";
- var is525 = (
- d.isWebKit &&
- (nua.indexOf(wk) > 0) &&
- (parseFloat(nua.split(wk)[1]) > 528)
- );
-
- // IE QSA queries may incorrectly include comment nodes, so we throw the
- // zipping function into "remove" comments mode instead of the normal "skip
- // it" which every other QSA-clued browser enjoys
- var noZip = d.isIE ? "commentStrip" : "nozip";
-
- var qsa = "querySelectorAll";
- var qsaAvail = (
- !!getDoc()[qsa] &&
- // see #5832
- (!d.isSafari || (d.isSafari > 3.1) || is525 )
- );
-
- //Don't bother with n+3 type of matches, IE complains if we modify those.
- var infixSpaceRe = /n\+\d|([^ ])?([>~+])([^ =])?/g;
- var infixSpaceFunc = function(match, pre, ch, post) {
- return ch ? (pre ? pre + " " : "") + ch + (post ? " " + post : "") : /*n+3*/ match;
- };
-
- var getQueryFunc = function(query, forceDOM){
- //Normalize query. The CSS3 selectors spec allows for omitting spaces around
- //infix operators, >, ~ and +
- //Do the work here since detection for spaces is used as a simple "not use QSA"
- //test below.
- query = query.replace(infixSpaceRe, infixSpaceFunc);
-
- if(qsaAvail){
- // if we've got a cached variant and we think we can do it, run it!
- var qsaCached = _queryFuncCacheQSA[query];
- if(qsaCached && !forceDOM){ return qsaCached; }
- }
-
- // else if we've got a DOM cached variant, assume that we already know
- // all we need to and use it
- var domCached = _queryFuncCacheDOM[query];
- if(domCached){ return domCached; }
-
- // TODO:
- // today we're caching DOM and QSA branches separately so we
- // recalc useQSA every time. If we had a way to tag root+query
- // efficiently, we'd be in good shape to do a global cache.
-
- var qcz = query.charAt(0);
- var nospace = (-1 == query.indexOf(" "));
-
- // byId searches are wicked fast compared to QSA, even when filtering
- // is required
- if( (query.indexOf("#") >= 0) && (nospace) ){
- forceDOM = true;
- }
-
- var useQSA = (
- qsaAvail && (!forceDOM) &&
- // as per CSS 3, we can't currently start w/ combinator:
- // http://www.w3.org/TR/css3-selectors/#w3cselgrammar
- (specials.indexOf(qcz) == -1) &&
- // IE's QSA impl sucks on pseudos
- (!d.isIE || (query.indexOf(":") == -1)) &&
-
- (!(cssCaseBug && (query.indexOf(".") >= 0))) &&
-
- // FIXME:
- // need to tighten up browser rules on ":contains" and "|=" to
- // figure out which aren't good
- // Latest webkit (around 531.21.8) does not seem to do well with :checked on option
- // elements, even though according to spec, selected options should
- // match :checked. So go nonQSA for it:
- // http://bugs.dojotoolkit.org/ticket/5179
- (query.indexOf(":contains") == -1) && (query.indexOf(":checked") == -1) &&
- (query.indexOf("|=") == -1) // some browsers don't grok it
- );
-
- // TODO:
- // if we've got a descendant query (e.g., "> .thinger" instead of
- // just ".thinger") in a QSA-able doc, but are passed a child as a
- // root, it should be possible to give the item a synthetic ID and
- // trivially rewrite the query to the form "#synid > .thinger" to
- // use the QSA branch
-
-
- if(useQSA){
- var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ?
- (query + " *") : query;
- return _queryFuncCacheQSA[query] = function(root){
- try{
- // the QSA system contains an egregious spec bug which
- // limits us, effectively, to only running QSA queries over
- // entire documents. See:
- // http://ejohn.org/blog/thoughts-on-queryselectorall/
- // despite this, we can also handle QSA runs on simple
- // selectors, but we don't want detection to be expensive
- // so we're just checking for the presence of a space char
- // right now. Not elegant, but it's cheaper than running
- // the query parser when we might not need to
- if(!((9 == root.nodeType) || nospace)){ throw ""; }
- var r = root[qsa](tq);
- // skip expensive duplication checks and just wrap in a NodeList
- r[noZip] = true;
- return r;
- }catch(e){
- // else run the DOM branch on this query, ensuring that we
- // default that way in the future
- return getQueryFunc(query, true)(root);
- }
- }
- }else{
- // DOM branch
- var parts = query.split(/\s*,\s*/);
- return _queryFuncCacheDOM[query] = ((parts.length < 2) ?
- // if not a compound query (e.g., ".foo, .bar"), cache and return a dispatcher
- getStepQueryFunc(query) :
- // if it *is* a complex query, break it up into its
- // constituent parts and return a dispatcher that will
- // merge the parts when run
- function(root){
- var pindex = 0, // avoid array alloc for every invocation
- ret = [],
- tp;
- while((tp = parts[pindex++])){
- ret = ret.concat(getStepQueryFunc(tp)(root));
- }
- return ret;
- }
- );
- }
- };
-
- var _zipIdx = 0;
-
- // NOTE:
- // this function is Moo inspired, but our own impl to deal correctly
- // with XML in IE
- var _nodeUID = d.isIE ? function(node){
- if(caseSensitive){
- // XML docs don't have uniqueID on their nodes
- return (node.getAttribute("_uid") || node.setAttribute("_uid", ++_zipIdx) || _zipIdx);
-
- }else{
- return node.uniqueID;
- }
- } :
- function(node){
- return (node._uid || (node._uid = ++_zipIdx));
- };
-
- // determine if a node in is unique in a "bag". In this case we don't want
- // to flatten a list of unique items, but rather just tell if the item in
- // question is already in the bag. Normally we'd just use hash lookup to do
- // this for us but IE's DOM is busted so we can't really count on that. On
- // the upside, it gives us a built in unique ID function.
- var _isUnique = function(node, bag){
- if(!bag){ return 1; }
- var id = _nodeUID(node);
- if(!bag[id]){ return bag[id] = 1; }
- return 0;
- };
-
- // attempt to efficiently determine if an item in a list is a dupe,
- // returning a list of "uniques", hopefully in doucment order
- var _zipIdxName = "_zipIdx";
- var _zip = function(arr){
- if(arr && arr.nozip){
- return (qlc._wrap) ? qlc._wrap(arr) : arr;
- }
- // var ret = new d._NodeListCtor();
- var ret = new qlc();
- if(!arr || !arr.length){ return ret; }
- if(arr[0]){
- ret.push(arr[0]);
- }
- if(arr.length < 2){ return ret; }
-
- _zipIdx++;
-
- // we have to fork here for IE and XML docs because we can't set
- // expandos on their nodes (apparently). *sigh*
- if(d.isIE && caseSensitive){
- var szidx = _zipIdx+"";
- arr[0].setAttribute(_zipIdxName, szidx);
- for(var x = 1, te; te = arr[x]; x++){
- if(arr[x].getAttribute(_zipIdxName) != szidx){
- ret.push(te);
- }
- te.setAttribute(_zipIdxName, szidx);
- }
- }else if(d.isIE && arr.commentStrip){
- try{
- for(var x = 1, te; te = arr[x]; x++){
- if(_isElement(te)){
- ret.push(te);
- }
- }
- }catch(e){ /* squelch */ }
- }else{
- if(arr[0]){ arr[0][_zipIdxName] = _zipIdx; }
- for(var x = 1, te; te = arr[x]; x++){
- if(arr[x][_zipIdxName] != _zipIdx){
- ret.push(te);
- }
- te[_zipIdxName] = _zipIdx;
- }
- }
- return ret;
- };
-
- // the main executor
- d.query = function(/*String*/ query, /*String|DOMNode?*/ root){
- // summary:
- // Returns nodes which match the given CSS3 selector, searching the
- // entire document by default but optionally taking a node to scope
- // the search by. Returns an instance of dojo.NodeList.
- // description:
- // dojo.query() is the swiss army knife of DOM node manipulation in
- // Dojo. Much like Prototype's "$$" (bling-bling) function or JQuery's
- // "$" function, dojo.query provides robust, high-performance
- // CSS-based node selector support with the option of scoping searches
- // to a particular sub-tree of a document.
- //
- // Supported Selectors:
- // --------------------
- //
- // dojo.query() supports a rich set of CSS3 selectors, including:
- //
- // * class selectors (e.g., `.foo`)
- // * node type selectors like `span`
- // * ` ` descendant selectors
- // * `>` child element selectors
- // * `#foo` style ID selectors
- // * `*` universal selector
- // * `~`, the preceded-by sibling selector
- // * `+`, the immediately preceded-by sibling selector
- // * attribute queries:
- // | * `[foo]` attribute presence selector
- // | * `[foo='bar']` attribute value exact match
- // | * `[foo~='bar']` attribute value list item match
- // | * `[foo^='bar']` attribute start match
- // | * `[foo$='bar']` attribute end match
- // | * `[foo*='bar']` attribute substring match
- // * `:first-child`, `:last-child`, and `:only-child` positional selectors
- // * `:empty` content emtpy selector
- // * `:checked` pseudo selector
- // * `:nth-child(n)`, `:nth-child(2n+1)` style positional calculations
- // * `:nth-child(even)`, `:nth-child(odd)` positional selectors
- // * `:not(...)` negation pseudo selectors
- //
- // Any legal combination of these selectors will work with
- // `dojo.query()`, including compound selectors ("," delimited).
- // Very complex and useful searches can be constructed with this
- // palette of selectors and when combined with functions for
- // manipulation presented by dojo.NodeList, many types of DOM
- // manipulation operations become very straightforward.
- //
- // Unsupported Selectors:
- // ----------------------
- //
- // While dojo.query handles many CSS3 selectors, some fall outside of
- // what's reasonable for a programmatic node querying engine to
- // handle. Currently unsupported selectors include:
- //
- // * namespace-differentiated selectors of any form
- // * all `::` pseduo-element selectors
- // * certain pseduo-selectors which don't get a lot of day-to-day use:
- // | * `:root`, `:lang()`, `:target`, `:focus`
- // * all visual and state selectors:
- // | * `:root`, `:active`, `:hover`, `:visisted`, `:link`,
- // `:enabled`, `:disabled`
- // * `:*-of-type` pseudo selectors
- //
- // dojo.query and XML Documents:
- // -----------------------------
- //
- // `dojo.query` (as of dojo 1.2) supports searching XML documents
- // in a case-sensitive manner. If an HTML document is served with
- // a doctype that forces case-sensitivity (e.g., XHTML 1.1
- // Strict), dojo.query() will detect this and "do the right
- // thing". Case sensitivity is dependent upon the document being
- // searched and not the query used. It is therefore possible to
- // use case-sensitive queries on strict sub-documents (iframes,
- // etc.) or XML documents while still assuming case-insensitivity
- // for a host/root document.
- //
- // Non-selector Queries:
- // ---------------------
- //
- // If something other than a String is passed for the query,
- // `dojo.query` will return a new `dojo.NodeList` instance
- // constructed from that parameter alone and all further
- // processing will stop. This means that if you have a reference
- // to a node or NodeList, you can quickly construct a new NodeList
- // from the original by calling `dojo.query(node)` or
- // `dojo.query(list)`.
- //
- // query:
- // The CSS3 expression to match against. For details on the syntax of
- // CSS3 selectors, see <http://www.w3.org/TR/css3-selectors/#selectors>
- // root:
- // A DOMNode (or node id) to scope the search from. Optional.
- // returns: dojo.NodeList
- // An instance of `dojo.NodeList`. Many methods are available on
- // NodeLists for searching, iterating, manipulating, and handling
- // events on the matched nodes in the returned list.
- // example:
- // search the entire document for elements with the class "foo":
- // | dojo.query(".foo");
- // these elements will match:
- // | <span class="foo"></span>
- // | <span class="foo bar"></span>
- // | <p class="thud foo"></p>
- // example:
- // search the entire document for elements with the classes "foo" *and* "bar":
- // | dojo.query(".foo.bar");
- // these elements will match:
- // | <span class="foo bar"></span>
- // while these will not:
- // | <span class="foo"></span>
- // | <p class="thud foo"></p>
- // example:
- // find `<span>` elements which are descendants of paragraphs and
- // which have a "highlighted" class:
- // | dojo.query("p span.highlighted");
- // the innermost span in this fragment matches:
- // | <p class="foo">
- // | <span>...
- // | <span class="highlighted foo bar">...</span>
- // | </span>
- // | </p>
- // example:
- // set an "odd" class on all odd table rows inside of the table
- // `#tabular_data`, using the `>` (direct child) selector to avoid
- // affecting any nested tables:
- // | dojo.query("#tabular_data > tbody > tr:nth-child(odd)").addClass("odd");
- // example:
- // remove all elements with the class "error" from the document
- // and store them in a list:
- // | var errors = dojo.query(".error").orphan();
- // example:
- // add an onclick handler to every submit button in the document
- // which causes the form to be sent via Ajax instead:
- // | dojo.query("input[type='submit']").onclick(function(e){
- // | dojo.stopEvent(e); // prevent sending the form
- // | var btn = e.target;
- // | dojo.xhrPost({
- // | form: btn.form,
- // | load: function(data){
- // | // replace the form with the response
- // | var div = dojo.doc.createElement("div");
- // | dojo.place(div, btn.form, "after");
- // | div.innerHTML = data;
- // | dojo.style(btn.form, "display", "none");
- // | }
- // | });
- // | });
-
- //Set list constructor to desired value. This can change
- //between calls, so always re-assign here.
- qlc = d._NodeListCtor;
-
- if(!query){
- return new qlc();
- }
-
- if(query.constructor == qlc){
- return query;
- }
- if(typeof query != "string"){ // inline'd type check
- return new qlc(query); // dojo.NodeList
- }
- if(typeof root == "string"){ // inline'd type check
- root = d.byId(root);
- if(!root){ return new qlc(); }
- }
-
- root = root||getDoc();
- var od = root.ownerDocument||root.documentElement;
-
- // throw the big case sensitivity switch
-
- // NOTE:
- // Opera in XHTML mode doesn't detect case-sensitivity correctly
- // and it's not clear that there's any way to test for it
- caseSensitive = (root.contentType && root.contentType=="application/xml") ||
- (d.isOpera && (root.doctype || od.toString() == "[object XMLDocument]")) ||
- (!!od) &&
- (d.isIE ? od.xml : (root.xmlVersion||od.xmlVersion));
-
- // NOTE:
- // adding "true" as the 2nd argument to getQueryFunc is useful for
- // testing the DOM branch without worrying about the
- // behavior/performance of the QSA branch.
- var r = getQueryFunc(query)(root);
-
- // FIXME:
- // need to investigate this branch WRT #8074 and #8075
- if(r && r.nozip && !qlc._wrap){
- return r;
- }
- return _zip(r); // dojo.NodeList
- }
-
- // FIXME: need to add infrastructure for post-filtering pseudos, ala :last
- d.query.pseudos = pseudos;
-
- // function for filtering a NodeList based on a selector, optimized for simple selectors
- d._filterQueryResult = function(/*NodeList*/ nodeList, /*String*/ filter, /*String|DOMNode?*/ root){
- var tmpNodeList = new d._NodeListCtor(),
- parts = getQueryParts(filter),
- filterFunc =
- (parts.length == 1 && !/[^\w#\.]/.test(filter)) ?
- getSimpleFilterFunc(parts[0]) :
- function(node) {
- return dojo.query(filter, root).indexOf(node) != -1;
- };
- for(var x = 0, te; te = nodeList[x]; x++){
- if(filterFunc(te)){ tmpNodeList.push(te); }
- }
- return tmpNodeList;
- }
-};//end defineQuery
-
-var defineAcme= function(){
- // a self-sufficient query impl
- acme = {
- trim: function(/*String*/ str){
- // summary:
- // trims whitespaces from both sides of the string
- str = str.replace(/^\s+/, '');
- for(var i = str.length - 1; i >= 0; i--){
- if(/\S/.test(str.charAt(i))){
- str = str.substring(0, i + 1);
- break;
- }
- }
- return str; // String
- },
- forEach: function(/*String*/ arr, /*Function*/ callback, /*Object?*/ thisObject){
- // summary:
- // an iterator function that passes items, indexes,
- // and the array to a callback
- if(!arr || !arr.length){ return; }
- for(var i=0,l=arr.length; i<l; ++i){
- callback.call(thisObject||window, arr[i], i, arr);
- }
- },
- byId: function(id, doc){
- // summary:
- // a function that return an element by ID, but also
- // accepts nodes safely
- if(typeof id == "string"){
- return (doc||document).getElementById(id); // DomNode
- }else{
- return id; // DomNode
- }
- },
- // the default document to search
- doc: document,
- // the constructor for node list objects returned from query()
- NodeList: Array
- };
-
- // define acme.isIE, acme.isSafari, acme.isOpera, etc.
- var n = navigator;
- var dua = n.userAgent;
- var dav = n.appVersion;
- var tv = parseFloat(dav);
- acme.isOpera = (dua.indexOf("Opera") >= 0) ? tv: undefined;
- acme.isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : undefined;
- acme.isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined;
- acme.isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined;
- var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);
- if(index && !acme.isChrome){
- acme.isSafari = parseFloat(dav.split("Version/")[1]);
- if(!acme.isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){
- acme.isSafari = 2;
- }
- }
- if(document.all && !acme.isOpera){
- acme.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined;
- }
-
- Array._wrap = function(arr){ return arr; };
- return acme;
-};
-
- //prefers queryPortability, then acme, then dojo
- if(this["dojo"]){
- dojo.provide("dojo._base.query");
- dojo.require("dojo._base.NodeList");
- dojo.require("dojo._base.lang");
- defineQuery(this["queryPortability"]||this["acme"]||dojo);
- }else{
- defineQuery(this["queryPortability"]||this["acme"]||defineAcme());
- }
-
-})();
-
-/*
-*/
-
-}
+//>>built
+define("dojo/_base/query",["./kernel","../query","./NodeList"],function(_1){return _1.query;}); \ No newline at end of file
diff --git a/lib/dojo/_base/query.js.uncompressed.js b/lib/dojo/_base/query.js.uncompressed.js
new file mode 100644
index 000000000..a1b161b0b
--- /dev/null
+++ b/lib/dojo/_base/query.js.uncompressed.js
@@ -0,0 +1,3 @@
+define("dojo/_base/query", ["./kernel", "../query", "./NodeList"], function(dojo){
+ return dojo.query;
+});
diff --git a/lib/dojo/_base/sniff.js b/lib/dojo/_base/sniff.js
new file mode 100644
index 000000000..5849b99e9
--- /dev/null
+++ b/lib/dojo/_base/sniff.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/_base/sniff",["./kernel","../has"],function(_1,_2){if(!1){return _2;}_1.isBrowser=true,_1._name="browser";var _3=_2.add,n=navigator,_4=n.userAgent,_5=n.appVersion,tv=parseFloat(_5),_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12,_13,_14;if(_4.indexOf("AdobeAIR")>=0){_7=1;}_8=(_5.indexOf("Konqueror")>=0)?tv:0;_9=parseFloat(_4.split("WebKit/")[1])||undefined;_a=parseFloat(_4.split("Chrome/")[1])||undefined;_b=_5.indexOf("Macintosh")>=0;_12=/iPhone|iPod|iPad/.test(_4);_13=parseFloat(_4.split("Android ")[1])||undefined;_14=typeof opera!="undefined"&&opera.wiiremote;var _15=Math.max(_5.indexOf("WebKit"),_5.indexOf("Safari"),0);if(_15&&!_a){_c=parseFloat(_5.split("Version/")[1]);if(!_c||parseFloat(_5.substr(_15+7))<=419.3){_c=2;}}if(!_2("dojo-webkit")){if(_4.indexOf("Opera")>=0){_6=tv;if(_6>=9.8){_6=parseFloat(_4.split("Version/")[1])||tv;}}if(_4.indexOf("Gecko")>=0&&!_8&&!_9){_d=_e=tv;}if(_e){_10=parseFloat(_4.split("Firefox/")[1]||_4.split("Minefield/")[1])||undefined;}if(document.all&&!_6){_f=parseFloat(_5.split("MSIE ")[1])||undefined;var _16=document.documentMode;if(_16&&_16!=5&&Math.floor(_f)!=_16){_f=_16;}}}_11=document.compatMode=="BackCompat";_3("opera",_1.isOpera=_6);_3("air",_1.isAIR=_7);_3("khtml",_1.isKhtml=_8);_3("webkit",_1.isWebKit=_9);_3("chrome",_1.isChrome=_a);_3("mac",_1.isMac=_b);_3("safari",_1.isSafari=_c);_3("mozilla",_1.isMozilla=_1.isMoz=_d);_3("ie",_1.isIE=_f);_3("ff",_1.isFF=_10);_3("quirks",_1.isQuirks=_11);_3("ios",_1.isIos=_12);_3("android",_1.isAndroid=_13);_1.locale=_1.locale||(_f?n.userLanguage:n.language).toLowerCase();return _2;}); \ No newline at end of file
diff --git a/lib/dojo/_base/sniff.js.uncompressed.js b/lib/dojo/_base/sniff.js.uncompressed.js
new file mode 100644
index 000000000..c7e4b428a
--- /dev/null
+++ b/lib/dojo/_base/sniff.js.uncompressed.js
@@ -0,0 +1,187 @@
+define("dojo/_base/sniff", ["./kernel", "../has"], function(dojo, has){
+ // module:
+ // dojo/sniff
+ // summary:
+ // This module populates the dojo browser version sniffing properties.
+
+ if(!1){
+ return has;
+ }
+
+ dojo.isBrowser = true,
+ dojo._name = "browser";
+
+ var hasAdd = has.add,
+ n = navigator,
+ dua = n.userAgent,
+ dav = n.appVersion,
+ tv = parseFloat(dav),
+ isOpera,
+ isAIR,
+ isKhtml,
+ isWebKit,
+ isChrome,
+ isMac,
+ isSafari,
+ isMozilla ,
+ isMoz,
+ isIE,
+ isFF,
+ isQuirks,
+ isIos,
+ isAndroid,
+ isWii;
+
+ /*=====
+ dojo.isBrowser = {
+ // example:
+ // | if(dojo.isBrowser){ ... }
+ };
+
+ dojo.isFF = {
+ // example:
+ // | if(dojo.isFF > 1){ ... }
+ };
+
+ dojo.isIE = {
+ // example:
+ // | if(dojo.isIE > 6){
+ // | // we are IE7
+ // | }
+ };
+
+ dojo.isSafari = {
+ // example:
+ // | if(dojo.isSafari){ ... }
+ // example:
+ // Detect iPhone:
+ // | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){
+ // | // we are iPhone. Note, iPod touch reports "iPod" above and fails this test.
+ // | }
+ };
+
+ dojo.mixin(dojo, {
+ // isBrowser: Boolean
+ // True if the client is a web-browser
+ isBrowser: true,
+ // isFF: Number | undefined
+ // Version as a Number if client is FireFox. undefined otherwise. Corresponds to
+ // major detected FireFox version (1.5, 2, 3, etc.)
+ isFF: 2,
+ // isIE: Number | undefined
+ // Version as a Number if client is MSIE(PC). undefined otherwise. Corresponds to
+ // major detected IE version (6, 7, 8, etc.)
+ isIE: 6,
+ // isKhtml: Number | undefined
+ // Version as a Number if client is a KHTML browser. undefined otherwise. Corresponds to major
+ // detected version.
+ isKhtml: 0,
+ // isWebKit: Number | undefined
+ // Version as a Number if client is a WebKit-derived browser (Konqueror,
+ // Safari, Chrome, etc.). undefined otherwise.
+ isWebKit: 0,
+ // isMozilla: Number | undefined
+ // Version as a Number if client is a Mozilla-based browser (Firefox,
+ // SeaMonkey). undefined otherwise. Corresponds to major detected version.
+ isMozilla: 0,
+ // isOpera: Number | undefined
+ // Version as a Number if client is Opera. undefined otherwise. Corresponds to
+ // major detected version.
+ isOpera: 0,
+ // isSafari: Number | undefined
+ // Version as a Number if client is Safari or iPhone. undefined otherwise.
+ isSafari: 0,
+ // isChrome: Number | undefined
+ // Version as a Number if client is Chrome browser. undefined otherwise.
+ isChrome: 0,
+ // isMac: Boolean
+ // True if the client runs on Mac
+ isMac: 0,
+ // isIos: Boolean
+ // True if client is iPhone, iPod, or iPad
+ isIos: 0,
+ // isAndroid: Number | undefined
+ // Version as a Number if client is android browser. undefined otherwise.
+ isAndroid: 0,
+ // isWii: Boolean
+ // True if client is Wii
+ isWii: 0
+ });
+ =====*/
+
+ // fill in the rendering support information in dojo.render.*
+ if(dua.indexOf("AdobeAIR") >= 0){ isAIR = 1; }
+ isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : 0;
+ isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined;
+ isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined;
+ isMac = dav.indexOf("Macintosh") >= 0;
+ isIos = /iPhone|iPod|iPad/.test(dua);
+ isAndroid = parseFloat(dua.split("Android ")[1]) || undefined;
+ isWii = typeof opera != "undefined" && opera.wiiremote;
+
+ // safari detection derived from:
+ // http://developer.apple.com/internet/safari/faq.html#anchor2
+ // http://developer.apple.com/internet/safari/uamatrix.html
+ var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);
+ if(index && !isChrome){
+ // try to grab the explicit Safari version first. If we don't get
+ // one, look for less than 419.3 as the indication that we're on something
+ // "Safari 2-ish".
+ isSafari = parseFloat(dav.split("Version/")[1]);
+ if(!isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){
+ isSafari = 2;
+ }
+ }
+
+ if (!has("dojo-webkit")) {
+ if(dua.indexOf("Opera") >= 0){
+ isOpera = tv;
+ // see http://dev.opera.com/articles/view/opera-ua-string-changes and http://www.useragentstring.com/pages/Opera/
+ // 9.8 has both styles; <9.8, 9.9 only old style
+ if(isOpera >= 9.8){
+ isOpera = parseFloat(dua.split("Version/")[1]) || tv;
+ }
+ }
+
+ if(dua.indexOf("Gecko") >= 0 && !isKhtml && !isWebKit){
+ isMozilla = isMoz = tv;
+ }
+ if(isMoz){
+ //We really need to get away from this. Consider a sane isGecko approach for the future.
+ isFF = parseFloat(dua.split("Firefox/")[1] || dua.split("Minefield/")[1]) || undefined;
+ }
+ if(document.all && !isOpera){
+ isIE = parseFloat(dav.split("MSIE ")[1]) || undefined;
+ //In cases where the page has an HTTP header or META tag with
+ //X-UA-Compatible, then it is in emulation mode.
+ //Make sure isIE reflects the desired version.
+ //document.documentMode of 5 means quirks mode.
+ //Only switch the value if documentMode's major version
+ //is different from isIE's major version.
+ var mode = document.documentMode;
+ if(mode && mode != 5 && Math.floor(isIE) != mode){
+ isIE = mode;
+ }
+ }
+ }
+
+ isQuirks = document.compatMode == "BackCompat";
+
+ hasAdd("opera", dojo.isOpera = isOpera);
+ hasAdd("air", dojo.isAIR = isAIR);
+ hasAdd("khtml", dojo.isKhtml = isKhtml);
+ hasAdd("webkit", dojo.isWebKit = isWebKit);
+ hasAdd("chrome", dojo.isChrome = isChrome);
+ hasAdd("mac", dojo.isMac = isMac );
+ hasAdd("safari", dojo.isSafari = isSafari);
+ hasAdd("mozilla", dojo.isMozilla = dojo.isMoz = isMozilla );
+ hasAdd("ie", dojo.isIE = isIE );
+ hasAdd("ff", dojo.isFF = isFF);
+ hasAdd("quirks", dojo.isQuirks = isQuirks);
+ hasAdd("ios", dojo.isIos = isIos);
+ hasAdd("android", dojo.isAndroid = isAndroid);
+
+ dojo.locale = dojo.locale || (isIE ? n.userLanguage : n.language).toLowerCase();
+
+ return has;
+});
diff --git a/lib/dojo/_base/unload.js b/lib/dojo/_base/unload.js
new file mode 100644
index 000000000..8e099ae14
--- /dev/null
+++ b/lib/dojo/_base/unload.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/_base/unload",["./kernel","./connect"],function(_1,_2){var _3=window;_1.addOnWindowUnload=function(_4,_5){if(!_1.windowUnloaded){_2.connect(_3,"unload",(_1.windowUnloaded=function(){}));}_2.connect(_3,"unload",_4,_5);};_1.addOnUnload=function(_6,_7){_2.connect(_3,"beforeunload",_6,_7);};return {addOnWindowUnload:_1.addOnWindowUnload,addOnUnload:_1.addOnUnload};}); \ No newline at end of file
diff --git a/lib/dojo/_base/unload.js.uncompressed.js b/lib/dojo/_base/unload.js.uncompressed.js
new file mode 100644
index 000000000..e811d929d
--- /dev/null
+++ b/lib/dojo/_base/unload.js.uncompressed.js
@@ -0,0 +1,81 @@
+define("dojo/_base/unload", ["./kernel", "./connect"], function(dojo, connect) {
+ // module:
+ // dojo/unload
+ // summary:
+ // This module contains the document and window unload detection API.
+
+ var win = window;
+
+ /*=====
+ dojo.windowUnloaded = function(){
+ // summary:
+ // signal fired by impending window destruction. You may use
+ // dojo.addOnWindowUnload() to register a listener for this
+ // event. NOTE: if you wish to dojo.connect() to this method
+ // to perform page/application cleanup, be aware that this
+ // event WILL NOT fire if no handler has been registered with
+ // dojo.addOnWindowUnload. This behavior started in Dojo 1.3.
+ // Previous versions always triggered dojo.windowUnloaded. See
+ // dojo.addOnWindowUnload for more info.
+ };
+ =====*/
+
+ dojo.addOnWindowUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
+ // summary:
+ // registers a function to be triggered when window.onunload
+ // fires.
+ // description:
+ // The first time that addOnWindowUnload is called Dojo
+ // will register a page listener to trigger your unload
+ // handler with. Note that registering these handlers may
+ // destory "fastback" page caching in browsers that support
+ // it. Be careful trying to modify the DOM or access
+ // JavaScript properties during this phase of page unloading:
+ // they may not always be available. Consider
+ // dojo.addOnUnload() if you need to modify the DOM or do
+ // heavy JavaScript work since it fires at the eqivalent of
+ // the page's "onbeforeunload" event.
+ // example:
+ // | dojo.addOnWindowUnload(functionPointer)
+ // | dojo.addOnWindowUnload(object, "functionName");
+ // | dojo.addOnWindowUnload(object, function(){ /* ... */});
+
+ if (!dojo.windowUnloaded) {
+ connect.connect(win, "unload", (dojo.windowUnloaded= function(){}));
+ }
+ connect.connect(win, "unload", obj, functionName);
+ };
+
+ dojo.addOnUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
+ // summary:
+ // registers a function to be triggered when the page unloads.
+ // description:
+ // The first time that addOnUnload is called Dojo will
+ // register a page listener to trigger your unload handler
+ // with.
+ //
+ // In a browser enviroment, the functions will be triggered
+ // during the window.onbeforeunload event. Be careful of doing
+ // too much work in an unload handler. onbeforeunload can be
+ // triggered if a link to download a file is clicked, or if
+ // the link is a javascript: link. In these cases, the
+ // onbeforeunload event fires, but the document is not
+ // actually destroyed. So be careful about doing destructive
+ // operations in a dojo.addOnUnload callback.
+ //
+ // Further note that calling dojo.addOnUnload will prevent
+ // browsers from using a "fast back" cache to make page
+ // loading via back button instantaneous.
+ // example:
+ // | dojo.addOnUnload(functionPointer)
+ // | dojo.addOnUnload(object, "functionName")
+ // | dojo.addOnUnload(object, function(){ /* ... */});
+
+ connect.connect(win, "beforeunload", obj, functionName);
+ };
+
+ return {
+ addOnWindowUnload: dojo.addOnWindowUnload,
+ addOnUnload: dojo.addOnUnload
+ };
+});
diff --git a/lib/dojo/_base/url.js b/lib/dojo/_base/url.js
new file mode 100644
index 000000000..41bae092c
--- /dev/null
+++ b/lib/dojo/_base/url.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/_base/url",["./kernel"],function(_1){var _2=new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),_3=new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"),_4=function(){var n=null,_5=arguments,_6=[_5[0]];for(var i=1;i<_5.length;i++){if(!_5[i]){continue;}var _7=new _4(_5[i]+""),_8=new _4(_6[0]+"");if(_7.path==""&&!_7.scheme&&!_7.authority&&!_7.query){if(_7.fragment!=n){_8.fragment=_7.fragment;}_7=_8;}else{if(!_7.scheme){_7.scheme=_8.scheme;if(!_7.authority){_7.authority=_8.authority;if(_7.path.charAt(0)!="/"){var _9=_8.path.substring(0,_8.path.lastIndexOf("/")+1)+_7.path;var _a=_9.split("/");for(var j=0;j<_a.length;j++){if(_a[j]=="."){if(j==_a.length-1){_a[j]="";}else{_a.splice(j,1);j--;}}else{if(j>0&&!(j==1&&_a[0]=="")&&_a[j]==".."&&_a[j-1]!=".."){if(j==(_a.length-1)){_a.splice(j,1);_a[j-1]="";}else{_a.splice(j-1,2);j-=2;}}}}_7.path=_a.join("/");}}}}_6=[];if(_7.scheme){_6.push(_7.scheme,":");}if(_7.authority){_6.push("//",_7.authority);}_6.push(_7.path);if(_7.query){_6.push("?",_7.query);}if(_7.fragment){_6.push("#",_7.fragment);}}this.uri=_6.join("");var r=this.uri.match(_2);this.scheme=r[2]||(r[1]?"":n);this.authority=r[4]||(r[3]?"":n);this.path=r[5];this.query=r[7]||(r[6]?"":n);this.fragment=r[9]||(r[8]?"":n);if(this.authority!=n){r=this.authority.match(_3);this.user=r[3]||n;this.password=r[4]||n;this.host=r[6]||r[7];this.port=r[9]||n;}};_4.prototype.toString=function(){return this.uri;};return _1._Url=_4;}); \ No newline at end of file
diff --git a/lib/dojo/_base/url.js.uncompressed.js b/lib/dojo/_base/url.js.uncompressed.js
new file mode 100644
index 000000000..73f447b54
--- /dev/null
+++ b/lib/dojo/_base/url.js.uncompressed.js
@@ -0,0 +1,111 @@
+define("dojo/_base/url", ["./kernel"], function(dojo) {
+ // module:
+ // dojo/url
+ // summary:
+ // This module contains dojo._Url
+
+ var
+ ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),
+ ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"),
+ _Url = function(){
+ var n = null,
+ _a = arguments,
+ uri = [_a[0]];
+ // resolve uri components relative to each other
+ for(var i = 1; i<_a.length; i++){
+ if(!_a[i]){ continue; }
+
+ // Safari doesn't support this.constructor so we have to be explicit
+ // FIXME: Tracked (and fixed) in Webkit bug 3537.
+ // http://bugs.webkit.org/show_bug.cgi?id=3537
+ var relobj = new _Url(_a[i]+""),
+ uriobj = new _Url(uri[0]+"");
+
+ if(
+ relobj.path == "" &&
+ !relobj.scheme &&
+ !relobj.authority &&
+ !relobj.query
+ ){
+ if(relobj.fragment != n){
+ uriobj.fragment = relobj.fragment;
+ }
+ relobj = uriobj;
+ }else if(!relobj.scheme){
+ relobj.scheme = uriobj.scheme;
+
+ if(!relobj.authority){
+ relobj.authority = uriobj.authority;
+
+ if(relobj.path.charAt(0) != "/"){
+ var path = uriobj.path.substring(0,
+ uriobj.path.lastIndexOf("/") + 1) + relobj.path;
+
+ var segs = path.split("/");
+ for(var j = 0; j < segs.length; j++){
+ if(segs[j] == "."){
+ // flatten "./" references
+ if(j == segs.length - 1){
+ segs[j] = "";
+ }else{
+ segs.splice(j, 1);
+ j--;
+ }
+ }else if(j > 0 && !(j == 1 && segs[0] == "") &&
+ segs[j] == ".." && segs[j-1] != ".."){
+ // flatten "../" references
+ if(j == (segs.length - 1)){
+ segs.splice(j, 1);
+ segs[j - 1] = "";
+ }else{
+ segs.splice(j - 1, 2);
+ j -= 2;
+ }
+ }
+ }
+ relobj.path = segs.join("/");
+ }
+ }
+ }
+
+ uri = [];
+ if(relobj.scheme){
+ uri.push(relobj.scheme, ":");
+ }
+ if(relobj.authority){
+ uri.push("//", relobj.authority);
+ }
+ uri.push(relobj.path);
+ if(relobj.query){
+ uri.push("?", relobj.query);
+ }
+ if(relobj.fragment){
+ uri.push("#", relobj.fragment);
+ }
+ }
+
+ this.uri = uri.join("");
+
+ // break the uri into its main components
+ var r = this.uri.match(ore);
+
+ this.scheme = r[2] || (r[1] ? "" : n);
+ this.authority = r[4] || (r[3] ? "" : n);
+ this.path = r[5]; // can never be undefined
+ this.query = r[7] || (r[6] ? "" : n);
+ this.fragment = r[9] || (r[8] ? "" : n);
+
+ if(this.authority != n){
+ // server based naming authority
+ r = this.authority.match(ire);
+
+ this.user = r[3] || n;
+ this.password = r[4] || n;
+ this.host = r[6] || r[7]; // ipv6 || ipv4
+ this.port = r[9] || n;
+ }
+ };
+ _Url.prototype.toString = function(){ return this.uri; };
+
+ return dojo._Url = _Url;
+});
diff --git a/lib/dojo/_base/window.js b/lib/dojo/_base/window.js
index 143bad610..7082cb077 100644
--- a/lib/dojo/_base/window.js
+++ b/lib/dojo/_base/window.js
@@ -4,105 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.window"] = true;
-dojo.provide("dojo._base.window");
-
-
-/*=====
-dojo.doc = {
- // summary:
- // Alias for the current document. 'dojo.doc' can be modified
- // for temporary context shifting. Also see dojo.withDoc().
- // description:
- // Refer to dojo.doc rather
- // than referring to 'window.document' to ensure your code runs
- // correctly in managed contexts.
- // example:
- // | n.appendChild(dojo.doc.createElement('div'));
-}
-=====*/
-dojo.doc = window["document"] || null;
-
-dojo.body = function(){
- // summary:
- // Return the body element of the document
- // return the body object associated with dojo.doc
- // example:
- // | dojo.body().appendChild(dojo.doc.createElement('div'));
-
- // Note: document.body is not defined for a strict xhtml document
- // Would like to memoize this, but dojo.doc can change vi dojo.withDoc().
- return dojo.doc.body || dojo.doc.getElementsByTagName("body")[0]; // Node
-};
-
-dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocument){
- // summary:
- // changes the behavior of many core Dojo functions that deal with
- // namespace and DOM lookup, changing them to work in a new global
- // context (e.g., an iframe). The varibles dojo.global and dojo.doc
- // are modified as a result of calling this function and the result of
- // `dojo.body()` likewise differs.
- dojo.global = globalObject;
- dojo.doc = globalDocument;
-};
-
-dojo.withGlobal = function( /*Object*/globalObject,
- /*Function*/callback,
- /*Object?*/thisObject,
- /*Array?*/cbArguments){
- // summary:
- // Invoke callback with globalObject as dojo.global and
- // globalObject.document as dojo.doc.
- // description:
- // Invoke callback with globalObject as dojo.global and
- // globalObject.document as dojo.doc. If provided, globalObject
- // will be executed in the context of object thisObject
- // When callback() returns or throws an error, the dojo.global
- // and dojo.doc will be restored to its previous state.
-
- var oldGlob = dojo.global;
- try{
- dojo.global = globalObject;
- return dojo.withDoc.call(null, globalObject.document, callback, thisObject, cbArguments);
- }finally{
- dojo.global = oldGlob;
- }
-};
-
-dojo.withDoc = function( /*DocumentElement*/documentObject,
- /*Function*/callback,
- /*Object?*/thisObject,
- /*Array?*/cbArguments){
- // summary:
- // Invoke callback with documentObject as dojo.doc.
- // description:
- // Invoke callback with documentObject as dojo.doc. If provided,
- // callback will be executed in the context of object thisObject
- // When callback() returns or throws an error, the dojo.doc will
- // be restored to its previous state.
-
- var oldDoc = dojo.doc,
- oldLtr = dojo._bodyLtr,
- oldQ = dojo.isQuirks;
-
- try{
- dojo.doc = documentObject;
- delete dojo._bodyLtr; // uncache
- dojo.isQuirks = dojo.doc.compatMode == "BackCompat"; // no need to check for QuirksMode which was Opera 7 only
-
- if(thisObject && typeof callback == "string"){
- callback = thisObject[callback];
- }
-
- return callback.apply(thisObject, cbArguments || []);
- }finally{
- dojo.doc = oldDoc;
- delete dojo._bodyLtr; // in case it was undefined originally, and set to true/false by the alternate document
- if(oldLtr !== undefined){ dojo._bodyLtr = oldLtr; }
- dojo.isQuirks = oldQ;
- }
-};
-
-}
+//>>built
+define("dojo/_base/window",["./kernel","../has","./sniff"],function(_1,_2){_1.doc=this["document"]||null;_1.body=function(){return _1.doc.body||_1.doc.getElementsByTagName("body")[0];};_1.setContext=function(_3,_4){_1.global=_5.global=_3;_1.doc=_5.doc=_4;};_1.withGlobal=function(_6,_7,_8,_9){var _a=_1.global;try{_1.global=_5.global=_6;return _1.withDoc.call(null,_6.document,_7,_8,_9);}finally{_1.global=_5.global=_a;}};_1.withDoc=function(_b,_c,_d,_e){var _f=_1.doc,_10=_1.isQuirks,_11=_1.isIE,_12,_13,_14;try{_1.doc=_5.doc=_b;_1.isQuirks=_2.add("quirks",_1.doc.compatMode=="BackCompat",true,true);if(_2("ie")){if((_14=_b.parentWindow)&&_14.navigator){_12=parseFloat(_14.navigator.appVersion.split("MSIE ")[1])||undefined;_13=_b.documentMode;if(_13&&_13!=5&&Math.floor(_12)!=_13){_12=_13;}_1.isIE=_2.add("ie",_12,true,true);}}if(_d&&typeof _c=="string"){_c=_d[_c];}return _c.apply(_d,_e||[]);}finally{_1.doc=_5.doc=_f;_1.isQuirks=_2.add("quirks",_10,true,true);_1.isIE=_2.add("ie",_11,true,true);}};var _5={global:_1.global,doc:_1.doc,body:_1.body,setContext:_1.setContext,withGlobal:_1.withGlobal,withDoc:_1.withDoc};return _5;}); \ No newline at end of file
diff --git a/lib/dojo/_base/window.js.uncompressed.js b/lib/dojo/_base/window.js.uncompressed.js
new file mode 100644
index 000000000..0c9f236b6
--- /dev/null
+++ b/lib/dojo/_base/window.js.uncompressed.js
@@ -0,0 +1,126 @@
+define("dojo/_base/window", ["./kernel", "../has", "./sniff"], function(dojo, has){
+ // module:
+ // dojo/window
+ // summary:
+ // This module provides an API to save/set/restore the global/document scope.
+
+/*=====
+dojo.doc = {
+ // summary:
+ // Alias for the current document. 'dojo.doc' can be modified
+ // for temporary context shifting. Also see dojo.withDoc().
+ // description:
+ // Refer to dojo.doc rather
+ // than referring to 'window.document' to ensure your code runs
+ // correctly in managed contexts.
+ // example:
+ // | n.appendChild(dojo.doc.createElement('div'));
+}
+=====*/
+dojo.doc = this["document"] || null;
+
+dojo.body = function(){
+ // summary:
+ // Return the body element of the document
+ // return the body object associated with dojo.doc
+ // example:
+ // | dojo.body().appendChild(dojo.doc.createElement('div'));
+
+ // Note: document.body is not defined for a strict xhtml document
+ // Would like to memoize this, but dojo.doc can change vi dojo.withDoc().
+ return dojo.doc.body || dojo.doc.getElementsByTagName("body")[0]; // Node
+};
+
+dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocument){
+ // summary:
+ // changes the behavior of many core Dojo functions that deal with
+ // namespace and DOM lookup, changing them to work in a new global
+ // context (e.g., an iframe). The varibles dojo.global and dojo.doc
+ // are modified as a result of calling this function and the result of
+ // `dojo.body()` likewise differs.
+ dojo.global = ret.global = globalObject;
+ dojo.doc = ret.doc = globalDocument;
+};
+
+dojo.withGlobal = function( /*Object*/globalObject,
+ /*Function*/callback,
+ /*Object?*/thisObject,
+ /*Array?*/cbArguments){
+ // summary:
+ // Invoke callback with globalObject as dojo.global and
+ // globalObject.document as dojo.doc.
+ // description:
+ // Invoke callback with globalObject as dojo.global and
+ // globalObject.document as dojo.doc. If provided, globalObject
+ // will be executed in the context of object thisObject
+ // When callback() returns or throws an error, the dojo.global
+ // and dojo.doc will be restored to its previous state.
+
+ var oldGlob = dojo.global;
+ try{
+ dojo.global = ret.global = globalObject;
+ return dojo.withDoc.call(null, globalObject.document, callback, thisObject, cbArguments);
+ }finally{
+ dojo.global = ret.global = oldGlob;
+ }
+};
+
+dojo.withDoc = function( /*DocumentElement*/documentObject,
+ /*Function*/callback,
+ /*Object?*/thisObject,
+ /*Array?*/cbArguments){
+ // summary:
+ // Invoke callback with documentObject as dojo.doc.
+ // description:
+ // Invoke callback with documentObject as dojo.doc. If provided,
+ // callback will be executed in the context of object thisObject
+ // When callback() returns or throws an error, the dojo.doc will
+ // be restored to its previous state.
+
+ var oldDoc = dojo.doc,
+ oldQ = dojo.isQuirks,
+ oldIE = dojo.isIE, isIE, mode, pwin;
+
+ try{
+ dojo.doc = ret.doc = documentObject;
+ // update dojo.isQuirks and the value of the has feature "quirks"
+ dojo.isQuirks = has.add("quirks", dojo.doc.compatMode == "BackCompat", true, true); // no need to check for QuirksMode which was Opera 7 only
+
+ if(has("ie")){
+ if((pwin = documentObject.parentWindow) && pwin.navigator){
+ // re-run IE detection logic and update dojo.isIE / has("ie")
+ // (the only time parentWindow/navigator wouldn't exist is if we were not
+ // passed an actual legitimate document object)
+ isIE = parseFloat(pwin.navigator.appVersion.split("MSIE ")[1]) || undefined;
+ mode = documentObject.documentMode;
+ if(mode && mode != 5 && Math.floor(isIE) != mode){
+ isIE = mode;
+ }
+ dojo.isIE = has.add("ie", isIE, true, true);
+ }
+ }
+
+ if(thisObject && typeof callback == "string"){
+ callback = thisObject[callback];
+ }
+
+ return callback.apply(thisObject, cbArguments || []);
+ }finally{
+ dojo.doc = ret.doc = oldDoc;
+ dojo.isQuirks = has.add("quirks", oldQ, true, true);
+ dojo.isIE = has.add("ie", oldIE, true, true);
+ }
+};
+
+var ret = {
+ global: dojo.global,
+ doc: dojo.doc,
+ body: dojo.body,
+ setContext: dojo.setContext,
+ withGlobal: dojo.withGlobal,
+ withDoc: dojo.withDoc
+};
+
+return ret;
+
+});
diff --git a/lib/dojo/_base/xhr.js b/lib/dojo/_base/xhr.js
index 58f1fdb62..ee38dbd4f 100644
--- a/lib/dojo/_base/xhr.js
+++ b/lib/dojo/_base/xhr.js
@@ -4,939 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._base.xhr"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.xhr"] = true;
-dojo.provide("dojo._base.xhr");
-dojo.require("dojo._base.Deferred");
-dojo.require("dojo._base.json");
-dojo.require("dojo._base.lang");
-dojo.require("dojo._base.query");
-
-
-(function(){
- var _d = dojo, cfg = _d.config;
-
- function setValue(/*Object*/obj, /*String*/name, /*String*/value){
- //summary:
- // For the named property in object, set the value. If a value
- // already exists and it is a string, convert the value to be an
- // array of values.
-
- //Skip it if there is no value
- if(value === null){
- return;
- }
-
- var val = obj[name];
- if(typeof val == "string"){ // inline'd type check
- obj[name] = [val, value];
- }else if(_d.isArray(val)){
- val.push(value);
- }else{
- obj[name] = value;
- }
- }
-
- dojo.fieldToObject = function(/*DOMNode||String*/ inputNode){
- // summary:
- // Serialize a form field to a JavaScript object.
- //
- // description:
- // Returns the value encoded in a form field as
- // as a string or an array of strings. Disabled form elements
- // and unchecked radio and checkboxes are skipped. Multi-select
- // elements are returned as an array of string values.
- var ret = null;
- var item = _d.byId(inputNode);
- if(item){
- var _in = item.name;
- var type = (item.type||"").toLowerCase();
- if(_in && type && !item.disabled){
- if(type == "radio" || type == "checkbox"){
- if(item.checked){ ret = item.value; }
- }else if(item.multiple){
- ret = [];
- _d.query("option", item).forEach(function(opt){
- if(opt.selected){
- ret.push(opt.value);
- }
- });
- }else{
- ret = item.value;
- }
- }
- }
- return ret; // Object
- };
-
- dojo.formToObject = function(/*DOMNode||String*/ formNode){
- // summary:
- // Serialize a form node to a JavaScript object.
- // description:
- // Returns the values encoded in an HTML form as
- // string properties in an object which it then returns. Disabled form
- // elements, buttons, and other non-value form elements are skipped.
- // Multi-select elements are returned as an array of string values.
- //
- // example:
- // This form:
- // | <form id="test_form">
- // | <input type="text" name="blah" value="blah">
- // | <input type="text" name="no_value" value="blah" disabled>
- // | <input type="button" name="no_value2" value="blah">
- // | <select type="select" multiple name="multi" size="5">
- // | <option value="blah">blah</option>
- // | <option value="thud" selected>thud</option>
- // | <option value="thonk" selected>thonk</option>
- // | </select>
- // | </form>
- //
- // yields this object structure as the result of a call to
- // formToObject():
- //
- // | {
- // | blah: "blah",
- // | multi: [
- // | "thud",
- // | "thonk"
- // | ]
- // | };
-
- var ret = {};
- var exclude = "file|submit|image|reset|button|";
- _d.forEach(dojo.byId(formNode).elements, function(item){
- var _in = item.name;
- var type = (item.type||"").toLowerCase();
- if(_in && type && exclude.indexOf(type) == -1 && !item.disabled){
- setValue(ret, _in, _d.fieldToObject(item));
- if(type == "image"){
- ret[_in+".x"] = ret[_in+".y"] = ret[_in].x = ret[_in].y = 0;
- }
- }
- });
- return ret; // Object
- };
-
- dojo.objectToQuery = function(/*Object*/ map){
- // summary:
- // takes a name/value mapping object and returns a string representing
- // a URL-encoded version of that object.
- // example:
- // this object:
- //
- // | {
- // | blah: "blah",
- // | multi: [
- // | "thud",
- // | "thonk"
- // | ]
- // | };
- //
- // yields the following query string:
- //
- // | "blah=blah&multi=thud&multi=thonk"
-
- // FIXME: need to implement encodeAscii!!
- var enc = encodeURIComponent;
- var pairs = [];
- var backstop = {};
- for(var name in map){
- var value = map[name];
- if(value != backstop[name]){
- var assign = enc(name) + "=";
- if(_d.isArray(value)){
- for(var i=0; i < value.length; i++){
- pairs.push(assign + enc(value[i]));
- }
- }else{
- pairs.push(assign + enc(value));
- }
- }
- }
- return pairs.join("&"); // String
- };
-
- dojo.formToQuery = function(/*DOMNode||String*/ formNode){
- // summary:
- // Returns a URL-encoded string representing the form passed as either a
- // node or string ID identifying the form to serialize
- return _d.objectToQuery(_d.formToObject(formNode)); // String
- };
-
- dojo.formToJson = function(/*DOMNode||String*/ formNode, /*Boolean?*/prettyPrint){
- // summary:
- // Create a serialized JSON string from a form node or string
- // ID identifying the form to serialize
- return _d.toJson(_d.formToObject(formNode), prettyPrint); // String
- };
-
- dojo.queryToObject = function(/*String*/ str){
- // summary:
- // Create an object representing a de-serialized query section of a
- // URL. Query keys with multiple values are returned in an array.
- //
- // example:
- // This string:
- //
- // | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&"
- //
- // results in this object structure:
- //
- // | {
- // | foo: [ "bar", "baz" ],
- // | thinger: " spaces =blah",
- // | zonk: "blarg"
- // | }
- //
- // Note that spaces and other urlencoded entities are correctly
- // handled.
-
- // FIXME: should we grab the URL string if we're not passed one?
- var ret = {};
- var qp = str.split("&");
- var dec = decodeURIComponent;
- _d.forEach(qp, function(item){
- if(item.length){
- var parts = item.split("=");
- var name = dec(parts.shift());
- var val = dec(parts.join("="));
- if(typeof ret[name] == "string"){ // inline'd type check
- ret[name] = [ret[name]];
- }
-
- if(_d.isArray(ret[name])){
- ret[name].push(val);
- }else{
- ret[name] = val;
- }
- }
- });
- return ret; // Object
- };
-
- // need to block async callbacks from snatching this thread as the result
- // of an async callback might call another sync XHR, this hangs khtml forever
- // must checked by watchInFlight()
-
- dojo._blockAsync = false;
-
- // MOW: remove dojo._contentHandlers alias in 2.0
- var handlers = _d._contentHandlers = dojo.contentHandlers = {
- // summary:
- // A map of availble XHR transport handle types. Name matches the
- // `handleAs` attribute passed to XHR calls.
- //
- // description:
- // A map of availble XHR transport handle types. Name matches the
- // `handleAs` attribute passed to XHR calls. Each contentHandler is
- // called, passing the xhr object for manipulation. The return value
- // from the contentHandler will be passed to the `load` or `handle`
- // functions defined in the original xhr call.
- //
- // example:
- // Creating a custom content-handler:
- // | dojo.contentHandlers.makeCaps = function(xhr){
- // | return xhr.responseText.toUpperCase();
- // | }
- // | // and later:
- // | dojo.xhrGet({
- // | url:"foo.txt",
- // | handleAs:"makeCaps",
- // | load: function(data){ /* data is a toUpper version of foo.txt */ }
- // | });
-
- text: function(xhr){
- // summary: A contentHandler which simply returns the plaintext response data
- return xhr.responseText;
- },
- json: function(xhr){
- // summary: A contentHandler which returns a JavaScript object created from the response data
- return _d.fromJson(xhr.responseText || null);
- },
- "json-comment-filtered": function(xhr){
- // summary: A contentHandler which expects comment-filtered JSON.
- // description:
- // A contentHandler which expects comment-filtered JSON.
- // the json-comment-filtered option was implemented to prevent
- // "JavaScript Hijacking", but it is less secure than standard JSON. Use
- // standard JSON instead. JSON prefixing can be used to subvert hijacking.
- //
- // Will throw a notice suggesting to use application/json mimetype, as
- // json-commenting can introduce security issues. To decrease the chances of hijacking,
- // use the standard `json` contentHandler, and prefix your "JSON" with: {}&&
- //
- // use djConfig.useCommentedJson = true to turn off the notice
- if(!dojo.config.useCommentedJson){
- console.warn("Consider using the standard mimetype:application/json."
- + " json-commenting can introduce security issues. To"
- + " decrease the chances of hijacking, use the standard the 'json' handler and"
- + " prefix your json with: {}&&\n"
- + "Use djConfig.useCommentedJson=true to turn off this message.");
- }
-
- var value = xhr.responseText;
- var cStartIdx = value.indexOf("\/*");
- var cEndIdx = value.lastIndexOf("*\/");
- if(cStartIdx == -1 || cEndIdx == -1){
- throw new Error("JSON was not comment filtered");
- }
- return _d.fromJson(value.substring(cStartIdx+2, cEndIdx));
- },
- javascript: function(xhr){
- // summary: A contentHandler which evaluates the response data, expecting it to be valid JavaScript
-
- // FIXME: try Moz and IE specific eval variants?
- return _d.eval(xhr.responseText);
- },
- xml: function(xhr){
- // summary: A contentHandler returning an XML Document parsed from the response data
- var result = xhr.responseXML;
- if(_d.isIE && (!result || !result.documentElement)){
- //WARNING: this branch used by the xml handling in dojo.io.iframe,
- //so be sure to test dojo.io.iframe if making changes below.
- var ms = function(n){ return "MSXML" + n + ".DOMDocument"; };
- var dp = ["Microsoft.XMLDOM", ms(6), ms(4), ms(3), ms(2)];
- _d.some(dp, function(p){
- try{
- var dom = new ActiveXObject(p);
- dom.async = false;
- dom.loadXML(xhr.responseText);
- result = dom;
- }catch(e){ return false; }
- return true;
- });
- }
- return result; // DOMDocument
- },
- "json-comment-optional": function(xhr){
- // summary: A contentHandler which checks the presence of comment-filtered JSON and
- // alternates between the `json` and `json-comment-filtered` contentHandlers.
- if(xhr.responseText && /^[^{\[]*\/\*/.test(xhr.responseText)){
- return handlers["json-comment-filtered"](xhr);
- }else{
- return handlers["json"](xhr);
- }
- }
- };
-
- /*=====
- dojo.__IoArgs = function(){
- // url: String
- // URL to server endpoint.
- // content: Object?
- // Contains properties with string values. These
- // properties will be serialized as name1=value2 and
- // passed in the request.
- // timeout: Integer?
- // Milliseconds to wait for the response. If this time
- // passes, the then error callbacks are called.
- // form: DOMNode?
- // DOM node for a form. Used to extract the form values
- // and send to the server.
- // preventCache: Boolean?
- // Default is false. If true, then a
- // "dojo.preventCache" parameter is sent in the request
- // with a value that changes with each request
- // (timestamp). Useful only with GET-type requests.
- // handleAs: String?
- // Acceptable values depend on the type of IO
- // transport (see specific IO calls for more information).
- // rawBody: String?
- // Sets the raw body for an HTTP request. If this is used, then the content
- // property is ignored. This is mostly useful for HTTP methods that have
- // a body to their requests, like PUT or POST. This property can be used instead
- // of postData and putData for dojo.rawXhrPost and dojo.rawXhrPut respectively.
- // ioPublish: Boolean?
- // Set this explicitly to false to prevent publishing of topics related to
- // IO operations. Otherwise, if djConfig.ioPublish is set to true, topics
- // will be published via dojo.publish for different phases of an IO operation.
- // See dojo.__IoPublish for a list of topics that are published.
- // load: Function?
- // This function will be
- // called on a successful HTTP response code.
- // error: Function?
- // This function will
- // be called when the request fails due to a network or server error, the url
- // is invalid, etc. It will also be called if the load or handle callback throws an
- // exception, unless djConfig.debugAtAllCosts is true. This allows deployed applications
- // to continue to run even when a logic error happens in the callback, while making
- // it easier to troubleshoot while in debug mode.
- // handle: Function?
- // This function will
- // be called at the end of every request, whether or not an error occurs.
- this.url = url;
- this.content = content;
- this.timeout = timeout;
- this.form = form;
- this.preventCache = preventCache;
- this.handleAs = handleAs;
- this.ioPublish = ioPublish;
- this.load = function(response, ioArgs){
- // ioArgs: dojo.__IoCallbackArgs
- // Provides additional information about the request.
- // response: Object
- // The response in the format as defined with handleAs.
- }
- this.error = function(response, ioArgs){
- // ioArgs: dojo.__IoCallbackArgs
- // Provides additional information about the request.
- // response: Object
- // The response in the format as defined with handleAs.
- }
- this.handle = function(loadOrError, response, ioArgs){
- // loadOrError: String
- // Provides a string that tells you whether this function
- // was called because of success (load) or failure (error).
- // response: Object
- // The response in the format as defined with handleAs.
- // ioArgs: dojo.__IoCallbackArgs
- // Provides additional information about the request.
- }
- }
- =====*/
-
- /*=====
- dojo.__IoCallbackArgs = function(args, xhr, url, query, handleAs, id, canDelete, json){
- // args: Object
- // the original object argument to the IO call.
- // xhr: XMLHttpRequest
- // For XMLHttpRequest calls only, the
- // XMLHttpRequest object that was used for the
- // request.
- // url: String
- // The final URL used for the call. Many times it
- // will be different than the original args.url
- // value.
- // query: String
- // For non-GET requests, the
- // name1=value1&name2=value2 parameters sent up in
- // the request.
- // handleAs: String
- // The final indicator on how the response will be
- // handled.
- // id: String
- // For dojo.io.script calls only, the internal
- // script ID used for the request.
- // canDelete: Boolean
- // For dojo.io.script calls only, indicates
- // whether the script tag that represents the
- // request can be deleted after callbacks have
- // been called. Used internally to know when
- // cleanup can happen on JSONP-type requests.
- // json: Object
- // For dojo.io.script calls only: holds the JSON
- // response for JSONP-type requests. Used
- // internally to hold on to the JSON responses.
- // You should not need to access it directly --
- // the same object should be passed to the success
- // callbacks directly.
- this.args = args;
- this.xhr = xhr;
- this.url = url;
- this.query = query;
- this.handleAs = handleAs;
- this.id = id;
- this.canDelete = canDelete;
- this.json = json;
- }
- =====*/
-
-
- /*=====
- dojo.__IoPublish = function(){
- // summary:
- // This is a list of IO topics that can be published
- // if djConfig.ioPublish is set to true. IO topics can be
- // published for any Input/Output, network operation. So,
- // dojo.xhr, dojo.io.script and dojo.io.iframe can all
- // trigger these topics to be published.
- // start: String
- // "/dojo/io/start" is sent when there are no outstanding IO
- // requests, and a new IO request is started. No arguments
- // are passed with this topic.
- // send: String
- // "/dojo/io/send" is sent whenever a new IO request is started.
- // It passes the dojo.Deferred for the request with the topic.
- // load: String
- // "/dojo/io/load" is sent whenever an IO request has loaded
- // successfully. It passes the response and the dojo.Deferred
- // for the request with the topic.
- // error: String
- // "/dojo/io/error" is sent whenever an IO request has errored.
- // It passes the error and the dojo.Deferred
- // for the request with the topic.
- // done: String
- // "/dojo/io/done" is sent whenever an IO request has completed,
- // either by loading or by erroring. It passes the error and
- // the dojo.Deferred for the request with the topic.
- // stop: String
- // "/dojo/io/stop" is sent when all outstanding IO requests have
- // finished. No arguments are passed with this topic.
- this.start = "/dojo/io/start";
- this.send = "/dojo/io/send";
- this.load = "/dojo/io/load";
- this.error = "/dojo/io/error";
- this.done = "/dojo/io/done";
- this.stop = "/dojo/io/stop";
- }
- =====*/
-
-
- dojo._ioSetArgs = function(/*dojo.__IoArgs*/args,
- /*Function*/canceller,
- /*Function*/okHandler,
- /*Function*/errHandler){
- // summary:
- // sets up the Deferred and ioArgs property on the Deferred so it
- // can be used in an io call.
- // args:
- // The args object passed into the public io call. Recognized properties on
- // the args object are:
- // canceller:
- // The canceller function used for the Deferred object. The function
- // will receive one argument, the Deferred object that is related to the
- // canceller.
- // okHandler:
- // The first OK callback to be registered with Deferred. It has the opportunity
- // to transform the OK response. It will receive one argument -- the Deferred
- // object returned from this function.
- // errHandler:
- // The first error callback to be registered with Deferred. It has the opportunity
- // to do cleanup on an error. It will receive two arguments: error (the
- // Error object) and dfd, the Deferred object returned from this function.
-
- var ioArgs = {args: args, url: args.url};
-
- //Get values from form if requestd.
- var formObject = null;
- if(args.form){
- var form = _d.byId(args.form);
- //IE requires going through getAttributeNode instead of just getAttribute in some form cases,
- //so use it for all. See #2844
- var actnNode = form.getAttributeNode("action");
- ioArgs.url = ioArgs.url || (actnNode ? actnNode.value : null);
- formObject = _d.formToObject(form);
- }
-
- // set up the query params
- var miArgs = [{}];
-
- if(formObject){
- // potentially over-ride url-provided params w/ form values
- miArgs.push(formObject);
- }
- if(args.content){
- // stuff in content over-rides what's set by form
- miArgs.push(args.content);
- }
- if(args.preventCache){
- miArgs.push({"dojo.preventCache": new Date().valueOf()});
- }
- ioArgs.query = _d.objectToQuery(_d.mixin.apply(null, miArgs));
-
- // .. and the real work of getting the deferred in order, etc.
- ioArgs.handleAs = args.handleAs || "text";
- var d = new _d.Deferred(canceller);
- d.addCallbacks(okHandler, function(error){
- return errHandler(error, d);
- });
-
- //Support specifying load, error and handle callback functions from the args.
- //For those callbacks, the "this" object will be the args object.
- //The callbacks will get the deferred result value as the
- //first argument and the ioArgs object as the second argument.
- var ld = args.load;
- if(ld && _d.isFunction(ld)){
- d.addCallback(function(value){
- return ld.call(args, value, ioArgs);
- });
- }
- var err = args.error;
- if(err && _d.isFunction(err)){
- d.addErrback(function(value){
- return err.call(args, value, ioArgs);
- });
- }
- var handle = args.handle;
- if(handle && _d.isFunction(handle)){
- d.addBoth(function(value){
- return handle.call(args, value, ioArgs);
- });
- }
-
- //Plug in topic publishing, if dojo.publish is loaded.
- if(cfg.ioPublish && _d.publish && ioArgs.args.ioPublish !== false){
- d.addCallbacks(
- function(res){
- _d.publish("/dojo/io/load", [d, res]);
- return res;
- },
- function(res){
- _d.publish("/dojo/io/error", [d, res]);
- return res;
- }
- );
- d.addBoth(function(res){
- _d.publish("/dojo/io/done", [d, res]);
- return res;
- });
- }
-
- d.ioArgs = ioArgs;
-
- // FIXME: need to wire up the xhr object's abort method to something
- // analagous in the Deferred
- return d;
- };
-
- var _deferredCancel = function(/*Deferred*/dfd){
- // summary: canceller function for dojo._ioSetArgs call.
-
- dfd.canceled = true;
- var xhr = dfd.ioArgs.xhr;
- var _at = typeof xhr.abort;
- if(_at == "function" || _at == "object" || _at == "unknown"){
- xhr.abort();
- }
- var err = dfd.ioArgs.error;
- if(!err){
- err = new Error("xhr cancelled");
- err.dojoType="cancel";
- }
- return err;
- };
- var _deferredOk = function(/*Deferred*/dfd){
- // summary: okHandler function for dojo._ioSetArgs call.
-
- var ret = handlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);
- return ret === undefined ? null : ret;
- };
- var _deferError = function(/*Error*/error, /*Deferred*/dfd){
- // summary: errHandler function for dojo._ioSetArgs call.
-
- if(!dfd.ioArgs.args.failOk){
- console.error(error);
- }
- return error;
- };
-
- // avoid setting a timer per request. It degrades performance on IE
- // something fierece if we don't use unified loops.
- var _inFlightIntvl = null;
- var _inFlight = [];
-
-
- //Use a separate count for knowing if we are starting/stopping io calls.
- //Cannot use _inFlight.length since it can change at a different time than
- //when we want to do this kind of test. We only want to decrement the count
- //after a callback/errback has finished, since the callback/errback should be
- //considered as part of finishing a request.
- var _pubCount = 0;
- var _checkPubCount = function(dfd){
- if(_pubCount <= 0){
- _pubCount = 0;
- if(cfg.ioPublish && _d.publish && (!dfd || dfd && dfd.ioArgs.args.ioPublish !== false)){
- _d.publish("/dojo/io/stop");
- }
- }
- };
-
- var _watchInFlight = function(){
- //summary:
- // internal method that checks each inflight XMLHttpRequest to see
- // if it has completed or if the timeout situation applies.
-
- var now = (new Date()).getTime();
- // make sure sync calls stay thread safe, if this callback is called
- // during a sync call and this results in another sync call before the
- // first sync call ends the browser hangs
- if(!_d._blockAsync){
- // we need manual loop because we often modify _inFlight (and therefore 'i') while iterating
- // note: the second clause is an assigment on purpose, lint may complain
- for(var i = 0, tif; i < _inFlight.length && (tif = _inFlight[i]); i++){
- var dfd = tif.dfd;
- var func = function(){
- if(!dfd || dfd.canceled || !tif.validCheck(dfd)){
- _inFlight.splice(i--, 1);
- _pubCount -= 1;
- }else if(tif.ioCheck(dfd)){
- _inFlight.splice(i--, 1);
- tif.resHandle(dfd);
- _pubCount -= 1;
- }else if(dfd.startTime){
- //did we timeout?
- if(dfd.startTime + (dfd.ioArgs.args.timeout || 0) < now){
- _inFlight.splice(i--, 1);
- var err = new Error("timeout exceeded");
- err.dojoType = "timeout";
- dfd.errback(err);
- //Cancel the request so the io module can do appropriate cleanup.
- dfd.cancel();
- _pubCount -= 1;
- }
- }
- };
- if(dojo.config.debugAtAllCosts){
- func.call(this);
- }else{
- try{
- func.call(this);
- }catch(e){
- dfd.errback(e);
- }
- }
- }
- }
-
- _checkPubCount(dfd);
-
- if(!_inFlight.length){
- clearInterval(_inFlightIntvl);
- _inFlightIntvl = null;
- return;
- }
- };
-
- dojo._ioCancelAll = function(){
- //summary: Cancels all pending IO requests, regardless of IO type
- //(xhr, script, iframe).
- try{
- _d.forEach(_inFlight, function(i){
- try{
- i.dfd.cancel();
- }catch(e){/*squelch*/}
- });
- }catch(e){/*squelch*/}
- };
-
- //Automatically call cancel all io calls on unload
- //in IE for trac issue #2357.
- if(_d.isIE){
- _d.addOnWindowUnload(_d._ioCancelAll);
- }
-
- _d._ioNotifyStart = function(/*Deferred*/dfd){
- // summary:
- // If dojo.publish is available, publish topics
- // about the start of a request queue and/or the
- // the beginning of request.
- // description:
- // Used by IO transports. An IO transport should
- // call this method before making the network connection.
- if(cfg.ioPublish && _d.publish && dfd.ioArgs.args.ioPublish !== false){
- if(!_pubCount){
- _d.publish("/dojo/io/start");
- }
- _pubCount += 1;
- _d.publish("/dojo/io/send", [dfd]);
- }
- };
-
- _d._ioWatch = function(dfd, validCheck, ioCheck, resHandle){
- // summary:
- // Watches the io request represented by dfd to see if it completes.
- // dfd: Deferred
- // The Deferred object to watch.
- // validCheck: Function
- // Function used to check if the IO request is still valid. Gets the dfd
- // object as its only argument.
- // ioCheck: Function
- // Function used to check if basic IO call worked. Gets the dfd
- // object as its only argument.
- // resHandle: Function
- // Function used to process response. Gets the dfd
- // object as its only argument.
- var args = dfd.ioArgs.args;
- if(args.timeout){
- dfd.startTime = (new Date()).getTime();
- }
-
- _inFlight.push({dfd: dfd, validCheck: validCheck, ioCheck: ioCheck, resHandle: resHandle});
- if(!_inFlightIntvl){
- _inFlightIntvl = setInterval(_watchInFlight, 50);
- }
- // handle sync requests
- //A weakness: async calls in flight
- //could have their handlers called as part of the
- //_watchInFlight call, before the sync's callbacks
- // are called.
- if(args.sync){
- _watchInFlight();
- }
- };
-
- var _defaultContentType = "application/x-www-form-urlencoded";
-
- var _validCheck = function(/*Deferred*/dfd){
- return dfd.ioArgs.xhr.readyState; //boolean
- };
- var _ioCheck = function(/*Deferred*/dfd){
- return 4 == dfd.ioArgs.xhr.readyState; //boolean
- };
- var _resHandle = function(/*Deferred*/dfd){
- var xhr = dfd.ioArgs.xhr;
- if(_d._isDocumentOk(xhr)){
- dfd.callback(dfd);
- }else{
- var err = new Error("Unable to load " + dfd.ioArgs.url + " status:" + xhr.status);
- err.status = xhr.status;
- err.responseText = xhr.responseText;
- dfd.errback(err);
- }
- };
-
- dojo._ioAddQueryToUrl = function(/*dojo.__IoCallbackArgs*/ioArgs){
- //summary: Adds query params discovered by the io deferred construction to the URL.
- //Only use this for operations which are fundamentally GET-type operations.
- if(ioArgs.query.length){
- ioArgs.url += (ioArgs.url.indexOf("?") == -1 ? "?" : "&") + ioArgs.query;
- ioArgs.query = null;
- }
- };
-
- /*=====
- dojo.declare("dojo.__XhrArgs", dojo.__IoArgs, {
- constructor: function(){
- // summary:
- // In addition to the properties listed for the dojo._IoArgs type,
- // the following properties are allowed for dojo.xhr* methods.
- // handleAs: String?
- // Acceptable values are: text (default), json, json-comment-optional,
- // json-comment-filtered, javascript, xml. See `dojo.contentHandlers`
- // sync: Boolean?
- // false is default. Indicates whether the request should
- // be a synchronous (blocking) request.
- // headers: Object?
- // Additional HTTP headers to send in the request.
- // failOk: Boolean?
- // false is default. Indicates whether a request should be
- // allowed to fail (and therefore no console error message in
- // the event of a failure)
- this.handleAs = handleAs;
- this.sync = sync;
- this.headers = headers;
- this.failOk = failOk;
- }
- });
- =====*/
-
- dojo.xhr = function(/*String*/ method, /*dojo.__XhrArgs*/ args, /*Boolean?*/ hasBody){
- // summary:
- // Sends an HTTP request with the given method.
- // description:
- // Sends an HTTP request with the given method.
- // See also dojo.xhrGet(), xhrPost(), xhrPut() and dojo.xhrDelete() for shortcuts
- // for those HTTP methods. There are also methods for "raw" PUT and POST methods
- // via dojo.rawXhrPut() and dojo.rawXhrPost() respectively.
- // method:
- // HTTP method to be used, such as GET, POST, PUT, DELETE. Should be uppercase.
- // hasBody:
- // If the request has an HTTP body, then pass true for hasBody.
-
- //Make the Deferred object for this xhr request.
- var dfd = _d._ioSetArgs(args, _deferredCancel, _deferredOk, _deferError);
- var ioArgs = dfd.ioArgs;
-
- //Pass the args to _xhrObj, to allow alternate XHR calls based specific calls, like
- //the one used for iframe proxies.
- var xhr = ioArgs.xhr = _d._xhrObj(ioArgs.args);
- //If XHR factory fails, cancel the deferred.
- if(!xhr){
- dfd.cancel();
- return dfd;
- }
-
- //Allow for specifying the HTTP body completely.
- if("postData" in args){
- ioArgs.query = args.postData;
- }else if("putData" in args){
- ioArgs.query = args.putData;
- }else if("rawBody" in args){
- ioArgs.query = args.rawBody;
- }else if((arguments.length > 2 && !hasBody) || "POST|PUT".indexOf(method.toUpperCase()) == -1){
- //Check for hasBody being passed. If no hasBody,
- //then only append query string if not a POST or PUT request.
- _d._ioAddQueryToUrl(ioArgs);
- }
-
- // IE 6 is a steaming pile. It won't let you call apply() on the native function (xhr.open).
- // workaround for IE6's apply() "issues"
- xhr.open(method, ioArgs.url, args.sync !== true, args.user || undefined, args.password || undefined);
- if(args.headers){
- for(var hdr in args.headers){
- if(hdr.toLowerCase() === "content-type" && !args.contentType){
- args.contentType = args.headers[hdr];
- }else if(args.headers[hdr]){
- //Only add header if it has a value. This allows for instnace, skipping
- //insertion of X-Requested-With by specifying empty value.
- xhr.setRequestHeader(hdr, args.headers[hdr]);
- }
- }
- }
- // FIXME: is this appropriate for all content types?
- xhr.setRequestHeader("Content-Type", args.contentType || _defaultContentType);
- if(!args.headers || !("X-Requested-With" in args.headers)){
- xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
- }
- // FIXME: set other headers here!
- _d._ioNotifyStart(dfd);
- if(dojo.config.debugAtAllCosts){
- xhr.send(ioArgs.query);
- }else{
- try{
- xhr.send(ioArgs.query);
- }catch(e){
- ioArgs.error = e;
- dfd.cancel();
- }
- }
- _d._ioWatch(dfd, _validCheck, _ioCheck, _resHandle);
- xhr = null;
- return dfd; // dojo.Deferred
- };
-
- dojo.xhrGet = function(/*dojo.__XhrArgs*/ args){
- // summary:
- // Sends an HTTP GET request to the server.
- return _d.xhr("GET", args); // dojo.Deferred
- };
-
- dojo.rawXhrPost = dojo.xhrPost = function(/*dojo.__XhrArgs*/ args){
- // summary:
- // Sends an HTTP POST request to the server. In addtion to the properties
- // listed for the dojo.__XhrArgs type, the following property is allowed:
- // postData:
- // String. Send raw data in the body of the POST request.
- return _d.xhr("POST", args, true); // dojo.Deferred
- };
-
- dojo.rawXhrPut = dojo.xhrPut = function(/*dojo.__XhrArgs*/ args){
- // summary:
- // Sends an HTTP PUT request to the server. In addtion to the properties
- // listed for the dojo.__XhrArgs type, the following property is allowed:
- // putData:
- // String. Send raw data in the body of the PUT request.
- return _d.xhr("PUT", args, true); // dojo.Deferred
- };
-
- dojo.xhrDelete = function(/*dojo.__XhrArgs*/ args){
- // summary:
- // Sends an HTTP DELETE request to the server.
- return _d.xhr("DELETE", args); //dojo.Deferred
- };
-
- /*
- dojo.wrapForm = function(formNode){
- //summary:
- // A replacement for FormBind, but not implemented yet.
-
- // FIXME: need to think harder about what extensions to this we might
- // want. What should we allow folks to do w/ this? What events to
- // set/send?
- throw new Error("dojo.wrapForm not yet implemented");
- }
- */
-})();
-
-}
+//>>built
+define("dojo/_base/xhr",["./kernel","./sniff","require","../io-query","../dom","../dom-form","./Deferred","./json","./lang","./array","../on"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,on){_2.add("native-xhr",function(){return typeof XMLHttpRequest!=="undefined";});if(1&&_3.getXhr){_1._xhrObj=_3.getXhr;}else{if(_2("native-xhr")){_1._xhrObj=function(){try{return new XMLHttpRequest();}catch(e){throw new Error("XMLHTTP not available: "+e);}};}else{for(var _b=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],_c,i=0;i<3;){try{_c=_b[i++];if(new ActiveXObject(_c)){break;}}catch(e){}}_1._xhrObj=function(){return new ActiveXObject(_c);};}}var _d=_1.config;_1.objectToQuery=_4.objectToQuery;_1.queryToObject=_4.queryToObject;_1.fieldToObject=_6.fieldToObject;_1.formToObject=_6.toObject;_1.formToQuery=_6.toQuery;_1.formToJson=_6.toJson;_1._blockAsync=false;var _e=_1._contentHandlers=_1.contentHandlers={"text":function(_f){return _f.responseText;},"json":function(xhr){return _8.fromJson(xhr.responseText||null);},"json-comment-filtered":function(xhr){if(!_1.config.useCommentedJson){console.warn("Consider using the standard mimetype:application/json."+" json-commenting can introduce security issues. To"+" decrease the chances of hijacking, use the standard the 'json' handler and"+" prefix your json with: {}&&\n"+"Use djConfig.useCommentedJson=true to turn off this message.");}var _10=xhr.responseText;var _11=_10.indexOf("/*");var _12=_10.lastIndexOf("*/");if(_11==-1||_12==-1){throw new Error("JSON was not comment filtered");}return _8.fromJson(_10.substring(_11+2,_12));},"javascript":function(xhr){return _1.eval(xhr.responseText);},"xml":function(xhr){var _13=xhr.responseXML;if(_2("ie")){if((!_13||!_13.documentElement)){var ms=function(n){return "MSXML"+n+".DOMDocument";};var dp=["Microsoft.XMLDOM",ms(6),ms(4),ms(3),ms(2)];_a.some(dp,function(p){try{var dom=new ActiveXObject(p);dom.async=false;dom.loadXML(xhr.responseText);_13=dom;}catch(e){return false;}return true;});}}return _13;},"json-comment-optional":function(xhr){if(xhr.responseText&&/^[^{\[]*\/\*/.test(xhr.responseText)){return _e["json-comment-filtered"](xhr);}else{return _e["json"](xhr);}}};_1._ioSetArgs=function(_14,_15,_16,_17){var _18={args:_14,url:_14.url};var _19=null;if(_14.form){var _1a=_5.byId(_14.form);var _1b=_1a.getAttributeNode("action");_18.url=_18.url||(_1b?_1b.value:null);_19=_6.toObject(_1a);}var _1c=[{}];if(_19){_1c.push(_19);}if(_14.content){_1c.push(_14.content);}if(_14.preventCache){_1c.push({"dojo.preventCache":new Date().valueOf()});}_18.query=_4.objectToQuery(_9.mixin.apply(null,_1c));_18.handleAs=_14.handleAs||"text";var d=new _7(_15);d.addCallbacks(_16,function(_1d){return _17(_1d,d);});var ld=_14.load;if(ld&&_9.isFunction(ld)){d.addCallback(function(_1e){return ld.call(_14,_1e,_18);});}var err=_14.error;if(err&&_9.isFunction(err)){d.addErrback(function(_1f){return err.call(_14,_1f,_18);});}var _20=_14.handle;if(_20&&_9.isFunction(_20)){d.addBoth(function(_21){return _20.call(_14,_21,_18);});}if(_d.ioPublish&&_1.publish&&_18.args.ioPublish!==false){d.addCallbacks(function(res){_1.publish("/dojo/io/load",[d,res]);return res;},function(res){_1.publish("/dojo/io/error",[d,res]);return res;});d.addBoth(function(res){_1.publish("/dojo/io/done",[d,res]);return res;});}d.ioArgs=_18;return d;};var _22=function(dfd){dfd.canceled=true;var xhr=dfd.ioArgs.xhr;var _23=typeof xhr.abort;if(_23=="function"||_23=="object"||_23=="unknown"){xhr.abort();}var err=dfd.ioArgs.error;if(!err){err=new Error("xhr cancelled");err.dojoType="cancel";}return err;};var _24=function(dfd){var ret=_e[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);return ret===undefined?null:ret;};var _25=function(_26,dfd){if(!dfd.ioArgs.args.failOk){console.error(_26);}return _26;};var _27=null;var _28=[];var _29=0;var _2a=function(dfd){if(_29<=0){_29=0;if(_d.ioPublish&&_1.publish&&(!dfd||dfd&&dfd.ioArgs.args.ioPublish!==false)){_1.publish("/dojo/io/stop");}}};var _2b=function(){var now=(new Date()).getTime();if(!_1._blockAsync){for(var i=0,tif;i<_28.length&&(tif=_28[i]);i++){var dfd=tif.dfd;var _2c=function(){if(!dfd||dfd.canceled||!tif.validCheck(dfd)){_28.splice(i--,1);_29-=1;}else{if(tif.ioCheck(dfd)){_28.splice(i--,1);tif.resHandle(dfd);_29-=1;}else{if(dfd.startTime){if(dfd.startTime+(dfd.ioArgs.args.timeout||0)<now){_28.splice(i--,1);var err=new Error("timeout exceeded");err.dojoType="timeout";dfd.errback(err);dfd.cancel();_29-=1;}}}}};if(_1.config.debugAtAllCosts){_2c.call(this);}else{try{_2c.call(this);}catch(e){dfd.errback(e);}}}}_2a(dfd);if(!_28.length){clearInterval(_27);_27=null;}};_1._ioCancelAll=function(){try{_a.forEach(_28,function(i){try{i.dfd.cancel();}catch(e){}});}catch(e){}};if(_2("ie")){on(window,"unload",_1._ioCancelAll);}_1._ioNotifyStart=function(dfd){if(_d.ioPublish&&_1.publish&&dfd.ioArgs.args.ioPublish!==false){if(!_29){_1.publish("/dojo/io/start");}_29+=1;_1.publish("/dojo/io/send",[dfd]);}};_1._ioWatch=function(dfd,_2d,_2e,_2f){var _30=dfd.ioArgs.args;if(_30.timeout){dfd.startTime=(new Date()).getTime();}_28.push({dfd:dfd,validCheck:_2d,ioCheck:_2e,resHandle:_2f});if(!_27){_27=setInterval(_2b,50);}if(_30.sync){_2b();}};var _31="application/x-www-form-urlencoded";var _32=function(dfd){return dfd.ioArgs.xhr.readyState;};var _33=function(dfd){return 4==dfd.ioArgs.xhr.readyState;};var _34=function(dfd){var xhr=dfd.ioArgs.xhr;if(_1._isDocumentOk(xhr)){dfd.callback(dfd);}else{var err=new Error("Unable to load "+dfd.ioArgs.url+" status:"+xhr.status);err.status=xhr.status;err.responseText=xhr.responseText;err.xhr=xhr;dfd.errback(err);}};_1._ioAddQueryToUrl=function(_35){if(_35.query.length){_35.url+=(_35.url.indexOf("?")==-1?"?":"&")+_35.query;_35.query=null;}};_1.xhr=function(_36,_37,_38){var dfd=_1._ioSetArgs(_37,_22,_24,_25);var _39=dfd.ioArgs;var xhr=_39.xhr=_1._xhrObj(_39.args);if(!xhr){dfd.cancel();return dfd;}if("postData" in _37){_39.query=_37.postData;}else{if("putData" in _37){_39.query=_37.putData;}else{if("rawBody" in _37){_39.query=_37.rawBody;}else{if((arguments.length>2&&!_38)||"POST|PUT".indexOf(_36.toUpperCase())==-1){_1._ioAddQueryToUrl(_39);}}}}xhr.open(_36,_39.url,_37.sync!==true,_37.user||undefined,_37.password||undefined);if(_37.headers){for(var hdr in _37.headers){if(hdr.toLowerCase()==="content-type"&&!_37.contentType){_37.contentType=_37.headers[hdr];}else{if(_37.headers[hdr]){xhr.setRequestHeader(hdr,_37.headers[hdr]);}}}}if(_37.contentType!==false){xhr.setRequestHeader("Content-Type",_37.contentType||_31);}if(!_37.headers||!("X-Requested-With" in _37.headers)){xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");}_1._ioNotifyStart(dfd);if(_1.config.debugAtAllCosts){xhr.send(_39.query);}else{try{xhr.send(_39.query);}catch(e){_39.error=e;dfd.cancel();}}_1._ioWatch(dfd,_32,_33,_34);xhr=null;return dfd;};_1.xhrGet=function(_3a){return _1.xhr("GET",_3a);};_1.rawXhrPost=_1.xhrPost=function(_3b){return _1.xhr("POST",_3b,true);};_1.rawXhrPut=_1.xhrPut=function(_3c){return _1.xhr("PUT",_3c,true);};_1.xhrDelete=function(_3d){return _1.xhr("DELETE",_3d);};_1._isDocumentOk=function(_3e){var _3f=_3e.status||0;_3f=(_3f>=200&&_3f<300)||_3f==304||_3f==1223||!_3f;return _3f;};_1._getText=function(url){var _40;_1.xhrGet({url:url,sync:true,load:function(_41){_40=_41;}});return _40;};_9.mixin(_1.xhr,{_xhrObj:_1._xhrObj,fieldToObject:_6.fieldToObject,formToObject:_6.toObject,objectToQuery:_4.objectToQuery,formToQuery:_6.toQuery,formToJson:_6.toJson,queryToObject:_4.queryToObject,contentHandlers:_e,_ioSetArgs:_1._ioSetArgs,_ioCancelAll:_1._ioCancelAll,_ioNotifyStart:_1._ioNotifyStart,_ioWatch:_1._ioWatch,_ioAddQueryToUrl:_1._ioAddQueryToUrl,_isDocumentOk:_1._isDocumentOk,_getText:_1._getText,get:_1.xhrGet,post:_1.xhrPost,put:_1.xhrPut,del:_1.xhrDelete});return _1.xhr;}); \ No newline at end of file
diff --git a/lib/dojo/_base/xhr.js.uncompressed.js b/lib/dojo/_base/xhr.js.uncompressed.js
new file mode 100644
index 000000000..94f5c78b1
--- /dev/null
+++ b/lib/dojo/_base/xhr.js.uncompressed.js
@@ -0,0 +1,830 @@
+define("dojo/_base/xhr", [
+ "./kernel", "./sniff", "require", "../io-query", "../dom", "../dom-form", "./Deferred", "./json", "./lang", "./array", "../on"
+], function(dojo, has, require, ioq, dom, domForm, deferred, json, lang, array, on){
+ // module:
+ // dojo/_base.xhr
+ // summary:
+ // This modules defines the dojo.xhr* API.
+
+ has.add("native-xhr", function() {
+ // if true, the environment has a native XHR implementation
+ return typeof XMLHttpRequest !== 'undefined';
+ });
+
+ if(1 && require.getXhr){
+ dojo._xhrObj = require.getXhr;
+ }else if (has("native-xhr")){
+ dojo._xhrObj = function(){
+ // summary:
+ // does the work of portably generating a new XMLHTTPRequest object.
+ try{
+ return new XMLHttpRequest();
+ }catch(e){
+ throw new Error("XMLHTTP not available: "+e);
+ }
+ };
+ }else{
+ // PROGIDs are in order of decreasing likelihood; this will change in time.
+ for(var XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'], progid, i = 0; i < 3;){
+ try{
+ progid = XMLHTTP_PROGIDS[i++];
+ if (new ActiveXObject(progid)) {
+ // this progid works; therefore, use it from now on
+ break;
+ }
+ }catch(e){
+ // squelch; we're just trying to find a good ActiveX PROGID
+ // if they all fail, then progid ends up as the last attempt and that will signal the error
+ // the first time the client actually tries to exec an xhr
+ }
+ }
+ dojo._xhrObj= function() {
+ return new ActiveXObject(progid);
+ };
+ }
+
+ var cfg = dojo.config;
+
+ // mix in io-query and dom-form
+ dojo.objectToQuery = ioq.objectToQuery;
+ dojo.queryToObject = ioq.queryToObject;
+ dojo.fieldToObject = domForm.fieldToObject;
+ dojo.formToObject = domForm.toObject;
+ dojo.formToQuery = domForm.toQuery;
+ dojo.formToJson = domForm.toJson;
+
+ // need to block async callbacks from snatching this thread as the result
+ // of an async callback might call another sync XHR, this hangs khtml forever
+ // must checked by watchInFlight()
+
+ dojo._blockAsync = false;
+
+ // MOW: remove dojo._contentHandlers alias in 2.0
+ var handlers = dojo._contentHandlers = dojo.contentHandlers = {
+ // summary:
+ // A map of availble XHR transport handle types. Name matches the
+ // `handleAs` attribute passed to XHR calls.
+ //
+ // description:
+ // A map of availble XHR transport handle types. Name matches the
+ // `handleAs` attribute passed to XHR calls. Each contentHandler is
+ // called, passing the xhr object for manipulation. The return value
+ // from the contentHandler will be passed to the `load` or `handle`
+ // functions defined in the original xhr call.
+ //
+ // example:
+ // Creating a custom content-handler:
+ // | dojo.contentHandlers.makeCaps = function(xhr){
+ // | return xhr.responseText.toUpperCase();
+ // | }
+ // | // and later:
+ // | dojo.xhrGet({
+ // | url:"foo.txt",
+ // | handleAs:"makeCaps",
+ // | load: function(data){ /* data is a toUpper version of foo.txt */ }
+ // | });
+
+ "text": function(xhr){
+ // summary: A contentHandler which simply returns the plaintext response data
+ return xhr.responseText;
+ },
+ "json": function(xhr){
+ // summary: A contentHandler which returns a JavaScript object created from the response data
+ return json.fromJson(xhr.responseText || null);
+ },
+ "json-comment-filtered": function(xhr){
+ // summary: A contentHandler which expects comment-filtered JSON.
+ // description:
+ // A contentHandler which expects comment-filtered JSON.
+ // the json-comment-filtered option was implemented to prevent
+ // "JavaScript Hijacking", but it is less secure than standard JSON. Use
+ // standard JSON instead. JSON prefixing can be used to subvert hijacking.
+ //
+ // Will throw a notice suggesting to use application/json mimetype, as
+ // json-commenting can introduce security issues. To decrease the chances of hijacking,
+ // use the standard `json` contentHandler, and prefix your "JSON" with: {}&&
+ //
+ // use djConfig.useCommentedJson = true to turn off the notice
+ if(!dojo.config.useCommentedJson){
+ console.warn("Consider using the standard mimetype:application/json."
+ + " json-commenting can introduce security issues. To"
+ + " decrease the chances of hijacking, use the standard the 'json' handler and"
+ + " prefix your json with: {}&&\n"
+ + "Use djConfig.useCommentedJson=true to turn off this message.");
+ }
+
+ var value = xhr.responseText;
+ var cStartIdx = value.indexOf("\/*");
+ var cEndIdx = value.lastIndexOf("*\/");
+ if(cStartIdx == -1 || cEndIdx == -1){
+ throw new Error("JSON was not comment filtered");
+ }
+ return json.fromJson(value.substring(cStartIdx+2, cEndIdx));
+ },
+ "javascript": function(xhr){
+ // summary: A contentHandler which evaluates the response data, expecting it to be valid JavaScript
+
+ // FIXME: try Moz and IE specific eval variants?
+ return dojo.eval(xhr.responseText);
+ },
+ "xml": function(xhr){
+ // summary: A contentHandler returning an XML Document parsed from the response data
+ var result = xhr.responseXML;
+
+ if(has("ie")){
+ if((!result || !result.documentElement)){
+ //WARNING: this branch used by the xml handling in dojo.io.iframe,
+ //so be sure to test dojo.io.iframe if making changes below.
+ var ms = function(n){ return "MSXML" + n + ".DOMDocument"; };
+ var dp = ["Microsoft.XMLDOM", ms(6), ms(4), ms(3), ms(2)];
+ array.some(dp, function(p){
+ try{
+ var dom = new ActiveXObject(p);
+ dom.async = false;
+ dom.loadXML(xhr.responseText);
+ result = dom;
+ }catch(e){ return false; }
+ return true;
+ });
+ }
+ }
+ return result; // DOMDocument
+ },
+ "json-comment-optional": function(xhr){
+ // summary: A contentHandler which checks the presence of comment-filtered JSON and
+ // alternates between the `json` and `json-comment-filtered` contentHandlers.
+ if(xhr.responseText && /^[^{\[]*\/\*/.test(xhr.responseText)){
+ return handlers["json-comment-filtered"](xhr);
+ }else{
+ return handlers["json"](xhr);
+ }
+ }
+ };
+
+ /*=====
+ dojo.__IoArgs = function(){
+ // url: String
+ // URL to server endpoint.
+ // content: Object?
+ // Contains properties with string values. These
+ // properties will be serialized as name1=value2 and
+ // passed in the request.
+ // timeout: Integer?
+ // Milliseconds to wait for the response. If this time
+ // passes, the then error callbacks are called.
+ // form: DOMNode?
+ // DOM node for a form. Used to extract the form values
+ // and send to the server.
+ // preventCache: Boolean?
+ // Default is false. If true, then a
+ // "dojo.preventCache" parameter is sent in the request
+ // with a value that changes with each request
+ // (timestamp). Useful only with GET-type requests.
+ // handleAs: String?
+ // Acceptable values depend on the type of IO
+ // transport (see specific IO calls for more information).
+ // rawBody: String?
+ // Sets the raw body for an HTTP request. If this is used, then the content
+ // property is ignored. This is mostly useful for HTTP methods that have
+ // a body to their requests, like PUT or POST. This property can be used instead
+ // of postData and putData for dojo.rawXhrPost and dojo.rawXhrPut respectively.
+ // ioPublish: Boolean?
+ // Set this explicitly to false to prevent publishing of topics related to
+ // IO operations. Otherwise, if djConfig.ioPublish is set to true, topics
+ // will be published via dojo.publish for different phases of an IO operation.
+ // See dojo.__IoPublish for a list of topics that are published.
+ // load: Function?
+ // This function will be
+ // called on a successful HTTP response code.
+ // error: Function?
+ // This function will
+ // be called when the request fails due to a network or server error, the url
+ // is invalid, etc. It will also be called if the load or handle callback throws an
+ // exception, unless djConfig.debugAtAllCosts is true. This allows deployed applications
+ // to continue to run even when a logic error happens in the callback, while making
+ // it easier to troubleshoot while in debug mode.
+ // handle: Function?
+ // This function will
+ // be called at the end of every request, whether or not an error occurs.
+ this.url = url;
+ this.content = content;
+ this.timeout = timeout;
+ this.form = form;
+ this.preventCache = preventCache;
+ this.handleAs = handleAs;
+ this.ioPublish = ioPublish;
+ this.load = function(response, ioArgs){
+ // ioArgs: dojo.__IoCallbackArgs
+ // Provides additional information about the request.
+ // response: Object
+ // The response in the format as defined with handleAs.
+ }
+ this.error = function(response, ioArgs){
+ // ioArgs: dojo.__IoCallbackArgs
+ // Provides additional information about the request.
+ // response: Object
+ // The response in the format as defined with handleAs.
+ }
+ this.handle = function(loadOrError, response, ioArgs){
+ // loadOrError: String
+ // Provides a string that tells you whether this function
+ // was called because of success (load) or failure (error).
+ // response: Object
+ // The response in the format as defined with handleAs.
+ // ioArgs: dojo.__IoCallbackArgs
+ // Provides additional information about the request.
+ }
+ }
+ =====*/
+
+ /*=====
+ dojo.__IoCallbackArgs = function(args, xhr, url, query, handleAs, id, canDelete, json){
+ // args: Object
+ // the original object argument to the IO call.
+ // xhr: XMLHttpRequest
+ // For XMLHttpRequest calls only, the
+ // XMLHttpRequest object that was used for the
+ // request.
+ // url: String
+ // The final URL used for the call. Many times it
+ // will be different than the original args.url
+ // value.
+ // query: String
+ // For non-GET requests, the
+ // name1=value1&name2=value2 parameters sent up in
+ // the request.
+ // handleAs: String
+ // The final indicator on how the response will be
+ // handled.
+ // id: String
+ // For dojo.io.script calls only, the internal
+ // script ID used for the request.
+ // canDelete: Boolean
+ // For dojo.io.script calls only, indicates
+ // whether the script tag that represents the
+ // request can be deleted after callbacks have
+ // been called. Used internally to know when
+ // cleanup can happen on JSONP-type requests.
+ // json: Object
+ // For dojo.io.script calls only: holds the JSON
+ // response for JSONP-type requests. Used
+ // internally to hold on to the JSON responses.
+ // You should not need to access it directly --
+ // the same object should be passed to the success
+ // callbacks directly.
+ this.args = args;
+ this.xhr = xhr;
+ this.url = url;
+ this.query = query;
+ this.handleAs = handleAs;
+ this.id = id;
+ this.canDelete = canDelete;
+ this.json = json;
+ }
+ =====*/
+
+
+ /*=====
+ dojo.__IoPublish = function(){
+ // summary:
+ // This is a list of IO topics that can be published
+ // if djConfig.ioPublish is set to true. IO topics can be
+ // published for any Input/Output, network operation. So,
+ // dojo.xhr, dojo.io.script and dojo.io.iframe can all
+ // trigger these topics to be published.
+ // start: String
+ // "/dojo/io/start" is sent when there are no outstanding IO
+ // requests, and a new IO request is started. No arguments
+ // are passed with this topic.
+ // send: String
+ // "/dojo/io/send" is sent whenever a new IO request is started.
+ // It passes the dojo.Deferred for the request with the topic.
+ // load: String
+ // "/dojo/io/load" is sent whenever an IO request has loaded
+ // successfully. It passes the response and the dojo.Deferred
+ // for the request with the topic.
+ // error: String
+ // "/dojo/io/error" is sent whenever an IO request has errored.
+ // It passes the error and the dojo.Deferred
+ // for the request with the topic.
+ // done: String
+ // "/dojo/io/done" is sent whenever an IO request has completed,
+ // either by loading or by erroring. It passes the error and
+ // the dojo.Deferred for the request with the topic.
+ // stop: String
+ // "/dojo/io/stop" is sent when all outstanding IO requests have
+ // finished. No arguments are passed with this topic.
+ this.start = "/dojo/io/start";
+ this.send = "/dojo/io/send";
+ this.load = "/dojo/io/load";
+ this.error = "/dojo/io/error";
+ this.done = "/dojo/io/done";
+ this.stop = "/dojo/io/stop";
+ }
+ =====*/
+
+
+ dojo._ioSetArgs = function(/*dojo.__IoArgs*/args,
+ /*Function*/canceller,
+ /*Function*/okHandler,
+ /*Function*/errHandler){
+ // summary:
+ // sets up the Deferred and ioArgs property on the Deferred so it
+ // can be used in an io call.
+ // args:
+ // The args object passed into the public io call. Recognized properties on
+ // the args object are:
+ // canceller:
+ // The canceller function used for the Deferred object. The function
+ // will receive one argument, the Deferred object that is related to the
+ // canceller.
+ // okHandler:
+ // The first OK callback to be registered with Deferred. It has the opportunity
+ // to transform the OK response. It will receive one argument -- the Deferred
+ // object returned from this function.
+ // errHandler:
+ // The first error callback to be registered with Deferred. It has the opportunity
+ // to do cleanup on an error. It will receive two arguments: error (the
+ // Error object) and dfd, the Deferred object returned from this function.
+
+ var ioArgs = {args: args, url: args.url};
+
+ //Get values from form if requestd.
+ var formObject = null;
+ if(args.form){
+ var form = dom.byId(args.form);
+ //IE requires going through getAttributeNode instead of just getAttribute in some form cases,
+ //so use it for all. See #2844
+ var actnNode = form.getAttributeNode("action");
+ ioArgs.url = ioArgs.url || (actnNode ? actnNode.value : null);
+ formObject = domForm.toObject(form);
+ }
+
+ // set up the query params
+ var miArgs = [{}];
+
+ if(formObject){
+ // potentially over-ride url-provided params w/ form values
+ miArgs.push(formObject);
+ }
+ if(args.content){
+ // stuff in content over-rides what's set by form
+ miArgs.push(args.content);
+ }
+ if(args.preventCache){
+ miArgs.push({"dojo.preventCache": new Date().valueOf()});
+ }
+ ioArgs.query = ioq.objectToQuery(lang.mixin.apply(null, miArgs));
+
+ // .. and the real work of getting the deferred in order, etc.
+ ioArgs.handleAs = args.handleAs || "text";
+ var d = new deferred(canceller);
+ d.addCallbacks(okHandler, function(error){
+ return errHandler(error, d);
+ });
+
+ //Support specifying load, error and handle callback functions from the args.
+ //For those callbacks, the "this" object will be the args object.
+ //The callbacks will get the deferred result value as the
+ //first argument and the ioArgs object as the second argument.
+ var ld = args.load;
+ if(ld && lang.isFunction(ld)){
+ d.addCallback(function(value){
+ return ld.call(args, value, ioArgs);
+ });
+ }
+ var err = args.error;
+ if(err && lang.isFunction(err)){
+ d.addErrback(function(value){
+ return err.call(args, value, ioArgs);
+ });
+ }
+ var handle = args.handle;
+ if(handle && lang.isFunction(handle)){
+ d.addBoth(function(value){
+ return handle.call(args, value, ioArgs);
+ });
+ }
+
+ //Plug in topic publishing, if dojo.publish is loaded.
+ if(cfg.ioPublish && dojo.publish && ioArgs.args.ioPublish !== false){
+ d.addCallbacks(
+ function(res){
+ dojo.publish("/dojo/io/load", [d, res]);
+ return res;
+ },
+ function(res){
+ dojo.publish("/dojo/io/error", [d, res]);
+ return res;
+ }
+ );
+ d.addBoth(function(res){
+ dojo.publish("/dojo/io/done", [d, res]);
+ return res;
+ });
+ }
+
+ d.ioArgs = ioArgs;
+
+ // FIXME: need to wire up the xhr object's abort method to something
+ // analagous in the Deferred
+ return d;
+ };
+
+ var _deferredCancel = function(/*Deferred*/dfd){
+ // summary: canceller function for dojo._ioSetArgs call.
+
+ dfd.canceled = true;
+ var xhr = dfd.ioArgs.xhr;
+ var _at = typeof xhr.abort;
+ if(_at == "function" || _at == "object" || _at == "unknown"){
+ xhr.abort();
+ }
+ var err = dfd.ioArgs.error;
+ if(!err){
+ err = new Error("xhr cancelled");
+ err.dojoType="cancel";
+ }
+ return err;
+ };
+ var _deferredOk = function(/*Deferred*/dfd){
+ // summary: okHandler function for dojo._ioSetArgs call.
+
+ var ret = handlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);
+ return ret === undefined ? null : ret;
+ };
+ var _deferError = function(/*Error*/error, /*Deferred*/dfd){
+ // summary: errHandler function for dojo._ioSetArgs call.
+
+ if(!dfd.ioArgs.args.failOk){
+ console.error(error);
+ }
+ return error;
+ };
+
+ // avoid setting a timer per request. It degrades performance on IE
+ // something fierece if we don't use unified loops.
+ var _inFlightIntvl = null;
+ var _inFlight = [];
+
+
+ //Use a separate count for knowing if we are starting/stopping io calls.
+ //Cannot use _inFlight.length since it can change at a different time than
+ //when we want to do this kind of test. We only want to decrement the count
+ //after a callback/errback has finished, since the callback/errback should be
+ //considered as part of finishing a request.
+ var _pubCount = 0;
+ var _checkPubCount = function(dfd){
+ if(_pubCount <= 0){
+ _pubCount = 0;
+ if(cfg.ioPublish && dojo.publish && (!dfd || dfd && dfd.ioArgs.args.ioPublish !== false)){
+ dojo.publish("/dojo/io/stop");
+ }
+ }
+ };
+
+ var _watchInFlight = function(){
+ //summary:
+ // internal method that checks each inflight XMLHttpRequest to see
+ // if it has completed or if the timeout situation applies.
+
+ var now = (new Date()).getTime();
+ // make sure sync calls stay thread safe, if this callback is called
+ // during a sync call and this results in another sync call before the
+ // first sync call ends the browser hangs
+ if(!dojo._blockAsync){
+ // we need manual loop because we often modify _inFlight (and therefore 'i') while iterating
+ // note: the second clause is an assigment on purpose, lint may complain
+ for(var i = 0, tif; i < _inFlight.length && (tif = _inFlight[i]); i++){
+ var dfd = tif.dfd;
+ var func = function(){
+ if(!dfd || dfd.canceled || !tif.validCheck(dfd)){
+ _inFlight.splice(i--, 1);
+ _pubCount -= 1;
+ }else if(tif.ioCheck(dfd)){
+ _inFlight.splice(i--, 1);
+ tif.resHandle(dfd);
+ _pubCount -= 1;
+ }else if(dfd.startTime){
+ //did we timeout?
+ if(dfd.startTime + (dfd.ioArgs.args.timeout || 0) < now){
+ _inFlight.splice(i--, 1);
+ var err = new Error("timeout exceeded");
+ err.dojoType = "timeout";
+ dfd.errback(err);
+ //Cancel the request so the io module can do appropriate cleanup.
+ dfd.cancel();
+ _pubCount -= 1;
+ }
+ }
+ };
+ if(dojo.config.debugAtAllCosts){
+ func.call(this);
+ }else{
+ try{
+ func.call(this);
+ }catch(e){
+ dfd.errback(e);
+ }
+ }
+ }
+ }
+
+ _checkPubCount(dfd);
+
+ if(!_inFlight.length){
+ clearInterval(_inFlightIntvl);
+ _inFlightIntvl = null;
+ }
+ };
+
+ dojo._ioCancelAll = function(){
+ //summary: Cancels all pending IO requests, regardless of IO type
+ //(xhr, script, iframe).
+ try{
+ array.forEach(_inFlight, function(i){
+ try{
+ i.dfd.cancel();
+ }catch(e){/*squelch*/}
+ });
+ }catch(e){/*squelch*/}
+ };
+
+ //Automatically call cancel all io calls on unload
+ //in IE for trac issue #2357.
+ if(has("ie")){
+ on(window, "unload", dojo._ioCancelAll);
+ }
+
+ dojo._ioNotifyStart = function(/*Deferred*/dfd){
+ // summary:
+ // If dojo.publish is available, publish topics
+ // about the start of a request queue and/or the
+ // the beginning of request.
+ // description:
+ // Used by IO transports. An IO transport should
+ // call this method before making the network connection.
+ if(cfg.ioPublish && dojo.publish && dfd.ioArgs.args.ioPublish !== false){
+ if(!_pubCount){
+ dojo.publish("/dojo/io/start");
+ }
+ _pubCount += 1;
+ dojo.publish("/dojo/io/send", [dfd]);
+ }
+ };
+
+ dojo._ioWatch = function(dfd, validCheck, ioCheck, resHandle){
+ // summary:
+ // Watches the io request represented by dfd to see if it completes.
+ // dfd: Deferred
+ // The Deferred object to watch.
+ // validCheck: Function
+ // Function used to check if the IO request is still valid. Gets the dfd
+ // object as its only argument.
+ // ioCheck: Function
+ // Function used to check if basic IO call worked. Gets the dfd
+ // object as its only argument.
+ // resHandle: Function
+ // Function used to process response. Gets the dfd
+ // object as its only argument.
+ var args = dfd.ioArgs.args;
+ if(args.timeout){
+ dfd.startTime = (new Date()).getTime();
+ }
+
+ _inFlight.push({dfd: dfd, validCheck: validCheck, ioCheck: ioCheck, resHandle: resHandle});
+ if(!_inFlightIntvl){
+ _inFlightIntvl = setInterval(_watchInFlight, 50);
+ }
+ // handle sync requests
+ //A weakness: async calls in flight
+ //could have their handlers called as part of the
+ //_watchInFlight call, before the sync's callbacks
+ // are called.
+ if(args.sync){
+ _watchInFlight();
+ }
+ };
+
+ var _defaultContentType = "application/x-www-form-urlencoded";
+
+ var _validCheck = function(/*Deferred*/dfd){
+ return dfd.ioArgs.xhr.readyState; //boolean
+ };
+ var _ioCheck = function(/*Deferred*/dfd){
+ return 4 == dfd.ioArgs.xhr.readyState; //boolean
+ };
+ var _resHandle = function(/*Deferred*/dfd){
+ var xhr = dfd.ioArgs.xhr;
+ if(dojo._isDocumentOk(xhr)){
+ dfd.callback(dfd);
+ }else{
+ var err = new Error("Unable to load " + dfd.ioArgs.url + " status:" + xhr.status);
+ err.status = xhr.status;
+ err.responseText = xhr.responseText;
+ err.xhr = xhr;
+ dfd.errback(err);
+ }
+ };
+
+ dojo._ioAddQueryToUrl = function(/*dojo.__IoCallbackArgs*/ioArgs){
+ //summary: Adds query params discovered by the io deferred construction to the URL.
+ //Only use this for operations which are fundamentally GET-type operations.
+ if(ioArgs.query.length){
+ ioArgs.url += (ioArgs.url.indexOf("?") == -1 ? "?" : "&") + ioArgs.query;
+ ioArgs.query = null;
+ }
+ };
+
+ /*=====
+ dojo.declare("dojo.__XhrArgs", dojo.__IoArgs, {
+ constructor: function(){
+ // summary:
+ // In addition to the properties listed for the dojo._IoArgs type,
+ // the following properties are allowed for dojo.xhr* methods.
+ // handleAs: String?
+ // Acceptable values are: text (default), json, json-comment-optional,
+ // json-comment-filtered, javascript, xml. See `dojo.contentHandlers`
+ // sync: Boolean?
+ // false is default. Indicates whether the request should
+ // be a synchronous (blocking) request.
+ // headers: Object?
+ // Additional HTTP headers to send in the request.
+ // failOk: Boolean?
+ // false is default. Indicates whether a request should be
+ // allowed to fail (and therefore no console error message in
+ // the event of a failure)
+ // contentType: String|Boolean
+ // "application/x-www-form-urlencoded" is default. Set to false to
+ // prevent a Content-Type header from being sent, or to a string
+ // to send a different Content-Type.
+ this.handleAs = handleAs;
+ this.sync = sync;
+ this.headers = headers;
+ this.failOk = failOk;
+ }
+ });
+ =====*/
+
+ dojo.xhr = function(/*String*/ method, /*dojo.__XhrArgs*/ args, /*Boolean?*/ hasBody){
+ // summary:
+ // Sends an HTTP request with the given method.
+ // description:
+ // Sends an HTTP request with the given method.
+ // See also dojo.xhrGet(), xhrPost(), xhrPut() and dojo.xhrDelete() for shortcuts
+ // for those HTTP methods. There are also methods for "raw" PUT and POST methods
+ // via dojo.rawXhrPut() and dojo.rawXhrPost() respectively.
+ // method:
+ // HTTP method to be used, such as GET, POST, PUT, DELETE. Should be uppercase.
+ // hasBody:
+ // If the request has an HTTP body, then pass true for hasBody.
+
+ //Make the Deferred object for this xhr request.
+ var dfd = dojo._ioSetArgs(args, _deferredCancel, _deferredOk, _deferError);
+ var ioArgs = dfd.ioArgs;
+
+ //Pass the args to _xhrObj, to allow alternate XHR calls based specific calls, like
+ //the one used for iframe proxies.
+ var xhr = ioArgs.xhr = dojo._xhrObj(ioArgs.args);
+ //If XHR factory fails, cancel the deferred.
+ if(!xhr){
+ dfd.cancel();
+ return dfd;
+ }
+
+ //Allow for specifying the HTTP body completely.
+ if("postData" in args){
+ ioArgs.query = args.postData;
+ }else if("putData" in args){
+ ioArgs.query = args.putData;
+ }else if("rawBody" in args){
+ ioArgs.query = args.rawBody;
+ }else if((arguments.length > 2 && !hasBody) || "POST|PUT".indexOf(method.toUpperCase()) == -1){
+ //Check for hasBody being passed. If no hasBody,
+ //then only append query string if not a POST or PUT request.
+ dojo._ioAddQueryToUrl(ioArgs);
+ }
+
+ // IE 6 is a steaming pile. It won't let you call apply() on the native function (xhr.open).
+ // workaround for IE6's apply() "issues"
+ xhr.open(method, ioArgs.url, args.sync !== true, args.user || undefined, args.password || undefined);
+ if(args.headers){
+ for(var hdr in args.headers){
+ if(hdr.toLowerCase() === "content-type" && !args.contentType){
+ args.contentType = args.headers[hdr];
+ }else if(args.headers[hdr]){
+ //Only add header if it has a value. This allows for instnace, skipping
+ //insertion of X-Requested-With by specifying empty value.
+ xhr.setRequestHeader(hdr, args.headers[hdr]);
+ }
+ }
+ }
+ // FIXME: is this appropriate for all content types?
+ if(args.contentType !== false){
+ xhr.setRequestHeader("Content-Type", args.contentType || _defaultContentType);
+ }
+ if(!args.headers || !("X-Requested-With" in args.headers)){
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+ }
+ // FIXME: set other headers here!
+ dojo._ioNotifyStart(dfd);
+ if(dojo.config.debugAtAllCosts){
+ xhr.send(ioArgs.query);
+ }else{
+ try{
+ xhr.send(ioArgs.query);
+ }catch(e){
+ ioArgs.error = e;
+ dfd.cancel();
+ }
+ }
+ dojo._ioWatch(dfd, _validCheck, _ioCheck, _resHandle);
+ xhr = null;
+ return dfd; // dojo.Deferred
+ };
+
+ dojo.xhrGet = function(/*dojo.__XhrArgs*/ args){
+ // summary:
+ // Sends an HTTP GET request to the server.
+ return dojo.xhr("GET", args); // dojo.Deferred
+ };
+
+ dojo.rawXhrPost = dojo.xhrPost = function(/*dojo.__XhrArgs*/ args){
+ // summary:
+ // Sends an HTTP POST request to the server. In addtion to the properties
+ // listed for the dojo.__XhrArgs type, the following property is allowed:
+ // postData:
+ // String. Send raw data in the body of the POST request.
+ return dojo.xhr("POST", args, true); // dojo.Deferred
+ };
+
+ dojo.rawXhrPut = dojo.xhrPut = function(/*dojo.__XhrArgs*/ args){
+ // summary:
+ // Sends an HTTP PUT request to the server. In addtion to the properties
+ // listed for the dojo.__XhrArgs type, the following property is allowed:
+ // putData:
+ // String. Send raw data in the body of the PUT request.
+ return dojo.xhr("PUT", args, true); // dojo.Deferred
+ };
+
+ dojo.xhrDelete = function(/*dojo.__XhrArgs*/ args){
+ // summary:
+ // Sends an HTTP DELETE request to the server.
+ return dojo.xhr("DELETE", args); //dojo.Deferred
+ };
+
+ /*
+ dojo.wrapForm = function(formNode){
+ //summary:
+ // A replacement for FormBind, but not implemented yet.
+
+ // FIXME: need to think harder about what extensions to this we might
+ // want. What should we allow folks to do w/ this? What events to
+ // set/send?
+ throw new Error("dojo.wrapForm not yet implemented");
+ }
+ */
+
+ dojo._isDocumentOk = function(http){
+ var stat = http.status || 0;
+ stat =
+ (stat >= 200 && stat < 300) || // allow any 2XX response code
+ stat == 304 || // or, get it out of the cache
+ stat == 1223 || // or, Internet Explorer mangled the status code
+ !stat; // or, we're Titanium/browser chrome/chrome extension requesting a local file
+ return stat; // Boolean
+ };
+
+ dojo._getText = function(url){
+ var result;
+ dojo.xhrGet({url:url, sync:true, load:function(text){
+ result = text;
+ }});
+ return result;
+ };
+
+ // Add aliases for static functions to dojo.xhr since dojo.xhr is what's returned from this module
+ lang.mixin(dojo.xhr, {
+ _xhrObj: dojo._xhrObj,
+ fieldToObject: domForm.fieldToObject,
+ formToObject: domForm.toObject,
+ objectToQuery: ioq.objectToQuery,
+ formToQuery: domForm.toQuery,
+ formToJson: domForm.toJson,
+ queryToObject: ioq.queryToObject,
+ contentHandlers: handlers,
+ _ioSetArgs: dojo._ioSetArgs,
+ _ioCancelAll: dojo._ioCancelAll,
+ _ioNotifyStart: dojo._ioNotifyStart,
+ _ioWatch: dojo._ioWatch,
+ _ioAddQueryToUrl: dojo._ioAddQueryToUrl,
+ _isDocumentOk: dojo._isDocumentOk,
+ _getText: dojo._getText,
+ get: dojo.xhrGet,
+ post: dojo.xhrPost,
+ put: dojo.xhrPut,
+ del: dojo.xhrDelete // because "delete" is a reserved word
+ });
+
+ return dojo.xhr;
+});
diff --git a/lib/dojo/_firebug/firebug.css b/lib/dojo/_firebug/firebug.css
index 27657ef42..2012e0674 100644
--- a/lib/dojo/_firebug/firebug.css
+++ b/lib/dojo/_firebug/firebug.css
@@ -208,4 +208,4 @@
text-decoration:none;
background:transparent url(tab_rgt_over.png) no-repeat right;
color:#FFFFFF;
-} \ No newline at end of file
+}
diff --git a/lib/dojo/_firebug/firebug.js b/lib/dojo/_firebug/firebug.js
index c78b50fa6..cf5044e09 100644
--- a/lib/dojo/_firebug/firebug.js
+++ b/lib/dojo/_firebug/firebug.js
@@ -4,1223 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo._firebug.firebug"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._firebug.firebug"] = true;
-dojo.provide("dojo._firebug.firebug");
-
-
-dojo.deprecated = function(/*String*/ behaviour, /*String?*/ extra, /*String?*/ removal){
- // summary:
- // Log a debug message to indicate that a behavior has been
- // deprecated.
- // extra: Text to append to the message.
- // removal:
- // Text to indicate when in the future the behavior will be removed.
- var message = "DEPRECATED: " + behaviour;
- if(extra){ message += " " + extra; }
- if(removal){ message += " -- will be removed in version: " + removal; }
- console.warn(message);
-};
-
-dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
- // summary: Marks code as experimental.
- // description:
- // This can be used to mark a function, file, or module as
- // experimental. Experimental code is not ready to be used, and the
- // APIs are subject to change without notice. Experimental code may be
- // completed deleted without going through the normal deprecation
- // process.
- // moduleName:
- // The name of a module, or the name of a module file or a specific
- // function
- // extra:
- // some additional message for the user
- // example:
- // | dojo.experimental("dojo.data.Result");
- // example:
- // | dojo.experimental("dojo.weather.toKelvin()", "PENDING approval from NOAA");
- var message = "EXPERIMENTAL: " + moduleName + " -- APIs subject to change without notice.";
- if(extra){ message += " " + extra; }
- console.warn(message);
-};
-
-// FIREBUG LITE
- // summary: Firebug Lite, the baby brother to Joe Hewitt's Firebug for Mozilla Firefox
- // description:
- // Opens a console for logging, debugging, and error messages.
- // Contains partial functionality to Firebug. See function list below.
- // NOTE:
- // Firebug is a Firefox extension created by Joe Hewitt (see license). You do not need Dojo to run Firebug.
- // Firebug Lite is included in Dojo by permission from Joe Hewitt
- // If you are new to Firebug, or used to the Dojo 0.4 dojo.debug, you can learn Firebug
- // functionality by reading the function comments below or visiting http://www.getfirebug.com/docs.html
- // NOTE:
- // To test Firebug Lite in Firefox:
- // FF2: set "console = null" before loading dojo and set djConfig.isDebug=true
- // FF3: disable Firebug and set djConfig.isDebug=true
- //
- // example:
- // Supports inline objects in object inspector window (only simple trace of dom nodes, however)
- // | console.log("my object", {foo:"bar"})
- // example:
- // Option for console to open in popup window
- // | var djConfig = {isDebug: true, popup:true };
- // example:
- // Option for console height (ignored for popup)
- // | var djConfig = {isDebug: true, debugHeight:100 }
-
-
-
-(function(){
-
- var isNewIE = (/Trident/.test(window.navigator.userAgent));
- if(isNewIE){
- // Fixing IE's console
- // IE doesn't insert space between arguments. How annoying.
- var calls = ["log", "info", "debug", "warn", "error"];
- for(var i=0;i<calls.length;i++){
- var m = calls[i];
- var n = "_"+calls[i];
- console[n] = console[m];
- console[m] = (function(){
- var type = n;
- return function(){
- console[type](Array.prototype.slice.call(arguments).join(" "));
- };
- })();
- }
- // clear the console on load. This is more than a convenience - too many logs crashes it.
- // If closed it throws an error
- try{ console.clear(); }catch(e){}
- }
-
- if(
- !dojo.isFF && // Firefox has Firebug
- !dojo.isChrome && // Chrome 3+ has a console
- !dojo.isSafari && // Safari 4 has a console
- !isNewIE && // Has the new IE console
- !window.firebug && // Testing for mozilla firebug lite
- (typeof console != "undefined" && !console.firebug) && //A console that is not firebug's
- !dojo.config.useCustomLogger && // Allow custom loggers
- !dojo.isAIR // isDebug triggers AIRInsector, not Firebug
- ){
-
-
- // don't build firebug in iframes
- try{
- if(window != window.parent){
- // but if we've got a parent logger, connect to it
- if(window.parent["console"]){
- window.console = window.parent.console;
- }
- return;
- }
- }catch(e){/*squelch*/}
-
- // ***************************************************************************
- // Placing these variables before the functions that use them to avoid a
- // shrinksafe bug where variable renaming does not happen correctly otherwise.
-
- // most of the objects in this script are run anonomously
- var _firebugDoc = document;
- var _firebugWin = window;
- var __consoleAnchorId__ = 0;
-
- var consoleFrame = null;
- var consoleBody = null;
- var consoleObjectInspector = null;
- var fireBugTabs = null;
- var commandLine = null;
- var consoleToolbar = null;
-
- var frameVisible = false;
- var messageQueue = [];
- var groupStack = [];
- var timeMap = {};
- var countMap = {};
-
- var consoleDomInspector = null;
- var _inspectionMoveConnection;
- var _inspectionClickConnection;
- var _inspectionEnabled = false;
- var _inspectionTimer = null;
- var _inspectTempNode = document.createElement("div");
-
-
- var _inspectCurrentNode;
- var _restoreBorderStyle;
-
- // ***************************************************************************
-
- window.console = {
- _connects: [],
- log: function(){
- // summary:
- // Sends arguments to console.
- logFormatted(arguments, "");
- },
-
- debug: function(){
- // summary:
- // Sends arguments to console. Missing finctionality to show script line of trace.
- logFormatted(arguments, "debug");
- },
-
- info: function(){
- // summary:
- // Sends arguments to console, highlighted with (I) icon.
- logFormatted(arguments, "info");
- },
-
- warn: function(){
- // summary:
- // Sends warning arguments to console, highlighted with (!) icon and blue style.
- logFormatted(arguments, "warning");
- },
-
- error: function(){
- // summary:
- // Sends error arguments (object) to console, highlighted with (X) icon and yellow style
- // NEW: error object now displays in object inspector
- logFormatted(arguments, "error");
- },
-
- assert: function(truth, message){
- // summary:
- // Tests for true. Throws exception if false.
- if(!truth){
- var args = [];
- for(var i = 1; i < arguments.length; ++i){
- args.push(arguments[i]);
- }
-
- logFormatted(args.length ? args : ["Assertion Failure"], "error");
- throw message ? message : "Assertion Failure";
- }
- },
-
- dir: function(obj){
- var str = printObject( obj );
- str = str.replace(/\n/g, "<br />");
- str = str.replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;");
- logRow([str], "dir");
- },
-
- dirxml: function(node){
- // summary:
- //
- var html = [];
- appendNode(node, html);
- logRow(html, "dirxml");
- },
-
- group: function(){
- // summary:
- // collects log messages into a group, starting with this call and ending with
- // groupEnd(). Missing collapse functionality
- logRow(arguments, "group", pushGroup);
- },
-
- groupEnd: function(){
- // summary:
- // Closes group. See above
- logRow(arguments, "", popGroup);
- },
-
- time: function(name){
- // summary:
- // Starts timers assigned to name given in argument. Timer stops and displays on timeEnd(title);
- // example:
- // | console.time("load");
- // | console.time("myFunction");
- // | console.timeEnd("load");
- // | console.timeEnd("myFunction");
- timeMap[name] = new Date().getTime();
- },
-
- timeEnd: function(name){
- // summary:
- // See above.
- if(name in timeMap){
- var delta = (new Date()).getTime() - timeMap[name];
- logFormatted([name+ ":", delta+"ms"]);
- delete timeMap[name];
- }
- },
-
- count: function(name){
- // summary:
- // Not supported
- if(!countMap[name]) countMap[name] = 0;
- countMap[name]++;
- logFormatted([name+": "+countMap[name]]);
- },
-
- trace: function(_value){
- var stackAmt = _value || 3;
- var f = console.trace.caller; //function that called trace
- console.log(">>> console.trace(stack)");
- for(var i=0;i<stackAmt;i++){
- var func = f.toString();
- var args=[];
- for (var a = 0; a < f.arguments.length; a++) {
- args.push(f.arguments[a]);
- }
- if(f.arguments.length){
- console.dir({"function":func, "arguments":args});
- }else{
- console.dir({"function":func});
- }
-
- f = f.caller;
- }
- },
-
- profile: function(){
- // summary:
- // Not supported
- this.warn(["profile() not supported."]);
- },
-
- profileEnd: function(){ },
-
- clear: function(){
- // summary:
- // Clears message console. Do not call this directly
- if(consoleBody){
- while(consoleBody.childNodes.length){
- dojo.destroy(consoleBody.firstChild);
- }
- }
- dojo.forEach(this._connects,dojo.disconnect);
- },
-
- open: function(){
- // summary:
- // Opens message console. Do not call this directly
- toggleConsole(true);
- },
-
- close: function(){
- // summary:
- // Closes message console. Do not call this directly
- if(frameVisible){
- toggleConsole();
- }
- },
- _restoreBorder: function(){
- if(_inspectCurrentNode){
- _inspectCurrentNode.style.border = _restoreBorderStyle;
- }
- },
- openDomInspector: function(){
- _inspectionEnabled = true;
- consoleBody.style.display = "none";
- consoleDomInspector.style.display = "block";
- consoleObjectInspector.style.display = "none";
- document.body.style.cursor = "pointer";
- _inspectionMoveConnection = dojo.connect(document, "mousemove", function(evt){
- if(!_inspectionEnabled){ return; }
- if(!_inspectionTimer){
- _inspectionTimer = setTimeout(function(){ _inspectionTimer = null; }, 50);
- }else{
- return;
- }
- var node = evt.target;
- if(node && (_inspectCurrentNode !== node)){
- var parent = true;
-
- console._restoreBorder();
- var html = [];
- appendNode(node, html);
- consoleDomInspector.innerHTML = html.join("");
-
- _inspectCurrentNode = node;
- _restoreBorderStyle = _inspectCurrentNode.style.border;
- _inspectCurrentNode.style.border = "#0000FF 1px solid";
- }
- });
- setTimeout(function(){
- _inspectionClickConnection = dojo.connect(document, "click", function(evt){
- document.body.style.cursor = "";
- _inspectionEnabled = !_inspectionEnabled;
- dojo.disconnect(_inspectionClickConnection);
- // console._restoreBorder();
- });
- }, 30);
- },
- _closeDomInspector: function(){
- document.body.style.cursor = "";
- dojo.disconnect(_inspectionMoveConnection);
- dojo.disconnect(_inspectionClickConnection);
- _inspectionEnabled = false;
- console._restoreBorder();
- },
- openConsole:function(){
- // summary:
- // Closes object inspector and opens message console. Do not call this directly
- consoleBody.style.display = "block";
- consoleDomInspector.style.display = "none";
- consoleObjectInspector.style.display = "none";
- console._closeDomInspector();
- },
- openObjectInspector:function(){
- consoleBody.style.display = "none";
- consoleDomInspector.style.display = "none";
- consoleObjectInspector.style.display = "block";
- console._closeDomInspector();
- },
- recss: function(){
- // http://turtle.dojotoolkit.org/~david/recss.html
- // this is placed in dojo since the console is most likely
- // in another window and dojo is easilly accessible
- var i,a,s;a=document.getElementsByTagName('link');
- for(i=0;i<a.length;i++){
- s=a[i];
- if(s.rel.toLowerCase().indexOf('stylesheet')>=0&&s.href) {
- var h=s.href.replace(/(&|%5C?)forceReload=\d+/,'');
- s.href=h+(h.indexOf('?')>=0?'&':'?')+'forceReload='+new Date().valueOf();
- }
- }
- }
- };
-
- // ***************************************************************************
-
- function toggleConsole(forceOpen){
- frameVisible = forceOpen || !frameVisible;
- if(consoleFrame){
- consoleFrame.style.display = frameVisible ? "block" : "none";
- }
- }
-
- function focusCommandLine(){
- toggleConsole(true);
- if(commandLine){
- commandLine.focus();
- }
- }
-
- function openWin(x,y,w,h){
- var win = window.open("","_firebug","status=0,menubar=0,resizable=1,top="+y+",left="+x+",width="+w+",height="+h+",scrollbars=1,addressbar=0");
- if(!win){
- var msg = "Firebug Lite could not open a pop-up window, most likely because of a blocker.\n" +
- "Either enable pop-ups for this domain, or change the djConfig to popup=false.";
- alert(msg);
- }
- createResizeHandler(win);
- var newDoc=win.document;
- //Safari needs an HTML height
- var HTMLstring= '<html style="height:100%;"><head><title>Firebug Lite</title></head>\n' +
- '<body bgColor="#ccc" style="height:97%;" onresize="opener.onFirebugResize()">\n' +
- '<div id="fb"></div>' +
- '</body></html>';
-
- newDoc.write(HTMLstring);
- newDoc.close();
- return win;
- }
-
- function createResizeHandler(wn){
- // summary
- // Creates handle for onresize window. Called from script in popup's body tag (so that it will work with IE).
- //
-
- var d = new Date();
- d.setTime(d.getTime()+(60*24*60*60*1000)); // 60 days
- d = d.toUTCString();
-
- var dc = wn.document,
- getViewport;
-
- if (wn.innerWidth){
- getViewport = function(){
- return{w:wn.innerWidth, h:wn.innerHeight};
- };
- }else if (dc.documentElement && dc.documentElement.clientWidth){
- getViewport = function(){
- return{w:dc.documentElement.clientWidth, h:dc.documentElement.clientHeight};
- };
- }else if (dc.body){
- getViewport = function(){
- return{w:dc.body.clientWidth, h:dc.body.clientHeight};
- };
- }
-
-
- window.onFirebugResize = function(){
-
- //resize the height of the console log body
- layout(getViewport().h);
-
- clearInterval(wn._firebugWin_resize);
- wn._firebugWin_resize = setTimeout(function(){
- var x = wn.screenLeft,
- y = wn.screenTop,
- w = wn.outerWidth || wn.document.body.offsetWidth,
- h = wn.outerHeight || wn.document.body.offsetHeight;
-
- document.cookie = "_firebugPosition=" + [x,y,w,h].join(",") + "; expires="+d+"; path=/";
-
- }, 5000); //can't capture window.onMove - long timeout gives better chance of capturing a resize, then the move
-
- };
- }
-
-
- /*****************************************************************************/
-
-
- function createFrame(){
- if(consoleFrame){
- return;
- }
-
- if(dojo.config.popup){
- var containerHeight = "100%";
- var cookieMatch = document.cookie.match(/(?:^|; )_firebugPosition=([^;]*)/);
- var p = cookieMatch ? cookieMatch[1].split(",") : [2,2,320,480];
-
- _firebugWin = openWin(p[0],p[1],p[2],p[3]); // global
- _firebugDoc = _firebugWin.document; // global
-
- dojo.config.debugContainerId = 'fb';
-
- // connecting popup
- _firebugWin.console = window.console;
- _firebugWin.dojo = window.dojo;
- }else{
- _firebugDoc = document;
- containerHeight = (dojo.config.debugHeight || 300) + "px";
- }
-
- var styleElement = _firebugDoc.createElement("link");
- styleElement.href = dojo.moduleUrl("dojo._firebug", "firebug.css");
- styleElement.rel = "stylesheet";
- styleElement.type = "text/css";
- var styleParent = _firebugDoc.getElementsByTagName("head");
- if(styleParent){
- styleParent = styleParent[0];
- }
- if(!styleParent){
- styleParent = _firebugDoc.getElementsByTagName("html")[0];
- }
- if(dojo.isIE){
- window.setTimeout(function(){ styleParent.appendChild(styleElement); }, 0);
- }else{
- styleParent.appendChild(styleElement);
- }
-
- if(dojo.config.debugContainerId){
- consoleFrame = _firebugDoc.getElementById(dojo.config.debugContainerId);
- }
- if(!consoleFrame){
- consoleFrame = _firebugDoc.createElement("div");
- _firebugDoc.body.appendChild(consoleFrame);
- }
- consoleFrame.className += " firebug";
- consoleFrame.style.height = containerHeight;
- consoleFrame.style.display = (frameVisible ? "block" : "none");
-
- var buildLink = function(label, title, method, _class){
- return '<li class="'+_class+'"><a href="javascript:void(0);" onclick="console.'+ method +'(); return false;" title="'+title+'">'+label+'</a></li>';
- };
- consoleFrame.innerHTML =
- '<div id="firebugToolbar">'
- + ' <ul id="fireBugTabs" class="tabs">'
-
- + buildLink("Clear", "Remove All Console Logs", "clear", "")
- + buildLink("ReCSS", "Refresh CSS without reloading page", "recss", "")
-
- + buildLink("Console", "Show Console Logs", "openConsole", "gap")
- + buildLink("DOM", "Show DOM Inspector", "openDomInspector", "")
- + buildLink("Object", "Show Object Inspector", "openObjectInspector", "")
- + ((dojo.config.popup) ? "" : buildLink("Close", "Close the console", "close", "gap"))
-
- + ' </ul>'
- + '</div>'
- + '<input type="text" id="firebugCommandLine" />'
- + '<div id="firebugLog"></div>'
- + '<div id="objectLog" style="display:none;">Click on an object in the Log display</div>'
- + '<div id="domInspect" style="display:none;">Hover over HTML elements in the main page. Click to hold selection.</div>';
-
-
- consoleToolbar = _firebugDoc.getElementById("firebugToolbar");
-
- commandLine = _firebugDoc.getElementById("firebugCommandLine");
- addEvent(commandLine, "keydown", onCommandLineKeyDown);
-
- addEvent(_firebugDoc, dojo.isIE || dojo.isSafari ? "keydown" : "keypress", onKeyDown);
-
- consoleBody = _firebugDoc.getElementById("firebugLog");
- consoleObjectInspector = _firebugDoc.getElementById("objectLog");
- consoleDomInspector = _firebugDoc.getElementById("domInspect");
- fireBugTabs = _firebugDoc.getElementById("fireBugTabs");
- layout();
- flush();
- }
-
- dojo.addOnLoad(createFrame);
-
- function clearFrame(){
- _firebugDoc = null;
-
- if(_firebugWin.console){
- _firebugWin.console.clear();
- }
- _firebugWin = null;
- consoleFrame = null;
- consoleBody = null;
- consoleObjectInspector = null;
- consoleDomInspector = null;
- commandLine = null;
- messageQueue = [];
- groupStack = [];
- timeMap = {};
- }
-
-
- function evalCommandLine(){
- var text = commandLine.value;
- commandLine.value = "";
-
- logRow(["> ", text], "command");
-
- var value;
- try{
- value = eval(text);
- }catch(e){
- console.debug(e); // put exception on the console
- }
-
- console.log(value);
- }
-
- function layout(h){
- var tHeight = 25; //consoleToolbar.offsetHeight; // tab style not ready on load - throws off layout
- var height = h ?
- h - (tHeight + commandLine.offsetHeight +25 + (h*.01)) + "px" :
- (consoleFrame.offsetHeight - tHeight - commandLine.offsetHeight) + "px";
-
- consoleBody.style.top = tHeight + "px";
- consoleBody.style.height = height;
- consoleObjectInspector.style.height = height;
- consoleObjectInspector.style.top = tHeight + "px";
- consoleDomInspector.style.height = height;
- consoleDomInspector.style.top = tHeight + "px";
- commandLine.style.bottom = 0;
-
- dojo.addOnWindowUnload(clearFrame);
- }
-
- function logRow(message, className, handler){
- if(consoleBody){
- writeMessage(message, className, handler);
- }else{
- messageQueue.push([message, className, handler]);
- }
- }
-
- function flush(){
- var queue = messageQueue;
- messageQueue = [];
-
- for(var i = 0; i < queue.length; ++i){
- writeMessage(queue[i][0], queue[i][1], queue[i][2]);
- }
- }
-
- function writeMessage(message, className, handler){
- var isScrolledToBottom =
- consoleBody.scrollTop + consoleBody.offsetHeight >= consoleBody.scrollHeight;
-
- handler = handler||writeRow;
-
- handler(message, className);
-
- if(isScrolledToBottom){
- consoleBody.scrollTop = consoleBody.scrollHeight - consoleBody.offsetHeight;
- }
- }
-
- function appendRow(row){
- var container = groupStack.length ? groupStack[groupStack.length-1] : consoleBody;
- container.appendChild(row);
- }
-
- function writeRow(message, className){
- var row = consoleBody.ownerDocument.createElement("div");
- row.className = "logRow" + (className ? " logRow-"+className : "");
- row.innerHTML = message.join("");
- appendRow(row);
- }
-
- function pushGroup(message, className){
- logFormatted(message, className);
-
- //var groupRow = consoleBody.ownerDocument.createElement("div");
- //groupRow.className = "logGroup";
- var groupRowBox = consoleBody.ownerDocument.createElement("div");
- groupRowBox.className = "logGroupBox";
- //groupRow.appendChild(groupRowBox);
- appendRow(groupRowBox);
- groupStack.push(groupRowBox);
- }
-
- function popGroup(){
- groupStack.pop();
- }
-
- // ***************************************************************************
-
- function logFormatted(objects, className){
- var html = [];
-
- var format = objects[0];
- var objIndex = 0;
-
- if(typeof(format) != "string"){
- format = "";
- objIndex = -1;
- }
-
- var parts = parseFormat(format);
-
- for(var i = 0; i < parts.length; ++i){
- var part = parts[i];
- if(part && typeof part == "object"){
- part.appender(objects[++objIndex], html);
- }else{
- appendText(part, html);
- }
- }
-
-
- var ids = [];
- var obs = [];
- for(i = objIndex+1; i < objects.length; ++i){
- appendText(" ", html);
-
- var object = objects[i];
- if(object === undefined || object === null ){
- appendNull(object, html);
-
- }else if(typeof(object) == "string"){
- appendText(object, html);
-
- }else if(object instanceof Date){
- appendText(object.toString(), html);
-
- }else if(object.nodeType == 9){
- appendText("[ XmlDoc ]", html);
-
- }else{
- // Create link for object inspector
- // need to create an ID for this link, since it is currently text
- var id = "_a" + __consoleAnchorId__++;
- ids.push(id);
- // need to save the object, so the arrays line up
- obs.push(object);
- var str = '<a id="'+id+'" href="javascript:void(0);">'+getObjectAbbr(object)+'</a>';
-
- appendLink( str , html);
- }
- }
-
- logRow(html, className);
-
- // Now that the row is inserted in the DOM, loop through all of the links that were just created
- for(i=0; i<ids.length; i++){
- var btn = _firebugDoc.getElementById(ids[i]);
- if(!btn){ continue; }
-
- // store the object in the dom btn for reference later
- // avoid parsing these objects unless necessary
- btn.obj = obs[i];
-
- _firebugWin.console._connects.push(dojo.connect(btn, "onclick", function(){
-
- console.openObjectInspector();
-
- try{
- printObject(this.obj);
- }catch(e){
- this.obj = e;
- }
- consoleObjectInspector.innerHTML = "<pre>" + printObject( this.obj ) + "</pre>";
- }));
- }
- }
-
- function parseFormat(format){
- var parts = [];
-
- var reg = /((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/;
- var appenderMap = {s: appendText, d: appendInteger, i: appendInteger, f: appendFloat};
-
- for(var m = reg.exec(format); m; m = reg.exec(format)){
- var type = m[8] ? m[8] : m[5];
- var appender = type in appenderMap ? appenderMap[type] : appendObject;
- var precision = m[3] ? parseInt(m[3]) : (m[4] == "." ? -1 : 0);
-
- parts.push(format.substr(0, m[0][0] == "%" ? m.index : m.index+1));
- parts.push({appender: appender, precision: precision});
-
- format = format.substr(m.index+m[0].length);
- }
-
- parts.push(format);
-
- return parts;
- }
-
- function escapeHTML(value){
- function replaceChars(ch){
- switch(ch){
- case "<":
- return "&lt;";
- case ">":
- return "&gt;";
- case "&":
- return "&amp;";
- case "'":
- return "&#39;";
- case '"':
- return "&quot;";
- }
- return "?";
- }
- return String(value).replace(/[<>&"']/g, replaceChars);
- }
-
- function objectToString(object){
- try{
- return object+"";
- }catch(e){
- return null;
- }
- }
-
- // ***************************************************************************
- function appendLink(object, html){
- // needed for object links - no HTML escaping
- html.push( objectToString(object) );
- }
-
- function appendText(object, html){
- html.push(escapeHTML(objectToString(object)));
- }
-
- function appendNull(object, html){
- html.push('<span class="objectBox-null">', escapeHTML(objectToString(object)), '</span>');
- }
-
- function appendString(object, html){
- html.push('<span class="objectBox-string">&quot;', escapeHTML(objectToString(object)),
- '&quot;</span>');
- }
-
- function appendInteger(object, html){
- html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
- }
-
- function appendFloat(object, html){
- html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
- }
-
- function appendFunction(object, html){
- html.push('<span class="objectBox-function">', getObjectAbbr(object), '</span>');
- }
-
- function appendObject(object, html){
- try{
- if(object === undefined){
- appendNull("undefined", html);
- }else if(object === null){
- appendNull("null", html);
- }else if(typeof object == "string"){
- appendString(object, html);
- }else if(typeof object == "number"){
- appendInteger(object, html);
- }else if(typeof object == "function"){
- appendFunction(object, html);
- }else if(object.nodeType == 1){
- appendSelector(object, html);
- }else if(typeof object == "object"){
- appendObjectFormatted(object, html);
- }else{
- appendText(object, html);
- }
- }catch(e){
- /* squelch */
- }
- }
-
- function appendObjectFormatted(object, html){
- var text = objectToString(object);
- var reObject = /\[object (.*?)\]/;
-
- var m = reObject.exec(text);
- html.push('<span class="objectBox-object">', m ? m[1] : text, '</span>');
- }
-
- function appendSelector(object, html){
- html.push('<span class="objectBox-selector">');
-
- html.push('<span class="selectorTag">', escapeHTML(object.nodeName.toLowerCase()), '</span>');
- if(object.id){
- html.push('<span class="selectorId">#', escapeHTML(object.id), '</span>');
- }
- if(object.className){
- html.push('<span class="selectorClass">.', escapeHTML(object.className), '</span>');
- }
-
- html.push('</span>');
- }
-
- function appendNode(node, html){
- if(node.nodeType == 1){
- html.push(
- '<div class="objectBox-element">',
- '&lt;<span class="nodeTag">', node.nodeName.toLowerCase(), '</span>');
-
- for(var i = 0; i < node.attributes.length; ++i){
- var attr = node.attributes[i];
- if(!attr.specified){ continue; }
-
- html.push('&nbsp;<span class="nodeName">', attr.nodeName.toLowerCase(),
- '</span>=&quot;<span class="nodeValue">', escapeHTML(attr.nodeValue),
- '</span>&quot;');
- }
-
- if(node.firstChild){
- html.push('&gt;</div><div class="nodeChildren">');
-
- for(var child = node.firstChild; child; child = child.nextSibling){
- appendNode(child, html);
- }
-
- html.push('</div><div class="objectBox-element">&lt;/<span class="nodeTag">',
- node.nodeName.toLowerCase(), '&gt;</span></div>');
- }else{
- html.push('/&gt;</div>');
- }
- }else if (node.nodeType == 3){
- html.push('<div class="nodeText">', escapeHTML(node.nodeValue),
- '</div>');
- }
- }
-
- // ***************************************************************************
-
- function addEvent(object, name, handler){
- if(document.all){
- object.attachEvent("on"+name, handler);
- }else{
- object.addEventListener(name, handler, false);
- }
- }
-
- function removeEvent(object, name, handler){
- if(document.all){
- object.detachEvent("on"+name, handler);
- }else{
- object.removeEventListener(name, handler, false);
- }
- }
-
- function cancelEvent(event){
- if(document.all){
- event.cancelBubble = true;
- }else{
- event.stopPropagation();
- }
- }
-
- function onError(msg, href, lineNo){
- var lastSlash = href.lastIndexOf("/");
- var fileName = lastSlash == -1 ? href : href.substr(lastSlash+1);
-
- var html = [
- '<span class="errorMessage">', msg, '</span>',
- '<div class="objectBox-sourceLink">', fileName, ' (line ', lineNo, ')</div>'
- ];
-
- logRow(html, "error");
- }
-
-
- //After converting to div instead of iframe, now getting two keydowns right away in IE 6.
- //Make sure there is a little bit of delay.
- var onKeyDownTime = new Date().getTime();
-
- function onKeyDown(event){
- var timestamp = (new Date()).getTime();
- if(timestamp > onKeyDownTime + 200){
- event = dojo.fixEvent(event);
- var keys = dojo.keys;
- var ekc = event.keyCode;
- onKeyDownTime = timestamp;
- if(ekc == keys.F12){
- toggleConsole();
- }else if(
- (ekc == keys.NUMPAD_ENTER || ekc == 76) &&
- event.shiftKey &&
- (event.metaKey || event.ctrlKey)
- ){
- focusCommandLine();
- }else{
- return;
- }
- cancelEvent(event);
- }
- }
-
- function onCommandLineKeyDown(e){
- var dk = dojo.keys;
- if(e.keyCode == 13 && commandLine.value){
- addToHistory(commandLine.value);
- evalCommandLine();
- }else if(e.keyCode == 27){
- commandLine.value = "";
- }else if(e.keyCode == dk.UP_ARROW || e.charCode == dk.UP_ARROW){
- navigateHistory("older");
- }else if(e.keyCode == dk.DOWN_ARROW || e.charCode == dk.DOWN_ARROW){
- navigateHistory("newer");
- }else if(e.keyCode == dk.HOME || e.charCode == dk.HOME){
- historyPosition = 1;
- navigateHistory("older");
- }else if(e.keyCode == dk.END || e.charCode == dk.END){
- historyPosition = 999999;
- navigateHistory("newer");
- }
- }
-
- var historyPosition = -1;
- var historyCommandLine = null;
-
- function addToHistory(value){
- var history = cookie("firebug_history");
- history = (history) ? dojo.fromJson(history) : [];
- var pos = dojo.indexOf(history, value);
- if (pos != -1){
- history.splice(pos, 1);
- }
- history.push(value);
- cookie("firebug_history", dojo.toJson(history), 30);
- while(history.length && !cookie("firebug_history")){
- history.shift();
- cookie("firebug_history", dojo.toJson(history), 30);
- }
- historyCommandLine = null;
- historyPosition = -1;
- }
-
- function navigateHistory(direction){
- var history = cookie("firebug_history");
- history = (history) ? dojo.fromJson(history) : [];
- if(!history.length){
- return;
- }
-
- if(historyCommandLine === null){
- historyCommandLine = commandLine.value;
- }
-
- if(historyPosition == -1){
- historyPosition = history.length;
- }
-
- if(direction == "older"){
- --historyPosition;
- if(historyPosition < 0){
- historyPosition = 0;
- }
- }else if(direction == "newer"){
- ++historyPosition;
- if(historyPosition > history.length){
- historyPosition = history.length;
- }
- }
-
- if(historyPosition == history.length){
- commandLine.value = historyCommandLine;
- historyCommandLine = null;
- }else{
- commandLine.value = history[historyPosition];
- }
- }
-
- function cookie(name, value){
- var c = document.cookie;
- if(arguments.length == 1){
- var matches = c.match(new RegExp("(?:^|; )" + name + "=([^;]*)"));
- return matches ? decodeURIComponent(matches[1]) : undefined; // String or undefined
- }else{
- var d = new Date();
- d.setMonth(d.getMonth()+1);
- document.cookie = name + "=" + encodeURIComponent(value) + ((d.toUtcString) ? "; expires=" + d.toUTCString() : "");
- }
- };
-
- function isArray(it){
- return it && it instanceof Array || typeof it == "array";
- }
-
- //***************************************************************************************************
- // Print Object Helpers
- function objectLength(o){
- var cnt = 0;
- for(var nm in o){
- cnt++;
- }
- return cnt;
- }
-
- function printObject(o, i, txt, used){
- // Recursively trace object, indenting to represent depth for display in object inspector
- var ind = " \t";
- txt = txt || "";
- i = i || ind;
- used = used || [];
- var opnCls;
-
- if(o && o.nodeType == 1){
- var html = [];
- appendNode(o, html);
- return html.join("");
- }
-
- var br=",\n", cnt = 0, length = objectLength(o);
-
- if(o instanceof Date){
- return i + o.toString() + br;
- }
- looking:
- for(var nm in o){
- cnt++;
- if(cnt==length){br = "\n";}
- if(o[nm] === window || o[nm] === document){
- continue;
- }else if(o[nm] === null){
- txt += i+nm + " : NULL" + br;
- }else if(o[nm] && o[nm].nodeType){
- if(o[nm].nodeType == 1){
- //txt += i+nm + " : < "+o[nm].tagName+" id=\""+ o[nm].id+"\" />" + br;
- }else if(o[nm].nodeType == 3){
- txt += i+nm + " : [ TextNode "+o[nm].data + " ]" + br;
- }
-
- }else if(typeof o[nm] == "object" && (o[nm] instanceof String || o[nm] instanceof Number || o[nm] instanceof Boolean)){
- txt += i+nm + " : " + o[nm] + "," + br;
-
- }else if(o[nm] instanceof Date){
- txt += i+nm + " : " + o[nm].toString() + br;
-
- }else if(typeof(o[nm]) == "object" && o[nm]){
- for(var j = 0, seen; seen = used[j]; j++){
- if(o[nm] === seen){
- txt += i+nm + " : RECURSION" + br;
- continue looking;
- }
- }
- used.push(o[nm]);
-
- opnCls = (isArray(o[nm]))?["[","]"]:["{","}"];
- txt += i+nm +" : " + opnCls[0] + "\n";//non-standard break, (no comma)
- txt += printObject(o[nm], i+ind, "", used);
- txt += i + opnCls[1] + br;
-
- }else if(typeof o[nm] == "undefined"){
- txt += i+nm + " : undefined" + br;
- }else if(nm == "toString" && typeof o[nm] == "function"){
- var toString = o[nm]();
- if(typeof toString == "string" && toString.match(/function ?(.*?)\(/)){
- toString = escapeHTML(getObjectAbbr(o[nm]));
- }
- txt += i+nm +" : " + toString + br;
- }else{
- txt += i+nm +" : "+ escapeHTML(getObjectAbbr(o[nm])) + br;
- }
- }
- return txt;
- }
-
- function getObjectAbbr(obj){
- // Gets an abbreviation of an object for display in log
- // X items in object, including id
- // X items in an array
- // TODO: Firebug Sr. actually goes by char count
- var isError = (obj instanceof Error);
- if(obj.nodeType == 1){
- return escapeHTML('< '+obj.tagName.toLowerCase()+' id=\"'+ obj.id+ '\" />');
- }
- if(obj.nodeType == 3){
- return escapeHTML('[TextNode: "'+obj.nodeValue+'"]');
- }
- var nm = (obj && (obj.id || obj.name || obj.ObjectID || obj.widgetId));
- if(!isError && nm){ return "{"+nm+"}"; }
-
- var obCnt = 2;
- var arCnt = 4;
- var cnt = 0;
-
- if(isError){
- nm = "[ Error: "+(obj.message || obj.description || obj)+" ]";
- }else if(isArray(obj)){
- nm = "[" + obj.slice(0,arCnt).join(",");
- if(obj.length > arCnt){
- nm += " ... ("+obj.length+" items)";
- }
- nm += "]";
- }else if(typeof obj == "function"){
- nm = obj + "";
- var reg = /function\s*([^\(]*)(\([^\)]*\))[^\{]*\{/;
- var m = reg.exec(nm);
- if(m){
- if(!m[1]){
- m[1] = "function";
- }
- nm = m[1] + m[2];
- }else{
- nm = "function()";
- }
- }else if(typeof obj != "object" || typeof obj == "string"){
- nm = obj + "";
- }else{
- nm = "{";
- for(var i in obj){
- cnt++;
- if(cnt > obCnt){ break; }
- nm += i+":"+escapeHTML(obj[i])+" ";
- }
- nm+="}";
- }
-
- return nm;
- }
-
- //*************************************************************************************
-
- //window.onerror = onError;
-
- addEvent(document, dojo.isIE || dojo.isSafari ? "keydown" : "keypress", onKeyDown);
-
- if( (document.documentElement.getAttribute("debug") == "true")||
- (dojo.config.isDebug)
- ){
- toggleConsole(true);
- }
-
- dojo.addOnWindowUnload(function(){
- // Erase the globals and event handlers I created, to prevent spurious leak warnings
- removeEvent(document, dojo.isIE || dojo.isSafari ? "keydown" : "keypress", onKeyDown);
- window.onFirebugResize = null;
- window.console = null;
- });
-}
-
-})();
-
-}
+//>>built
+define("dojo/_firebug/firebug",["../_base/kernel","require","../_base/html","../_base/sniff","../_base/array","../_base/lang","../_base/event","../_base/unload"],function(_1,_2){var _3=(/Trident/.test(window.navigator.userAgent));if(_3){var _4=["log","info","debug","warn","error"];for(var i=0;i<_4.length;i++){var m=_4[i];if(!console[m]||console[m]._fake){continue;}var n="_"+_4[i];console[n]=console[m];console[m]=(function(){var _5=n;return function(){console[_5](Array.prototype.join.call(arguments," "));};})();}try{console.clear();}catch(e){}}if(_1.isFF||_1.isChrome||_1.isSafari||_3||window.firebug||(typeof console!="undefined"&&console.firebug)||_1.config.useCustomLogger||_1.isAIR){return;}try{if(window!=window.parent){if(window.parent["console"]){window.console=window.parent.console;}return;}}catch(e){}var _6=document;var _7=window;var _8=0;var _9=null;var _a=null;var _b=null;var _c=null;var _d=null;var _e=null;var _f=false;var _10=[];var _11=[];var _12={};var _13={};var _14=null;var _15;var _16;var _17=false;var _18=null;var _19=document.createElement("div");var _1a;var _1b;window.console={_connects:[],log:function(){_1c(arguments,"");},debug:function(){_1c(arguments,"debug");},info:function(){_1c(arguments,"info");},warn:function(){_1c(arguments,"warning");},error:function(){_1c(arguments,"error");},assert:function(_1d,_1e){if(!_1d){var _1f=[];for(var i=1;i<arguments.length;++i){_1f.push(arguments[i]);}_1c(_1f.length?_1f:["Assertion Failure"],"error");throw _1e?_1e:"Assertion Failure";}},dir:function(obj){var str=_20(obj);str=str.replace(/\n/g,"<br />");str=str.replace(/\t/g,"&nbsp;&nbsp;&nbsp;&nbsp;");_21([str],"dir");},dirxml:function(_22){var _23=[];_24(_22,_23);_21(_23,"dirxml");},group:function(){_21(arguments,"group",_25);},groupEnd:function(){_21(arguments,"",_26);},time:function(_27){_12[_27]=new Date().getTime();},timeEnd:function(_28){if(_28 in _12){var _29=(new Date()).getTime()-_12[_28];_1c([_28+":",_29+"ms"]);delete _12[_28];}},count:function(_2a){if(!_13[_2a]){_13[_2a]=0;}_13[_2a]++;_1c([_2a+": "+_13[_2a]]);},trace:function(_2b){var _2c=_2b||3;var f=console.trace.caller;for(var i=0;i<_2c;i++){var _2d=f.toString();var _2e=[];for(var a=0;a<f.arguments.length;a++){_2e.push(f.arguments[a]);}if(f.arguments.length){}else{}f=f.caller;}},profile:function(){this.warn(["profile() not supported."]);},profileEnd:function(){},clear:function(){if(_a){while(_a.childNodes.length){_1.destroy(_a.firstChild);}}_1.forEach(this._connects,_1.disconnect);},open:function(){_2f(true);},close:function(){if(_f){_2f();}},_restoreBorder:function(){if(_1a){_1a.style.border=_1b;}},openDomInspector:function(){_17=true;_a.style.display="none";_14.style.display="block";_b.style.display="none";document.body.style.cursor="pointer";_15=_1.connect(document,"mousemove",function(evt){if(!_17){return;}if(!_18){_18=setTimeout(function(){_18=null;},50);}else{return;}var _30=evt.target;if(_30&&(_1a!==_30)){var _31=true;console._restoreBorder();var _32=[];_24(_30,_32);_14.innerHTML=_32.join("");_1a=_30;_1b=_1a.style.border;_1a.style.border="#0000FF 1px solid";}});setTimeout(function(){_16=_1.connect(document,"click",function(evt){document.body.style.cursor="";_17=!_17;_1.disconnect(_16);});},30);},_closeDomInspector:function(){document.body.style.cursor="";_1.disconnect(_15);_1.disconnect(_16);_17=false;console._restoreBorder();},openConsole:function(){_a.style.display="block";_14.style.display="none";_b.style.display="none";console._closeDomInspector();},openObjectInspector:function(){_a.style.display="none";_14.style.display="none";_b.style.display="block";console._closeDomInspector();},recss:function(){var i,a,s;a=document.getElementsByTagName("link");for(i=0;i<a.length;i++){s=a[i];if(s.rel.toLowerCase().indexOf("stylesheet")>=0&&s.href){var h=s.href.replace(/(&|%5C?)forceReload=\d+/,"");s.href=h+(h.indexOf("?")>=0?"&":"?")+"forceReload="+new Date().valueOf();}}}};function _2f(_33){_f=_33||!_f;if(_9){_9.style.display=_f?"block":"none";}};function _34(){_2f(true);if(_d){_d.focus();}};function _35(x,y,w,h){var win=window.open("","_firebug","status=0,menubar=0,resizable=1,top="+y+",left="+x+",width="+w+",height="+h+",scrollbars=1,addressbar=0");if(!win){var msg="Firebug Lite could not open a pop-up window, most likely because of a blocker.\n"+"Either enable pop-ups for this domain, or change the djConfig to popup=false.";alert(msg);}_36(win);var _37=win.document;var _38="<html style=\"height:100%;\"><head><title>Firebug Lite</title></head>\n"+"<body bgColor=\"#ccc\" style=\"height:97%;\" onresize=\"opener.onFirebugResize()\">\n"+"<div id=\"fb\"></div>"+"</body></html>";_37.write(_38);_37.close();return win;};function _36(wn){var d=new Date();d.setTime(d.getTime()+(60*24*60*60*1000));d=d.toUTCString();var dc=wn.document,_39;if(wn.innerWidth){_39=function(){return {w:wn.innerWidth,h:wn.innerHeight};};}else{if(dc.documentElement&&dc.documentElement.clientWidth){_39=function(){return {w:dc.documentElement.clientWidth,h:dc.documentElement.clientHeight};};}else{if(dc.body){_39=function(){return {w:dc.body.clientWidth,h:dc.body.clientHeight};};}}}window.onFirebugResize=function(){_47(_39().h);clearInterval(wn._firebugWin_resize);wn._firebugWin_resize=setTimeout(function(){var x=wn.screenLeft,y=wn.screenTop,w=wn.outerWidth||wn.document.body.offsetWidth,h=wn.outerHeight||wn.document.body.offsetHeight;document.cookie="_firebugPosition="+[x,y,w,h].join(",")+"; expires="+d+"; path=/";},5000);};};function _3a(){if(_9){return;}_2f(true);if(_1.config.popup){var _3b="100%";var _3c=document.cookie.match(/(?:^|; )_firebugPosition=([^;]*)/);var p=_3c?_3c[1].split(","):[2,2,320,480];_7=_35(p[0],p[1],p[2],p[3]);_6=_7.document;_1.config.debugContainerId="fb";_7.console=window.console;_7.dojo=window.dojo;}else{_6=document;_3b=(_1.config.debugHeight||300)+"px";}var _3d=_6.createElement("link");_3d.href=_2.toUrl("./firebug.css");_3d.rel="stylesheet";_3d.type="text/css";var _3e=_6.getElementsByTagName("head");if(_3e){_3e=_3e[0];}if(!_3e){_3e=_6.getElementsByTagName("html")[0];}if(_1.isIE){window.setTimeout(function(){_3e.appendChild(_3d);},0);}else{_3e.appendChild(_3d);}if(_1.config.debugContainerId){_9=_6.getElementById(_1.config.debugContainerId);}if(!_9){_9=_6.createElement("div");_6.body.appendChild(_9);}_9.className+=" firebug";_9.style.height=_3b;_9.style.display=(_f?"block":"none");var _3f=function(_40,_41,_42,_43){return "<li class=\""+_43+"\"><a href=\"javascript:void(0);\" onclick=\"console."+_42+"(); return false;\" title=\""+_41+"\">"+_40+"</a></li>";};_9.innerHTML="<div id=\"firebugToolbar\">"+" <ul id=\"fireBugTabs\" class=\"tabs\">"+_3f("Clear","Remove All Console Logs","clear","")+_3f("ReCSS","Refresh CSS without reloading page","recss","")+_3f("Console","Show Console Logs","openConsole","gap")+_3f("DOM","Show DOM Inspector","openDomInspector","")+_3f("Object","Show Object Inspector","openObjectInspector","")+((_1.config.popup)?"":_3f("Close","Close the console","close","gap"))+"\t</ul>"+"</div>"+"<input type=\"text\" id=\"firebugCommandLine\" />"+"<div id=\"firebugLog\"></div>"+"<div id=\"objectLog\" style=\"display:none;\">Click on an object in the Log display</div>"+"<div id=\"domInspect\" style=\"display:none;\">Hover over HTML elements in the main page. Click to hold selection.</div>";_e=_6.getElementById("firebugToolbar");_d=_6.getElementById("firebugCommandLine");_44(_d,"keydown",_45);_44(_6,_1.isIE||_1.isSafari?"keydown":"keypress",_46);_a=_6.getElementById("firebugLog");_b=_6.getElementById("objectLog");_14=_6.getElementById("domInspect");_c=_6.getElementById("fireBugTabs");_47();_48();};_1.addOnLoad(_3a);function _49(){_6=null;if(_7.console){_7.console.clear();}_7=null;_9=null;_a=null;_b=null;_14=null;_d=null;_10=[];_11=[];_12={};};function _4a(){var _4b=_d.value;_d.value="";_21(["> ",_4b],"command");var _4c;try{_4c=eval(_4b);}catch(e){}};function _47(h){var _4d=25;var _4e=h?h-(_4d+_d.offsetHeight+25+(h*0.01))+"px":(_9.offsetHeight-_4d-_d.offsetHeight)+"px";_a.style.top=_4d+"px";_a.style.height=_4e;_b.style.height=_4e;_b.style.top=_4d+"px";_14.style.height=_4e;_14.style.top=_4d+"px";_d.style.bottom=0;_1.addOnWindowUnload(_49);};function _21(_4f,_50,_51){if(_a){_52(_4f,_50,_51);}else{_10.push([_4f,_50,_51]);}};function _48(){var _53=_10;_10=[];for(var i=0;i<_53.length;++i){_52(_53[i][0],_53[i][1],_53[i][2]);}};function _52(_54,_55,_56){var _57=_a.scrollTop+_a.offsetHeight>=_a.scrollHeight;_56=_56||_58;_56(_54,_55);if(_57){_a.scrollTop=_a.scrollHeight-_a.offsetHeight;}};function _59(row){var _5a=_11.length?_11[_11.length-1]:_a;_5a.appendChild(row);};function _58(_5b,_5c){var row=_a.ownerDocument.createElement("div");row.className="logRow"+(_5c?" logRow-"+_5c:"");row.innerHTML=_5b.join("");_59(row);};function _25(_5d,_5e){_1c(_5d,_5e);var _5f=_a.ownerDocument.createElement("div");_5f.className="logGroupBox";_59(_5f);_11.push(_5f);};function _26(){_11.pop();};function _1c(_60,_61){var _62=[];var _63=_60[0];var _64=0;if(typeof (_63)!="string"){_63="";_64=-1;}var _65=_66(_63);for(var i=0;i<_65.length;++i){var _67=_65[i];if(_67&&typeof _67=="object"){_67.appender(_60[++_64],_62);}else{_68(_67,_62);}}var ids=[];var obs=[];for(i=_64+1;i<_60.length;++i){_68(" ",_62);var _69=_60[i];if(_69===undefined||_69===null){_6a(_69,_62);}else{if(typeof (_69)=="string"){_68(_69,_62);}else{if(_69 instanceof Date){_68(_69.toString(),_62);}else{if(_69.nodeType==9){_68("[ XmlDoc ]",_62);}else{var id="_a"+_8++;ids.push(id);obs.push(_69);var str="<a id=\""+id+"\" href=\"javascript:void(0);\">"+_6b(_69)+"</a>";_6c(str,_62);}}}}}_21(_62,_61);for(i=0;i<ids.length;i++){var btn=_6.getElementById(ids[i]);if(!btn){continue;}btn.obj=obs[i];_7.console._connects.push(_1.connect(btn,"onclick",function(){console.openObjectInspector();try{_20(this.obj);}catch(e){this.obj=e;}_b.innerHTML="<pre>"+_20(this.obj)+"</pre>";}));}};function _66(_6d){var _6e=[];var reg=/((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/;var _6f={s:_68,d:_70,i:_70,f:_71};for(var m=reg.exec(_6d);m;m=reg.exec(_6d)){var _72=m[8]?m[8]:m[5];var _73=_72 in _6f?_6f[_72]:_74;var _75=m[3]?parseInt(m[3]):(m[4]=="."?-1:0);_6e.push(_6d.substr(0,m[0][0]=="%"?m.index:m.index+1));_6e.push({appender:_73,precision:_75});_6d=_6d.substr(m.index+m[0].length);}_6e.push(_6d);return _6e;};function _76(_77){function _78(ch){switch(ch){case "<":return "&lt;";case ">":return "&gt;";case "&":return "&amp;";case "'":return "&#39;";case "\"":return "&quot;";}return "?";};return String(_77).replace(/[<>&"']/g,_78);};function _79(_7a){try{return _7a+"";}catch(e){return null;}};function _6c(_7b,_7c){_7c.push(_79(_7b));};function _68(_7d,_7e){_7e.push(_76(_79(_7d)));};function _6a(_7f,_80){_80.push("<span class=\"objectBox-null\">",_76(_79(_7f)),"</span>");};function _81(_82,_83){_83.push("<span class=\"objectBox-string\">&quot;",_76(_79(_82)),"&quot;</span>");};function _70(_84,_85){_85.push("<span class=\"objectBox-number\">",_76(_79(_84)),"</span>");};function _71(_86,_87){_87.push("<span class=\"objectBox-number\">",_76(_79(_86)),"</span>");};function _88(_89,_8a){_8a.push("<span class=\"objectBox-function\">",_6b(_89),"</span>");};function _74(_8b,_8c){try{if(_8b===undefined){_6a("undefined",_8c);}else{if(_8b===null){_6a("null",_8c);}else{if(typeof _8b=="string"){_81(_8b,_8c);}else{if(typeof _8b=="number"){_70(_8b,_8c);}else{if(typeof _8b=="function"){_88(_8b,_8c);}else{if(_8b.nodeType==1){_8d(_8b,_8c);}else{if(typeof _8b=="object"){_8e(_8b,_8c);}else{_68(_8b,_8c);}}}}}}}}catch(e){}};function _8e(_8f,_90){var _91=_79(_8f);var _92=/\[object (.*?)\]/;var m=_92.exec(_91);_90.push("<span class=\"objectBox-object\">",m?m[1]:_91,"</span>");};function _8d(_93,_94){_94.push("<span class=\"objectBox-selector\">");_94.push("<span class=\"selectorTag\">",_76(_93.nodeName.toLowerCase()),"</span>");if(_93.id){_94.push("<span class=\"selectorId\">#",_76(_93.id),"</span>");}if(_93.className){_94.push("<span class=\"selectorClass\">.",_76(_93.className),"</span>");}_94.push("</span>");};function _24(_95,_96){if(_95.nodeType==1){_96.push("<div class=\"objectBox-element\">","&lt;<span class=\"nodeTag\">",_95.nodeName.toLowerCase(),"</span>");for(var i=0;i<_95.attributes.length;++i){var _97=_95.attributes[i];if(!_97.specified){continue;}_96.push("&nbsp;<span class=\"nodeName\">",_97.nodeName.toLowerCase(),"</span>=&quot;<span class=\"nodeValue\">",_76(_97.nodeValue),"</span>&quot;");}if(_95.firstChild){_96.push("&gt;</div><div class=\"nodeChildren\">");for(var _98=_95.firstChild;_98;_98=_98.nextSibling){_24(_98,_96);}_96.push("</div><div class=\"objectBox-element\">&lt;/<span class=\"nodeTag\">",_95.nodeName.toLowerCase(),"&gt;</span></div>");}else{_96.push("/&gt;</div>");}}else{if(_95.nodeType==3){_96.push("<div class=\"nodeText\">",_76(_95.nodeValue),"</div>");}}};function _44(_99,_9a,_9b){if(document.all){_99.attachEvent("on"+_9a,_9b);}else{_99.addEventListener(_9a,_9b,false);}};function _9c(_9d,_9e,_9f){if(document.all){_9d.detachEvent("on"+_9e,_9f);}else{_9d.removeEventListener(_9e,_9f,false);}};function _a0(_a1){if(document.all){_a1.cancelBubble=true;}else{_a1.stopPropagation();}};function _a2(msg,_a3,_a4){var _a5=_a3.lastIndexOf("/");var _a6=_a5==-1?_a3:_a3.substr(_a5+1);var _a7=["<span class=\"errorMessage\">",msg,"</span>","<div class=\"objectBox-sourceLink\">",_a6," (line ",_a4,")</div>"];_21(_a7,"error");};var _a8=new Date().getTime();function _46(_a9){var _aa=(new Date()).getTime();if(_aa>_a8+200){_a9=_1.fixEvent(_a9);var _ab=_1.keys;var ekc=_a9.keyCode;_a8=_aa;if(ekc==_ab.F12){_2f();}else{if((ekc==_ab.NUMPAD_ENTER||ekc==76)&&_a9.shiftKey&&(_a9.metaKey||_a9.ctrlKey)){_34();}else{return;}}_a0(_a9);}};function _45(e){var dk=_1.keys;if(e.keyCode==13&&_d.value){_ac(_d.value);_4a();}else{if(e.keyCode==27){_d.value="";}else{if(e.keyCode==dk.UP_ARROW||e.charCode==dk.UP_ARROW){_ad("older");}else{if(e.keyCode==dk.DOWN_ARROW||e.charCode==dk.DOWN_ARROW){_ad("newer");}else{if(e.keyCode==dk.HOME||e.charCode==dk.HOME){_ae=1;_ad("older");}else{if(e.keyCode==dk.END||e.charCode==dk.END){_ae=999999;_ad("newer");}}}}}}};var _ae=-1;var _af=null;function _ac(_b0){var _b1=_b2("firebug_history");_b1=(_b1)?_1.fromJson(_b1):[];var pos=_1.indexOf(_b1,_b0);if(pos!=-1){_b1.splice(pos,1);}_b1.push(_b0);_b2("firebug_history",_1.toJson(_b1),30);while(_b1.length&&!_b2("firebug_history")){_b1.shift();_b2("firebug_history",_1.toJson(_b1),30);}_af=null;_ae=-1;};function _ad(_b3){var _b4=_b2("firebug_history");_b4=(_b4)?_1.fromJson(_b4):[];if(!_b4.length){return;}if(_af===null){_af=_d.value;}if(_ae==-1){_ae=_b4.length;}if(_b3=="older"){--_ae;if(_ae<0){_ae=0;}}else{if(_b3=="newer"){++_ae;if(_ae>_b4.length){_ae=_b4.length;}}}if(_ae==_b4.length){_d.value=_af;_af=null;}else{_d.value=_b4[_ae];}};function _b2(_b5,_b6){var c=document.cookie;if(arguments.length==1){var _b7=c.match(new RegExp("(?:^|; )"+_b5+"=([^;]*)"));return _b7?decodeURIComponent(_b7[1]):undefined;}else{var d=new Date();d.setMonth(d.getMonth()+1);document.cookie=_b5+"="+encodeURIComponent(_b6)+((d.toUtcString)?"; expires="+d.toUTCString():"");}};function _b8(it){return it&&it instanceof Array||typeof it=="array";};function _b9(o){var cnt=0;for(var nm in o){cnt++;}return cnt;};function _20(o,i,txt,_ba){var ind=" \t";txt=txt||"";i=i||ind;_ba=_ba||[];var _bb;if(o&&o.nodeType==1){var _bc=[];_24(o,_bc);return _bc.join("");}var br=",\n",cnt=0,_bd=_b9(o);if(o instanceof Date){return i+o.toString()+br;}looking:for(var nm in o){cnt++;if(cnt==_bd){br="\n";}if(o[nm]===window||o[nm]===document){}else{if(o[nm]===null){txt+=i+nm+" : NULL"+br;}else{if(o[nm]&&o[nm].nodeType){if(o[nm].nodeType==1){}else{if(o[nm].nodeType==3){txt+=i+nm+" : [ TextNode "+o[nm].data+" ]"+br;}}}else{if(typeof o[nm]=="object"&&(o[nm] instanceof String||o[nm] instanceof Number||o[nm] instanceof Boolean)){txt+=i+nm+" : "+o[nm]+","+br;}else{if(o[nm] instanceof Date){txt+=i+nm+" : "+o[nm].toString()+br;}else{if(typeof (o[nm])=="object"&&o[nm]){for(var j=0,_be;_be=_ba[j];j++){if(o[nm]===_be){txt+=i+nm+" : RECURSION"+br;continue looking;}}_ba.push(o[nm]);_bb=(_b8(o[nm]))?["[","]"]:["{","}"];txt+=i+nm+" : "+_bb[0]+"\n";txt+=_20(o[nm],i+ind,"",_ba);txt+=i+_bb[1]+br;}else{if(typeof o[nm]=="undefined"){txt+=i+nm+" : undefined"+br;}else{if(nm=="toString"&&typeof o[nm]=="function"){var _bf=o[nm]();if(typeof _bf=="string"&&_bf.match(/function ?(.*?)\(/)){_bf=_76(_6b(o[nm]));}txt+=i+nm+" : "+_bf+br;}else{txt+=i+nm+" : "+_76(_6b(o[nm]))+br;}}}}}}}}}return txt;};function _6b(obj){var _c0=(obj instanceof Error);if(obj.nodeType==1){return _76("< "+obj.tagName.toLowerCase()+" id=\""+obj.id+"\" />");}if(obj.nodeType==3){return _76("[TextNode: \""+obj.nodeValue+"\"]");}var nm=(obj&&(obj.id||obj.name||obj.ObjectID||obj.widgetId));if(!_c0&&nm){return "{"+nm+"}";}var _c1=2;var _c2=4;var cnt=0;if(_c0){nm="[ Error: "+(obj.message||obj.description||obj)+" ]";}else{if(_b8(obj)){nm="["+obj.slice(0,_c2).join(",");if(obj.length>_c2){nm+=" ... ("+obj.length+" items)";}nm+="]";}else{if(typeof obj=="function"){nm=obj+"";var reg=/function\s*([^\(]*)(\([^\)]*\))[^\{]*\{/;var m=reg.exec(nm);if(m){if(!m[1]){m[1]="function";}nm=m[1]+m[2];}else{nm="function()";}}else{if(typeof obj!="object"||typeof obj=="string"){nm=obj+"";}else{nm="{";for(var i in obj){cnt++;if(cnt>_c1){break;}nm+=i+":"+_76(obj[i])+" ";}nm+="}";}}}}return nm;};_44(document,_1.isIE||_1.isSafari?"keydown":"keypress",_46);if((document.documentElement.getAttribute("debug")=="true")||(_1.config.isDebug)){_2f(true);}_1.addOnWindowUnload(function(){_9c(document,_1.isIE||_1.isSafari?"keydown":"keypress",_46);window.onFirebugResize=null;window.console=null;});}); \ No newline at end of file
diff --git a/lib/dojo/_firebug/firebug.js.uncompressed.js b/lib/dojo/_firebug/firebug.js.uncompressed.js
new file mode 100644
index 000000000..d908c59ed
--- /dev/null
+++ b/lib/dojo/_firebug/firebug.js.uncompressed.js
@@ -0,0 +1,1183 @@
+define("dojo/_firebug/firebug", ["../_base/kernel", "require", "../_base/html", "../_base/sniff", "../_base/array", "../_base/lang", "../_base/event", "../_base/unload"], function(dojo, require) {
+ // module:
+ // dojo/_firebug/firebug
+ // summary:
+
+// FIREBUG LITE
+ // summary: Firebug Lite, the baby brother to Joe Hewitt's Firebug for Mozilla Firefox
+ // description:
+ // Opens a console for logging, debugging, and error messages.
+ // Contains partial functionality to Firebug. See function list below.
+ // NOTE:
+ // Firebug is a Firefox extension created by Joe Hewitt (see license). You do not need Dojo to run Firebug.
+ // Firebug Lite is included in Dojo by permission from Joe Hewitt
+ // If you are new to Firebug, or used to the Dojo 0.4 dojo.debug, you can learn Firebug
+ // functionality by reading the function comments below or visiting http://www.getfirebug.com/docs.html
+ // NOTE:
+ // To test Firebug Lite in Firefox:
+ // FF2: set "console = null" before loading dojo and set djConfig.isDebug=true
+ // FF3: disable Firebug and set djConfig.isDebug=true
+ //
+ // example:
+ // Supports inline objects in object inspector window (only simple trace of dom nodes, however)
+ // | console.log("my object", {foo:"bar"})
+ // example:
+ // Option for console to open in popup window
+ // | var djConfig = {isDebug: true, popup:true };
+ // example:
+ // Option for console height (ignored for popup)
+ // | var djConfig = {isDebug: true, debugHeight:100 }
+
+
+ var isNewIE = (/Trident/.test(window.navigator.userAgent));
+ if(isNewIE){
+ // Fixing IE's console
+ // IE doesn't insert space between arguments. How annoying.
+ var calls = ["log", "info", "debug", "warn", "error"];
+ for(var i=0;i<calls.length;i++){
+ var m = calls[i];
+ if(!console[m] ||console[m]._fake){
+ // IE9 doesn't have console.debug method, a fake one is added later
+ continue;
+ }
+ var n = "_"+calls[i];
+ console[n] = console[m];
+ console[m] = (function(){
+ var type = n;
+ return function(){
+ console[type](Array.prototype.join.call(arguments, " "));
+ };
+ })();
+ }
+ // clear the console on load. This is more than a convenience - too many logs crashes it.
+ // If closed it throws an error
+ try{ console.clear(); }catch(e){}
+ }
+
+ if(
+ dojo.isFF || // Firefox has Firebug
+ dojo.isChrome || // Chrome 3+ has a console
+ dojo.isSafari || // Safari 4 has a console
+ isNewIE || // Has the new IE console
+ window.firebug || // Testing for mozilla firebug lite
+ (typeof console != "undefined" && console.firebug) || //The firebug console
+ dojo.config.useCustomLogger || // Allow custom loggers
+ dojo.isAIR // isDebug triggers AIRInsector, not Firebug
+ ){
+ return;
+ }
+
+ // don't build firebug in iframes
+ try{
+ if(window != window.parent){
+ // but if we've got a parent logger, connect to it
+ if(window.parent["console"]){
+ window.console = window.parent.console;
+ }
+ return;
+ }
+ }catch(e){/*squelch*/}
+
+ // ***************************************************************************
+ // Placing these variables before the functions that use them to avoid a
+ // shrinksafe bug where variable renaming does not happen correctly otherwise.
+
+ // most of the objects in this script are run anonomously
+ var _firebugDoc = document;
+ var _firebugWin = window;
+ var __consoleAnchorId__ = 0;
+
+ var consoleFrame = null;
+ var consoleBody = null;
+ var consoleObjectInspector = null;
+ var fireBugTabs = null;
+ var commandLine = null;
+ var consoleToolbar = null;
+
+ var frameVisible = false;
+ var messageQueue = [];
+ var groupStack = [];
+ var timeMap = {};
+ var countMap = {};
+
+ var consoleDomInspector = null;
+ var _inspectionMoveConnection;
+ var _inspectionClickConnection;
+ var _inspectionEnabled = false;
+ var _inspectionTimer = null;
+ var _inspectTempNode = document.createElement("div");
+
+
+ var _inspectCurrentNode;
+ var _restoreBorderStyle;
+
+ // ***************************************************************************
+
+ window.console = {
+ _connects: [],
+ log: function(){
+ // summary:
+ // Sends arguments to console.
+ logFormatted(arguments, "");
+ },
+
+ debug: function(){
+ // summary:
+ // Sends arguments to console. Missing finctionality to show script line of trace.
+ logFormatted(arguments, "debug");
+ },
+
+ info: function(){
+ // summary:
+ // Sends arguments to console, highlighted with (I) icon.
+ logFormatted(arguments, "info");
+ },
+
+ warn: function(){
+ // summary:
+ // Sends warning arguments to console, highlighted with (!) icon and blue style.
+ logFormatted(arguments, "warning");
+ },
+
+ error: function(){
+ // summary:
+ // Sends error arguments (object) to console, highlighted with (X) icon and yellow style
+ // NEW: error object now displays in object inspector
+ logFormatted(arguments, "error");
+ },
+
+ assert: function(truth, message){
+ // summary:
+ // Tests for true. Throws exception if false.
+ if(!truth){
+ var args = [];
+ for(var i = 1; i < arguments.length; ++i){
+ args.push(arguments[i]);
+ }
+
+ logFormatted(args.length ? args : ["Assertion Failure"], "error");
+ throw message ? message : "Assertion Failure";
+ }
+ },
+
+ dir: function(obj){
+ var str = printObject( obj );
+ str = str.replace(/\n/g, "<br />");
+ str = str.replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;");
+ logRow([str], "dir");
+ },
+
+ dirxml: function(node){
+ // summary:
+ //
+ var html = [];
+ appendNode(node, html);
+ logRow(html, "dirxml");
+ },
+
+ group: function(){
+ // summary:
+ // collects log messages into a group, starting with this call and ending with
+ // groupEnd(). Missing collapse functionality
+ logRow(arguments, "group", pushGroup);
+ },
+
+ groupEnd: function(){
+ // summary:
+ // Closes group. See above
+ logRow(arguments, "", popGroup);
+ },
+
+ time: function(name){
+ // summary:
+ // Starts timers assigned to name given in argument. Timer stops and displays on timeEnd(title);
+ // example:
+ // | console.time("load");
+ // | console.time("myFunction");
+ // | console.timeEnd("load");
+ // | console.timeEnd("myFunction");
+ timeMap[name] = new Date().getTime();
+ },
+
+ timeEnd: function(name){
+ // summary:
+ // See above.
+ if(name in timeMap){
+ var delta = (new Date()).getTime() - timeMap[name];
+ logFormatted([name+ ":", delta+"ms"]);
+ delete timeMap[name];
+ }
+ },
+
+ count: function(name){
+ // summary:
+ // Not supported
+ if(!countMap[name]) countMap[name] = 0;
+ countMap[name]++;
+ logFormatted([name+": "+countMap[name]]);
+ },
+
+ trace: function(_value){
+ var stackAmt = _value || 3;
+ var f = console.trace.caller; //function that called trace
+ console.log(">>> console.trace(stack)");
+ for(var i=0;i<stackAmt;i++){
+ var func = f.toString();
+ var args=[];
+ for (var a = 0; a < f.arguments.length; a++) {
+ args.push(f.arguments[a]);
+ }
+ if(f.arguments.length){
+ console.dir({"function":func, "arguments":args});
+ }else{
+ console.dir({"function":func});
+ }
+
+ f = f.caller;
+ }
+ },
+
+ profile: function(){
+ // summary:
+ // Not supported
+ this.warn(["profile() not supported."]);
+ },
+
+ profileEnd: function(){ },
+
+ clear: function(){
+ // summary:
+ // Clears message console. Do not call this directly
+ if(consoleBody){
+ while(consoleBody.childNodes.length){
+ dojo.destroy(consoleBody.firstChild);
+ }
+ }
+ dojo.forEach(this._connects,dojo.disconnect);
+ },
+
+ open: function(){
+ // summary:
+ // Opens message console. Do not call this directly
+ toggleConsole(true);
+ },
+
+ close: function(){
+ // summary:
+ // Closes message console. Do not call this directly
+ if(frameVisible){
+ toggleConsole();
+ }
+ },
+ _restoreBorder: function(){
+ if(_inspectCurrentNode){
+ _inspectCurrentNode.style.border = _restoreBorderStyle;
+ }
+ },
+ openDomInspector: function(){
+ _inspectionEnabled = true;
+ consoleBody.style.display = "none";
+ consoleDomInspector.style.display = "block";
+ consoleObjectInspector.style.display = "none";
+ document.body.style.cursor = "pointer";
+ _inspectionMoveConnection = dojo.connect(document, "mousemove", function(evt){
+ if(!_inspectionEnabled){ return; }
+ if(!_inspectionTimer){
+ _inspectionTimer = setTimeout(function(){ _inspectionTimer = null; }, 50);
+ }else{
+ return;
+ }
+ var node = evt.target;
+ if(node && (_inspectCurrentNode !== node)){
+ var parent = true;
+
+ console._restoreBorder();
+ var html = [];
+ appendNode(node, html);
+ consoleDomInspector.innerHTML = html.join("");
+
+ _inspectCurrentNode = node;
+ _restoreBorderStyle = _inspectCurrentNode.style.border;
+ _inspectCurrentNode.style.border = "#0000FF 1px solid";
+ }
+ });
+ setTimeout(function(){
+ _inspectionClickConnection = dojo.connect(document, "click", function(evt){
+ document.body.style.cursor = "";
+ _inspectionEnabled = !_inspectionEnabled;
+ dojo.disconnect(_inspectionClickConnection);
+ // console._restoreBorder();
+ });
+ }, 30);
+ },
+ _closeDomInspector: function(){
+ document.body.style.cursor = "";
+ dojo.disconnect(_inspectionMoveConnection);
+ dojo.disconnect(_inspectionClickConnection);
+ _inspectionEnabled = false;
+ console._restoreBorder();
+ },
+ openConsole:function(){
+ // summary:
+ // Closes object inspector and opens message console. Do not call this directly
+ consoleBody.style.display = "block";
+ consoleDomInspector.style.display = "none";
+ consoleObjectInspector.style.display = "none";
+ console._closeDomInspector();
+ },
+ openObjectInspector:function(){
+ consoleBody.style.display = "none";
+ consoleDomInspector.style.display = "none";
+ consoleObjectInspector.style.display = "block";
+ console._closeDomInspector();
+ },
+ recss: function(){
+ // http://turtle.dojotoolkit.org/~david/recss.html
+ // this is placed in dojo since the console is most likely
+ // in another window and dojo is easilly accessible
+ var i,a,s;a=document.getElementsByTagName('link');
+ for(i=0;i<a.length;i++){
+ s=a[i];
+ if(s.rel.toLowerCase().indexOf('stylesheet')>=0&&s.href) {
+ var h=s.href.replace(/(&|%5C?)forceReload=\d+/,'');
+ s.href=h+(h.indexOf('?')>=0?'&':'?')+'forceReload='+new Date().valueOf();
+ }
+ }
+ }
+ };
+
+ // ***************************************************************************
+
+ function toggleConsole(forceOpen){
+ frameVisible = forceOpen || !frameVisible;
+ if(consoleFrame){
+ consoleFrame.style.display = frameVisible ? "block" : "none";
+ }
+ }
+
+ function focusCommandLine(){
+ toggleConsole(true);
+ if(commandLine){
+ commandLine.focus();
+ }
+ }
+
+ function openWin(x,y,w,h){
+ var win = window.open("","_firebug","status=0,menubar=0,resizable=1,top="+y+",left="+x+",width="+w+",height="+h+",scrollbars=1,addressbar=0");
+ if(!win){
+ var msg = "Firebug Lite could not open a pop-up window, most likely because of a blocker.\n" +
+ "Either enable pop-ups for this domain, or change the djConfig to popup=false.";
+ alert(msg);
+ }
+ createResizeHandler(win);
+ var newDoc=win.document;
+ //Safari needs an HTML height
+ var HTMLstring= '<html style="height:100%;"><head><title>Firebug Lite</title></head>\n' +
+ '<body bgColor="#ccc" style="height:97%;" onresize="opener.onFirebugResize()">\n' +
+ '<div id="fb"></div>' +
+ '</body></html>';
+
+ newDoc.write(HTMLstring);
+ newDoc.close();
+ return win;
+ }
+
+ function createResizeHandler(wn){
+ // summary:
+ // Creates handle for onresize window. Called from script in popup's body tag (so that it will work with IE).
+ //
+
+ var d = new Date();
+ d.setTime(d.getTime()+(60*24*60*60*1000)); // 60 days
+ d = d.toUTCString();
+
+ var dc = wn.document,
+ getViewport;
+
+ if (wn.innerWidth){
+ getViewport = function(){
+ return{w:wn.innerWidth, h:wn.innerHeight};
+ };
+ }else if (dc.documentElement && dc.documentElement.clientWidth){
+ getViewport = function(){
+ return{w:dc.documentElement.clientWidth, h:dc.documentElement.clientHeight};
+ };
+ }else if (dc.body){
+ getViewport = function(){
+ return{w:dc.body.clientWidth, h:dc.body.clientHeight};
+ };
+ }
+
+
+ window.onFirebugResize = function(){
+
+ //resize the height of the console log body
+ layout(getViewport().h);
+
+ clearInterval(wn._firebugWin_resize);
+ wn._firebugWin_resize = setTimeout(function(){
+ var x = wn.screenLeft,
+ y = wn.screenTop,
+ w = wn.outerWidth || wn.document.body.offsetWidth,
+ h = wn.outerHeight || wn.document.body.offsetHeight;
+
+ document.cookie = "_firebugPosition=" + [x,y,w,h].join(",") + "; expires="+d+"; path=/";
+
+ }, 5000); //can't capture window.onMove - long timeout gives better chance of capturing a resize, then the move
+
+ };
+ }
+
+
+ /*****************************************************************************/
+
+
+ function createFrame(){
+ if(consoleFrame){
+ return;
+ }
+ toggleConsole(true);
+ if(dojo.config.popup){
+ var containerHeight = "100%";
+ var cookieMatch = document.cookie.match(/(?:^|; )_firebugPosition=([^;]*)/);
+ var p = cookieMatch ? cookieMatch[1].split(",") : [2,2,320,480];
+
+ _firebugWin = openWin(p[0],p[1],p[2],p[3]); // global
+ _firebugDoc = _firebugWin.document; // global
+
+ dojo.config.debugContainerId = 'fb';
+
+ // connecting popup
+ _firebugWin.console = window.console;
+ _firebugWin.dojo = window.dojo;
+ }else{
+ _firebugDoc = document;
+ containerHeight = (dojo.config.debugHeight || 300) + "px";
+ }
+
+ var styleElement = _firebugDoc.createElement("link");
+ styleElement.href = require.toUrl("./firebug.css");
+ styleElement.rel = "stylesheet";
+ styleElement.type = "text/css";
+ var styleParent = _firebugDoc.getElementsByTagName("head");
+ if(styleParent){
+ styleParent = styleParent[0];
+ }
+ if(!styleParent){
+ styleParent = _firebugDoc.getElementsByTagName("html")[0];
+ }
+ if(dojo.isIE){
+ window.setTimeout(function(){ styleParent.appendChild(styleElement); }, 0);
+ }else{
+ styleParent.appendChild(styleElement);
+ }
+
+ if(dojo.config.debugContainerId){
+ consoleFrame = _firebugDoc.getElementById(dojo.config.debugContainerId);
+ }
+ if(!consoleFrame){
+ consoleFrame = _firebugDoc.createElement("div");
+ _firebugDoc.body.appendChild(consoleFrame);
+ }
+ consoleFrame.className += " firebug";
+ consoleFrame.style.height = containerHeight;
+ consoleFrame.style.display = (frameVisible ? "block" : "none");
+
+ var buildLink = function(label, title, method, _class){
+ return '<li class="'+_class+'"><a href="javascript:void(0);" onclick="console.'+ method +'(); return false;" title="'+title+'">'+label+'</a></li>';
+ };
+ consoleFrame.innerHTML =
+ '<div id="firebugToolbar">'
+ + ' <ul id="fireBugTabs" class="tabs">'
+
+ + buildLink("Clear", "Remove All Console Logs", "clear", "")
+ + buildLink("ReCSS", "Refresh CSS without reloading page", "recss", "")
+
+ + buildLink("Console", "Show Console Logs", "openConsole", "gap")
+ + buildLink("DOM", "Show DOM Inspector", "openDomInspector", "")
+ + buildLink("Object", "Show Object Inspector", "openObjectInspector", "")
+ + ((dojo.config.popup) ? "" : buildLink("Close", "Close the console", "close", "gap"))
+
+ + ' </ul>'
+ + '</div>'
+ + '<input type="text" id="firebugCommandLine" />'
+ + '<div id="firebugLog"></div>'
+ + '<div id="objectLog" style="display:none;">Click on an object in the Log display</div>'
+ + '<div id="domInspect" style="display:none;">Hover over HTML elements in the main page. Click to hold selection.</div>';
+
+
+ consoleToolbar = _firebugDoc.getElementById("firebugToolbar");
+
+ commandLine = _firebugDoc.getElementById("firebugCommandLine");
+ addEvent(commandLine, "keydown", onCommandLineKeyDown);
+
+ addEvent(_firebugDoc, dojo.isIE || dojo.isSafari ? "keydown" : "keypress", onKeyDown);
+
+ consoleBody = _firebugDoc.getElementById("firebugLog");
+ consoleObjectInspector = _firebugDoc.getElementById("objectLog");
+ consoleDomInspector = _firebugDoc.getElementById("domInspect");
+ fireBugTabs = _firebugDoc.getElementById("fireBugTabs");
+ layout();
+ flush();
+ }
+
+ dojo.addOnLoad(createFrame);
+
+ function clearFrame(){
+ _firebugDoc = null;
+
+ if(_firebugWin.console){
+ _firebugWin.console.clear();
+ }
+ _firebugWin = null;
+ consoleFrame = null;
+ consoleBody = null;
+ consoleObjectInspector = null;
+ consoleDomInspector = null;
+ commandLine = null;
+ messageQueue = [];
+ groupStack = [];
+ timeMap = {};
+ }
+
+
+ function evalCommandLine(){
+ var text = commandLine.value;
+ commandLine.value = "";
+
+ logRow(["> ", text], "command");
+
+ var value;
+ try{
+ value = eval(text);
+ }catch(e){
+ console.debug(e); // put exception on the console
+ }
+
+ console.log(value);
+ }
+
+ function layout(h){
+ var tHeight = 25; //consoleToolbar.offsetHeight; // tab style not ready on load - throws off layout
+ var height = h ?
+ h - (tHeight + commandLine.offsetHeight +25 + (h*.01)) + "px" :
+ (consoleFrame.offsetHeight - tHeight - commandLine.offsetHeight) + "px";
+
+ consoleBody.style.top = tHeight + "px";
+ consoleBody.style.height = height;
+ consoleObjectInspector.style.height = height;
+ consoleObjectInspector.style.top = tHeight + "px";
+ consoleDomInspector.style.height = height;
+ consoleDomInspector.style.top = tHeight + "px";
+ commandLine.style.bottom = 0;
+
+ dojo.addOnWindowUnload(clearFrame);
+ }
+
+ function logRow(message, className, handler){
+ if(consoleBody){
+ writeMessage(message, className, handler);
+ }else{
+ messageQueue.push([message, className, handler]);
+ }
+ }
+
+ function flush(){
+ var queue = messageQueue;
+ messageQueue = [];
+
+ for(var i = 0; i < queue.length; ++i){
+ writeMessage(queue[i][0], queue[i][1], queue[i][2]);
+ }
+ }
+
+ function writeMessage(message, className, handler){
+ var isScrolledToBottom =
+ consoleBody.scrollTop + consoleBody.offsetHeight >= consoleBody.scrollHeight;
+
+ handler = handler||writeRow;
+
+ handler(message, className);
+
+ if(isScrolledToBottom){
+ consoleBody.scrollTop = consoleBody.scrollHeight - consoleBody.offsetHeight;
+ }
+ }
+
+ function appendRow(row){
+ var container = groupStack.length ? groupStack[groupStack.length-1] : consoleBody;
+ container.appendChild(row);
+ }
+
+ function writeRow(message, className){
+ var row = consoleBody.ownerDocument.createElement("div");
+ row.className = "logRow" + (className ? " logRow-"+className : "");
+ row.innerHTML = message.join("");
+ appendRow(row);
+ }
+
+ function pushGroup(message, className){
+ logFormatted(message, className);
+
+ //var groupRow = consoleBody.ownerDocument.createElement("div");
+ //groupRow.className = "logGroup";
+ var groupRowBox = consoleBody.ownerDocument.createElement("div");
+ groupRowBox.className = "logGroupBox";
+ //groupRow.appendChild(groupRowBox);
+ appendRow(groupRowBox);
+ groupStack.push(groupRowBox);
+ }
+
+ function popGroup(){
+ groupStack.pop();
+ }
+
+ // ***************************************************************************
+
+ function logFormatted(objects, className){
+ var html = [];
+
+ var format = objects[0];
+ var objIndex = 0;
+
+ if(typeof(format) != "string"){
+ format = "";
+ objIndex = -1;
+ }
+
+ var parts = parseFormat(format);
+
+ for(var i = 0; i < parts.length; ++i){
+ var part = parts[i];
+ if(part && typeof part == "object"){
+ part.appender(objects[++objIndex], html);
+ }else{
+ appendText(part, html);
+ }
+ }
+
+
+ var ids = [];
+ var obs = [];
+ for(i = objIndex+1; i < objects.length; ++i){
+ appendText(" ", html);
+
+ var object = objects[i];
+ if(object === undefined || object === null ){
+ appendNull(object, html);
+
+ }else if(typeof(object) == "string"){
+ appendText(object, html);
+
+ }else if(object instanceof Date){
+ appendText(object.toString(), html);
+
+ }else if(object.nodeType == 9){
+ appendText("[ XmlDoc ]", html);
+
+ }else{
+ // Create link for object inspector
+ // need to create an ID for this link, since it is currently text
+ var id = "_a" + __consoleAnchorId__++;
+ ids.push(id);
+ // need to save the object, so the arrays line up
+ obs.push(object);
+ var str = '<a id="'+id+'" href="javascript:void(0);">'+getObjectAbbr(object)+'</a>';
+
+ appendLink( str , html);
+ }
+ }
+
+ logRow(html, className);
+
+ // Now that the row is inserted in the DOM, loop through all of the links that were just created
+ for(i=0; i<ids.length; i++){
+ var btn = _firebugDoc.getElementById(ids[i]);
+ if(!btn){ continue; }
+
+ // store the object in the dom btn for reference later
+ // avoid parsing these objects unless necessary
+ btn.obj = obs[i];
+
+ _firebugWin.console._connects.push(dojo.connect(btn, "onclick", function(){
+
+ console.openObjectInspector();
+
+ try{
+ printObject(this.obj);
+ }catch(e){
+ this.obj = e;
+ }
+ consoleObjectInspector.innerHTML = "<pre>" + printObject( this.obj ) + "</pre>";
+ }));
+ }
+ }
+
+ function parseFormat(format){
+ var parts = [];
+
+ var reg = /((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/;
+ var appenderMap = {s: appendText, d: appendInteger, i: appendInteger, f: appendFloat};
+
+ for(var m = reg.exec(format); m; m = reg.exec(format)){
+ var type = m[8] ? m[8] : m[5];
+ var appender = type in appenderMap ? appenderMap[type] : appendObject;
+ var precision = m[3] ? parseInt(m[3]) : (m[4] == "." ? -1 : 0);
+
+ parts.push(format.substr(0, m[0][0] == "%" ? m.index : m.index+1));
+ parts.push({appender: appender, precision: precision});
+
+ format = format.substr(m.index+m[0].length);
+ }
+
+ parts.push(format);
+
+ return parts;
+ }
+
+ function escapeHTML(value){
+ function replaceChars(ch){
+ switch(ch){
+ case "<":
+ return "&lt;";
+ case ">":
+ return "&gt;";
+ case "&":
+ return "&amp;";
+ case "'":
+ return "&#39;";
+ case '"':
+ return "&quot;";
+ }
+ return "?";
+ }
+ return String(value).replace(/[<>&"']/g, replaceChars);
+ }
+
+ function objectToString(object){
+ try{
+ return object+"";
+ }catch(e){
+ return null;
+ }
+ }
+
+ // ***************************************************************************
+ function appendLink(object, html){
+ // needed for object links - no HTML escaping
+ html.push( objectToString(object) );
+ }
+
+ function appendText(object, html){
+ html.push(escapeHTML(objectToString(object)));
+ }
+
+ function appendNull(object, html){
+ html.push('<span class="objectBox-null">', escapeHTML(objectToString(object)), '</span>');
+ }
+
+ function appendString(object, html){
+ html.push('<span class="objectBox-string">&quot;', escapeHTML(objectToString(object)),
+ '&quot;</span>');
+ }
+
+ function appendInteger(object, html){
+ html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
+ }
+
+ function appendFloat(object, html){
+ html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
+ }
+
+ function appendFunction(object, html){
+ html.push('<span class="objectBox-function">', getObjectAbbr(object), '</span>');
+ }
+
+ function appendObject(object, html){
+ try{
+ if(object === undefined){
+ appendNull("undefined", html);
+ }else if(object === null){
+ appendNull("null", html);
+ }else if(typeof object == "string"){
+ appendString(object, html);
+ }else if(typeof object == "number"){
+ appendInteger(object, html);
+ }else if(typeof object == "function"){
+ appendFunction(object, html);
+ }else if(object.nodeType == 1){
+ appendSelector(object, html);
+ }else if(typeof object == "object"){
+ appendObjectFormatted(object, html);
+ }else{
+ appendText(object, html);
+ }
+ }catch(e){
+ /* squelch */
+ }
+ }
+
+ function appendObjectFormatted(object, html){
+ var text = objectToString(object);
+ var reObject = /\[object (.*?)\]/;
+
+ var m = reObject.exec(text);
+ html.push('<span class="objectBox-object">', m ? m[1] : text, '</span>');
+ }
+
+ function appendSelector(object, html){
+ html.push('<span class="objectBox-selector">');
+
+ html.push('<span class="selectorTag">', escapeHTML(object.nodeName.toLowerCase()), '</span>');
+ if(object.id){
+ html.push('<span class="selectorId">#', escapeHTML(object.id), '</span>');
+ }
+ if(object.className){
+ html.push('<span class="selectorClass">.', escapeHTML(object.className), '</span>');
+ }
+
+ html.push('</span>');
+ }
+
+ function appendNode(node, html){
+ if(node.nodeType == 1){
+ html.push(
+ '<div class="objectBox-element">',
+ '&lt;<span class="nodeTag">', node.nodeName.toLowerCase(), '</span>');
+
+ for(var i = 0; i < node.attributes.length; ++i){
+ var attr = node.attributes[i];
+ if(!attr.specified){ continue; }
+
+ html.push('&nbsp;<span class="nodeName">', attr.nodeName.toLowerCase(),
+ '</span>=&quot;<span class="nodeValue">', escapeHTML(attr.nodeValue),
+ '</span>&quot;');
+ }
+
+ if(node.firstChild){
+ html.push('&gt;</div><div class="nodeChildren">');
+
+ for(var child = node.firstChild; child; child = child.nextSibling){
+ appendNode(child, html);
+ }
+
+ html.push('</div><div class="objectBox-element">&lt;/<span class="nodeTag">',
+ node.nodeName.toLowerCase(), '&gt;</span></div>');
+ }else{
+ html.push('/&gt;</div>');
+ }
+ }else if (node.nodeType == 3){
+ html.push('<div class="nodeText">', escapeHTML(node.nodeValue),
+ '</div>');
+ }
+ }
+
+ // ***************************************************************************
+
+ function addEvent(object, name, handler){
+ if(document.all){
+ object.attachEvent("on"+name, handler);
+ }else{
+ object.addEventListener(name, handler, false);
+ }
+ }
+
+ function removeEvent(object, name, handler){
+ if(document.all){
+ object.detachEvent("on"+name, handler);
+ }else{
+ object.removeEventListener(name, handler, false);
+ }
+ }
+
+ function cancelEvent(event){
+ if(document.all){
+ event.cancelBubble = true;
+ }else{
+ event.stopPropagation();
+ }
+ }
+
+ function onError(msg, href, lineNo){
+ var lastSlash = href.lastIndexOf("/");
+ var fileName = lastSlash == -1 ? href : href.substr(lastSlash+1);
+
+ var html = [
+ '<span class="errorMessage">', msg, '</span>',
+ '<div class="objectBox-sourceLink">', fileName, ' (line ', lineNo, ')</div>'
+ ];
+
+ logRow(html, "error");
+ }
+
+
+ //After converting to div instead of iframe, now getting two keydowns right away in IE 6.
+ //Make sure there is a little bit of delay.
+ var onKeyDownTime = new Date().getTime();
+
+ function onKeyDown(event){
+ var timestamp = (new Date()).getTime();
+ if(timestamp > onKeyDownTime + 200){
+ event = dojo.fixEvent(event);
+ var keys = dojo.keys;
+ var ekc = event.keyCode;
+ onKeyDownTime = timestamp;
+ if(ekc == keys.F12){
+ toggleConsole();
+ }else if(
+ (ekc == keys.NUMPAD_ENTER || ekc == 76) &&
+ event.shiftKey &&
+ (event.metaKey || event.ctrlKey)
+ ){
+ focusCommandLine();
+ }else{
+ return;
+ }
+ cancelEvent(event);
+ }
+ }
+
+ function onCommandLineKeyDown(e){
+ var dk = dojo.keys;
+ if(e.keyCode == 13 && commandLine.value){
+ addToHistory(commandLine.value);
+ evalCommandLine();
+ }else if(e.keyCode == 27){
+ commandLine.value = "";
+ }else if(e.keyCode == dk.UP_ARROW || e.charCode == dk.UP_ARROW){
+ navigateHistory("older");
+ }else if(e.keyCode == dk.DOWN_ARROW || e.charCode == dk.DOWN_ARROW){
+ navigateHistory("newer");
+ }else if(e.keyCode == dk.HOME || e.charCode == dk.HOME){
+ historyPosition = 1;
+ navigateHistory("older");
+ }else if(e.keyCode == dk.END || e.charCode == dk.END){
+ historyPosition = 999999;
+ navigateHistory("newer");
+ }
+ }
+
+ var historyPosition = -1;
+ var historyCommandLine = null;
+
+ function addToHistory(value){
+ var history = cookie("firebug_history");
+ history = (history) ? dojo.fromJson(history) : [];
+ var pos = dojo.indexOf(history, value);
+ if (pos != -1){
+ history.splice(pos, 1);
+ }
+ history.push(value);
+ cookie("firebug_history", dojo.toJson(history), 30);
+ while(history.length && !cookie("firebug_history")){
+ history.shift();
+ cookie("firebug_history", dojo.toJson(history), 30);
+ }
+ historyCommandLine = null;
+ historyPosition = -1;
+ }
+
+ function navigateHistory(direction){
+ var history = cookie("firebug_history");
+ history = (history) ? dojo.fromJson(history) : [];
+ if(!history.length){
+ return;
+ }
+
+ if(historyCommandLine === null){
+ historyCommandLine = commandLine.value;
+ }
+
+ if(historyPosition == -1){
+ historyPosition = history.length;
+ }
+
+ if(direction == "older"){
+ --historyPosition;
+ if(historyPosition < 0){
+ historyPosition = 0;
+ }
+ }else if(direction == "newer"){
+ ++historyPosition;
+ if(historyPosition > history.length){
+ historyPosition = history.length;
+ }
+ }
+
+ if(historyPosition == history.length){
+ commandLine.value = historyCommandLine;
+ historyCommandLine = null;
+ }else{
+ commandLine.value = history[historyPosition];
+ }
+ }
+
+ function cookie(name, value){
+ var c = document.cookie;
+ if(arguments.length == 1){
+ var matches = c.match(new RegExp("(?:^|; )" + name + "=([^;]*)"));
+ return matches ? decodeURIComponent(matches[1]) : undefined; // String or undefined
+ }else{
+ var d = new Date();
+ d.setMonth(d.getMonth()+1);
+ document.cookie = name + "=" + encodeURIComponent(value) + ((d.toUtcString) ? "; expires=" + d.toUTCString() : "");
+ }
+ }
+
+ function isArray(it){
+ return it && it instanceof Array || typeof it == "array";
+ }
+
+ //***************************************************************************************************
+ // Print Object Helpers
+ function objectLength(o){
+ var cnt = 0;
+ for(var nm in o){
+ cnt++;
+ }
+ return cnt;
+ }
+
+ function printObject(o, i, txt, used){
+ // Recursively trace object, indenting to represent depth for display in object inspector
+ var ind = " \t";
+ txt = txt || "";
+ i = i || ind;
+ used = used || [];
+ var opnCls;
+
+ if(o && o.nodeType == 1){
+ var html = [];
+ appendNode(o, html);
+ return html.join("");
+ }
+
+ var br=",\n", cnt = 0, length = objectLength(o);
+
+ if(o instanceof Date){
+ return i + o.toString() + br;
+ }
+ looking:
+ for(var nm in o){
+ cnt++;
+ if(cnt==length){br = "\n";}
+ if(o[nm] === window || o[nm] === document){
+ // do nothing
+ }else if(o[nm] === null){
+ txt += i+nm + " : NULL" + br;
+ }else if(o[nm] && o[nm].nodeType){
+ if(o[nm].nodeType == 1){
+ //txt += i+nm + " : < "+o[nm].tagName+" id=\""+ o[nm].id+"\" />" + br;
+ }else if(o[nm].nodeType == 3){
+ txt += i+nm + " : [ TextNode "+o[nm].data + " ]" + br;
+ }
+
+ }else if(typeof o[nm] == "object" && (o[nm] instanceof String || o[nm] instanceof Number || o[nm] instanceof Boolean)){
+ txt += i+nm + " : " + o[nm] + "," + br;
+
+ }else if(o[nm] instanceof Date){
+ txt += i+nm + " : " + o[nm].toString() + br;
+
+ }else if(typeof(o[nm]) == "object" && o[nm]){
+ for(var j = 0, seen; seen = used[j]; j++){
+ if(o[nm] === seen){
+ txt += i+nm + " : RECURSION" + br;
+ continue looking;
+ }
+ }
+ used.push(o[nm]);
+
+ opnCls = (isArray(o[nm]))?["[","]"]:["{","}"];
+ txt += i+nm +" : " + opnCls[0] + "\n";//non-standard break, (no comma)
+ txt += printObject(o[nm], i+ind, "", used);
+ txt += i + opnCls[1] + br;
+
+ }else if(typeof o[nm] == "undefined"){
+ txt += i+nm + " : undefined" + br;
+ }else if(nm == "toString" && typeof o[nm] == "function"){
+ var toString = o[nm]();
+ if(typeof toString == "string" && toString.match(/function ?(.*?)\(/)){
+ toString = escapeHTML(getObjectAbbr(o[nm]));
+ }
+ txt += i+nm +" : " + toString + br;
+ }else{
+ txt += i+nm +" : "+ escapeHTML(getObjectAbbr(o[nm])) + br;
+ }
+ }
+ return txt;
+ }
+
+ function getObjectAbbr(obj){
+ // Gets an abbreviation of an object for display in log
+ // X items in object, including id
+ // X items in an array
+ // TODO: Firebug Sr. actually goes by char count
+ var isError = (obj instanceof Error);
+ if(obj.nodeType == 1){
+ return escapeHTML('< '+obj.tagName.toLowerCase()+' id=\"'+ obj.id+ '\" />');
+ }
+ if(obj.nodeType == 3){
+ return escapeHTML('[TextNode: "'+obj.nodeValue+'"]');
+ }
+ var nm = (obj && (obj.id || obj.name || obj.ObjectID || obj.widgetId));
+ if(!isError && nm){ return "{"+nm+"}"; }
+
+ var obCnt = 2;
+ var arCnt = 4;
+ var cnt = 0;
+
+ if(isError){
+ nm = "[ Error: "+(obj.message || obj.description || obj)+" ]";
+ }else if(isArray(obj)){
+ nm = "[" + obj.slice(0,arCnt).join(",");
+ if(obj.length > arCnt){
+ nm += " ... ("+obj.length+" items)";
+ }
+ nm += "]";
+ }else if(typeof obj == "function"){
+ nm = obj + "";
+ var reg = /function\s*([^\(]*)(\([^\)]*\))[^\{]*\{/;
+ var m = reg.exec(nm);
+ if(m){
+ if(!m[1]){
+ m[1] = "function";
+ }
+ nm = m[1] + m[2];
+ }else{
+ nm = "function()";
+ }
+ }else if(typeof obj != "object" || typeof obj == "string"){
+ nm = obj + "";
+ }else{
+ nm = "{";
+ for(var i in obj){
+ cnt++;
+ if(cnt > obCnt){ break; }
+ nm += i+":"+escapeHTML(obj[i])+" ";
+ }
+ nm+="}";
+ }
+
+ return nm;
+ }
+
+ //*************************************************************************************
+
+ //window.onerror = onError;
+
+ addEvent(document, dojo.isIE || dojo.isSafari ? "keydown" : "keypress", onKeyDown);
+
+ if( (document.documentElement.getAttribute("debug") == "true")||
+ (dojo.config.isDebug)
+ ){
+ toggleConsole(true);
+ }
+
+ dojo.addOnWindowUnload(function(){
+ // Erase the globals and event handlers I created, to prevent spurious leak warnings
+ removeEvent(document, dojo.isIE || dojo.isSafari ? "keydown" : "keypress", onKeyDown);
+ window.onFirebugResize = null;
+ window.console = null;
+ });
+
+});
diff --git a/lib/dojo/aspect.js b/lib/dojo/aspect.js
new file mode 100644
index 000000000..823b0ff58
--- /dev/null
+++ b/lib/dojo/aspect.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/aspect",[],function(){"use strict";var _1=0;function _2(_3,_4,_5,_6){var _7=_3[_4];var _8=_4=="around";var _9;if(_8){var _a=_5(function(){return _7.advice(this,arguments);});_9={remove:function(){_9.cancelled=true;},advice:function(_b,_c){return _9.cancelled?_7.advice(_b,_c):_a.apply(_b,_c);}};}else{_9={remove:function(){var _d=_9.previous;var _e=_9.next;if(!_e&&!_d){delete _3[_4];}else{if(_d){_d.next=_e;}else{_3[_4]=_e;}if(_e){_e.previous=_d;}}},id:_1++,advice:_5,receiveArguments:_6};}if(_7&&!_8){if(_4=="after"){var _f=_7;while(_f){_7=_f;_f=_f.next;}_7.next=_9;_9.previous=_7;}else{if(_4=="before"){_3[_4]=_9;_9.next=_7;_7.previous=_9;}}}else{_3[_4]=_9;}return _9;};function _10(_11){return function(_12,_13,_14,_15){var _16=_12[_13],_17;if(!_16||_16.target!=_12){_12[_13]=_17=function(){var _18=_1;var _19=arguments;var _1a=_17.before;while(_1a){_19=_1a.advice.apply(this,_19)||_19;_1a=_1a.next;}if(_17.around){var _1b=_17.around.advice(this,_19);}var _1c=_17.after;while(_1c&&_1c.id<_18){_1b=_1c.receiveArguments?_1c.advice.apply(this,_19)||_1b:_1c.advice.call(this,_1b);_1c=_1c.next;}return _1b;};if(_16){_17.around={advice:function(_1d,_1e){return _16.apply(_1d,_1e);}};}_17.target=_12;}var _1f=_2((_17||_16),_11,_14,_15);_14=null;return _1f;};};return {before:_10("before"),around:_10("around"),after:_10("after")};}); \ No newline at end of file
diff --git a/lib/dojo/aspect.js.uncompressed.js b/lib/dojo/aspect.js.uncompressed.js
new file mode 100644
index 000000000..506c4ca43
--- /dev/null
+++ b/lib/dojo/aspect.js.uncompressed.js
@@ -0,0 +1,207 @@
+define("dojo/aspect", [], function(){
+
+// TODOC: after/before/around return object
+// TODOC: after/before/around param types.
+
+/*=====
+ dojo.aspect = {
+ // summary: provides aspect oriented programming functionality, allowing for
+ // one to add before, around, or after advice on existing methods.
+ //
+ // example:
+ // | define(["dojo/aspect"], function(aspect){
+ // | var signal = aspect.after(targetObject, "methodName", function(someArgument){
+ // | this will be called when targetObject.methodName() is called, after the original function is called
+ // | });
+ //
+ // example:
+ // The returned signal object can be used to cancel the advice.
+ // | signal.remove(); // this will stop the advice from being executed anymore
+ // | aspect.before(targetObject, "methodName", function(someArgument){
+ // | // this will be called when targetObject.methodName() is called, before the original function is called
+ // | });
+
+ after: function(target, methodName, advice, receiveArguments){
+ // summary: The "after" export of the aspect module is a function that can be used to attach
+ // "after" advice to a method. This function will be executed after the original method
+ // is executed. By default the function will be called with a single argument, the return
+ // value of the original method, or the the return value of the last executed advice (if a previous one exists).
+ // The fourth (optional) argument can be set to true to so the function receives the original
+ // arguments (from when the original method was called) rather than the return value.
+ // If there are multiple "after" advisors, they are executed in the order they were registered.
+ // target: Object
+ // This is the target object
+ // methodName: String
+ // This is the name of the method to attach to.
+ // advice: Function
+ // This is function to be called after the original method
+ // receiveArguments: Boolean?
+ // If this is set to true, the advice function receives the original arguments (from when the original mehtod
+ // was called) rather than the return value of the original/previous method.
+ // returns:
+ // A signal object that can be used to cancel the advice. If remove() is called on this signal object, it will
+ // stop the advice function from being executed.
+ },
+
+ before: function(target, methodName, advice){
+ // summary: The "before" export of the aspect module is a function that can be used to attach
+ // "before" advice to a method. This function will be executed before the original method
+ // is executed. This function will be called with the arguments used to call the method.
+ // This function may optionally return an array as the new arguments to use to call
+ // the original method (or the previous, next-to-execute before advice, if one exists).
+ // If the before method doesn't return anything (returns undefined) the original arguments
+ // will be preserved.
+ // If there are multiple "before" advisors, they are executed in the reverse order they were registered.
+ //
+ // target: Object
+ // This is the target object
+ // methodName: String
+ // This is the name of the method to attach to.
+ // advice: Function
+ // This is function to be called before the original method
+ },
+
+ around: function(target, methodName, advice){
+ // summary: The "around" export of the aspect module is a function that can be used to attach
+ // "around" advice to a method. The advisor function is immediately executed when
+ // the around() is called, is passed a single argument that is a function that can be
+ // called to continue execution of the original method (or the next around advisor).
+ // The advisor function should return a function, and this function will be called whenever
+ // the method is called. It will be called with the arguments used to call the method.
+ // Whatever this function returns will be returned as the result of the method call (unless after advise changes it).
+ //
+ // example:
+ // If there are multiple "around" advisors, the most recent one is executed first,
+ // which can then delegate to the next one and so on. For example:
+ // | around(obj, "foo", function(originalFoo){
+ // | return function(){
+ // | var start = new Date().getTime();
+ // | var results = originalFoo.apply(this, arguments); // call the original
+ // | var end = new Date().getTime();
+ // | console.log("foo execution took " + (end - start) + " ms");
+ // | return results;
+ // | };
+ // | });
+ //
+ // target: Object
+ // This is the target object
+ // methodName: String
+ // This is the name of the method to attach to.
+ // advice: Function
+ // This is function to be called around the original method
+ }
+
+ };
+=====*/
+
+ "use strict";
+ var nextId = 0;
+ function advise(dispatcher, type, advice, receiveArguments){
+ var previous = dispatcher[type];
+ var around = type == "around";
+ var signal;
+ if(around){
+ var advised = advice(function(){
+ return previous.advice(this, arguments);
+ });
+ signal = {
+ remove: function(){
+ signal.cancelled = true;
+ },
+ advice: function(target, args){
+ return signal.cancelled ?
+ previous.advice(target, args) : // cancelled, skip to next one
+ advised.apply(target, args); // called the advised function
+ }
+ };
+ }else{
+ // create the remove handler
+ signal = {
+ remove: function(){
+ var previous = signal.previous;
+ var next = signal.next;
+ if(!next && !previous){
+ delete dispatcher[type];
+ }else{
+ if(previous){
+ previous.next = next;
+ }else{
+ dispatcher[type] = next;
+ }
+ if(next){
+ next.previous = previous;
+ }
+ }
+ },
+ id: nextId++,
+ advice: advice,
+ receiveArguments: receiveArguments
+ };
+ }
+ if(previous && !around){
+ if(type == "after"){
+ // add the listener to the end of the list
+ var next = previous;
+ while(next){
+ previous = next;
+ next = next.next;
+ }
+ previous.next = signal;
+ signal.previous = previous;
+ }else if(type == "before"){
+ // add to beginning
+ dispatcher[type] = signal;
+ signal.next = previous;
+ previous.previous = signal;
+ }
+ }else{
+ // around or first one just replaces
+ dispatcher[type] = signal;
+ }
+ return signal;
+ }
+ function aspect(type){
+ return function(target, methodName, advice, receiveArguments){
+ var existing = target[methodName], dispatcher;
+ if(!existing || existing.target != target){
+ // no dispatcher in place
+ target[methodName] = dispatcher = function(){
+ var executionId = nextId;
+ // before advice
+ var args = arguments;
+ var before = dispatcher.before;
+ while(before){
+ args = before.advice.apply(this, args) || args;
+ before = before.next;
+ }
+ // around advice
+ if(dispatcher.around){
+ var results = dispatcher.around.advice(this, args);
+ }
+ // after advice
+ var after = dispatcher.after;
+ while(after && after.id < executionId){
+ results = after.receiveArguments ? after.advice.apply(this, args) || results :
+ after.advice.call(this, results);
+ after = after.next;
+ }
+ return results;
+ };
+ if(existing){
+ dispatcher.around = {advice: function(target, args){
+ return existing.apply(target, args);
+ }};
+ }
+ dispatcher.target = target;
+ }
+ var results = advise((dispatcher || existing), type, advice, receiveArguments);
+ advice = null;
+ return results;
+ };
+ }
+ return {
+ before: aspect("before"),
+ around: aspect("around"),
+ after: aspect("after")
+ };
+});
diff --git a/lib/dojo/back.js b/lib/dojo/back.js
index 0bb4817b4..c012e7db1 100644
--- a/lib/dojo/back.js
+++ b/lib/dojo/back.js
@@ -4,396 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.back"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.back"] = true;
-dojo.provide("dojo.back");
-
-dojo.getObject("back", true, dojo);
-
-/*=====
-dojo.back = {
- // summary: Browser history management resources
-}
-=====*/
-
-
-(function(){
- var back = dojo.back,
-
- // everyone deals with encoding the hash slightly differently
-
- getHash= back.getHash= function(){
- var h = window.location.hash;
- if(h.charAt(0) == "#"){ h = h.substring(1); }
- return dojo.isMozilla ? h : decodeURIComponent(h);
- },
-
- setHash= back.setHash= function(h){
- if(!h){ h = ""; }
- window.location.hash = encodeURIComponent(h);
- historyCounter = history.length;
- };
-
- var initialHref = (typeof(window) !== "undefined") ? window.location.href : "";
- var initialHash = (typeof(window) !== "undefined") ? getHash() : "";
- var initialState = null;
-
- var locationTimer = null;
- var bookmarkAnchor = null;
- var historyIframe = null;
- var forwardStack = [];
- var historyStack = [];
- var moveForward = false;
- var changingUrl = false;
- var historyCounter;
-
- function handleBackButton(){
- //summary: private method. Do not call this directly.
-
- //The "current" page is always at the top of the history stack.
- var current = historyStack.pop();
- if(!current){ return; }
- var last = historyStack[historyStack.length-1];
- if(!last && historyStack.length == 0){
- last = initialState;
- }
- if(last){
- if(last.kwArgs["back"]){
- last.kwArgs["back"]();
- }else if(last.kwArgs["backButton"]){
- last.kwArgs["backButton"]();
- }else if(last.kwArgs["handle"]){
- last.kwArgs.handle("back");
- }
- }
- forwardStack.push(current);
- }
-
- back.goBack = handleBackButton;
-
- function handleForwardButton(){
- //summary: private method. Do not call this directly.
- var last = forwardStack.pop();
- if(!last){ return; }
- if(last.kwArgs["forward"]){
- last.kwArgs.forward();
- }else if(last.kwArgs["forwardButton"]){
- last.kwArgs.forwardButton();
- }else if(last.kwArgs["handle"]){
- last.kwArgs.handle("forward");
- }
- historyStack.push(last);
- }
-
- back.goForward = handleForwardButton;
-
- function createState(url, args, hash){
- //summary: private method. Do not call this directly.
- return {"url": url, "kwArgs": args, "urlHash": hash}; //Object
- }
-
- function getUrlQuery(url){
- //summary: private method. Do not call this directly.
- var segments = url.split("?");
- if(segments.length < 2){
- return null; //null
- }
- else{
- return segments[1]; //String
- }
- }
-
- function loadIframeHistory(){
- //summary: private method. Do not call this directly.
- var url = (dojo.config["dojoIframeHistoryUrl"] || dojo.moduleUrl("dojo", "resources/iframe_history.html")) + "?" + (new Date()).getTime();
- moveForward = true;
- if(historyIframe){
- dojo.isWebKit ? historyIframe.location = url : window.frames[historyIframe.name].location = url;
- }else{
- //console.warn("dojo.back: Not initialised. You need to call dojo.back.init() from a <script> block that lives inside the <body> tag.");
- }
- return url; //String
- }
-
- function checkLocation(){
- if(!changingUrl){
- var hsl = historyStack.length;
-
- var hash = getHash();
-
- if((hash === initialHash||window.location.href == initialHref)&&(hsl == 1)){
- // FIXME: could this ever be a forward button?
- // we can't clear it because we still need to check for forwards. Ugg.
- // clearInterval(this.locationTimer);
- handleBackButton();
- return;
- }
-
- // first check to see if we could have gone forward. We always halt on
- // a no-hash item.
- if(forwardStack.length > 0){
- if(forwardStack[forwardStack.length-1].urlHash === hash){
- handleForwardButton();
- return;
- }
- }
-
- // ok, that didn't work, try someplace back in the history stack
- if((hsl >= 2)&&(historyStack[hsl-2])){
- if(historyStack[hsl-2].urlHash === hash){
- handleBackButton();
- return;
- }
- }
- }
- };
-
- back.init = function(){
- //summary: Initializes the undo stack. This must be called from a <script>
- // block that lives inside the <body> tag to prevent bugs on IE.
- // description:
- // Only call this method before the page's DOM is finished loading. Otherwise
- // it will not work. Be careful with xdomain loading or djConfig.debugAtAllCosts scenarios,
- // in order for this method to work, dojo.back will need to be part of a build layer.
- if(dojo.byId("dj_history")){ return; } // prevent reinit
- var src = dojo.config["dojoIframeHistoryUrl"] || dojo.moduleUrl("dojo", "resources/iframe_history.html");
- if (dojo._postLoad) {
- console.error("dojo.back.init() must be called before the DOM has loaded. "
- + "If using xdomain loading or djConfig.debugAtAllCosts, include dojo.back "
- + "in a build layer.");
- } else {
- document.write('<iframe style="border:0;width:1px;height:1px;position:absolute;visibility:hidden;bottom:0;right:0;" name="dj_history" id="dj_history" src="' + src + '"></iframe>');
- }
- };
-
- back.setInitialState = function(/*Object*/args){
- //summary:
- // Sets the state object and back callback for the very first page
- // that is loaded.
- //description:
- // It is recommended that you call this method as part of an event
- // listener that is registered via dojo.addOnLoad().
- //args: Object
- // See the addToHistory() function for the list of valid args properties.
- initialState = createState(initialHref, args, initialHash);
- };
-
- //FIXME: Make these doc comments not be awful. At least they're not wrong.
- //FIXME: Would like to support arbitrary back/forward jumps. Have to rework iframeLoaded among other things.
- //FIXME: is there a slight race condition in moz using change URL with the timer check and when
- // the hash gets set? I think I have seen a back/forward call in quick succession, but not consistent.
-
-
- /*=====
- dojo.__backArgs = function(kwArgs){
- // back: Function?
- // A function to be called when this state is reached via the user
- // clicking the back button.
- // forward: Function?
- // Upon return to this state from the "back, forward" combination
- // of navigation steps, this function will be called. Somewhat
- // analgous to the semantic of an "onRedo" event handler.
- // changeUrl: Boolean?|String?
- // Boolean indicating whether or not to create a unique hash for
- // this state. If a string is passed instead, it is used as the
- // hash.
- }
- =====*/
-
- back.addToHistory = function(/*dojo.__backArgs*/ args){
- // summary:
- // adds a state object (args) to the history list.
- // description:
- // To support getting back button notifications, the object
- // argument should implement a function called either "back",
- // "backButton", or "handle". The string "back" will be passed as
- // the first and only argument to this callback.
- //
- // To support getting forward button notifications, the object
- // argument should implement a function called either "forward",
- // "forwardButton", or "handle". The string "forward" will be
- // passed as the first and only argument to this callback.
- //
- // If you want the browser location string to change, define "changeUrl" on the object. If the
- // value of "changeUrl" is true, then a unique number will be appended to the URL as a fragment
- // identifier (http://some.domain.com/path#uniquenumber). If it is any other value that does
- // not evaluate to false, that value will be used as the fragment identifier. For example,
- // if changeUrl: 'page1', then the URL will look like: http://some.domain.com/path#page1
- //
- // There are problems with using dojo.back with semantically-named fragment identifiers
- // ("hash values" on an URL). In most browsers it will be hard for dojo.back to know
- // distinguish a back from a forward event in those cases. For back/forward support to
- // work best, the fragment ID should always be a unique value (something using new Date().getTime()
- // for example). If you want to detect hash changes using semantic fragment IDs, then
- // consider using dojo.hash instead (in Dojo 1.4+).
- //
- // example:
- // | dojo.back.addToHistory({
- // | back: function(){ console.log('back pressed'); },
- // | forward: function(){ console.log('forward pressed'); },
- // | changeUrl: true
- // | });
-
- // BROWSER NOTES:
- // Safari 1.2:
- // back button "works" fine, however it's not possible to actually
- // DETECT that you've moved backwards by inspecting window.location.
- // Unless there is some other means of locating.
- // FIXME: perhaps we can poll on history.length?
- // Safari 2.0.3+ (and probably 1.3.2+):
- // works fine, except when changeUrl is used. When changeUrl is used,
- // Safari jumps all the way back to whatever page was shown before
- // the page that uses dojo.undo.browser support.
- // IE 5.5 SP2:
- // back button behavior is macro. It does not move back to the
- // previous hash value, but to the last full page load. This suggests
- // that the iframe is the correct way to capture the back button in
- // these cases.
- // Don't test this page using local disk for MSIE. MSIE will not create
- // a history list for iframe_history.html if served from a file: URL.
- // The XML served back from the XHR tests will also not be properly
- // created if served from local disk. Serve the test pages from a web
- // server to test in that browser.
- // IE 6.0:
- // same behavior as IE 5.5 SP2
- // Firefox 1.0+:
- // the back button will return us to the previous hash on the same
- // page, thereby not requiring an iframe hack, although we do then
- // need to run a timer to detect inter-page movement.
-
- //If addToHistory is called, then that means we prune the
- //forward stack -- the user went back, then wanted to
- //start a new forward path.
- forwardStack = [];
-
- var hash = null;
- var url = null;
- if(!historyIframe){
- if(dojo.config["useXDomain"] && !dojo.config["dojoIframeHistoryUrl"]){
- console.warn("dojo.back: When using cross-domain Dojo builds,"
- + " please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl"
- + " to the path on your domain to iframe_history.html");
- }
- historyIframe = window.frames["dj_history"];
- }
- if(!bookmarkAnchor){
- bookmarkAnchor = dojo.create("a", {style: {display: "none"}}, dojo.body());
- }
- if(args["changeUrl"]){
- hash = ""+ ((args["changeUrl"]!==true) ? args["changeUrl"] : (new Date()).getTime());
-
- //If the current hash matches the new one, just replace the history object with
- //this new one. It doesn't make sense to track different state objects for the same
- //logical URL. This matches the browser behavior of only putting in one history
- //item no matter how many times you click on the same #hash link, at least in Firefox
- //and Safari, and there is no reliable way in those browsers to know if a #hash link
- //has been clicked on multiple times. So making this the standard behavior in all browsers
- //so that dojo.back's behavior is the same in all browsers.
- if(historyStack.length == 0 && initialState.urlHash == hash){
- initialState = createState(url, args, hash);
- return;
- }else if(historyStack.length > 0 && historyStack[historyStack.length - 1].urlHash == hash){
- historyStack[historyStack.length - 1] = createState(url, args, hash);
- return;
- }
-
- changingUrl = true;
- setTimeout(function() {
- setHash(hash);
- changingUrl = false;
- }, 1);
- bookmarkAnchor.href = hash;
-
- if(dojo.isIE){
- url = loadIframeHistory();
-
- var oldCB = args["back"]||args["backButton"]||args["handle"];
-
- //The function takes handleName as a parameter, in case the
- //callback we are overriding was "handle". In that case,
- //we will need to pass the handle name to handle.
- var tcb = function(handleName){
- if(getHash() != ""){
- setTimeout(function() { setHash(hash); }, 1);
- }
- //Use apply to set "this" to args, and to try to avoid memory leaks.
- oldCB.apply(this, [handleName]);
- };
-
- //Set interceptor function in the right place.
- if(args["back"]){
- args.back = tcb;
- }else if(args["backButton"]){
- args.backButton = tcb;
- }else if(args["handle"]){
- args.handle = tcb;
- }
-
- var oldFW = args["forward"]||args["forwardButton"]||args["handle"];
-
- //The function takes handleName as a parameter, in case the
- //callback we are overriding was "handle". In that case,
- //we will need to pass the handle name to handle.
- var tfw = function(handleName){
- if(getHash() != ""){
- setHash(hash);
- }
- if(oldFW){ // we might not actually have one
- //Use apply to set "this" to args, and to try to avoid memory leaks.
- oldFW.apply(this, [handleName]);
- }
- };
-
- //Set interceptor function in the right place.
- if(args["forward"]){
- args.forward = tfw;
- }else if(args["forwardButton"]){
- args.forwardButton = tfw;
- }else if(args["handle"]){
- args.handle = tfw;
- }
-
- }else if(!dojo.isIE){
- // start the timer
- if(!locationTimer){
- locationTimer = setInterval(checkLocation, 200);
- }
-
- }
- }else{
- url = loadIframeHistory();
- }
-
- historyStack.push(createState(url, args, hash));
- };
-
- back._iframeLoaded = function(evt, ifrLoc){
- //summary:
- // private method. Do not call this directly.
- var query = getUrlQuery(ifrLoc.href);
- if(query == null){
- // alert("iframeLoaded");
- // we hit the end of the history, so we should go back
- if(historyStack.length == 1){
- handleBackButton();
- }
- return;
- }
- if(moveForward){
- // we were expecting it, so it's not either a forward or backward movement
- moveForward = false;
- return;
- }
-
- //Check the back stack first, since it is more likely.
- //Note that only one step back or forward is supported.
- if(historyStack.length >= 2 && query == getUrlQuery(historyStack[historyStack.length-2].url)){
- handleBackButton();
- }else if(forwardStack.length > 0 && query == getUrlQuery(forwardStack[forwardStack.length-1].url)){
- handleForwardButton();
- }
- };
- })();
-
-}
+//>>built
+define("dojo/back",["./_base/kernel","./_base/lang","./_base/sniff","./dom","./dom-construct","./_base/window","require"],function(_1,_2,_3,_4,_5,_6,_7){_2.getObject("back",true,_1);var _8=_1.back,_9=_8.getHash=function(){var h=window.location.hash;if(h.charAt(0)=="#"){h=h.substring(1);}return _3("mozilla")?h:decodeURIComponent(h);},_a=_8.setHash=function(h){if(!h){h="";}window.location.hash=encodeURIComponent(h);_b=history.length;};var _c=(typeof (window)!=="undefined")?window.location.href:"";var _d=(typeof (window)!=="undefined")?_9():"";var _e=null;var _f=null;var _10=null;var _11=null;var _12=[];var _13=[];var _14=false;var _15=false;var _b;function _16(){var _17=_13.pop();if(!_17){return;}var _18=_13[_13.length-1];if(!_18&&_13.length==0){_18=_e;}if(_18){if(_18.kwArgs["back"]){_18.kwArgs["back"]();}else{if(_18.kwArgs["backButton"]){_18.kwArgs["backButton"]();}else{if(_18.kwArgs["handle"]){_18.kwArgs.handle("back");}}}}_12.push(_17);};_8.goBack=_16;function _19(){var _1a=_12.pop();if(!_1a){return;}if(_1a.kwArgs["forward"]){_1a.kwArgs.forward();}else{if(_1a.kwArgs["forwardButton"]){_1a.kwArgs.forwardButton();}else{if(_1a.kwArgs["handle"]){_1a.kwArgs.handle("forward");}}}_13.push(_1a);};_8.goForward=_19;function _1b(url,_1c,_1d){return {"url":url,"kwArgs":_1c,"urlHash":_1d};};function _1e(url){var _1f=url.split("?");if(_1f.length<2){return null;}else{return _1f[1];}};function _20(){var url=(_1.config["dojoIframeHistoryUrl"]||_7.toUrl("./resources/iframe_history.html"))+"?"+(new Date()).getTime();_14=true;if(_11){_3("webkit")?_11.location=url:window.frames[_11.name].location=url;}else{}return url;};function _21(){if(!_15){var hsl=_13.length;var _22=_9();if((_22===_d||window.location.href==_c)&&(hsl==1)){_16();return;}if(_12.length>0){if(_12[_12.length-1].urlHash===_22){_19();return;}}if((hsl>=2)&&(_13[hsl-2])){if(_13[hsl-2].urlHash===_22){_16();}}}};_8.init=function(){if(_4.byId("dj_history")){return;}var src=_1.config["dojoIframeHistoryUrl"]||_7.toUrl("./resources/iframe_history.html");if(_1._postLoad){console.error("dojo.back.init() must be called before the DOM has loaded. "+"If using xdomain loading or djConfig.debugAtAllCosts, include dojo.back "+"in a build layer.");}else{document.write("<iframe style=\"border:0;width:1px;height:1px;position:absolute;visibility:hidden;bottom:0;right:0;\" name=\"dj_history\" id=\"dj_history\" src=\""+src+"\"></iframe>");}};_8.setInitialState=function(_23){_e=_1b(_c,_23,_d);};_8.addToHistory=function(_24){_12=[];var _25=null;var url=null;if(!_11){if(_1.config["useXDomain"]&&!_1.config["dojoIframeHistoryUrl"]){console.warn("dojo.back: When using cross-domain Dojo builds,"+" please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl"+" to the path on your domain to iframe_history.html");}_11=window.frames["dj_history"];}if(!_10){_10=_5.create("a",{style:{display:"none"}},_6.body());}if(_24["changeUrl"]){_25=""+((_24["changeUrl"]!==true)?_24["changeUrl"]:(new Date()).getTime());if(_13.length==0&&_e.urlHash==_25){_e=_1b(url,_24,_25);return;}else{if(_13.length>0&&_13[_13.length-1].urlHash==_25){_13[_13.length-1]=_1b(url,_24,_25);return;}}_15=true;setTimeout(function(){_a(_25);_15=false;},1);_10.href=_25;if(_3("ie")){url=_20();var _26=_24["back"]||_24["backButton"]||_24["handle"];var tcb=function(_27){if(_9()!=""){setTimeout(function(){_a(_25);},1);}_26.apply(this,[_27]);};if(_24["back"]){_24.back=tcb;}else{if(_24["backButton"]){_24.backButton=tcb;}else{if(_24["handle"]){_24.handle=tcb;}}}var _28=_24["forward"]||_24["forwardButton"]||_24["handle"];var tfw=function(_29){if(_9()!=""){_a(_25);}if(_28){_28.apply(this,[_29]);}};if(_24["forward"]){_24.forward=tfw;}else{if(_24["forwardButton"]){_24.forwardButton=tfw;}else{if(_24["handle"]){_24.handle=tfw;}}}}else{if(!_3("ie")){if(!_f){_f=setInterval(_21,200);}}}}else{url=_20();}_13.push(_1b(url,_24,_25));};_8._iframeLoaded=function(evt,_2a){var _2b=_1e(_2a.href);if(_2b==null){if(_13.length==1){_16();}return;}if(_14){_14=false;return;}if(_13.length>=2&&_2b==_1e(_13[_13.length-2].url)){_16();}else{if(_12.length>0&&_2b==_1e(_12[_12.length-1].url)){_19();}}};return _1.back;}); \ No newline at end of file
diff --git a/lib/dojo/back.js.uncompressed.js b/lib/dojo/back.js.uncompressed.js
new file mode 100644
index 000000000..4be031c14
--- /dev/null
+++ b/lib/dojo/back.js.uncompressed.js
@@ -0,0 +1,397 @@
+define("dojo/back", ["./_base/kernel", "./_base/lang", "./_base/sniff", "./dom", "./dom-construct", "./_base/window", "require"], function(dojo, lang, sniff, dom, domConstruct, baseWindow, require) {
+ // module:
+ // dojo/back
+ // summary:
+ // TODOC
+
+ lang.getObject("back", true, dojo);
+
+/*=====
+dojo.back = {
+ // summary: Browser history management resources
+};
+=====*/
+
+ var back = dojo.back,
+
+ // everyone deals with encoding the hash slightly differently
+
+ getHash = back.getHash = function(){
+ var h = window.location.hash;
+ if(h.charAt(0) == "#"){ h = h.substring(1); }
+ return sniff("mozilla") ? h : decodeURIComponent(h);
+ },
+
+ setHash = back.setHash = function(h){
+ if(!h){ h = ""; }
+ window.location.hash = encodeURIComponent(h);
+ historyCounter = history.length;
+ };
+
+ var initialHref = (typeof(window) !== "undefined") ? window.location.href : "";
+ var initialHash = (typeof(window) !== "undefined") ? getHash() : "";
+ var initialState = null;
+
+ var locationTimer = null;
+ var bookmarkAnchor = null;
+ var historyIframe = null;
+ var forwardStack = [];
+ var historyStack = [];
+ var moveForward = false;
+ var changingUrl = false;
+ var historyCounter;
+
+ function handleBackButton(){
+ //summary: private method. Do not call this directly.
+
+ //The "current" page is always at the top of the history stack.
+ var current = historyStack.pop();
+ if(!current){ return; }
+ var last = historyStack[historyStack.length-1];
+ if(!last && historyStack.length == 0){
+ last = initialState;
+ }
+ if(last){
+ if(last.kwArgs["back"]){
+ last.kwArgs["back"]();
+ }else if(last.kwArgs["backButton"]){
+ last.kwArgs["backButton"]();
+ }else if(last.kwArgs["handle"]){
+ last.kwArgs.handle("back");
+ }
+ }
+ forwardStack.push(current);
+ }
+
+ back.goBack = handleBackButton;
+
+ function handleForwardButton(){
+ //summary: private method. Do not call this directly.
+ var last = forwardStack.pop();
+ if(!last){ return; }
+ if(last.kwArgs["forward"]){
+ last.kwArgs.forward();
+ }else if(last.kwArgs["forwardButton"]){
+ last.kwArgs.forwardButton();
+ }else if(last.kwArgs["handle"]){
+ last.kwArgs.handle("forward");
+ }
+ historyStack.push(last);
+ }
+
+ back.goForward = handleForwardButton;
+
+ function createState(url, args, hash){
+ //summary: private method. Do not call this directly.
+ return {"url": url, "kwArgs": args, "urlHash": hash}; //Object
+ }
+
+ function getUrlQuery(url){
+ //summary: private method. Do not call this directly.
+ var segments = url.split("?");
+ if(segments.length < 2){
+ return null; //null
+ }
+ else{
+ return segments[1]; //String
+ }
+ }
+
+ function loadIframeHistory(){
+ //summary: private method. Do not call this directly.
+ var url = (dojo.config["dojoIframeHistoryUrl"] || require.toUrl("./resources/iframe_history.html")) + "?" + (new Date()).getTime();
+ moveForward = true;
+ if(historyIframe){
+ sniff("webkit") ? historyIframe.location = url : window.frames[historyIframe.name].location = url;
+ }else{
+ //console.warn("dojo.back: Not initialised. You need to call dojo.back.init() from a <script> block that lives inside the <body> tag.");
+ }
+ return url; //String
+ }
+
+ function checkLocation(){
+ if(!changingUrl){
+ var hsl = historyStack.length;
+
+ var hash = getHash();
+
+ if((hash === initialHash||window.location.href == initialHref)&&(hsl == 1)){
+ // FIXME: could this ever be a forward button?
+ // we can't clear it because we still need to check for forwards. Ugg.
+ // clearInterval(this.locationTimer);
+ handleBackButton();
+ return;
+ }
+
+ // first check to see if we could have gone forward. We always halt on
+ // a no-hash item.
+ if(forwardStack.length > 0){
+ if(forwardStack[forwardStack.length-1].urlHash === hash){
+ handleForwardButton();
+ return;
+ }
+ }
+
+ // ok, that didn't work, try someplace back in the history stack
+ if((hsl >= 2)&&(historyStack[hsl-2])){
+ if(historyStack[hsl-2].urlHash === hash){
+ handleBackButton();
+ }
+ }
+ }
+ }
+
+ back.init = function(){
+ //summary: Initializes the undo stack. This must be called from a <script>
+ // block that lives inside the <body> tag to prevent bugs on IE.
+ // description:
+ // Only call this method before the page's DOM is finished loading. Otherwise
+ // it will not work. Be careful with xdomain loading or djConfig.debugAtAllCosts scenarios,
+ // in order for this method to work, dojo.back will need to be part of a build layer.
+
+ // prevent reinit
+ if(dom.byId("dj_history")){ return; }
+
+ var src = dojo.config["dojoIframeHistoryUrl"] || require.toUrl("./resources/iframe_history.html");
+ if (dojo._postLoad) {
+ console.error("dojo.back.init() must be called before the DOM has loaded. "
+ + "If using xdomain loading or djConfig.debugAtAllCosts, include dojo.back "
+ + "in a build layer.");
+ } else {
+ document.write('<iframe style="border:0;width:1px;height:1px;position:absolute;visibility:hidden;bottom:0;right:0;" name="dj_history" id="dj_history" src="' + src + '"></iframe>');
+ }
+ };
+
+ back.setInitialState = function(/*Object*/args){
+ //summary:
+ // Sets the state object and back callback for the very first page
+ // that is loaded.
+ //description:
+ // It is recommended that you call this method as part of an event
+ // listener that is registered via dojo.addOnLoad().
+ //args: Object
+ // See the addToHistory() function for the list of valid args properties.
+ initialState = createState(initialHref, args, initialHash);
+ };
+
+ //FIXME: Make these doc comments not be awful. At least they're not wrong.
+ //FIXME: Would like to support arbitrary back/forward jumps. Have to rework iframeLoaded among other things.
+ //FIXME: is there a slight race condition in moz using change URL with the timer check and when
+ // the hash gets set? I think I have seen a back/forward call in quick succession, but not consistent.
+
+
+ /*=====
+ dojo.__backArgs = function(kwArgs){
+ // back: Function?
+ // A function to be called when this state is reached via the user
+ // clicking the back button.
+ // forward: Function?
+ // Upon return to this state from the "back, forward" combination
+ // of navigation steps, this function will be called. Somewhat
+ // analgous to the semantic of an "onRedo" event handler.
+ // changeUrl: Boolean?|String?
+ // Boolean indicating whether or not to create a unique hash for
+ // this state. If a string is passed instead, it is used as the
+ // hash.
+ }
+ =====*/
+
+ back.addToHistory = function(/*dojo.__backArgs*/ args){
+ // summary:
+ // adds a state object (args) to the history list.
+ // args: dojo.__backArgs
+ // The state object that will be added to the history list.
+ // description:
+ // To support getting back button notifications, the object
+ // argument should implement a function called either "back",
+ // "backButton", or "handle". The string "back" will be passed as
+ // the first and only argument to this callback.
+ //
+ // To support getting forward button notifications, the object
+ // argument should implement a function called either "forward",
+ // "forwardButton", or "handle". The string "forward" will be
+ // passed as the first and only argument to this callback.
+ //
+ // If you want the browser location string to change, define "changeUrl" on the object. If the
+ // value of "changeUrl" is true, then a unique number will be appended to the URL as a fragment
+ // identifier (http://some.domain.com/path#uniquenumber). If it is any other value that does
+ // not evaluate to false, that value will be used as the fragment identifier. For example,
+ // if changeUrl: 'page1', then the URL will look like: http://some.domain.com/path#page1
+ //
+ // There are problems with using dojo.back with semantically-named fragment identifiers
+ // ("hash values" on an URL). In most browsers it will be hard for dojo.back to know
+ // distinguish a back from a forward event in those cases. For back/forward support to
+ // work best, the fragment ID should always be a unique value (something using new Date().getTime()
+ // for example). If you want to detect hash changes using semantic fragment IDs, then
+ // consider using dojo.hash instead (in Dojo 1.4+).
+ //
+ // example:
+ // | dojo.back.addToHistory({
+ // | back: function(){ console.log('back pressed'); },
+ // | forward: function(){ console.log('forward pressed'); },
+ // | changeUrl: true
+ // | });
+
+ // BROWSER NOTES:
+ // Safari 1.2:
+ // back button "works" fine, however it's not possible to actually
+ // DETECT that you've moved backwards by inspecting window.location.
+ // Unless there is some other means of locating.
+ // FIXME: perhaps we can poll on history.length?
+ // Safari 2.0.3+ (and probably 1.3.2+):
+ // works fine, except when changeUrl is used. When changeUrl is used,
+ // Safari jumps all the way back to whatever page was shown before
+ // the page that uses dojo.undo.browser support.
+ // IE 5.5 SP2:
+ // back button behavior is macro. It does not move back to the
+ // previous hash value, but to the last full page load. This suggests
+ // that the iframe is the correct way to capture the back button in
+ // these cases.
+ // Don't test this page using local disk for MSIE. MSIE will not create
+ // a history list for iframe_history.html if served from a file: URL.
+ // The XML served back from the XHR tests will also not be properly
+ // created if served from local disk. Serve the test pages from a web
+ // server to test in that browser.
+ // IE 6.0:
+ // same behavior as IE 5.5 SP2
+ // Firefox 1.0+:
+ // the back button will return us to the previous hash on the same
+ // page, thereby not requiring an iframe hack, although we do then
+ // need to run a timer to detect inter-page movement.
+
+ //If addToHistory is called, then that means we prune the
+ //forward stack -- the user went back, then wanted to
+ //start a new forward path.
+ forwardStack = [];
+
+ var hash = null;
+ var url = null;
+ if(!historyIframe){
+ if(dojo.config["useXDomain"] && !dojo.config["dojoIframeHistoryUrl"]){
+ console.warn("dojo.back: When using cross-domain Dojo builds,"
+ + " please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl"
+ + " to the path on your domain to iframe_history.html");
+ }
+ historyIframe = window.frames["dj_history"];
+ }
+ if(!bookmarkAnchor){
+ bookmarkAnchor = domConstruct.create("a", {style: {display: "none"}}, baseWindow.body());
+ }
+ if(args["changeUrl"]){
+ hash = ""+ ((args["changeUrl"]!==true) ? args["changeUrl"] : (new Date()).getTime());
+
+ //If the current hash matches the new one, just replace the history object with
+ //this new one. It doesn't make sense to track different state objects for the same
+ //logical URL. This matches the browser behavior of only putting in one history
+ //item no matter how many times you click on the same #hash link, at least in Firefox
+ //and Safari, and there is no reliable way in those browsers to know if a #hash link
+ //has been clicked on multiple times. So making this the standard behavior in all browsers
+ //so that dojo.back's behavior is the same in all browsers.
+ if(historyStack.length == 0 && initialState.urlHash == hash){
+ initialState = createState(url, args, hash);
+ return;
+ }else if(historyStack.length > 0 && historyStack[historyStack.length - 1].urlHash == hash){
+ historyStack[historyStack.length - 1] = createState(url, args, hash);
+ return;
+ }
+
+ changingUrl = true;
+ setTimeout(function() {
+ setHash(hash);
+ changingUrl = false;
+ }, 1);
+ bookmarkAnchor.href = hash;
+
+ if(sniff("ie")){
+ url = loadIframeHistory();
+
+ var oldCB = args["back"]||args["backButton"]||args["handle"];
+
+ //The function takes handleName as a parameter, in case the
+ //callback we are overriding was "handle". In that case,
+ //we will need to pass the handle name to handle.
+ var tcb = function(handleName){
+ if(getHash() != ""){
+ setTimeout(function() { setHash(hash); }, 1);
+ }
+ //Use apply to set "this" to args, and to try to avoid memory leaks.
+ oldCB.apply(this, [handleName]);
+ };
+
+ //Set interceptor function in the right place.
+ if(args["back"]){
+ args.back = tcb;
+ }else if(args["backButton"]){
+ args.backButton = tcb;
+ }else if(args["handle"]){
+ args.handle = tcb;
+ }
+
+ var oldFW = args["forward"]||args["forwardButton"]||args["handle"];
+
+ //The function takes handleName as a parameter, in case the
+ //callback we are overriding was "handle". In that case,
+ //we will need to pass the handle name to handle.
+ var tfw = function(handleName){
+ if(getHash() != ""){
+ setHash(hash);
+ }
+ if(oldFW){ // we might not actually have one
+ //Use apply to set "this" to args, and to try to avoid memory leaks.
+ oldFW.apply(this, [handleName]);
+ }
+ };
+
+ //Set interceptor function in the right place.
+ if(args["forward"]){
+ args.forward = tfw;
+ }else if(args["forwardButton"]){
+ args.forwardButton = tfw;
+ }else if(args["handle"]){
+ args.handle = tfw;
+ }
+
+ }else if(!sniff("ie")){
+ // start the timer
+ if(!locationTimer){
+ locationTimer = setInterval(checkLocation, 200);
+ }
+
+ }
+ }else{
+ url = loadIframeHistory();
+ }
+
+ historyStack.push(createState(url, args, hash));
+ };
+
+ back._iframeLoaded = function(evt, ifrLoc){
+ //summary:
+ // private method. Do not call this directly.
+ var query = getUrlQuery(ifrLoc.href);
+ if(query == null){
+ // alert("iframeLoaded");
+ // we hit the end of the history, so we should go back
+ if(historyStack.length == 1){
+ handleBackButton();
+ }
+ return;
+ }
+ if(moveForward){
+ // we were expecting it, so it's not either a forward or backward movement
+ moveForward = false;
+ return;
+ }
+
+ //Check the back stack first, since it is more likely.
+ //Note that only one step back or forward is supported.
+ if(historyStack.length >= 2 && query == getUrlQuery(historyStack[historyStack.length-2].url)){
+ handleBackButton();
+ }else if(forwardStack.length > 0 && query == getUrlQuery(forwardStack[forwardStack.length-1].url)){
+ handleForwardButton();
+ }
+ };
+
+ return dojo.back;
+
+});
diff --git a/lib/dojo/behavior.js b/lib/dojo/behavior.js
index 8b058892f..d3268b672 100644
--- a/lib/dojo/behavior.js
+++ b/lib/dojo/behavior.js
@@ -4,248 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.behavior"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.behavior"] = true;
-dojo.provide("dojo.behavior");
-
-
-dojo.behavior = new function(){
- // summary:
- // Utility for unobtrusive/progressive event binding, DOM traversal,
- // and manipulation.
- //
- // description:
- //
- // A very simple, lightweight mechanism for applying code to
- // existing documents, based around `dojo.query` (CSS3 selectors) for node selection,
- // and a simple two-command API: `dojo.behavior.add()` and `dojo.behavior.apply()`;
- //
- // Behaviors apply to a given page, and are registered following the syntax
- // options described by `dojo.behavior.add` to match nodes to actions, or "behaviors".
- //
- // Added behaviors are applied to the current DOM when .apply() is called,
- // matching only new nodes found since .apply() was last called.
- //
- function arrIn(obj, name){
- if(!obj[name]){ obj[name] = []; }
- return obj[name];
- }
-
- var _inc = 0;
-
- function forIn(obj, scope, func){
- var tmpObj = {};
- for(var x in obj){
- if(typeof tmpObj[x] == "undefined"){
- if(!func){
- scope(obj[x], x);
- }else{
- func.call(scope, obj[x], x);
- }
- }
- }
- }
-
- // FIXME: need a better test so we don't exclude nightly Safari's!
- this._behaviors = {};
- this.add = function(/* Object */behaviorObj){
- // summary:
- // Add the specified behavior to the list of behaviors, ignoring existing
- // matches.
- //
- // description:
- // Add the specified behavior to the list of behaviors which will
- // be applied the next time apply() is called. Calls to add() for
- // an already existing behavior do not replace the previous rules,
- // but are instead additive. New nodes which match the rule will
- // have all add()-ed behaviors applied to them when matched.
- //
- // The "found" method is a generalized handler that's called as soon
- // as the node matches the selector. Rules for values that follow also
- // apply to the "found" key.
- //
- // The "on*" handlers are attached with `dojo.connect()`, using the
- // matching node
- //
- // If the value corresponding to the ID key is a function and not a
- // list, it's treated as though it was the value of "found".
- //
- // dojo.behavior.add() can be called any number of times before
- // the DOM is ready. `dojo.behavior.apply()` is called automatically
- // by `dojo.addOnLoad`, though can be called to re-apply previously added
- // behaviors anytime the DOM changes.
- //
- // There are a variety of formats permitted in the behaviorObject
- //
- // example:
- // Simple list of properties. "found" is special. "Found" is assumed if
- // no property object for a given selector, and property is a function.
- //
- // | dojo.behavior.add({
- // | "#id": {
- // | "found": function(element){
- // | // node match found
- // | },
- // | "onclick": function(evt){
- // | // register onclick handler for found node
- // | }
- // | },
- // | "#otherid": function(element){
- // | // assumes "found" with this syntax
- // | }
- // | });
- //
- // example:
- // If property is a string, a dojo.publish will be issued on the channel:
- //
- // | dojo.behavior.add({
- // | // dojo.publish() whenever class="noclick" found on anchors
- // | "a.noclick": "/got/newAnchor",
- // | "div.wrapper": {
- // | "onclick": "/node/wasClicked"
- // | }
- // | });
- // | dojo.subscribe("/got/newAnchor", function(node){
- // | // handle node finding when dojo.behavior.apply() is called,
- // | // provided a newly matched node is found.
- // | });
- //
- // example:
- // Scoping can be accomplished by passing an object as a property to
- // a connection handle (on*):
- //
- // | dojo.behavior.add({
- // | "#id": {
- // | // like calling dojo.hitch(foo,"bar"). execute foo.bar() in scope of foo
- // | "onmouseenter": { targetObj: foo, targetFunc: "bar" },
- // | "onmouseleave": { targetObj: foo, targetFunc: "baz" }
- // | }
- // | });
- //
- // example:
- // Bahaviors match on CSS3 Selectors, powered by dojo.query. Example selectors:
- //
- // | dojo.behavior.add({
- // | // match all direct descendants
- // | "#id4 > *": function(element){
- // | // ...
- // | },
- // |
- // | // match the first child node that's an element
- // | "#id4 > :first-child": { ... },
- // |
- // | // match the last child node that's an element
- // | "#id4 > :last-child": { ... },
- // |
- // | // all elements of type tagname
- // | "tagname": {
- // | // ...
- // | },
- // |
- // | "tagname1 tagname2 tagname3": {
- // | // ...
- // | },
- // |
- // | ".classname": {
- // | // ...
- // | },
- // |
- // | "tagname.classname": {
- // | // ...
- // | }
- // | });
- //
-
- var tmpObj = {};
- forIn(behaviorObj, this, function(behavior, name){
- var tBehavior = arrIn(this._behaviors, name);
- if(typeof tBehavior["id"] != "number"){
- tBehavior.id = _inc++;
- }
- var cversion = [];
- tBehavior.push(cversion);
- if((dojo.isString(behavior))||(dojo.isFunction(behavior))){
- behavior = { found: behavior };
- }
- forIn(behavior, function(rule, ruleName){
- arrIn(cversion, ruleName).push(rule);
- });
- });
- };
-
- var _applyToNode = function(node, action, ruleSetName){
- if(dojo.isString(action)){
- if(ruleSetName == "found"){
- dojo.publish(action, [ node ]);
- }else{
- dojo.connect(node, ruleSetName, function(){
- dojo.publish(action, arguments);
- });
- }
- }else if(dojo.isFunction(action)){
- if(ruleSetName == "found"){
- action(node);
- }else{
- dojo.connect(node, ruleSetName, action);
- }
- }
- };
-
- this.apply = function(){
- // summary:
- // Applies all currently registered behaviors to the document.
- //
- // description:
- // Applies all currently registered behaviors to the document,
- // taking care to ensure that only incremental updates are made
- // since the last time add() or apply() were called.
- //
- // If new matching nodes have been added, all rules in a behavior will be
- // applied to that node. For previously matched nodes, only
- // behaviors which have been added since the last call to apply()
- // will be added to the nodes.
- //
- // apply() is called once automatically by `dojo.addOnLoad`, so
- // registering behaviors with `dojo.behavior.add` before the DOM is
- // ready is acceptable, provided the dojo.behavior module is ready.
- //
- // Calling appy() manually after manipulating the DOM is required
- // to rescan the DOM and apply newly .add()ed behaviors, or to match
- // nodes that match existing behaviors when those nodes are added to
- // the DOM.
- //
- forIn(this._behaviors, function(tBehavior, id){
- dojo.query(id).forEach(
- function(elem){
- var runFrom = 0;
- var bid = "_dj_behavior_"+tBehavior.id;
- if(typeof elem[bid] == "number"){
- runFrom = elem[bid];
- if(runFrom == (tBehavior.length)){
- return;
- }
- }
- // run through the versions, applying newer rules at each step
-
- for(var x=runFrom, tver; tver = tBehavior[x]; x++){
- forIn(tver, function(ruleSet, ruleSetName){
- if(dojo.isArray(ruleSet)){
- dojo.forEach(ruleSet, function(action){
- _applyToNode(elem, action, ruleSetName);
- });
- }
- });
- }
-
- // ensure that re-application only adds new rules to the node
- elem[bid] = tBehavior.length;
- }
- );
- });
- };
-};
-
-dojo.addOnLoad(dojo.behavior, "apply");
-
-}
+//>>built
+define("dojo/behavior",["./_base/kernel","./_base/lang","./_base/array","./_base/connect","./query","./ready"],function(_1,_2,_3,_4,_5,_6){_1.behavior=new function(){function _7(_8,_9){if(!_8[_9]){_8[_9]=[];}return _8[_9];};var _a=0;function _b(_c,_d,_e){var _f={};for(var x in _c){if(typeof _f[x]=="undefined"){if(!_e){_d(_c[x],x);}else{_e.call(_d,_c[x],x);}}}};this._behaviors={};this.add=function(_10){_b(_10,this,function(_11,_12){var _13=_7(this._behaviors,_12);if(typeof _13["id"]!="number"){_13.id=_a++;}var _14=[];_13.push(_14);if((_2.isString(_11))||(_2.isFunction(_11))){_11={found:_11};}_b(_11,function(_15,_16){_7(_14,_16).push(_15);});});};var _17=function(_18,_19,_1a){if(_2.isString(_19)){if(_1a=="found"){_4.publish(_19,[_18]);}else{_4.connect(_18,_1a,function(){_4.publish(_19,arguments);});}}else{if(_2.isFunction(_19)){if(_1a=="found"){_19(_18);}else{_4.connect(_18,_1a,_19);}}}};this.apply=function(){_b(this._behaviors,function(_1b,id){_5(id).forEach(function(_1c){var _1d=0;var bid="_dj_behavior_"+_1b.id;if(typeof _1c[bid]=="number"){_1d=_1c[bid];if(_1d==(_1b.length)){return;}}for(var x=_1d,_1e;_1e=_1b[x];x++){_b(_1e,function(_1f,_20){if(_2.isArray(_1f)){_3.forEach(_1f,function(_21){_17(_1c,_21,_20);});}});}_1c[bid]=_1b.length;});});};};_6(_1.behavior,"apply");return _1.behavior;}); \ No newline at end of file
diff --git a/lib/dojo/behavior.js.uncompressed.js b/lib/dojo/behavior.js.uncompressed.js
new file mode 100644
index 000000000..4270501d1
--- /dev/null
+++ b/lib/dojo/behavior.js.uncompressed.js
@@ -0,0 +1,248 @@
+define("dojo/behavior", ["./_base/kernel", "./_base/lang", "./_base/array", "./_base/connect", "./query", "./ready"], function(dojo, lang, darray, connect, query, ready) {
+ // module:
+ // dojo/behavior
+ // summary:
+ // TODOC
+
+
+dojo.behavior = new function(){
+ // summary:
+ // Utility for unobtrusive/progressive event binding, DOM traversal,
+ // and manipulation.
+ //
+ // description:
+ //
+ // A very simple, lightweight mechanism for applying code to
+ // existing documents, based around `dojo.query` (CSS3 selectors) for node selection,
+ // and a simple two-command API: `dojo.behavior.add()` and `dojo.behavior.apply()`;
+ //
+ // Behaviors apply to a given page, and are registered following the syntax
+ // options described by `dojo.behavior.add` to match nodes to actions, or "behaviors".
+ //
+ // Added behaviors are applied to the current DOM when .apply() is called,
+ // matching only new nodes found since .apply() was last called.
+ //
+ function arrIn(obj, name){
+ if(!obj[name]){ obj[name] = []; }
+ return obj[name];
+ }
+
+ var _inc = 0;
+
+ function forIn(obj, scope, func){
+ var tmpObj = {};
+ for(var x in obj){
+ if(typeof tmpObj[x] == "undefined"){
+ if(!func){
+ scope(obj[x], x);
+ }else{
+ func.call(scope, obj[x], x);
+ }
+ }
+ }
+ }
+
+ // FIXME: need a better test so we don't exclude nightly Safari's!
+ this._behaviors = {};
+ this.add = function(/* Object */behaviorObj){
+ // summary:
+ // Add the specified behavior to the list of behaviors, ignoring existing
+ // matches.
+ // behaviorObj: Object
+ // The behavior object that will be added to behaviors list. The behaviors
+ // in the list will be applied the next time apply() is called.
+ // description:
+ // Add the specified behavior to the list of behaviors which will
+ // be applied the next time apply() is called. Calls to add() for
+ // an already existing behavior do not replace the previous rules,
+ // but are instead additive. New nodes which match the rule will
+ // have all add()-ed behaviors applied to them when matched.
+ //
+ // The "found" method is a generalized handler that's called as soon
+ // as the node matches the selector. Rules for values that follow also
+ // apply to the "found" key.
+ //
+ // The "on*" handlers are attached with `dojo.connect()`, using the
+ // matching node
+ //
+ // If the value corresponding to the ID key is a function and not a
+ // list, it's treated as though it was the value of "found".
+ //
+ // dojo.behavior.add() can be called any number of times before
+ // the DOM is ready. `dojo.behavior.apply()` is called automatically
+ // by `dojo.addOnLoad`, though can be called to re-apply previously added
+ // behaviors anytime the DOM changes.
+ //
+ // There are a variety of formats permitted in the behaviorObject
+ //
+ // example:
+ // Simple list of properties. "found" is special. "Found" is assumed if
+ // no property object for a given selector, and property is a function.
+ //
+ // | dojo.behavior.add({
+ // | "#id": {
+ // | "found": function(element){
+ // | // node match found
+ // | },
+ // | "onclick": function(evt){
+ // | // register onclick handler for found node
+ // | }
+ // | },
+ // | "#otherid": function(element){
+ // | // assumes "found" with this syntax
+ // | }
+ // | });
+ //
+ // example:
+ // If property is a string, a dojo.publish will be issued on the channel:
+ //
+ // | dojo.behavior.add({
+ // | // dojo.publish() whenever class="noclick" found on anchors
+ // | "a.noclick": "/got/newAnchor",
+ // | "div.wrapper": {
+ // | "onclick": "/node/wasClicked"
+ // | }
+ // | });
+ // | dojo.subscribe("/got/newAnchor", function(node){
+ // | // handle node finding when dojo.behavior.apply() is called,
+ // | // provided a newly matched node is found.
+ // | });
+ //
+ // example:
+ // Scoping can be accomplished by passing an object as a property to
+ // a connection handle (on*):
+ //
+ // | dojo.behavior.add({
+ // | "#id": {
+ // | // like calling dojo.hitch(foo,"bar"). execute foo.bar() in scope of foo
+ // | "onmouseenter": { targetObj: foo, targetFunc: "bar" },
+ // | "onmouseleave": { targetObj: foo, targetFunc: "baz" }
+ // | }
+ // | });
+ //
+ // example:
+ // Bahaviors match on CSS3 Selectors, powered by dojo.query. Example selectors:
+ //
+ // | dojo.behavior.add({
+ // | // match all direct descendants
+ // | "#id4 > *": function(element){
+ // | // ...
+ // | },
+ // |
+ // | // match the first child node that's an element
+ // | "#id4 > :first-child": { ... },
+ // |
+ // | // match the last child node that's an element
+ // | "#id4 > :last-child": { ... },
+ // |
+ // | // all elements of type tagname
+ // | "tagname": {
+ // | // ...
+ // | },
+ // |
+ // | "tagname1 tagname2 tagname3": {
+ // | // ...
+ // | },
+ // |
+ // | ".classname": {
+ // | // ...
+ // | },
+ // |
+ // | "tagname.classname": {
+ // | // ...
+ // | }
+ // | });
+ //
+
+ forIn(behaviorObj, this, function(behavior, name){
+ var tBehavior = arrIn(this._behaviors, name);
+ if(typeof tBehavior["id"] != "number"){
+ tBehavior.id = _inc++;
+ }
+ var cversion = [];
+ tBehavior.push(cversion);
+ if((lang.isString(behavior))||(lang.isFunction(behavior))){
+ behavior = { found: behavior };
+ }
+ forIn(behavior, function(rule, ruleName){
+ arrIn(cversion, ruleName).push(rule);
+ });
+ });
+ };
+
+ var _applyToNode = function(node, action, ruleSetName){
+ if(lang.isString(action)){
+ if(ruleSetName == "found"){
+ connect.publish(action, [ node ]);
+ }else{
+ connect.connect(node, ruleSetName, function(){
+ connect.publish(action, arguments);
+ });
+ }
+ }else if(lang.isFunction(action)){
+ if(ruleSetName == "found"){
+ action(node);
+ }else{
+ connect.connect(node, ruleSetName, action);
+ }
+ }
+ };
+
+ this.apply = function(){
+ // summary:
+ // Applies all currently registered behaviors to the document.
+ //
+ // description:
+ // Applies all currently registered behaviors to the document,
+ // taking care to ensure that only incremental updates are made
+ // since the last time add() or apply() were called.
+ //
+ // If new matching nodes have been added, all rules in a behavior will be
+ // applied to that node. For previously matched nodes, only
+ // behaviors which have been added since the last call to apply()
+ // will be added to the nodes.
+ //
+ // apply() is called once automatically by `dojo.addOnLoad`, so
+ // registering behaviors with `dojo.behavior.add` before the DOM is
+ // ready is acceptable, provided the dojo.behavior module is ready.
+ //
+ // Calling appy() manually after manipulating the DOM is required
+ // to rescan the DOM and apply newly .add()ed behaviors, or to match
+ // nodes that match existing behaviors when those nodes are added to
+ // the DOM.
+ //
+ forIn(this._behaviors, function(tBehavior, id){
+ query(id).forEach(
+ function(elem){
+ var runFrom = 0;
+ var bid = "_dj_behavior_"+tBehavior.id;
+ if(typeof elem[bid] == "number"){
+ runFrom = elem[bid];
+ if(runFrom == (tBehavior.length)){
+ return;
+ }
+ }
+ // run through the versions, applying newer rules at each step
+
+ for(var x=runFrom, tver; tver = tBehavior[x]; x++){
+ forIn(tver, function(ruleSet, ruleSetName){
+ if(lang.isArray(ruleSet)){
+ darray.forEach(ruleSet, function(action){
+ _applyToNode(elem, action, ruleSetName);
+ });
+ }
+ });
+ }
+
+ // ensure that re-application only adds new rules to the node
+ elem[bid] = tBehavior.length;
+ }
+ );
+ });
+ };
+};
+
+ready(dojo.behavior, "apply"); // FIXME: should this use a priority? before/after parser priority?
+
+return dojo.behavior;
+});
diff --git a/lib/dojo/build.txt b/lib/dojo/build.txt
deleted file mode 100644
index 6f15de0c4..000000000
--- a/lib/dojo/build.txt
+++ /dev/null
@@ -1,126 +0,0 @@
-Files baked into this build:
-
-dojo.js:
-./jslib/dojoGuardStart.jsfrag
-./../../dojo/_base/_loader/bootstrap.js
-./../../dojo/_base/_loader/loader.js
-./../../dojo/_base/_loader/hostenv_browser.js
-./../../release/dojo/_base/lang.js
-./../../release/dojo/_base/array.js
-./../../release/dojo/_base/declare.js
-./../../release/dojo/_base/connect.js
-./../../release/dojo/_base/Deferred.js
-./../../release/dojo/_base/json.js
-./../../release/dojo/_base/Color.js
-./../../release/dojo/_base/window.js
-./../../release/dojo/_base/event.js
-./../../release/dojo/_base/html.js
-./../../release/dojo/_base/NodeList.js
-./../../release/dojo/_base/query.js
-./../../release/dojo/_base/xhr.js
-./../../release/dojo/_base/fx.js
-./../../release/dojo/_base/browser.js
-./../../release/dojo/_base.js
-./jslib/dojoGuardEnd.jsfrag
-
-tt-rss-layer.js:
-./../../release/dojo/date/stamp.js
-./../../release/dojo/parser.js
-./../../release/dojo/window.js
-./../../release/dijit/_base/manager.js
-./../../release/dijit/_base/focus.js
-./../../release/dojo/AdapterRegistry.js
-./../../release/dijit/_base/place.js
-./../../release/dijit/_base/window.js
-./../../release/dijit/_base/popup.js
-./../../release/dijit/_base/scroll.js
-./../../release/dojo/uacss.js
-./../../release/dijit/_base/sniff.js
-./../../release/dijit/_base/typematic.js
-./../../release/dijit/_base/wai.js
-./../../release/dijit/_base.js
-./../../release/dojo/Stateful.js
-./../../release/dijit/_WidgetBase.js
-./../../release/dijit/_Widget.js
-./../../release/dojo/string.js
-./../../release/dojo/cache.js
-./../../release/dijit/_Templated.js
-./../../release/dijit/_Container.js
-./../../release/dijit/_Contained.js
-./../../release/dijit/layout/_LayoutWidget.js
-./../../release/dijit/_CssStateMixin.js
-./../../release/dijit/form/_FormWidget.js
-./../../release/dijit/dijit.js
-./../../release/dojo/fx/Toggler.js
-./../../release/dojo/fx.js
-./../../release/dojo/NodeList-fx.js
-./../../release/dojo/colors.js
-./../../release/dojo/i18n.js
-./../../release/dijit/_PaletteMixin.js
-./../../release/dijit/ColorPalette.js
-./../../release/dojo/dnd/common.js
-./../../release/dojo/dnd/autoscroll.js
-./../../release/dojo/dnd/Mover.js
-./../../release/dojo/dnd/Moveable.js
-./../../release/dojo/dnd/move.js
-./../../release/dojo/dnd/TimedMoveable.js
-./../../release/dijit/form/_FormMixin.js
-./../../release/dijit/_DialogMixin.js
-./../../release/dijit/DialogUnderlay.js
-./../../release/dijit/layout/_ContentPaneResizeMixin.js
-./../../release/dojo/html.js
-./../../release/dijit/layout/ContentPane.js
-./../../release/dijit/TooltipDialog.js
-./../../release/dijit/Dialog.js
-./../../release/dijit/_HasDropDown.js
-./../../release/dijit/form/Button.js
-./../../release/dijit/form/ToggleButton.js
-./../../release/dijit/form/CheckBox.js
-./../../release/dijit/form/DropDownButton.js
-./../../release/dojo/regexp.js
-./../../release/dojo/data/util/sorter.js
-./../../release/dojo/data/util/simpleFetch.js
-./../../release/dojo/data/util/filter.js
-./../../release/dijit/form/TextBox.js
-./../../release/dijit/Tooltip.js
-./../../release/dijit/form/ValidationTextBox.js
-./../../release/dijit/form/ComboBox.js
-./../../release/dijit/form/FilteringSelect.js
-./../../release/dijit/form/Form.js
-./../../release/dijit/form/RadioButton.js
-./../../release/dijit/form/_FormSelectWidget.js
-./../../release/dijit/_KeyNavContainer.js
-./../../release/dijit/MenuItem.js
-./../../release/dijit/PopupMenuItem.js
-./../../release/dijit/CheckedMenuItem.js
-./../../release/dijit/MenuSeparator.js
-./../../release/dijit/Menu.js
-./../../release/dijit/form/Select.js
-./../../release/dijit/form/SimpleTextarea.js
-./../../release/dijit/InlineEditBox.js
-./../../release/dojo/cookie.js
-./../../release/dijit/layout/StackController.js
-./../../release/dijit/layout/StackContainer.js
-./../../release/dijit/layout/AccordionPane.js
-./../../release/dijit/layout/AccordionContainer.js
-./../../release/dijit/layout/BorderContainer.js
-./../../release/dijit/layout/_TabContainerBase.js
-./../../release/dijit/layout/TabController.js
-./../../release/dijit/layout/ScrollingTabController.js
-./../../release/dijit/layout/TabContainer.js
-./../../release/dojo/number.js
-./../../release/dijit/ProgressBar.js
-./../../release/dijit/ToolbarSeparator.js
-./../../release/dijit/Toolbar.js
-./../../release/dojo/DeferredList.js
-./../../release/dijit/tree/TreeStoreModel.js
-./../../release/dijit/tree/ForestStoreModel.js
-./../../release/dojo/dnd/Container.js
-./../../release/dijit/tree/_dndContainer.js
-./../../release/dijit/tree/_dndSelector.js
-./../../release/dijit/Tree.js
-./../../release/dojo/dnd/Avatar.js
-./../../release/dojo/dnd/Manager.js
-./../../release/dijit/tree/dndSource.js
-./../../release/dojo/data/ItemFileReadStore.js
-./../../release/dojo/data/ItemFileWriteStore.js
diff --git a/lib/dojo/cache.js b/lib/dojo/cache.js
index 887a7f2e5..67952d3f4 100644
--- a/lib/dojo/cache.js
+++ b/lib/dojo/cache.js
@@ -4,123 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.cache"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.cache"] = true;
-dojo.provide("dojo.cache");
-
-
-/*=====
-dojo.cache = {
- // summary:
- // A way to cache string content that is fetchable via `dojo.moduleUrl`.
-};
-=====*/
-
- var cache = {};
- dojo.cache = function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){
- // summary:
- // A getter and setter for storing the string content associated with the
- // module and url arguments.
- // description:
- // module and url are used to call `dojo.moduleUrl()` to generate a module URL.
- // If value is specified, the cache value for the moduleUrl will be set to
- // that value. Otherwise, dojo.cache will fetch the moduleUrl and store it
- // in its internal cache and return that cached value for the URL. To clear
- // a cache value pass null for value. Since XMLHttpRequest (XHR) is used to fetch the
- // the URL contents, only modules on the same domain of the page can use this capability.
- // The build system can inline the cache values though, to allow for xdomain hosting.
- // module: String||Object
- // If a String, the module name to use for the base part of the URL, similar to module argument
- // to `dojo.moduleUrl`. If an Object, something that has a .toString() method that
- // generates a valid path for the cache item. For example, a dojo._Url object.
- // url: String
- // The rest of the path to append to the path derived from the module argument. If
- // module is an object, then this second argument should be the "value" argument instead.
- // value: String||Object?
- // If a String, the value to use in the cache for the module/url combination.
- // If an Object, it can have two properties: value and sanitize. The value property
- // should be the value to use in the cache, and sanitize can be set to true or false,
- // to indicate if XML declarations should be removed from the value and if the HTML
- // inside a body tag in the value should be extracted as the real value. The value argument
- // or the value property on the value argument are usually only used by the build system
- // as it inlines cache content.
- // example:
- // To ask dojo.cache to fetch content and store it in the cache (the dojo["cache"] style
- // of call is used to avoid an issue with the build system erroneously trying to intern
- // this example. To get the build system to intern your dojo.cache calls, use the
- // "dojo.cache" style of call):
- // | //If template.html contains "<h1>Hello</h1>" that will be
- // | //the value for the text variable.
- // | var text = dojo["cache"]("my.module", "template.html");
- // example:
- // To ask dojo.cache to fetch content and store it in the cache, and sanitize the input
- // (the dojo["cache"] style of call is used to avoid an issue with the build system
- // erroneously trying to intern this example. To get the build system to intern your
- // dojo.cache calls, use the "dojo.cache" style of call):
- // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the
- // | //text variable will contain just "<h1>Hello</h1>".
- // | var text = dojo["cache"]("my.module", "template.html", {sanitize: true});
- // example:
- // Same example as previous, but demostrates how an object can be passed in as
- // the first argument, then the value argument can then be the second argument.
- // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the
- // | //text variable will contain just "<h1>Hello</h1>".
- // | var text = dojo["cache"](new dojo._Url("my/module/template.html"), {sanitize: true});
-
- //Module could be a string, or an object that has a toString() method
- //that will return a useful path. If it is an object, then the "url" argument
- //will actually be the value argument.
- if(typeof module == "string"){
- var pathObj = dojo.moduleUrl(module, url);
- }else{
- pathObj = module;
- value = url;
- }
- var key = pathObj.toString();
-
- var val = value;
- if(value != undefined && !dojo.isString(value)){
- val = ("value" in value ? value.value : undefined);
- }
-
- var sanitize = value && value.sanitize ? true : false;
-
- if(typeof val == "string"){
- //We have a string, set cache value
- val = cache[key] = sanitize ? dojo.cache._sanitize(val) : val;
- }else if(val === null){
- //Remove cached value
- delete cache[key];
- }else{
- //Allow cache values to be empty strings. If key property does
- //not exist, fetch it.
- if(!(key in cache)){
- val = dojo._getText(key);
- cache[key] = sanitize ? dojo.cache._sanitize(val) : val;
- }
- val = cache[key];
- }
- return val; //String
- };
-
- dojo.cache._sanitize = function(/*String*/val){
- // summary:
- // Strips <?xml ...?> declarations so that external SVG and XML
- // documents can be added to a document without worry. Also, if the string
- // is an HTML document, only the part inside the body tag is returned.
- // description:
- // Copied from dijit._Templated._sanitizeTemplateString.
- if(val){
- val = val.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, "");
- var matches = val.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
- if(matches){
- val = matches[1];
- }
- }else{
- val = "";
- }
- return val; //String
- };
-
-}
+//>>built
+define("dojo/cache",["./_base/kernel","./text"],function(_1,_2){return _1.cache;}); \ No newline at end of file
diff --git a/lib/dojo/cache.js.uncompressed.js b/lib/dojo/cache.js.uncompressed.js
new file mode 100644
index 000000000..6c5642872
--- /dev/null
+++ b/lib/dojo/cache.js.uncompressed.js
@@ -0,0 +1,9 @@
+define("dojo/cache", ["./_base/kernel", "./text"], function(dojo, text){
+ // module:
+ // dojo/cache
+ // summary:
+ // The module defines dojo.cache by loading dojo/text.
+
+ //dojo.cache is defined in dojo/text
+ return dojo.cache;
+});
diff --git a/lib/dojo/cldr/monetary.js b/lib/dojo/cldr/monetary.js
index 498e437ab..6d8621bc1 100644
--- a/lib/dojo/cldr/monetary.js
+++ b/lib/dojo/cldr/monetary.js
@@ -4,36 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.cldr.monetary"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.cldr.monetary"] = true;
-dojo.provide("dojo.cldr.monetary");
-
-dojo.getObject("cldr.monetary", true, dojo);
-
-dojo.cldr.monetary.getData = function(/*String*/code){
-// summary: A mapping of currency code to currency-specific formatting information. Returns a unique object with properties: places, round.
-// code: an [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217) currency code
-
-// from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/currencyData/fractions
-
- var placesData = {
- ADP:0,AFN:0,ALL:0,AMD:0,BHD:3,BIF:0,BYR:0,CLF:0,CLP:0,
- COP:0,CRC:0,DJF:0,ESP:0,GNF:0,GYD:0,HUF:0,IDR:0,IQD:0,
- IRR:3,ISK:0,ITL:0,JOD:3,JPY:0,KMF:0,KPW:0,KRW:0,KWD:3,
- LAK:0,LBP:0,LUF:0,LYD:3,MGA:0,MGF:0,MMK:0,MNT:0,MRO:0,
- MUR:0,OMR:3,PKR:0,PYG:0,RSD:0,RWF:0,SLL:0,SOS:0,STD:0,
- SYP:0,TMM:0,TND:3,TRL:0,TZS:0,UGX:0,UZS:0,VND:0,VUV:0,
- XAF:0,XOF:0,XPF:0,YER:0,ZMK:0,ZWD:0
- };
-
- var roundingData = {CHF:5};
-
- var places = placesData[code], round = roundingData[code];
- if(typeof places == "undefined"){ places = 2; }
- if(typeof round == "undefined"){ round = 0; }
-
- return {places: places, round: round}; // Object
-};
-
-}
+//>>built
+define("dojo/cldr/monetary",["../main"],function(_1){_1.getObject("cldr.monetary",true,_1);_1.cldr.monetary.getData=function(_2){var _3={ADP:0,AFN:0,ALL:0,AMD:0,BHD:3,BIF:0,BYR:0,CLF:0,CLP:0,COP:0,CRC:0,DJF:0,ESP:0,GNF:0,GYD:0,HUF:0,IDR:0,IQD:0,IRR:3,ISK:0,ITL:0,JOD:3,JPY:0,KMF:0,KPW:0,KRW:0,KWD:3,LAK:0,LBP:0,LUF:0,LYD:3,MGA:0,MGF:0,MMK:0,MNT:0,MRO:0,MUR:0,OMR:3,PKR:0,PYG:0,RSD:0,RWF:0,SLL:0,SOS:0,STD:0,SYP:0,TMM:0,TND:3,TRL:0,TZS:0,UGX:0,UZS:0,VND:0,VUV:0,XAF:0,XOF:0,XPF:0,YER:0,ZMK:0,ZWD:0};var _4={CHF:5};var _5=_3[_2],_6=_4[_2];if(typeof _5=="undefined"){_5=2;}if(typeof _6=="undefined"){_6=0;}return {places:_5,round:_6};};return _1.cldr.monetary;}); \ No newline at end of file
diff --git a/lib/dojo/cldr/monetary.js.uncompressed.js b/lib/dojo/cldr/monetary.js.uncompressed.js
new file mode 100644
index 000000000..226cb468f
--- /dev/null
+++ b/lib/dojo/cldr/monetary.js.uncompressed.js
@@ -0,0 +1,35 @@
+define("dojo/cldr/monetary", ["../main"], function(dojo) {
+ // module:
+ // dojo/cldr/monetary
+ // summary:
+ // TODOC
+
+dojo.getObject("cldr.monetary", true, dojo);
+
+dojo.cldr.monetary.getData = function(/*String*/code){
+// summary: A mapping of currency code to currency-specific formatting information. Returns a unique object with properties: places, round.
+// code: an [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217) currency code
+
+// from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/currencyData/fractions
+
+ var placesData = {
+ ADP:0,AFN:0,ALL:0,AMD:0,BHD:3,BIF:0,BYR:0,CLF:0,CLP:0,
+ COP:0,CRC:0,DJF:0,ESP:0,GNF:0,GYD:0,HUF:0,IDR:0,IQD:0,
+ IRR:3,ISK:0,ITL:0,JOD:3,JPY:0,KMF:0,KPW:0,KRW:0,KWD:3,
+ LAK:0,LBP:0,LUF:0,LYD:3,MGA:0,MGF:0,MMK:0,MNT:0,MRO:0,
+ MUR:0,OMR:3,PKR:0,PYG:0,RSD:0,RWF:0,SLL:0,SOS:0,STD:0,
+ SYP:0,TMM:0,TND:3,TRL:0,TZS:0,UGX:0,UZS:0,VND:0,VUV:0,
+ XAF:0,XOF:0,XPF:0,YER:0,ZMK:0,ZWD:0
+ };
+
+ var roundingData = {CHF:5};
+
+ var places = placesData[code], round = roundingData[code];
+ if(typeof places == "undefined"){ places = 2; }
+ if(typeof round == "undefined"){ round = 0; }
+
+ return {places: places, round: round}; // Object
+};
+
+return dojo.cldr.monetary;
+});
diff --git a/lib/dojo/cldr/nls/ar/buddhist.js b/lib/dojo/cldr/nls/ar/buddhist.js
index 68708e9af..dee7d38f8 100644
--- a/lib/dojo/cldr/nls/ar/buddhist.js
+++ b/lib/dojo/cldr/nls/ar/buddhist.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"M‏/y G","dateFormatItem-yQ":"yyyy Q","dayPeriods-format-wide-pm":"م","eraNames":["التقويم البوذي"],"dateFormatItem-MMMEd":"E d MMM","dateFormatItem-MMdd":"dd‏/MM","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],"dayPeriods-format-wide-am":"ص","dateFormatItem-y":"y G","timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Ed":"E، d","dateFormatItem-yMMM":"MMM y G","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"eraAbbr":["التقويم البوذي"],"dateFormatItem-yyyyMM":"MM‏/y G","dateFormatItem-yyyyMMMM":"MMMM، y G","dateFormat-long":"d MMMM، y G","timeFormat-medium":"h:mm:ss a","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"dd‏/MM‏/y G","dateFormatItem-yMd":"d/‏M/‏y G","dateFormatItem-yMMMM":"MMMM y G","dateFormatItem-ms":"mm:ss","quarters-standAlone-narrow":["١","٢","٣","٤"],"dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-MMMd":"d MMM","timeFormat-long":"z h:mm:ss a","timeFormat-short":"h:mm a","dateFormatItem-MMMMd":"d MMMM","days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormatItem-M":"L","dateFormatItem-yMMMd":"d MMMM y G","dateFormat-short":"d‏/M‏/y G","dateFormatItem-yMMMEd":"EEE، d MMMM y G","dateFormat-full":"EEEE، d MMMM، y G","dateFormatItem-Md":"d/‏M","dateFormatItem-yMEd":"EEE، d/‏M/‏y G","months-format-wide":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-d":"d","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"eraNarrow":["التقويم البوذي"],"days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-yQQQ":"y QQQ","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ar/buddhist",{"dateFormatItem-yM":"M/y G","dateFormatItem-yQ":"yyyy Q","dayPeriods-format-wide-pm":"م","eraNames":["التقويم البوذي"],"dateFormatItem-MMMEd":"E d MMM","dateFormatItem-MMdd":"dd/MM","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],"dayPeriods-format-wide-am":"ص","dateFormatItem-y":"y G","timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Ed":"E، d","dateFormatItem-yMMM":"MMM y G","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"eraAbbr":["التقويم البوذي"],"dateFormatItem-yyyyMM":"MM/y G","dateFormatItem-yyyyMMMM":"MMMM، y G","dateFormat-long":"d MMMM، y G","timeFormat-medium":"h:mm:ss a","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"dd/MM/y G","dateFormatItem-yMd":"d/M/y G","dateFormatItem-yMMMM":"MMMM y G","dateFormatItem-ms":"mm:ss","quarters-standAlone-narrow":["١","٢","٣","٤"],"dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-MMMd":"d MMM","timeFormat-long":"z h:mm:ss a","timeFormat-short":"h:mm a","dateFormatItem-MMMMd":"d MMMM","days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormatItem-M":"L","dateFormatItem-yMMMd":"d MMMM y G","dateFormat-short":"d/M/y G","dateFormatItem-yMMMEd":"EEE، d MMMM y G","dateFormat-full":"EEEE، d MMMM، y G","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE، d/M/y G","months-format-wide":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-d":"d","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"eraNarrow":["التقويم البوذي"],"days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ar/buddhist.js.uncompressed.js b/lib/dojo/cldr/nls/ar/buddhist.js.uncompressed.js
new file mode 100644
index 000000000..1ae272267
--- /dev/null
+++ b/lib/dojo/cldr/nls/ar/buddhist.js.uncompressed.js
@@ -0,0 +1,115 @@
+define(
+"dojo/cldr/nls/ar/buddhist", //begin v1.x content
+{
+ "dateFormatItem-yM": "M‏/y G",
+ "dateFormatItem-yQ": "yyyy Q",
+ "dayPeriods-format-wide-pm": "م",
+ "eraNames": [
+ "التقويم البوذي"
+ ],
+ "dateFormatItem-MMMEd": "E d MMM",
+ "dateFormatItem-MMdd": "dd‏/MM",
+ "dateFormatItem-MMM": "LLL",
+ "months-standAlone-narrow": [
+ "ي",
+ "ف",
+ "م",
+ "أ",
+ "و",
+ "ن",
+ "ل",
+ "غ",
+ "س",
+ "ك",
+ "ب",
+ "د"
+ ],
+ "dayPeriods-format-wide-am": "ص",
+ "dateFormatItem-y": "y G",
+ "timeFormat-full": "zzzz h:mm:ss a",
+ "dateFormatItem-Ed": "E، d",
+ "dateFormatItem-yMMM": "MMM y G",
+ "days-standAlone-narrow": [
+ "ح",
+ "ن",
+ "ث",
+ "ر",
+ "خ",
+ "ج",
+ "س"
+ ],
+ "eraAbbr": [
+ "التقويم البوذي"
+ ],
+ "dateFormatItem-yyyyMM": "MM‏/y G",
+ "dateFormatItem-yyyyMMMM": "MMMM، y G",
+ "dateFormat-long": "d MMMM، y G",
+ "timeFormat-medium": "h:mm:ss a",
+ "dateFormatItem-Hm": "HH:mm",
+ "dateFormat-medium": "dd‏/MM‏/y G",
+ "dateFormatItem-yMd": "d/‏M/‏y G",
+ "dateFormatItem-yMMMM": "MMMM y G",
+ "dateFormatItem-ms": "mm:ss",
+ "quarters-standAlone-narrow": [
+ "١",
+ "٢",
+ "٣",
+ "٤"
+ ],
+ "dateFormatItem-MMMMEd": "E d MMMM",
+ "dateFormatItem-MMMd": "d MMM",
+ "timeFormat-long": "z h:mm:ss a",
+ "timeFormat-short": "h:mm a",
+ "dateFormatItem-MMMMd": "d MMMM",
+ "days-format-abbr": [
+ "أحد",
+ "إثنين",
+ "ثلاثاء",
+ "أربعاء",
+ "خميس",
+ "جمعة",
+ "سبت"
+ ],
+ "dateFormatItem-M": "L",
+ "dateFormatItem-yMMMd": "d MMMM y G",
+ "dateFormat-short": "d‏/M‏/y G",
+ "dateFormatItem-yMMMEd": "EEE، d MMMM y G",
+ "dateFormat-full": "EEEE، d MMMM، y G",
+ "dateFormatItem-Md": "d/‏M",
+ "dateFormatItem-yMEd": "EEE، d/‏M/‏y G",
+ "months-format-wide": [
+ "يناير",
+ "فبراير",
+ "مارس",
+ "أبريل",
+ "مايو",
+ "يونيو",
+ "يوليو",
+ "أغسطس",
+ "سبتمبر",
+ "أكتوبر",
+ "نوفمبر",
+ "ديسمبر"
+ ],
+ "dateFormatItem-d": "d",
+ "quarters-format-wide": [
+ "الربع الأول",
+ "الربع الثاني",
+ "الربع الثالث",
+ "الربع الرابع"
+ ],
+ "eraNarrow": [
+ "التقويم البوذي"
+ ],
+ "days-format-wide": [
+ "الأحد",
+ "الإثنين",
+ "الثلاثاء",
+ "الأربعاء",
+ "الخميس",
+ "الجمعة",
+ "السبت"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ar/currency.js b/lib/dojo/cldr/nls/ar/currency.js
index 64c4cadf0..8c2ed034f 100644
--- a/lib/dojo/cldr/nls/ar/currency.js
+++ b/lib/dojo/cldr/nls/ar/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"دولار هونج كونج","CHF_displayName":"فرنك سويسري","CAD_displayName":"دولار كندي","CNY_displayName":"يوان صيني","AUD_displayName":"دولار أسترالي","JPY_displayName":"ين ياباني","USD_displayName":"دولار أمريكي","CNY_symbol":"ي.ص","GBP_displayName":"جنيه إسترليني","EUR_displayName":"يورو","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ar/currency",{"HKD_displayName":"دولار هونج كونج","CHF_displayName":"فرنك سويسري","CAD_displayName":"دولار كندي","CNY_displayName":"يوان صيني","AUD_displayName":"دولار أسترالي","JPY_displayName":"ين ياباني","USD_displayName":"دولار أمريكي","CNY_symbol":"ي.ص","GBP_displayName":"جنيه إسترليني","EUR_displayName":"يورو"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ar/currency.js.uncompressed.js b/lib/dojo/cldr/nls/ar/currency.js.uncompressed.js
new file mode 100644
index 000000000..7f26f6606
--- /dev/null
+++ b/lib/dojo/cldr/nls/ar/currency.js.uncompressed.js
@@ -0,0 +1,16 @@
+define(
+"dojo/cldr/nls/ar/currency", //begin v1.x content
+{
+ "HKD_displayName": "دولار هونج كونج",
+ "CHF_displayName": "فرنك سويسري",
+ "CAD_displayName": "دولار كندي",
+ "CNY_displayName": "يوان صيني",
+ "AUD_displayName": "دولار أسترالي",
+ "JPY_displayName": "ين ياباني",
+ "USD_displayName": "دولار أمريكي",
+ "CNY_symbol": "ي.ص",
+ "GBP_displayName": "جنيه إسترليني",
+ "EUR_displayName": "يورو"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ar/gregorian.js b/lib/dojo/cldr/nls/ar/gregorian.js
index a3d0e9ddd..745edb843 100644
--- a/lib/dojo/cldr/nls/ar/gregorian.js
+++ b/lib/dojo/cldr/nls/ar/gregorian.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"M‏/yyyy","field-dayperiod":"ص/م","dateFormatItem-yQ":"yyyy Q","dayPeriods-format-wide-pm":"م","field-minute":"الدقائق","eraNames":["قبل الميلاد","ميلادي"],"dateFormatItem-MMMEd":"E d MMM","field-day-relative+-1":"أمس","field-weekday":"اليوم","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-MMdd":"dd‏/MM","days-standAlone-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],"field-era":"العصر","field-hour":"الساعات","dayPeriods-format-wide-am":"ص","quarters-standAlone-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormatItem-y":"y","timeFormat-full":"zzzz h:mm:ss a","months-standAlone-abbr":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-Ed":"E، d","dateFormatItem-yMMM":"MMM y","field-day-relative+0":"اليوم","field-day-relative+1":"غدًا","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"eraAbbr":["ق.م","م"],"field-day-relative+2":"بعد الغد","dateFormatItem-yyyyMM":"MM‏/yyyy","dateFormatItem-yyyyMMMM":"MMMM، y","dateFormat-long":"d MMMM، y","timeFormat-medium":"h:mm:ss a","field-zone":"التوقيت","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"dd‏/MM‏/yyyy","quarters-standAlone-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormatItem-yMMMM":"MMMM y","dateFormatItem-ms":"mm:ss","field-year":"السنة","quarters-standAlone-narrow":["١","٢","٣","٤"],"field-week":"الأسبوع","months-standAlone-wide":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-MMMd":"d MMM","quarters-format-narrow":["١","٢","٣","٤"],"dateFormatItem-yyQ":"Q yy","timeFormat-long":"z h:mm:ss a","months-format-abbr":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"timeFormat-short":"h:mm a","field-month":"الشهر","dateFormatItem-MMMMd":"d MMMM","quarters-format-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormatItem-M":"L","days-format-narrow":["ح","ن","ث","ر","خ","ج","س"],"field-second":"الثواني","field-day":"يوم","months-format-narrow":["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],"days-standAlone-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormat-short":"d‏/M‏/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-Md":"d/‏M","dateFormatItem-yMEd":"EEE، d/‏M/‏yyyy","months-format-wide":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-d":"d","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"eraNarrow":["ق.م","م"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ar/gregorian",{"dateFormatItem-yM":"M/yyyy","field-dayperiod":"ص/م","dateFormatItem-yQ":"yyyy Q","dayPeriods-format-wide-pm":"م","field-minute":"الدقائق","eraNames":["قبل الميلاد","ميلادي"],"dateFormatItem-MMMEd":"E d MMM","field-day-relative+-1":"أمس","field-weekday":"اليوم","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-MMdd":"dd/MM","days-standAlone-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],"field-era":"العصر","field-hour":"الساعات","dayPeriods-format-wide-am":"ص","quarters-standAlone-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormatItem-y":"y","timeFormat-full":"zzzz h:mm:ss a","months-standAlone-abbr":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-Ed":"E، d","dateFormatItem-yMMM":"MMM y","field-day-relative+0":"اليوم","field-day-relative+1":"غدًا","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"eraAbbr":["ق.م","م"],"field-day-relative+2":"بعد الغد","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-yyyyMMMM":"MMMM، y","dateFormat-long":"d MMMM، y","timeFormat-medium":"h:mm:ss a","field-zone":"التوقيت","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"dd/MM/yyyy","quarters-standAlone-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormatItem-yMMMM":"MMMM y","dateFormatItem-ms":"mm:ss","field-year":"السنة","quarters-standAlone-narrow":["١","٢","٣","٤"],"field-week":"الأسبوع","months-standAlone-wide":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-MMMd":"d MMM","quarters-format-narrow":["١","٢","٣","٤"],"dateFormatItem-yyQ":"Q yy","timeFormat-long":"z h:mm:ss a","months-format-abbr":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"timeFormat-short":"h:mm a","field-month":"الشهر","dateFormatItem-MMMMd":"d MMMM","quarters-format-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormatItem-M":"L","days-format-narrow":["ح","ن","ث","ر","خ","ج","س"],"field-second":"الثواني","field-day":"يوم","months-format-narrow":["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],"days-standAlone-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE، d/M/yyyy","months-format-wide":["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],"dateFormatItem-d":"d","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"eraNarrow":["ق.م","م"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ar/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/ar/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..ac5786b1f
--- /dev/null
+++ b/lib/dojo/cldr/nls/ar/gregorian.js.uncompressed.js
@@ -0,0 +1,240 @@
+define(
+"dojo/cldr/nls/ar/gregorian", //begin v1.x content
+{
+ "dateFormatItem-yM": "M‏/yyyy",
+ "field-dayperiod": "ص/م",
+ "dateFormatItem-yQ": "yyyy Q",
+ "dayPeriods-format-wide-pm": "م",
+ "field-minute": "الدقائق",
+ "eraNames": [
+ "قبل الميلاد",
+ "ميلادي"
+ ],
+ "dateFormatItem-MMMEd": "E d MMM",
+ "field-day-relative+-1": "أمس",
+ "field-weekday": "اليوم",
+ "dateFormatItem-yQQQ": "y QQQ",
+ "dateFormatItem-MMdd": "dd‏/MM",
+ "days-standAlone-wide": [
+ "الأحد",
+ "الإثنين",
+ "الثلاثاء",
+ "الأربعاء",
+ "الخميس",
+ "الجمعة",
+ "السبت"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "months-standAlone-narrow": [
+ "ي",
+ "ف",
+ "م",
+ "أ",
+ "و",
+ "ن",
+ "ل",
+ "غ",
+ "س",
+ "ك",
+ "ب",
+ "د"
+ ],
+ "field-era": "العصر",
+ "field-hour": "الساعات",
+ "dayPeriods-format-wide-am": "ص",
+ "quarters-standAlone-abbr": [
+ "الربع الأول",
+ "الربع الثاني",
+ "الربع الثالث",
+ "الربع الرابع"
+ ],
+ "dateFormatItem-y": "y",
+ "timeFormat-full": "zzzz h:mm:ss a",
+ "months-standAlone-abbr": [
+ "يناير",
+ "فبراير",
+ "مارس",
+ "أبريل",
+ "مايو",
+ "يونيو",
+ "يوليو",
+ "أغسطس",
+ "سبتمبر",
+ "أكتوبر",
+ "نوفمبر",
+ "ديسمبر"
+ ],
+ "dateFormatItem-Ed": "E، d",
+ "dateFormatItem-yMMM": "MMM y",
+ "field-day-relative+0": "اليوم",
+ "field-day-relative+1": "غدًا",
+ "days-standAlone-narrow": [
+ "ح",
+ "ن",
+ "ث",
+ "ر",
+ "خ",
+ "ج",
+ "س"
+ ],
+ "eraAbbr": [
+ "ق.م",
+ "م"
+ ],
+ "field-day-relative+2": "بعد الغد",
+ "dateFormatItem-yyyyMM": "MM‏/yyyy",
+ "dateFormatItem-yyyyMMMM": "MMMM، y",
+ "dateFormat-long": "d MMMM، y",
+ "timeFormat-medium": "h:mm:ss a",
+ "field-zone": "التوقيت",
+ "dateFormatItem-Hm": "HH:mm",
+ "dateFormat-medium": "dd‏/MM‏/yyyy",
+ "quarters-standAlone-wide": [
+ "الربع الأول",
+ "الربع الثاني",
+ "الربع الثالث",
+ "الربع الرابع"
+ ],
+ "dateFormatItem-yMMMM": "MMMM y",
+ "dateFormatItem-ms": "mm:ss",
+ "field-year": "السنة",
+ "quarters-standAlone-narrow": [
+ "١",
+ "٢",
+ "٣",
+ "٤"
+ ],
+ "field-week": "الأسبوع",
+ "months-standAlone-wide": [
+ "يناير",
+ "فبراير",
+ "مارس",
+ "أبريل",
+ "مايو",
+ "يونيو",
+ "يوليو",
+ "أغسطس",
+ "سبتمبر",
+ "أكتوبر",
+ "نوفمبر",
+ "ديسمبر"
+ ],
+ "dateFormatItem-MMMMEd": "E d MMMM",
+ "dateFormatItem-MMMd": "d MMM",
+ "quarters-format-narrow": [
+ "١",
+ "٢",
+ "٣",
+ "٤"
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-long": "z h:mm:ss a",
+ "months-format-abbr": [
+ "يناير",
+ "فبراير",
+ "مارس",
+ "أبريل",
+ "مايو",
+ "يونيو",
+ "يوليو",
+ "أغسطس",
+ "سبتمبر",
+ "أكتوبر",
+ "نوفمبر",
+ "ديسمبر"
+ ],
+ "timeFormat-short": "h:mm a",
+ "field-month": "الشهر",
+ "dateFormatItem-MMMMd": "d MMMM",
+ "quarters-format-abbr": [
+ "الربع الأول",
+ "الربع الثاني",
+ "الربع الثالث",
+ "الربع الرابع"
+ ],
+ "days-format-abbr": [
+ "أحد",
+ "إثنين",
+ "ثلاثاء",
+ "أربعاء",
+ "خميس",
+ "جمعة",
+ "سبت"
+ ],
+ "dateFormatItem-M": "L",
+ "days-format-narrow": [
+ "ح",
+ "ن",
+ "ث",
+ "ر",
+ "خ",
+ "ج",
+ "س"
+ ],
+ "field-second": "الثواني",
+ "field-day": "يوم",
+ "months-format-narrow": [
+ "ي",
+ "ف",
+ "م",
+ "أ",
+ "و",
+ "ن",
+ "ل",
+ "غ",
+ "س",
+ "ك",
+ "ب",
+ "د"
+ ],
+ "days-standAlone-abbr": [
+ "أحد",
+ "إثنين",
+ "ثلاثاء",
+ "أربعاء",
+ "خميس",
+ "جمعة",
+ "سبت"
+ ],
+ "dateFormat-short": "d‏/M‏/yyyy",
+ "dateFormatItem-yMMMEd": "EEE، d MMMM y",
+ "dateFormat-full": "EEEE، d MMMM، y",
+ "dateFormatItem-Md": "d/‏M",
+ "dateFormatItem-yMEd": "EEE، d/‏M/‏yyyy",
+ "months-format-wide": [
+ "يناير",
+ "فبراير",
+ "مارس",
+ "أبريل",
+ "مايو",
+ "يونيو",
+ "يوليو",
+ "أغسطس",
+ "سبتمبر",
+ "أكتوبر",
+ "نوفمبر",
+ "ديسمبر"
+ ],
+ "dateFormatItem-d": "d",
+ "quarters-format-wide": [
+ "الربع الأول",
+ "الربع الثاني",
+ "الربع الثالث",
+ "الربع الرابع"
+ ],
+ "days-format-wide": [
+ "الأحد",
+ "الإثنين",
+ "الثلاثاء",
+ "الأربعاء",
+ "الخميس",
+ "الجمعة",
+ "السبت"
+ ],
+ "eraNarrow": [
+ "ق.م",
+ "م"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ar/hebrew.js b/lib/dojo/cldr/nls/ar/hebrew.js
index ab7071af4..68aced767 100644
--- a/lib/dojo/cldr/nls/ar/hebrew.js
+++ b/lib/dojo/cldr/nls/ar/hebrew.js
@@ -1 +1,8 @@
-({"dateFormat-medium":"dd‏/MM‏/yyyy","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-yMEd":"EEE، d/‏M/‏yyyy","timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Md":"d/‏M","months-standAlone-wide":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"months-format-wide-leap":"آذار الثاني","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"dayPeriods-format-wide-pm":"م","months-standAlone-abbr":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"dayPeriods-format-wide-am":"ص","quarters-standAlone-narrow":["١","٢","٣","٤"],"timeFormat-medium":"h:mm:ss a","dateFormat-long":"d MMMM، y","dateFormat-short":"d‏/M‏/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","months-format-wide":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"dateFormatItem-yM":"M‏/yyyy","timeFormat-short":"h:mm a","months-format-abbr":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"timeFormat-long":"z h:mm:ss a","days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-yQ":"yyyy Q","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-MMMd":"d MMM","days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"months-format-narrow":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"dateFormatItem-yQQQ":"y QQQ","months-standAlone-narrow-leap":"Adar II","eraNarrow":["AM"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr-leap":"Adar II","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"months-standAlone-wide-leap":"Adar II","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"months-format-narrow-leap":"Adar II","eraAbbr":["AM"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","months-standAlone-abbr-leap":"Adar II","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","eraNames":["AM"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ar/hebrew",{"dateFormat-medium":"dd/MM/yyyy","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-yMEd":"EEE، d/M/yyyy","timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Md":"d/M","months-standAlone-wide":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"months-format-wide-leap":"آذار الثاني","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"dayPeriods-format-wide-pm":"م","months-standAlone-abbr":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"dayPeriods-format-wide-am":"ص","quarters-standAlone-narrow":["١","٢","٣","٤"],"timeFormat-medium":"h:mm:ss a","dateFormat-long":"d MMMM، y","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","months-format-wide":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"dateFormatItem-yM":"M/yyyy","timeFormat-short":"h:mm a","months-format-abbr":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول"],"timeFormat-long":"z h:mm:ss a","days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-yQ":"yyyy Q","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-MMMd":"d MMM","days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ar/hebrew.js.uncompressed.js b/lib/dojo/cldr/nls/ar/hebrew.js.uncompressed.js
new file mode 100644
index 000000000..6bb1fc3e9
--- /dev/null
+++ b/lib/dojo/cldr/nls/ar/hebrew.js.uncompressed.js
@@ -0,0 +1,124 @@
+define(
+"dojo/cldr/nls/ar/hebrew", //begin v1.x content
+{
+ "dateFormat-medium": "dd/MM/yyyy",
+ "dateFormatItem-MMMEd": "E d MMM",
+ "dateFormatItem-yMEd": "EEE، d/M/yyyy",
+ "timeFormat-full": "zzzz h:mm:ss a",
+ "dateFormatItem-Md": "d/M",
+ "months-standAlone-wide": [
+ "تشري",
+ "مرحشوان",
+ "كيسلو",
+ "طيفت",
+ "شباط",
+ "آذار الأول",
+ "آذار",
+ "نيسان",
+ "أيار",
+ "سيفان",
+ "تموز",
+ "آب",
+ "أيلول"
+ ],
+ "months-format-wide-leap": "آذار الثاني",
+ "days-standAlone-narrow": [
+ "ح",
+ "ن",
+ "ث",
+ "ر",
+ "خ",
+ "ج",
+ "س"
+ ],
+ "dayPeriods-format-wide-pm": "م",
+ "months-standAlone-abbr": [
+ "تشري",
+ "مرحشوان",
+ "كيسلو",
+ "طيفت",
+ "شباط",
+ "آذار الأول",
+ "آذار",
+ "نيسان",
+ "أيار",
+ "سيفان",
+ "تموز",
+ "آب",
+ "أيلول"
+ ],
+ "dayPeriods-format-wide-am": "ص",
+ "quarters-standAlone-narrow": [
+ "١",
+ "٢",
+ "٣",
+ "٤"
+ ],
+ "timeFormat-medium": "h:mm:ss a",
+ "dateFormat-long": "d MMMM، y",
+ "dateFormat-short": "d/M/yyyy",
+ "dateFormatItem-yMMMEd": "EEE، d MMMM y",
+ "months-format-wide": [
+ "تشري",
+ "مرحشوان",
+ "كيسلو",
+ "طيفت",
+ "شباط",
+ "آذار الأول",
+ "آذار",
+ "نيسان",
+ "أيار",
+ "سيفان",
+ "تموز",
+ "آب",
+ "أيلول"
+ ],
+ "dateFormatItem-yM": "M/yyyy",
+ "timeFormat-short": "h:mm a",
+ "months-format-abbr": [
+ "تشري",
+ "مرحشوان",
+ "كيسلو",
+ "طيفت",
+ "شباط",
+ "آذار الأول",
+ "آذار",
+ "نيسان",
+ "أيار",
+ "سيفان",
+ "تموز",
+ "آب",
+ "أيلول"
+ ],
+ "timeFormat-long": "z h:mm:ss a",
+ "days-format-wide": [
+ "الأحد",
+ "الإثنين",
+ "الثلاثاء",
+ "الأربعاء",
+ "الخميس",
+ "الجمعة",
+ "السبت"
+ ],
+ "dateFormatItem-yQ": "yyyy Q",
+ "dateFormatItem-yMMM": "MMM y",
+ "quarters-format-wide": [
+ "الربع الأول",
+ "الربع الثاني",
+ "الربع الثالث",
+ "الربع الرابع"
+ ],
+ "dateFormat-full": "EEEE، d MMMM، y",
+ "dateFormatItem-MMMd": "d MMM",
+ "days-format-abbr": [
+ "أحد",
+ "إثنين",
+ "ثلاثاء",
+ "أربعاء",
+ "خميس",
+ "جمعة",
+ "سبت"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ar/islamic-civil.js b/lib/dojo/cldr/nls/ar/islamic-civil.js
deleted file mode 100644
index bfbc2185b..000000000
--- a/lib/dojo/cldr/nls/ar/islamic-civil.js
+++ /dev/null
@@ -1 +0,0 @@
-({"dateFormatItem-yM":"M‏/yyyy","dateFormatItem-yQ":"yyyy Q","dayPeriods-format-wide-pm":"م","eraNames":["ه"],"dateFormatItem-MMMEd":"E d MMM","days-standAlone-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"patternChars":"GanjkHmsSEDFwWxhKzAeugXZvcL","months-standAlone-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"dayPeriods-format-wide-am":"ص","dayPeriods-am-format-wide":"ص","quarters-standAlone-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"timeFormat-full":"zzzz h:mm:ss a","dayPeriods-pm-format-wide":"م","dayPeriods-format-wide":["ص","م"],"months-standAlone-abbr":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dateFormatItem-yMMM":"MMM y","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"eraAbbr":["ه"],"dateFormat-long":"d MMMM، y","timeFormat-medium":"h:mm:ss a","dateFormat-medium":"dd‏/MM‏/yyyy","dayPeriods-format-narrow":["ص","م"],"quarters-standAlone-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormatItem-yMMMM":"MMMM y","quarters-standAlone-narrow":["١","٢","٣","٤"],"months-standAlone-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-MMMd":"d MMM","quarters-format-narrow":["١","٢","٣","٤"],"timeFormat-long":"z h:mm:ss a","months-format-abbr":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"timeFormat-short":"h:mm a","dateFormatItem-MMMMd":"d MMMM","quarters-format-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"days-format-narrow":["ح","ن","ث","ر","خ","ج","س"],"months-format-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"days-standAlone-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormat-short":"d‏/M‏/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-Md":"d/‏M","dateFormatItem-yMEd":"EEE، d/‏M/‏yyyy","months-format-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dayPeriods-format-abbr":["ص","م"],"quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"eraNarrow":["ه"]}) \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ar/islamic.js b/lib/dojo/cldr/nls/ar/islamic.js
index 3bdbf9df3..41ce00bfd 100644
--- a/lib/dojo/cldr/nls/ar/islamic.js
+++ b/lib/dojo/cldr/nls/ar/islamic.js
@@ -1 +1,8 @@
-({"dateFormat-medium":"dd‏/MM‏/yyyy","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-yMEd":"EEE، d/‏M/‏yyyy","eraNarrow":["هـ"],"months-format-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Md":"d/‏M","months-standAlone-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"months-standAlone-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"eraNames":["هـ"],"days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"dayPeriods-format-wide-pm":"م","months-standAlone-abbr":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dayPeriods-format-wide-am":"ص","quarters-standAlone-narrow":["١","٢","٣","٤"],"timeFormat-medium":"h:mm:ss a","dateFormat-long":"d MMMM، y","dateFormat-short":"d‏/M‏/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","months-format-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dateFormatItem-yM":"M‏/yyyy","timeFormat-short":"h:mm a","months-format-abbr":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"eraAbbr":["هـ"],"timeFormat-long":"z h:mm:ss a","days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-yQ":"yyyy Q","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-MMMd":"d MMM","days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],"dateFormatItem-yQQQ":"y QQQ","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ar/islamic",{"dateFormat-medium":"dd/MM/yyyy","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-yMEd":"EEE، d/M/yyyy","eraNarrow":["هـ"],"months-format-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Md":"d/M","months-standAlone-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"months-standAlone-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"eraNames":["هـ"],"days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"dayPeriods-format-wide-pm":"م","months-standAlone-abbr":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dayPeriods-format-wide-am":"ص","quarters-standAlone-narrow":["١","٢","٣","٤"],"timeFormat-medium":"h:mm:ss a","dateFormat-long":"d MMMM، y","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE، d MMMM y","months-format-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dateFormatItem-yM":"M/yyyy","timeFormat-short":"h:mm a","months-format-abbr":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"eraAbbr":["هـ"],"timeFormat-long":"z h:mm:ss a","days-format-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-yQ":"yyyy Q","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormat-full":"EEEE، d MMMM، y","dateFormatItem-MMMd":"d MMM","days-format-abbr":["أحد","إثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ar/islamic.js.uncompressed.js b/lib/dojo/cldr/nls/ar/islamic.js.uncompressed.js
new file mode 100644
index 000000000..4d816d11a
--- /dev/null
+++ b/lib/dojo/cldr/nls/ar/islamic.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/cldr/nls/ar/islamic", //begin v1.x content
+{
+ "dateFormat-medium": "dd/MM/yyyy",
+ "dateFormatItem-MMMEd": "E d MMM",
+ "dateFormatItem-yMEd": "EEE، d/M/yyyy",
+ "eraNarrow": [
+ "هـ"
+ ],
+ "months-format-narrow": [
+ "م",
+ "ص",
+ "ر",
+ "ر",
+ "ج",
+ "ج",
+ "ر",
+ "ش",
+ "ر",
+ "ش",
+ "ذ",
+ "ذ"
+ ],
+ "timeFormat-full": "zzzz h:mm:ss a",
+ "dateFormatItem-Md": "d/M",
+ "months-standAlone-narrow": [
+ "م",
+ "ص",
+ "ر",
+ "ر",
+ "ج",
+ "ج",
+ "ر",
+ "ش",
+ "ر",
+ "ش",
+ "ذ",
+ "ذ"
+ ],
+ "months-standAlone-wide": [
+ "محرم",
+ "صفر",
+ "ربيع الأول",
+ "ربيع الآخر",
+ "جمادى الأولى",
+ "جمادى الآخرة",
+ "رجب",
+ "شعبان",
+ "رمضان",
+ "شوال",
+ "ذو القعدة",
+ "ذو الحجة"
+ ],
+ "eraNames": [
+ "هـ"
+ ],
+ "days-standAlone-narrow": [
+ "ح",
+ "ن",
+ "ث",
+ "ر",
+ "خ",
+ "ج",
+ "س"
+ ],
+ "dayPeriods-format-wide-pm": "م",
+ "months-standAlone-abbr": [
+ "محرم",
+ "صفر",
+ "ربيع الأول",
+ "ربيع الآخر",
+ "جمادى الأولى",
+ "جمادى الآخرة",
+ "رجب",
+ "شعبان",
+ "رمضان",
+ "شوال",
+ "ذو القعدة",
+ "ذو الحجة"
+ ],
+ "dayPeriods-format-wide-am": "ص",
+ "quarters-standAlone-narrow": [
+ "١",
+ "٢",
+ "٣",
+ "٤"
+ ],
+ "timeFormat-medium": "h:mm:ss a",
+ "dateFormat-long": "d MMMM، y",
+ "dateFormat-short": "d/M/yyyy",
+ "dateFormatItem-yMMMEd": "EEE، d MMMM y",
+ "months-format-wide": [
+ "محرم",
+ "صفر",
+ "ربيع الأول",
+ "ربيع الآخر",
+ "جمادى الأولى",
+ "جمادى الآخرة",
+ "رجب",
+ "شعبان",
+ "رمضان",
+ "شوال",
+ "ذو القعدة",
+ "ذو الحجة"
+ ],
+ "dateFormatItem-yM": "M/yyyy",
+ "timeFormat-short": "h:mm a",
+ "months-format-abbr": [
+ "محرم",
+ "صفر",
+ "ربيع الأول",
+ "ربيع الآخر",
+ "جمادى الأولى",
+ "جمادى الآخرة",
+ "رجب",
+ "شعبان",
+ "رمضان",
+ "شوال",
+ "ذو القعدة",
+ "ذو الحجة"
+ ],
+ "eraAbbr": [
+ "هـ"
+ ],
+ "timeFormat-long": "z h:mm:ss a",
+ "days-format-wide": [
+ "الأحد",
+ "الإثنين",
+ "الثلاثاء",
+ "الأربعاء",
+ "الخميس",
+ "الجمعة",
+ "السبت"
+ ],
+ "dateFormatItem-yQ": "yyyy Q",
+ "dateFormatItem-yMMM": "MMM y",
+ "quarters-format-wide": [
+ "الربع الأول",
+ "الربع الثاني",
+ "الربع الثالث",
+ "الربع الرابع"
+ ],
+ "dateFormat-full": "EEEE، d MMMM، y",
+ "dateFormatItem-MMMd": "d MMM",
+ "days-format-abbr": [
+ "أحد",
+ "إثنين",
+ "ثلاثاء",
+ "أربعاء",
+ "خميس",
+ "جمعة",
+ "سبت"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ar/number.js b/lib/dojo/cldr/nls/ar/number.js
index e9a48164a..1ad99c8b8 100644
--- a/lib/dojo/cldr/nls/ar/number.js
+++ b/lib/dojo/cldr/nls/ar/number.js
@@ -1 +1,8 @@
-({"group":"٬","percentSign":"٪","exponential":"اس","list":"؛","infinity":"∞","minusSign":"-","decimal":"٫","nan":"ليس رقم","perMille":"؉","decimalFormat":"#,##0.###;#,##0.###-","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nativeZeroDigit":"0","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","percentFormat":"#,##0%","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ar/number",{"group":"٬","percentSign":"٪","exponential":"اس","list":"؛","infinity":"∞","minusSign":"-","decimal":"٫","nan":"ليس رقم","perMille":"؉","decimalFormat":"#,##0.###;#,##0.###-","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ar/number.js.uncompressed.js b/lib/dojo/cldr/nls/ar/number.js.uncompressed.js
new file mode 100644
index 000000000..9d98cfc37
--- /dev/null
+++ b/lib/dojo/cldr/nls/ar/number.js.uncompressed.js
@@ -0,0 +1,18 @@
+define(
+"dojo/cldr/nls/ar/number", //begin v1.x content
+{
+ "group": "٬",
+ "percentSign": "٪",
+ "exponential": "اس",
+ "list": "؛",
+ "infinity": "∞",
+ "minusSign": "-",
+ "decimal": "٫",
+ "nan": "ليس رقم",
+ "perMille": "؉",
+ "decimalFormat": "#,##0.###;#,##0.###-",
+ "currencyFormat": "¤ #,##0.00;¤ #,##0.00-",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/buddhist.js b/lib/dojo/cldr/nls/buddhist.js
index 6a70be9ad..5229790a6 100644
--- a/lib/dojo/cldr/nls/buddhist.js
+++ b/lib/dojo/cldr/nls/buddhist.js
@@ -1 +1,8 @@
-({"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["BE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"MMMM d, y G","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, MMMM d, y G","dateFormatItem-Md":"M-d","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yM":"y-M","months-standAlone-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","quarters-format-wide":["Q1","Q2","Q3","Q4"],"timeFormat-long":"HH:mm:ss z","dateFormatItem-yMMM":"y MMM","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["BE"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MMMd":"MMM d","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","days-format-wide":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":["1","2","3","4","5","6","7"],"eraNames":["BE"],"days-format-narrow":["1","2","3","4","5","6","7"],"days-standAlone-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-short":"M/d/yyyy","dateFormatItem-yMMMEd":"EEE, y MMM d","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormat-medium":"MMM d, y G","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/buddhist",{root:{"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["BE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"MMMM d, y G","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, MMMM d, y G","dateFormatItem-Md":"M-d","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yM":"y-M","months-standAlone-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","quarters-format-wide":["Q1","Q2","Q3","Q4"],"timeFormat-long":"HH:mm:ss z","dateFormatItem-yMMM":"y MMM","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["BE"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MMMd":"MMM d","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","days-format-wide":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":["1","2","3","4","5","6","7"],"eraNames":["BE"],"days-format-narrow":["1","2","3","4","5","6","7"],"days-standAlone-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-short":"M/d/yyyy","dateFormatItem-yMMMEd":"EEE, y MMM d","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormat-medium":"MMM d, y G","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"},"ar":true,"da":true,"de":true,"el":true,"en":true,"en-gb":true,"es":true,"fi":true,"fr":true,"hu":true,"it":true,"ja":true,"ko":true,"nb":true,"nl":true,"pl":true,"pt":true,"pt-pt":true,"ro":true,"ru":true,"sv":true,"th":true,"tr":true,"zh":true,"zh-hant":true}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/buddhist.js.uncompressed.js b/lib/dojo/cldr/nls/buddhist.js.uncompressed.js
new file mode 100644
index 000000000..0d259c65f
--- /dev/null
+++ b/lib/dojo/cldr/nls/buddhist.js.uncompressed.js
@@ -0,0 +1,267 @@
+define("dojo/cldr/nls/buddhist", { root:
+
+//begin v1.x content
+{
+ "months-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "quarters-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4"
+ ],
+ "dateFormatItem-yQQQ": "y QQQ",
+ "dateFormatItem-yMEd": "EEE, y-M-d",
+ "dateFormatItem-MMMEd": "E MMM d",
+ "eraNarrow": [
+ "BE"
+ ],
+ "dateTimeFormats-appendItem-Day-Of-Week": "{0} {1}",
+ "dateFormat-long": "MMMM d, y G",
+ "months-format-wide": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dateTimeFormat-medium": "{1} {0}",
+ "dateFormatItem-EEEd": "d EEE",
+ "dayPeriods-format-wide-pm": "PM",
+ "dateFormat-full": "EEEE, MMMM d, y G",
+ "dateFormatItem-Md": "M-d",
+ "dayPeriods-format-abbr-am": "AM",
+ "dateTimeFormats-appendItem-Second": "{0} ({2}: {1})",
+ "dateFormatItem-yM": "y-M",
+ "months-standAlone-wide": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "dateFormatItem-yMMM": "y MMM",
+ "dateFormatItem-yQ": "y Q",
+ "dateTimeFormats-appendItem-Era": "{0} {1}",
+ "months-format-abbr": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "dateTimeFormats-appendItem-Week": "{0} ({2}: {1})",
+ "dateFormatItem-H": "HH",
+ "months-standAlone-abbr": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "quarters-format-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "quarters-standAlone-wide": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "eraAbbr": [
+ "BE"
+ ],
+ "days-standAlone-abbr": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "quarters-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4"
+ ],
+ "dateFormatItem-h": "h a",
+ "dateTimeFormat-long": "{1} {0}",
+ "dayPeriods-format-narrow-am": "AM",
+ "dateFormatItem-MMMd": "MMM d",
+ "dateFormatItem-MEd": "E, M-d",
+ "dateTimeFormat-full": "{1} {0}",
+ "days-format-wide": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "dateTimeFormats-appendItem-Day": "{0} ({2}: {1})",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dateFormatItem-hm": "h:mm a",
+ "dateTimeFormats-appendItem-Year": "{0} {1}",
+ "dateTimeFormats-appendItem-Hour": "{0} ({2}: {1})",
+ "dayPeriods-format-abbr-pm": "PM",
+ "days-format-abbr": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "eraNames": [
+ "BE"
+ ],
+ "days-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "days-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dateTimeFormats-appendItem-Quarter": "{0} ({2}: {1})",
+ "dayPeriods-format-wide-am": "AM",
+ "dateTimeFormats-appendItem-Month": "{0} ({2}: {1})",
+ "dateTimeFormats-appendItem-Minute": "{0} ({2}: {1})",
+ "dateFormat-short": "M/d/yyyy",
+ "dateFormatItem-yMMMEd": "EEE, y MMM d",
+ "dateTimeFormats-appendItem-Timezone": "{0} {1}",
+ "dateFormat-medium": "MMM d, y G",
+ "dayPeriods-format-narrow-pm": "PM",
+ "dateTimeFormat-short": "{1} {0}",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-hms": "h:mm:ss a"
+}
+//end v1.x content
+,
+ "ar": true,
+ "da": true,
+ "de": true,
+ "el": true,
+ "en": true,
+ "en-gb": true,
+ "es": true,
+ "fi": true,
+ "fr": true,
+ "hu": true,
+ "it": true,
+ "ja": true,
+ "ko": true,
+ "nb": true,
+ "nl": true,
+ "pl": true,
+ "pt": true,
+ "pt-pt": true,
+ "ro": true,
+ "ru": true,
+ "sv": true,
+ "th": true,
+ "tr": true,
+ "zh": true,
+ "zh-hant": true
+}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ca/currency.js b/lib/dojo/cldr/nls/ca/currency.js
index e23636787..cefc8c05f 100644
--- a/lib/dojo/cldr/nls/ca/currency.js
+++ b/lib/dojo/cldr/nls/ca/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"dòlar de Hong Kong","CHF_displayName":"franc suís","CAD_displayName":"dòlar canadenc","CNY_displayName":"iuan renmimbi xinès","AUD_displayName":"dòlar australià","JPY_displayName":"ien japonès","USD_displayName":"dòlar dels Estats Units","GBP_displayName":"lliura esterlina britànica","EUR_displayName":"euro","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ca/currency",{"HKD_displayName":"dòlar de Hong Kong","CHF_displayName":"franc suís","CAD_displayName":"dòlar canadenc","CNY_displayName":"iuan renmimbi xinès","AUD_displayName":"dòlar australià","JPY_displayName":"ien japonès","USD_displayName":"dòlar dels Estats Units","GBP_displayName":"lliura esterlina britànica","EUR_displayName":"euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ca/currency.js.uncompressed.js b/lib/dojo/cldr/nls/ca/currency.js.uncompressed.js
new file mode 100644
index 000000000..e53a44766
--- /dev/null
+++ b/lib/dojo/cldr/nls/ca/currency.js.uncompressed.js
@@ -0,0 +1,15 @@
+define(
+"dojo/cldr/nls/ca/currency", //begin v1.x content
+{
+ "HKD_displayName": "dòlar de Hong Kong",
+ "CHF_displayName": "franc suís",
+ "CAD_displayName": "dòlar canadenc",
+ "CNY_displayName": "iuan renmimbi xinès",
+ "AUD_displayName": "dòlar australià",
+ "JPY_displayName": "ien japonès",
+ "USD_displayName": "dòlar dels Estats Units",
+ "GBP_displayName": "lliura esterlina britànica",
+ "EUR_displayName": "euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ca/gregorian.js b/lib/dojo/cldr/nls/ca/gregorian.js
index 2d6a2e163..57f099b25 100644
--- a/lib/dojo/cldr/nls/ca/gregorian.js
+++ b/lib/dojo/cldr/nls/ca/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["g","f","m","a","m","j","j","a","s","o","n","d"],"field-weekday":"dia de la setmana","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d/M/yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["aC","dC"],"dateFormat-long":"d MMMM 'de' y","months-format-wide":["de gener","de febrer","de març","d’abril","de maig","de juny","de juliol","d’agost","de setembre","d’octubre","de novembre","de desembre"],"dateFormatItem-EEEd":"EEE d","dayPeriods-format-wide-pm":"p.m.","dateFormat-full":"EEEE d MMMM 'de' y","dateFormatItem-Md":"d/M","field-era":"era","dateFormatItem-yM":"M/yyyy","months-standAlone-wide":["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],"timeFormat-short":"H:mm","quarters-format-wide":["1r trimestre","2n trimestre","3r trimestre","4t trimestre"],"timeFormat-long":"H:mm:ss z","field-year":"any","dateFormatItem-yMMM":"LLL y","dateFormatItem-yQ":"Q yyyy","field-hour":"hora","months-format-abbr":["de gen.","de febr.","de març","d’abr.","de maig","de juny","de jul.","d’ag.","de set.","d’oct.","de nov.","de des."],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"H:mm:ss zzzz","field-day-relative+0":"avui","field-day-relative+1":"demà","field-day-relative+2":"demà passat","dateFormatItem-H":"H","field-day-relative+3":"d'aquí a tres dies","months-standAlone-abbr":["gen.","febr.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des."],"quarters-format-abbr":["1T","2T","3T","4T"],"quarters-standAlone-wide":["1r trimestre","2n trimestre","3r trimestre","4t trimestre"],"dateFormatItem-M":"L","days-standAlone-wide":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"dateFormatItem-MMMMd":"d MMMM","timeFormat-medium":"H:mm:ss","dateFormatItem-Hm":"H:mm","quarters-standAlone-abbr":["1T","2T","3T","4T"],"eraAbbr":["aC","dC"],"field-minute":"minut","field-dayperiod":"a.m./p.m.","days-standAlone-abbr":["dg","dl","dt","dc","dj","dv","ds"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"ahir","field-day-relative+-2":"abans d'ahir","field-day-relative+-3":"fa tres dies","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d/M","dateFormatItem-yMMMM":"LLLL 'del' y","field-day":"dia","days-format-wide":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"field-zone":"zona","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["g","f","m","a","m","j","j","a","s","o","n","d"],"dateFormatItem-hm":"h:mm a","days-format-abbr":["dg.","dl.","dt.","dc.","dj.","dv.","ds."],"eraNames":["aC","dC"],"days-format-narrow":["g","l","t","c","j","v","s"],"field-month":"mes","days-standAlone-narrow":["g","l","t","c","j","v","s"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"a.m.","dateFormatItem-MMMMEd":"E d MMMM","dateFormat-short":"dd/MM/yy","field-second":"segon","dateFormatItem-yMMMEd":"EEE d MMM y","field-week":"setmana","dateFormat-medium":"dd/MM/yyyy","dateFormatItem-mmss":"mm:ss","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"h:mm:ss a","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ca/gregorian",{"months-format-narrow":["g","f","m","a","m","j","j","a","s","o","n","d"],"field-weekday":"dia de la setmana","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"E d/M/yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["aC","dC"],"dateFormat-long":"d MMMM 'de' y","months-format-wide":["de gener","de febrer","de març","d’abril","de maig","de juny","de juliol","d’agost","de setembre","d’octubre","de novembre","de desembre"],"dateFormatItem-EEEd":"EEE d","dayPeriods-format-wide-pm":"p.m.","dateFormat-full":"EEEE d MMMM 'de' y","dateFormatItem-Md":"d/M","field-era":"era","dateFormatItem-yM":"M/yyyy","months-standAlone-wide":["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],"timeFormat-short":"H:mm","quarters-format-wide":["1r trimestre","2n trimestre","3r trimestre","4t trimestre"],"timeFormat-long":"H:mm:ss z","field-year":"any","dateFormatItem-yMMM":"LLL y","dateFormatItem-yQ":"Q yyyy","field-hour":"hora","months-format-abbr":["de gen.","de febr.","de març","d’abr.","de maig","de juny","de jul.","d’ag.","de set.","d’oct.","de nov.","de des."],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"H:mm:ss zzzz","field-day-relative+0":"avui","field-day-relative+1":"demà","field-day-relative+2":"demà passat","dateFormatItem-H":"H","field-day-relative+3":"d'aquí a tres dies","months-standAlone-abbr":["gen.","febr.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des."],"quarters-format-abbr":["1T","2T","3T","4T"],"quarters-standAlone-wide":["1r trimestre","2n trimestre","3r trimestre","4t trimestre"],"dateFormatItem-M":"L","days-standAlone-wide":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"dateFormatItem-MMMMd":"d MMMM","timeFormat-medium":"H:mm:ss","dateFormatItem-Hm":"H:mm","quarters-standAlone-abbr":["1T","2T","3T","4T"],"eraAbbr":["aC","dC"],"field-minute":"minut","field-dayperiod":"a.m./p.m.","days-standAlone-abbr":["dg","dl","dt","dc","dj","dv","ds"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"ahir","field-day-relative+-2":"abans d'ahir","field-day-relative+-3":"fa tres dies","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d/M","dateFormatItem-yMMMM":"LLLL 'del' y","field-day":"dia","days-format-wide":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"field-zone":"zona","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["g","f","m","a","m","j","j","a","s","o","n","d"],"dateFormatItem-hm":"h:mm a","days-format-abbr":["dg.","dl.","dt.","dc.","dj.","dv.","ds."],"eraNames":["aC","dC"],"days-format-narrow":["g","l","t","c","j","v","s"],"field-month":"mes","days-standAlone-narrow":["g","l","t","c","j","v","s"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"a.m.","dateFormatItem-MMMMEd":"E d MMMM","dateFormat-short":"dd/MM/yy","field-second":"segon","dateFormatItem-yMMMEd":"EEE d MMM y","field-week":"setmana","dateFormat-medium":"dd/MM/yyyy","dateFormatItem-mmss":"mm:ss","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"h:mm:ss a"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ca/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/ca/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..d370408c2
--- /dev/null
+++ b/lib/dojo/cldr/nls/ca/gregorian.js.uncompressed.js
@@ -0,0 +1,235 @@
+define(
+"dojo/cldr/nls/ca/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "g",
+ "f",
+ "m",
+ "a",
+ "m",
+ "j",
+ "j",
+ "a",
+ "s",
+ "o",
+ "n",
+ "d"
+ ],
+ "field-weekday": "dia de la setmana",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yMEd": "E d/M/yyyy",
+ "dateFormatItem-MMMEd": "E d MMM",
+ "eraNarrow": [
+ "aC",
+ "dC"
+ ],
+ "dateFormat-long": "d MMMM 'de' y",
+ "months-format-wide": [
+ "de gener",
+ "de febrer",
+ "de març",
+ "d’abril",
+ "de maig",
+ "de juny",
+ "de juliol",
+ "d’agost",
+ "de setembre",
+ "d’octubre",
+ "de novembre",
+ "de desembre"
+ ],
+ "dateFormatItem-EEEd": "EEE d",
+ "dayPeriods-format-wide-pm": "p.m.",
+ "dateFormat-full": "EEEE d MMMM 'de' y",
+ "dateFormatItem-Md": "d/M",
+ "field-era": "era",
+ "dateFormatItem-yM": "M/yyyy",
+ "months-standAlone-wide": [
+ "gener",
+ "febrer",
+ "març",
+ "abril",
+ "maig",
+ "juny",
+ "juliol",
+ "agost",
+ "setembre",
+ "octubre",
+ "novembre",
+ "desembre"
+ ],
+ "timeFormat-short": "H:mm",
+ "quarters-format-wide": [
+ "1r trimestre",
+ "2n trimestre",
+ "3r trimestre",
+ "4t trimestre"
+ ],
+ "timeFormat-long": "H:mm:ss z",
+ "field-year": "any",
+ "dateFormatItem-yMMM": "LLL y",
+ "dateFormatItem-yQ": "Q yyyy",
+ "field-hour": "hora",
+ "months-format-abbr": [
+ "de gen.",
+ "de febr.",
+ "de març",
+ "d’abr.",
+ "de maig",
+ "de juny",
+ "de jul.",
+ "d’ag.",
+ "de set.",
+ "d’oct.",
+ "de nov.",
+ "de des."
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "H:mm:ss zzzz",
+ "field-day-relative+0": "avui",
+ "field-day-relative+1": "demà",
+ "field-day-relative+2": "demà passat",
+ "dateFormatItem-H": "H",
+ "field-day-relative+3": "d'aquí a tres dies",
+ "months-standAlone-abbr": [
+ "gen.",
+ "febr.",
+ "març",
+ "abr.",
+ "maig",
+ "juny",
+ "jul.",
+ "ag.",
+ "set.",
+ "oct.",
+ "nov.",
+ "des."
+ ],
+ "quarters-format-abbr": [
+ "1T",
+ "2T",
+ "3T",
+ "4T"
+ ],
+ "quarters-standAlone-wide": [
+ "1r trimestre",
+ "2n trimestre",
+ "3r trimestre",
+ "4t trimestre"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "diumenge",
+ "dilluns",
+ "dimarts",
+ "dimecres",
+ "dijous",
+ "divendres",
+ "dissabte"
+ ],
+ "dateFormatItem-MMMMd": "d MMMM",
+ "timeFormat-medium": "H:mm:ss",
+ "dateFormatItem-Hm": "H:mm",
+ "quarters-standAlone-abbr": [
+ "1T",
+ "2T",
+ "3T",
+ "4T"
+ ],
+ "eraAbbr": [
+ "aC",
+ "dC"
+ ],
+ "field-minute": "minut",
+ "field-dayperiod": "a.m./p.m.",
+ "days-standAlone-abbr": [
+ "dg",
+ "dl",
+ "dt",
+ "dc",
+ "dj",
+ "dv",
+ "ds"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "ahir",
+ "field-day-relative+-2": "abans d'ahir",
+ "field-day-relative+-3": "fa tres dies",
+ "dateFormatItem-MMMd": "d MMM",
+ "dateFormatItem-MEd": "E d/M",
+ "dateFormatItem-yMMMM": "LLLL 'del' y",
+ "field-day": "dia",
+ "days-format-wide": [
+ "diumenge",
+ "dilluns",
+ "dimarts",
+ "dimecres",
+ "dijous",
+ "divendres",
+ "dissabte"
+ ],
+ "field-zone": "zona",
+ "dateFormatItem-yyyyMM": "MM/yyyy",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "g",
+ "f",
+ "m",
+ "a",
+ "m",
+ "j",
+ "j",
+ "a",
+ "s",
+ "o",
+ "n",
+ "d"
+ ],
+ "dateFormatItem-hm": "h:mm a",
+ "days-format-abbr": [
+ "dg.",
+ "dl.",
+ "dt.",
+ "dc.",
+ "dj.",
+ "dv.",
+ "ds."
+ ],
+ "eraNames": [
+ "aC",
+ "dC"
+ ],
+ "days-format-narrow": [
+ "g",
+ "l",
+ "t",
+ "c",
+ "j",
+ "v",
+ "s"
+ ],
+ "field-month": "mes",
+ "days-standAlone-narrow": [
+ "g",
+ "l",
+ "t",
+ "c",
+ "j",
+ "v",
+ "s"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "a.m.",
+ "dateFormatItem-MMMMEd": "E d MMMM",
+ "dateFormat-short": "dd/MM/yy",
+ "field-second": "segon",
+ "dateFormatItem-yMMMEd": "EEE d MMM y",
+ "field-week": "setmana",
+ "dateFormat-medium": "dd/MM/yyyy",
+ "dateFormatItem-mmss": "mm:ss",
+ "dateFormatItem-Hms": "H:mm:ss",
+ "dateFormatItem-hms": "h:mm:ss a"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ca/number.js b/lib/dojo/cldr/nls/ca/number.js
index 4f0befd38..92438fc9a 100644
--- a/lib/dojo/cldr/nls/ca/number.js
+++ b/lib/dojo/cldr/nls/ca/number.js
@@ -1 +1,8 @@
-({"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ca/number",{"group":".","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0%","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ca/number.js.uncompressed.js b/lib/dojo/cldr/nls/ca/number.js.uncompressed.js
new file mode 100644
index 000000000..f093c364e
--- /dev/null
+++ b/lib/dojo/cldr/nls/ca/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/ca/number", //begin v1.x content
+{
+ "group": ".",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/cs/currency.js b/lib/dojo/cldr/nls/cs/currency.js
index b3b785909..78a372948 100644
--- a/lib/dojo/cldr/nls/cs/currency.js
+++ b/lib/dojo/cldr/nls/cs/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Dolar hongkongský","CHF_displayName":"Frank švýcarský","CAD_displayName":"Dolar kanadský","CNY_displayName":"Juan renminbi","AUD_displayName":"Dolar australský","JPY_displayName":"Jen","USD_displayName":"Dolar americký","GBP_displayName":"Libra šterlinků","EUR_displayName":"Euro","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/cs/currency",{"HKD_displayName":"Dolar hongkongský","CHF_displayName":"Frank švýcarský","CAD_displayName":"Dolar kanadský","CNY_displayName":"Juan renminbi","AUD_displayName":"Dolar australský","JPY_displayName":"Jen","USD_displayName":"Dolar americký","GBP_displayName":"Libra šterlinků","EUR_displayName":"Euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/cs/currency.js.uncompressed.js b/lib/dojo/cldr/nls/cs/currency.js.uncompressed.js
new file mode 100644
index 000000000..db8dced7d
--- /dev/null
+++ b/lib/dojo/cldr/nls/cs/currency.js.uncompressed.js
@@ -0,0 +1,15 @@
+define(
+"dojo/cldr/nls/cs/currency", //begin v1.x content
+{
+ "HKD_displayName": "Dolar hongkongský",
+ "CHF_displayName": "Frank švýcarský",
+ "CAD_displayName": "Dolar kanadský",
+ "CNY_displayName": "Juan renminbi",
+ "AUD_displayName": "Dolar australský",
+ "JPY_displayName": "Jen",
+ "USD_displayName": "Dolar americký",
+ "GBP_displayName": "Libra šterlinků",
+ "EUR_displayName": "Euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/cs/gregorian.js b/lib/dojo/cldr/nls/cs/gregorian.js
index d7abc9b5e..6b9fe0bfb 100644
--- a/lib/dojo/cldr/nls/cs/gregorian.js
+++ b/lib/dojo/cldr/nls/cs/gregorian.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"M.y","dateFormatItem-yQ":"Q yyyy","dayPeriods-format-wide-pm":"odp.","eraNames":["př.Kr.","po Kr."],"dateFormatItem-MMMEd":"E, d. MMM","field-day-relative+-1":"Včera","dateFormatItem-yQQQ":"QQQ y","field-day-relative+-2":"Předevčírem","days-standAlone-wide":["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],"months-standAlone-narrow":["l","ú","b","d","k","č","č","s","z","ř","l","p"],"dayPeriods-format-wide-am":"dop.","quarters-standAlone-abbr":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"timeFormat-full":"H:mm:ss zzzz","dateFormatItem-yyyy":"y","months-standAlone-abbr":["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.","11.","12."],"dateFormatItem-yMMM":"LLL y","field-day-relative+0":"Dnes","field-day-relative+1":"Zítra","days-standAlone-narrow":["N","P","Ú","S","Č","P","S"],"eraAbbr":["př.Kr.","po Kr."],"field-day-relative+2":"Pozítří","dateFormatItem-yyyyMMMM":"LLLL y","dateFormat-long":"d. MMMM y","timeFormat-medium":"H:mm:ss","dateFormatItem-EEEd":"EEE, d.","dateFormatItem-Hm":"H:mm","dateFormat-medium":"d.M.yyyy","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-yMd":"d.M.y","quarters-standAlone-wide":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"months-standAlone-wide":["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],"dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q yy","timeFormat-long":"H:mm:ss z","months-format-abbr":["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],"timeFormat-short":"H:mm","dateFormatItem-H":"H","quarters-format-abbr":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"days-format-abbr":["ne","po","út","st","čt","pá","so"],"days-format-narrow":["N","P","Ú","S","Č","P","S"],"dateFormatItem-MEd":"E, d.M","months-format-narrow":["l","ú","b","d","k","č","č","s","z","ř","l","p"],"days-standAlone-abbr":["ne","po","út","st","čt","pá","so"],"dateFormat-short":"d.M.yy","dateFormatItem-yyyyM":"M.yyyy","dateFormatItem-yMMMEd":"EEE, d. MMM y","dateFormat-full":"EEEE, d. MMMM y","dateFormatItem-Md":"d.M","dateFormatItem-yMEd":"EEE, d.M.y","months-format-wide":["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],"dateFormatItem-d":"d.","quarters-format-wide":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"days-format-wide":["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],"eraNarrow":["př.Kr.","po Kr."],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Day of the Week","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-era":"Era","field-year":"Year","dateTimeFormats-appendItem-Era":"{0} {1}","field-hour":"Hour","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-M":"L","field-minute":"Minute","field-dayperiod":"Dayperiod","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","field-day":"Day","field-zone":"Zone","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateFormatItem-MMM":"LLL","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","field-second":"Second","dateTimeFormats-appendItem-Timezone":"{0} {1}","field-week":"Week","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/cs/gregorian",{"dateFormatItem-yM":"M.y","dateFormatItem-yQ":"Q yyyy","dayPeriods-format-wide-pm":"odp.","eraNames":["př.Kr.","po Kr."],"dateFormatItem-MMMEd":"E, d. MMM","field-day-relative+-1":"Včera","dateFormatItem-yQQQ":"QQQ y","field-day-relative+-2":"Předevčírem","days-standAlone-wide":["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],"months-standAlone-narrow":["l","ú","b","d","k","č","č","s","z","ř","l","p"],"dayPeriods-format-wide-am":"dop.","quarters-standAlone-abbr":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"timeFormat-full":"H:mm:ss zzzz","dateFormatItem-yyyy":"y","months-standAlone-abbr":["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.","11.","12."],"dateFormatItem-yMMM":"LLL y","field-day-relative+0":"Dnes","field-day-relative+1":"Zítra","days-standAlone-narrow":["N","P","Ú","S","Č","P","S"],"eraAbbr":["př.Kr.","po Kr."],"field-day-relative+2":"Pozítří","dateFormatItem-yyyyMMMM":"LLLL y","dateFormat-long":"d. MMMM y","timeFormat-medium":"H:mm:ss","dateFormatItem-EEEd":"EEE, d.","dateFormatItem-Hm":"H:mm","dateFormat-medium":"d.M.yyyy","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-yMd":"d.M.y","quarters-standAlone-wide":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"months-standAlone-wide":["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],"dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q yy","timeFormat-long":"H:mm:ss z","months-format-abbr":["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],"timeFormat-short":"H:mm","dateFormatItem-H":"H","quarters-format-abbr":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"days-format-abbr":["ne","po","út","st","čt","pá","so"],"days-format-narrow":["N","P","Ú","S","Č","P","S"],"dateFormatItem-MEd":"E, d.M","months-format-narrow":["l","ú","b","d","k","č","č","s","z","ř","l","p"],"days-standAlone-abbr":["ne","po","út","st","čt","pá","so"],"dateFormat-short":"d.M.yy","dateFormatItem-yyyyM":"M.yyyy","dateFormatItem-yMMMEd":"EEE, d. MMM y","dateFormat-full":"EEEE, d. MMMM y","dateFormatItem-Md":"d.M","dateFormatItem-yMEd":"EEE, d.M.y","months-format-wide":["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],"dateFormatItem-d":"d.","quarters-format-wide":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"days-format-wide":["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],"eraNarrow":["př.Kr.","po Kr."]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/cs/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/cs/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..b67965d61
--- /dev/null
+++ b/lib/dojo/cldr/nls/cs/gregorian.js.uncompressed.js
@@ -0,0 +1,215 @@
+define(
+"dojo/cldr/nls/cs/gregorian", //begin v1.x content
+{
+ "dateFormatItem-yM": "M.y",
+ "dateFormatItem-yQ": "Q yyyy",
+ "dayPeriods-format-wide-pm": "odp.",
+ "eraNames": [
+ "př.Kr.",
+ "po Kr."
+ ],
+ "dateFormatItem-MMMEd": "E, d. MMM",
+ "field-day-relative+-1": "Včera",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "field-day-relative+-2": "Předevčírem",
+ "days-standAlone-wide": [
+ "neděle",
+ "pondělí",
+ "úterý",
+ "středa",
+ "čtvrtek",
+ "pátek",
+ "sobota"
+ ],
+ "months-standAlone-narrow": [
+ "l",
+ "ú",
+ "b",
+ "d",
+ "k",
+ "č",
+ "č",
+ "s",
+ "z",
+ "ř",
+ "l",
+ "p"
+ ],
+ "dayPeriods-format-wide-am": "dop.",
+ "quarters-standAlone-abbr": [
+ "1. čtvrtletí",
+ "2. čtvrtletí",
+ "3. čtvrtletí",
+ "4. čtvrtletí"
+ ],
+ "timeFormat-full": "H:mm:ss zzzz",
+ "dateFormatItem-yyyy": "y",
+ "months-standAlone-abbr": [
+ "1.",
+ "2.",
+ "3.",
+ "4.",
+ "5.",
+ "6.",
+ "7.",
+ "8.",
+ "9.",
+ "10.",
+ "11.",
+ "12."
+ ],
+ "dateFormatItem-yMMM": "LLL y",
+ "field-day-relative+0": "Dnes",
+ "field-day-relative+1": "Zítra",
+ "days-standAlone-narrow": [
+ "N",
+ "P",
+ "Ú",
+ "S",
+ "Č",
+ "P",
+ "S"
+ ],
+ "eraAbbr": [
+ "př.Kr.",
+ "po Kr."
+ ],
+ "field-day-relative+2": "Pozítří",
+ "dateFormatItem-yyyyMMMM": "LLLL y",
+ "dateFormat-long": "d. MMMM y",
+ "timeFormat-medium": "H:mm:ss",
+ "dateFormatItem-EEEd": "EEE, d.",
+ "dateFormatItem-Hm": "H:mm",
+ "dateFormat-medium": "d.M.yyyy",
+ "dateFormatItem-Hms": "H:mm:ss",
+ "dateFormatItem-yMd": "d.M.y",
+ "quarters-standAlone-wide": [
+ "1. čtvrtletí",
+ "2. čtvrtletí",
+ "3. čtvrtletí",
+ "4. čtvrtletí"
+ ],
+ "months-standAlone-wide": [
+ "leden",
+ "únor",
+ "březen",
+ "duben",
+ "květen",
+ "červen",
+ "červenec",
+ "srpen",
+ "září",
+ "říjen",
+ "listopad",
+ "prosinec"
+ ],
+ "dateFormatItem-MMMd": "d. MMM",
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-long": "H:mm:ss z",
+ "months-format-abbr": [
+ "ledna",
+ "února",
+ "března",
+ "dubna",
+ "května",
+ "června",
+ "července",
+ "srpna",
+ "září",
+ "října",
+ "listopadu",
+ "prosince"
+ ],
+ "timeFormat-short": "H:mm",
+ "dateFormatItem-H": "H",
+ "quarters-format-abbr": [
+ "1. čtvrtletí",
+ "2. čtvrtletí",
+ "3. čtvrtletí",
+ "4. čtvrtletí"
+ ],
+ "days-format-abbr": [
+ "ne",
+ "po",
+ "út",
+ "st",
+ "čt",
+ "pá",
+ "so"
+ ],
+ "days-format-narrow": [
+ "N",
+ "P",
+ "Ú",
+ "S",
+ "Č",
+ "P",
+ "S"
+ ],
+ "dateFormatItem-MEd": "E, d.M",
+ "months-format-narrow": [
+ "l",
+ "ú",
+ "b",
+ "d",
+ "k",
+ "č",
+ "č",
+ "s",
+ "z",
+ "ř",
+ "l",
+ "p"
+ ],
+ "days-standAlone-abbr": [
+ "ne",
+ "po",
+ "út",
+ "st",
+ "čt",
+ "pá",
+ "so"
+ ],
+ "dateFormat-short": "d.M.yy",
+ "dateFormatItem-yyyyM": "M.yyyy",
+ "dateFormatItem-yMMMEd": "EEE, d. MMM y",
+ "dateFormat-full": "EEEE, d. MMMM y",
+ "dateFormatItem-Md": "d.M",
+ "dateFormatItem-yMEd": "EEE, d.M.y",
+ "months-format-wide": [
+ "ledna",
+ "února",
+ "března",
+ "dubna",
+ "května",
+ "června",
+ "července",
+ "srpna",
+ "září",
+ "října",
+ "listopadu",
+ "prosince"
+ ],
+ "dateFormatItem-d": "d.",
+ "quarters-format-wide": [
+ "1. čtvrtletí",
+ "2. čtvrtletí",
+ "3. čtvrtletí",
+ "4. čtvrtletí"
+ ],
+ "days-format-wide": [
+ "neděle",
+ "pondělí",
+ "úterý",
+ "středa",
+ "čtvrtek",
+ "pátek",
+ "sobota"
+ ],
+ "eraNarrow": [
+ "př.Kr.",
+ "po Kr."
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/cs/number.js b/lib/dojo/cldr/nls/cs/number.js
index 9dcfdd4d9..5122e6546 100644
--- a/lib/dojo/cldr/nls/cs/number.js
+++ b/lib/dojo/cldr/nls/cs/number.js
@@ -1 +1,8 @@
-({"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/cs/number",{"group":" ","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0 %","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/cs/number.js.uncompressed.js b/lib/dojo/cldr/nls/cs/number.js.uncompressed.js
new file mode 100644
index 000000000..0f1efe1cc
--- /dev/null
+++ b/lib/dojo/cldr/nls/cs/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/cs/number", //begin v1.x content
+{
+ "group": " ",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0 %",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/currency.js b/lib/dojo/cldr/nls/currency.js
index e526c6c02..a1d55ff34 100644
--- a/lib/dojo/cldr/nls/currency.js
+++ b/lib/dojo/cldr/nls/currency.js
@@ -1 +1,8 @@
-({"USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/currency",{root:{"USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"},"ar":true,"ca":true,"cs":true,"da":true,"de":true,"el":true,"en":true,"en-au":true,"en-ca":true,"es":true,"fi":true,"fr":true,"he":true,"hu":true,"it":true,"ja":true,"ko":true,"nb":true,"nl":true,"pl":true,"pt":true,"ro":true,"ru":true,"sk":true,"sl":true,"sv":true,"th":true,"tr":true,"zh":true,"zh-hant":true,"zh-hk":true,"zh-tw":true}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/currency.js.uncompressed.js b/lib/dojo/cldr/nls/currency.js.uncompressed.js
new file mode 100644
index 000000000..19ffc0f39
--- /dev/null
+++ b/lib/dojo/cldr/nls/currency.js.uncompressed.js
@@ -0,0 +1,48 @@
+define("dojo/cldr/nls/currency", { root:
+
+//begin v1.x content
+{
+ "USD_symbol": "US$",
+ "CAD_symbol": "CA$",
+ "GBP_symbol": "£",
+ "HKD_symbol": "HK$",
+ "JPY_symbol": "JP¥",
+ "AUD_symbol": "AU$",
+ "CNY_symbol": "CN¥",
+ "EUR_symbol": "€"
+}
+//end v1.x content
+,
+ "ar": true,
+ "ca": true,
+ "cs": true,
+ "da": true,
+ "de": true,
+ "el": true,
+ "en": true,
+ "en-au": true,
+ "en-ca": true,
+ "es": true,
+ "fi": true,
+ "fr": true,
+ "he": true,
+ "hu": true,
+ "it": true,
+ "ja": true,
+ "ko": true,
+ "nb": true,
+ "nl": true,
+ "pl": true,
+ "pt": true,
+ "ro": true,
+ "ru": true,
+ "sk": true,
+ "sl": true,
+ "sv": true,
+ "th": true,
+ "tr": true,
+ "zh": true,
+ "zh-hant": true,
+ "zh-hk": true,
+ "zh-tw": true
+}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/da/buddhist.js b/lib/dojo/cldr/nls/da/buddhist.js
index d6d4ca3a7..7989f490d 100644
--- a/lib/dojo/cldr/nls/da/buddhist.js
+++ b/lib/dojo/cldr/nls/da/buddhist.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"M/y G","dateFormatItem-yQ":"Q y G","dayPeriods-format-wide-pm":"e.m.","dateFormatItem-MMMEd":"E d. MMM","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yQQQ":"QQQ y G","dateFormatItem-MMdd":"dd/MM","dateFormatItem-MMM":"MMM","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dayPeriods-format-wide-am":"f.m.","dateFormatItem-y":"y G","timeFormat-full":"HH.mm.ss zzzz","dateFormatItem-yyyy":"y G","months-standAlone-abbr":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],"dateFormatItem-Ed":"E d.","dateFormatItem-yMMM":"MMM y G","days-standAlone-narrow":["S","M","T","O","T","F","L"],"dateFormatItem-yyyyMM":"MM/y G","dateFormat-long":"d. MMMM y G","timeFormat-medium":"HH.mm.ss","dateFormatItem-Hm":"HH.mm","dateFormatItem-yyMM":"MM/y G","dateFormat-medium":"d. MMM y G","dateFormatItem-Hms":"HH.mm.ss","dateFormatItem-yyMMM":"MMM y G","dateFormatItem-yMd":"d/M/y G","dateFormatItem-ms":"mm.ss","dateFormatItem-MMMMEd":"E, d. MMMM","dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q. 'kvartal' y G","timeFormat-long":"HH.mm.ss z","months-format-abbr":["jan.","feb.","mar.","apr.","maj","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"timeFormat-short":"HH.mm","dateFormatItem-H":"HH","quarters-format-abbr":["K1","K2","K3","K4"],"days-format-abbr":["søn","man","tir","ons","tor","fre","lør"],"dateFormatItem-M":"M","dateFormatItem-MEd":"E. d/M","dateFormatItem-hm":"h.mm a","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE. d. MMM y G","dateFormat-full":"EEEE d. MMMM y G","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE. d/M/y G","months-format-wide":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"dateFormatItem-yyyyMMM":"MMM y G","dateFormatItem-d":"d.","quarters-format-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"days-format-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"eraNarrow":["BE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["BE"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","eraNames":["BE"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/da/buddhist",{"dateFormatItem-yM":"M/y G","dateFormatItem-yQ":"Q y G","dayPeriods-format-wide-pm":"e.m.","dateFormatItem-MMMEd":"E d. MMM","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yQQQ":"QQQ y G","dateFormatItem-MMdd":"dd/MM","dateFormatItem-MMM":"MMM","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dayPeriods-format-wide-am":"f.m.","dateFormatItem-y":"y G","timeFormat-full":"HH.mm.ss zzzz","dateFormatItem-yyyy":"y G","months-standAlone-abbr":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],"dateFormatItem-Ed":"E d.","dateFormatItem-yMMM":"MMM y G","days-standAlone-narrow":["S","M","T","O","T","F","L"],"dateFormatItem-yyyyMM":"MM/y G","dateFormat-long":"d. MMMM y G","timeFormat-medium":"HH.mm.ss","dateFormatItem-Hm":"HH.mm","dateFormatItem-yyMM":"MM/y G","dateFormat-medium":"d. MMM y G","dateFormatItem-Hms":"HH.mm.ss","dateFormatItem-yyMMM":"MMM y G","dateFormatItem-yMd":"d/M/y G","dateFormatItem-ms":"mm.ss","dateFormatItem-MMMMEd":"E, d. MMMM","dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q. 'kvartal' y G","timeFormat-long":"HH.mm.ss z","months-format-abbr":["jan.","feb.","mar.","apr.","maj","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"timeFormat-short":"HH.mm","dateFormatItem-H":"HH","quarters-format-abbr":["K1","K2","K3","K4"],"days-format-abbr":["søn","man","tir","ons","tor","fre","lør"],"dateFormatItem-M":"M","dateFormatItem-MEd":"E. d/M","dateFormatItem-hm":"h.mm a","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE. d. MMM y G","dateFormat-full":"EEEE d. MMMM y G","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE. d/M/y G","months-format-wide":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"dateFormatItem-yyyyMMM":"MMM y G","dateFormatItem-d":"d.","quarters-format-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"days-format-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/da/buddhist.js.uncompressed.js b/lib/dojo/cldr/nls/da/buddhist.js.uncompressed.js
new file mode 100644
index 000000000..9a195f53b
--- /dev/null
+++ b/lib/dojo/cldr/nls/da/buddhist.js.uncompressed.js
@@ -0,0 +1,141 @@
+define(
+"dojo/cldr/nls/da/buddhist", //begin v1.x content
+{
+ "dateFormatItem-yM": "M/y G",
+ "dateFormatItem-yQ": "Q y G",
+ "dayPeriods-format-wide-pm": "e.m.",
+ "dateFormatItem-MMMEd": "E d. MMM",
+ "dateFormatItem-hms": "h.mm.ss a",
+ "dateFormatItem-yQQQ": "QQQ y G",
+ "dateFormatItem-MMdd": "dd/MM",
+ "dateFormatItem-MMM": "MMM",
+ "months-standAlone-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dayPeriods-format-wide-am": "f.m.",
+ "dateFormatItem-y": "y G",
+ "timeFormat-full": "HH.mm.ss zzzz",
+ "dateFormatItem-yyyy": "y G",
+ "months-standAlone-abbr": [
+ "jan",
+ "feb",
+ "mar",
+ "apr",
+ "maj",
+ "jun",
+ "jul",
+ "aug",
+ "sep",
+ "okt",
+ "nov",
+ "dec"
+ ],
+ "dateFormatItem-Ed": "E d.",
+ "dateFormatItem-yMMM": "MMM y G",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "O",
+ "T",
+ "F",
+ "L"
+ ],
+ "dateFormatItem-yyyyMM": "MM/y G",
+ "dateFormat-long": "d. MMMM y G",
+ "timeFormat-medium": "HH.mm.ss",
+ "dateFormatItem-Hm": "HH.mm",
+ "dateFormatItem-yyMM": "MM/y G",
+ "dateFormat-medium": "d. MMM y G",
+ "dateFormatItem-Hms": "HH.mm.ss",
+ "dateFormatItem-yyMMM": "MMM y G",
+ "dateFormatItem-yMd": "d/M/y G",
+ "dateFormatItem-ms": "mm.ss",
+ "dateFormatItem-MMMMEd": "E, d. MMMM",
+ "dateFormatItem-MMMd": "d. MMM",
+ "dateFormatItem-yyQ": "Q. 'kvartal' y G",
+ "timeFormat-long": "HH.mm.ss z",
+ "months-format-abbr": [
+ "jan.",
+ "feb.",
+ "mar.",
+ "apr.",
+ "maj",
+ "jun.",
+ "jul.",
+ "aug.",
+ "sep.",
+ "okt.",
+ "nov.",
+ "dec."
+ ],
+ "timeFormat-short": "HH.mm",
+ "dateFormatItem-H": "HH",
+ "quarters-format-abbr": [
+ "K1",
+ "K2",
+ "K3",
+ "K4"
+ ],
+ "days-format-abbr": [
+ "søn",
+ "man",
+ "tir",
+ "ons",
+ "tor",
+ "fre",
+ "lør"
+ ],
+ "dateFormatItem-M": "M",
+ "dateFormatItem-MEd": "E. d/M",
+ "dateFormatItem-hm": "h.mm a",
+ "dateFormat-short": "d/M/yyyy",
+ "dateFormatItem-yMMMEd": "EEE. d. MMM y G",
+ "dateFormat-full": "EEEE d. MMMM y G",
+ "dateFormatItem-Md": "d/M",
+ "dateFormatItem-yMEd": "EEE. d/M/y G",
+ "months-format-wide": [
+ "januar",
+ "februar",
+ "marts",
+ "april",
+ "maj",
+ "juni",
+ "juli",
+ "august",
+ "september",
+ "oktober",
+ "november",
+ "december"
+ ],
+ "dateFormatItem-yyyyMMM": "MMM y G",
+ "dateFormatItem-d": "d.",
+ "quarters-format-wide": [
+ "1. kvartal",
+ "2. kvartal",
+ "3. kvartal",
+ "4. kvartal"
+ ],
+ "days-format-wide": [
+ "søndag",
+ "mandag",
+ "tirsdag",
+ "onsdag",
+ "torsdag",
+ "fredag",
+ "lørdag"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/da/currency.js b/lib/dojo/cldr/nls/da/currency.js
index fe1b09fa9..fe833757c 100644
--- a/lib/dojo/cldr/nls/da/currency.js
+++ b/lib/dojo/cldr/nls/da/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Hongkong dollar","CHF_displayName":"Schweizisk franc","CAD_displayName":"Canadisk dollar","CNY_displayName":"Kinesisk yuan renminbi","USD_symbol":"$","AUD_displayName":"Australsk dollar","JPY_displayName":"Japansk yen","USD_displayName":"Amerikansk dollar","GBP_displayName":"Britisk pund","EUR_displayName":"Euro","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/da/currency",{"HKD_displayName":"Hongkong dollar","CHF_displayName":"Schweizisk franc","CAD_displayName":"Canadisk dollar","CNY_displayName":"Kinesisk yuan renminbi","USD_symbol":"$","AUD_displayName":"Australsk dollar","JPY_displayName":"Japansk yen","USD_displayName":"Amerikansk dollar","GBP_displayName":"Britisk pund","EUR_displayName":"Euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/da/currency.js.uncompressed.js b/lib/dojo/cldr/nls/da/currency.js.uncompressed.js
new file mode 100644
index 000000000..83abba5f9
--- /dev/null
+++ b/lib/dojo/cldr/nls/da/currency.js.uncompressed.js
@@ -0,0 +1,16 @@
+define(
+"dojo/cldr/nls/da/currency", //begin v1.x content
+{
+ "HKD_displayName": "Hongkong dollar",
+ "CHF_displayName": "Schweizisk franc",
+ "CAD_displayName": "Canadisk dollar",
+ "CNY_displayName": "Kinesisk yuan renminbi",
+ "USD_symbol": "$",
+ "AUD_displayName": "Australsk dollar",
+ "JPY_displayName": "Japansk yen",
+ "USD_displayName": "Amerikansk dollar",
+ "GBP_displayName": "Britisk pund",
+ "EUR_displayName": "Euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/da/gregorian.js b/lib/dojo/cldr/nls/da/gregorian.js
index 1dffad552..051d42276 100644
--- a/lib/dojo/cldr/nls/da/gregorian.js
+++ b/lib/dojo/cldr/nls/da/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"ugedag","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE. d/M/y","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["f.Kr.","e.Kr."],"dateFormat-long":"d. MMM y","months-format-wide":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"dayPeriods-format-wide-pm":"e.m.","dateFormat-full":"EEEE 'den' d. MMMM y","dateFormatItem-Md":"d/M","field-era":"æra","dateFormatItem-yM":"M/y","months-standAlone-wide":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"timeFormat-short":"HH.mm","quarters-format-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"timeFormat-long":"HH.mm.ss z","field-year":"år","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q yyyy","field-hour":"time","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["jan.","feb.","mar.","apr.","maj","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"dateFormatItem-yyQ":"Q. 'kvartal' yy","timeFormat-full":"HH.mm.ss zzzz","field-day-relative+0":"i dag","field-day-relative+1":"i morgen","field-day-relative+2":"i overmorgen","dateFormatItem-H":"HH","field-day-relative+3":"i overovermorgen","months-standAlone-abbr":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"dateFormatItem-M":"M","days-standAlone-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"dateFormatItem-yyyyMMM":"MMM y","dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH.mm.ss","dateFormatItem-Hm":"HH.mm","quarters-standAlone-abbr":["K1","K2","K3","K4"],"eraAbbr":["f.Kr.","e.Kr."],"field-minute":"minut","field-dayperiod":"dagtid","days-standAlone-abbr":["søn","man","tir","ons","tor","fre","lør"],"dateFormatItem-d":"d.","dateFormatItem-ms":"mm.ss","field-day-relative+-1":"i går","field-day-relative+-2":"i forgårs","field-day-relative+-3":"i forforgårs","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E. d/M","field-day":"dag","days-format-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"field-zone":"zone","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM/yy","dateFormatItem-hm":"h.mm a","days-format-abbr":["søn","man","tir","ons","tor","fre","lør"],"eraNames":["f.Kr.","e.Kr."],"days-format-narrow":["S","M","T","O","T","F","L"],"field-month":"måned","days-standAlone-narrow":["S","M","T","O","T","F","L"],"dateFormatItem-MMM":"MMM","dayPeriods-format-wide-am":"f.m.","dateFormatItem-MMMMEd":"E, d. MMMM","dateFormat-short":"dd/MM/yy","field-second":"sekund","dateFormatItem-yMMMEd":"EEE. d. MMM y","dateFormatItem-Ed":"E d.","field-week":"uge","dateFormat-medium":"dd/MM/yyyy","dateFormatItem-Hms":"HH.mm.ss","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yyyy":"y","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/da/gregorian",{"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"ugedag","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE. d/M/y","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["f.Kr.","e.Kr."],"dateFormat-long":"d. MMM y","months-format-wide":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"dayPeriods-format-wide-pm":"e.m.","dateFormat-full":"EEEE 'den' d. MMMM y","dateFormatItem-Md":"d/M","field-era":"æra","dateFormatItem-yM":"M/y","months-standAlone-wide":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"timeFormat-short":"HH.mm","quarters-format-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"timeFormat-long":"HH.mm.ss z","field-year":"år","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q yyyy","field-hour":"time","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["jan.","feb.","mar.","apr.","maj","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"dateFormatItem-yyQ":"Q. 'kvartal' yy","timeFormat-full":"HH.mm.ss zzzz","field-day-relative+0":"i dag","field-day-relative+1":"i morgen","field-day-relative+2":"i overmorgen","dateFormatItem-H":"HH","field-day-relative+3":"i overovermorgen","months-standAlone-abbr":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"dateFormatItem-M":"M","days-standAlone-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"dateFormatItem-yyyyMMM":"MMM y","dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH.mm.ss","dateFormatItem-Hm":"HH.mm","quarters-standAlone-abbr":["K1","K2","K3","K4"],"eraAbbr":["f.Kr.","e.Kr."],"field-minute":"minut","field-dayperiod":"dagtid","days-standAlone-abbr":["søn","man","tir","ons","tor","fre","lør"],"dateFormatItem-d":"d.","dateFormatItem-ms":"mm.ss","field-day-relative+-1":"i går","field-day-relative+-2":"i forgårs","field-day-relative+-3":"i forforgårs","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E. d/M","field-day":"dag","days-format-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"field-zone":"zone","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM/yy","dateFormatItem-hm":"h.mm a","days-format-abbr":["søn","man","tir","ons","tor","fre","lør"],"eraNames":["f.Kr.","e.Kr."],"days-format-narrow":["S","M","T","O","T","F","L"],"field-month":"måned","days-standAlone-narrow":["S","M","T","O","T","F","L"],"dateFormatItem-MMM":"MMM","dayPeriods-format-wide-am":"f.m.","dateFormatItem-MMMMEd":"E, d. MMMM","dateFormat-short":"dd/MM/yy","field-second":"sekund","dateFormatItem-yMMMEd":"EEE. d. MMM y","dateFormatItem-Ed":"E d.","field-week":"uge","dateFormat-medium":"dd/MM/yyyy","dateFormatItem-Hms":"HH.mm.ss","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yyyy":"y"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/da/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/da/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..be440141f
--- /dev/null
+++ b/lib/dojo/cldr/nls/da/gregorian.js.uncompressed.js
@@ -0,0 +1,237 @@
+define(
+"dojo/cldr/nls/da/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "field-weekday": "ugedag",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yMEd": "EEE. d/M/y",
+ "dateFormatItem-MMMEd": "E d MMM",
+ "eraNarrow": [
+ "f.Kr.",
+ "e.Kr."
+ ],
+ "dateFormat-long": "d. MMM y",
+ "months-format-wide": [
+ "januar",
+ "februar",
+ "marts",
+ "april",
+ "maj",
+ "juni",
+ "juli",
+ "august",
+ "september",
+ "oktober",
+ "november",
+ "december"
+ ],
+ "dayPeriods-format-wide-pm": "e.m.",
+ "dateFormat-full": "EEEE 'den' d. MMMM y",
+ "dateFormatItem-Md": "d/M",
+ "field-era": "æra",
+ "dateFormatItem-yM": "M/y",
+ "months-standAlone-wide": [
+ "januar",
+ "februar",
+ "marts",
+ "april",
+ "maj",
+ "juni",
+ "juli",
+ "august",
+ "september",
+ "oktober",
+ "november",
+ "december"
+ ],
+ "timeFormat-short": "HH.mm",
+ "quarters-format-wide": [
+ "1. kvartal",
+ "2. kvartal",
+ "3. kvartal",
+ "4. kvartal"
+ ],
+ "timeFormat-long": "HH.mm.ss z",
+ "field-year": "år",
+ "dateFormatItem-yMMM": "MMM y",
+ "dateFormatItem-yQ": "Q yyyy",
+ "field-hour": "time",
+ "dateFormatItem-MMdd": "dd/MM",
+ "months-format-abbr": [
+ "jan.",
+ "feb.",
+ "mar.",
+ "apr.",
+ "maj",
+ "jun.",
+ "jul.",
+ "aug.",
+ "sep.",
+ "okt.",
+ "nov.",
+ "dec."
+ ],
+ "dateFormatItem-yyQ": "Q. 'kvartal' yy",
+ "timeFormat-full": "HH.mm.ss zzzz",
+ "field-day-relative+0": "i dag",
+ "field-day-relative+1": "i morgen",
+ "field-day-relative+2": "i overmorgen",
+ "dateFormatItem-H": "HH",
+ "field-day-relative+3": "i overovermorgen",
+ "months-standAlone-abbr": [
+ "jan",
+ "feb",
+ "mar",
+ "apr",
+ "maj",
+ "jun",
+ "jul",
+ "aug",
+ "sep",
+ "okt",
+ "nov",
+ "dec"
+ ],
+ "quarters-format-abbr": [
+ "K1",
+ "K2",
+ "K3",
+ "K4"
+ ],
+ "quarters-standAlone-wide": [
+ "1. kvartal",
+ "2. kvartal",
+ "3. kvartal",
+ "4. kvartal"
+ ],
+ "dateFormatItem-M": "M",
+ "days-standAlone-wide": [
+ "søndag",
+ "mandag",
+ "tirsdag",
+ "onsdag",
+ "torsdag",
+ "fredag",
+ "lørdag"
+ ],
+ "dateFormatItem-yyyyMMM": "MMM y",
+ "dateFormatItem-yyMMM": "MMM yy",
+ "timeFormat-medium": "HH.mm.ss",
+ "dateFormatItem-Hm": "HH.mm",
+ "quarters-standAlone-abbr": [
+ "K1",
+ "K2",
+ "K3",
+ "K4"
+ ],
+ "eraAbbr": [
+ "f.Kr.",
+ "e.Kr."
+ ],
+ "field-minute": "minut",
+ "field-dayperiod": "dagtid",
+ "days-standAlone-abbr": [
+ "søn",
+ "man",
+ "tir",
+ "ons",
+ "tor",
+ "fre",
+ "lør"
+ ],
+ "dateFormatItem-d": "d.",
+ "dateFormatItem-ms": "mm.ss",
+ "field-day-relative+-1": "i går",
+ "field-day-relative+-2": "i forgårs",
+ "field-day-relative+-3": "i forforgårs",
+ "dateFormatItem-MMMd": "d. MMM",
+ "dateFormatItem-MEd": "E. d/M",
+ "field-day": "dag",
+ "days-format-wide": [
+ "søndag",
+ "mandag",
+ "tirsdag",
+ "onsdag",
+ "torsdag",
+ "fredag",
+ "lørdag"
+ ],
+ "field-zone": "zone",
+ "dateFormatItem-yyyyMM": "MM/yyyy",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateFormatItem-yyMM": "MM/yy",
+ "dateFormatItem-hm": "h.mm a",
+ "days-format-abbr": [
+ "søn",
+ "man",
+ "tir",
+ "ons",
+ "tor",
+ "fre",
+ "lør"
+ ],
+ "eraNames": [
+ "f.Kr.",
+ "e.Kr."
+ ],
+ "days-format-narrow": [
+ "S",
+ "M",
+ "T",
+ "O",
+ "T",
+ "F",
+ "L"
+ ],
+ "field-month": "måned",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "O",
+ "T",
+ "F",
+ "L"
+ ],
+ "dateFormatItem-MMM": "MMM",
+ "dayPeriods-format-wide-am": "f.m.",
+ "dateFormatItem-MMMMEd": "E, d. MMMM",
+ "dateFormat-short": "dd/MM/yy",
+ "field-second": "sekund",
+ "dateFormatItem-yMMMEd": "EEE. d. MMM y",
+ "dateFormatItem-Ed": "E d.",
+ "field-week": "uge",
+ "dateFormat-medium": "dd/MM/yyyy",
+ "dateFormatItem-Hms": "HH.mm.ss",
+ "dateFormatItem-hms": "h.mm.ss a",
+ "dateFormatItem-yyyy": "y"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/da/islamic.js b/lib/dojo/cldr/nls/da/islamic.js
index a6bda975d..d7eee79de 100644
--- a/lib/dojo/cldr/nls/da/islamic.js
+++ b/lib/dojo/cldr/nls/da/islamic.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"M/y","dateFormatItem-yyyyMMMEd":"EEE. d. MMM y G","dateFormatItem-yQ":"Q yyyy","dayPeriods-format-wide-pm":"e.m.","dateFormatItem-MMMEd":"E d. MMM","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-MMdd":"dd/MM","dateFormatItem-MMM":"MMM","dayPeriods-format-wide-am":"f.m.","timeFormat-full":"HH.mm.ss zzzz","dateFormatItem-yyyy":"y G","dateFormatItem-Ed":"E d.","dateFormatItem-yMMM":"MMM y","days-standAlone-narrow":["S","M","T","O","T","F","L"],"dateFormat-long":"d. MMMM y G","timeFormat-medium":"HH.mm.ss","dateFormatItem-Hm":"HH.mm","dateFormatItem-yyMM":"MM/y G","dateFormat-medium":"d. MMM y G","dateFormatItem-Hms":"HH.mm.ss","dateFormatItem-yyMMM":"MMM y G","dateFormatItem-ms":"mm.ss","dateFormatItem-MMMMEd":"E, d. MMMM","dateFormatItem-yyyyMEd":"EEE. d/M/y G","dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q. 'kvartal' y G","timeFormat-long":"HH.mm.ss z","timeFormat-short":"HH.mm","dateFormatItem-H":"HH","quarters-format-abbr":["K1","K2","K3","K4"],"days-format-abbr":["søn","man","tir","ons","tor","fre","lør"],"dateFormatItem-M":"M","dateFormatItem-yyyyQQQ":"QQQ y G","dateFormatItem-MEd":"E. d/M","dateFormatItem-hm":"h.mm a","dateFormat-short":"d/M/y G","dateFormatItem-yyyyM":"M/y G","dateFormatItem-yMMMEd":"EEE. d. MMM y","dateFormat-full":"EEEE d. MMMM y G","dateFormatItem-Md":"d/M","dateFormatItem-yyyyQ":"Q y G","dateFormatItem-yMEd":"EEE. d/M/y","dateFormatItem-yyyyMMM":"MMM y G","dateFormatItem-d":"d.","quarters-format-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"days-format-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"eraNarrow":["AH"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","months-format-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","months-standAlone-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["AH"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","eraNames":["AH"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/da/islamic",{"dateFormatItem-yM":"M/y","dateFormatItem-yyyyMMMEd":"EEE. d. MMM y G","dateFormatItem-yQ":"Q yyyy","dayPeriods-format-wide-pm":"e.m.","dateFormatItem-MMMEd":"E d. MMM","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-MMdd":"dd/MM","dateFormatItem-MMM":"MMM","dayPeriods-format-wide-am":"f.m.","timeFormat-full":"HH.mm.ss zzzz","dateFormatItem-yyyy":"y G","dateFormatItem-Ed":"E d.","dateFormatItem-yMMM":"MMM y","days-standAlone-narrow":["S","M","T","O","T","F","L"],"dateFormat-long":"d. MMMM y G","timeFormat-medium":"HH.mm.ss","dateFormatItem-Hm":"HH.mm","dateFormatItem-yyMM":"MM/y G","dateFormat-medium":"d. MMM y G","dateFormatItem-Hms":"HH.mm.ss","dateFormatItem-yyMMM":"MMM y G","dateFormatItem-ms":"mm.ss","dateFormatItem-MMMMEd":"E, d. MMMM","dateFormatItem-yyyyMEd":"EEE. d/M/y G","dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q. 'kvartal' y G","timeFormat-long":"HH.mm.ss z","timeFormat-short":"HH.mm","dateFormatItem-H":"HH","quarters-format-abbr":["K1","K2","K3","K4"],"days-format-abbr":["søn","man","tir","ons","tor","fre","lør"],"dateFormatItem-M":"M","dateFormatItem-yyyyQQQ":"QQQ y G","dateFormatItem-MEd":"E. d/M","dateFormatItem-hm":"h.mm a","dateFormat-short":"d/M/y G","dateFormatItem-yyyyM":"M/y G","dateFormatItem-yMMMEd":"EEE. d. MMM y","dateFormat-full":"EEEE d. MMMM y G","dateFormatItem-Md":"d/M","dateFormatItem-yyyyQ":"Q y G","dateFormatItem-yMEd":"EEE. d/M/y","dateFormatItem-yyyyMMM":"MMM y G","dateFormatItem-d":"d.","quarters-format-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"days-format-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/da/islamic.js.uncompressed.js b/lib/dojo/cldr/nls/da/islamic.js.uncompressed.js
new file mode 100644
index 000000000..b294728fd
--- /dev/null
+++ b/lib/dojo/cldr/nls/da/islamic.js.uncompressed.js
@@ -0,0 +1,87 @@
+define(
+"dojo/cldr/nls/da/islamic", //begin v1.x content
+{
+ "dateFormatItem-yM": "M/y",
+ "dateFormatItem-yyyyMMMEd": "EEE. d. MMM y G",
+ "dateFormatItem-yQ": "Q yyyy",
+ "dayPeriods-format-wide-pm": "e.m.",
+ "dateFormatItem-MMMEd": "E d. MMM",
+ "dateFormatItem-hms": "h.mm.ss a",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-MMdd": "dd/MM",
+ "dateFormatItem-MMM": "MMM",
+ "dayPeriods-format-wide-am": "f.m.",
+ "timeFormat-full": "HH.mm.ss zzzz",
+ "dateFormatItem-yyyy": "y G",
+ "dateFormatItem-Ed": "E d.",
+ "dateFormatItem-yMMM": "MMM y",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "O",
+ "T",
+ "F",
+ "L"
+ ],
+ "dateFormat-long": "d. MMMM y G",
+ "timeFormat-medium": "HH.mm.ss",
+ "dateFormatItem-Hm": "HH.mm",
+ "dateFormatItem-yyMM": "MM/y G",
+ "dateFormat-medium": "d. MMM y G",
+ "dateFormatItem-Hms": "HH.mm.ss",
+ "dateFormatItem-yyMMM": "MMM y G",
+ "dateFormatItem-ms": "mm.ss",
+ "dateFormatItem-MMMMEd": "E, d. MMMM",
+ "dateFormatItem-yyyyMEd": "EEE. d/M/y G",
+ "dateFormatItem-MMMd": "d. MMM",
+ "dateFormatItem-yyQ": "Q. 'kvartal' y G",
+ "timeFormat-long": "HH.mm.ss z",
+ "timeFormat-short": "HH.mm",
+ "dateFormatItem-H": "HH",
+ "quarters-format-abbr": [
+ "K1",
+ "K2",
+ "K3",
+ "K4"
+ ],
+ "days-format-abbr": [
+ "søn",
+ "man",
+ "tir",
+ "ons",
+ "tor",
+ "fre",
+ "lør"
+ ],
+ "dateFormatItem-M": "M",
+ "dateFormatItem-yyyyQQQ": "QQQ y G",
+ "dateFormatItem-MEd": "E. d/M",
+ "dateFormatItem-hm": "h.mm a",
+ "dateFormat-short": "d/M/y G",
+ "dateFormatItem-yyyyM": "M/y G",
+ "dateFormatItem-yMMMEd": "EEE. d. MMM y",
+ "dateFormat-full": "EEEE d. MMMM y G",
+ "dateFormatItem-Md": "d/M",
+ "dateFormatItem-yyyyQ": "Q y G",
+ "dateFormatItem-yMEd": "EEE. d/M/y",
+ "dateFormatItem-yyyyMMM": "MMM y G",
+ "dateFormatItem-d": "d.",
+ "quarters-format-wide": [
+ "1. kvartal",
+ "2. kvartal",
+ "3. kvartal",
+ "4. kvartal"
+ ],
+ "days-format-wide": [
+ "søndag",
+ "mandag",
+ "tirsdag",
+ "onsdag",
+ "torsdag",
+ "fredag",
+ "lørdag"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/da/number.js b/lib/dojo/cldr/nls/da/number.js
index a0aa79acc..2c47557ab 100644
--- a/lib/dojo/cldr/nls/da/number.js
+++ b/lib/dojo/cldr/nls/da/number.js
@@ -1 +1,8 @@
-({"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":",","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/da/number",{"group":".","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0 %","list":",","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/da/number.js.uncompressed.js b/lib/dojo/cldr/nls/da/number.js.uncompressed.js
new file mode 100644
index 000000000..5bb9953c3
--- /dev/null
+++ b/lib/dojo/cldr/nls/da/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/da/number", //begin v1.x content
+{
+ "group": ".",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0 %",
+ "list": ",",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/de/buddhist.js b/lib/dojo/cldr/nls/de/buddhist.js
index c1dc677bc..a384aebb5 100644
--- a/lib/dojo/cldr/nls/de/buddhist.js
+++ b/lib/dojo/cldr/nls/de/buddhist.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"M.y G","dateFormatItem-yyMMdd":"dd.MM.y G","dateFormatItem-yQ":"Q y G","dayPeriods-format-wide-pm":"nachm.","dateFormatItem-MMMEd":"E, d. MMM","dateFormatItem-yQQQ":"QQQ y G","dateFormatItem-MMdd":"dd.MM.","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dayPeriods-format-wide-am":"vorm.","dateFormatItem-y":"y G","dateFormatItem-yyyy":"y G","months-standAlone-abbr":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"dateFormatItem-Ed":"E d.","dateFormatItem-yMMM":"MMM y G","days-standAlone-narrow":["S","M","D","M","D","F","S"],"dateFormatItem-yyyyMMMM":"MMMM y G","dateFormat-long":"d. MMMM y G","dateFormatItem-Hm":"HH:mm","dateFormatItem-MMd":"d.MM.","dateFormatItem-yyMM":"MM.y G","dateFormat-medium":"d. MMM y G","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-yyMMM":"MMM y G","dateFormatItem-yyQQQQ":"QQQQ y G","dateFormatItem-ms":"mm:ss","dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q y G","months-format-abbr":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"dateFormatItem-H":"HH 'Uhr'","days-format-abbr":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"dateFormatItem-MMMMdd":"dd. MMMM","dateFormatItem-M":"L","dateFormatItem-MEd":"E, d.M.","dateFormat-short":"d.M.yyyy","dateFormatItem-yMMMEd":"EEE, d. MMM y G","dateFormat-full":"EEEE d. MMMM y G","dateFormatItem-Md":"d.M.","dateFormatItem-yMEd":"EEE, d.M.y G","months-format-wide":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"dateFormatItem-d":"d","quarters-format-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"days-format-wide":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"eraNarrow":["BE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","timeFormat-long":"HH:mm:ss z","dateTimeFormats-appendItem-Era":"{0} {1}","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"timeFormat-medium":"HH:mm:ss","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["BE"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","eraNames":["BE"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/de/buddhist",{"dateFormatItem-yM":"M.y G","dateFormatItem-yyMMdd":"dd.MM.y G","dateFormatItem-yQ":"Q y G","dayPeriods-format-wide-pm":"nachm.","dateFormatItem-MMMEd":"E, d. MMM","dateFormatItem-yQQQ":"QQQ y G","dateFormatItem-MMdd":"dd.MM.","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dayPeriods-format-wide-am":"vorm.","dateFormatItem-y":"y G","dateFormatItem-yyyy":"y G","months-standAlone-abbr":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"dateFormatItem-Ed":"E d.","dateFormatItem-yMMM":"MMM y G","days-standAlone-narrow":["S","M","D","M","D","F","S"],"dateFormatItem-yyyyMMMM":"MMMM y G","dateFormat-long":"d. MMMM y G","dateFormatItem-Hm":"HH:mm","dateFormatItem-MMd":"d.MM.","dateFormatItem-yyMM":"MM.y G","dateFormat-medium":"d. MMM y G","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-yyMMM":"MMM y G","dateFormatItem-yyQQQQ":"QQQQ y G","dateFormatItem-ms":"mm:ss","dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q y G","months-format-abbr":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"dateFormatItem-H":"HH 'Uhr'","days-format-abbr":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"dateFormatItem-MMMMdd":"dd. MMMM","dateFormatItem-M":"L","dateFormatItem-MEd":"E, d.M.","dateFormat-short":"d.M.yyyy","dateFormatItem-yMMMEd":"EEE, d. MMM y G","dateFormat-full":"EEEE d. MMMM y G","dateFormatItem-Md":"d.M.","dateFormatItem-yMEd":"EEE, d.M.y G","months-format-wide":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"dateFormatItem-d":"d","quarters-format-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"days-format-wide":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/de/buddhist.js.uncompressed.js b/lib/dojo/cldr/nls/de/buddhist.js.uncompressed.js
new file mode 100644
index 000000000..51ddfc6ba
--- /dev/null
+++ b/lib/dojo/cldr/nls/de/buddhist.js.uncompressed.js
@@ -0,0 +1,130 @@
+define(
+"dojo/cldr/nls/de/buddhist", //begin v1.x content
+{
+ "dateFormatItem-yM": "M.y G",
+ "dateFormatItem-yyMMdd": "dd.MM.y G",
+ "dateFormatItem-yQ": "Q y G",
+ "dayPeriods-format-wide-pm": "nachm.",
+ "dateFormatItem-MMMEd": "E, d. MMM",
+ "dateFormatItem-yQQQ": "QQQ y G",
+ "dateFormatItem-MMdd": "dd.MM.",
+ "dateFormatItem-MMM": "LLL",
+ "months-standAlone-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dayPeriods-format-wide-am": "vorm.",
+ "dateFormatItem-y": "y G",
+ "dateFormatItem-yyyy": "y G",
+ "months-standAlone-abbr": [
+ "Jan",
+ "Feb",
+ "Mär",
+ "Apr",
+ "Mai",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Dez"
+ ],
+ "dateFormatItem-Ed": "E d.",
+ "dateFormatItem-yMMM": "MMM y G",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "D",
+ "M",
+ "D",
+ "F",
+ "S"
+ ],
+ "dateFormatItem-yyyyMMMM": "MMMM y G",
+ "dateFormat-long": "d. MMMM y G",
+ "dateFormatItem-Hm": "HH:mm",
+ "dateFormatItem-MMd": "d.MM.",
+ "dateFormatItem-yyMM": "MM.y G",
+ "dateFormat-medium": "d. MMM y G",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-yyMMM": "MMM y G",
+ "dateFormatItem-yyQQQQ": "QQQQ y G",
+ "dateFormatItem-ms": "mm:ss",
+ "dateFormatItem-MMMd": "d. MMM",
+ "dateFormatItem-yyQ": "Q y G",
+ "months-format-abbr": [
+ "Jan",
+ "Feb",
+ "Mär",
+ "Apr",
+ "Mai",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Dez"
+ ],
+ "dateFormatItem-H": "HH 'Uhr'",
+ "days-format-abbr": [
+ "So.",
+ "Mo.",
+ "Di.",
+ "Mi.",
+ "Do.",
+ "Fr.",
+ "Sa."
+ ],
+ "dateFormatItem-MMMMdd": "dd. MMMM",
+ "dateFormatItem-M": "L",
+ "dateFormatItem-MEd": "E, d.M.",
+ "dateFormat-short": "d.M.yyyy",
+ "dateFormatItem-yMMMEd": "EEE, d. MMM y G",
+ "dateFormat-full": "EEEE d. MMMM y G",
+ "dateFormatItem-Md": "d.M.",
+ "dateFormatItem-yMEd": "EEE, d.M.y G",
+ "months-format-wide": [
+ "Januar",
+ "Februar",
+ "März",
+ "April",
+ "Mai",
+ "Juni",
+ "Juli",
+ "August",
+ "September",
+ "Oktober",
+ "November",
+ "Dezember"
+ ],
+ "dateFormatItem-d": "d",
+ "quarters-format-wide": [
+ "1. Quartal",
+ "2. Quartal",
+ "3. Quartal",
+ "4. Quartal"
+ ],
+ "days-format-wide": [
+ "Sonntag",
+ "Montag",
+ "Dienstag",
+ "Mittwoch",
+ "Donnerstag",
+ "Freitag",
+ "Samstag"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/de/currency.js b/lib/dojo/cldr/nls/de/currency.js
index 1fda2ecf3..48fddd322 100644
--- a/lib/dojo/cldr/nls/de/currency.js
+++ b/lib/dojo/cldr/nls/de/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Hongkong-Dollar","CHF_displayName":"Schweizer Franken","JPY_symbol":"¥","CAD_displayName":"Kanadischer Dollar","CNY_displayName":"Renminbi Yuan","USD_symbol":"$","AUD_displayName":"Australischer Dollar","JPY_displayName":"Yen","USD_displayName":"US-Dollar","GBP_displayName":"Pfund Sterling","EUR_displayName":"Euro","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/de/currency",{"HKD_displayName":"Hongkong-Dollar","CHF_displayName":"Schweizer Franken","JPY_symbol":"¥","CAD_displayName":"Kanadischer Dollar","CNY_displayName":"Renminbi Yuan","USD_symbol":"$","AUD_displayName":"Australischer Dollar","JPY_displayName":"Yen","USD_displayName":"US-Dollar","GBP_displayName":"Pfund Sterling","EUR_displayName":"Euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/de/currency.js.uncompressed.js b/lib/dojo/cldr/nls/de/currency.js.uncompressed.js
new file mode 100644
index 000000000..4b6b30fd8
--- /dev/null
+++ b/lib/dojo/cldr/nls/de/currency.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dojo/cldr/nls/de/currency", //begin v1.x content
+{
+ "HKD_displayName": "Hongkong-Dollar",
+ "CHF_displayName": "Schweizer Franken",
+ "JPY_symbol": "¥",
+ "CAD_displayName": "Kanadischer Dollar",
+ "CNY_displayName": "Renminbi Yuan",
+ "USD_symbol": "$",
+ "AUD_displayName": "Australischer Dollar",
+ "JPY_displayName": "Yen",
+ "USD_displayName": "US-Dollar",
+ "GBP_displayName": "Pfund Sterling",
+ "EUR_displayName": "Euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/de/gregorian.js b/lib/dojo/cldr/nls/de/gregorian.js
index 4a1395dd5..351f2afc7 100644
--- a/lib/dojo/cldr/nls/de/gregorian.js
+++ b/lib/dojo/cldr/nls/de/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"Wochentag","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE, d.M.y","dateFormatItem-MMMEd":"E, d. MMM","eraNarrow":["v. Chr.","n. Chr."],"dayPeriods-format-wide-earlyMorning":"morgens","dayPeriods-format-wide-morning":"vormittags","dateFormat-long":"d. MMMM y","months-format-wide":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"dayPeriods-format-wide-evening":"abends","dayPeriods-format-wide-pm":"nachm.","dateFormat-full":"EEEE, d. MMMM y","dateFormatItem-Md":"d.M.","dateFormatItem-yyMMdd":"dd.MM.yy","dayPeriods-format-wide-noon":"Mittag","field-era":"Epoche","dateFormatItem-yM":"M.y","months-standAlone-wide":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"timeFormat-short":"HH:mm","quarters-format-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"timeFormat-long":"HH:mm:ss z","field-year":"Jahr","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q y","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"Stunde","dateFormatItem-MMdd":"dd.MM.","months-format-abbr":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"heute","field-day-relative+1":"morgen","field-day-relative+2":"übermorgen","dateFormatItem-H":"HH 'Uhr'","field-day-relative+3":"überübermorgen","months-standAlone-abbr":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"dateFormatItem-M":"L","days-standAlone-wide":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","eraAbbr":["v. Chr.","n. Chr."],"field-minute":"Minute","field-dayperiod":"Tageshälfte","days-standAlone-abbr":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"dayPeriods-format-wide-night":"nachts","dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"gestern","field-day-relative+-2":"vorgestern","field-day-relative+-3":"vorvorgestern","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E, d.M.","field-day":"Tag","days-format-wide":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"field-zone":"Zone","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM.yy","days-format-abbr":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"eraNames":["v. Chr.","n. Chr."],"days-format-narrow":["S","M","D","M","D","F","S"],"field-month":"Monat","days-standAlone-narrow":["S","M","D","M","D","F","S"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"vorm.","dateFormatItem-MMMMdd":"dd. MMMM","dateFormat-short":"dd.MM.yy","dateFormatItem-MMd":"d.MM.","dayPeriods-format-wide-afternoon":"nachmittags","field-second":"Sekunde","dateFormatItem-yMMMEd":"EEE, d. MMM y","dateFormatItem-Ed":"E, d.","field-week":"Woche","dateFormat-medium":"dd.MM.yyyy","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-yyyy":"y","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/de/gregorian",{"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"Wochentag","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE, d.M.y","dateFormatItem-MMMEd":"E, d. MMM","eraNarrow":["v. Chr.","n. Chr."],"dayPeriods-format-wide-earlyMorning":"morgens","dayPeriods-format-wide-morning":"vormittags","dateFormat-long":"d. MMMM y","months-format-wide":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"dayPeriods-format-wide-evening":"abends","dayPeriods-format-wide-pm":"nachm.","dateFormat-full":"EEEE, d. MMMM y","dateFormatItem-Md":"d.M.","dateFormatItem-yyMMdd":"dd.MM.yy","dayPeriods-format-wide-noon":"Mittag","field-era":"Epoche","dateFormatItem-yM":"M.y","months-standAlone-wide":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"timeFormat-short":"HH:mm","quarters-format-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"timeFormat-long":"HH:mm:ss z","field-year":"Jahr","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q y","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"Stunde","dateFormatItem-MMdd":"dd.MM.","months-format-abbr":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"heute","field-day-relative+1":"morgen","field-day-relative+2":"übermorgen","dateFormatItem-H":"HH 'Uhr'","field-day-relative+3":"überübermorgen","months-standAlone-abbr":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"dateFormatItem-M":"L","days-standAlone-wide":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","eraAbbr":["v. Chr.","n. Chr."],"field-minute":"Minute","field-dayperiod":"Tageshälfte","days-standAlone-abbr":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"dayPeriods-format-wide-night":"nachts","dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"gestern","field-day-relative+-2":"vorgestern","field-day-relative+-3":"vorvorgestern","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E, d.M.","field-day":"Tag","days-format-wide":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"field-zone":"Zone","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM.yy","days-format-abbr":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"eraNames":["v. Chr.","n. Chr."],"days-format-narrow":["S","M","D","M","D","F","S"],"field-month":"Monat","days-standAlone-narrow":["S","M","D","M","D","F","S"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"vorm.","dateFormatItem-MMMMdd":"dd. MMMM","dateFormat-short":"dd.MM.yy","dateFormatItem-MMd":"d.MM.","dayPeriods-format-wide-afternoon":"nachmittags","field-second":"Sekunde","dateFormatItem-yMMMEd":"EEE, d. MMM y","dateFormatItem-Ed":"E, d.","field-week":"Woche","dateFormat-medium":"dd.MM.yyyy","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-yyyy":"y"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/de/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/de/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..23626bea1
--- /dev/null
+++ b/lib/dojo/cldr/nls/de/gregorian.js.uncompressed.js
@@ -0,0 +1,237 @@
+define(
+"dojo/cldr/nls/de/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "field-weekday": "Wochentag",
+ "dateFormatItem-yyQQQQ": "QQQQ yy",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yMEd": "EEE, d.M.y",
+ "dateFormatItem-MMMEd": "E, d. MMM",
+ "eraNarrow": [
+ "v. Chr.",
+ "n. Chr."
+ ],
+ "dayPeriods-format-wide-earlyMorning": "morgens",
+ "dayPeriods-format-wide-morning": "vormittags",
+ "dateFormat-long": "d. MMMM y",
+ "months-format-wide": [
+ "Januar",
+ "Februar",
+ "März",
+ "April",
+ "Mai",
+ "Juni",
+ "Juli",
+ "August",
+ "September",
+ "Oktober",
+ "November",
+ "Dezember"
+ ],
+ "dayPeriods-format-wide-evening": "abends",
+ "dayPeriods-format-wide-pm": "nachm.",
+ "dateFormat-full": "EEEE, d. MMMM y",
+ "dateFormatItem-Md": "d.M.",
+ "dateFormatItem-yyMMdd": "dd.MM.yy",
+ "dayPeriods-format-wide-noon": "Mittag",
+ "field-era": "Epoche",
+ "dateFormatItem-yM": "M.y",
+ "months-standAlone-wide": [
+ "Januar",
+ "Februar",
+ "März",
+ "April",
+ "Mai",
+ "Juni",
+ "Juli",
+ "August",
+ "September",
+ "Oktober",
+ "November",
+ "Dezember"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "1. Quartal",
+ "2. Quartal",
+ "3. Quartal",
+ "4. Quartal"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "field-year": "Jahr",
+ "dateFormatItem-yMMM": "MMM y",
+ "dateFormatItem-yQ": "Q y",
+ "dateFormatItem-yyyyMMMM": "MMMM y",
+ "field-hour": "Stunde",
+ "dateFormatItem-MMdd": "dd.MM.",
+ "months-format-abbr": [
+ "Jan",
+ "Feb",
+ "Mär",
+ "Apr",
+ "Mai",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Dez"
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "field-day-relative+0": "heute",
+ "field-day-relative+1": "morgen",
+ "field-day-relative+2": "übermorgen",
+ "dateFormatItem-H": "HH 'Uhr'",
+ "field-day-relative+3": "überübermorgen",
+ "months-standAlone-abbr": [
+ "Jan",
+ "Feb",
+ "Mär",
+ "Apr",
+ "Mai",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Dez"
+ ],
+ "quarters-format-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "quarters-standAlone-wide": [
+ "1. Quartal",
+ "2. Quartal",
+ "3. Quartal",
+ "4. Quartal"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "Sonntag",
+ "Montag",
+ "Dienstag",
+ "Mittwoch",
+ "Donnerstag",
+ "Freitag",
+ "Samstag"
+ ],
+ "dateFormatItem-yyMMM": "MMM yy",
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "eraAbbr": [
+ "v. Chr.",
+ "n. Chr."
+ ],
+ "field-minute": "Minute",
+ "field-dayperiod": "Tageshälfte",
+ "days-standAlone-abbr": [
+ "So.",
+ "Mo.",
+ "Di.",
+ "Mi.",
+ "Do.",
+ "Fr.",
+ "Sa."
+ ],
+ "dayPeriods-format-wide-night": "nachts",
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "gestern",
+ "field-day-relative+-2": "vorgestern",
+ "field-day-relative+-3": "vorvorgestern",
+ "dateFormatItem-MMMd": "d. MMM",
+ "dateFormatItem-MEd": "E, d.M.",
+ "field-day": "Tag",
+ "days-format-wide": [
+ "Sonntag",
+ "Montag",
+ "Dienstag",
+ "Mittwoch",
+ "Donnerstag",
+ "Freitag",
+ "Samstag"
+ ],
+ "field-zone": "Zone",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateFormatItem-yyMM": "MM.yy",
+ "days-format-abbr": [
+ "So.",
+ "Mo.",
+ "Di.",
+ "Mi.",
+ "Do.",
+ "Fr.",
+ "Sa."
+ ],
+ "eraNames": [
+ "v. Chr.",
+ "n. Chr."
+ ],
+ "days-format-narrow": [
+ "S",
+ "M",
+ "D",
+ "M",
+ "D",
+ "F",
+ "S"
+ ],
+ "field-month": "Monat",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "D",
+ "M",
+ "D",
+ "F",
+ "S"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "vorm.",
+ "dateFormatItem-MMMMdd": "dd. MMMM",
+ "dateFormat-short": "dd.MM.yy",
+ "dateFormatItem-MMd": "d.MM.",
+ "dayPeriods-format-wide-afternoon": "nachmittags",
+ "field-second": "Sekunde",
+ "dateFormatItem-yMMMEd": "EEE, d. MMM y",
+ "dateFormatItem-Ed": "E, d.",
+ "field-week": "Woche",
+ "dateFormat-medium": "dd.MM.yyyy",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-yyyy": "y"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/de/islamic.js b/lib/dojo/cldr/nls/de/islamic.js
index 1f3b7a879..f167bc7c1 100644
--- a/lib/dojo/cldr/nls/de/islamic.js
+++ b/lib/dojo/cldr/nls/de/islamic.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"M.y","dateFormatItem-yyyyMMMEd":"EEE, d. MMM y G","dateFormatItem-yyMMdd":"dd.MM.y G","dateFormatItem-yQ":"Q y","dayPeriods-format-wide-pm":"nachm.","eraNames":["AH"],"dateFormatItem-MMMEd":"E, d. MMM","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-MMdd":"dd.MM.","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dayPeriods-format-wide-am":"vorm.","dateFormatItem-yyyy":"y G","months-standAlone-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateFormatItem-Ed":"E d.","dateFormatItem-yMMM":"MMM y","days-standAlone-narrow":["S","M","D","M","D","F","S"],"eraAbbr":["AH"],"dateFormatItem-yyyyMMMM":"MMMM y G","dateFormat-long":"d. MMMM y G","dateFormatItem-Hm":"HH:mm","dateFormatItem-MMd":"d.MM.","dateFormatItem-yyMM":"MM.y G","dateFormat-medium":"d. MMM y G","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-yyMMM":"MMM y G","dateFormatItem-yyQQQQ":"QQQQ y G","dateFormatItem-ms":"mm:ss","months-standAlone-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yyyyMEd":"EEE, d.M.y G","dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q y G","months-format-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateFormatItem-H":"HH 'Uhr'","dateFormatItem-MMMMdd":"dd. MMMM","days-format-abbr":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"dateFormatItem-M":"L","dateFormatItem-MEd":"E, d.M.","dateFormatItem-yyyyQQQ":"QQQ y G","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormat-short":"d.M.y G","dateFormatItem-yyyyM":"M.y G","dateFormatItem-yMMMEd":"EEE, d. MMM y","dateFormat-full":"EEEE d. MMMM y G","dateFormatItem-Md":"d.M.","dateFormatItem-yyyyQ":"Q y G","dateFormatItem-yMEd":"EEE, d.M.y","months-format-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yyyyMMM":"MMM y G","dateFormatItem-d":"d","quarters-format-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"eraNarrow":["AH"],"days-format-wide":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","timeFormat-short":"HH:mm","timeFormat-long":"HH:mm:ss z","dateTimeFormats-appendItem-Era":"{0} {1}","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"timeFormat-medium":"HH:mm:ss","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/de/islamic",{"dateFormatItem-yM":"M.y","dateFormatItem-yyyyMMMEd":"EEE, d. MMM y G","dateFormatItem-yyMMdd":"dd.MM.y G","dateFormatItem-yQ":"Q y","dayPeriods-format-wide-pm":"nachm.","eraNames":["AH"],"dateFormatItem-MMMEd":"E, d. MMM","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-MMdd":"dd.MM.","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dayPeriods-format-wide-am":"vorm.","dateFormatItem-yyyy":"y G","months-standAlone-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateFormatItem-Ed":"E d.","dateFormatItem-yMMM":"MMM y","days-standAlone-narrow":["S","M","D","M","D","F","S"],"eraAbbr":["AH"],"dateFormatItem-yyyyMMMM":"MMMM y G","dateFormat-long":"d. MMMM y G","dateFormatItem-Hm":"HH:mm","dateFormatItem-MMd":"d.MM.","dateFormatItem-yyMM":"MM.y G","dateFormat-medium":"d. MMM y G","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-yyMMM":"MMM y G","dateFormatItem-yyQQQQ":"QQQQ y G","dateFormatItem-ms":"mm:ss","months-standAlone-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yyyyMEd":"EEE, d.M.y G","dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q y G","months-format-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateFormatItem-H":"HH 'Uhr'","dateFormatItem-MMMMdd":"dd. MMMM","days-format-abbr":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"dateFormatItem-M":"L","dateFormatItem-MEd":"E, d.M.","dateFormatItem-yyyyQQQ":"QQQ y G","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormat-short":"d.M.y G","dateFormatItem-yyyyM":"M.y G","dateFormatItem-yMMMEd":"EEE, d. MMM y","dateFormat-full":"EEEE d. MMMM y G","dateFormatItem-Md":"d.M.","dateFormatItem-yyyyQ":"Q y G","dateFormatItem-yMEd":"EEE, d.M.y","months-format-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yyyyMMM":"MMM y G","dateFormatItem-d":"d","quarters-format-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"eraNarrow":["AH"],"days-format-wide":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/de/islamic.js.uncompressed.js b/lib/dojo/cldr/nls/de/islamic.js.uncompressed.js
new file mode 100644
index 000000000..023d1c782
--- /dev/null
+++ b/lib/dojo/cldr/nls/de/islamic.js.uncompressed.js
@@ -0,0 +1,172 @@
+define(
+"dojo/cldr/nls/de/islamic", //begin v1.x content
+{
+ "dateFormatItem-yM": "M.y",
+ "dateFormatItem-yyyyMMMEd": "EEE, d. MMM y G",
+ "dateFormatItem-yyMMdd": "dd.MM.y G",
+ "dateFormatItem-yQ": "Q y",
+ "dayPeriods-format-wide-pm": "nachm.",
+ "eraNames": [
+ "AH"
+ ],
+ "dateFormatItem-MMMEd": "E, d. MMM",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-MMdd": "dd.MM.",
+ "dateFormatItem-MMM": "LLL",
+ "months-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dayPeriods-format-wide-am": "vorm.",
+ "dateFormatItem-yyyy": "y G",
+ "months-standAlone-abbr": [
+ "Muh.",
+ "Saf.",
+ "Rab. I",
+ "Rab. II",
+ "Jum. I",
+ "Jum. II",
+ "Raj.",
+ "Sha.",
+ "Ram.",
+ "Shaw.",
+ "Dhuʻl-Q.",
+ "Dhuʻl-H."
+ ],
+ "dateFormatItem-Ed": "E d.",
+ "dateFormatItem-yMMM": "MMM y",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "D",
+ "M",
+ "D",
+ "F",
+ "S"
+ ],
+ "eraAbbr": [
+ "AH"
+ ],
+ "dateFormatItem-yyyyMMMM": "MMMM y G",
+ "dateFormat-long": "d. MMMM y G",
+ "dateFormatItem-Hm": "HH:mm",
+ "dateFormatItem-MMd": "d.MM.",
+ "dateFormatItem-yyMM": "MM.y G",
+ "dateFormat-medium": "d. MMM y G",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-yyMMM": "MMM y G",
+ "dateFormatItem-yyQQQQ": "QQQQ y G",
+ "dateFormatItem-ms": "mm:ss",
+ "months-standAlone-wide": [
+ "Muharram",
+ "Safar",
+ "Rabiʻ I",
+ "Rabiʻ II",
+ "Jumada I",
+ "Jumada II",
+ "Rajab",
+ "Shaʻban",
+ "Ramadan",
+ "Shawwal",
+ "Dhuʻl-Qiʻdah",
+ "Dhuʻl-Hijjah"
+ ],
+ "dateFormatItem-yyyyMEd": "EEE, d.M.y G",
+ "dateFormatItem-MMMd": "d. MMM",
+ "dateFormatItem-yyQ": "Q y G",
+ "months-format-abbr": [
+ "Muh.",
+ "Saf.",
+ "Rab. I",
+ "Rab. II",
+ "Jum. I",
+ "Jum. II",
+ "Raj.",
+ "Sha.",
+ "Ram.",
+ "Shaw.",
+ "Dhuʻl-Q.",
+ "Dhuʻl-H."
+ ],
+ "dateFormatItem-H": "HH 'Uhr'",
+ "dateFormatItem-MMMMdd": "dd. MMMM",
+ "days-format-abbr": [
+ "So.",
+ "Mo.",
+ "Di.",
+ "Mi.",
+ "Do.",
+ "Fr.",
+ "Sa."
+ ],
+ "dateFormatItem-M": "L",
+ "dateFormatItem-MEd": "E, d.M.",
+ "dateFormatItem-yyyyQQQ": "QQQ y G",
+ "months-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dateFormat-short": "d.M.y G",
+ "dateFormatItem-yyyyM": "M.y G",
+ "dateFormatItem-yMMMEd": "EEE, d. MMM y",
+ "dateFormat-full": "EEEE d. MMMM y G",
+ "dateFormatItem-Md": "d.M.",
+ "dateFormatItem-yyyyQ": "Q y G",
+ "dateFormatItem-yMEd": "EEE, d.M.y",
+ "months-format-wide": [
+ "Muharram",
+ "Safar",
+ "Rabiʻ I",
+ "Rabiʻ II",
+ "Jumada I",
+ "Jumada II",
+ "Rajab",
+ "Shaʻban",
+ "Ramadan",
+ "Shawwal",
+ "Dhuʻl-Qiʻdah",
+ "Dhuʻl-Hijjah"
+ ],
+ "dateFormatItem-yyyyMMM": "MMM y G",
+ "dateFormatItem-d": "d",
+ "quarters-format-wide": [
+ "1. Quartal",
+ "2. Quartal",
+ "3. Quartal",
+ "4. Quartal"
+ ],
+ "eraNarrow": [
+ "AH"
+ ],
+ "days-format-wide": [
+ "Sonntag",
+ "Montag",
+ "Dienstag",
+ "Mittwoch",
+ "Donnerstag",
+ "Freitag",
+ "Samstag"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/de/number.js b/lib/dojo/cldr/nls/de/number.js
index 5fbf57bf2..a91109e01 100644
--- a/lib/dojo/cldr/nls/de/number.js
+++ b/lib/dojo/cldr/nls/de/number.js
@@ -1 +1,8 @@
-({"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/de/number",{"group":".","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0 %","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/de/number.js.uncompressed.js b/lib/dojo/cldr/nls/de/number.js.uncompressed.js
new file mode 100644
index 000000000..4c04aa59b
--- /dev/null
+++ b/lib/dojo/cldr/nls/de/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/de/number", //begin v1.x content
+{
+ "group": ".",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0 %",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/el/buddhist.js b/lib/dojo/cldr/nls/el/buddhist.js
index 4715b4650..be3931086 100644
--- a/lib/dojo/cldr/nls/el/buddhist.js
+++ b/lib/dojo/cldr/nls/el/buddhist.js
@@ -1 +1,8 @@
-({"quarters-format-abbr":["Τ1","Τ2","Τ3","Τ4"],"dateFormat-medium":"d MMM, y G","dateFormatItem-MMMEd":"E, d MMM","dateFormatItem-MEd":"E, d/M","dateFormatItem-yMEd":"EEE, d/M/yyyy","timeFormat-full":"h:mm:ss a zzzz","dateFormatItem-Md":"d/M","months-standAlone-narrow":["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],"months-standAlone-wide":["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],"dateFormatItem-EEEd":"EEE d","days-standAlone-narrow":["Κ","Δ","Τ","Τ","Π","Π","Σ"],"dayPeriods-format-wide-pm":"μ.μ.","dayPeriods-format-wide-am":"π.μ.","timeFormat-medium":"h:mm:ss a","dateFormat-long":"d MMMM, y G","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE, d MMM y","months-format-wide":["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου"],"dateFormatItem-yM":"M/yyyy","timeFormat-short":"h:mm a","months-format-abbr":["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],"timeFormat-long":"h:mm:ss a z","days-format-wide":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"dateFormatItem-yMMM":"LLL y","quarters-format-wide":["1ο τρίμηνο","2ο τρίμηνο","3ο τρίμηνο","4ο τρίμηνο"],"dateFormat-full":"EEEE, d MMMM, y G","dateFormatItem-MMMd":"d MMM","days-format-abbr":["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"y QQQ","eraNarrow":["BE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["BE"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","eraNames":["BE"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/el/buddhist",{"quarters-format-abbr":["Τ1","Τ2","Τ3","Τ4"],"dateFormat-medium":"d MMM, y G","dateFormatItem-MMMEd":"E, d MMM","dateFormatItem-MEd":"E, d/M","dateFormatItem-yMEd":"EEE, d/M/yyyy","timeFormat-full":"h:mm:ss a zzzz","dateFormatItem-Md":"d/M","months-standAlone-narrow":["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],"months-standAlone-wide":["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],"dateFormatItem-EEEd":"EEE d","days-standAlone-narrow":["Κ","Δ","Τ","Τ","Π","Π","Σ"],"dayPeriods-format-wide-pm":"μ.μ.","dayPeriods-format-wide-am":"π.μ.","timeFormat-medium":"h:mm:ss a","dateFormat-long":"d MMMM, y G","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE, d MMM y","months-format-wide":["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου"],"dateFormatItem-yM":"M/yyyy","timeFormat-short":"h:mm a","months-format-abbr":["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],"timeFormat-long":"h:mm:ss a z","days-format-wide":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"dateFormatItem-yMMM":"LLL y","quarters-format-wide":["1ο τρίμηνο","2ο τρίμηνο","3ο τρίμηνο","4ο τρίμηνο"],"dateFormat-full":"EEEE, d MMMM, y G","dateFormatItem-MMMd":"d MMM","days-format-abbr":["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/el/buddhist.js.uncompressed.js b/lib/dojo/cldr/nls/el/buddhist.js.uncompressed.js
new file mode 100644
index 000000000..e874e2a46
--- /dev/null
+++ b/lib/dojo/cldr/nls/el/buddhist.js.uncompressed.js
@@ -0,0 +1,120 @@
+define(
+"dojo/cldr/nls/el/buddhist", //begin v1.x content
+{
+ "quarters-format-abbr": [
+ "Τ1",
+ "Τ2",
+ "Τ3",
+ "Τ4"
+ ],
+ "dateFormat-medium": "d MMM, y G",
+ "dateFormatItem-MMMEd": "E, d MMM",
+ "dateFormatItem-MEd": "E, d/M",
+ "dateFormatItem-yMEd": "EEE, d/M/yyyy",
+ "timeFormat-full": "h:mm:ss a zzzz",
+ "dateFormatItem-Md": "d/M",
+ "months-standAlone-narrow": [
+ "Ι",
+ "Φ",
+ "Μ",
+ "Α",
+ "Μ",
+ "Ι",
+ "Ι",
+ "Α",
+ "Σ",
+ "Ο",
+ "Ν",
+ "Δ"
+ ],
+ "months-standAlone-wide": [
+ "Ιανουάριος",
+ "Φεβρουάριος",
+ "Μάρτιος",
+ "Απρίλιος",
+ "Μάιος",
+ "Ιούνιος",
+ "Ιούλιος",
+ "Αύγουστος",
+ "Σεπτέμβριος",
+ "Οκτώβριος",
+ "Νοέμβριος",
+ "Δεκέμβριος"
+ ],
+ "dateFormatItem-EEEd": "EEE d",
+ "days-standAlone-narrow": [
+ "Κ",
+ "Δ",
+ "Τ",
+ "Τ",
+ "Π",
+ "Π",
+ "Σ"
+ ],
+ "dayPeriods-format-wide-pm": "μ.μ.",
+ "dayPeriods-format-wide-am": "π.μ.",
+ "timeFormat-medium": "h:mm:ss a",
+ "dateFormat-long": "d MMMM, y G",
+ "dateFormat-short": "d/M/yyyy",
+ "dateFormatItem-yMMMEd": "EEE, d MMM y",
+ "months-format-wide": [
+ "Ιανουαρίου",
+ "Φεβρουαρίου",
+ "Μαρτίου",
+ "Απριλίου",
+ "Μαΐου",
+ "Ιουνίου",
+ "Ιουλίου",
+ "Αυγούστου",
+ "Σεπτεμβρίου",
+ "Οκτωβρίου",
+ "Νοεμβρίου",
+ "Δεκεμβρίου"
+ ],
+ "dateFormatItem-yM": "M/yyyy",
+ "timeFormat-short": "h:mm a",
+ "months-format-abbr": [
+ "Ιαν",
+ "Φεβ",
+ "Μαρ",
+ "Απρ",
+ "Μαϊ",
+ "Ιουν",
+ "Ιουλ",
+ "Αυγ",
+ "Σεπ",
+ "Οκτ",
+ "Νοε",
+ "Δεκ"
+ ],
+ "timeFormat-long": "h:mm:ss a z",
+ "days-format-wide": [
+ "Κυριακή",
+ "Δευτέρα",
+ "Τρίτη",
+ "Τετάρτη",
+ "Πέμπτη",
+ "Παρασκευή",
+ "Σάββατο"
+ ],
+ "dateFormatItem-yMMM": "LLL y",
+ "quarters-format-wide": [
+ "1ο τρίμηνο",
+ "2ο τρίμηνο",
+ "3ο τρίμηνο",
+ "4ο τρίμηνο"
+ ],
+ "dateFormat-full": "EEEE, d MMMM, y G",
+ "dateFormatItem-MMMd": "d MMM",
+ "days-format-abbr": [
+ "Κυρ",
+ "Δευ",
+ "Τρι",
+ "Τετ",
+ "Πεμ",
+ "Παρ",
+ "Σαβ"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/el/currency.js b/lib/dojo/cldr/nls/el/currency.js
index 7f2e4e47e..7575180d5 100644
--- a/lib/dojo/cldr/nls/el/currency.js
+++ b/lib/dojo/cldr/nls/el/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Δολάριο Χονγκ Κονγκ","CHF_displayName":"Φράγκο Ελβετίας","CAD_displayName":"Δολάριο Καναδά","CNY_displayName":"Γιουάν Ρενμίμπι Κίνας","AUD_displayName":"Δολάριο Αυστραλίας","JPY_displayName":"Γιεν Ιαπωνίας","USD_displayName":"Δολάριο ΗΠΑ","GBP_displayName":"Λίρα Στερλίνα Βρετανίας","EUR_displayName":"Ευρώ","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/el/currency",{"HKD_displayName":"Δολάριο Χονγκ Κονγκ","CHF_displayName":"Φράγκο Ελβετίας","CAD_displayName":"Δολάριο Καναδά","CNY_displayName":"Γιουάν Ρενμίμπι Κίνας","AUD_displayName":"Δολάριο Αυστραλίας","JPY_displayName":"Γιεν Ιαπωνίας","USD_displayName":"Δολάριο ΗΠΑ","GBP_displayName":"Λίρα Στερλίνα Βρετανίας","EUR_displayName":"Ευρώ"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/el/currency.js.uncompressed.js b/lib/dojo/cldr/nls/el/currency.js.uncompressed.js
new file mode 100644
index 000000000..36aa60c2f
--- /dev/null
+++ b/lib/dojo/cldr/nls/el/currency.js.uncompressed.js
@@ -0,0 +1,15 @@
+define(
+"dojo/cldr/nls/el/currency", //begin v1.x content
+{
+ "HKD_displayName": "Δολάριο Χονγκ Κονγκ",
+ "CHF_displayName": "Φράγκο Ελβετίας",
+ "CAD_displayName": "Δολάριο Καναδά",
+ "CNY_displayName": "Γιουάν Ρενμίμπι Κίνας",
+ "AUD_displayName": "Δολάριο Αυστραλίας",
+ "JPY_displayName": "Γιεν Ιαπωνίας",
+ "USD_displayName": "Δολάριο ΗΠΑ",
+ "GBP_displayName": "Λίρα Στερλίνα Βρετανίας",
+ "EUR_displayName": "Ευρώ"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/el/gregorian.js b/lib/dojo/cldr/nls/el/gregorian.js
index 87644f661..d90137cd7 100644
--- a/lib/dojo/cldr/nls/el/gregorian.js
+++ b/lib/dojo/cldr/nls/el/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],"field-weekday":"Ημέρα εβδομάδας","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, d/M/yyyy","dateFormatItem-MMMEd":"E, d MMM","eraNarrow":["π.Χ.","μ.Χ."],"dateFormat-long":"d MMMM y","months-format-wide":["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου"],"dateFormatItem-EEEd":"EEE d","dayPeriods-format-wide-pm":"μ.μ.","dateFormat-full":"EEEE, d MMMM y","dateFormatItem-Md":"d/M","field-era":"Περίοδος","dateFormatItem-yM":"M/yyyy","months-standAlone-wide":["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],"timeFormat-short":"h:mm a","quarters-format-wide":["1ο τρίμηνο","2ο τρίμηνο","3ο τρίμηνο","4ο τρίμηνο"],"timeFormat-long":"h:mm:ss a z","field-year":"Έτος","dateFormatItem-yMMM":"LLL y","dateFormatItem-yQ":"y Q","dateFormatItem-yyyyMMMM":"LLLL y","field-hour":"Ώρα","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"h:mm:ss a zzzz","field-day-relative+0":"Σήμερα","field-day-relative+1":"Αύριο","field-day-relative+2":"Μεθαύριο","dateFormatItem-H":"HH","field-day-relative+3":"Σε τρεις ημέρες από τώρα","months-standAlone-abbr":["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],"quarters-format-abbr":["Τ1","Τ2","Τ3","Τ4"],"quarters-standAlone-wide":["1ο τρίμηνο","2ο τρίμηνο","3ο τρίμηνο","4ο τρίμηνο"],"dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-M":"L","days-standAlone-wide":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"dateFormatItem-MMMMd":"d MMMM","dateFormatItem-yyMMM":"LLL yy","timeFormat-medium":"h:mm:ss a","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Τ1","Τ2","Τ3","Τ4"],"eraAbbr":["π.Χ.","μ.Χ."],"field-minute":"Λεπτό","field-dayperiod":"π.μ./μ.μ.","days-standAlone-abbr":["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"Χθες","field-day-relative+-2":"Προχθές","field-day-relative+-3":"Πριν από τρεις ημέρες","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, d/M","field-day":"Ημέρα","days-format-wide":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"field-zone":"Ζώνη","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],"dateFormatItem-yyMM":"MM/yy","days-format-abbr":["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],"eraNames":["π.Χ.","μ.Χ."],"days-format-narrow":["Κ","Δ","Τ","Τ","Π","Π","Σ"],"field-month":"Μήνας","days-standAlone-narrow":["Κ","Δ","Τ","Τ","Π","Π","Σ"],"dateFormatItem-MMM":"LLL","dateFormatItem-HHmm":"HH:mm","dayPeriods-format-wide-am":"π.μ.","dateFormatItem-MMMMEd":"E, d MMMM","dateFormatItem-MMMMdd":"dd MMMM","dateFormat-short":"d/M/yy","field-second":"Δευτερόλεπτο","dateFormatItem-yMMMEd":"EEE, d MMM y","dateFormatItem-Ed":"E d","field-week":"Εβδομάδα","dateFormat-medium":"d MMM y","dateFormatItem-mmss":"mm:ss","dateFormatItem-yyyy":"y","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/el/gregorian",{"months-format-narrow":["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],"field-weekday":"Ημέρα εβδομάδας","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, d/M/yyyy","dateFormatItem-MMMEd":"E, d MMM","eraNarrow":["π.Χ.","μ.Χ."],"dateFormat-long":"d MMMM y","months-format-wide":["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου"],"dateFormatItem-EEEd":"EEE d","dayPeriods-format-wide-pm":"μ.μ.","dateFormat-full":"EEEE, d MMMM y","dateFormatItem-Md":"d/M","field-era":"Περίοδος","dateFormatItem-yM":"M/yyyy","months-standAlone-wide":["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],"timeFormat-short":"h:mm a","quarters-format-wide":["1ο τρίμηνο","2ο τρίμηνο","3ο τρίμηνο","4ο τρίμηνο"],"timeFormat-long":"h:mm:ss a z","field-year":"Έτος","dateFormatItem-yMMM":"LLL y","dateFormatItem-yQ":"y Q","dateFormatItem-yyyyMMMM":"LLLL y","field-hour":"Ώρα","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"h:mm:ss a zzzz","field-day-relative+0":"Σήμερα","field-day-relative+1":"Αύριο","field-day-relative+2":"Μεθαύριο","dateFormatItem-H":"HH","field-day-relative+3":"Σε τρεις ημέρες από τώρα","months-standAlone-abbr":["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],"quarters-format-abbr":["Τ1","Τ2","Τ3","Τ4"],"quarters-standAlone-wide":["1ο τρίμηνο","2ο τρίμηνο","3ο τρίμηνο","4ο τρίμηνο"],"dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-M":"L","days-standAlone-wide":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"dateFormatItem-MMMMd":"d MMMM","dateFormatItem-yyMMM":"LLL yy","timeFormat-medium":"h:mm:ss a","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Τ1","Τ2","Τ3","Τ4"],"eraAbbr":["π.Χ.","μ.Χ."],"field-minute":"Λεπτό","field-dayperiod":"π.μ./μ.μ.","days-standAlone-abbr":["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"Χθες","field-day-relative+-2":"Προχθές","field-day-relative+-3":"Πριν από τρεις ημέρες","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, d/M","field-day":"Ημέρα","days-format-wide":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"field-zone":"Ζώνη","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],"dateFormatItem-yyMM":"MM/yy","days-format-abbr":["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],"eraNames":["π.Χ.","μ.Χ."],"days-format-narrow":["Κ","Δ","Τ","Τ","Π","Π","Σ"],"field-month":"Μήνας","days-standAlone-narrow":["Κ","Δ","Τ","Τ","Π","Π","Σ"],"dateFormatItem-MMM":"LLL","dateFormatItem-HHmm":"HH:mm","dayPeriods-format-wide-am":"π.μ.","dateFormatItem-MMMMEd":"E, d MMMM","dateFormatItem-MMMMdd":"dd MMMM","dateFormat-short":"d/M/yy","field-second":"Δευτερόλεπτο","dateFormatItem-yMMMEd":"EEE, d MMM y","dateFormatItem-Ed":"E d","field-week":"Εβδομάδα","dateFormat-medium":"d MMM y","dateFormatItem-mmss":"mm:ss","dateFormatItem-yyyy":"y"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/el/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/el/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..318673fd1
--- /dev/null
+++ b/lib/dojo/cldr/nls/el/gregorian.js.uncompressed.js
@@ -0,0 +1,241 @@
+define(
+"dojo/cldr/nls/el/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "Ι",
+ "Φ",
+ "Μ",
+ "Α",
+ "Μ",
+ "Ι",
+ "Ι",
+ "Α",
+ "Σ",
+ "Ο",
+ "Ν",
+ "Δ"
+ ],
+ "field-weekday": "Ημέρα εβδομάδας",
+ "dateFormatItem-yyQQQQ": "QQQQ yy",
+ "dateFormatItem-yQQQ": "y QQQ",
+ "dateFormatItem-yMEd": "EEE, d/M/yyyy",
+ "dateFormatItem-MMMEd": "E, d MMM",
+ "eraNarrow": [
+ "π.Χ.",
+ "μ.Χ."
+ ],
+ "dateFormat-long": "d MMMM y",
+ "months-format-wide": [
+ "Ιανουαρίου",
+ "Φεβρουαρίου",
+ "Μαρτίου",
+ "Απριλίου",
+ "Μαΐου",
+ "Ιουνίου",
+ "Ιουλίου",
+ "Αυγούστου",
+ "Σεπτεμβρίου",
+ "Οκτωβρίου",
+ "Νοεμβρίου",
+ "Δεκεμβρίου"
+ ],
+ "dateFormatItem-EEEd": "EEE d",
+ "dayPeriods-format-wide-pm": "μ.μ.",
+ "dateFormat-full": "EEEE, d MMMM y",
+ "dateFormatItem-Md": "d/M",
+ "field-era": "Περίοδος",
+ "dateFormatItem-yM": "M/yyyy",
+ "months-standAlone-wide": [
+ "Ιανουάριος",
+ "Φεβρουάριος",
+ "Μάρτιος",
+ "Απρίλιος",
+ "Μάιος",
+ "Ιούνιος",
+ "Ιούλιος",
+ "Αύγουστος",
+ "Σεπτέμβριος",
+ "Οκτώβριος",
+ "Νοέμβριος",
+ "Δεκέμβριος"
+ ],
+ "timeFormat-short": "h:mm a",
+ "quarters-format-wide": [
+ "1ο τρίμηνο",
+ "2ο τρίμηνο",
+ "3ο τρίμηνο",
+ "4ο τρίμηνο"
+ ],
+ "timeFormat-long": "h:mm:ss a z",
+ "field-year": "Έτος",
+ "dateFormatItem-yMMM": "LLL y",
+ "dateFormatItem-yQ": "y Q",
+ "dateFormatItem-yyyyMMMM": "LLLL y",
+ "field-hour": "Ώρα",
+ "dateFormatItem-MMdd": "dd/MM",
+ "months-format-abbr": [
+ "Ιαν",
+ "Φεβ",
+ "Μαρ",
+ "Απρ",
+ "Μαϊ",
+ "Ιουν",
+ "Ιουλ",
+ "Αυγ",
+ "Σεπ",
+ "Οκτ",
+ "Νοε",
+ "Δεκ"
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "h:mm:ss a zzzz",
+ "field-day-relative+0": "Σήμερα",
+ "field-day-relative+1": "Αύριο",
+ "field-day-relative+2": "Μεθαύριο",
+ "dateFormatItem-H": "HH",
+ "field-day-relative+3": "Σε τρεις ημέρες από τώρα",
+ "months-standAlone-abbr": [
+ "Ιαν",
+ "Φεβ",
+ "Μαρ",
+ "Απρ",
+ "Μαϊ",
+ "Ιουν",
+ "Ιουλ",
+ "Αυγ",
+ "Σεπ",
+ "Οκτ",
+ "Νοε",
+ "Δεκ"
+ ],
+ "quarters-format-abbr": [
+ "Τ1",
+ "Τ2",
+ "Τ3",
+ "Τ4"
+ ],
+ "quarters-standAlone-wide": [
+ "1ο τρίμηνο",
+ "2ο τρίμηνο",
+ "3ο τρίμηνο",
+ "4ο τρίμηνο"
+ ],
+ "dateFormatItem-HHmmss": "HH:mm:ss",
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "Κυριακή",
+ "Δευτέρα",
+ "Τρίτη",
+ "Τετάρτη",
+ "Πέμπτη",
+ "Παρασκευή",
+ "Σάββατο"
+ ],
+ "dateFormatItem-MMMMd": "d MMMM",
+ "dateFormatItem-yyMMM": "LLL yy",
+ "timeFormat-medium": "h:mm:ss a",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "Τ1",
+ "Τ2",
+ "Τ3",
+ "Τ4"
+ ],
+ "eraAbbr": [
+ "π.Χ.",
+ "μ.Χ."
+ ],
+ "field-minute": "Λεπτό",
+ "field-dayperiod": "π.μ./μ.μ.",
+ "days-standAlone-abbr": [
+ "Κυρ",
+ "Δευ",
+ "Τρι",
+ "Τετ",
+ "Πεμ",
+ "Παρ",
+ "Σαβ"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "Χθες",
+ "field-day-relative+-2": "Προχθές",
+ "field-day-relative+-3": "Πριν από τρεις ημέρες",
+ "dateFormatItem-MMMd": "d MMM",
+ "dateFormatItem-MEd": "E, d/M",
+ "field-day": "Ημέρα",
+ "days-format-wide": [
+ "Κυριακή",
+ "Δευτέρα",
+ "Τρίτη",
+ "Τετάρτη",
+ "Πέμπτη",
+ "Παρασκευή",
+ "Σάββατο"
+ ],
+ "field-zone": "Ζώνη",
+ "dateFormatItem-yyyyMM": "MM/yyyy",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "Ι",
+ "Φ",
+ "Μ",
+ "Α",
+ "Μ",
+ "Ι",
+ "Ι",
+ "Α",
+ "Σ",
+ "Ο",
+ "Ν",
+ "Δ"
+ ],
+ "dateFormatItem-yyMM": "MM/yy",
+ "days-format-abbr": [
+ "Κυρ",
+ "Δευ",
+ "Τρι",
+ "Τετ",
+ "Πεμ",
+ "Παρ",
+ "Σαβ"
+ ],
+ "eraNames": [
+ "π.Χ.",
+ "μ.Χ."
+ ],
+ "days-format-narrow": [
+ "Κ",
+ "Δ",
+ "Τ",
+ "Τ",
+ "Π",
+ "Π",
+ "Σ"
+ ],
+ "field-month": "Μήνας",
+ "days-standAlone-narrow": [
+ "Κ",
+ "Δ",
+ "Τ",
+ "Τ",
+ "Π",
+ "Π",
+ "Σ"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dateFormatItem-HHmm": "HH:mm",
+ "dayPeriods-format-wide-am": "π.μ.",
+ "dateFormatItem-MMMMEd": "E, d MMMM",
+ "dateFormatItem-MMMMdd": "dd MMMM",
+ "dateFormat-short": "d/M/yy",
+ "field-second": "Δευτερόλεπτο",
+ "dateFormatItem-yMMMEd": "EEE, d MMM y",
+ "dateFormatItem-Ed": "E d",
+ "field-week": "Εβδομάδα",
+ "dateFormat-medium": "d MMM y",
+ "dateFormatItem-mmss": "mm:ss",
+ "dateFormatItem-yyyy": "y"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/el/hebrew.js b/lib/dojo/cldr/nls/el/hebrew.js
index 840b1d154..909e061a5 100644
--- a/lib/dojo/cldr/nls/el/hebrew.js
+++ b/lib/dojo/cldr/nls/el/hebrew.js
@@ -1 +1,8 @@
-({"quarters-format-abbr":["Τ1","Τ2","Τ3","Τ4"],"dateFormat-medium":"d MMM y","dateFormatItem-MMMEd":"E, d MMM","dateFormatItem-MEd":"E, d/M","dateFormatItem-yMEd":"EEE, d/M/yyyy","eraNarrow":["π.μ."],"timeFormat-full":"h:mm:ss a zzzz","dateFormatItem-Md":"d/M","dateFormatItem-EEEd":"EEE d","eraNames":["π.μ."],"days-standAlone-narrow":["Κ","Δ","Τ","Τ","Π","Π","Σ"],"dayPeriods-format-wide-pm":"μ.μ.","dayPeriods-format-wide-am":"π.μ.","timeFormat-medium":"h:mm:ss a","dateFormat-long":"d MMMM y","dateFormat-short":"d/M/yy","dateFormatItem-yMMMEd":"EEE, d MMM y","dateFormatItem-yM":"M/yyyy","timeFormat-short":"h:mm a","eraAbbr":["π.μ."],"timeFormat-long":"h:mm:ss a z","days-format-wide":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"dateFormatItem-yMMM":"LLL y","quarters-format-wide":["1ο τρίμηνο","2ο τρίμηνο","3ο τρίμηνο","4ο τρίμηνο"],"dateFormat-full":"EEEE, d MMMM y","dateFormatItem-MMMd":"d MMM","days-format-abbr":["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],"months-format-narrow":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"y QQQ","months-standAlone-narrow-leap":"Adar II","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","months-format-wide":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-wide":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr-leap":"Adar II","months-format-abbr":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"months-standAlone-wide-leap":"Adar II","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"months-format-narrow-leap":"Adar II","days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","months-standAlone-abbr-leap":"Adar II","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","months-format-wide-leap":"Adar II"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/el/hebrew",{"quarters-format-abbr":["Τ1","Τ2","Τ3","Τ4"],"dateFormat-medium":"d MMM y","dateFormatItem-MMMEd":"E, d MMM","dateFormatItem-MEd":"E, d/M","dateFormatItem-yMEd":"EEE, d/M/yyyy","eraNarrow":["π.μ."],"timeFormat-full":"h:mm:ss a zzzz","dateFormatItem-Md":"d/M","dateFormatItem-EEEd":"EEE d","eraNames":["π.μ."],"days-standAlone-narrow":["Κ","Δ","Τ","Τ","Π","Π","Σ"],"dayPeriods-format-wide-pm":"μ.μ.","dayPeriods-format-wide-am":"π.μ.","timeFormat-medium":"h:mm:ss a","dateFormat-long":"d MMMM y","dateFormat-short":"d/M/yy","dateFormatItem-yMMMEd":"EEE, d MMM y","dateFormatItem-yM":"M/yyyy","timeFormat-short":"h:mm a","eraAbbr":["π.μ."],"timeFormat-long":"h:mm:ss a z","days-format-wide":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"dateFormatItem-yMMM":"LLL y","quarters-format-wide":["1ο τρίμηνο","2ο τρίμηνο","3ο τρίμηνο","4ο τρίμηνο"],"dateFormat-full":"EEEE, d MMMM y","dateFormatItem-MMMd":"d MMM","days-format-abbr":["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/el/hebrew.js.uncompressed.js b/lib/dojo/cldr/nls/el/hebrew.js.uncompressed.js
new file mode 100644
index 000000000..bc9faba5f
--- /dev/null
+++ b/lib/dojo/cldr/nls/el/hebrew.js.uncompressed.js
@@ -0,0 +1,73 @@
+define(
+"dojo/cldr/nls/el/hebrew", //begin v1.x content
+{
+ "quarters-format-abbr": [
+ "Τ1",
+ "Τ2",
+ "Τ3",
+ "Τ4"
+ ],
+ "dateFormat-medium": "d MMM y",
+ "dateFormatItem-MMMEd": "E, d MMM",
+ "dateFormatItem-MEd": "E, d/M",
+ "dateFormatItem-yMEd": "EEE, d/M/yyyy",
+ "eraNarrow": [
+ "π.μ."
+ ],
+ "timeFormat-full": "h:mm:ss a zzzz",
+ "dateFormatItem-Md": "d/M",
+ "dateFormatItem-EEEd": "EEE d",
+ "eraNames": [
+ "π.μ."
+ ],
+ "days-standAlone-narrow": [
+ "Κ",
+ "Δ",
+ "Τ",
+ "Τ",
+ "Π",
+ "Π",
+ "Σ"
+ ],
+ "dayPeriods-format-wide-pm": "μ.μ.",
+ "dayPeriods-format-wide-am": "π.μ.",
+ "timeFormat-medium": "h:mm:ss a",
+ "dateFormat-long": "d MMMM y",
+ "dateFormat-short": "d/M/yy",
+ "dateFormatItem-yMMMEd": "EEE, d MMM y",
+ "dateFormatItem-yM": "M/yyyy",
+ "timeFormat-short": "h:mm a",
+ "eraAbbr": [
+ "π.μ."
+ ],
+ "timeFormat-long": "h:mm:ss a z",
+ "days-format-wide": [
+ "Κυριακή",
+ "Δευτέρα",
+ "Τρίτη",
+ "Τετάρτη",
+ "Πέμπτη",
+ "Παρασκευή",
+ "Σάββατο"
+ ],
+ "dateFormatItem-yMMM": "LLL y",
+ "quarters-format-wide": [
+ "1ο τρίμηνο",
+ "2ο τρίμηνο",
+ "3ο τρίμηνο",
+ "4ο τρίμηνο"
+ ],
+ "dateFormat-full": "EEEE, d MMMM y",
+ "dateFormatItem-MMMd": "d MMM",
+ "days-format-abbr": [
+ "Κυρ",
+ "Δευ",
+ "Τρι",
+ "Τετ",
+ "Πεμ",
+ "Παρ",
+ "Σαβ"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/el/number.js b/lib/dojo/cldr/nls/el/number.js
index 75198a1d8..2dbe452d2 100644
--- a/lib/dojo/cldr/nls/el/number.js
+++ b/lib/dojo/cldr/nls/el/number.js
@@ -1 +1,8 @@
-({"group":".","percentSign":"%","exponential":"e","percentFormat":"#,##0%","list":",","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","currencyFormat":"#,##0.00 ¤","plusSign":"+","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","decimalFormat":"#,##0.###","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/el/number",{"group":".","percentSign":"%","exponential":"e","percentFormat":"#,##0%","list":",","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/el/number.js.uncompressed.js b/lib/dojo/cldr/nls/el/number.js.uncompressed.js
new file mode 100644
index 000000000..026e58745
--- /dev/null
+++ b/lib/dojo/cldr/nls/el/number.js.uncompressed.js
@@ -0,0 +1,20 @@
+define(
+"dojo/cldr/nls/el/number", //begin v1.x content
+{
+ "group": ".",
+ "percentSign": "%",
+ "exponential": "e",
+ "percentFormat": "#,##0%",
+ "list": ",",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-au/currency.js b/lib/dojo/cldr/nls/en-au/currency.js
index aad096762..b983ca9ae 100644
--- a/lib/dojo/cldr/nls/en-au/currency.js
+++ b/lib/dojo/cldr/nls/en-au/currency.js
@@ -1 +1,8 @@
-({"AUD_symbol":"$","USD_symbol":"US$","HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan","AUD_displayName":"Australian Dollar","JPY_displayName":"Japanese Yen","USD_displayName":"US Dollar","GBP_displayName":"British Pound Sterling","EUR_displayName":"Euro","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en-au/currency",{"AUD_symbol":"$","USD_symbol":"US$"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-au/currency.js.uncompressed.js b/lib/dojo/cldr/nls/en-au/currency.js.uncompressed.js
new file mode 100644
index 000000000..f70bd28f1
--- /dev/null
+++ b/lib/dojo/cldr/nls/en-au/currency.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dojo/cldr/nls/en-au/currency", //begin v1.x content
+{
+ "AUD_symbol": "$",
+ "USD_symbol": "US$"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-au/gregorian.js b/lib/dojo/cldr/nls/en-au/gregorian.js
index 7df433e53..285e2bd1e 100644
--- a/lib/dojo/cldr/nls/en-au/gregorian.js
+++ b/lib/dojo/cldr/nls/en-au/gregorian.js
@@ -1 +1,8 @@
-({"dateFormatItem-yMEd":"EEE, d/M/y","dateFormatItem-yyyyMMMM":"MMMM y","dateFormatItem-MEd":"E, d/M","dateFormat-medium":"dd/MM/yyyy","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-MMdd":"dd/MM","dateFormat-full":"EEEE, d MMMM y","dateFormatItem-MMMMd":"d MMMM","dateFormat-short":"d/MM/yy","dateFormat-long":"d MMMM y","dateFormatItem-MMMEd":"E, d MMM","dateFormatItem-yM":"M/y","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q y","dayPeriods-format-wide-pm":"PM","field-minute":"Minute","eraNames":["Before Christ","Anno Domini"],"dateTimeFormat-full":"{1} {0}","field-day-relative+-1":"Yesterday","field-weekday":"Day of the Week","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateTimeFormat-short":"{1} {0}","field-era":"Era","field-hour":"Hour","dayPeriods-format-wide-am":"AM","dateTimeFormat-medium":"{1} {0}","dateFormatItem-y":"y","timeFormat-full":"h:mm:ss a zzzz","months-standAlone-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"dateFormatItem-yMMM":"MMM y","field-day-relative+0":"Today","field-day-relative+1":"Tomorrow","days-standAlone-narrow":["S","M","T","W","T","F","S"],"eraAbbr":["BC","AD"],"timeFormat-medium":"h:mm:ss a","dateFormatItem-EEEd":"d EEE","field-zone":"Zone","dateFormatItem-Hm":"HH:mm","dateFormatItem-Hms":"HH:mm:ss","quarters-standAlone-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-ms":"mm:ss","field-year":"Year","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormat-long":"{1} {0}","field-week":"Week","months-standAlone-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"dateFormatItem-MMMd":"MMM d","timeFormat-long":"h:mm:ss a z","months-format-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"dayPeriods-format-wide-noon":"noon","timeFormat-short":"h:mm a","field-month":"Month","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateFormatItem-M":"L","days-format-narrow":["S","M","T","W","T","F","S"],"field-second":"Second","field-day":"Day","months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-hm":"h:mm a","days-standAlone-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateFormatItem-yMMMEd":"EEE, MMM d, y","dateFormatItem-Md":"M/d","months-format-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"dateFormatItem-d":"d","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"eraNarrow":["B","A"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en-au/gregorian",{"dateFormatItem-yMEd":"EEE, d/M/y","dateFormatItem-yyyyMMMM":"MMMM y","dateFormatItem-MEd":"E, d/M","dateFormat-medium":"dd/MM/yyyy","dateFormatItem-MMdd":"dd/MM","dateFormatItem-yyyyMM":"MM/yyyy","dateFormat-full":"EEEE, d MMMM y","dateFormatItem-MMMMd":"d MMMM","dateFormat-short":"d/MM/yy","dateFormat-long":"d MMMM y","dateFormatItem-MMMEd":"E, d MMM"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-au/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/en-au/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..5b1049c2d
--- /dev/null
+++ b/lib/dojo/cldr/nls/en-au/gregorian.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dojo/cldr/nls/en-au/gregorian", //begin v1.x content
+{
+ "dateFormatItem-yMEd": "EEE, d/M/y",
+ "dateFormatItem-yyyyMMMM": "MMMM y",
+ "dateFormatItem-MEd": "E, d/M",
+ "dateFormat-medium": "dd/MM/yyyy",
+ "dateFormatItem-MMdd": "dd/MM",
+ "dateFormatItem-yyyyMM": "MM/yyyy",
+ "dateFormat-full": "EEEE, d MMMM y",
+ "dateFormatItem-MMMMd": "d MMMM",
+ "dateFormat-short": "d/MM/yy",
+ "dateFormat-long": "d MMMM y",
+ "dateFormatItem-MMMEd": "E, d MMM"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-au/number.js b/lib/dojo/cldr/nls/en-au/number.js
index 70e56f471..fb61abd40 100644
--- a/lib/dojo/cldr/nls/en-au/number.js
+++ b/lib/dojo/cldr/nls/en-au/number.js
@@ -1 +1,8 @@
-({"currencyFormat":"¤#,##0.00","group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","plusSign":"+","decimalFormat-short":"000T","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en-au/number",{"currencyFormat":"¤#,##0.00"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-au/number.js.uncompressed.js b/lib/dojo/cldr/nls/en-au/number.js.uncompressed.js
new file mode 100644
index 000000000..bb5a8446c
--- /dev/null
+++ b/lib/dojo/cldr/nls/en-au/number.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dojo/cldr/nls/en-au/number", //begin v1.x content
+{
+ "currencyFormat": "¤#,##0.00"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-ca/currency.js b/lib/dojo/cldr/nls/en-ca/currency.js
index a0a0b2446..f02d07427 100644
--- a/lib/dojo/cldr/nls/en-ca/currency.js
+++ b/lib/dojo/cldr/nls/en-ca/currency.js
@@ -1 +1,8 @@
-({"CAD_symbol":"$","USD_symbol":"US$","HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan","AUD_displayName":"Australian Dollar","JPY_displayName":"Japanese Yen","USD_displayName":"US Dollar","GBP_displayName":"British Pound Sterling","EUR_displayName":"Euro","GBP_symbol":"£","HKD_symbol":"HK$","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en-ca/currency",{"CAD_symbol":"$","USD_symbol":"US$"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-ca/currency.js.uncompressed.js b/lib/dojo/cldr/nls/en-ca/currency.js.uncompressed.js
new file mode 100644
index 000000000..53cb37866
--- /dev/null
+++ b/lib/dojo/cldr/nls/en-ca/currency.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dojo/cldr/nls/en-ca/currency", //begin v1.x content
+{
+ "CAD_symbol": "$",
+ "USD_symbol": "US$"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-ca/gregorian.js b/lib/dojo/cldr/nls/en-ca/gregorian.js
index 02b282949..84722ff88 100644
--- a/lib/dojo/cldr/nls/en-ca/gregorian.js
+++ b/lib/dojo/cldr/nls/en-ca/gregorian.js
@@ -1 +1,8 @@
-({"dateFormatItem-yMMMEd":"EEE, d MMM, y","dateFormatItem-yyMMM":"MMM-yy","dateFormatItem-Md":"M-d","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MEd":"E, M-d","dateFormatItem-MMMMEd":"E, d MMMM","dateFormat-medium":"yyyy-MM-dd","dateFormatItem-MMMd":"d MMM","dateFormatItem-MMdd":"MM-dd","dateFormat-full":"EEEE, d MMMM, y","dateFormat-short":"yy-MM-dd","dateFormatItem-MMMMd":"d MMMM","dateFormat-long":"d MMMM, y","dateFormatItem-MMMEd":"E, d MMM","dateFormatItem-yM":"M/y","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q y","dayPeriods-format-wide-pm":"PM","field-minute":"Minute","eraNames":["Before Christ","Anno Domini"],"dateTimeFormat-full":"{1} {0}","field-day-relative+-1":"Yesterday","field-weekday":"Day of the Week","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateTimeFormat-short":"{1} {0}","field-era":"Era","field-hour":"Hour","dayPeriods-format-wide-am":"AM","dateTimeFormat-medium":"{1} {0}","dateFormatItem-y":"y","timeFormat-full":"h:mm:ss a zzzz","months-standAlone-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"dateFormatItem-yMMM":"MMM y","field-day-relative+0":"Today","field-day-relative+1":"Tomorrow","days-standAlone-narrow":["S","M","T","W","T","F","S"],"eraAbbr":["BC","AD"],"timeFormat-medium":"h:mm:ss a","dateFormatItem-EEEd":"d EEE","field-zone":"Zone","dateFormatItem-Hm":"HH:mm","dateFormatItem-Hms":"HH:mm:ss","quarters-standAlone-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-ms":"mm:ss","field-year":"Year","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormat-long":"{1} {0}","field-week":"Week","months-standAlone-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"timeFormat-long":"h:mm:ss a z","months-format-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"dayPeriods-format-wide-noon":"noon","timeFormat-short":"h:mm a","field-month":"Month","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateFormatItem-M":"L","days-format-narrow":["S","M","T","W","T","F","S"],"field-second":"Second","field-day":"Day","months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-hm":"h:mm a","days-standAlone-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"months-format-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"dateFormatItem-d":"d","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"eraNarrow":["B","A"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en-ca/gregorian",{"dateFormatItem-yMMMEd":"EEE, d MMM, y","dateFormatItem-yyMMM":"MMM-yy","dateFormatItem-Md":"M-d","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MEd":"E, M-d","dateFormatItem-MMMMEd":"E, d MMMM","dateFormat-medium":"yyyy-MM-dd","dateFormatItem-MMMd":"d MMM","dateFormatItem-MMdd":"MM-dd","dateFormat-full":"EEEE, d MMMM, y","dateFormat-short":"yy-MM-dd","dateFormatItem-MMMMd":"d MMMM","dateFormat-long":"d MMMM, y","dateFormatItem-MMMEd":"E, d MMM"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-ca/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/en-ca/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..ffd55908c
--- /dev/null
+++ b/lib/dojo/cldr/nls/en-ca/gregorian.js.uncompressed.js
@@ -0,0 +1,20 @@
+define(
+"dojo/cldr/nls/en-ca/gregorian", //begin v1.x content
+{
+ "dateFormatItem-yMMMEd": "EEE, d MMM, y",
+ "dateFormatItem-yyMMM": "MMM-yy",
+ "dateFormatItem-Md": "M-d",
+ "dateFormatItem-yMEd": "EEE, y-M-d",
+ "dateFormatItem-MEd": "E, M-d",
+ "dateFormatItem-MMMMEd": "E, d MMMM",
+ "dateFormat-medium": "yyyy-MM-dd",
+ "dateFormatItem-MMMd": "d MMM",
+ "dateFormatItem-MMdd": "MM-dd",
+ "dateFormat-full": "EEEE, d MMMM, y",
+ "dateFormat-short": "yy-MM-dd",
+ "dateFormatItem-MMMMd": "d MMMM",
+ "dateFormat-long": "d MMMM, y",
+ "dateFormatItem-MMMEd": "E, d MMM"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-gb/buddhist.js b/lib/dojo/cldr/nls/en-gb/buddhist.js
index 9e4575c4f..6a1710bbb 100644
--- a/lib/dojo/cldr/nls/en-gb/buddhist.js
+++ b/lib/dojo/cldr/nls/en-gb/buddhist.js
@@ -1 +1,8 @@
-({"dateFormat-medium":"d MMM y G","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-MMdd":"dd/MM","dateFormatItem-MEd":"E, d/M","dateFormatItem-yMEd":"EEE, d/M/y G","dateFormatItem-yyMMM":"MMM y G","dateFormatItem-y":"y","dateFormatItem-Md":"d/M","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"days-standAlone-narrow":["S","M","T","W","T","F","S"],"dateFormatItem-yyyyMMMM":"MMMM y G","dateFormatItem-MMMMd":"d MMMM","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yyyyMM":"MM/y G","dateFormat-long":"d MMMM y G","dateFormat-short":"dd/MM/y G","dateFormatItem-yMMMEd":"EEE, MMM d, y","months-format-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"dateFormatItem-yM":"M/y","months-format-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-yQ":"Q y","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormat-full":"EEEE, d MMMM y G","dateFormatItem-yyyyMd":"d/M/y G","days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateFormatItem-Hm":"HH:mm","timeFormat-full":"h:mm:ss a zzzz","dateFormatItem-hm":"h:mm a","dateFormatItem-EEEd":"d EEE","dateFormatItem-M":"L","timeFormat-medium":"h:mm:ss a","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-ms":"mm:ss","dateFormatItem-d":"d","timeFormat-short":"h:mm a","timeFormat-long":"h:mm:ss a z","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-MMM":"LLL","dateFormatItem-MMMd":"MMM d","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"eraNarrow":["BE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["BE"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","eraNames":["BE"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en-gb/buddhist",{"dateFormat-medium":"d MMM y G","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-MMdd":"dd/MM","dateFormatItem-MEd":"E, d/M","dateFormatItem-yMEd":"EEE, d/M/y G","dateFormatItem-yyMMM":"MMM y G","dateFormatItem-y":"y","dateFormatItem-Md":"d/M","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"days-standAlone-narrow":["S","M","T","W","T","F","S"],"dateFormatItem-yyyyMMMM":"MMMM y G","dateFormatItem-MMMMd":"d MMMM","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yyyyMM":"MM/y G","dateFormat-long":"d MMMM y G","dateFormat-short":"dd/MM/y G","dateFormatItem-yMMMEd":"EEE, MMM d, y","months-format-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"dateFormatItem-yM":"M/y","months-format-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-yQ":"Q y","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormat-full":"EEEE, d MMMM y G","dateFormatItem-yyyyMd":"d/M/y G","days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-gb/buddhist.js.uncompressed.js b/lib/dojo/cldr/nls/en-gb/buddhist.js.uncompressed.js
new file mode 100644
index 000000000..974e887e7
--- /dev/null
+++ b/lib/dojo/cldr/nls/en-gb/buddhist.js.uncompressed.js
@@ -0,0 +1,101 @@
+define(
+"dojo/cldr/nls/en-gb/buddhist", //begin v1.x content
+{
+ "dateFormat-medium": "d MMM y G",
+ "dateFormatItem-MMMEd": "E d MMM",
+ "dateFormatItem-MMdd": "dd/MM",
+ "dateFormatItem-MEd": "E, d/M",
+ "dateFormatItem-yMEd": "EEE, d/M/y G",
+ "dateFormatItem-yyMMM": "MMM y G",
+ "dateFormatItem-y": "y",
+ "dateFormatItem-Md": "d/M",
+ "months-standAlone-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "W",
+ "T",
+ "F",
+ "S"
+ ],
+ "dateFormatItem-yyyyMMMM": "MMMM y G",
+ "dateFormatItem-MMMMd": "d MMMM",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yyyyMM": "MM/y G",
+ "dateFormat-long": "d MMMM y G",
+ "dateFormat-short": "dd/MM/y G",
+ "dateFormatItem-yMMMEd": "EEE, MMM d, y",
+ "months-format-wide": [
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December"
+ ],
+ "dateFormatItem-yM": "M/y",
+ "months-format-abbr": [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec"
+ ],
+ "days-format-wide": [
+ "Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday"
+ ],
+ "dateFormatItem-yQ": "Q y",
+ "dateFormatItem-yMMM": "MMM y",
+ "quarters-format-wide": [
+ "1st quarter",
+ "2nd quarter",
+ "3rd quarter",
+ "4th quarter"
+ ],
+ "dateFormat-full": "EEEE, d MMMM y G",
+ "dateFormatItem-yyyyMd": "d/M/y G",
+ "days-format-abbr": [
+ "Sun",
+ "Mon",
+ "Tue",
+ "Wed",
+ "Thu",
+ "Fri",
+ "Sat"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-gb/gregorian.js b/lib/dojo/cldr/nls/en-gb/gregorian.js
index 1333aa05e..472c7dbeb 100644
--- a/lib/dojo/cldr/nls/en-gb/gregorian.js
+++ b/lib/dojo/cldr/nls/en-gb/gregorian.js
@@ -1 +1,8 @@
-({"dateFormatItem-yyMMM":"MMM yy","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE, d/M/yyyy","dateFormatItem-yyyyMMMM":"MMMM y","timeFormat-full":"HH:mm:ss zzzz","timeFormat-medium":"HH:mm:ss","dateFormatItem-MEd":"E, d/M","dateFormat-medium":"d MMM y","dateFormatItem-MMdd":"dd/MM","dateFormatItem-yyyyMM":"MM/yyyy","dateFormat-full":"EEEE, d MMMM y","timeFormat-long":"HH:mm:ss z","timeFormat-short":"HH:mm","dateFormat-short":"dd/MM/yyyy","dateFormatItem-MMMMd":"d MMMM","dateFormat-long":"d MMMM y","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-yM":"M/y","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q y","dayPeriods-format-wide-pm":"PM","field-minute":"Minute","eraNames":["Before Christ","Anno Domini"],"dateTimeFormat-full":"{1} {0}","field-day-relative+-1":"Yesterday","field-weekday":"Day of the Week","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateTimeFormat-short":"{1} {0}","field-era":"Era","field-hour":"Hour","dayPeriods-format-wide-am":"AM","dateTimeFormat-medium":"{1} {0}","dateFormatItem-y":"y","months-standAlone-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"dateFormatItem-yMMM":"MMM y","field-day-relative+0":"Today","field-day-relative+1":"Tomorrow","days-standAlone-narrow":["S","M","T","W","T","F","S"],"eraAbbr":["BC","AD"],"dateFormatItem-EEEd":"d EEE","field-zone":"Zone","dateFormatItem-Hm":"HH:mm","dateFormatItem-Hms":"HH:mm:ss","quarters-standAlone-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-ms":"mm:ss","field-year":"Year","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormat-long":"{1} {0}","field-week":"Week","months-standAlone-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"dateFormatItem-MMMd":"MMM d","months-format-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"dayPeriods-format-wide-noon":"noon","field-month":"Month","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateFormatItem-M":"L","days-format-narrow":["S","M","T","W","T","F","S"],"field-second":"Second","field-day":"Day","months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-hm":"h:mm a","days-standAlone-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateFormatItem-yMMMEd":"EEE, MMM d, y","months-format-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"dateFormatItem-d":"d","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"eraNarrow":["B","A"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en-gb/gregorian",{"dateFormatItem-yyMMM":"MMM yy","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE, d/M/yyyy","timeFormat-full":"HH:mm:ss zzzz","timeFormat-medium":"HH:mm:ss","dateFormatItem-yyyyMMMM":"MMMM y","dateFormatItem-MEd":"E, d/M","dateFormat-medium":"d MMM y","dateFormatItem-MMdd":"dd/MM","dateFormatItem-yyyyMM":"MM/yyyy","dateFormat-full":"EEEE, d MMMM y","timeFormat-long":"HH:mm:ss z","timeFormat-short":"HH:mm","dateFormat-short":"dd/MM/yyyy","dateFormatItem-MMMMd":"d MMMM","dateFormat-long":"d MMMM y","dateFormatItem-MMMEd":"E d MMM"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-gb/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/en-gb/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..7244ba92a
--- /dev/null
+++ b/lib/dojo/cldr/nls/en-gb/gregorian.js.uncompressed.js
@@ -0,0 +1,23 @@
+define(
+"dojo/cldr/nls/en-gb/gregorian", //begin v1.x content
+{
+ "dateFormatItem-yyMMM": "MMM yy",
+ "dateFormatItem-Md": "d/M",
+ "dateFormatItem-yMEd": "EEE, d/M/yyyy",
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-yyyyMMMM": "MMMM y",
+ "dateFormatItem-MEd": "E, d/M",
+ "dateFormat-medium": "d MMM y",
+ "dateFormatItem-MMdd": "dd/MM",
+ "dateFormatItem-yyyyMM": "MM/yyyy",
+ "dateFormat-full": "EEEE, d MMMM y",
+ "timeFormat-long": "HH:mm:ss z",
+ "timeFormat-short": "HH:mm",
+ "dateFormat-short": "dd/MM/yyyy",
+ "dateFormatItem-MMMMd": "d MMMM",
+ "dateFormat-long": "d MMMM y",
+ "dateFormatItem-MMMEd": "E d MMM"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-gb/islamic.js b/lib/dojo/cldr/nls/en-gb/islamic.js
index 8774cbb03..850ef21bc 100644
--- a/lib/dojo/cldr/nls/en-gb/islamic.js
+++ b/lib/dojo/cldr/nls/en-gb/islamic.js
@@ -1 +1,8 @@
-({"dateFormat-medium":"d MMM y G","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-MMdd":"dd/MM","dateFormatItem-MEd":"E, d/M","dateFormatItem-yMEd":"EEE, d/M/yyyy","dateFormatItem-yyyyMMM":"MMM y G","eraNarrow":["AH"],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-yyMMM":"MMM y G","dateFormatItem-Md":"d/M","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"months-standAlone-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"eraNames":["AH"],"days-standAlone-narrow":["S","M","T","W","T","F","S"],"dateFormatItem-yyyyMEd":"EEE, d/M/y G","dateFormatItem-yyyyMMMM":"MMMM y G","dateFormatItem-MMMMd":"d MMMM","months-standAlone-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yyyyMM":"MM/y G","dateFormat-long":"d MMMM y G","dateFormat-short":"dd/MM/y G","dateFormatItem-yMMMEd":"EEE, MMM d, y","months-format-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yM":"M/y","months-format-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"eraAbbr":["AH"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-yQ":"Q y","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-yyyyMd":"d/M/y G","dateFormat-full":"EEEE, d MMMM y G","days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateFormatItem-yyyyMMMEd":"EEE, MMM d, y G","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-MMM":"LLL","timeFormat-full":"h:mm:ss a zzzz","dateFormatItem-yyyy":"y G","timeFormat-medium":"h:mm:ss a","dateFormatItem-EEEd":"d EEE","dateFormatItem-Hm":"HH:mm","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-ms":"mm:ss","dateFormatItem-MMMd":"MMM d","timeFormat-long":"h:mm:ss a z","timeFormat-short":"h:mm a","dateFormatItem-M":"L","dateFormatItem-yyyyQQQ":"QQQ y G","dateFormatItem-hm":"h:mm a","dateFormatItem-yyyyM":"M/y G","dateFormatItem-yyyyQ":"Q y G","dateFormatItem-d":"d","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en-gb/islamic",{"dateFormat-medium":"d MMM y G","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-MMdd":"dd/MM","dateFormatItem-MEd":"E, d/M","dateFormatItem-yMEd":"EEE, d/M/yyyy","dateFormatItem-yyyyMMM":"MMM y G","eraNarrow":["AH"],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-yyMMM":"MMM y G","dateFormatItem-Md":"d/M","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"months-standAlone-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"eraNames":["AH"],"days-standAlone-narrow":["S","M","T","W","T","F","S"],"dateFormatItem-yyyyMEd":"EEE, d/M/y G","dateFormatItem-yyyyMMMM":"MMMM y G","dateFormatItem-MMMMd":"d MMMM","months-standAlone-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yyyyMM":"MM/y G","dateFormat-long":"d MMMM y G","dateFormat-short":"dd/MM/y G","dateFormatItem-yMMMEd":"EEE, MMM d, y","months-format-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yM":"M/y","months-format-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"eraAbbr":["AH"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-yQ":"Q y","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-yyyyMd":"d/M/y G","dateFormat-full":"EEEE, d MMMM y G","days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-gb/islamic.js.uncompressed.js b/lib/dojo/cldr/nls/en-gb/islamic.js.uncompressed.js
new file mode 100644
index 000000000..0784d8204
--- /dev/null
+++ b/lib/dojo/cldr/nls/en-gb/islamic.js.uncompressed.js
@@ -0,0 +1,153 @@
+define(
+"dojo/cldr/nls/en-gb/islamic", //begin v1.x content
+{
+ "dateFormat-medium": "d MMM y G",
+ "dateFormatItem-MMMEd": "E d MMM",
+ "dateFormatItem-MMdd": "dd/MM",
+ "dateFormatItem-MEd": "E, d/M",
+ "dateFormatItem-yMEd": "EEE, d/M/yyyy",
+ "dateFormatItem-yyyyMMM": "MMM y G",
+ "eraNarrow": [
+ "AH"
+ ],
+ "months-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dateFormatItem-yyMMM": "MMM y G",
+ "dateFormatItem-Md": "d/M",
+ "months-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "months-standAlone-wide": [
+ "Muharram",
+ "Safar",
+ "Rabiʻ I",
+ "Rabiʻ II",
+ "Jumada I",
+ "Jumada II",
+ "Rajab",
+ "Shaʻban",
+ "Ramadan",
+ "Shawwal",
+ "Dhuʻl-Qiʻdah",
+ "Dhuʻl-Hijjah"
+ ],
+ "eraNames": [
+ "AH"
+ ],
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "W",
+ "T",
+ "F",
+ "S"
+ ],
+ "dateFormatItem-yyyyMEd": "EEE, d/M/y G",
+ "dateFormatItem-yyyyMMMM": "MMMM y G",
+ "dateFormatItem-MMMMd": "d MMMM",
+ "months-standAlone-abbr": [
+ "Muh.",
+ "Saf.",
+ "Rab. I",
+ "Rab. II",
+ "Jum. I",
+ "Jum. II",
+ "Raj.",
+ "Sha.",
+ "Ram.",
+ "Shaw.",
+ "Dhuʻl-Q.",
+ "Dhuʻl-H."
+ ],
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yyyyMM": "MM/y G",
+ "dateFormat-long": "d MMMM y G",
+ "dateFormat-short": "dd/MM/y G",
+ "dateFormatItem-yMMMEd": "EEE, MMM d, y",
+ "months-format-wide": [
+ "Muharram",
+ "Safar",
+ "Rabiʻ I",
+ "Rabiʻ II",
+ "Jumada I",
+ "Jumada II",
+ "Rajab",
+ "Shaʻban",
+ "Ramadan",
+ "Shawwal",
+ "Dhuʻl-Qiʻdah",
+ "Dhuʻl-Hijjah"
+ ],
+ "dateFormatItem-yM": "M/y",
+ "months-format-abbr": [
+ "Muh.",
+ "Saf.",
+ "Rab. I",
+ "Rab. II",
+ "Jum. I",
+ "Jum. II",
+ "Raj.",
+ "Sha.",
+ "Ram.",
+ "Shaw.",
+ "Dhuʻl-Q.",
+ "Dhuʻl-H."
+ ],
+ "eraAbbr": [
+ "AH"
+ ],
+ "days-format-wide": [
+ "Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday"
+ ],
+ "dateFormatItem-yQ": "Q y",
+ "dateFormatItem-yMMM": "MMM y",
+ "quarters-format-wide": [
+ "1st quarter",
+ "2nd quarter",
+ "3rd quarter",
+ "4th quarter"
+ ],
+ "dateFormatItem-yyyyMd": "d/M/y G",
+ "dateFormat-full": "EEEE, d MMMM y G",
+ "days-format-abbr": [
+ "Sun",
+ "Mon",
+ "Tue",
+ "Wed",
+ "Thu",
+ "Fri",
+ "Sat"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-gb/number.js b/lib/dojo/cldr/nls/en-gb/number.js
index 70e56f471..3892f0ffa 100644
--- a/lib/dojo/cldr/nls/en-gb/number.js
+++ b/lib/dojo/cldr/nls/en-gb/number.js
@@ -1 +1,8 @@
-({"currencyFormat":"¤#,##0.00","group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","plusSign":"+","decimalFormat-short":"000T","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en-gb/number",{"currencyFormat":"¤#,##0.00"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en-gb/number.js.uncompressed.js b/lib/dojo/cldr/nls/en-gb/number.js.uncompressed.js
new file mode 100644
index 000000000..1fcc4be81
--- /dev/null
+++ b/lib/dojo/cldr/nls/en-gb/number.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dojo/cldr/nls/en-gb/number", //begin v1.x content
+{
+ "currencyFormat": "¤#,##0.00"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en/buddhist.js b/lib/dojo/cldr/nls/en/buddhist.js
index 2e3ea93fc..ae3c58cec 100644
--- a/lib/dojo/cldr/nls/en/buddhist.js
+++ b/lib/dojo/cldr/nls/en/buddhist.js
@@ -1 +1,8 @@
-({"dateFormat-medium":"MMM d, y G","dateFormatItem-MMMEd":"E, MMM d","dateFormatItem-MEd":"E, M/d","dateFormatItem-yMEd":"EEE, M/d/y G","dateFormatItem-Hm":"HH:mm","dateFormatItem-y":"y G","timeFormat-full":"h:mm:ss a zzzz","dateFormatItem-hm":"h:mm a","dateFormatItem-Md":"M/d","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-EEEd":"d EEE","dateFormatItem-M":"L","days-standAlone-narrow":["S","M","T","W","T","F","S"],"dateFormatItem-yQQQ":"QQQ y G","timeFormat-medium":"h:mm:ss a","dateFormatItem-Hms":"HH:mm:ss","dateFormat-long":"MMMM d, y G","dateFormatItem-ms":"mm:ss","dateFormat-short":"M/d/yy G","dateFormatItem-yMMMEd":"EEE, MMM d, y G","months-format-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"dateFormatItem-d":"d","dateFormatItem-yM":"M/y G","timeFormat-short":"h:mm a","months-format-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"timeFormat-long":"h:mm:ss a z","days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yQ":"Q y G","dateFormatItem-MMM":"LLL","dateFormatItem-yMMM":"MMM y G","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormat-full":"EEEE, MMMM d, y G","dateFormatItem-MMMd":"MMM d","days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"eraNarrow":["BE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["BE"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","eraNames":["BE"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en/buddhist",{"dateFormat-medium":"MMM d, y G","dateFormatItem-MMMEd":"E, MMM d","dateFormatItem-MEd":"E, M/d","dateFormatItem-yMEd":"EEE, M/d/y G","dateFormatItem-Hm":"HH:mm","dateFormatItem-y":"y G","timeFormat-full":"h:mm:ss a zzzz","dateFormatItem-hm":"h:mm a","dateFormatItem-Md":"M/d","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-EEEd":"d EEE","dateFormatItem-M":"L","days-standAlone-narrow":["S","M","T","W","T","F","S"],"dateFormatItem-yQQQ":"QQQ y G","timeFormat-medium":"h:mm:ss a","dateFormatItem-Hms":"HH:mm:ss","dateFormat-long":"MMMM d, y G","dateFormatItem-ms":"mm:ss","dateFormat-short":"M/d/yy G","dateFormatItem-yMMMEd":"EEE, MMM d, y G","months-format-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"dateFormatItem-d":"d","dateFormatItem-yM":"M/y G","timeFormat-short":"h:mm a","months-format-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"timeFormat-long":"h:mm:ss a z","days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yQ":"Q y G","dateFormatItem-MMM":"LLL","dateFormatItem-yMMM":"MMM y G","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormat-full":"EEEE, MMMM d, y G","dateFormatItem-MMMd":"MMM d","days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en/buddhist.js.uncompressed.js b/lib/dojo/cldr/nls/en/buddhist.js.uncompressed.js
new file mode 100644
index 000000000..4c83dfda8
--- /dev/null
+++ b/lib/dojo/cldr/nls/en/buddhist.js.uncompressed.js
@@ -0,0 +1,109 @@
+define(
+"dojo/cldr/nls/en/buddhist", //begin v1.x content
+{
+ "dateFormat-medium": "MMM d, y G",
+ "dateFormatItem-MMMEd": "E, MMM d",
+ "dateFormatItem-MEd": "E, M/d",
+ "dateFormatItem-yMEd": "EEE, M/d/y G",
+ "dateFormatItem-Hm": "HH:mm",
+ "dateFormatItem-y": "y G",
+ "timeFormat-full": "h:mm:ss a zzzz",
+ "dateFormatItem-hm": "h:mm a",
+ "dateFormatItem-Md": "M/d",
+ "months-standAlone-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateFormatItem-EEEd": "d EEE",
+ "dateFormatItem-M": "L",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "W",
+ "T",
+ "F",
+ "S"
+ ],
+ "dateFormatItem-yQQQ": "QQQ y G",
+ "timeFormat-medium": "h:mm:ss a",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormat-long": "MMMM d, y G",
+ "dateFormatItem-ms": "mm:ss",
+ "dateFormat-short": "M/d/yy G",
+ "dateFormatItem-yMMMEd": "EEE, MMM d, y G",
+ "months-format-wide": [
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-yM": "M/y G",
+ "timeFormat-short": "h:mm a",
+ "months-format-abbr": [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec"
+ ],
+ "timeFormat-long": "h:mm:ss a z",
+ "days-format-wide": [
+ "Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday"
+ ],
+ "dateFormatItem-hms": "h:mm:ss a",
+ "dateFormatItem-yQ": "Q y G",
+ "dateFormatItem-MMM": "LLL",
+ "dateFormatItem-yMMM": "MMM y G",
+ "quarters-format-wide": [
+ "1st quarter",
+ "2nd quarter",
+ "3rd quarter",
+ "4th quarter"
+ ],
+ "dateFormat-full": "EEEE, MMMM d, y G",
+ "dateFormatItem-MMMd": "MMM d",
+ "days-format-abbr": [
+ "Sun",
+ "Mon",
+ "Tue",
+ "Wed",
+ "Thu",
+ "Fri",
+ "Sat"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en/currency.js b/lib/dojo/cldr/nls/en/currency.js
index 4f780c154..a0578d38b 100644
--- a/lib/dojo/cldr/nls/en/currency.js
+++ b/lib/dojo/cldr/nls/en/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan","USD_symbol":"$","AUD_displayName":"Australian Dollar","JPY_displayName":"Japanese Yen","USD_displayName":"US Dollar","GBP_displayName":"British Pound Sterling","EUR_displayName":"Euro","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en/currency",{"HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan","USD_symbol":"$","AUD_displayName":"Australian Dollar","JPY_displayName":"Japanese Yen","USD_displayName":"US Dollar","GBP_displayName":"British Pound Sterling","EUR_displayName":"Euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en/currency.js.uncompressed.js b/lib/dojo/cldr/nls/en/currency.js.uncompressed.js
new file mode 100644
index 000000000..26d61d0ae
--- /dev/null
+++ b/lib/dojo/cldr/nls/en/currency.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dojo/cldr/nls/en/currency", //begin v1.x content
+{
+ "HKD_displayName": "Hong Kong Dollar",
+ "CHF_displayName": "Swiss Franc",
+ "JPY_symbol": "¥",
+ "CAD_displayName": "Canadian Dollar",
+ "CNY_displayName": "Chinese Yuan",
+ "USD_symbol": "$",
+ "AUD_displayName": "Australian Dollar",
+ "JPY_displayName": "Japanese Yen",
+ "USD_displayName": "US Dollar",
+ "GBP_displayName": "British Pound Sterling",
+ "EUR_displayName": "Euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en/gregorian.js b/lib/dojo/cldr/nls/en/gregorian.js
index 79fc81823..4ceaefd39 100644
--- a/lib/dojo/cldr/nls/en/gregorian.js
+++ b/lib/dojo/cldr/nls/en/gregorian.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"M/y","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q y","dayPeriods-format-wide-pm":"PM","field-minute":"Minute","eraNames":["Before Christ","Anno Domini"],"dateFormatItem-MMMEd":"E, MMM d","dateTimeFormat-full":"{1} {0}","field-day-relative+-1":"Yesterday","field-weekday":"Day of the Week","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateTimeFormat-short":"{1} {0}","field-era":"Era","field-hour":"Hour","dayPeriods-format-wide-am":"AM","dateTimeFormat-medium":"{1} {0}","dateFormatItem-y":"y","timeFormat-full":"h:mm:ss a zzzz","months-standAlone-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"dateFormatItem-yMMM":"MMM y","field-day-relative+0":"Today","field-day-relative+1":"Tomorrow","days-standAlone-narrow":["S","M","T","W","T","F","S"],"eraAbbr":["BC","AD"],"dateFormat-long":"MMMM d, y","timeFormat-medium":"h:mm:ss a","dateFormatItem-EEEd":"d EEE","field-zone":"Zone","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"MMM d, y","dateFormatItem-Hms":"HH:mm:ss","quarters-standAlone-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-ms":"mm:ss","field-year":"Year","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormat-long":"{1} {0}","field-week":"Week","months-standAlone-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"dateFormatItem-MMMd":"MMM d","timeFormat-long":"h:mm:ss a z","months-format-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"dayPeriods-format-wide-noon":"noon","timeFormat-short":"h:mm a","field-month":"Month","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateFormatItem-M":"L","days-format-narrow":["S","M","T","W","T","F","S"],"field-second":"Second","field-day":"Day","dateFormatItem-MEd":"E, M/d","months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-hm":"h:mm a","days-standAlone-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateFormat-short":"M/d/yy","dateFormatItem-yMMMEd":"EEE, MMM d, y","dateFormat-full":"EEEE, MMMM d, y","dateFormatItem-Md":"M/d","dateFormatItem-yMEd":"EEE, M/d/y","months-format-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"dateFormatItem-d":"d","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"eraNarrow":["B","A"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en/gregorian",{"dateFormatItem-yM":"M/y","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q y","dayPeriods-format-wide-pm":"PM","field-minute":"Minute","eraNames":["Before Christ","Anno Domini"],"dateFormatItem-MMMEd":"E, MMM d","dateTimeFormat-full":"{1} {0}","field-day-relative+-1":"Yesterday","field-weekday":"Day of the Week","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateTimeFormat-short":"{1} {0}","field-era":"Era","field-hour":"Hour","dayPeriods-format-wide-am":"AM","dateTimeFormat-medium":"{1} {0}","dateFormatItem-y":"y","timeFormat-full":"h:mm:ss a zzzz","months-standAlone-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"dateFormatItem-yMMM":"MMM y","field-day-relative+0":"Today","field-day-relative+1":"Tomorrow","days-standAlone-narrow":["S","M","T","W","T","F","S"],"eraAbbr":["BC","AD"],"dateFormat-long":"MMMM d, y","timeFormat-medium":"h:mm:ss a","dateFormatItem-EEEd":"d EEE","field-zone":"Zone","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"MMM d, y","dateFormatItem-Hms":"HH:mm:ss","quarters-standAlone-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormatItem-ms":"mm:ss","field-year":"Year","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormat-long":"{1} {0}","field-week":"Week","months-standAlone-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"dateFormatItem-MMMd":"MMM d","timeFormat-long":"h:mm:ss a z","months-format-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"dayPeriods-format-wide-noon":"noon","timeFormat-short":"h:mm a","field-month":"Month","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateFormatItem-M":"L","days-format-narrow":["S","M","T","W","T","F","S"],"field-second":"Second","field-day":"Day","dateFormatItem-MEd":"E, M/d","months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-hm":"h:mm a","days-standAlone-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateFormat-short":"M/d/yy","dateFormatItem-yMMMEd":"EEE, MMM d, y","dateFormat-full":"EEEE, MMMM d, y","dateFormatItem-Md":"M/d","dateFormatItem-yMEd":"EEE, M/d/y","months-format-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"dateFormatItem-d":"d","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"eraNarrow":["B","A"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/en/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..02f854d0c
--- /dev/null
+++ b/lib/dojo/cldr/nls/en/gregorian.js.uncompressed.js
@@ -0,0 +1,229 @@
+define(
+"dojo/cldr/nls/en/gregorian", //begin v1.x content
+{
+ "dateFormatItem-yM": "M/y",
+ "field-dayperiod": "AM/PM",
+ "dateFormatItem-yQ": "Q y",
+ "dayPeriods-format-wide-pm": "PM",
+ "field-minute": "Minute",
+ "eraNames": [
+ "Before Christ",
+ "Anno Domini"
+ ],
+ "dateFormatItem-MMMEd": "E, MMM d",
+ "dateTimeFormat-full": "{1} {0}",
+ "field-day-relative+-1": "Yesterday",
+ "field-weekday": "Day of the Week",
+ "dateFormatItem-hms": "h:mm:ss a",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "days-standAlone-wide": [
+ "Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "months-standAlone-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateTimeFormat-short": "{1} {0}",
+ "field-era": "Era",
+ "field-hour": "Hour",
+ "dayPeriods-format-wide-am": "AM",
+ "dateTimeFormat-medium": "{1} {0}",
+ "dateFormatItem-y": "y",
+ "timeFormat-full": "h:mm:ss a zzzz",
+ "months-standAlone-abbr": [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec"
+ ],
+ "dateFormatItem-yMMM": "MMM y",
+ "field-day-relative+0": "Today",
+ "field-day-relative+1": "Tomorrow",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "W",
+ "T",
+ "F",
+ "S"
+ ],
+ "eraAbbr": [
+ "BC",
+ "AD"
+ ],
+ "dateFormat-long": "MMMM d, y",
+ "timeFormat-medium": "h:mm:ss a",
+ "dateFormatItem-EEEd": "d EEE",
+ "field-zone": "Zone",
+ "dateFormatItem-Hm": "HH:mm",
+ "dateFormat-medium": "MMM d, y",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "quarters-standAlone-wide": [
+ "1st quarter",
+ "2nd quarter",
+ "3rd quarter",
+ "4th quarter"
+ ],
+ "dateFormatItem-ms": "mm:ss",
+ "field-year": "Year",
+ "quarters-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4"
+ ],
+ "dateTimeFormat-long": "{1} {0}",
+ "field-week": "Week",
+ "months-standAlone-wide": [
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December"
+ ],
+ "dateFormatItem-MMMd": "MMM d",
+ "timeFormat-long": "h:mm:ss a z",
+ "months-format-abbr": [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec"
+ ],
+ "dayPeriods-format-wide-noon": "noon",
+ "timeFormat-short": "h:mm a",
+ "field-month": "Month",
+ "quarters-format-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "days-format-abbr": [
+ "Sun",
+ "Mon",
+ "Tue",
+ "Wed",
+ "Thu",
+ "Fri",
+ "Sat"
+ ],
+ "dateFormatItem-M": "L",
+ "days-format-narrow": [
+ "S",
+ "M",
+ "T",
+ "W",
+ "T",
+ "F",
+ "S"
+ ],
+ "field-second": "Second",
+ "field-day": "Day",
+ "dateFormatItem-MEd": "E, M/d",
+ "months-format-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateFormatItem-hm": "h:mm a",
+ "days-standAlone-abbr": [
+ "Sun",
+ "Mon",
+ "Tue",
+ "Wed",
+ "Thu",
+ "Fri",
+ "Sat"
+ ],
+ "dateFormat-short": "M/d/yy",
+ "dateFormatItem-yMMMEd": "EEE, MMM d, y",
+ "dateFormat-full": "EEEE, MMMM d, y",
+ "dateFormatItem-Md": "M/d",
+ "dateFormatItem-yMEd": "EEE, M/d/y",
+ "months-format-wide": [
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December"
+ ],
+ "dateFormatItem-d": "d",
+ "quarters-format-wide": [
+ "1st quarter",
+ "2nd quarter",
+ "3rd quarter",
+ "4th quarter"
+ ],
+ "days-format-wide": [
+ "Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday"
+ ],
+ "eraNarrow": [
+ "B",
+ "A"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en/islamic.js b/lib/dojo/cldr/nls/en/islamic.js
index 5d8f34bd8..15bbb3b28 100644
--- a/lib/dojo/cldr/nls/en/islamic.js
+++ b/lib/dojo/cldr/nls/en/islamic.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"M/y","dateFormatItem-yyyyMMMEd":"EEE, MMM d, y G","dateFormatItem-yQ":"Q y","eraNames":["AH"],"dateFormatItem-MMMEd":"E, MMM d","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-full":"h:mm:ss a zzzz","dateFormatItem-yyyy":"y G","months-standAlone-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateFormatItem-yMMM":"MMM y","days-standAlone-narrow":["S","M","T","W","T","F","S"],"eraAbbr":["AH"],"dateFormat-long":"MMMM d, y G","timeFormat-medium":"h:mm:ss a","dateFormatItem-EEEd":"d EEE","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"MMM d, y G","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-ms":"mm:ss","months-standAlone-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yyyyMEd":"EEE, M/d/y G","dateFormatItem-MMMd":"MMM d","timeFormat-long":"h:mm:ss a z","months-format-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"timeFormat-short":"h:mm a","days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateFormatItem-M":"L","dateFormatItem-yyyyQQQ":"QQQ y G","dateFormatItem-MEd":"E, M/d","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-hm":"h:mm a","dateFormat-short":"M/d/yy G","dateFormatItem-yyyyM":"M/y G","dateFormatItem-yMMMEd":"EEE, MMM d, y","dateFormat-full":"EEEE, MMMM d, y G","dateFormatItem-Md":"M/d","dateFormatItem-yyyyQ":"Q y G","dateFormatItem-yMEd":"EEE, M/d/y","months-format-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yyyyMMM":"MMM y G","dateFormatItem-d":"d","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"eraNarrow":["AH"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en/islamic",{"dateFormatItem-yM":"M/y","dateFormatItem-yyyyMMMEd":"EEE, MMM d, y G","dateFormatItem-yQ":"Q y","eraNames":["AH"],"dateFormatItem-MMMEd":"E, MMM d","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-full":"h:mm:ss a zzzz","dateFormatItem-yyyy":"y G","months-standAlone-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateFormatItem-yMMM":"MMM y","days-standAlone-narrow":["S","M","T","W","T","F","S"],"eraAbbr":["AH"],"dateFormat-long":"MMMM d, y G","timeFormat-medium":"h:mm:ss a","dateFormatItem-EEEd":"d EEE","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"MMM d, y G","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-ms":"mm:ss","months-standAlone-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yyyyMEd":"EEE, M/d/y G","dateFormatItem-MMMd":"MMM d","timeFormat-long":"h:mm:ss a z","months-format-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"timeFormat-short":"h:mm a","days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateFormatItem-M":"L","dateFormatItem-yyyyQQQ":"QQQ y G","dateFormatItem-MEd":"E, M/d","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-hm":"h:mm a","dateFormat-short":"M/d/yy G","dateFormatItem-yyyyM":"M/y G","dateFormatItem-yMMMEd":"EEE, MMM d, y","dateFormat-full":"EEEE, MMMM d, y G","dateFormatItem-Md":"M/d","dateFormatItem-yyyyQ":"Q y G","dateFormatItem-yMEd":"EEE, M/d/y","months-format-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yyyyMMM":"MMM y G","dateFormatItem-d":"d","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"eraNarrow":["AH"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en/islamic.js.uncompressed.js b/lib/dojo/cldr/nls/en/islamic.js.uncompressed.js
new file mode 100644
index 000000000..12ceba0f9
--- /dev/null
+++ b/lib/dojo/cldr/nls/en/islamic.js.uncompressed.js
@@ -0,0 +1,166 @@
+define(
+"dojo/cldr/nls/en/islamic", //begin v1.x content
+{
+ "dateFormatItem-yM": "M/y",
+ "dateFormatItem-yyyyMMMEd": "EEE, MMM d, y G",
+ "dateFormatItem-yQ": "Q y",
+ "eraNames": [
+ "AH"
+ ],
+ "dateFormatItem-MMMEd": "E, MMM d",
+ "dateFormatItem-hms": "h:mm:ss a",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-MMM": "LLL",
+ "months-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "timeFormat-full": "h:mm:ss a zzzz",
+ "dateFormatItem-yyyy": "y G",
+ "months-standAlone-abbr": [
+ "Muh.",
+ "Saf.",
+ "Rab. I",
+ "Rab. II",
+ "Jum. I",
+ "Jum. II",
+ "Raj.",
+ "Sha.",
+ "Ram.",
+ "Shaw.",
+ "Dhuʻl-Q.",
+ "Dhuʻl-H."
+ ],
+ "dateFormatItem-yMMM": "MMM y",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "W",
+ "T",
+ "F",
+ "S"
+ ],
+ "eraAbbr": [
+ "AH"
+ ],
+ "dateFormat-long": "MMMM d, y G",
+ "timeFormat-medium": "h:mm:ss a",
+ "dateFormatItem-EEEd": "d EEE",
+ "dateFormatItem-Hm": "HH:mm",
+ "dateFormat-medium": "MMM d, y G",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-ms": "mm:ss",
+ "months-standAlone-wide": [
+ "Muharram",
+ "Safar",
+ "Rabiʻ I",
+ "Rabiʻ II",
+ "Jumada I",
+ "Jumada II",
+ "Rajab",
+ "Shaʻban",
+ "Ramadan",
+ "Shawwal",
+ "Dhuʻl-Qiʻdah",
+ "Dhuʻl-Hijjah"
+ ],
+ "dateFormatItem-yyyyMEd": "EEE, M/d/y G",
+ "dateFormatItem-MMMd": "MMM d",
+ "timeFormat-long": "h:mm:ss a z",
+ "months-format-abbr": [
+ "Muh.",
+ "Saf.",
+ "Rab. I",
+ "Rab. II",
+ "Jum. I",
+ "Jum. II",
+ "Raj.",
+ "Sha.",
+ "Ram.",
+ "Shaw.",
+ "Dhuʻl-Q.",
+ "Dhuʻl-H."
+ ],
+ "timeFormat-short": "h:mm a",
+ "days-format-abbr": [
+ "Sun",
+ "Mon",
+ "Tue",
+ "Wed",
+ "Thu",
+ "Fri",
+ "Sat"
+ ],
+ "dateFormatItem-M": "L",
+ "dateFormatItem-yyyyQQQ": "QQQ y G",
+ "dateFormatItem-MEd": "E, M/d",
+ "months-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dateFormatItem-hm": "h:mm a",
+ "dateFormat-short": "M/d/yy G",
+ "dateFormatItem-yyyyM": "M/y G",
+ "dateFormatItem-yMMMEd": "EEE, MMM d, y",
+ "dateFormat-full": "EEEE, MMMM d, y G",
+ "dateFormatItem-Md": "M/d",
+ "dateFormatItem-yyyyQ": "Q y G",
+ "dateFormatItem-yMEd": "EEE, M/d/y",
+ "months-format-wide": [
+ "Muharram",
+ "Safar",
+ "Rabiʻ I",
+ "Rabiʻ II",
+ "Jumada I",
+ "Jumada II",
+ "Rajab",
+ "Shaʻban",
+ "Ramadan",
+ "Shawwal",
+ "Dhuʻl-Qiʻdah",
+ "Dhuʻl-Hijjah"
+ ],
+ "dateFormatItem-yyyyMMM": "MMM y G",
+ "dateFormatItem-d": "d",
+ "quarters-format-wide": [
+ "1st quarter",
+ "2nd quarter",
+ "3rd quarter",
+ "4th quarter"
+ ],
+ "eraNarrow": [
+ "AH"
+ ],
+ "days-format-wide": [
+ "Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en/number.js b/lib/dojo/cldr/nls/en/number.js
index 9c2a23153..ecb843bcd 100644
--- a/lib/dojo/cldr/nls/en/number.js
+++ b/lib/dojo/cldr/nls/en/number.js
@@ -1 +1,8 @@
-({"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;(¤#,##0.00)","plusSign":"+","decimalFormat-short":"000T","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/en/number",{"group":",","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0%","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;(¤#,##0.00)","plusSign":"+","decimalFormat-short":"000T"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/en/number.js.uncompressed.js b/lib/dojo/cldr/nls/en/number.js.uncompressed.js
new file mode 100644
index 000000000..dc36cc723
--- /dev/null
+++ b/lib/dojo/cldr/nls/en/number.js.uncompressed.js
@@ -0,0 +1,23 @@
+define(
+"dojo/cldr/nls/en/number", //begin v1.x content
+{
+ "group": ",",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ".",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "¤#,##0.00;(¤#,##0.00)",
+ "plusSign": "+",
+ "decimalFormat-short": "000T"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/es/buddhist.js b/lib/dojo/cldr/nls/es/buddhist.js
index eadddb3e7..aac75ba3a 100644
--- a/lib/dojo/cldr/nls/es/buddhist.js
+++ b/lib/dojo/cldr/nls/es/buddhist.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"M/y G","dateFormatItem-yQ":"Q y G","dayPeriods-format-wide-pm":"p.m.","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-hms":"hh:mm:ss a","dateFormatItem-yQQQ":"QQQ y G","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["E","F","M","A","M","J","J","A","S","O","N","D"],"dayPeriods-format-wide-am":"a.m.","dateFormatItem-y":"y G","dateFormatItem-MMMdd":"dd-MMM","dateFormatItem-yMMM":"MMM y G","days-standAlone-narrow":["D","L","M","M","J","V","S"],"dateFormatItem-yyyyMM":"MM/y G","dateFormat-long":"d 'de' MMMM 'de' y G","dateFormatItem-EEEd":"EEE d","dateFormatItem-Hm":"HH:mm","dateFormatItem-MMd":"d/MM","dateFormatItem-yyMM":"MM/y G","dateFormat-medium":"dd/MM/y G","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-yyMMM":"MMM-y G","dateFormatItem-yyQQQQ":"QQQQ 'de' y G","dateFormatItem-yMd":"d/M/y G","dateFormatItem-yMMMM":"MMMM 'de' y G","dateFormatItem-ms":"mm:ss","dateFormatItem-MMMd":"d MMM","dateFormatItem-yyQ":"Q y G","months-format-abbr":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],"dateFormatItem-MMMMd":"d 'de' MMMM","quarters-format-abbr":["T1","T2","T3","T4"],"days-format-abbr":["dom","lun","mar","mié","jue","vie","sáb"],"dateFormatItem-M":"L","dateFormatItem-yMMMd":"d MMM y G","dateFormatItem-MEd":"E, d/M","dateFormatItem-hm":"hh:mm a","dateFormat-short":"dd/MM/y G","dateFormatItem-yMMMEd":"EEE, d MMM y G","dateFormat-full":"EEEE d 'de' MMMM 'de' y G","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE d/M/y G","months-format-wide":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"dateFormatItem-d":"d","quarters-format-wide":["1er trimestre","2º trimestre","3er trimestre","4º trimestre"],"days-format-wide":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"dateFormatItem-h":"hh a","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"eraNarrow":["BE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","timeFormat-long":"HH:mm:ss z","dateTimeFormats-appendItem-Era":"{0} {1}","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"timeFormat-medium":"HH:mm:ss","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["BE"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","eraNames":["BE"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/es/buddhist",{"dateFormatItem-yM":"M/y G","dateFormatItem-yQ":"Q y G","dayPeriods-format-wide-pm":"p.m.","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-hms":"hh:mm:ss a","dateFormatItem-yQQQ":"QQQ y G","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["E","F","M","A","M","J","J","A","S","O","N","D"],"dayPeriods-format-wide-am":"a.m.","dateFormatItem-y":"y G","dateFormatItem-MMMdd":"dd-MMM","dateFormatItem-yMMM":"MMM y G","days-standAlone-narrow":["D","L","M","M","J","V","S"],"dateFormatItem-yyyyMM":"MM/y G","dateFormat-long":"d 'de' MMMM 'de' y G","dateFormatItem-EEEd":"EEE d","dateFormatItem-Hm":"HH:mm","dateFormatItem-MMd":"d/MM","dateFormatItem-yyMM":"MM/y G","dateFormat-medium":"dd/MM/y G","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-yyMMM":"MMM-y G","dateFormatItem-yyQQQQ":"QQQQ 'de' y G","dateFormatItem-yMd":"d/M/y G","dateFormatItem-yMMMM":"MMMM 'de' y G","dateFormatItem-ms":"mm:ss","dateFormatItem-MMMd":"d MMM","dateFormatItem-yyQ":"Q y G","months-format-abbr":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],"dateFormatItem-MMMMd":"d 'de' MMMM","quarters-format-abbr":["T1","T2","T3","T4"],"days-format-abbr":["dom","lun","mar","mié","jue","vie","sáb"],"dateFormatItem-M":"L","dateFormatItem-yMMMd":"d MMM y G","dateFormatItem-MEd":"E, d/M","dateFormatItem-hm":"hh:mm a","dateFormat-short":"dd/MM/y G","dateFormatItem-yMMMEd":"EEE, d MMM y G","dateFormat-full":"EEEE d 'de' MMMM 'de' y G","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE d/M/y G","months-format-wide":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"dateFormatItem-d":"d","quarters-format-wide":["1er trimestre","2º trimestre","3er trimestre","4º trimestre"],"days-format-wide":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"dateFormatItem-h":"hh a"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/es/buddhist.js.uncompressed.js b/lib/dojo/cldr/nls/es/buddhist.js.uncompressed.js
new file mode 100644
index 000000000..6ad64f378
--- /dev/null
+++ b/lib/dojo/cldr/nls/es/buddhist.js.uncompressed.js
@@ -0,0 +1,125 @@
+define(
+"dojo/cldr/nls/es/buddhist", //begin v1.x content
+{
+ "dateFormatItem-yM": "M/y G",
+ "dateFormatItem-yQ": "Q y G",
+ "dayPeriods-format-wide-pm": "p.m.",
+ "dateFormatItem-MMMEd": "E d MMM",
+ "dateFormatItem-hms": "hh:mm:ss a",
+ "dateFormatItem-yQQQ": "QQQ y G",
+ "dateFormatItem-MMM": "LLL",
+ "months-standAlone-narrow": [
+ "E",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dayPeriods-format-wide-am": "a.m.",
+ "dateFormatItem-y": "y G",
+ "dateFormatItem-MMMdd": "dd-MMM",
+ "dateFormatItem-yMMM": "MMM y G",
+ "days-standAlone-narrow": [
+ "D",
+ "L",
+ "M",
+ "M",
+ "J",
+ "V",
+ "S"
+ ],
+ "dateFormatItem-yyyyMM": "MM/y G",
+ "dateFormat-long": "d 'de' MMMM 'de' y G",
+ "dateFormatItem-EEEd": "EEE d",
+ "dateFormatItem-Hm": "HH:mm",
+ "dateFormatItem-MMd": "d/MM",
+ "dateFormatItem-yyMM": "MM/y G",
+ "dateFormat-medium": "dd/MM/y G",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-yyMMM": "MMM-y G",
+ "dateFormatItem-yyQQQQ": "QQQQ 'de' y G",
+ "dateFormatItem-yMd": "d/M/y G",
+ "dateFormatItem-yMMMM": "MMMM 'de' y G",
+ "dateFormatItem-ms": "mm:ss",
+ "dateFormatItem-MMMd": "d MMM",
+ "dateFormatItem-yyQ": "Q y G",
+ "months-format-abbr": [
+ "ene",
+ "feb",
+ "mar",
+ "abr",
+ "may",
+ "jun",
+ "jul",
+ "ago",
+ "sep",
+ "oct",
+ "nov",
+ "dic"
+ ],
+ "dateFormatItem-MMMMd": "d 'de' MMMM",
+ "quarters-format-abbr": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "days-format-abbr": [
+ "dom",
+ "lun",
+ "mar",
+ "mié",
+ "jue",
+ "vie",
+ "sáb"
+ ],
+ "dateFormatItem-M": "L",
+ "dateFormatItem-yMMMd": "d MMM y G",
+ "dateFormatItem-MEd": "E, d/M",
+ "dateFormatItem-hm": "hh:mm a",
+ "dateFormat-short": "dd/MM/y G",
+ "dateFormatItem-yMMMEd": "EEE, d MMM y G",
+ "dateFormat-full": "EEEE d 'de' MMMM 'de' y G",
+ "dateFormatItem-Md": "d/M",
+ "dateFormatItem-yMEd": "EEE d/M/y G",
+ "months-format-wide": [
+ "enero",
+ "febrero",
+ "marzo",
+ "abril",
+ "mayo",
+ "junio",
+ "julio",
+ "agosto",
+ "septiembre",
+ "octubre",
+ "noviembre",
+ "diciembre"
+ ],
+ "dateFormatItem-d": "d",
+ "quarters-format-wide": [
+ "1er trimestre",
+ "2º trimestre",
+ "3er trimestre",
+ "4º trimestre"
+ ],
+ "days-format-wide": [
+ "domingo",
+ "lunes",
+ "martes",
+ "miércoles",
+ "jueves",
+ "viernes",
+ "sábado"
+ ],
+ "dateFormatItem-h": "hh a"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/es/currency.js b/lib/dojo/cldr/nls/es/currency.js
index ce5b213cf..f88ae2908 100644
--- a/lib/dojo/cldr/nls/es/currency.js
+++ b/lib/dojo/cldr/nls/es/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"dólar de Hong Kong","CHF_displayName":"franco suizo","CAD_displayName":"dólar canadiense","CNY_displayName":"yuan renminbi chino","AUD_displayName":"dólar australiano","JPY_displayName":"yen japonés","USD_displayName":"dólar estadounidense","GBP_displayName":"libra esterlina británica","EUR_displayName":"euro","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/es/currency",{"HKD_displayName":"dólar de Hong Kong","CHF_displayName":"franco suizo","CAD_displayName":"dólar canadiense","CNY_displayName":"yuan renminbi chino","AUD_displayName":"dólar australiano","JPY_displayName":"yen japonés","USD_displayName":"dólar estadounidense","GBP_displayName":"libra esterlina británica","EUR_displayName":"euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/es/currency.js.uncompressed.js b/lib/dojo/cldr/nls/es/currency.js.uncompressed.js
new file mode 100644
index 000000000..f3c352998
--- /dev/null
+++ b/lib/dojo/cldr/nls/es/currency.js.uncompressed.js
@@ -0,0 +1,15 @@
+define(
+"dojo/cldr/nls/es/currency", //begin v1.x content
+{
+ "HKD_displayName": "dólar de Hong Kong",
+ "CHF_displayName": "franco suizo",
+ "CAD_displayName": "dólar canadiense",
+ "CNY_displayName": "yuan renminbi chino",
+ "AUD_displayName": "dólar australiano",
+ "JPY_displayName": "yen japonés",
+ "USD_displayName": "dólar estadounidense",
+ "GBP_displayName": "libra esterlina británica",
+ "EUR_displayName": "euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/es/gregorian.js b/lib/dojo/cldr/nls/es/gregorian.js
index 811e15ea3..adcf1e0ff 100644
--- a/lib/dojo/cldr/nls/es/gregorian.js
+++ b/lib/dojo/cldr/nls/es/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["E","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"día de la semana","dateFormatItem-yyQQQQ":"QQQQ 'de' yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d/M/y","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["a.C.","d.C."],"dateFormatItem-MMMdd":"dd-MMM","dateFormat-long":"d 'de' MMMM 'de' y","months-format-wide":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"dateFormatItem-EEEd":"EEE d","dayPeriods-format-wide-pm":"p.m.","dateFormat-full":"EEEE d 'de' MMMM 'de' y","dateFormatItem-Md":"d/M","field-era":"era","dateFormatItem-yM":"M/y","months-standAlone-wide":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"timeFormat-short":"HH:mm","quarters-format-wide":["1er trimestre","2º trimestre","3er trimestre","4º trimestre"],"timeFormat-long":"HH:mm:ss z","field-year":"año","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q y","field-hour":"hora","months-format-abbr":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"hoy","field-day-relative+1":"mañana","field-day-relative+2":"pasado mañana","field-day-relative+3":"Dentro de tres días","months-standAlone-abbr":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1er trimestre","2º trimestre","3er trimestre","4º trimestre"],"dateFormatItem-M":"L","days-standAlone-wide":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"dateFormatItem-MMMMd":"d 'de' MMMM","dateFormatItem-yyMMM":"MMM-yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["T1","T2","T3","T4"],"eraAbbr":["a.C.","d.C."],"field-minute":"minuto","field-dayperiod":"periodo del día","days-standAlone-abbr":["dom","lun","mar","mié","jue","vie","sáb"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"ayer","dateFormatItem-h":"hh a","field-day-relative+-2":"antes de ayer","field-day-relative+-3":"Hace tres días","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, d/M","dateFormatItem-yMMMM":"MMMM 'de' y","field-day":"día","days-format-wide":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"field-zone":"zona","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["E","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM/yy","dateFormatItem-hm":"hh:mm a","days-format-abbr":["dom","lun","mar","mié","jue","vie","sáb"],"eraNames":["antes de Cristo","anno Dómini"],"days-format-narrow":["D","L","M","M","J","V","S"],"field-month":"mes","days-standAlone-narrow":["D","L","M","M","J","V","S"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"a.m.","dateFormat-short":"dd/MM/yy","dateFormatItem-MMd":"d/MM","field-second":"segundo","dateFormatItem-yMMMEd":"EEE, d MMM y","field-week":"semana","dateFormat-medium":"dd/MM/yyyy","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"hh:mm:ss a","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-narrow":["1","2","3","4"],"dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/es/gregorian",{"months-format-narrow":["E","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"día de la semana","dateFormatItem-yyQQQQ":"QQQQ 'de' yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d/M/y","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["a.C.","d.C."],"dateFormatItem-MMMdd":"dd-MMM","dateFormat-long":"d 'de' MMMM 'de' y","months-format-wide":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"dateFormatItem-EEEd":"EEE d","dayPeriods-format-wide-pm":"p.m.","dateFormat-full":"EEEE d 'de' MMMM 'de' y","dateFormatItem-Md":"d/M","field-era":"era","dateFormatItem-yM":"M/y","months-standAlone-wide":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"timeFormat-short":"HH:mm","quarters-format-wide":["1er trimestre","2º trimestre","3er trimestre","4º trimestre"],"timeFormat-long":"HH:mm:ss z","field-year":"año","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q y","field-hour":"hora","months-format-abbr":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"hoy","field-day-relative+1":"mañana","field-day-relative+2":"pasado mañana","field-day-relative+3":"Dentro de tres días","months-standAlone-abbr":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1er trimestre","2º trimestre","3er trimestre","4º trimestre"],"dateFormatItem-M":"L","days-standAlone-wide":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"dateFormatItem-MMMMd":"d 'de' MMMM","dateFormatItem-yyMMM":"MMM-yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["T1","T2","T3","T4"],"eraAbbr":["a.C.","d.C."],"field-minute":"minuto","field-dayperiod":"periodo del día","days-standAlone-abbr":["dom","lun","mar","mié","jue","vie","sáb"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"ayer","dateFormatItem-h":"hh a","field-day-relative+-2":"antes de ayer","field-day-relative+-3":"Hace tres días","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, d/M","dateFormatItem-yMMMM":"MMMM 'de' y","field-day":"día","days-format-wide":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"field-zone":"zona","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["E","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM/yy","dateFormatItem-hm":"hh:mm a","days-format-abbr":["dom","lun","mar","mié","jue","vie","sáb"],"eraNames":["antes de Cristo","anno Dómini"],"days-format-narrow":["D","L","M","M","J","V","S"],"field-month":"mes","days-standAlone-narrow":["D","L","M","M","J","V","S"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"a.m.","dateFormat-short":"dd/MM/yy","dateFormatItem-MMd":"d/MM","field-second":"segundo","dateFormatItem-yMMMEd":"EEE, d MMM y","field-week":"semana","dateFormat-medium":"dd/MM/yyyy","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"hh:mm:ss a"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/es/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/es/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..2087aa4a8
--- /dev/null
+++ b/lib/dojo/cldr/nls/es/gregorian.js.uncompressed.js
@@ -0,0 +1,238 @@
+define(
+"dojo/cldr/nls/es/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "E",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "field-weekday": "día de la semana",
+ "dateFormatItem-yyQQQQ": "QQQQ 'de' yy",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yMEd": "EEE d/M/y",
+ "dateFormatItem-MMMEd": "E d MMM",
+ "eraNarrow": [
+ "a.C.",
+ "d.C."
+ ],
+ "dateFormatItem-MMMdd": "dd-MMM",
+ "dateFormat-long": "d 'de' MMMM 'de' y",
+ "months-format-wide": [
+ "enero",
+ "febrero",
+ "marzo",
+ "abril",
+ "mayo",
+ "junio",
+ "julio",
+ "agosto",
+ "septiembre",
+ "octubre",
+ "noviembre",
+ "diciembre"
+ ],
+ "dateFormatItem-EEEd": "EEE d",
+ "dayPeriods-format-wide-pm": "p.m.",
+ "dateFormat-full": "EEEE d 'de' MMMM 'de' y",
+ "dateFormatItem-Md": "d/M",
+ "field-era": "era",
+ "dateFormatItem-yM": "M/y",
+ "months-standAlone-wide": [
+ "enero",
+ "febrero",
+ "marzo",
+ "abril",
+ "mayo",
+ "junio",
+ "julio",
+ "agosto",
+ "septiembre",
+ "octubre",
+ "noviembre",
+ "diciembre"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "1er trimestre",
+ "2º trimestre",
+ "3er trimestre",
+ "4º trimestre"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "field-year": "año",
+ "dateFormatItem-yMMM": "MMM y",
+ "dateFormatItem-yQ": "Q y",
+ "field-hour": "hora",
+ "months-format-abbr": [
+ "ene",
+ "feb",
+ "mar",
+ "abr",
+ "may",
+ "jun",
+ "jul",
+ "ago",
+ "sep",
+ "oct",
+ "nov",
+ "dic"
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "field-day-relative+0": "hoy",
+ "field-day-relative+1": "mañana",
+ "field-day-relative+2": "pasado mañana",
+ "field-day-relative+3": "Dentro de tres días",
+ "months-standAlone-abbr": [
+ "ene",
+ "feb",
+ "mar",
+ "abr",
+ "may",
+ "jun",
+ "jul",
+ "ago",
+ "sep",
+ "oct",
+ "nov",
+ "dic"
+ ],
+ "quarters-format-abbr": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "quarters-standAlone-wide": [
+ "1er trimestre",
+ "2º trimestre",
+ "3er trimestre",
+ "4º trimestre"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "domingo",
+ "lunes",
+ "martes",
+ "miércoles",
+ "jueves",
+ "viernes",
+ "sábado"
+ ],
+ "dateFormatItem-MMMMd": "d 'de' MMMM",
+ "dateFormatItem-yyMMM": "MMM-yy",
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "eraAbbr": [
+ "a.C.",
+ "d.C."
+ ],
+ "field-minute": "minuto",
+ "field-dayperiod": "periodo del día",
+ "days-standAlone-abbr": [
+ "dom",
+ "lun",
+ "mar",
+ "mié",
+ "jue",
+ "vie",
+ "sáb"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "ayer",
+ "dateFormatItem-h": "hh a",
+ "field-day-relative+-2": "antes de ayer",
+ "field-day-relative+-3": "Hace tres días",
+ "dateFormatItem-MMMd": "d MMM",
+ "dateFormatItem-MEd": "E, d/M",
+ "dateFormatItem-yMMMM": "MMMM 'de' y",
+ "field-day": "día",
+ "days-format-wide": [
+ "domingo",
+ "lunes",
+ "martes",
+ "miércoles",
+ "jueves",
+ "viernes",
+ "sábado"
+ ],
+ "field-zone": "zona",
+ "dateFormatItem-yyyyMM": "MM/yyyy",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "E",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateFormatItem-yyMM": "MM/yy",
+ "dateFormatItem-hm": "hh:mm a",
+ "days-format-abbr": [
+ "dom",
+ "lun",
+ "mar",
+ "mié",
+ "jue",
+ "vie",
+ "sáb"
+ ],
+ "eraNames": [
+ "antes de Cristo",
+ "anno Dómini"
+ ],
+ "days-format-narrow": [
+ "D",
+ "L",
+ "M",
+ "M",
+ "J",
+ "V",
+ "S"
+ ],
+ "field-month": "mes",
+ "days-standAlone-narrow": [
+ "D",
+ "L",
+ "M",
+ "M",
+ "J",
+ "V",
+ "S"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "a.m.",
+ "dateFormat-short": "dd/MM/yy",
+ "dateFormatItem-MMd": "d/MM",
+ "field-second": "segundo",
+ "dateFormatItem-yMMMEd": "EEE, d MMM y",
+ "field-week": "semana",
+ "dateFormat-medium": "dd/MM/yyyy",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-hms": "hh:mm:ss a"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/es/islamic.js b/lib/dojo/cldr/nls/es/islamic.js
index 906accde0..67a6ad973 100644
--- a/lib/dojo/cldr/nls/es/islamic.js
+++ b/lib/dojo/cldr/nls/es/islamic.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"M/y","dateFormatItem-yyyyMMMEd":"EEE, d MMM y G","dateFormatItem-yQ":"Q y","dayPeriods-format-wide-pm":"p.m.","eraNames":["AH"],"dateFormatItem-MMMEd":"E d MMM","dateFormatItem-hms":"hh:mm:ss a","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dayPeriods-format-wide-am":"a.m.","dateFormatItem-MMMdd":"dd-MMM","dateFormatItem-yyyy":"y G","months-standAlone-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateFormatItem-yMMM":"MMM y","days-standAlone-narrow":["D","L","M","M","J","V","S"],"eraAbbr":["AH"],"dateFormatItem-yyyyMMMM":"MMMM 'de' y G","dateFormat-long":"d 'de' MMMM 'de' y G","dateFormatItem-EEEd":"EEE d","dateFormatItem-Hm":"HH:mm","dateFormatItem-MMd":"d/MM","dateFormatItem-yyMM":"MM/y G","dateFormat-medium":"dd/MM/y G","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-yyMMM":"MMM-y G","dateFormatItem-yyQQQQ":"QQQQ 'de' y G","dateFormatItem-ms":"mm:ss","months-standAlone-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yyyyMEd":"EEE d/M/y G","dateFormatItem-MMMd":"d MMM","dateFormatItem-yyQ":"Q y G","months-format-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateFormatItem-MMMMd":"d 'de' MMMM","quarters-format-abbr":["T1","T2","T3","T4"],"days-format-abbr":["dom","lun","mar","mié","jue","vie","sáb"],"dateFormatItem-M":"L","dateFormatItem-MEd":"E, d/M","dateFormatItem-yyyyQQQ":"QQQ y G","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-hm":"hh:mm a","dateFormat-short":"dd/MM/y G","dateFormatItem-yyyyM":"M/y G","dateFormatItem-yMMMEd":"EEE, d MMM y","dateFormat-full":"EEEE d 'de' MMMM 'de' y G","dateFormatItem-Md":"d/M","dateFormatItem-yyyyQ":"Q y G","dateFormatItem-yMEd":"EEE d/M/y","months-format-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yyyyMMM":"MMM y G","dateFormatItem-d":"d","quarters-format-wide":["1er trimestre","2º trimestre","3er trimestre","4º trimestre"],"eraNarrow":["AH"],"days-format-wide":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"dateFormatItem-h":"hh a","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","timeFormat-short":"HH:mm","timeFormat-long":"HH:mm:ss z","dateTimeFormats-appendItem-Era":"{0} {1}","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"timeFormat-medium":"HH:mm:ss","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/es/islamic",{"dateFormatItem-yM":"M/y","dateFormatItem-yyyyMMMEd":"EEE, d MMM y G","dateFormatItem-yQ":"Q y","dayPeriods-format-wide-pm":"p.m.","eraNames":["AH"],"dateFormatItem-MMMEd":"E d MMM","dateFormatItem-hms":"hh:mm:ss a","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-MMM":"LLL","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dayPeriods-format-wide-am":"a.m.","dateFormatItem-MMMdd":"dd-MMM","dateFormatItem-yyyy":"y G","months-standAlone-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateFormatItem-yMMM":"MMM y","days-standAlone-narrow":["D","L","M","M","J","V","S"],"eraAbbr":["AH"],"dateFormatItem-yyyyMMMM":"MMMM 'de' y G","dateFormat-long":"d 'de' MMMM 'de' y G","dateFormatItem-EEEd":"EEE d","dateFormatItem-Hm":"HH:mm","dateFormatItem-MMd":"d/MM","dateFormatItem-yyMM":"MM/y G","dateFormat-medium":"dd/MM/y G","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-yyMMM":"MMM-y G","dateFormatItem-yyQQQQ":"QQQQ 'de' y G","dateFormatItem-ms":"mm:ss","months-standAlone-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yyyyMEd":"EEE d/M/y G","dateFormatItem-MMMd":"d MMM","dateFormatItem-yyQ":"Q y G","months-format-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateFormatItem-MMMMd":"d 'de' MMMM","quarters-format-abbr":["T1","T2","T3","T4"],"days-format-abbr":["dom","lun","mar","mié","jue","vie","sáb"],"dateFormatItem-M":"L","dateFormatItem-MEd":"E, d/M","dateFormatItem-yyyyQQQ":"QQQ y G","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-hm":"hh:mm a","dateFormat-short":"dd/MM/y G","dateFormatItem-yyyyM":"M/y G","dateFormatItem-yMMMEd":"EEE, d MMM y","dateFormat-full":"EEEE d 'de' MMMM 'de' y G","dateFormatItem-Md":"d/M","dateFormatItem-yyyyQ":"Q y G","dateFormatItem-yMEd":"EEE d/M/y","months-format-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateFormatItem-yyyyMMM":"MMM y G","dateFormatItem-d":"d","quarters-format-wide":["1er trimestre","2º trimestre","3er trimestre","4º trimestre"],"eraNarrow":["AH"],"days-format-wide":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"dateFormatItem-h":"hh a"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/es/islamic.js.uncompressed.js b/lib/dojo/cldr/nls/es/islamic.js.uncompressed.js
new file mode 100644
index 000000000..01931ed27
--- /dev/null
+++ b/lib/dojo/cldr/nls/es/islamic.js.uncompressed.js
@@ -0,0 +1,179 @@
+define(
+"dojo/cldr/nls/es/islamic", //begin v1.x content
+{
+ "dateFormatItem-yM": "M/y",
+ "dateFormatItem-yyyyMMMEd": "EEE, d MMM y G",
+ "dateFormatItem-yQ": "Q y",
+ "dayPeriods-format-wide-pm": "p.m.",
+ "eraNames": [
+ "AH"
+ ],
+ "dateFormatItem-MMMEd": "E d MMM",
+ "dateFormatItem-hms": "hh:mm:ss a",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-MMM": "LLL",
+ "months-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dayPeriods-format-wide-am": "a.m.",
+ "dateFormatItem-MMMdd": "dd-MMM",
+ "dateFormatItem-yyyy": "y G",
+ "months-standAlone-abbr": [
+ "Muh.",
+ "Saf.",
+ "Rab. I",
+ "Rab. II",
+ "Jum. I",
+ "Jum. II",
+ "Raj.",
+ "Sha.",
+ "Ram.",
+ "Shaw.",
+ "Dhuʻl-Q.",
+ "Dhuʻl-H."
+ ],
+ "dateFormatItem-yMMM": "MMM y",
+ "days-standAlone-narrow": [
+ "D",
+ "L",
+ "M",
+ "M",
+ "J",
+ "V",
+ "S"
+ ],
+ "eraAbbr": [
+ "AH"
+ ],
+ "dateFormatItem-yyyyMMMM": "MMMM 'de' y G",
+ "dateFormat-long": "d 'de' MMMM 'de' y G",
+ "dateFormatItem-EEEd": "EEE d",
+ "dateFormatItem-Hm": "HH:mm",
+ "dateFormatItem-MMd": "d/MM",
+ "dateFormatItem-yyMM": "MM/y G",
+ "dateFormat-medium": "dd/MM/y G",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-yyMMM": "MMM-y G",
+ "dateFormatItem-yyQQQQ": "QQQQ 'de' y G",
+ "dateFormatItem-ms": "mm:ss",
+ "months-standAlone-wide": [
+ "Muharram",
+ "Safar",
+ "Rabiʻ I",
+ "Rabiʻ II",
+ "Jumada I",
+ "Jumada II",
+ "Rajab",
+ "Shaʻban",
+ "Ramadan",
+ "Shawwal",
+ "Dhuʻl-Qiʻdah",
+ "Dhuʻl-Hijjah"
+ ],
+ "dateFormatItem-yyyyMEd": "EEE d/M/y G",
+ "dateFormatItem-MMMd": "d MMM",
+ "dateFormatItem-yyQ": "Q y G",
+ "months-format-abbr": [
+ "Muh.",
+ "Saf.",
+ "Rab. I",
+ "Rab. II",
+ "Jum. I",
+ "Jum. II",
+ "Raj.",
+ "Sha.",
+ "Ram.",
+ "Shaw.",
+ "Dhuʻl-Q.",
+ "Dhuʻl-H."
+ ],
+ "dateFormatItem-MMMMd": "d 'de' MMMM",
+ "quarters-format-abbr": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "days-format-abbr": [
+ "dom",
+ "lun",
+ "mar",
+ "mié",
+ "jue",
+ "vie",
+ "sáb"
+ ],
+ "dateFormatItem-M": "L",
+ "dateFormatItem-MEd": "E, d/M",
+ "dateFormatItem-yyyyQQQ": "QQQ y G",
+ "months-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dateFormatItem-hm": "hh:mm a",
+ "dateFormat-short": "dd/MM/y G",
+ "dateFormatItem-yyyyM": "M/y G",
+ "dateFormatItem-yMMMEd": "EEE, d MMM y",
+ "dateFormat-full": "EEEE d 'de' MMMM 'de' y G",
+ "dateFormatItem-Md": "d/M",
+ "dateFormatItem-yyyyQ": "Q y G",
+ "dateFormatItem-yMEd": "EEE d/M/y",
+ "months-format-wide": [
+ "Muharram",
+ "Safar",
+ "Rabiʻ I",
+ "Rabiʻ II",
+ "Jumada I",
+ "Jumada II",
+ "Rajab",
+ "Shaʻban",
+ "Ramadan",
+ "Shawwal",
+ "Dhuʻl-Qiʻdah",
+ "Dhuʻl-Hijjah"
+ ],
+ "dateFormatItem-yyyyMMM": "MMM y G",
+ "dateFormatItem-d": "d",
+ "quarters-format-wide": [
+ "1er trimestre",
+ "2º trimestre",
+ "3er trimestre",
+ "4º trimestre"
+ ],
+ "eraNarrow": [
+ "AH"
+ ],
+ "days-format-wide": [
+ "domingo",
+ "lunes",
+ "martes",
+ "miércoles",
+ "jueves",
+ "viernes",
+ "sábado"
+ ],
+ "dateFormatItem-h": "hh a"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/es/number.js b/lib/dojo/cldr/nls/es/number.js
index 4a31948c4..f993b17bd 100644
--- a/lib/dojo/cldr/nls/es/number.js
+++ b/lib/dojo/cldr/nls/es/number.js
@@ -1 +1,8 @@
-({"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/es/number",{"group":".","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0%","list":";","infinity":"∞","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/es/number.js.uncompressed.js b/lib/dojo/cldr/nls/es/number.js.uncompressed.js
new file mode 100644
index 000000000..85ad72c8a
--- /dev/null
+++ b/lib/dojo/cldr/nls/es/number.js.uncompressed.js
@@ -0,0 +1,21 @@
+define(
+"dojo/cldr/nls/es/number", //begin v1.x content
+{
+ "group": ".",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "list": ";",
+ "infinity": "∞",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "¤ #,##0.00",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fi/buddhist.js b/lib/dojo/cldr/nls/fi/buddhist.js
index 2598108a3..61ae755e1 100644
--- a/lib/dojo/cldr/nls/fi/buddhist.js
+++ b/lib/dojo/cldr/nls/fi/buddhist.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"L.y G","dateFormatItem-yMMMMccccd":"cccc, d. MMMM y G","dateFormatItem-yQ":"Q/y G","dayPeriods-format-wide-pm":"ip.","dateFormatItem-MMMEd":"E d. MMM","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yQQQ":"QQQ y G","days-standAlone-wide":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["T","H","M","H","T","K","H","E","S","L","M","J"],"dateFormatItem-Gy":"y G","dayPeriods-format-wide-am":"ap.","dateFormatItem-y":"y G","timeFormat-full":"H.mm.ss zzzz","months-standAlone-abbr":["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"],"dateFormatItem-Ed":"ccc d.","dateFormatItem-yMMM":"LLLL y G","days-standAlone-narrow":["S","M","T","K","T","P","L"],"dateFormatItem-yyyyMMMM":"LLLL y G","dateFormat-long":"d. MMMM y G","timeFormat-medium":"H.mm.ss","dateFormatItem-Hm":"H.mm","dateFormatItem-yyyyMEEEd":"EEE d.M.y G","dateFormatItem-yyMM":"M.y G","dateFormat-medium":"d.M.y G","dateFormatItem-Hms":"H.mm.ss","dateFormatItem-yyMMM":"LLLL y G","dateFormatItem-ms":"mm.ss","dateFormatItem-yyyyQQQQ":"QQQQ y G","months-standAlone-wide":["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],"dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q/y G","timeFormat-long":"H.mm.ss z","months-format-abbr":["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"],"dateFormatItem-H":"H","timeFormat-short":"H.mm","quarters-format-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"days-format-abbr":["su","ma","ti","ke","to","pe","la"],"dateFormatItem-M":"L","dateFormatItem-MEd":"E d.M.","dateFormatItem-hm":"h.mm a","dayPeriods-format-abbr-pm":"ip.","dateFormat-short":"d.M.y G","dateFormatItem-yyyyM":"M.y G","dateFormatItem-yMMMEd":"EEE d. MMM y G","dateFormat-full":"cccc d. MMMM y G","dateFormatItem-Md":"d.M.","dateFormatItem-yMEd":"EEE d.M.y G","months-format-wide":["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"],"dayPeriods-format-abbr-am":"ap.","dateFormatItem-d":"d","quarters-format-wide":["1. neljännes","2. neljännes","3. neljännes","4. neljännes"],"days-format-wide":["sunnuntaina","maanantaina","tiistaina","keskiviikkona","torstaina","perjantaina","lauantaina"],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"eraNarrow":["BE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["BE"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","eraNames":["BE"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/fi/buddhist",{"dateFormatItem-yM":"L.y G","dateFormatItem-yMMMMccccd":"cccc, d. MMMM y G","dateFormatItem-yQ":"Q/y G","dayPeriods-format-wide-pm":"ip.","dateFormatItem-MMMEd":"E d. MMM","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yQQQ":"QQQ y G","days-standAlone-wide":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["T","H","M","H","T","K","H","E","S","L","M","J"],"dateFormatItem-Gy":"y G","dayPeriods-format-wide-am":"ap.","dateFormatItem-y":"y G","timeFormat-full":"H.mm.ss zzzz","months-standAlone-abbr":["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"],"dateFormatItem-Ed":"ccc d.","dateFormatItem-yMMM":"LLLL y G","days-standAlone-narrow":["S","M","T","K","T","P","L"],"dateFormatItem-yyyyMMMM":"LLLL y G","dateFormat-long":"d. MMMM y G","timeFormat-medium":"H.mm.ss","dateFormatItem-Hm":"H.mm","dateFormatItem-yyyyMEEEd":"EEE d.M.y G","dateFormatItem-yyMM":"M.y G","dateFormat-medium":"d.M.y G","dateFormatItem-Hms":"H.mm.ss","dateFormatItem-yyMMM":"LLLL y G","dateFormatItem-ms":"mm.ss","dateFormatItem-yyyyQQQQ":"QQQQ y G","months-standAlone-wide":["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],"dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q/y G","timeFormat-long":"H.mm.ss z","months-format-abbr":["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"],"dateFormatItem-H":"H","timeFormat-short":"H.mm","quarters-format-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"days-format-abbr":["su","ma","ti","ke","to","pe","la"],"dateFormatItem-M":"L","dateFormatItem-MEd":"E d.M.","dateFormatItem-hm":"h.mm a","dayPeriods-format-abbr-pm":"ip.","dateFormat-short":"d.M.y G","dateFormatItem-yyyyM":"M.y G","dateFormatItem-yMMMEd":"EEE d. MMM y G","dateFormat-full":"cccc d. MMMM y G","dateFormatItem-Md":"d.M.","dateFormatItem-yMEd":"EEE d.M.y G","months-format-wide":["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"],"dayPeriods-format-abbr-am":"ap.","dateFormatItem-d":"d","quarters-format-wide":["1. neljännes","2. neljännes","3. neljännes","4. neljännes"],"days-format-wide":["sunnuntaina","maanantaina","tiistaina","keskiviikkona","torstaina","perjantaina","lauantaina"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fi/buddhist.js.uncompressed.js b/lib/dojo/cldr/nls/fi/buddhist.js.uncompressed.js
new file mode 100644
index 000000000..891b60ba4
--- /dev/null
+++ b/lib/dojo/cldr/nls/fi/buddhist.js.uncompressed.js
@@ -0,0 +1,166 @@
+define(
+"dojo/cldr/nls/fi/buddhist", //begin v1.x content
+{
+ "dateFormatItem-yM": "L.y G",
+ "dateFormatItem-yMMMMccccd": "cccc, d. MMMM y G",
+ "dateFormatItem-yQ": "Q/y G",
+ "dayPeriods-format-wide-pm": "ip.",
+ "dateFormatItem-MMMEd": "E d. MMM",
+ "dateFormatItem-hms": "h.mm.ss a",
+ "dateFormatItem-yQQQ": "QQQ y G",
+ "days-standAlone-wide": [
+ "sunnuntai",
+ "maanantai",
+ "tiistai",
+ "keskiviikko",
+ "torstai",
+ "perjantai",
+ "lauantai"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "months-standAlone-narrow": [
+ "T",
+ "H",
+ "M",
+ "H",
+ "T",
+ "K",
+ "H",
+ "E",
+ "S",
+ "L",
+ "M",
+ "J"
+ ],
+ "dateFormatItem-Gy": "y G",
+ "dayPeriods-format-wide-am": "ap.",
+ "dateFormatItem-y": "y G",
+ "timeFormat-full": "H.mm.ss zzzz",
+ "months-standAlone-abbr": [
+ "tammi",
+ "helmi",
+ "maalis",
+ "huhti",
+ "touko",
+ "kesä",
+ "heinä",
+ "elo",
+ "syys",
+ "loka",
+ "marras",
+ "joulu"
+ ],
+ "dateFormatItem-Ed": "ccc d.",
+ "dateFormatItem-yMMM": "LLLL y G",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "K",
+ "T",
+ "P",
+ "L"
+ ],
+ "dateFormatItem-yyyyMMMM": "LLLL y G",
+ "dateFormat-long": "d. MMMM y G",
+ "timeFormat-medium": "H.mm.ss",
+ "dateFormatItem-Hm": "H.mm",
+ "dateFormatItem-yyyyMEEEd": "EEE d.M.y G",
+ "dateFormatItem-yyMM": "M.y G",
+ "dateFormat-medium": "d.M.y G",
+ "dateFormatItem-Hms": "H.mm.ss",
+ "dateFormatItem-yyMMM": "LLLL y G",
+ "dateFormatItem-ms": "mm.ss",
+ "dateFormatItem-yyyyQQQQ": "QQQQ y G",
+ "months-standAlone-wide": [
+ "tammikuu",
+ "helmikuu",
+ "maaliskuu",
+ "huhtikuu",
+ "toukokuu",
+ "kesäkuu",
+ "heinäkuu",
+ "elokuu",
+ "syyskuu",
+ "lokakuu",
+ "marraskuu",
+ "joulukuu"
+ ],
+ "dateFormatItem-MMMd": "d. MMM",
+ "dateFormatItem-yyQ": "Q/y G",
+ "timeFormat-long": "H.mm.ss z",
+ "months-format-abbr": [
+ "tammikuuta",
+ "helmikuuta",
+ "maaliskuuta",
+ "huhtikuuta",
+ "toukokuuta",
+ "kesäkuuta",
+ "heinäkuuta",
+ "elokuuta",
+ "syyskuuta",
+ "lokakuuta",
+ "marraskuuta",
+ "joulukuuta"
+ ],
+ "dateFormatItem-H": "H",
+ "timeFormat-short": "H.mm",
+ "quarters-format-abbr": [
+ "1. nelj.",
+ "2. nelj.",
+ "3. nelj.",
+ "4. nelj."
+ ],
+ "days-format-abbr": [
+ "su",
+ "ma",
+ "ti",
+ "ke",
+ "to",
+ "pe",
+ "la"
+ ],
+ "dateFormatItem-M": "L",
+ "dateFormatItem-MEd": "E d.M.",
+ "dateFormatItem-hm": "h.mm a",
+ "dayPeriods-format-abbr-pm": "ip.",
+ "dateFormat-short": "d.M.y G",
+ "dateFormatItem-yyyyM": "M.y G",
+ "dateFormatItem-yMMMEd": "EEE d. MMM y G",
+ "dateFormat-full": "cccc d. MMMM y G",
+ "dateFormatItem-Md": "d.M.",
+ "dateFormatItem-yMEd": "EEE d.M.y G",
+ "months-format-wide": [
+ "tammikuuta",
+ "helmikuuta",
+ "maaliskuuta",
+ "huhtikuuta",
+ "toukokuuta",
+ "kesäkuuta",
+ "heinäkuuta",
+ "elokuuta",
+ "syyskuuta",
+ "lokakuuta",
+ "marraskuuta",
+ "joulukuuta"
+ ],
+ "dayPeriods-format-abbr-am": "ap.",
+ "dateFormatItem-d": "d",
+ "quarters-format-wide": [
+ "1. neljännes",
+ "2. neljännes",
+ "3. neljännes",
+ "4. neljännes"
+ ],
+ "days-format-wide": [
+ "sunnuntaina",
+ "maanantaina",
+ "tiistaina",
+ "keskiviikkona",
+ "torstaina",
+ "perjantaina",
+ "lauantaina"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fi/currency.js b/lib/dojo/cldr/nls/fi/currency.js
index a52b1b045..c9af8f9e9 100644
--- a/lib/dojo/cldr/nls/fi/currency.js
+++ b/lib/dojo/cldr/nls/fi/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Hongkongin dollari","CHF_displayName":"Sveitsin frangi","CHF_symbol":"CHF","JPY_symbol":"¥","HKD_symbol":"HKD","CAD_displayName":"Kanadan dollari","CNY_displayName":"Kiinan yuan","USD_symbol":"$","AUD_displayName":"Australian dollari","JPY_displayName":"Japanin jeni","CAD_symbol":"CAD","USD_displayName":"Yhdysvaltain dollari","CNY_symbol":"CNY","GBP_displayName":"Englannin punta","AUD_symbol":"AUD","EUR_displayName":"euro","GBP_symbol":"£","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/fi/currency",{"HKD_displayName":"Hongkongin dollari","CHF_displayName":"Sveitsin frangi","CHF_symbol":"CHF","JPY_symbol":"¥","CAD_displayName":"Kanadan dollari","HKD_symbol":"HKD","CNY_displayName":"Kiinan yuan","USD_symbol":"$","AUD_displayName":"Australian dollari","JPY_displayName":"Japanin jeni","CAD_symbol":"CAD","USD_displayName":"Yhdysvaltain dollari","CNY_symbol":"CNY","GBP_displayName":"Englannin punta","AUD_symbol":"AUD","EUR_displayName":"euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fi/currency.js.uncompressed.js b/lib/dojo/cldr/nls/fi/currency.js.uncompressed.js
new file mode 100644
index 000000000..8b7579e22
--- /dev/null
+++ b/lib/dojo/cldr/nls/fi/currency.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/fi/currency", //begin v1.x content
+{
+ "HKD_displayName": "Hongkongin dollari",
+ "CHF_displayName": "Sveitsin frangi",
+ "CHF_symbol": "CHF",
+ "JPY_symbol": "¥",
+ "CAD_displayName": "Kanadan dollari",
+ "HKD_symbol": "HKD",
+ "CNY_displayName": "Kiinan yuan",
+ "USD_symbol": "$",
+ "AUD_displayName": "Australian dollari",
+ "JPY_displayName": "Japanin jeni",
+ "CAD_symbol": "CAD",
+ "USD_displayName": "Yhdysvaltain dollari",
+ "CNY_symbol": "CNY",
+ "GBP_displayName": "Englannin punta",
+ "AUD_symbol": "AUD",
+ "EUR_displayName": "euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fi/gregorian.js b/lib/dojo/cldr/nls/fi/gregorian.js
index c9ca4b9b3..59de80253 100644
--- a/lib/dojo/cldr/nls/fi/gregorian.js
+++ b/lib/dojo/cldr/nls/fi/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["T","H","M","H","T","K","H","E","S","L","M","J"],"field-weekday":"viikonpäivä","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d.M.yyyy","dateFormatItem-MMMEd":"E d. MMM","eraNarrow":["eKr.","jKr."],"dateFormat-long":"d. MMMM y","months-format-wide":["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"],"dayPeriods-format-wide-pm":"ip.","dateFormat-full":"cccc d. MMMM y","dateFormatItem-Md":"d.M.","dayPeriods-standAlone-wide-pm":"ip.","dayPeriods-format-abbr-am":"ap.","field-era":"aikakausi","dateFormatItem-yM":"L.yyyy","months-standAlone-wide":["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],"timeFormat-short":"H.mm","quarters-format-wide":["1. neljännes","2. neljännes","3. neljännes","4. neljännes"],"timeFormat-long":"H.mm.ss z","field-year":"vuosi","dateFormatItem-yMMM":"LLL y","dateFormatItem-yQ":"Q/yyyy","dateFormatItem-yyyyMMMM":"LLLL y","field-hour":"tunti","months-format-abbr":["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"],"dateFormatItem-yyQ":"Q/yy","timeFormat-full":"H.mm.ss zzzz","dateFormatItem-yyyyMEEEd":"EEE d.M.yyyy","field-day-relative+0":"tänään","field-day-relative+1":"huomenna","field-day-relative+2":"ylihuomenna","dateFormatItem-H":"H","months-standAlone-abbr":["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"],"quarters-format-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"quarters-standAlone-wide":["1. neljännes","2. neljännes","3. neljännes","4. neljännes"],"dateFormatItem-M":"L","days-standAlone-wide":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"dateFormatItem-yyMMM":"LLLL yy","timeFormat-medium":"H.mm.ss","dateFormatItem-Hm":"H.mm","quarters-standAlone-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"eraAbbr":["eKr.","jKr."],"field-minute":"minuutti","field-dayperiod":"ap./ip.","days-standAlone-abbr":["su","ma","ti","ke","to","pe","la"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm.ss","field-day-relative+-1":"eilen","field-day-relative+-2":"toissapäivänä","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E d.M.","field-day":"päivä","dateFormatItem-yMMMMccccd":"cccc, d. MMMM y","days-format-wide":["sunnuntaina","maanantaina","tiistaina","keskiviikkona","torstaina","perjantaina","lauantaina"],"field-zone":"aikavyöhyke","dateFormatItem-y":"y","months-standAlone-narrow":["T","H","M","H","T","K","H","E","S","L","M","J"],"dateFormatItem-yyMM":"M/yy","dateFormatItem-hm":"h.mm a","dayPeriods-format-abbr-pm":"ip.","days-format-abbr":["su","ma","ti","ke","to","pe","la"],"eraNames":["ennen Kristuksen syntymää","jälkeen Kristuksen syntymän"],"days-format-narrow":["S","M","T","K","T","P","L"],"field-month":"kuukausi","days-standAlone-narrow":["S","M","T","K","T","P","L"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"ap.","dayPeriods-standAlone-wide-am":"ap.","dateFormat-short":"d.M.yyyy","field-second":"sekunti","dateFormatItem-yMMMEd":"EEE d. MMM y","dateFormatItem-Ed":"ccc d.","field-week":"viikko","dateFormat-medium":"d.M.yyyy","dateFormatItem-yyyyM":"M/yyyy","dateFormatItem-yyyyQQQQ":"QQQQ y","dateFormatItem-Hms":"H.mm.ss","dateFormatItem-hms":"h.mm.ss a","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/fi/gregorian",{"months-format-narrow":["T","H","M","H","T","K","H","E","S","L","M","J"],"field-weekday":"viikonpäivä","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d.M.yyyy","dateFormatItem-MMMEd":"E d. MMM","eraNarrow":["eKr.","jKr."],"dateFormat-long":"d. MMMM y","months-format-wide":["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"],"dayPeriods-format-wide-pm":"ip.","dateFormat-full":"cccc d. MMMM y","dateFormatItem-Md":"d.M.","dayPeriods-standAlone-wide-pm":"ip.","dayPeriods-format-abbr-am":"ap.","field-era":"aikakausi","dateFormatItem-yM":"L.yyyy","months-standAlone-wide":["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],"timeFormat-short":"H.mm","quarters-format-wide":["1. neljännes","2. neljännes","3. neljännes","4. neljännes"],"timeFormat-long":"H.mm.ss z","field-year":"vuosi","dateFormatItem-yMMM":"LLL y","dateFormatItem-yQ":"Q/yyyy","dateFormatItem-yyyyMMMM":"LLLL y","field-hour":"tunti","months-format-abbr":["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"],"dateFormatItem-yyQ":"Q/yy","timeFormat-full":"H.mm.ss zzzz","dateFormatItem-yyyyMEEEd":"EEE d.M.yyyy","field-day-relative+0":"tänään","field-day-relative+1":"huomenna","field-day-relative+2":"ylihuomenna","dateFormatItem-H":"H","months-standAlone-abbr":["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"],"quarters-format-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"quarters-standAlone-wide":["1. neljännes","2. neljännes","3. neljännes","4. neljännes"],"dateFormatItem-M":"L","days-standAlone-wide":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"dateFormatItem-yyMMM":"LLLL yy","timeFormat-medium":"H.mm.ss","dateFormatItem-Hm":"H.mm","quarters-standAlone-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"eraAbbr":["eKr.","jKr."],"field-minute":"minuutti","field-dayperiod":"ap./ip.","days-standAlone-abbr":["su","ma","ti","ke","to","pe","la"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm.ss","field-day-relative+-1":"eilen","field-day-relative+-2":"toissapäivänä","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E d.M.","field-day":"päivä","dateFormatItem-yMMMMccccd":"cccc, d. MMMM y","days-format-wide":["sunnuntaina","maanantaina","tiistaina","keskiviikkona","torstaina","perjantaina","lauantaina"],"field-zone":"aikavyöhyke","dateFormatItem-y":"y","months-standAlone-narrow":["T","H","M","H","T","K","H","E","S","L","M","J"],"dateFormatItem-yyMM":"M/yy","dateFormatItem-hm":"h.mm a","dayPeriods-format-abbr-pm":"ip.","days-format-abbr":["su","ma","ti","ke","to","pe","la"],"eraNames":["ennen Kristuksen syntymää","jälkeen Kristuksen syntymän"],"days-format-narrow":["S","M","T","K","T","P","L"],"field-month":"kuukausi","days-standAlone-narrow":["S","M","T","K","T","P","L"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"ap.","dayPeriods-standAlone-wide-am":"ap.","dateFormat-short":"d.M.yyyy","field-second":"sekunti","dateFormatItem-yMMMEd":"EEE d. MMM y","dateFormatItem-Ed":"ccc d.","field-week":"viikko","dateFormat-medium":"d.M.yyyy","dateFormatItem-yyyyM":"M/yyyy","dateFormatItem-yyyyQQQQ":"QQQQ y","dateFormatItem-Hms":"H.mm.ss","dateFormatItem-hms":"h.mm.ss a"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fi/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/fi/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..52ae4520b
--- /dev/null
+++ b/lib/dojo/cldr/nls/fi/gregorian.js.uncompressed.js
@@ -0,0 +1,239 @@
+define(
+"dojo/cldr/nls/fi/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "T",
+ "H",
+ "M",
+ "H",
+ "T",
+ "K",
+ "H",
+ "E",
+ "S",
+ "L",
+ "M",
+ "J"
+ ],
+ "field-weekday": "viikonpäivä",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yMEd": "EEE d.M.yyyy",
+ "dateFormatItem-MMMEd": "E d. MMM",
+ "eraNarrow": [
+ "eKr.",
+ "jKr."
+ ],
+ "dateFormat-long": "d. MMMM y",
+ "months-format-wide": [
+ "tammikuuta",
+ "helmikuuta",
+ "maaliskuuta",
+ "huhtikuuta",
+ "toukokuuta",
+ "kesäkuuta",
+ "heinäkuuta",
+ "elokuuta",
+ "syyskuuta",
+ "lokakuuta",
+ "marraskuuta",
+ "joulukuuta"
+ ],
+ "dayPeriods-format-wide-pm": "ip.",
+ "dateFormat-full": "cccc d. MMMM y",
+ "dateFormatItem-Md": "d.M.",
+ "dayPeriods-standAlone-wide-pm": "ip.",
+ "dayPeriods-format-abbr-am": "ap.",
+ "field-era": "aikakausi",
+ "dateFormatItem-yM": "L.yyyy",
+ "months-standAlone-wide": [
+ "tammikuu",
+ "helmikuu",
+ "maaliskuu",
+ "huhtikuu",
+ "toukokuu",
+ "kesäkuu",
+ "heinäkuu",
+ "elokuu",
+ "syyskuu",
+ "lokakuu",
+ "marraskuu",
+ "joulukuu"
+ ],
+ "timeFormat-short": "H.mm",
+ "quarters-format-wide": [
+ "1. neljännes",
+ "2. neljännes",
+ "3. neljännes",
+ "4. neljännes"
+ ],
+ "timeFormat-long": "H.mm.ss z",
+ "field-year": "vuosi",
+ "dateFormatItem-yMMM": "LLL y",
+ "dateFormatItem-yQ": "Q/yyyy",
+ "dateFormatItem-yyyyMMMM": "LLLL y",
+ "field-hour": "tunti",
+ "months-format-abbr": [
+ "tammikuuta",
+ "helmikuuta",
+ "maaliskuuta",
+ "huhtikuuta",
+ "toukokuuta",
+ "kesäkuuta",
+ "heinäkuuta",
+ "elokuuta",
+ "syyskuuta",
+ "lokakuuta",
+ "marraskuuta",
+ "joulukuuta"
+ ],
+ "dateFormatItem-yyQ": "Q/yy",
+ "timeFormat-full": "H.mm.ss zzzz",
+ "dateFormatItem-yyyyMEEEd": "EEE d.M.yyyy",
+ "field-day-relative+0": "tänään",
+ "field-day-relative+1": "huomenna",
+ "field-day-relative+2": "ylihuomenna",
+ "dateFormatItem-H": "H",
+ "months-standAlone-abbr": [
+ "tammi",
+ "helmi",
+ "maalis",
+ "huhti",
+ "touko",
+ "kesä",
+ "heinä",
+ "elo",
+ "syys",
+ "loka",
+ "marras",
+ "joulu"
+ ],
+ "quarters-format-abbr": [
+ "1. nelj.",
+ "2. nelj.",
+ "3. nelj.",
+ "4. nelj."
+ ],
+ "quarters-standAlone-wide": [
+ "1. neljännes",
+ "2. neljännes",
+ "3. neljännes",
+ "4. neljännes"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "sunnuntai",
+ "maanantai",
+ "tiistai",
+ "keskiviikko",
+ "torstai",
+ "perjantai",
+ "lauantai"
+ ],
+ "dateFormatItem-yyMMM": "LLLL yy",
+ "timeFormat-medium": "H.mm.ss",
+ "dateFormatItem-Hm": "H.mm",
+ "quarters-standAlone-abbr": [
+ "1. nelj.",
+ "2. nelj.",
+ "3. nelj.",
+ "4. nelj."
+ ],
+ "eraAbbr": [
+ "eKr.",
+ "jKr."
+ ],
+ "field-minute": "minuutti",
+ "field-dayperiod": "ap./ip.",
+ "days-standAlone-abbr": [
+ "su",
+ "ma",
+ "ti",
+ "ke",
+ "to",
+ "pe",
+ "la"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm.ss",
+ "field-day-relative+-1": "eilen",
+ "field-day-relative+-2": "toissapäivänä",
+ "dateFormatItem-MMMd": "d. MMM",
+ "dateFormatItem-MEd": "E d.M.",
+ "field-day": "päivä",
+ "dateFormatItem-yMMMMccccd": "cccc, d. MMMM y",
+ "days-format-wide": [
+ "sunnuntaina",
+ "maanantaina",
+ "tiistaina",
+ "keskiviikkona",
+ "torstaina",
+ "perjantaina",
+ "lauantaina"
+ ],
+ "field-zone": "aikavyöhyke",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "T",
+ "H",
+ "M",
+ "H",
+ "T",
+ "K",
+ "H",
+ "E",
+ "S",
+ "L",
+ "M",
+ "J"
+ ],
+ "dateFormatItem-yyMM": "M/yy",
+ "dateFormatItem-hm": "h.mm a",
+ "dayPeriods-format-abbr-pm": "ip.",
+ "days-format-abbr": [
+ "su",
+ "ma",
+ "ti",
+ "ke",
+ "to",
+ "pe",
+ "la"
+ ],
+ "eraNames": [
+ "ennen Kristuksen syntymää",
+ "jälkeen Kristuksen syntymän"
+ ],
+ "days-format-narrow": [
+ "S",
+ "M",
+ "T",
+ "K",
+ "T",
+ "P",
+ "L"
+ ],
+ "field-month": "kuukausi",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "K",
+ "T",
+ "P",
+ "L"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "ap.",
+ "dayPeriods-standAlone-wide-am": "ap.",
+ "dateFormat-short": "d.M.yyyy",
+ "field-second": "sekunti",
+ "dateFormatItem-yMMMEd": "EEE d. MMM y",
+ "dateFormatItem-Ed": "ccc d.",
+ "field-week": "viikko",
+ "dateFormat-medium": "d.M.yyyy",
+ "dateFormatItem-yyyyM": "M/yyyy",
+ "dateFormatItem-yyyyQQQQ": "QQQQ y",
+ "dateFormatItem-Hms": "H.mm.ss",
+ "dateFormatItem-hms": "h.mm.ss a"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fi/hebrew.js b/lib/dojo/cldr/nls/fi/hebrew.js
index 77443f061..7d18f768c 100644
--- a/lib/dojo/cldr/nls/fi/hebrew.js
+++ b/lib/dojo/cldr/nls/fi/hebrew.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"L.yyyy","dateFormatItem-yQ":"Q/yyyy","months-standAlone-abbr-leap":"adár II","dayPeriods-format-wide-pm":"ip.","dateFormatItem-MMMEd":"E d. MMM","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"months-standAlone-narrow":["T","H","K","T","S","A","A","N","I","S","T","A","E"],"dayPeriods-format-wide-am":"ap.","timeFormat-full":"H.mm.ss zzzz","months-standAlone-narrow-leap":"A","months-standAlone-abbr":["tišrí","hešván","kislév","tevét","ševát","adár I","adár","nisán","ijjár","siván","tammúz","ab","elúl"],"dateFormatItem-yMMM":"LLL y","days-standAlone-narrow":["S","M","T","K","T","P","L"],"dateFormat-long":"d. MMMM y","timeFormat-medium":"H.mm.ss","dateFormatItem-Hm":"H.mm","dateFormat-medium":"d.M.yyyy","dateFormatItem-Hms":"H.mm.ss","dateFormatItem-ms":"mm.ss","months-standAlone-wide":["tišríkuu","hešvánkuu","kislévkuu","tevétkuu","ševátkuu","adárkuu I","adárkuu","nisánkuu","ijjárkuu","sivánkuu","tammúzkuu","abkuu","elúlkuu"],"dateFormatItem-MMMd":"d. MMM","timeFormat-long":"H.mm.ss z","months-format-abbr":["tišríkuuta","hešvánkuuta","kislévkuuta","tevétkuuta","ševátkuuta","adárkuuta I","adárkuuta","nisánkuuta","ijjárkuuta","sivánkuuta","tammúzkuuta","abkuuta","elúlkuuta"],"timeFormat-short":"H.mm","dateFormatItem-H":"H","quarters-format-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"days-format-abbr":["su","ma","ti","ke","to","pe","la"],"dateFormatItem-MEd":"E d.M.","months-format-narrow":["T","H","K","T","S","A","A","N","I","S","T","A","E"],"dateFormatItem-hm":"h.mm a","months-standAlone-wide-leap":"adárkuu II","dayPeriods-format-abbr-pm":"ip.","dateFormat-short":"d.M.yyyy","dateFormatItem-yMMMEd":"EEE d. MMM y","dateFormat-full":"cccc d. MMMM y","dateFormatItem-Md":"d.M.","dateFormatItem-yMEd":"EEE d.M.yyyy","months-format-wide":["tišríkuuta","hešvánkuuta","kislévkuuta","tevétkuuta","ševátkuuta","adárkuuta I","adárkuuta","nisánkuuta","ijjárkuuta","sivánkuuta","tammúzkuuta","abkuuta","elúlkuuta"],"dayPeriods-format-abbr-am":"ap.","quarters-format-wide":["1. neljännes","2. neljännes","3. neljännes","4. neljännes"],"months-format-wide-leap":"adárkuuta II","days-format-wide":["sunnuntaina","maanantaina","tiistaina","keskiviikkona","torstaina","perjantaina","lauantaina"],"quarters-standAlone-narrow":["1","2","3","4"],"eraNarrow":["AM"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr-leap":"Adar II","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"months-format-narrow-leap":"Adar II","eraAbbr":["AM"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","eraNames":["AM"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/fi/hebrew",{"dateFormatItem-yM":"L.yyyy","dateFormatItem-yQ":"Q/yyyy","months-standAlone-abbr-leap":"adár II","dayPeriods-format-wide-pm":"ip.","dateFormatItem-MMMEd":"E d. MMM","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"months-standAlone-narrow":["T","H","K","T","S","A","A","N","I","S","T","A","E"],"dayPeriods-format-wide-am":"ap.","timeFormat-full":"H.mm.ss zzzz","months-standAlone-narrow-leap":"A","months-standAlone-abbr":["tišrí","hešván","kislév","tevét","ševát","adár I","adár","nisán","ijjár","siván","tammúz","ab","elúl"],"dateFormatItem-yMMM":"LLL y","days-standAlone-narrow":["S","M","T","K","T","P","L"],"dateFormat-long":"d. MMMM y","timeFormat-medium":"H.mm.ss","dateFormatItem-Hm":"H.mm","dateFormat-medium":"d.M.yyyy","dateFormatItem-Hms":"H.mm.ss","dateFormatItem-ms":"mm.ss","months-standAlone-wide":["tišríkuu","hešvánkuu","kislévkuu","tevétkuu","ševátkuu","adárkuu I","adárkuu","nisánkuu","ijjárkuu","sivánkuu","tammúzkuu","abkuu","elúlkuu"],"dateFormatItem-MMMd":"d. MMM","timeFormat-long":"H.mm.ss z","months-format-abbr":["tišríkuuta","hešvánkuuta","kislévkuuta","tevétkuuta","ševátkuuta","adárkuuta I","adárkuuta","nisánkuuta","ijjárkuuta","sivánkuuta","tammúzkuuta","abkuuta","elúlkuuta"],"timeFormat-short":"H.mm","dateFormatItem-H":"H","quarters-format-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"days-format-abbr":["su","ma","ti","ke","to","pe","la"],"dateFormatItem-MEd":"E d.M.","months-format-narrow":["T","H","K","T","S","A","A","N","I","S","T","A","E"],"dateFormatItem-hm":"h.mm a","months-standAlone-wide-leap":"adárkuu II","dayPeriods-format-abbr-pm":"ip.","dateFormat-short":"d.M.yyyy","dateFormatItem-yMMMEd":"EEE d. MMM y","dateFormat-full":"cccc d. MMMM y","dateFormatItem-Md":"d.M.","dateFormatItem-yMEd":"EEE d.M.yyyy","months-format-wide":["tišríkuuta","hešvánkuuta","kislévkuuta","tevétkuuta","ševátkuuta","adárkuuta I","adárkuuta","nisánkuuta","ijjárkuuta","sivánkuuta","tammúzkuuta","abkuuta","elúlkuuta"],"dayPeriods-format-abbr-am":"ap.","quarters-format-wide":["1. neljännes","2. neljännes","3. neljännes","4. neljännes"],"months-format-wide-leap":"adárkuuta II","days-format-wide":["sunnuntaina","maanantaina","tiistaina","keskiviikkona","torstaina","perjantaina","lauantaina"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fi/hebrew.js.uncompressed.js b/lib/dojo/cldr/nls/fi/hebrew.js.uncompressed.js
new file mode 100644
index 000000000..9b22bc6ba
--- /dev/null
+++ b/lib/dojo/cldr/nls/fi/hebrew.js.uncompressed.js
@@ -0,0 +1,176 @@
+define(
+"dojo/cldr/nls/fi/hebrew", //begin v1.x content
+{
+ "dateFormatItem-yM": "L.yyyy",
+ "dateFormatItem-yQ": "Q/yyyy",
+ "months-standAlone-abbr-leap": "adár II",
+ "dayPeriods-format-wide-pm": "ip.",
+ "dateFormatItem-MMMEd": "E d. MMM",
+ "dateFormatItem-hms": "h.mm.ss a",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "days-standAlone-wide": [
+ "sunnuntai",
+ "maanantai",
+ "tiistai",
+ "keskiviikko",
+ "torstai",
+ "perjantai",
+ "lauantai"
+ ],
+ "months-standAlone-narrow": [
+ "T",
+ "H",
+ "K",
+ "T",
+ "S",
+ "A",
+ "A",
+ "N",
+ "I",
+ "S",
+ "T",
+ "A",
+ "E"
+ ],
+ "dayPeriods-format-wide-am": "ap.",
+ "timeFormat-full": "H.mm.ss zzzz",
+ "months-standAlone-narrow-leap": "A",
+ "months-standAlone-abbr": [
+ "tišrí",
+ "hešván",
+ "kislév",
+ "tevét",
+ "ševát",
+ "adár I",
+ "adár",
+ "nisán",
+ "ijjár",
+ "siván",
+ "tammúz",
+ "ab",
+ "elúl"
+ ],
+ "dateFormatItem-yMMM": "LLL y",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "K",
+ "T",
+ "P",
+ "L"
+ ],
+ "dateFormat-long": "d. MMMM y",
+ "timeFormat-medium": "H.mm.ss",
+ "dateFormatItem-Hm": "H.mm",
+ "dateFormat-medium": "d.M.yyyy",
+ "dateFormatItem-Hms": "H.mm.ss",
+ "dateFormatItem-ms": "mm.ss",
+ "months-standAlone-wide": [
+ "tišríkuu",
+ "hešvánkuu",
+ "kislévkuu",
+ "tevétkuu",
+ "ševátkuu",
+ "adárkuu I",
+ "adárkuu",
+ "nisánkuu",
+ "ijjárkuu",
+ "sivánkuu",
+ "tammúzkuu",
+ "abkuu",
+ "elúlkuu"
+ ],
+ "dateFormatItem-MMMd": "d. MMM",
+ "timeFormat-long": "H.mm.ss z",
+ "months-format-abbr": [
+ "tišríkuuta",
+ "hešvánkuuta",
+ "kislévkuuta",
+ "tevétkuuta",
+ "ševátkuuta",
+ "adárkuuta I",
+ "adárkuuta",
+ "nisánkuuta",
+ "ijjárkuuta",
+ "sivánkuuta",
+ "tammúzkuuta",
+ "abkuuta",
+ "elúlkuuta"
+ ],
+ "timeFormat-short": "H.mm",
+ "dateFormatItem-H": "H",
+ "quarters-format-abbr": [
+ "1. nelj.",
+ "2. nelj.",
+ "3. nelj.",
+ "4. nelj."
+ ],
+ "days-format-abbr": [
+ "su",
+ "ma",
+ "ti",
+ "ke",
+ "to",
+ "pe",
+ "la"
+ ],
+ "dateFormatItem-MEd": "E d.M.",
+ "months-format-narrow": [
+ "T",
+ "H",
+ "K",
+ "T",
+ "S",
+ "A",
+ "A",
+ "N",
+ "I",
+ "S",
+ "T",
+ "A",
+ "E"
+ ],
+ "dateFormatItem-hm": "h.mm a",
+ "months-standAlone-wide-leap": "adárkuu II",
+ "dayPeriods-format-abbr-pm": "ip.",
+ "dateFormat-short": "d.M.yyyy",
+ "dateFormatItem-yMMMEd": "EEE d. MMM y",
+ "dateFormat-full": "cccc d. MMMM y",
+ "dateFormatItem-Md": "d.M.",
+ "dateFormatItem-yMEd": "EEE d.M.yyyy",
+ "months-format-wide": [
+ "tišríkuuta",
+ "hešvánkuuta",
+ "kislévkuuta",
+ "tevétkuuta",
+ "ševátkuuta",
+ "adárkuuta I",
+ "adárkuuta",
+ "nisánkuuta",
+ "ijjárkuuta",
+ "sivánkuuta",
+ "tammúzkuuta",
+ "abkuuta",
+ "elúlkuuta"
+ ],
+ "dayPeriods-format-abbr-am": "ap.",
+ "quarters-format-wide": [
+ "1. neljännes",
+ "2. neljännes",
+ "3. neljännes",
+ "4. neljännes"
+ ],
+ "months-format-wide-leap": "adárkuuta II",
+ "days-format-wide": [
+ "sunnuntaina",
+ "maanantaina",
+ "tiistaina",
+ "keskiviikkona",
+ "torstaina",
+ "perjantaina",
+ "lauantaina"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fi/islamic.js b/lib/dojo/cldr/nls/fi/islamic.js
index 33eff8f87..d75a3ad75 100644
--- a/lib/dojo/cldr/nls/fi/islamic.js
+++ b/lib/dojo/cldr/nls/fi/islamic.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"L.yyyy","dateFormatItem-yyyyMMMEd":"EEE d. MMM y G","dateFormatItem-yQ":"Q/yyyy","dayPeriods-format-wide-pm":"ip.","dateFormatItem-MMMEd":"E d. MMM","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"dateFormatItem-MMM":"LLL","dateFormatItem-Gy":"y G","dayPeriods-format-wide-am":"ap.","dateFormatItem-y":"y G","timeFormat-full":"H.mm.ss zzzz","dateFormatItem-yyyy":"y G","months-standAlone-abbr":["muharram","safar","rabi’ al-awwal","rabi’ al-akhir","džumada-l-ula","džumada-l-akhira","radžab","ša’ban","ramadan","šawwal","dhu-l-qa’da","dhu-l-hiddža"],"dateFormatItem-Ed":"ccc d.","dateFormatItem-yMMM":"LLL y","days-standAlone-narrow":["S","M","T","K","T","P","L"],"dateFormatItem-yyyyMMMMccccd":"cccc, d. MMMM y G","dateFormatItem-yyyyMM":"M.y G","dateFormatItem-yyyyMMMM":"LLLL y G","dateFormat-long":"d. MMMM y G","timeFormat-medium":"H.mm.ss","dateFormatItem-Hm":"H.mm","dateFormat-medium":"d.M.y G","dateFormatItem-Hms":"H.mm.ss","dateFormatItem-ms":"mm.ss","dateFormatItem-yyyyQQQQ":"QQQQ y G","months-standAlone-wide":["muharram","safar","rabi’ al-awwal","rabi’ al-akhir","džumada-l-ula","džumada-l-akhira","radžab","ša’ban","ramadan","šawwal","dhu-l-qa’da","dhu-l-hiddža"],"dateFormatItem-yyyyMEd":"EEE d.M.y G","dateFormatItem-MMMd":"d. MMM","timeFormat-long":"H.mm.ss z","months-format-abbr":["muharram","safar","rabi’ al-awwal","rabi’ al-akhir","džumada-l-ula","džumada-l-akhira","radžab","ša’ban","ramadan","šawwal","dhu-l-qa’da","dhu-l-hiddža"],"timeFormat-short":"H.mm","dateFormatItem-H":"H","quarters-format-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"days-format-abbr":["su","ma","ti","ke","to","pe","la"],"dateFormatItem-M":"L","dateFormatItem-yyyyQQQ":"QQQ y G","dateFormatItem-MEd":"E d.M.","dateFormatItem-hm":"h.mm a","dayPeriods-format-abbr-pm":"ip.","dateFormat-short":"d.M.y G","dateFormatItem-yyyyM":"M.y G","dateFormatItem-yMMMEd":"EEE d. MMM y","dateFormat-full":"cccc d. MMMM y G","dateFormatItem-Md":"d.M.","dateFormatItem-yyyyQ":"Q/y G","dateFormatItem-yMEd":"EEE d.M.yyyy","months-format-wide":["muharram","safar","rabi’ al-awwal","rabi’ al-akhir","džumada-l-ula","džumada-l-akhira","radžab","ša’ban","ramadan","šawwal","dhu-l-qa’da","dhu-l-hiddža"],"dayPeriods-format-abbr-am":"ap.","dateFormatItem-yyyyMMM":"LLLL y G","dateFormatItem-d":"d","quarters-format-wide":["1. neljännes","2. neljännes","3. neljännes","4. neljännes"],"days-format-wide":["sunnuntaina","maanantaina","tiistaina","keskiviikkona","torstaina","perjantaina","lauantaina"],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"eraNarrow":["AH"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["AH"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","eraNames":["AH"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/fi/islamic",{"dateFormatItem-yM":"L.yyyy","dateFormatItem-yyyyMMMEd":"EEE d. MMM y G","dateFormatItem-yQ":"Q/yyyy","dayPeriods-format-wide-pm":"ip.","dateFormatItem-MMMEd":"E d. MMM","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"dateFormatItem-MMM":"LLL","dateFormatItem-Gy":"y G","dayPeriods-format-wide-am":"ap.","dateFormatItem-y":"y G","timeFormat-full":"H.mm.ss zzzz","dateFormatItem-yyyy":"y G","months-standAlone-abbr":["muharram","safar","rabi’ al-awwal","rabi’ al-akhir","džumada-l-ula","džumada-l-akhira","radžab","ša’ban","ramadan","šawwal","dhu-l-qa’da","dhu-l-hiddža"],"dateFormatItem-Ed":"ccc d.","dateFormatItem-yMMM":"LLL y","days-standAlone-narrow":["S","M","T","K","T","P","L"],"dateFormatItem-yyyyMMMMccccd":"cccc, d. MMMM y G","dateFormatItem-yyyyMM":"M.y G","dateFormatItem-yyyyMMMM":"LLLL y G","dateFormat-long":"d. MMMM y G","timeFormat-medium":"H.mm.ss","dateFormatItem-Hm":"H.mm","dateFormat-medium":"d.M.y G","dateFormatItem-Hms":"H.mm.ss","dateFormatItem-ms":"mm.ss","dateFormatItem-yyyyQQQQ":"QQQQ y G","months-standAlone-wide":["muharram","safar","rabi’ al-awwal","rabi’ al-akhir","džumada-l-ula","džumada-l-akhira","radžab","ša’ban","ramadan","šawwal","dhu-l-qa’da","dhu-l-hiddža"],"dateFormatItem-yyyyMEd":"EEE d.M.y G","dateFormatItem-MMMd":"d. MMM","timeFormat-long":"H.mm.ss z","months-format-abbr":["muharram","safar","rabi’ al-awwal","rabi’ al-akhir","džumada-l-ula","džumada-l-akhira","radžab","ša’ban","ramadan","šawwal","dhu-l-qa’da","dhu-l-hiddža"],"timeFormat-short":"H.mm","dateFormatItem-H":"H","quarters-format-abbr":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"days-format-abbr":["su","ma","ti","ke","to","pe","la"],"dateFormatItem-M":"L","dateFormatItem-yyyyQQQ":"QQQ y G","dateFormatItem-MEd":"E d.M.","dateFormatItem-hm":"h.mm a","dayPeriods-format-abbr-pm":"ip.","dateFormat-short":"d.M.y G","dateFormatItem-yyyyM":"M.y G","dateFormatItem-yMMMEd":"EEE d. MMM y","dateFormat-full":"cccc d. MMMM y G","dateFormatItem-Md":"d.M.","dateFormatItem-yyyyQ":"Q/y G","dateFormatItem-yMEd":"EEE d.M.yyyy","months-format-wide":["muharram","safar","rabi’ al-awwal","rabi’ al-akhir","džumada-l-ula","džumada-l-akhira","radžab","ša’ban","ramadan","šawwal","dhu-l-qa’da","dhu-l-hiddža"],"dayPeriods-format-abbr-am":"ap.","dateFormatItem-yyyyMMM":"LLLL y G","dateFormatItem-d":"d","quarters-format-wide":["1. neljännes","2. neljännes","3. neljännes","4. neljännes"],"days-format-wide":["sunnuntaina","maanantaina","tiistaina","keskiviikkona","torstaina","perjantaina","lauantaina"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fi/islamic.js.uncompressed.js b/lib/dojo/cldr/nls/fi/islamic.js.uncompressed.js
new file mode 100644
index 000000000..aecaaf6bd
--- /dev/null
+++ b/lib/dojo/cldr/nls/fi/islamic.js.uncompressed.js
@@ -0,0 +1,155 @@
+define(
+"dojo/cldr/nls/fi/islamic", //begin v1.x content
+{
+ "dateFormatItem-yM": "L.yyyy",
+ "dateFormatItem-yyyyMMMEd": "EEE d. MMM y G",
+ "dateFormatItem-yQ": "Q/yyyy",
+ "dayPeriods-format-wide-pm": "ip.",
+ "dateFormatItem-MMMEd": "E d. MMM",
+ "dateFormatItem-hms": "h.mm.ss a",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "days-standAlone-wide": [
+ "sunnuntai",
+ "maanantai",
+ "tiistai",
+ "keskiviikko",
+ "torstai",
+ "perjantai",
+ "lauantai"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dateFormatItem-Gy": "y G",
+ "dayPeriods-format-wide-am": "ap.",
+ "dateFormatItem-y": "y G",
+ "timeFormat-full": "H.mm.ss zzzz",
+ "dateFormatItem-yyyy": "y G",
+ "months-standAlone-abbr": [
+ "muharram",
+ "safar",
+ "rabi’ al-awwal",
+ "rabi’ al-akhir",
+ "džumada-l-ula",
+ "džumada-l-akhira",
+ "radžab",
+ "ša’ban",
+ "ramadan",
+ "šawwal",
+ "dhu-l-qa’da",
+ "dhu-l-hiddža"
+ ],
+ "dateFormatItem-Ed": "ccc d.",
+ "dateFormatItem-yMMM": "LLL y",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "K",
+ "T",
+ "P",
+ "L"
+ ],
+ "dateFormatItem-yyyyMMMMccccd": "cccc, d. MMMM y G",
+ "dateFormatItem-yyyyMM": "M.y G",
+ "dateFormatItem-yyyyMMMM": "LLLL y G",
+ "dateFormat-long": "d. MMMM y G",
+ "timeFormat-medium": "H.mm.ss",
+ "dateFormatItem-Hm": "H.mm",
+ "dateFormat-medium": "d.M.y G",
+ "dateFormatItem-Hms": "H.mm.ss",
+ "dateFormatItem-ms": "mm.ss",
+ "dateFormatItem-yyyyQQQQ": "QQQQ y G",
+ "months-standAlone-wide": [
+ "muharram",
+ "safar",
+ "rabi’ al-awwal",
+ "rabi’ al-akhir",
+ "džumada-l-ula",
+ "džumada-l-akhira",
+ "radžab",
+ "ša’ban",
+ "ramadan",
+ "šawwal",
+ "dhu-l-qa’da",
+ "dhu-l-hiddža"
+ ],
+ "dateFormatItem-yyyyMEd": "EEE d.M.y G",
+ "dateFormatItem-MMMd": "d. MMM",
+ "timeFormat-long": "H.mm.ss z",
+ "months-format-abbr": [
+ "muharram",
+ "safar",
+ "rabi’ al-awwal",
+ "rabi’ al-akhir",
+ "džumada-l-ula",
+ "džumada-l-akhira",
+ "radžab",
+ "ša’ban",
+ "ramadan",
+ "šawwal",
+ "dhu-l-qa’da",
+ "dhu-l-hiddža"
+ ],
+ "timeFormat-short": "H.mm",
+ "dateFormatItem-H": "H",
+ "quarters-format-abbr": [
+ "1. nelj.",
+ "2. nelj.",
+ "3. nelj.",
+ "4. nelj."
+ ],
+ "days-format-abbr": [
+ "su",
+ "ma",
+ "ti",
+ "ke",
+ "to",
+ "pe",
+ "la"
+ ],
+ "dateFormatItem-M": "L",
+ "dateFormatItem-yyyyQQQ": "QQQ y G",
+ "dateFormatItem-MEd": "E d.M.",
+ "dateFormatItem-hm": "h.mm a",
+ "dayPeriods-format-abbr-pm": "ip.",
+ "dateFormat-short": "d.M.y G",
+ "dateFormatItem-yyyyM": "M.y G",
+ "dateFormatItem-yMMMEd": "EEE d. MMM y",
+ "dateFormat-full": "cccc d. MMMM y G",
+ "dateFormatItem-Md": "d.M.",
+ "dateFormatItem-yyyyQ": "Q/y G",
+ "dateFormatItem-yMEd": "EEE d.M.yyyy",
+ "months-format-wide": [
+ "muharram",
+ "safar",
+ "rabi’ al-awwal",
+ "rabi’ al-akhir",
+ "džumada-l-ula",
+ "džumada-l-akhira",
+ "radžab",
+ "ša’ban",
+ "ramadan",
+ "šawwal",
+ "dhu-l-qa’da",
+ "dhu-l-hiddža"
+ ],
+ "dayPeriods-format-abbr-am": "ap.",
+ "dateFormatItem-yyyyMMM": "LLLL y G",
+ "dateFormatItem-d": "d",
+ "quarters-format-wide": [
+ "1. neljännes",
+ "2. neljännes",
+ "3. neljännes",
+ "4. neljännes"
+ ],
+ "days-format-wide": [
+ "sunnuntaina",
+ "maanantaina",
+ "tiistaina",
+ "keskiviikkona",
+ "torstaina",
+ "perjantaina",
+ "lauantaina"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fi/number.js b/lib/dojo/cldr/nls/fi/number.js
index 1713de48a..b97f07171 100644
--- a/lib/dojo/cldr/nls/fi/number.js
+++ b/lib/dojo/cldr/nls/fi/number.js
@@ -1 +1,8 @@
-({"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"epäluku","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/fi/number",{"group":" ","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0 %","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"epäluku","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fi/number.js.uncompressed.js b/lib/dojo/cldr/nls/fi/number.js.uncompressed.js
new file mode 100644
index 000000000..8a44d9d85
--- /dev/null
+++ b/lib/dojo/cldr/nls/fi/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/fi/number", //begin v1.x content
+{
+ "group": " ",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0 %",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "epäluku",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fr-ch/gregorian.js b/lib/dojo/cldr/nls/fr-ch/gregorian.js
index 9c5c08432..9615b4491 100644
--- a/lib/dojo/cldr/nls/fr-ch/gregorian.js
+++ b/lib/dojo/cldr/nls/fr-ch/gregorian.js
@@ -1 +1,8 @@
-({"timeFormat-full":"HH.mm:ss 'h' zzzz","dateFormat-full":"EEEE, d MMMM y","dateFormat-short":"dd.MM.yy","months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"jour de la semaine","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d/M/yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["av. J.-C.","ap. J.-C."],"dayPeriods-format-wide-morning":"matin","dateFormatItem-MMMdd":"dd MMM","dateFormat-long":"d MMMM y","months-format-wide":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"dayPeriods-format-wide-pm":"PM","dateFormatItem-Md":"d/M","dayPeriods-format-wide-noon":"midi","field-era":"ère","dateFormatItem-yM":"M/yyyy","months-standAlone-wide":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"timeFormat-short":"HH:mm","quarters-format-wide":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"timeFormat-long":"HH:mm:ss z","field-year":"année","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"'T'Q y","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"heure","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"dateFormatItem-yyQ":"'T'Q yy","field-day-relative+0":"aujourd’hui","field-day-relative+1":"demain","field-day-relative+2":"après-demain","field-day-relative+3":"après-après-demain","months-standAlone-abbr":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"dateFormatItem-M":"L","days-standAlone-wide":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"dateFormatItem-yyMMMEEEd":"EEE d MMM yy","dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["T1","T2","T3","T4"],"eraAbbr":["av. J.-C.","ap. J.-C."],"field-minute":"minute","field-dayperiod":"cadran","days-standAlone-abbr":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"dayPeriods-format-wide-night":"soir","dateFormatItem-yyMMMd":"d MMM yy","dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["T1","T2","T3","T4"],"field-day-relative+-1":"hier","field-day-relative+-2":"avant-hier","field-day-relative+-3":"avant-avant-hier","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"EEE d/M","field-day":"jour","days-format-wide":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"field-zone":"fuseau horaire","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM/yy","days-format-abbr":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"eraNames":["avant Jésus-Christ","après Jésus-Christ"],"days-format-narrow":["D","L","M","M","J","V","S"],"field-month":"mois","days-standAlone-narrow":["D","L","M","M","J","V","S"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"AM","dateFormatItem-MMMMEd":"EEE d MMMM","dateFormatItem-MMd":"d/MM","dayPeriods-format-wide-afternoon":"après-midi","field-second":"seconde","dateFormatItem-yMMMEd":"EEE d MMM y","dateFormatItem-Ed":"E d","field-week":"semaine","dateFormat-medium":"d MMM y","dateFormatItem-Hms":"HH:mm:ss","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/fr-ch/gregorian",{"timeFormat-full":"HH.mm:ss 'h' zzzz","dateFormat-full":"EEEE, d MMMM y","dateFormat-short":"dd.MM.yy"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fr-ch/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/fr-ch/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..e5d47dd14
--- /dev/null
+++ b/lib/dojo/cldr/nls/fr-ch/gregorian.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dojo/cldr/nls/fr-ch/gregorian", //begin v1.x content
+{
+ "timeFormat-full": "HH.mm:ss 'h' zzzz",
+ "dateFormat-full": "EEEE, d MMMM y",
+ "dateFormat-short": "dd.MM.yy"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fr-ch/number.js b/lib/dojo/cldr/nls/fr-ch/number.js
index 8d9a79e56..8fb691cdb 100644
--- a/lib/dojo/cldr/nls/fr-ch/number.js
+++ b/lib/dojo/cldr/nls/fr-ch/number.js
@@ -1 +1,8 @@
-({"currencyFormat":"¤ #,##0.00;¤-#,##0.00","group":"'","decimal":".","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/fr-ch/number",{"currencyFormat":"¤ #,##0.00;¤-#,##0.00","group":"'","decimal":"."}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fr-ch/number.js.uncompressed.js b/lib/dojo/cldr/nls/fr-ch/number.js.uncompressed.js
new file mode 100644
index 000000000..25743295d
--- /dev/null
+++ b/lib/dojo/cldr/nls/fr-ch/number.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dojo/cldr/nls/fr-ch/number", //begin v1.x content
+{
+ "currencyFormat": "¤ #,##0.00;¤-#,##0.00",
+ "group": "'",
+ "decimal": "."
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fr/currency.js b/lib/dojo/cldr/nls/fr/currency.js
index 3d3eabeb7..ce20c0c85 100644
--- a/lib/dojo/cldr/nls/fr/currency.js
+++ b/lib/dojo/cldr/nls/fr/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"dollar de Hong Kong","CHF_displayName":"franc suisse","CHF_symbol":"CHF","JPY_symbol":"¥JP","HKD_symbol":"$HK","CAD_displayName":"dollar canadien","CNY_displayName":"yuan renminbi chinois","USD_symbol":"$US","AUD_displayName":"dollar australien","JPY_displayName":"yen japonais","CAD_symbol":"$CA","USD_displayName":"dollar des États-Unis","CNY_symbol":"Ұ","GBP_displayName":"livre sterling","GBP_symbol":"£UK","AUD_symbol":"$AU","EUR_displayName":"euro","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/fr/currency",{"HKD_displayName":"dollar de Hong Kong","CHF_displayName":"franc suisse","CHF_symbol":"CHF","JPY_symbol":"¥JP","CAD_displayName":"dollar canadien","HKD_symbol":"$HK","CNY_displayName":"yuan renminbi chinois","USD_symbol":"$US","AUD_displayName":"dollar australien","JPY_displayName":"yen japonais","CAD_symbol":"$CA","USD_displayName":"dollar des États-Unis","CNY_symbol":"Ұ","GBP_displayName":"livre sterling","GBP_symbol":"£UK","AUD_symbol":"$AU","EUR_displayName":"euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fr/currency.js.uncompressed.js b/lib/dojo/cldr/nls/fr/currency.js.uncompressed.js
new file mode 100644
index 000000000..48f5232c4
--- /dev/null
+++ b/lib/dojo/cldr/nls/fr/currency.js.uncompressed.js
@@ -0,0 +1,23 @@
+define(
+"dojo/cldr/nls/fr/currency", //begin v1.x content
+{
+ "HKD_displayName": "dollar de Hong Kong",
+ "CHF_displayName": "franc suisse",
+ "CHF_symbol": "CHF",
+ "JPY_symbol": "¥JP",
+ "CAD_displayName": "dollar canadien",
+ "HKD_symbol": "$HK",
+ "CNY_displayName": "yuan renminbi chinois",
+ "USD_symbol": "$US",
+ "AUD_displayName": "dollar australien",
+ "JPY_displayName": "yen japonais",
+ "CAD_symbol": "$CA",
+ "USD_displayName": "dollar des États-Unis",
+ "CNY_symbol": "Ұ",
+ "GBP_displayName": "livre sterling",
+ "GBP_symbol": "£UK",
+ "AUD_symbol": "$AU",
+ "EUR_displayName": "euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fr/gregorian.js b/lib/dojo/cldr/nls/fr/gregorian.js
index 0d0983d49..e832262d3 100644
--- a/lib/dojo/cldr/nls/fr/gregorian.js
+++ b/lib/dojo/cldr/nls/fr/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"jour de la semaine","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d/M/yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["av. J.-C.","ap. J.-C."],"dayPeriods-format-wide-morning":"matin","dateFormatItem-MMMdd":"dd MMM","dateFormat-long":"d MMMM y","months-format-wide":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d MMMM y","dateFormatItem-Md":"d/M","dayPeriods-format-wide-noon":"midi","field-era":"ère","dateFormatItem-yM":"M/yyyy","months-standAlone-wide":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"timeFormat-short":"HH:mm","quarters-format-wide":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"timeFormat-long":"HH:mm:ss z","field-year":"année","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"'T'Q y","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"heure","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"dateFormatItem-yyQ":"'T'Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"aujourd’hui","field-day-relative+1":"demain","field-day-relative+2":"après-demain","field-day-relative+3":"après-après-demain","months-standAlone-abbr":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"dateFormatItem-M":"L","days-standAlone-wide":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"dateFormatItem-yyMMMEEEd":"EEE d MMM yy","dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["T1","T2","T3","T4"],"eraAbbr":["av. J.-C.","ap. J.-C."],"field-minute":"minute","field-dayperiod":"cadran","days-standAlone-abbr":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"dayPeriods-format-wide-night":"soir","dateFormatItem-yyMMMd":"d MMM yy","dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["T1","T2","T3","T4"],"field-day-relative+-1":"hier","field-day-relative+-2":"avant-hier","field-day-relative+-3":"avant-avant-hier","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"EEE d/M","field-day":"jour","days-format-wide":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"field-zone":"fuseau horaire","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM/yy","days-format-abbr":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"eraNames":["avant Jésus-Christ","après Jésus-Christ"],"days-format-narrow":["D","L","M","M","J","V","S"],"field-month":"mois","days-standAlone-narrow":["D","L","M","M","J","V","S"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"AM","dateFormatItem-MMMMEd":"EEE d MMMM","dateFormat-short":"dd/MM/yy","dateFormatItem-MMd":"d/MM","dayPeriods-format-wide-afternoon":"après-midi","field-second":"seconde","dateFormatItem-yMMMEd":"EEE d MMM y","dateFormatItem-Ed":"E d","field-week":"semaine","dateFormat-medium":"d MMM y","dateFormatItem-Hms":"HH:mm:ss","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/fr/gregorian",{"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"jour de la semaine","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d/M/yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["av. J.-C.","ap. J.-C."],"dayPeriods-format-wide-morning":"matin","dateFormatItem-MMMdd":"dd MMM","dateFormat-long":"d MMMM y","months-format-wide":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d MMMM y","dateFormatItem-Md":"d/M","dayPeriods-format-wide-noon":"midi","field-era":"ère","dateFormatItem-yM":"M/yyyy","months-standAlone-wide":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"timeFormat-short":"HH:mm","quarters-format-wide":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"timeFormat-long":"HH:mm:ss z","field-year":"année","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"'T'Q y","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"heure","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"dateFormatItem-yyQ":"'T'Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"aujourd’hui","field-day-relative+1":"demain","field-day-relative+2":"après-demain","field-day-relative+3":"après-après-demain","months-standAlone-abbr":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"dateFormatItem-M":"L","days-standAlone-wide":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"dateFormatItem-yyMMMEEEd":"EEE d MMM yy","dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["T1","T2","T3","T4"],"eraAbbr":["av. J.-C.","ap. J.-C."],"field-minute":"minute","field-dayperiod":"cadran","days-standAlone-abbr":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"dayPeriods-format-wide-night":"soir","dateFormatItem-yyMMMd":"d MMM yy","dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["T1","T2","T3","T4"],"field-day-relative+-1":"hier","field-day-relative+-2":"avant-hier","field-day-relative+-3":"avant-avant-hier","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"EEE d/M","field-day":"jour","days-format-wide":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"field-zone":"fuseau horaire","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM/yy","days-format-abbr":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"eraNames":["avant Jésus-Christ","après Jésus-Christ"],"days-format-narrow":["D","L","M","M","J","V","S"],"field-month":"mois","days-standAlone-narrow":["D","L","M","M","J","V","S"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"AM","dateFormatItem-MMMMEd":"EEE d MMMM","dateFormat-short":"dd/MM/yy","dateFormatItem-MMd":"d/MM","dayPeriods-format-wide-afternoon":"après-midi","field-second":"seconde","dateFormatItem-yMMMEd":"EEE d MMM y","dateFormatItem-Ed":"E d","field-week":"semaine","dateFormat-medium":"d MMM y","dateFormatItem-Hms":"HH:mm:ss"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fr/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/fr/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..6456bd568
--- /dev/null
+++ b/lib/dojo/cldr/nls/fr/gregorian.js.uncompressed.js
@@ -0,0 +1,247 @@
+define(
+"dojo/cldr/nls/fr/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "field-weekday": "jour de la semaine",
+ "dateFormatItem-yyQQQQ": "QQQQ yy",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yMEd": "EEE d/M/yyyy",
+ "dateFormatItem-MMMEd": "E d MMM",
+ "eraNarrow": [
+ "av. J.-C.",
+ "ap. J.-C."
+ ],
+ "dayPeriods-format-wide-morning": "matin",
+ "dateFormatItem-MMMdd": "dd MMM",
+ "dateFormat-long": "d MMMM y",
+ "months-format-wide": [
+ "janvier",
+ "février",
+ "mars",
+ "avril",
+ "mai",
+ "juin",
+ "juillet",
+ "août",
+ "septembre",
+ "octobre",
+ "novembre",
+ "décembre"
+ ],
+ "dayPeriods-format-wide-pm": "PM",
+ "dateFormat-full": "EEEE d MMMM y",
+ "dateFormatItem-Md": "d/M",
+ "dayPeriods-format-wide-noon": "midi",
+ "field-era": "ère",
+ "dateFormatItem-yM": "M/yyyy",
+ "months-standAlone-wide": [
+ "janvier",
+ "février",
+ "mars",
+ "avril",
+ "mai",
+ "juin",
+ "juillet",
+ "août",
+ "septembre",
+ "octobre",
+ "novembre",
+ "décembre"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "1er trimestre",
+ "2e trimestre",
+ "3e trimestre",
+ "4e trimestre"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "field-year": "année",
+ "dateFormatItem-yMMM": "MMM y",
+ "dateFormatItem-yQ": "'T'Q y",
+ "dateFormatItem-yyyyMMMM": "MMMM y",
+ "field-hour": "heure",
+ "dateFormatItem-MMdd": "dd/MM",
+ "months-format-abbr": [
+ "janv.",
+ "févr.",
+ "mars",
+ "avr.",
+ "mai",
+ "juin",
+ "juil.",
+ "août",
+ "sept.",
+ "oct.",
+ "nov.",
+ "déc."
+ ],
+ "dateFormatItem-yyQ": "'T'Q yy",
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "field-day-relative+0": "aujourd’hui",
+ "field-day-relative+1": "demain",
+ "field-day-relative+2": "après-demain",
+ "field-day-relative+3": "après-après-demain",
+ "months-standAlone-abbr": [
+ "janv.",
+ "févr.",
+ "mars",
+ "avr.",
+ "mai",
+ "juin",
+ "juil.",
+ "août",
+ "sept.",
+ "oct.",
+ "nov.",
+ "déc."
+ ],
+ "quarters-format-abbr": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "quarters-standAlone-wide": [
+ "1er trimestre",
+ "2e trimestre",
+ "3e trimestre",
+ "4e trimestre"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "dimanche",
+ "lundi",
+ "mardi",
+ "mercredi",
+ "jeudi",
+ "vendredi",
+ "samedi"
+ ],
+ "dateFormatItem-yyMMMEEEd": "EEE d MMM yy",
+ "dateFormatItem-yyMMM": "MMM yy",
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "eraAbbr": [
+ "av. J.-C.",
+ "ap. J.-C."
+ ],
+ "field-minute": "minute",
+ "field-dayperiod": "cadran",
+ "days-standAlone-abbr": [
+ "dim.",
+ "lun.",
+ "mar.",
+ "mer.",
+ "jeu.",
+ "ven.",
+ "sam."
+ ],
+ "dayPeriods-format-wide-night": "soir",
+ "dateFormatItem-yyMMMd": "d MMM yy",
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "quarters-format-narrow": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "field-day-relative+-1": "hier",
+ "field-day-relative+-2": "avant-hier",
+ "field-day-relative+-3": "avant-avant-hier",
+ "dateFormatItem-MMMd": "d MMM",
+ "dateFormatItem-MEd": "EEE d/M",
+ "field-day": "jour",
+ "days-format-wide": [
+ "dimanche",
+ "lundi",
+ "mardi",
+ "mercredi",
+ "jeudi",
+ "vendredi",
+ "samedi"
+ ],
+ "field-zone": "fuseau horaire",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateFormatItem-yyMM": "MM/yy",
+ "days-format-abbr": [
+ "dim.",
+ "lun.",
+ "mar.",
+ "mer.",
+ "jeu.",
+ "ven.",
+ "sam."
+ ],
+ "eraNames": [
+ "avant Jésus-Christ",
+ "après Jésus-Christ"
+ ],
+ "days-format-narrow": [
+ "D",
+ "L",
+ "M",
+ "M",
+ "J",
+ "V",
+ "S"
+ ],
+ "field-month": "mois",
+ "days-standAlone-narrow": [
+ "D",
+ "L",
+ "M",
+ "M",
+ "J",
+ "V",
+ "S"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "AM",
+ "dateFormatItem-MMMMEd": "EEE d MMMM",
+ "dateFormat-short": "dd/MM/yy",
+ "dateFormatItem-MMd": "d/MM",
+ "dayPeriods-format-wide-afternoon": "après-midi",
+ "field-second": "seconde",
+ "dateFormatItem-yMMMEd": "EEE d MMM y",
+ "dateFormatItem-Ed": "E d",
+ "field-week": "semaine",
+ "dateFormat-medium": "d MMM y",
+ "dateFormatItem-Hms": "HH:mm:ss"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fr/number.js b/lib/dojo/cldr/nls/fr/number.js
index 9dcfdd4d9..48525724e 100644
--- a/lib/dojo/cldr/nls/fr/number.js
+++ b/lib/dojo/cldr/nls/fr/number.js
@@ -1 +1,8 @@
-({"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/fr/number",{"group":" ","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0 %","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/fr/number.js.uncompressed.js b/lib/dojo/cldr/nls/fr/number.js.uncompressed.js
new file mode 100644
index 000000000..e98cac4db
--- /dev/null
+++ b/lib/dojo/cldr/nls/fr/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/fr/number", //begin v1.x content
+{
+ "group": " ",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0 %",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/gregorian.js b/lib/dojo/cldr/nls/gregorian.js
index 5dced4268..d2ba3ae7f 100644
--- a/lib/dojo/cldr/nls/gregorian.js
+++ b/lib/dojo/cldr/nls/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Day of the Week","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["BCE","CE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"y MMMM d","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, y MMMM dd","dateFormatItem-Md":"M-d","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-era":"Era","dateFormatItem-yM":"y-M","months-standAlone-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","quarters-format-wide":["Q1","Q2","Q3","Q4"],"timeFormat-long":"HH:mm:ss z","field-year":"Year","dateFormatItem-yMMM":"y MMM","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","field-hour":"Hour","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"Today","field-day-relative+1":"Tomorrow","dateFormatItem-H":"HH","months-standAlone-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["BCE","CE"],"field-minute":"Minute","field-dayperiod":"Dayperiod","days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"Yesterday","dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MMMd":"MMM d","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","field-day":"Day","days-format-wide":["1","2","3","4","5","6","7"],"field-zone":"Zone","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":["1","2","3","4","5","6","7"],"eraNames":["BCE","CE"],"days-format-narrow":["1","2","3","4","5","6","7"],"days-standAlone-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-short":"yyyy-MM-dd","field-second":"Second","dateFormatItem-yMMMEd":"EEE, y MMM d","dateTimeFormats-appendItem-Timezone":"{0} {1}","field-week":"Week","dateFormat-medium":"y MMM d","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/gregorian",{root:{"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Day of the Week","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["BCE","CE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"y MMMM d","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, y MMMM dd","dateFormatItem-Md":"M-d","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-era":"Era","dateFormatItem-yM":"y-M","months-standAlone-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","quarters-format-wide":["Q1","Q2","Q3","Q4"],"timeFormat-long":"HH:mm:ss z","field-year":"Year","dateFormatItem-yMMM":"y MMM","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","field-hour":"Hour","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","field-day-relative+0":"Today","field-day-relative+1":"Tomorrow","dateFormatItem-H":"HH","months-standAlone-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["BCE","CE"],"field-minute":"Minute","field-dayperiod":"Dayperiod","days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"field-day-relative+-1":"Yesterday","dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MMMd":"MMM d","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","field-day":"Day","days-format-wide":["1","2","3","4","5","6","7"],"field-zone":"Zone","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":["1","2","3","4","5","6","7"],"eraNames":["BCE","CE"],"days-format-narrow":["1","2","3","4","5","6","7"],"days-standAlone-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-short":"yyyy-MM-dd","field-second":"Second","dateFormatItem-yMMMEd":"EEE, y MMM d","dateTimeFormats-appendItem-Timezone":"{0} {1}","field-week":"Week","dateFormat-medium":"y MMM d","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"},"ar":true,"ca":true,"cs":true,"da":true,"de":true,"el":true,"en":true,"en-au":true,"en-ca":true,"en-gb":true,"es":true,"fi":true,"fr":true,"fr-ch":true,"he":true,"hu":true,"it":true,"ja":true,"ko":true,"nb":true,"nl":true,"pl":true,"pt":true,"pt-pt":true,"ro":true,"ru":true,"sk":true,"sl":true,"sv":true,"th":true,"tr":true,"zh":true,"zh-hant":true,"zh-hk":true,"zh-tw":true}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..0201f6d80
--- /dev/null
+++ b/lib/dojo/cldr/nls/gregorian.js.uncompressed.js
@@ -0,0 +1,294 @@
+define("dojo/cldr/nls/gregorian", { root:
+
+//begin v1.x content
+{
+ "months-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "quarters-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4"
+ ],
+ "field-weekday": "Day of the Week",
+ "dateFormatItem-yQQQ": "y QQQ",
+ "dateFormatItem-yMEd": "EEE, y-M-d",
+ "dateFormatItem-MMMEd": "E MMM d",
+ "eraNarrow": [
+ "BCE",
+ "CE"
+ ],
+ "dateTimeFormats-appendItem-Day-Of-Week": "{0} {1}",
+ "dateFormat-long": "y MMMM d",
+ "months-format-wide": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dateTimeFormat-medium": "{1} {0}",
+ "dateFormatItem-EEEd": "d EEE",
+ "dayPeriods-format-wide-pm": "PM",
+ "dateFormat-full": "EEEE, y MMMM dd",
+ "dateFormatItem-Md": "M-d",
+ "dayPeriods-format-abbr-am": "AM",
+ "dateTimeFormats-appendItem-Second": "{0} ({2}: {1})",
+ "field-era": "Era",
+ "dateFormatItem-yM": "y-M",
+ "months-standAlone-wide": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "field-year": "Year",
+ "dateFormatItem-yMMM": "y MMM",
+ "dateFormatItem-yQ": "y Q",
+ "dateTimeFormats-appendItem-Era": "{0} {1}",
+ "field-hour": "Hour",
+ "months-format-abbr": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "dateTimeFormats-appendItem-Week": "{0} ({2}: {1})",
+ "field-day-relative+0": "Today",
+ "field-day-relative+1": "Tomorrow",
+ "dateFormatItem-H": "HH",
+ "months-standAlone-abbr": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "quarters-format-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "quarters-standAlone-wide": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "eraAbbr": [
+ "BCE",
+ "CE"
+ ],
+ "field-minute": "Minute",
+ "field-dayperiod": "Dayperiod",
+ "days-standAlone-abbr": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "quarters-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4"
+ ],
+ "field-day-relative+-1": "Yesterday",
+ "dateFormatItem-h": "h a",
+ "dateTimeFormat-long": "{1} {0}",
+ "dayPeriods-format-narrow-am": "AM",
+ "dateFormatItem-MMMd": "MMM d",
+ "dateFormatItem-MEd": "E, M-d",
+ "dateTimeFormat-full": "{1} {0}",
+ "field-day": "Day",
+ "days-format-wide": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "field-zone": "Zone",
+ "dateTimeFormats-appendItem-Day": "{0} ({2}: {1})",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dateFormatItem-hm": "h:mm a",
+ "dateTimeFormats-appendItem-Year": "{0} {1}",
+ "dateTimeFormats-appendItem-Hour": "{0} ({2}: {1})",
+ "dayPeriods-format-abbr-pm": "PM",
+ "days-format-abbr": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "eraNames": [
+ "BCE",
+ "CE"
+ ],
+ "days-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "days-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "field-month": "Month",
+ "dateTimeFormats-appendItem-Quarter": "{0} ({2}: {1})",
+ "dayPeriods-format-wide-am": "AM",
+ "dateTimeFormats-appendItem-Month": "{0} ({2}: {1})",
+ "dateTimeFormats-appendItem-Minute": "{0} ({2}: {1})",
+ "dateFormat-short": "yyyy-MM-dd",
+ "field-second": "Second",
+ "dateFormatItem-yMMMEd": "EEE, y MMM d",
+ "dateTimeFormats-appendItem-Timezone": "{0} {1}",
+ "field-week": "Week",
+ "dateFormat-medium": "y MMM d",
+ "dayPeriods-format-narrow-pm": "PM",
+ "dateTimeFormat-short": "{1} {0}",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-hms": "h:mm:ss a"
+}
+//end v1.x content
+,
+ "ar": true,
+ "ca": true,
+ "cs": true,
+ "da": true,
+ "de": true,
+ "el": true,
+ "en": true,
+ "en-au": true,
+ "en-ca": true,
+ "en-gb": true,
+ "es": true,
+ "fi": true,
+ "fr": true,
+ "fr-ch": true,
+ "he": true,
+ "hu": true,
+ "it": true,
+ "ja": true,
+ "ko": true,
+ "nb": true,
+ "nl": true,
+ "pl": true,
+ "pt": true,
+ "pt-pt": true,
+ "ro": true,
+ "ru": true,
+ "sk": true,
+ "sl": true,
+ "sv": true,
+ "th": true,
+ "tr": true,
+ "zh": true,
+ "zh-hant": true,
+ "zh-hk": true,
+ "zh-tw": true
+}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/he/currency.js b/lib/dojo/cldr/nls/he/currency.js
index a133a5790..08d439ac8 100644
--- a/lib/dojo/cldr/nls/he/currency.js
+++ b/lib/dojo/cldr/nls/he/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"דולר הונג קונגי","CHF_displayName":"פרנק שוויצרי","CAD_displayName":"דולר קנדי","CNY_displayName":"יואן רנמינבי סיני","AUD_displayName":"דולר אוסטרלי","JPY_displayName":"ין יפני","USD_displayName":"דולר אמריקאי","GBP_displayName":"לירה שטרלינג","EUR_displayName":"אירו","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/he/currency",{"HKD_displayName":"דולר הונג קונגי","CHF_displayName":"פרנק שוויצרי","CAD_displayName":"דולר קנדי","CNY_displayName":"יואן רנמינבי סיני","AUD_displayName":"דולר אוסטרלי","JPY_displayName":"ין יפני","USD_displayName":"דולר אמריקאי","GBP_displayName":"לירה שטרלינג","EUR_displayName":"אירו"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/he/currency.js.uncompressed.js b/lib/dojo/cldr/nls/he/currency.js.uncompressed.js
new file mode 100644
index 000000000..e98bfafa5
--- /dev/null
+++ b/lib/dojo/cldr/nls/he/currency.js.uncompressed.js
@@ -0,0 +1,15 @@
+define(
+"dojo/cldr/nls/he/currency", //begin v1.x content
+{
+ "HKD_displayName": "דולר הונג קונגי",
+ "CHF_displayName": "פרנק שוויצרי",
+ "CAD_displayName": "דולר קנדי",
+ "CNY_displayName": "יואן רנמינבי סיני",
+ "AUD_displayName": "דולר אוסטרלי",
+ "JPY_displayName": "ין יפני",
+ "USD_displayName": "דולר אמריקאי",
+ "GBP_displayName": "לירה שטרלינג",
+ "EUR_displayName": "אירו"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/he/gregorian.js b/lib/dojo/cldr/nls/he/gregorian.js
index 235d886d7..7872b49cd 100644
--- a/lib/dojo/cldr/nls/he/gregorian.js
+++ b/lib/dojo/cldr/nls/he/gregorian.js
@@ -1 +1,8 @@
-({"field-weekday":"יום בשבוע","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, d.M.yyyy","dateFormatItem-MMMEd":"E, d בMMM","eraNarrow":["לפנה״ס","לסה״נ"],"dateFormat-long":"d בMMMM y","months-format-wide":["ינואר","פברואר","מרס","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"dateFormatItem-EEEd":"EEE ה-d","dayPeriods-format-wide-pm":"אחה״צ","dateFormat-full":"EEEE, d בMMMM y","dateFormatItem-Md":"d/M","field-era":"תקופה","dateFormatItem-yM":"M.yyyy","months-standAlone-wide":["ינואר","פברואר","מרס","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"timeFormat-short":"HH:mm","quarters-format-wide":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"timeFormat-long":"HH:mm:ss z","field-year":"שנה","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"yyyy Q","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"שעה","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["ינו","פבר","מרס","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"היום","field-day-relative+1":"מחר","field-day-relative+2":"מחרתיים","dateFormatItem-H":"HH","field-day-relative+3":"בעוד שלושה ימים","months-standAlone-abbr":["ינו׳","פבר׳","מרס","אפר׳","מאי","יונ׳","יול׳","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳"],"quarters-format-abbr":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"quarters-standAlone-wide":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"dateFormatItem-M":"L","days-standAlone-wide":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"dateFormatItem-MMMMd":"d בMMMM","dateFormatItem-yyMMM":"MMM yyyy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"eraAbbr":["לפנה״ס","לסה״נ"],"field-minute":"דקה","field-dayperiod":"לפה״צ/אחה״צ","days-standAlone-abbr":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"אתמול","field-day-relative+-2":"שלשום","field-day-relative+-3":"לפני שלושה ימים","dateFormatItem-MMMd":"d בMMM","dateFormatItem-MEd":"E, M-d","dateFormatItem-yMMMM":"MMMM y","field-day":"יום","days-format-wide":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"field-zone":"אזור","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-y":"y","dateFormatItem-yyMM":"MM/yy","dateFormatItem-hm":"h:mm a","days-format-abbr":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"eraNames":["לפני הספירה","לספירה"],"days-format-narrow":["א","ב","ג","ד","ה","ו","ש"],"field-month":"חודש","days-standAlone-narrow":["א","ב","ג","ד","ה","ו","ש"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"לפנה״צ","dateFormatItem-MMMMEd":"E, d בMMMM","dateFormat-short":"dd/MM/yy","field-second":"שנייה","dateFormatItem-yMMMEd":"EEE, d בMMM y","dateFormatItem-Ed":"E ה-d","field-week":"שבוע","dateFormat-medium":"d בMMM yyyy","dateFormatItem-mmss":"mm:ss","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yyyy":"y","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/he/gregorian",{"field-weekday":"יום בשבוע","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, d.M.yyyy","dateFormatItem-MMMEd":"E, d בMMM","eraNarrow":["לפנה״ס","לסה״נ"],"dateFormat-long":"d בMMMM y","months-format-wide":["ינואר","פברואר","מרס","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"dateFormatItem-EEEd":"EEE ה-d","dayPeriods-format-wide-pm":"אחה״צ","dateFormat-full":"EEEE, d בMMMM y","dateFormatItem-Md":"d/M","field-era":"תקופה","dateFormatItem-yM":"M.yyyy","months-standAlone-wide":["ינואר","פברואר","מרס","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"timeFormat-short":"HH:mm","quarters-format-wide":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"timeFormat-long":"HH:mm:ss z","field-year":"שנה","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"yyyy Q","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"שעה","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["ינו","פבר","מרס","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"היום","field-day-relative+1":"מחר","field-day-relative+2":"מחרתיים","dateFormatItem-H":"HH","field-day-relative+3":"בעוד שלושה ימים","months-standAlone-abbr":["ינו׳","פבר׳","מרס","אפר׳","מאי","יונ׳","יול׳","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳"],"quarters-format-abbr":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"quarters-standAlone-wide":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"dateFormatItem-M":"L","days-standAlone-wide":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"dateFormatItem-MMMMd":"d בMMMM","dateFormatItem-yyMMM":"MMM yyyy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"eraAbbr":["לפנה״ס","לסה״נ"],"field-minute":"דקה","field-dayperiod":"לפה״צ/אחה״צ","days-standAlone-abbr":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"אתמול","field-day-relative+-2":"שלשום","field-day-relative+-3":"לפני שלושה ימים","dateFormatItem-MMMd":"d בMMM","dateFormatItem-MEd":"E, M-d","dateFormatItem-yMMMM":"MMMM y","field-day":"יום","days-format-wide":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"field-zone":"אזור","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-y":"y","dateFormatItem-yyMM":"MM/yy","dateFormatItem-hm":"h:mm a","days-format-abbr":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"eraNames":["לפני הספירה","לספירה"],"days-format-narrow":["א","ב","ג","ד","ה","ו","ש"],"field-month":"חודש","days-standAlone-narrow":["א","ב","ג","ד","ה","ו","ש"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"לפנה״צ","dateFormatItem-MMMMEd":"E, d בMMMM","dateFormat-short":"dd/MM/yy","field-second":"שנייה","dateFormatItem-yMMMEd":"EEE, d בMMM y","dateFormatItem-Ed":"E ה-d","field-week":"שבוע","dateFormat-medium":"d בMMM yyyy","dateFormatItem-mmss":"mm:ss","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yyyy":"y"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/he/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/he/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..81cbee628
--- /dev/null
+++ b/lib/dojo/cldr/nls/he/gregorian.js.uncompressed.js
@@ -0,0 +1,213 @@
+define(
+"dojo/cldr/nls/he/gregorian", //begin v1.x content
+{
+ "field-weekday": "יום בשבוע",
+ "dateFormatItem-yQQQ": "y QQQ",
+ "dateFormatItem-yMEd": "EEE, d.M.yyyy",
+ "dateFormatItem-MMMEd": "E, d בMMM",
+ "eraNarrow": [
+ "לפנה״ס",
+ "לסה״נ"
+ ],
+ "dateFormat-long": "d בMMMM y",
+ "months-format-wide": [
+ "ינואר",
+ "פברואר",
+ "מרס",
+ "אפריל",
+ "מאי",
+ "יוני",
+ "יולי",
+ "אוגוסט",
+ "ספטמבר",
+ "אוקטובר",
+ "נובמבר",
+ "דצמבר"
+ ],
+ "dateFormatItem-EEEd": "EEE ה-d",
+ "dayPeriods-format-wide-pm": "אחה״צ",
+ "dateFormat-full": "EEEE, d בMMMM y",
+ "dateFormatItem-Md": "d/M",
+ "field-era": "תקופה",
+ "dateFormatItem-yM": "M.yyyy",
+ "months-standAlone-wide": [
+ "ינואר",
+ "פברואר",
+ "מרס",
+ "אפריל",
+ "מאי",
+ "יוני",
+ "יולי",
+ "אוגוסט",
+ "ספטמבר",
+ "אוקטובר",
+ "נובמבר",
+ "דצמבר"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "רבעון 1",
+ "רבעון 2",
+ "רבעון 3",
+ "רבעון 4"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "field-year": "שנה",
+ "dateFormatItem-yMMM": "MMM y",
+ "dateFormatItem-yQ": "yyyy Q",
+ "dateFormatItem-yyyyMMMM": "MMMM y",
+ "field-hour": "שעה",
+ "dateFormatItem-MMdd": "dd/MM",
+ "months-format-abbr": [
+ "ינו",
+ "פבר",
+ "מרס",
+ "אפר",
+ "מאי",
+ "יונ",
+ "יול",
+ "אוג",
+ "ספט",
+ "אוק",
+ "נוב",
+ "דצמ"
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "field-day-relative+0": "היום",
+ "field-day-relative+1": "מחר",
+ "field-day-relative+2": "מחרתיים",
+ "dateFormatItem-H": "HH",
+ "field-day-relative+3": "בעוד שלושה ימים",
+ "months-standAlone-abbr": [
+ "ינו׳",
+ "פבר׳",
+ "מרס",
+ "אפר׳",
+ "מאי",
+ "יונ׳",
+ "יול׳",
+ "אוג׳",
+ "ספט׳",
+ "אוק׳",
+ "נוב׳",
+ "דצמ׳"
+ ],
+ "quarters-format-abbr": [
+ "רבעון 1",
+ "רבעון 2",
+ "רבעון 3",
+ "רבעון 4"
+ ],
+ "quarters-standAlone-wide": [
+ "רבעון 1",
+ "רבעון 2",
+ "רבעון 3",
+ "רבעון 4"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "יום ראשון",
+ "יום שני",
+ "יום שלישי",
+ "יום רביעי",
+ "יום חמישי",
+ "יום שישי",
+ "יום שבת"
+ ],
+ "dateFormatItem-MMMMd": "d בMMMM",
+ "dateFormatItem-yyMMM": "MMM yyyy",
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "רבעון 1",
+ "רבעון 2",
+ "רבעון 3",
+ "רבעון 4"
+ ],
+ "eraAbbr": [
+ "לפנה״ס",
+ "לסה״נ"
+ ],
+ "field-minute": "דקה",
+ "field-dayperiod": "לפה״צ/אחה״צ",
+ "days-standAlone-abbr": [
+ "יום א׳",
+ "יום ב׳",
+ "יום ג׳",
+ "יום ד׳",
+ "יום ה׳",
+ "יום ו׳",
+ "שבת"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "אתמול",
+ "field-day-relative+-2": "שלשום",
+ "field-day-relative+-3": "לפני שלושה ימים",
+ "dateFormatItem-MMMd": "d בMMM",
+ "dateFormatItem-MEd": "E, M-d",
+ "dateFormatItem-yMMMM": "MMMM y",
+ "field-day": "יום",
+ "days-format-wide": [
+ "יום ראשון",
+ "יום שני",
+ "יום שלישי",
+ "יום רביעי",
+ "יום חמישי",
+ "יום שישי",
+ "יום שבת"
+ ],
+ "field-zone": "אזור",
+ "dateFormatItem-yyyyMM": "MM/yyyy",
+ "dateFormatItem-y": "y",
+ "dateFormatItem-yyMM": "MM/yy",
+ "dateFormatItem-hm": "h:mm a",
+ "days-format-abbr": [
+ "יום א׳",
+ "יום ב׳",
+ "יום ג׳",
+ "יום ד׳",
+ "יום ה׳",
+ "יום ו׳",
+ "שבת"
+ ],
+ "eraNames": [
+ "לפני הספירה",
+ "לספירה"
+ ],
+ "days-format-narrow": [
+ "א",
+ "ב",
+ "ג",
+ "ד",
+ "ה",
+ "ו",
+ "ש"
+ ],
+ "field-month": "חודש",
+ "days-standAlone-narrow": [
+ "א",
+ "ב",
+ "ג",
+ "ד",
+ "ה",
+ "ו",
+ "ש"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "לפנה״צ",
+ "dateFormatItem-MMMMEd": "E, d בMMMM",
+ "dateFormat-short": "dd/MM/yy",
+ "field-second": "שנייה",
+ "dateFormatItem-yMMMEd": "EEE, d בMMM y",
+ "dateFormatItem-Ed": "E ה-d",
+ "field-week": "שבוע",
+ "dateFormat-medium": "d בMMM yyyy",
+ "dateFormatItem-mmss": "mm:ss",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-hms": "h:mm:ss a",
+ "dateFormatItem-yyyy": "y"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/he/hebrew.js b/lib/dojo/cldr/nls/he/hebrew.js
index 6bbfaf916..2b581decb 100644
--- a/lib/dojo/cldr/nls/he/hebrew.js
+++ b/lib/dojo/cldr/nls/he/hebrew.js
@@ -1 +1,8 @@
-({"dateFormat-medium":"dd/MM/yyyy","dateFormatItem-MMMEd":"E, d בMMM","dateFormatItem-yMEd":"EEE, d.M.yyyy","eraNarrow":["לבה״ע"],"dateFormatItem-Md":"d/M","months-standAlone-wide":["תשרי","חשון","כסלו","טבת","שבט","אדר א׳","אדר","ניסן","אייר","סיון","תמוז","אב","אלול"],"months-format-wide-leap":"אדר ב׳","dateFormatItem-EEEd":"EEE ה-d","eraNames":["לבה״ע"],"days-standAlone-narrow":["א","ב","ג","ד","ה","ו","ש"],"dateFormatItem-MMMMEd":"E, d בMMMM","dayPeriods-format-wide-pm":"אחה״צ","months-standAlone-abbr":["תשרי","חשון","כסלו","טבת","שבט","אדר א׳","אדר","ניסן","אייר","סיון","תמוז","אב","אלול"],"dayPeriods-format-wide-am":"לפנה״צ","dateFormat-long":"d בMMMM y","dateFormat-short":"dd/MM/yy","dateFormatItem-yMMMEd":"EEE, d בMMM y","months-format-wide":["תשרי","חשון","כסלו","טבת","שבט","אדר א׳","אדר","ניסן","אייר","סיון","תמוז","אב","אלול"],"dateFormatItem-yM":"M.yyyy","months-format-abbr":["תשרי","חשון","כסלו","טבת","שבט","אדר א׳","אדר","ניסן","אייר","סיון","תמוז","אב","אלול"],"eraAbbr":["לבה״ע"],"days-format-wide":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"dateFormatItem-yQ":"yyyy Q","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"dateFormat-full":"EEEE, d בMMMM y","dateFormatItem-MMMd":"d בMMM","days-format-abbr":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"months-format-narrow":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"y QQQ","months-standAlone-narrow-leap":"Adar II","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","timeFormat-short":"HH:mm","timeFormat-long":"HH:mm:ss z","dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr-leap":"Adar II","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"months-standAlone-wide-leap":"Adar II","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"months-format-narrow-leap":"Adar II","days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","months-standAlone-abbr-leap":"Adar II","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/he/hebrew",{"dateFormat-medium":"dd/MM/yyyy","dateFormatItem-MMMEd":"E, d בMMM","dateFormatItem-yMEd":"EEE, d.M.yyyy","eraNarrow":["לבה״ע"],"dateFormatItem-Md":"d/M","months-standAlone-wide":["תשרי","חשון","כסלו","טבת","שבט","אדר א׳","אדר","ניסן","אייר","סיון","תמוז","אב","אלול"],"months-format-wide-leap":"אדר ב׳","dateFormatItem-EEEd":"EEE ה-d","eraNames":["לבה״ע"],"days-standAlone-narrow":["א","ב","ג","ד","ה","ו","ש"],"dateFormatItem-MMMMEd":"E, d בMMMM","dayPeriods-format-wide-pm":"אחה״צ","months-standAlone-abbr":["תשרי","חשון","כסלו","טבת","שבט","אדר א׳","אדר","ניסן","אייר","סיון","תמוז","אב","אלול"],"dayPeriods-format-wide-am":"לפנה״צ","dateFormat-long":"d בMMMM y","dateFormat-short":"dd/MM/yy","dateFormatItem-yMMMEd":"EEE, d בMMM y","months-format-wide":["תשרי","חשון","כסלו","טבת","שבט","אדר א׳","אדר","ניסן","אייר","סיון","תמוז","אב","אלול"],"dateFormatItem-yM":"M.yyyy","months-format-abbr":["תשרי","חשון","כסלו","טבת","שבט","אדר א׳","אדר","ניסן","אייר","סיון","תמוז","אב","אלול"],"eraAbbr":["לבה״ע"],"days-format-wide":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"dateFormatItem-yQ":"yyyy Q","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"dateFormat-full":"EEEE, d בMMMM y","dateFormatItem-MMMd":"d בMMM","days-format-abbr":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/he/hebrew.js.uncompressed.js b/lib/dojo/cldr/nls/he/hebrew.js.uncompressed.js
new file mode 100644
index 000000000..ba827f08d
--- /dev/null
+++ b/lib/dojo/cldr/nls/he/hebrew.js.uncompressed.js
@@ -0,0 +1,125 @@
+define(
+"dojo/cldr/nls/he/hebrew", //begin v1.x content
+{
+ "dateFormat-medium": "dd/MM/yyyy",
+ "dateFormatItem-MMMEd": "E, d בMMM",
+ "dateFormatItem-yMEd": "EEE, d.M.yyyy",
+ "eraNarrow": [
+ "לבה״ע"
+ ],
+ "dateFormatItem-Md": "d/M",
+ "months-standAlone-wide": [
+ "תשרי",
+ "חשון",
+ "כסלו",
+ "טבת",
+ "שבט",
+ "אדר א׳",
+ "אדר",
+ "ניסן",
+ "אייר",
+ "סיון",
+ "תמוז",
+ "אב",
+ "אלול"
+ ],
+ "months-format-wide-leap": "אדר ב׳",
+ "dateFormatItem-EEEd": "EEE ה-d",
+ "eraNames": [
+ "לבה״ע"
+ ],
+ "days-standAlone-narrow": [
+ "א",
+ "ב",
+ "ג",
+ "ד",
+ "ה",
+ "ו",
+ "ש"
+ ],
+ "dateFormatItem-MMMMEd": "E, d בMMMM",
+ "dayPeriods-format-wide-pm": "אחה״צ",
+ "months-standAlone-abbr": [
+ "תשרי",
+ "חשון",
+ "כסלו",
+ "טבת",
+ "שבט",
+ "אדר א׳",
+ "אדר",
+ "ניסן",
+ "אייר",
+ "סיון",
+ "תמוז",
+ "אב",
+ "אלול"
+ ],
+ "dayPeriods-format-wide-am": "לפנה״צ",
+ "dateFormat-long": "d בMMMM y",
+ "dateFormat-short": "dd/MM/yy",
+ "dateFormatItem-yMMMEd": "EEE, d בMMM y",
+ "months-format-wide": [
+ "תשרי",
+ "חשון",
+ "כסלו",
+ "טבת",
+ "שבט",
+ "אדר א׳",
+ "אדר",
+ "ניסן",
+ "אייר",
+ "סיון",
+ "תמוז",
+ "אב",
+ "אלול"
+ ],
+ "dateFormatItem-yM": "M.yyyy",
+ "months-format-abbr": [
+ "תשרי",
+ "חשון",
+ "כסלו",
+ "טבת",
+ "שבט",
+ "אדר א׳",
+ "אדר",
+ "ניסן",
+ "אייר",
+ "סיון",
+ "תמוז",
+ "אב",
+ "אלול"
+ ],
+ "eraAbbr": [
+ "לבה״ע"
+ ],
+ "days-format-wide": [
+ "יום ראשון",
+ "יום שני",
+ "יום שלישי",
+ "יום רביעי",
+ "יום חמישי",
+ "יום שישי",
+ "יום שבת"
+ ],
+ "dateFormatItem-yQ": "yyyy Q",
+ "dateFormatItem-yMMM": "MMM y",
+ "quarters-format-wide": [
+ "רבעון 1",
+ "רבעון 2",
+ "רבעון 3",
+ "רבעון 4"
+ ],
+ "dateFormat-full": "EEEE, d בMMMM y",
+ "dateFormatItem-MMMd": "d בMMM",
+ "days-format-abbr": [
+ "יום א׳",
+ "יום ב׳",
+ "יום ג׳",
+ "יום ד׳",
+ "יום ה׳",
+ "יום ו׳",
+ "שבת"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/he/islamic.js b/lib/dojo/cldr/nls/he/islamic.js
index f427eb03d..dfed331b5 100644
--- a/lib/dojo/cldr/nls/he/islamic.js
+++ b/lib/dojo/cldr/nls/he/islamic.js
@@ -1 +1,8 @@
-({"dateFormat-medium":"d בMMM yyyy","dateFormatItem-MMMEd":"E, d בMMM","dateFormatItem-yMEd":"EEE, d.M.yyyy","eraNarrow":["שנת היג׳רה"],"dateFormatItem-Md":"d/M","months-standAlone-wide":["מוחרם","ספר","רביע אל-אוואל","רביע אל-תני","ג׳ומדה אל-אוואל","ג׳ומדה אל-תני","רג׳אב","שעבאן","ראמדן","שוואל","זו אל-QI'DAH","זו אל-חיג׳ה"],"dateFormatItem-EEEd":"EEE ה-d","eraNames":["שנת היג׳רה"],"days-standAlone-narrow":["א","ב","ג","ד","ה","ו","ש"],"dayPeriods-format-wide-pm":"אחה״צ","months-standAlone-abbr":["מוחרם","ספר","רביע אל-אוואל","רביע אל-תני","ג׳ומדה אל-אוואל","ג׳ומדה אל-תני","רג׳אב","שעבאן","ראמדן","שוואל","זו אל-QI'DAH","זו אל-חיג׳ה"],"dayPeriods-format-wide-am":"לפנה״צ","dateFormat-long":"d בMMMM y","dateFormat-short":"dd/MM/yy","dateFormatItem-yMMMEd":"EEE, d בMMM y","months-format-wide":["מוחרם","ספר","רביע אל-אוואל","רביע אל-תני","ג׳ומדה אל-אוואל","ג׳ומדה אל-תני","רג׳אב","שעבאן","ראמדן","שוואל","זו אל-QI'DAH","זו אל-חיג׳ה"],"dateFormatItem-yM":"M.yyyy","months-format-abbr":["מוחרם","ספר","רביע אל-אוואל","רביע אל-תני","ג׳ומדה אל-אוואל","ג׳ומדה אל-תני","רג׳אב","שעבאן","ראמדן","שוואל","זו אל-QI'DAH","זו אל-חיג׳ה"],"eraAbbr":["שנת היג׳רה"],"days-format-wide":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"dateFormatItem-yQ":"yyyy Q","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"dateFormat-full":"EEEE, d בMMMM y","dateFormatItem-MMMd":"d בMMM","days-format-abbr":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"y QQQ","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","timeFormat-short":"HH:mm","timeFormat-long":"HH:mm:ss z","dateTimeFormats-appendItem-Era":"{0} {1}","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/he/islamic",{"dateFormat-medium":"d בMMM yyyy","dateFormatItem-MMMEd":"E, d בMMM","dateFormatItem-yMEd":"EEE, d.M.yyyy","eraNarrow":["שנת היג׳רה"],"dateFormatItem-Md":"d/M","months-standAlone-wide":["מוחרם","ספר","רביע אל-אוואל","רביע אל-תני","ג׳ומדה אל-אוואל","ג׳ומדה אל-תני","רג׳אב","שעבאן","ראמדן","שוואל","זו אל-QI'DAH","זו אל-חיג׳ה"],"dateFormatItem-EEEd":"EEE ה-d","eraNames":["שנת היג׳רה"],"days-standAlone-narrow":["א","ב","ג","ד","ה","ו","ש"],"dayPeriods-format-wide-pm":"אחה״צ","months-standAlone-abbr":["מוחרם","ספר","רביע אל-אוואל","רביע אל-תני","ג׳ומדה אל-אוואל","ג׳ומדה אל-תני","רג׳אב","שעבאן","ראמדן","שוואל","זו אל-QI'DAH","זו אל-חיג׳ה"],"dayPeriods-format-wide-am":"לפנה״צ","dateFormat-long":"d בMMMM y","dateFormat-short":"dd/MM/yy","dateFormatItem-yMMMEd":"EEE, d בMMM y","months-format-wide":["מוחרם","ספר","רביע אל-אוואל","רביע אל-תני","ג׳ומדה אל-אוואל","ג׳ומדה אל-תני","רג׳אב","שעבאן","ראמדן","שוואל","זו אל-QI'DAH","זו אל-חיג׳ה"],"dateFormatItem-yM":"M.yyyy","months-format-abbr":["מוחרם","ספר","רביע אל-אוואל","רביע אל-תני","ג׳ומדה אל-אוואל","ג׳ומדה אל-תני","רג׳אב","שעבאן","ראמדן","שוואל","זו אל-QI'DAH","זו אל-חיג׳ה"],"eraAbbr":["שנת היג׳רה"],"days-format-wide":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"dateFormatItem-yQ":"yyyy Q","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"dateFormat-full":"EEEE, d בMMMM y","dateFormatItem-MMMd":"d בMMM","days-format-abbr":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/he/islamic.js.uncompressed.js b/lib/dojo/cldr/nls/he/islamic.js.uncompressed.js
new file mode 100644
index 000000000..3340fbc6a
--- /dev/null
+++ b/lib/dojo/cldr/nls/he/islamic.js.uncompressed.js
@@ -0,0 +1,119 @@
+define(
+"dojo/cldr/nls/he/islamic", //begin v1.x content
+{
+ "dateFormat-medium": "d בMMM yyyy",
+ "dateFormatItem-MMMEd": "E, d בMMM",
+ "dateFormatItem-yMEd": "EEE, d.M.yyyy",
+ "eraNarrow": [
+ "שנת היג׳רה"
+ ],
+ "dateFormatItem-Md": "d/M",
+ "months-standAlone-wide": [
+ "מוחרם",
+ "ספר",
+ "רביע אל-אוואל",
+ "רביע אל-תני",
+ "ג׳ומדה אל-אוואל",
+ "ג׳ומדה אל-תני",
+ "רג׳אב",
+ "שעבאן",
+ "ראמדן",
+ "שוואל",
+ "זו אל-QI'DAH",
+ "זו אל-חיג׳ה"
+ ],
+ "dateFormatItem-EEEd": "EEE ה-d",
+ "eraNames": [
+ "שנת היג׳רה"
+ ],
+ "days-standAlone-narrow": [
+ "א",
+ "ב",
+ "ג",
+ "ד",
+ "ה",
+ "ו",
+ "ש"
+ ],
+ "dayPeriods-format-wide-pm": "אחה״צ",
+ "months-standAlone-abbr": [
+ "מוחרם",
+ "ספר",
+ "רביע אל-אוואל",
+ "רביע אל-תני",
+ "ג׳ומדה אל-אוואל",
+ "ג׳ומדה אל-תני",
+ "רג׳אב",
+ "שעבאן",
+ "ראמדן",
+ "שוואל",
+ "זו אל-QI'DAH",
+ "זו אל-חיג׳ה"
+ ],
+ "dayPeriods-format-wide-am": "לפנה״צ",
+ "dateFormat-long": "d בMMMM y",
+ "dateFormat-short": "dd/MM/yy",
+ "dateFormatItem-yMMMEd": "EEE, d בMMM y",
+ "months-format-wide": [
+ "מוחרם",
+ "ספר",
+ "רביע אל-אוואל",
+ "רביע אל-תני",
+ "ג׳ומדה אל-אוואל",
+ "ג׳ומדה אל-תני",
+ "רג׳אב",
+ "שעבאן",
+ "ראמדן",
+ "שוואל",
+ "זו אל-QI'DAH",
+ "זו אל-חיג׳ה"
+ ],
+ "dateFormatItem-yM": "M.yyyy",
+ "months-format-abbr": [
+ "מוחרם",
+ "ספר",
+ "רביע אל-אוואל",
+ "רביע אל-תני",
+ "ג׳ומדה אל-אוואל",
+ "ג׳ומדה אל-תני",
+ "רג׳אב",
+ "שעבאן",
+ "ראמדן",
+ "שוואל",
+ "זו אל-QI'DAH",
+ "זו אל-חיג׳ה"
+ ],
+ "eraAbbr": [
+ "שנת היג׳רה"
+ ],
+ "days-format-wide": [
+ "יום ראשון",
+ "יום שני",
+ "יום שלישי",
+ "יום רביעי",
+ "יום חמישי",
+ "יום שישי",
+ "יום שבת"
+ ],
+ "dateFormatItem-yQ": "yyyy Q",
+ "dateFormatItem-yMMM": "MMM y",
+ "quarters-format-wide": [
+ "רבעון 1",
+ "רבעון 2",
+ "רבעון 3",
+ "רבעון 4"
+ ],
+ "dateFormat-full": "EEEE, d בMMMM y",
+ "dateFormatItem-MMMd": "d בMMM",
+ "days-format-abbr": [
+ "יום א׳",
+ "יום ב׳",
+ "יום ג׳",
+ "יום ד׳",
+ "יום ה׳",
+ "יום ו׳",
+ "שבת"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/he/number.js b/lib/dojo/cldr/nls/he/number.js
index 565c899fe..396fd73fa 100644
--- a/lib/dojo/cldr/nls/he/number.js
+++ b/lib/dojo/cldr/nls/he/number.js
@@ -1 +1,8 @@
-({"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/he/number",{"group":",","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0%","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/he/number.js.uncompressed.js b/lib/dojo/cldr/nls/he/number.js.uncompressed.js
new file mode 100644
index 000000000..6ddfe5c6a
--- /dev/null
+++ b/lib/dojo/cldr/nls/he/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/he/number", //begin v1.x content
+{
+ "group": ",",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ".",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/hebrew.js b/lib/dojo/cldr/nls/hebrew.js
index f4062b739..3f9965593 100644
--- a/lib/dojo/cldr/nls/hebrew.js
+++ b/lib/dojo/cldr/nls/hebrew.js
@@ -1 +1,8 @@
-({"months-format-narrow":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"y QQQ","months-standAlone-narrow-leap":"Adar II","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["AM"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"y MMMM d","months-format-wide":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, y MMMM dd","dateFormatItem-Md":"M-d","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yM":"y-M","months-standAlone-wide":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"timeFormat-short":"HH:mm","quarters-format-wide":["Q1","Q2","Q3","Q4"],"timeFormat-long":"HH:mm:ss z","dateFormatItem-yMMM":"y MMM","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr-leap":"Adar II","months-format-abbr":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"months-standAlone-wide-leap":"Adar II","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"months-format-narrow-leap":"Adar II","eraAbbr":["AM"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MMMd":"MMM d","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","days-format-wide":["1","2","3","4","5","6","7"],"months-standAlone-abbr-leap":"Adar II","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":["1","2","3","4","5","6","7"],"eraNames":["AM"],"days-format-narrow":["1","2","3","4","5","6","7"],"days-standAlone-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-short":"yyyy-MM-dd","dateFormatItem-yMMMEd":"EEE, y MMM d","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormat-medium":"y MMM d","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","months-format-wide-leap":"Adar II"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/hebrew",{root:{"months-format-narrow":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"y QQQ","months-standAlone-narrow-leap":"Adar II","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["AM"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"y MMMM d","months-format-wide":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, y MMMM dd","dateFormatItem-Md":"M-d","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yM":"y-M","months-standAlone-wide":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"timeFormat-short":"HH:mm","quarters-format-wide":["Q1","Q2","Q3","Q4"],"timeFormat-long":"HH:mm:ss z","dateFormatItem-yMMM":"y MMM","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr-leap":"Adar II","months-format-abbr":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"months-standAlone-wide-leap":"Adar II","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"months-format-narrow-leap":"Adar II","eraAbbr":["AM"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MMMd":"MMM d","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","days-format-wide":["1","2","3","4","5","6","7"],"months-standAlone-abbr-leap":"Adar II","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul"],"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":["1","2","3","4","5","6","7"],"eraNames":["AM"],"days-format-narrow":["1","2","3","4","5","6","7"],"days-standAlone-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-short":"yyyy-MM-dd","dateFormatItem-yMMMEd":"EEE, y MMM d","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormat-medium":"y MMM d","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","months-format-wide-leap":"Adar II"},"ar":true,"el":true,"fi":true,"fr":true,"he":true,"hu":true,"nl":true,"ru":true,"sv":true,"th":true,"tr":true}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/hebrew.js.uncompressed.js b/lib/dojo/cldr/nls/hebrew.js.uncompressed.js
new file mode 100644
index 000000000..0ad34419e
--- /dev/null
+++ b/lib/dojo/cldr/nls/hebrew.js.uncompressed.js
@@ -0,0 +1,265 @@
+define("dojo/cldr/nls/hebrew", { root:
+
+//begin v1.x content
+{
+ "months-format-narrow": [
+ "Tishri",
+ "Heshvan",
+ "Kislev",
+ "Tevet",
+ "Shevat",
+ "Adar I",
+ "Adar",
+ "Nisan",
+ "Iyar",
+ "Sivan",
+ "Tamuz",
+ "Av",
+ "Elul"
+ ],
+ "quarters-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4"
+ ],
+ "dateFormatItem-yQQQ": "y QQQ",
+ "months-standAlone-narrow-leap": "Adar II",
+ "dateFormatItem-yMEd": "EEE, y-M-d",
+ "dateFormatItem-MMMEd": "E MMM d",
+ "eraNarrow": [
+ "AM"
+ ],
+ "dateTimeFormats-appendItem-Day-Of-Week": "{0} {1}",
+ "dateFormat-long": "y MMMM d",
+ "months-format-wide": [
+ "Tishri",
+ "Heshvan",
+ "Kislev",
+ "Tevet",
+ "Shevat",
+ "Adar I",
+ "Adar",
+ "Nisan",
+ "Iyar",
+ "Sivan",
+ "Tamuz",
+ "Av",
+ "Elul"
+ ],
+ "dateTimeFormat-medium": "{1} {0}",
+ "dateFormatItem-EEEd": "d EEE",
+ "dayPeriods-format-wide-pm": "PM",
+ "dateFormat-full": "EEEE, y MMMM dd",
+ "dateFormatItem-Md": "M-d",
+ "dayPeriods-format-abbr-am": "AM",
+ "dateTimeFormats-appendItem-Second": "{0} ({2}: {1})",
+ "dateFormatItem-yM": "y-M",
+ "months-standAlone-wide": [
+ "Tishri",
+ "Heshvan",
+ "Kislev",
+ "Tevet",
+ "Shevat",
+ "Adar I",
+ "Adar",
+ "Nisan",
+ "Iyar",
+ "Sivan",
+ "Tamuz",
+ "Av",
+ "Elul"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "dateFormatItem-yMMM": "y MMM",
+ "dateFormatItem-yQ": "y Q",
+ "dateTimeFormats-appendItem-Era": "{0} {1}",
+ "months-format-abbr-leap": "Adar II",
+ "months-format-abbr": [
+ "Tishri",
+ "Heshvan",
+ "Kislev",
+ "Tevet",
+ "Shevat",
+ "Adar I",
+ "Adar",
+ "Nisan",
+ "Iyar",
+ "Sivan",
+ "Tamuz",
+ "Av",
+ "Elul"
+ ],
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "dateTimeFormats-appendItem-Week": "{0} ({2}: {1})",
+ "dateFormatItem-H": "HH",
+ "months-standAlone-abbr": [
+ "Tishri",
+ "Heshvan",
+ "Kislev",
+ "Tevet",
+ "Shevat",
+ "Adar I",
+ "Adar",
+ "Nisan",
+ "Iyar",
+ "Sivan",
+ "Tamuz",
+ "Av",
+ "Elul"
+ ],
+ "quarters-format-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "quarters-standAlone-wide": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "months-standAlone-wide-leap": "Adar II",
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "months-format-narrow-leap": "Adar II",
+ "eraAbbr": [
+ "AM"
+ ],
+ "days-standAlone-abbr": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "quarters-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4"
+ ],
+ "dateFormatItem-h": "h a",
+ "dateTimeFormat-long": "{1} {0}",
+ "dayPeriods-format-narrow-am": "AM",
+ "dateFormatItem-MMMd": "MMM d",
+ "dateFormatItem-MEd": "E, M-d",
+ "dateTimeFormat-full": "{1} {0}",
+ "days-format-wide": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "months-standAlone-abbr-leap": "Adar II",
+ "dateTimeFormats-appendItem-Day": "{0} ({2}: {1})",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "Tishri",
+ "Heshvan",
+ "Kislev",
+ "Tevet",
+ "Shevat",
+ "Adar I",
+ "Adar",
+ "Nisan",
+ "Iyar",
+ "Sivan",
+ "Tamuz",
+ "Av",
+ "Elul"
+ ],
+ "dateFormatItem-hm": "h:mm a",
+ "dateTimeFormats-appendItem-Year": "{0} {1}",
+ "dateTimeFormats-appendItem-Hour": "{0} ({2}: {1})",
+ "dayPeriods-format-abbr-pm": "PM",
+ "days-format-abbr": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "eraNames": [
+ "AM"
+ ],
+ "days-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "days-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dateTimeFormats-appendItem-Quarter": "{0} ({2}: {1})",
+ "dayPeriods-format-wide-am": "AM",
+ "dateTimeFormats-appendItem-Month": "{0} ({2}: {1})",
+ "dateTimeFormats-appendItem-Minute": "{0} ({2}: {1})",
+ "dateFormat-short": "yyyy-MM-dd",
+ "dateFormatItem-yMMMEd": "EEE, y MMM d",
+ "dateTimeFormats-appendItem-Timezone": "{0} {1}",
+ "dateFormat-medium": "y MMM d",
+ "dayPeriods-format-narrow-pm": "PM",
+ "dateTimeFormat-short": "{1} {0}",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-hms": "h:mm:ss a",
+ "months-format-wide-leap": "Adar II"
+}
+//end v1.x content
+,
+ "ar": true,
+ "el": true,
+ "fi": true,
+ "fr": true,
+ "he": true,
+ "hu": true,
+ "nl": true,
+ "ru": true,
+ "sv": true,
+ "th": true,
+ "tr": true
+}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/hu/currency.js b/lib/dojo/cldr/nls/hu/currency.js
index 6db8b84bf..d5886622e 100644
--- a/lib/dojo/cldr/nls/hu/currency.js
+++ b/lib/dojo/cldr/nls/hu/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Hongkongi dollár","CHF_displayName":"Svájci frank","JPY_symbol":"¥","CAD_displayName":"Kanadai dollár","CNY_displayName":"Kínai jüan renminbi","USD_symbol":"$","AUD_displayName":"Ausztrál dollár","JPY_displayName":"Japán jen","USD_displayName":"USA dollár","GBP_displayName":"Brit font sterling","EUR_displayName":"Euro","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/hu/currency",{"HKD_displayName":"Hongkongi dollár","CHF_displayName":"Svájci frank","JPY_symbol":"¥","CAD_displayName":"Kanadai dollár","CNY_displayName":"Kínai jüan renminbi","USD_symbol":"$","AUD_displayName":"Ausztrál dollár","JPY_displayName":"Japán jen","USD_displayName":"USA dollár","GBP_displayName":"Brit font sterling","EUR_displayName":"Euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/hu/currency.js.uncompressed.js b/lib/dojo/cldr/nls/hu/currency.js.uncompressed.js
new file mode 100644
index 000000000..8e0198896
--- /dev/null
+++ b/lib/dojo/cldr/nls/hu/currency.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dojo/cldr/nls/hu/currency", //begin v1.x content
+{
+ "HKD_displayName": "Hongkongi dollár",
+ "CHF_displayName": "Svájci frank",
+ "JPY_symbol": "¥",
+ "CAD_displayName": "Kanadai dollár",
+ "CNY_displayName": "Kínai jüan renminbi",
+ "USD_symbol": "$",
+ "AUD_displayName": "Ausztrál dollár",
+ "JPY_displayName": "Japán jen",
+ "USD_displayName": "USA dollár",
+ "GBP_displayName": "Brit font sterling",
+ "EUR_displayName": "Euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/hu/gregorian.js b/lib/dojo/cldr/nls/hu/gregorian.js
index a8cc39a09..b25bb2024 100644
--- a/lib/dojo/cldr/nls/hu/gregorian.js
+++ b/lib/dojo/cldr/nls/hu/gregorian.js
@@ -1 +1,8 @@
-({"field-dayperiod":"napszak","dayPeriods-format-wide-pm":"du.","field-minute":"perc","eraNames":["időszámításunk előtt","időszámításunk szerint"],"dateFormatItem-MMMEd":"MMM d., E","field-day-relative+-1":"tegnap","field-weekday":"hét napja","field-day-relative+-2":"tegnapelőtt","dateFormatItem-MMdd":"MM.dd.","field-day-relative+-3":"három nappal ezelőtt","days-standAlone-wide":["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","Á","M","J","J","A","Sz","O","N","D"],"field-era":"éra","field-hour":"óra","dayPeriods-format-wide-am":"de.","quarters-standAlone-abbr":["N1","N2","N3","N4"],"timeFormat-full":"H:mm:ss zzzz","months-standAlone-abbr":["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec."],"dateFormatItem-Ed":"d., E","field-day-relative+0":"ma","field-day-relative+1":"holnap","days-standAlone-narrow":["V","H","K","Sz","Cs","P","Sz"],"eraAbbr":["i. e.","i. sz."],"field-day-relative+2":"holnapután","field-day-relative+3":"három nap múlva","dateFormatItem-yyyyMM":"yyyy.MM","dateFormatItem-yyyyMMMM":"y. MMMM","dateFormat-long":"y. MMMM d.","timeFormat-medium":"H:mm:ss","field-zone":"zóna","dateFormatItem-Hm":"H:mm","dateFormat-medium":"yyyy.MM.dd.","dateFormatItem-Hms":"H:mm:ss","quarters-standAlone-wide":["I. negyedév","II. negyedév","III. negyedév","IV. negyedév"],"field-year":"év","field-week":"hét","months-standAlone-wide":["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december"],"dateFormatItem-MMMd":"MMM d.","dateFormatItem-yyQ":"yy/Q","timeFormat-long":"H:mm:ss z","months-format-abbr":["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec."],"timeFormat-short":"H:mm","dateFormatItem-H":"H","field-month":"hónap","dateFormatItem-MMMMd":"MMMM d.","quarters-format-abbr":["N1","N2","N3","N4"],"days-format-abbr":["V","H","K","Sze","Cs","P","Szo"],"dateFormatItem-mmss":"mm:ss","dateFormatItem-M":"L","days-format-narrow":["V","H","K","Sz","Cs","P","Sz"],"field-second":"másodperc","field-day":"nap","dateFormatItem-MEd":"M. d., E","months-format-narrow":["J","F","M","Á","M","J","J","A","Sz","O","N","D"],"days-standAlone-abbr":["V","H","K","Sze","Cs","P","Szo"],"dateFormat-short":"yyyy.MM.dd.","dateFormatItem-yMMMEd":"y. MMM d., E","dateFormat-full":"y. MMMM d., EEEE","dateFormatItem-Md":"M. d.","dateFormatItem-yMEd":"yyyy.MM.dd., E","months-format-wide":["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december"],"dateFormatItem-d":"d","quarters-format-wide":["I. negyedév","II. negyedév","III. negyedév","IV. negyedév"],"days-format-wide":["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],"eraNarrow":["i. e.","i. sz."],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"y QQQ","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yM":"y-M","dateFormatItem-yMMM":"y MMM","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/hu/gregorian",{"field-dayperiod":"napszak","dayPeriods-format-wide-pm":"du.","field-minute":"perc","eraNames":["időszámításunk előtt","időszámításunk szerint"],"dateFormatItem-MMMEd":"MMM d., E","field-day-relative+-1":"tegnap","field-weekday":"hét napja","field-day-relative+-2":"tegnapelőtt","dateFormatItem-MMdd":"MM.dd.","field-day-relative+-3":"három nappal ezelőtt","days-standAlone-wide":["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","Á","M","J","J","A","Sz","O","N","D"],"field-era":"éra","field-hour":"óra","dayPeriods-format-wide-am":"de.","quarters-standAlone-abbr":["N1","N2","N3","N4"],"timeFormat-full":"H:mm:ss zzzz","months-standAlone-abbr":["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec."],"dateFormatItem-Ed":"d., E","field-day-relative+0":"ma","field-day-relative+1":"holnap","days-standAlone-narrow":["V","H","K","Sz","Cs","P","Sz"],"eraAbbr":["i. e.","i. sz."],"field-day-relative+2":"holnapután","field-day-relative+3":"három nap múlva","dateFormatItem-yyyyMM":"yyyy.MM","dateFormatItem-yyyyMMMM":"y. MMMM","dateFormat-long":"y. MMMM d.","timeFormat-medium":"H:mm:ss","field-zone":"zóna","dateFormatItem-Hm":"H:mm","dateFormat-medium":"yyyy.MM.dd.","dateFormatItem-Hms":"H:mm:ss","quarters-standAlone-wide":["I. negyedév","II. negyedév","III. negyedév","IV. negyedév"],"field-year":"év","field-week":"hét","months-standAlone-wide":["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december"],"dateFormatItem-MMMd":"MMM d.","dateFormatItem-yyQ":"yy/Q","timeFormat-long":"H:mm:ss z","months-format-abbr":["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec."],"timeFormat-short":"H:mm","dateFormatItem-H":"H","field-month":"hónap","dateFormatItem-MMMMd":"MMMM d.","quarters-format-abbr":["N1","N2","N3","N4"],"days-format-abbr":["V","H","K","Sze","Cs","P","Szo"],"dateFormatItem-mmss":"mm:ss","dateFormatItem-M":"L","days-format-narrow":["V","H","K","Sz","Cs","P","Sz"],"field-second":"másodperc","field-day":"nap","dateFormatItem-MEd":"M. d., E","months-format-narrow":["J","F","M","Á","M","J","J","A","Sz","O","N","D"],"days-standAlone-abbr":["V","H","K","Sze","Cs","P","Szo"],"dateFormat-short":"yyyy.MM.dd.","dateFormatItem-yMMMEd":"y. MMM d., E","dateFormat-full":"y. MMMM d., EEEE","dateFormatItem-Md":"M. d.","dateFormatItem-yMEd":"yyyy.MM.dd., E","months-format-wide":["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december"],"dateFormatItem-d":"d","quarters-format-wide":["I. negyedév","II. negyedév","III. negyedév","IV. negyedév"],"days-format-wide":["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],"eraNarrow":["i. e.","i. sz."]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/hu/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/hu/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..50dcbc6f2
--- /dev/null
+++ b/lib/dojo/cldr/nls/hu/gregorian.js.uncompressed.js
@@ -0,0 +1,227 @@
+define(
+"dojo/cldr/nls/hu/gregorian", //begin v1.x content
+{
+ "field-dayperiod": "napszak",
+ "dayPeriods-format-wide-pm": "du.",
+ "field-minute": "perc",
+ "eraNames": [
+ "időszámításunk előtt",
+ "időszámításunk szerint"
+ ],
+ "dateFormatItem-MMMEd": "MMM d., E",
+ "field-day-relative+-1": "tegnap",
+ "field-weekday": "hét napja",
+ "field-day-relative+-2": "tegnapelőtt",
+ "dateFormatItem-MMdd": "MM.dd.",
+ "field-day-relative+-3": "három nappal ezelőtt",
+ "days-standAlone-wide": [
+ "vasárnap",
+ "hétfő",
+ "kedd",
+ "szerda",
+ "csütörtök",
+ "péntek",
+ "szombat"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "months-standAlone-narrow": [
+ "J",
+ "F",
+ "M",
+ "Á",
+ "M",
+ "J",
+ "J",
+ "A",
+ "Sz",
+ "O",
+ "N",
+ "D"
+ ],
+ "field-era": "éra",
+ "field-hour": "óra",
+ "dayPeriods-format-wide-am": "de.",
+ "quarters-standAlone-abbr": [
+ "N1",
+ "N2",
+ "N3",
+ "N4"
+ ],
+ "timeFormat-full": "H:mm:ss zzzz",
+ "months-standAlone-abbr": [
+ "jan.",
+ "febr.",
+ "márc.",
+ "ápr.",
+ "máj.",
+ "jún.",
+ "júl.",
+ "aug.",
+ "szept.",
+ "okt.",
+ "nov.",
+ "dec."
+ ],
+ "dateFormatItem-Ed": "d., E",
+ "field-day-relative+0": "ma",
+ "field-day-relative+1": "holnap",
+ "days-standAlone-narrow": [
+ "V",
+ "H",
+ "K",
+ "Sz",
+ "Cs",
+ "P",
+ "Sz"
+ ],
+ "eraAbbr": [
+ "i. e.",
+ "i. sz."
+ ],
+ "field-day-relative+2": "holnapután",
+ "field-day-relative+3": "három nap múlva",
+ "dateFormatItem-yyyyMM": "yyyy.MM",
+ "dateFormatItem-yyyyMMMM": "y. MMMM",
+ "dateFormat-long": "y. MMMM d.",
+ "timeFormat-medium": "H:mm:ss",
+ "field-zone": "zóna",
+ "dateFormatItem-Hm": "H:mm",
+ "dateFormat-medium": "yyyy.MM.dd.",
+ "dateFormatItem-Hms": "H:mm:ss",
+ "quarters-standAlone-wide": [
+ "I. negyedév",
+ "II. negyedév",
+ "III. negyedév",
+ "IV. negyedév"
+ ],
+ "field-year": "év",
+ "field-week": "hét",
+ "months-standAlone-wide": [
+ "január",
+ "február",
+ "március",
+ "április",
+ "május",
+ "június",
+ "július",
+ "augusztus",
+ "szeptember",
+ "október",
+ "november",
+ "december"
+ ],
+ "dateFormatItem-MMMd": "MMM d.",
+ "dateFormatItem-yyQ": "yy/Q",
+ "timeFormat-long": "H:mm:ss z",
+ "months-format-abbr": [
+ "jan.",
+ "febr.",
+ "márc.",
+ "ápr.",
+ "máj.",
+ "jún.",
+ "júl.",
+ "aug.",
+ "szept.",
+ "okt.",
+ "nov.",
+ "dec."
+ ],
+ "timeFormat-short": "H:mm",
+ "dateFormatItem-H": "H",
+ "field-month": "hónap",
+ "dateFormatItem-MMMMd": "MMMM d.",
+ "quarters-format-abbr": [
+ "N1",
+ "N2",
+ "N3",
+ "N4"
+ ],
+ "days-format-abbr": [
+ "V",
+ "H",
+ "K",
+ "Sze",
+ "Cs",
+ "P",
+ "Szo"
+ ],
+ "dateFormatItem-mmss": "mm:ss",
+ "dateFormatItem-M": "L",
+ "days-format-narrow": [
+ "V",
+ "H",
+ "K",
+ "Sz",
+ "Cs",
+ "P",
+ "Sz"
+ ],
+ "field-second": "másodperc",
+ "field-day": "nap",
+ "dateFormatItem-MEd": "M. d., E",
+ "months-format-narrow": [
+ "J",
+ "F",
+ "M",
+ "Á",
+ "M",
+ "J",
+ "J",
+ "A",
+ "Sz",
+ "O",
+ "N",
+ "D"
+ ],
+ "days-standAlone-abbr": [
+ "V",
+ "H",
+ "K",
+ "Sze",
+ "Cs",
+ "P",
+ "Szo"
+ ],
+ "dateFormat-short": "yyyy.MM.dd.",
+ "dateFormatItem-yMMMEd": "y. MMM d., E",
+ "dateFormat-full": "y. MMMM d., EEEE",
+ "dateFormatItem-Md": "M. d.",
+ "dateFormatItem-yMEd": "yyyy.MM.dd., E",
+ "months-format-wide": [
+ "január",
+ "február",
+ "március",
+ "április",
+ "május",
+ "június",
+ "július",
+ "augusztus",
+ "szeptember",
+ "október",
+ "november",
+ "december"
+ ],
+ "dateFormatItem-d": "d",
+ "quarters-format-wide": [
+ "I. negyedév",
+ "II. negyedév",
+ "III. negyedév",
+ "IV. negyedév"
+ ],
+ "days-format-wide": [
+ "vasárnap",
+ "hétfő",
+ "kedd",
+ "szerda",
+ "csütörtök",
+ "péntek",
+ "szombat"
+ ],
+ "eraNarrow": [
+ "i. e.",
+ "i. sz."
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/hu/number.js b/lib/dojo/cldr/nls/hu/number.js
index 8ce153f8a..d8a402a3e 100644
--- a/lib/dojo/cldr/nls/hu/number.js
+++ b/lib/dojo/cldr/nls/hu/number.js
@@ -1 +1,8 @@
-({"group":" ","percentSign":"%","exponential":"E","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","percentFormat":"#,##0%","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/hu/number",{"group":" ","percentSign":"%","exponential":"E","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/hu/number.js.uncompressed.js b/lib/dojo/cldr/nls/hu/number.js.uncompressed.js
new file mode 100644
index 000000000..1f183fb10
--- /dev/null
+++ b/lib/dojo/cldr/nls/hu/number.js.uncompressed.js
@@ -0,0 +1,21 @@
+define(
+"dojo/cldr/nls/hu/number", //begin v1.x content
+{
+ "group": " ",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/islamic.js b/lib/dojo/cldr/nls/islamic.js
index a35c02b57..71f81250a 100644
--- a/lib/dojo/cldr/nls/islamic.js
+++ b/lib/dojo/cldr/nls/islamic.js
@@ -1 +1,8 @@
-({"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["AH"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"y MMMM d","months-format-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, y MMMM dd","dateFormatItem-Md":"M-d","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yM":"y-M","months-standAlone-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"timeFormat-short":"HH:mm","quarters-format-wide":["Q1","Q2","Q3","Q4"],"timeFormat-long":"HH:mm:ss z","dateFormatItem-yMMM":"y MMM","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["AH"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MMMd":"MMM d","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","days-format-wide":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":["1","2","3","4","5","6","7"],"eraNames":["AH"],"days-format-narrow":["1","2","3","4","5","6","7"],"days-standAlone-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-short":"yyyy-MM-dd","dateFormatItem-yMMMEd":"EEE, y MMM d","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormat-medium":"y MMM d","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/islamic",{root:{"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["AH"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"y MMMM d","months-format-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, y MMMM dd","dateFormatItem-Md":"M-d","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yM":"y-M","months-standAlone-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"timeFormat-short":"HH:mm","quarters-format-wide":["Q1","Q2","Q3","Q4"],"timeFormat-long":"HH:mm:ss z","dateFormatItem-yMMM":"y MMM","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["AH"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateFormatItem-MMMd":"MMM d","dateFormatItem-MEd":"E, M-d","dateTimeFormat-full":"{1} {0}","days-format-wide":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-abbr":["1","2","3","4","5","6","7"],"eraNames":["AH"],"days-format-narrow":["1","2","3","4","5","6","7"],"days-standAlone-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-short":"yyyy-MM-dd","dateFormatItem-yMMMEd":"EEE, y MMM d","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateFormat-medium":"y MMM d","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"},"ar":true,"da":true,"de":true,"en":true,"en-gb":true,"es":true,"fi":true,"fr":true,"he":true,"hu":true,"it":true,"nb":true,"nl":true,"pl":true,"pt":true,"pt-pt":true,"ru":true,"sv":true,"th":true,"tr":true,"zh":true,"zh-hant":true}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/islamic.js.uncompressed.js b/lib/dojo/cldr/nls/islamic.js.uncompressed.js
new file mode 100644
index 000000000..53de7edcb
--- /dev/null
+++ b/lib/dojo/cldr/nls/islamic.js.uncompressed.js
@@ -0,0 +1,264 @@
+define("dojo/cldr/nls/islamic", { root:
+
+//begin v1.x content
+{
+ "months-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "quarters-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4"
+ ],
+ "dateFormatItem-yQQQ": "y QQQ",
+ "dateFormatItem-yMEd": "EEE, y-M-d",
+ "dateFormatItem-MMMEd": "E MMM d",
+ "eraNarrow": [
+ "AH"
+ ],
+ "dateTimeFormats-appendItem-Day-Of-Week": "{0} {1}",
+ "dateFormat-long": "y MMMM d",
+ "months-format-wide": [
+ "Muharram",
+ "Safar",
+ "Rabiʻ I",
+ "Rabiʻ II",
+ "Jumada I",
+ "Jumada II",
+ "Rajab",
+ "Shaʻban",
+ "Ramadan",
+ "Shawwal",
+ "Dhuʻl-Qiʻdah",
+ "Dhuʻl-Hijjah"
+ ],
+ "dateTimeFormat-medium": "{1} {0}",
+ "dateFormatItem-EEEd": "d EEE",
+ "dayPeriods-format-wide-pm": "PM",
+ "dateFormat-full": "EEEE, y MMMM dd",
+ "dateFormatItem-Md": "M-d",
+ "dayPeriods-format-abbr-am": "AM",
+ "dateTimeFormats-appendItem-Second": "{0} ({2}: {1})",
+ "dateFormatItem-yM": "y-M",
+ "months-standAlone-wide": [
+ "Muharram",
+ "Safar",
+ "Rabiʻ I",
+ "Rabiʻ II",
+ "Jumada I",
+ "Jumada II",
+ "Rajab",
+ "Shaʻban",
+ "Ramadan",
+ "Shawwal",
+ "Dhuʻl-Qiʻdah",
+ "Dhuʻl-Hijjah"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "dateFormatItem-yMMM": "y MMM",
+ "dateFormatItem-yQ": "y Q",
+ "dateTimeFormats-appendItem-Era": "{0} {1}",
+ "months-format-abbr": [
+ "Muh.",
+ "Saf.",
+ "Rab. I",
+ "Rab. II",
+ "Jum. I",
+ "Jum. II",
+ "Raj.",
+ "Sha.",
+ "Ram.",
+ "Shaw.",
+ "Dhuʻl-Q.",
+ "Dhuʻl-H."
+ ],
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "dateTimeFormats-appendItem-Week": "{0} ({2}: {1})",
+ "dateFormatItem-H": "HH",
+ "months-standAlone-abbr": [
+ "Muh.",
+ "Saf.",
+ "Rab. I",
+ "Rab. II",
+ "Jum. I",
+ "Jum. II",
+ "Raj.",
+ "Sha.",
+ "Ram.",
+ "Shaw.",
+ "Dhuʻl-Q.",
+ "Dhuʻl-H."
+ ],
+ "quarters-format-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "quarters-standAlone-wide": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "eraAbbr": [
+ "AH"
+ ],
+ "days-standAlone-abbr": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "quarters-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4"
+ ],
+ "dateFormatItem-h": "h a",
+ "dateTimeFormat-long": "{1} {0}",
+ "dayPeriods-format-narrow-am": "AM",
+ "dateFormatItem-MMMd": "MMM d",
+ "dateFormatItem-MEd": "E, M-d",
+ "dateTimeFormat-full": "{1} {0}",
+ "days-format-wide": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "dateTimeFormats-appendItem-Day": "{0} ({2}: {1})",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dateFormatItem-hm": "h:mm a",
+ "dateTimeFormats-appendItem-Year": "{0} {1}",
+ "dateTimeFormats-appendItem-Hour": "{0} ({2}: {1})",
+ "dayPeriods-format-abbr-pm": "PM",
+ "days-format-abbr": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "eraNames": [
+ "AH"
+ ],
+ "days-format-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "days-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dateTimeFormats-appendItem-Quarter": "{0} ({2}: {1})",
+ "dayPeriods-format-wide-am": "AM",
+ "dateTimeFormats-appendItem-Month": "{0} ({2}: {1})",
+ "dateTimeFormats-appendItem-Minute": "{0} ({2}: {1})",
+ "dateFormat-short": "yyyy-MM-dd",
+ "dateFormatItem-yMMMEd": "EEE, y MMM d",
+ "dateTimeFormats-appendItem-Timezone": "{0} {1}",
+ "dateFormat-medium": "y MMM d",
+ "dayPeriods-format-narrow-pm": "PM",
+ "dateTimeFormat-short": "{1} {0}",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-hms": "h:mm:ss a"
+}
+//end v1.x content
+,
+ "ar": true,
+ "da": true,
+ "de": true,
+ "en": true,
+ "en-gb": true,
+ "es": true,
+ "fi": true,
+ "fr": true,
+ "he": true,
+ "hu": true,
+ "it": true,
+ "nb": true,
+ "nl": true,
+ "pl": true,
+ "pt": true,
+ "pt-pt": true,
+ "ru": true,
+ "sv": true,
+ "th": true,
+ "tr": true,
+ "zh": true,
+ "zh-hant": true
+}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/it/currency.js b/lib/dojo/cldr/nls/it/currency.js
index 58b5b814c..b2ddd0e1e 100644
--- a/lib/dojo/cldr/nls/it/currency.js
+++ b/lib/dojo/cldr/nls/it/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Dollaro di Hong Kong","CHF_displayName":"Franco Svizzero","CAD_displayName":"Dollaro Canadese","CNY_displayName":"Renmimbi Cinese","AUD_displayName":"Dollaro Australiano","JPY_displayName":"Yen Giapponese","USD_displayName":"Dollaro Statunitense","GBP_displayName":"Sterlina Inglese","EUR_displayName":"Euro","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/it/currency",{"HKD_displayName":"Dollaro di Hong Kong","CHF_displayName":"Franco Svizzero","CAD_displayName":"Dollaro Canadese","CNY_displayName":"Renmimbi Cinese","AUD_displayName":"Dollaro Australiano","JPY_displayName":"Yen Giapponese","USD_displayName":"Dollaro Statunitense","GBP_displayName":"Sterlina Inglese","EUR_displayName":"Euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/it/currency.js.uncompressed.js b/lib/dojo/cldr/nls/it/currency.js.uncompressed.js
new file mode 100644
index 000000000..d000c19a8
--- /dev/null
+++ b/lib/dojo/cldr/nls/it/currency.js.uncompressed.js
@@ -0,0 +1,15 @@
+define(
+"dojo/cldr/nls/it/currency", //begin v1.x content
+{
+ "HKD_displayName": "Dollaro di Hong Kong",
+ "CHF_displayName": "Franco Svizzero",
+ "CAD_displayName": "Dollaro Canadese",
+ "CNY_displayName": "Renmimbi Cinese",
+ "AUD_displayName": "Dollaro Australiano",
+ "JPY_displayName": "Yen Giapponese",
+ "USD_displayName": "Dollaro Statunitense",
+ "GBP_displayName": "Sterlina Inglese",
+ "EUR_displayName": "Euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/it/gregorian.js b/lib/dojo/cldr/nls/it/gregorian.js
index 118b60b45..8024cd155 100644
--- a/lib/dojo/cldr/nls/it/gregorian.js
+++ b/lib/dojo/cldr/nls/it/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["G","F","M","A","M","G","L","A","S","O","N","D"],"field-weekday":"giorno della settimana","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE, d/M/y","dateFormatItem-MMMEd":"EEE d MMM","eraNarrow":["aC","dC"],"dateFormat-long":"dd MMMM y","months-format-wide":["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],"dayPeriods-format-wide-pm":"p.","dateFormat-full":"EEEE d MMMM y","dateFormatItem-Md":"d/M","field-era":"era","dateFormatItem-yM":"M/y","months-standAlone-wide":["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],"timeFormat-short":"HH:mm","quarters-format-wide":["1o trimestre","2o trimestre","3o trimestre","4o trimestre"],"timeFormat-long":"HH:mm:ss z","field-year":"anno","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q-yyyy","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"ora","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"oggi","field-day-relative+1":"domani","field-day-relative+2":"dopodomani","field-day-relative+3":"tra tre giorni","months-standAlone-abbr":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1o trimestre","2o trimestre","3o trimestre","4o trimestre"],"dateFormatItem-M":"L","days-standAlone-wide":["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],"timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["T1","T2","T3","T4"],"eraAbbr":["aC","dC"],"field-minute":"minuto","field-dayperiod":"periodo del giorno","days-standAlone-abbr":["dom","lun","mar","mer","gio","ven","sab"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"ieri","dateFormatItem-h":"hh a","field-day-relative+-2":"l'altro ieri","field-day-relative+-3":"tre giorni fa","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"EEE d/M","field-day":"giorno","days-format-wide":["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],"field-zone":"zona","dateFormatItem-y":"y","months-standAlone-narrow":["G","F","M","A","M","G","L","A","S","O","N","D"],"dateFormatItem-yyMM":"MM/yy","dateFormatItem-hm":"hh:mm a","days-format-abbr":["dom","lun","mar","mer","gio","ven","sab"],"eraNames":["a.C.","d.C"],"days-format-narrow":["D","L","M","M","G","V","S"],"field-month":"mese","days-standAlone-narrow":["D","L","M","M","G","V","S"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"m.","dateFormatItem-MMMMdd":"dd MMMM","dateFormat-short":"dd/MM/yy","field-second":"secondo","dateFormatItem-yMMMEd":"EEE d MMM y","dateFormatItem-Ed":"E d","field-week":"settimana","dateFormat-medium":"dd/MMM/y","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"hh:mm:ss a","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-narrow":["1","2","3","4"],"dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/it/gregorian",{"months-format-narrow":["G","F","M","A","M","G","L","A","S","O","N","D"],"field-weekday":"giorno della settimana","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE, d/M/y","dateFormatItem-MMMEd":"EEE d MMM","eraNarrow":["aC","dC"],"dateFormat-long":"dd MMMM y","months-format-wide":["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],"dayPeriods-format-wide-pm":"p.","dateFormat-full":"EEEE d MMMM y","dateFormatItem-Md":"d/M","field-era":"era","dateFormatItem-yM":"M/y","months-standAlone-wide":["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],"timeFormat-short":"HH:mm","quarters-format-wide":["1o trimestre","2o trimestre","3o trimestre","4o trimestre"],"timeFormat-long":"HH:mm:ss z","field-year":"anno","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q-yyyy","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"ora","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"oggi","field-day-relative+1":"domani","field-day-relative+2":"dopodomani","field-day-relative+3":"tra tre giorni","months-standAlone-abbr":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1o trimestre","2o trimestre","3o trimestre","4o trimestre"],"dateFormatItem-M":"L","days-standAlone-wide":["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],"timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["T1","T2","T3","T4"],"eraAbbr":["aC","dC"],"field-minute":"minuto","field-dayperiod":"periodo del giorno","days-standAlone-abbr":["dom","lun","mar","mer","gio","ven","sab"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"ieri","dateFormatItem-h":"hh a","field-day-relative+-2":"l'altro ieri","field-day-relative+-3":"tre giorni fa","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"EEE d/M","field-day":"giorno","days-format-wide":["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],"field-zone":"zona","dateFormatItem-y":"y","months-standAlone-narrow":["G","F","M","A","M","G","L","A","S","O","N","D"],"dateFormatItem-yyMM":"MM/yy","dateFormatItem-hm":"hh:mm a","days-format-abbr":["dom","lun","mar","mer","gio","ven","sab"],"eraNames":["a.C.","d.C"],"days-format-narrow":["D","L","M","M","G","V","S"],"field-month":"mese","days-standAlone-narrow":["D","L","M","M","G","V","S"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"m.","dateFormatItem-MMMMdd":"dd MMMM","dateFormat-short":"dd/MM/yy","field-second":"secondo","dateFormatItem-yMMMEd":"EEE d MMM y","dateFormatItem-Ed":"E d","field-week":"settimana","dateFormat-medium":"dd/MMM/y","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"hh:mm:ss a"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/it/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/it/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..fa7059285
--- /dev/null
+++ b/lib/dojo/cldr/nls/it/gregorian.js.uncompressed.js
@@ -0,0 +1,235 @@
+define(
+"dojo/cldr/nls/it/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "G",
+ "F",
+ "M",
+ "A",
+ "M",
+ "G",
+ "L",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "field-weekday": "giorno della settimana",
+ "dateFormatItem-yyQQQQ": "QQQQ yy",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yMEd": "EEE, d/M/y",
+ "dateFormatItem-MMMEd": "EEE d MMM",
+ "eraNarrow": [
+ "aC",
+ "dC"
+ ],
+ "dateFormat-long": "dd MMMM y",
+ "months-format-wide": [
+ "gennaio",
+ "febbraio",
+ "marzo",
+ "aprile",
+ "maggio",
+ "giugno",
+ "luglio",
+ "agosto",
+ "settembre",
+ "ottobre",
+ "novembre",
+ "dicembre"
+ ],
+ "dayPeriods-format-wide-pm": "p.",
+ "dateFormat-full": "EEEE d MMMM y",
+ "dateFormatItem-Md": "d/M",
+ "field-era": "era",
+ "dateFormatItem-yM": "M/y",
+ "months-standAlone-wide": [
+ "Gennaio",
+ "Febbraio",
+ "Marzo",
+ "Aprile",
+ "Maggio",
+ "Giugno",
+ "Luglio",
+ "Agosto",
+ "Settembre",
+ "Ottobre",
+ "Novembre",
+ "Dicembre"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "1o trimestre",
+ "2o trimestre",
+ "3o trimestre",
+ "4o trimestre"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "field-year": "anno",
+ "dateFormatItem-yMMM": "MMM y",
+ "dateFormatItem-yQ": "Q-yyyy",
+ "dateFormatItem-yyyyMMMM": "MMMM y",
+ "field-hour": "ora",
+ "dateFormatItem-MMdd": "dd/MM",
+ "months-format-abbr": [
+ "gen",
+ "feb",
+ "mar",
+ "apr",
+ "mag",
+ "giu",
+ "lug",
+ "ago",
+ "set",
+ "ott",
+ "nov",
+ "dic"
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "field-day-relative+0": "oggi",
+ "field-day-relative+1": "domani",
+ "field-day-relative+2": "dopodomani",
+ "field-day-relative+3": "tra tre giorni",
+ "months-standAlone-abbr": [
+ "gen",
+ "feb",
+ "mar",
+ "apr",
+ "mag",
+ "giu",
+ "lug",
+ "ago",
+ "set",
+ "ott",
+ "nov",
+ "dic"
+ ],
+ "quarters-format-abbr": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "quarters-standAlone-wide": [
+ "1o trimestre",
+ "2o trimestre",
+ "3o trimestre",
+ "4o trimestre"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "Domenica",
+ "Lunedì",
+ "Martedì",
+ "Mercoledì",
+ "Giovedì",
+ "Venerdì",
+ "Sabato"
+ ],
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "eraAbbr": [
+ "aC",
+ "dC"
+ ],
+ "field-minute": "minuto",
+ "field-dayperiod": "periodo del giorno",
+ "days-standAlone-abbr": [
+ "dom",
+ "lun",
+ "mar",
+ "mer",
+ "gio",
+ "ven",
+ "sab"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "ieri",
+ "dateFormatItem-h": "hh a",
+ "field-day-relative+-2": "l'altro ieri",
+ "field-day-relative+-3": "tre giorni fa",
+ "dateFormatItem-MMMd": "d MMM",
+ "dateFormatItem-MEd": "EEE d/M",
+ "field-day": "giorno",
+ "days-format-wide": [
+ "domenica",
+ "lunedì",
+ "martedì",
+ "mercoledì",
+ "giovedì",
+ "venerdì",
+ "sabato"
+ ],
+ "field-zone": "zona",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "G",
+ "F",
+ "M",
+ "A",
+ "M",
+ "G",
+ "L",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateFormatItem-yyMM": "MM/yy",
+ "dateFormatItem-hm": "hh:mm a",
+ "days-format-abbr": [
+ "dom",
+ "lun",
+ "mar",
+ "mer",
+ "gio",
+ "ven",
+ "sab"
+ ],
+ "eraNames": [
+ "a.C.",
+ "d.C"
+ ],
+ "days-format-narrow": [
+ "D",
+ "L",
+ "M",
+ "M",
+ "G",
+ "V",
+ "S"
+ ],
+ "field-month": "mese",
+ "days-standAlone-narrow": [
+ "D",
+ "L",
+ "M",
+ "M",
+ "G",
+ "V",
+ "S"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "m.",
+ "dateFormatItem-MMMMdd": "dd MMMM",
+ "dateFormat-short": "dd/MM/yy",
+ "field-second": "secondo",
+ "dateFormatItem-yMMMEd": "EEE d MMM y",
+ "dateFormatItem-Ed": "E d",
+ "field-week": "settimana",
+ "dateFormat-medium": "dd/MMM/y",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-hms": "hh:mm:ss a"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/it/number.js b/lib/dojo/cldr/nls/it/number.js
index 4fc6202a5..bf7f67616 100644
--- a/lib/dojo/cldr/nls/it/number.js
+++ b/lib/dojo/cldr/nls/it/number.js
@@ -1 +1,8 @@
-({"decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤ #,##0.00","decimal":",","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/it/number",{"decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤ #,##0.00","decimal":","}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/it/number.js.uncompressed.js b/lib/dojo/cldr/nls/it/number.js.uncompressed.js
new file mode 100644
index 000000000..813c505a0
--- /dev/null
+++ b/lib/dojo/cldr/nls/it/number.js.uncompressed.js
@@ -0,0 +1,12 @@
+define(
+"dojo/cldr/nls/it/number", //begin v1.x content
+{
+ "decimalFormat": "#,##0.###",
+ "group": ".",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "currencyFormat": "¤ #,##0.00",
+ "decimal": ","
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ja/currency.js b/lib/dojo/cldr/nls/ja/currency.js
index 076cd8de4..49f102bb9 100644
--- a/lib/dojo/cldr/nls/ja/currency.js
+++ b/lib/dojo/cldr/nls/ja/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"香港ドル","CHF_displayName":"スイス フラン","JPY_symbol":"¥","CAD_displayName":"カナダ ドル","CNY_displayName":"中国人民元","USD_symbol":"$","AUD_displayName":"オーストラリア ドル","JPY_displayName":"日本円","USD_displayName":"米ドル","CNY_symbol":"元","GBP_displayName":"英国ポンド","EUR_displayName":"ユーロ","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","AUD_symbol":"AU$","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ja/currency",{"HKD_displayName":"香港ドル","CHF_displayName":"スイス フラン","JPY_symbol":"¥","CAD_displayName":"カナダ ドル","CNY_displayName":"中国人民元","USD_symbol":"$","AUD_displayName":"オーストラリア ドル","JPY_displayName":"日本円","USD_displayName":"米ドル","CNY_symbol":"元","GBP_displayName":"英国ポンド","EUR_displayName":"ユーロ"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ja/currency.js.uncompressed.js b/lib/dojo/cldr/nls/ja/currency.js.uncompressed.js
new file mode 100644
index 000000000..de21079c7
--- /dev/null
+++ b/lib/dojo/cldr/nls/ja/currency.js.uncompressed.js
@@ -0,0 +1,18 @@
+define(
+"dojo/cldr/nls/ja/currency", //begin v1.x content
+{
+ "HKD_displayName": "香港ドル",
+ "CHF_displayName": "スイス フラン",
+ "JPY_symbol": "¥",
+ "CAD_displayName": "カナダ ドル",
+ "CNY_displayName": "中国人民元",
+ "USD_symbol": "$",
+ "AUD_displayName": "オーストラリア ドル",
+ "JPY_displayName": "日本円",
+ "USD_displayName": "米ドル",
+ "CNY_symbol": "元",
+ "GBP_displayName": "英国ポンド",
+ "EUR_displayName": "ユーロ"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ja/gregorian.js b/lib/dojo/cldr/nls/ja/gregorian.js
index faea6fc9b..0a8557d07 100644
--- a/lib/dojo/cldr/nls/ja/gregorian.js
+++ b/lib/dojo/cldr/nls/ja/gregorian.js
@@ -1 +1,8 @@
-({"field-weekday":"曜日","dateFormatItem-yQQQ":"yQQQ","dateFormatItem-yMEd":"y/M/d(EEE)","dateFormatItem-MMMEd":"M月d日(E)","eraNarrow":["BC","AD"],"dateFormat-long":"y年M月d日","months-format-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"午後","dateFormat-full":"y年M月d日EEEE","dateFormatItem-Md":"M/d","dateFormatItem-yMd":"y/M/d","field-era":"時代","dateFormatItem-yM":"y/M","months-standAlone-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"timeFormat-short":"H:mm","quarters-format-wide":["第1四半期","第2四半期","第3四半期","第4四半期"],"timeFormat-long":"H:mm:ss z","field-year":"年","dateFormatItem-yMMM":"y年M月","dateFormatItem-yQ":"y/Q","field-hour":"時","dateFormatItem-MMdd":"MM/dd","months-format-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-yyQ":"yy/Q","timeFormat-full":"H時mm分ss秒 zzzz","field-day-relative+0":"今日","field-day-relative+1":"明日","field-day-relative+2":"明後日","dateFormatItem-H":"H時","field-day-relative+3":"3日後","months-standAlone-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["第1四半期","第2四半期","第3四半期","第4四半期"],"dateFormatItem-M":"M月","days-standAlone-wide":["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],"dateFormatItem-yyMMM":"y年M月","timeFormat-medium":"H:mm:ss","dateFormatItem-Hm":"H:mm","eraAbbr":["BC","AD"],"field-minute":"分","field-dayperiod":"午前/午後","days-standAlone-abbr":["日","月","火","水","木","金","土"],"dateFormatItem-d":"d日","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"昨日","dateFormatItem-h":"ah時","dateTimeFormat-long":"{1}{0}","field-day-relative+-2":"一昨日","field-day-relative+-3":"3日前","dateFormatItem-MMMd":"M月d日","dateFormatItem-MEd":"M/d(E)","dateTimeFormat-full":"{1}{0}","field-day":"日","days-format-wide":["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],"field-zone":"タイムゾーン","dateFormatItem-yyyyMM":"yyyy/MM","dateFormatItem-y":"y年","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-hm":"ah:mm","dateFormatItem-GGGGyMd":"GGGGy年M月d日","days-format-abbr":["日","月","火","水","木","金","土"],"dateFormatItem-yMMMd":"y年M月d日","eraNames":["紀元前","西暦"],"days-format-narrow":["日","月","火","水","木","金","土"],"field-month":"月","days-standAlone-narrow":["日","月","火","水","木","金","土"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"午前","dateFormat-short":"yy/MM/dd","field-second":"秒","dateFormatItem-yMMMEd":"y年M月d日(EEE)","dateFormatItem-Ed":"d日(EEE)","field-week":"週","dateFormat-medium":"yyyy/MM/dd","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"ah:mm:ss","dateFormatItem-yyyy":"y年","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ja/gregorian",{"field-weekday":"曜日","dateFormatItem-yQQQ":"yQQQ","dateFormatItem-yMEd":"y/M/d(EEE)","dateFormatItem-MMMEd":"M月d日(E)","eraNarrow":["BC","AD"],"dateFormat-long":"y年M月d日","months-format-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"午後","dateFormat-full":"y年M月d日EEEE","dateFormatItem-Md":"M/d","dateFormatItem-yMd":"y/M/d","field-era":"時代","dateFormatItem-yM":"y/M","months-standAlone-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"timeFormat-short":"H:mm","quarters-format-wide":["第1四半期","第2四半期","第3四半期","第4四半期"],"timeFormat-long":"H:mm:ss z","field-year":"年","dateFormatItem-yMMM":"y年M月","dateFormatItem-yQ":"y/Q","field-hour":"時","dateFormatItem-MMdd":"MM/dd","months-format-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-yyQ":"yy/Q","timeFormat-full":"H時mm分ss秒 zzzz","field-day-relative+0":"今日","field-day-relative+1":"明日","field-day-relative+2":"明後日","dateFormatItem-H":"H時","field-day-relative+3":"3日後","months-standAlone-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["第1四半期","第2四半期","第3四半期","第4四半期"],"dateFormatItem-M":"M月","days-standAlone-wide":["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],"dateFormatItem-yyMMM":"y年M月","timeFormat-medium":"H:mm:ss","dateFormatItem-Hm":"H:mm","eraAbbr":["BC","AD"],"field-minute":"分","field-dayperiod":"午前/午後","days-standAlone-abbr":["日","月","火","水","木","金","土"],"dateFormatItem-d":"d日","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"昨日","dateFormatItem-h":"ah時","dateTimeFormat-long":"{1}{0}","field-day-relative+-2":"一昨日","field-day-relative+-3":"3日前","dateFormatItem-MMMd":"M月d日","dateFormatItem-MEd":"M/d(E)","dateTimeFormat-full":"{1}{0}","field-day":"日","days-format-wide":["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],"field-zone":"タイムゾーン","dateFormatItem-yyyyMM":"yyyy/MM","dateFormatItem-y":"y年","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-hm":"ah:mm","dateFormatItem-GGGGyMd":"GGGGy年M月d日","days-format-abbr":["日","月","火","水","木","金","土"],"dateFormatItem-yMMMd":"y年M月d日","eraNames":["紀元前","西暦"],"days-format-narrow":["日","月","火","水","木","金","土"],"field-month":"月","days-standAlone-narrow":["日","月","火","水","木","金","土"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"午前","dateFormat-short":"yy/MM/dd","field-second":"秒","dateFormatItem-yMMMEd":"y年M月d日(EEE)","dateFormatItem-Ed":"d日(EEE)","field-week":"週","dateFormat-medium":"yyyy/MM/dd","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"ah:mm:ss","dateFormatItem-yyyy":"y年"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ja/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/ja/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..a96b5bf9d
--- /dev/null
+++ b/lib/dojo/cldr/nls/ja/gregorian.js.uncompressed.js
@@ -0,0 +1,222 @@
+define(
+"dojo/cldr/nls/ja/gregorian", //begin v1.x content
+{
+ "field-weekday": "曜日",
+ "dateFormatItem-yQQQ": "yQQQ",
+ "dateFormatItem-yMEd": "y/M/d(EEE)",
+ "dateFormatItem-MMMEd": "M月d日(E)",
+ "eraNarrow": [
+ "BC",
+ "AD"
+ ],
+ "dateFormat-long": "y年M月d日",
+ "months-format-wide": [
+ "1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月"
+ ],
+ "dateTimeFormat-medium": "{1} {0}",
+ "dayPeriods-format-wide-pm": "午後",
+ "dateFormat-full": "y年M月d日EEEE",
+ "dateFormatItem-Md": "M/d",
+ "dateFormatItem-yMd": "y/M/d",
+ "field-era": "時代",
+ "dateFormatItem-yM": "y/M",
+ "months-standAlone-wide": [
+ "1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月"
+ ],
+ "timeFormat-short": "H:mm",
+ "quarters-format-wide": [
+ "第1四半期",
+ "第2四半期",
+ "第3四半期",
+ "第4四半期"
+ ],
+ "timeFormat-long": "H:mm:ss z",
+ "field-year": "年",
+ "dateFormatItem-yMMM": "y年M月",
+ "dateFormatItem-yQ": "y/Q",
+ "field-hour": "時",
+ "dateFormatItem-MMdd": "MM/dd",
+ "months-format-abbr": [
+ "1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月"
+ ],
+ "dateFormatItem-yyQ": "yy/Q",
+ "timeFormat-full": "H時mm分ss秒 zzzz",
+ "field-day-relative+0": "今日",
+ "field-day-relative+1": "明日",
+ "field-day-relative+2": "明後日",
+ "dateFormatItem-H": "H時",
+ "field-day-relative+3": "3日後",
+ "months-standAlone-abbr": [
+ "1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月"
+ ],
+ "quarters-format-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "quarters-standAlone-wide": [
+ "第1四半期",
+ "第2四半期",
+ "第3四半期",
+ "第4四半期"
+ ],
+ "dateFormatItem-M": "M月",
+ "days-standAlone-wide": [
+ "日曜日",
+ "月曜日",
+ "火曜日",
+ "水曜日",
+ "木曜日",
+ "金曜日",
+ "土曜日"
+ ],
+ "dateFormatItem-yyMMM": "y年M月",
+ "timeFormat-medium": "H:mm:ss",
+ "dateFormatItem-Hm": "H:mm",
+ "eraAbbr": [
+ "BC",
+ "AD"
+ ],
+ "field-minute": "分",
+ "field-dayperiod": "午前/午後",
+ "days-standAlone-abbr": [
+ "日",
+ "月",
+ "火",
+ "水",
+ "木",
+ "金",
+ "土"
+ ],
+ "dateFormatItem-d": "d日",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "昨日",
+ "dateFormatItem-h": "ah時",
+ "dateTimeFormat-long": "{1}{0}",
+ "field-day-relative+-2": "一昨日",
+ "field-day-relative+-3": "3日前",
+ "dateFormatItem-MMMd": "M月d日",
+ "dateFormatItem-MEd": "M/d(E)",
+ "dateTimeFormat-full": "{1}{0}",
+ "field-day": "日",
+ "days-format-wide": [
+ "日曜日",
+ "月曜日",
+ "火曜日",
+ "水曜日",
+ "木曜日",
+ "金曜日",
+ "土曜日"
+ ],
+ "field-zone": "タイムゾーン",
+ "dateFormatItem-yyyyMM": "yyyy/MM",
+ "dateFormatItem-y": "y年",
+ "months-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dateFormatItem-hm": "ah:mm",
+ "dateFormatItem-GGGGyMd": "GGGGy年M月d日",
+ "days-format-abbr": [
+ "日",
+ "月",
+ "火",
+ "水",
+ "木",
+ "金",
+ "土"
+ ],
+ "dateFormatItem-yMMMd": "y年M月d日",
+ "eraNames": [
+ "紀元前",
+ "西暦"
+ ],
+ "days-format-narrow": [
+ "日",
+ "月",
+ "火",
+ "水",
+ "木",
+ "金",
+ "土"
+ ],
+ "field-month": "月",
+ "days-standAlone-narrow": [
+ "日",
+ "月",
+ "火",
+ "水",
+ "木",
+ "金",
+ "土"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "午前",
+ "dateFormat-short": "yy/MM/dd",
+ "field-second": "秒",
+ "dateFormatItem-yMMMEd": "y年M月d日(EEE)",
+ "dateFormatItem-Ed": "d日(EEE)",
+ "field-week": "週",
+ "dateFormat-medium": "yyyy/MM/dd",
+ "dateTimeFormat-short": "{1} {0}",
+ "dateFormatItem-Hms": "H:mm:ss",
+ "dateFormatItem-hms": "ah:mm:ss",
+ "dateFormatItem-yyyy": "y年"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ja/number.js b/lib/dojo/cldr/nls/ja/number.js
index dbde35c64..07b16c6ee 100644
--- a/lib/dojo/cldr/nls/ja/number.js
+++ b/lib/dojo/cldr/nls/ja/number.js
@@ -1 +1,8 @@
-({"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ja/number",{"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":"."}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ja/number.js.uncompressed.js b/lib/dojo/cldr/nls/ja/number.js.uncompressed.js
new file mode 100644
index 000000000..748649e3f
--- /dev/null
+++ b/lib/dojo/cldr/nls/ja/number.js.uncompressed.js
@@ -0,0 +1,12 @@
+define(
+"dojo/cldr/nls/ja/number", //begin v1.x content
+{
+ "decimalFormat": "#,##0.###",
+ "group": ",",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "currencyFormat": "¤#,##0.00",
+ "decimal": "."
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ko/currency.js b/lib/dojo/cldr/nls/ko/currency.js
index 5185f3e4c..006984e19 100644
--- a/lib/dojo/cldr/nls/ko/currency.js
+++ b/lib/dojo/cldr/nls/ko/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"홍콩 달러","CHF_displayName":"스위스 프랑","CAD_displayName":"캐나다 달러","CNY_displayName":"중국 위안 인민폐","AUD_displayName":"호주 달러","JPY_displayName":"일본 엔화","USD_displayName":"미국 달러","GBP_displayName":"영국령 파운드 스털링","EUR_displayName":"유로화","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ko/currency",{"HKD_displayName":"홍콩 달러","CHF_displayName":"스위스 프랑","CAD_displayName":"캐나다 달러","CNY_displayName":"중국 위안 인민폐","AUD_displayName":"호주 달러","JPY_displayName":"일본 엔화","USD_displayName":"미국 달러","GBP_displayName":"영국령 파운드 스털링","EUR_displayName":"유로화"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ko/currency.js.uncompressed.js b/lib/dojo/cldr/nls/ko/currency.js.uncompressed.js
new file mode 100644
index 000000000..1c53c6cf7
--- /dev/null
+++ b/lib/dojo/cldr/nls/ko/currency.js.uncompressed.js
@@ -0,0 +1,15 @@
+define(
+"dojo/cldr/nls/ko/currency", //begin v1.x content
+{
+ "HKD_displayName": "홍콩 달러",
+ "CHF_displayName": "스위스 프랑",
+ "CAD_displayName": "캐나다 달러",
+ "CNY_displayName": "중국 위안 인민폐",
+ "AUD_displayName": "호주 달러",
+ "JPY_displayName": "일본 엔화",
+ "USD_displayName": "미국 달러",
+ "GBP_displayName": "영국령 파운드 스털링",
+ "EUR_displayName": "유로화"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ko/gregorian.js b/lib/dojo/cldr/nls/ko/gregorian.js
index 8f52d1c6f..2937e73a0 100644
--- a/lib/dojo/cldr/nls/ko/gregorian.js
+++ b/lib/dojo/cldr/nls/ko/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"field-weekday":"요일","dateFormatItem-yQQQ":"y년 QQQ","dateFormatItem-yMEd":"yyyy. M. d. EEE","dateFormatItem-MMMEd":"MMM d일 (E)","eraNarrow":["기원전","서기"],"dateFormat-long":"y년 M월 d일","months-format-wide":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d일 EEE","dayPeriods-format-wide-pm":"오후","dateFormat-full":"y년 M월 d일 EEEE","dateFormatItem-Md":"M. d.","field-era":"연호","dateFormatItem-yM":"yyyy. M.","months-standAlone-wide":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"timeFormat-short":"a h:mm","quarters-format-wide":["제 1/4분기","제 2/4분기","제 3/4분기","제 4/4분기"],"timeFormat-long":"a h시 m분 s초 z","field-year":"년","dateFormatItem-yMMM":"y년 MMM","dateFormatItem-yQ":"y년 Q분기","field-hour":"시","dateFormatItem-MMdd":"MM. dd","months-format-abbr":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"dateFormatItem-yyQ":"yy년 Q분기","timeFormat-full":"a h시 m분 s초 zzzz","field-day-relative+0":"오늘","field-day-relative+1":"내일","field-day-relative+2":"모레","dateFormatItem-H":"H시","field-day-relative+3":"3일후","months-standAlone-abbr":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"quarters-format-abbr":["1분기","2분기","3분기","4분기"],"quarters-standAlone-wide":["제 1/4분기","제 2/4분기","제 3/4분기","제 4/4분기"],"dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-M":"M월","days-standAlone-wide":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"dateFormatItem-yyMMM":"yy년 MMM","timeFormat-medium":"a h:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["1분기","2분기","3분기","4분기"],"eraAbbr":["기원전","서기"],"field-minute":"분","field-dayperiod":"오전/오후","days-standAlone-abbr":["일","월","화","수","목","금","토"],"dateFormatItem-d":"d일","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"어제","dateFormatItem-h":"a h시","dateTimeFormat-long":"{1} {0}","field-day-relative+-2":"그저께","field-day-relative+-3":"그끄제","dateFormatItem-MMMd":"MMM d일","dateFormatItem-MEd":"M. d. (E)","dateTimeFormat-full":"{1} {0}","field-day":"일","days-format-wide":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"field-zone":"시간대","dateFormatItem-yyyyMM":"yyyy. MM","dateFormatItem-y":"y년","months-standAlone-narrow":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"dateFormatItem-yyMM":"YY. M.","dateFormatItem-hm":"a h:mm","days-format-abbr":["일","월","화","수","목","금","토"],"dateFormatItem-yMMMd":"y년 MMM d일","eraNames":["서력기원전","서력기원"],"days-format-narrow":["일","월","화","수","목","금","토"],"field-month":"월","days-standAlone-narrow":["일","월","화","수","목","금","토"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"오전","dateFormat-short":"yy. M. d.","field-second":"초","dateFormatItem-yMMMEd":"y년 MMM d일 EEE","dateFormatItem-Ed":"d일 (E)","field-week":"주","dateFormat-medium":"yyyy. M. d.","dateFormatItem-mmss":"mm:ss","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H시 m분 s초","dateFormatItem-hms":"a h:mm:ss","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ko/gregorian",{"months-format-narrow":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"field-weekday":"요일","dateFormatItem-yQQQ":"y년 QQQ","dateFormatItem-yMEd":"yyyy. M. d. EEE","dateFormatItem-MMMEd":"MMM d일 (E)","eraNarrow":["기원전","서기"],"dateFormat-long":"y년 M월 d일","months-format-wide":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d일 EEE","dayPeriods-format-wide-pm":"오후","dateFormat-full":"y년 M월 d일 EEEE","dateFormatItem-Md":"M. d.","field-era":"연호","dateFormatItem-yM":"yyyy. M.","months-standAlone-wide":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"timeFormat-short":"a h:mm","quarters-format-wide":["제 1/4분기","제 2/4분기","제 3/4분기","제 4/4분기"],"timeFormat-long":"a h시 m분 s초 z","field-year":"년","dateFormatItem-yMMM":"y년 MMM","dateFormatItem-yQ":"y년 Q분기","field-hour":"시","dateFormatItem-MMdd":"MM. dd","months-format-abbr":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"dateFormatItem-yyQ":"yy년 Q분기","timeFormat-full":"a h시 m분 s초 zzzz","field-day-relative+0":"오늘","field-day-relative+1":"내일","field-day-relative+2":"모레","dateFormatItem-H":"H시","field-day-relative+3":"3일후","months-standAlone-abbr":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"quarters-format-abbr":["1분기","2분기","3분기","4분기"],"quarters-standAlone-wide":["제 1/4분기","제 2/4분기","제 3/4분기","제 4/4분기"],"dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-M":"M월","days-standAlone-wide":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"dateFormatItem-yyMMM":"yy년 MMM","timeFormat-medium":"a h:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["1분기","2분기","3분기","4분기"],"eraAbbr":["기원전","서기"],"field-minute":"분","field-dayperiod":"오전/오후","days-standAlone-abbr":["일","월","화","수","목","금","토"],"dateFormatItem-d":"d일","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"어제","dateFormatItem-h":"a h시","dateTimeFormat-long":"{1} {0}","field-day-relative+-2":"그저께","field-day-relative+-3":"그끄제","dateFormatItem-MMMd":"MMM d일","dateFormatItem-MEd":"M. d. (E)","dateTimeFormat-full":"{1} {0}","field-day":"일","days-format-wide":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"field-zone":"시간대","dateFormatItem-yyyyMM":"yyyy. MM","dateFormatItem-y":"y년","months-standAlone-narrow":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"dateFormatItem-yyMM":"YY. M.","dateFormatItem-hm":"a h:mm","days-format-abbr":["일","월","화","수","목","금","토"],"dateFormatItem-yMMMd":"y년 MMM d일","eraNames":["서력기원전","서력기원"],"days-format-narrow":["일","월","화","수","목","금","토"],"field-month":"월","days-standAlone-narrow":["일","월","화","수","목","금","토"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"오전","dateFormat-short":"yy. M. d.","field-second":"초","dateFormatItem-yMMMEd":"y년 MMM d일 EEE","dateFormatItem-Ed":"d일 (E)","field-week":"주","dateFormat-medium":"yyyy. M. d.","dateFormatItem-mmss":"mm:ss","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H시 m분 s초","dateFormatItem-hms":"a h:mm:ss"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ko/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/ko/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..9820eef4f
--- /dev/null
+++ b/lib/dojo/cldr/nls/ko/gregorian.js.uncompressed.js
@@ -0,0 +1,243 @@
+define(
+"dojo/cldr/nls/ko/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "1월",
+ "2월",
+ "3월",
+ "4월",
+ "5월",
+ "6월",
+ "7월",
+ "8월",
+ "9월",
+ "10월",
+ "11월",
+ "12월"
+ ],
+ "field-weekday": "요일",
+ "dateFormatItem-yQQQ": "y년 QQQ",
+ "dateFormatItem-yMEd": "yyyy. M. d. EEE",
+ "dateFormatItem-MMMEd": "MMM d일 (E)",
+ "eraNarrow": [
+ "기원전",
+ "서기"
+ ],
+ "dateFormat-long": "y년 M월 d일",
+ "months-format-wide": [
+ "1월",
+ "2월",
+ "3월",
+ "4월",
+ "5월",
+ "6월",
+ "7월",
+ "8월",
+ "9월",
+ "10월",
+ "11월",
+ "12월"
+ ],
+ "dateTimeFormat-medium": "{1} {0}",
+ "dateFormatItem-EEEd": "d일 EEE",
+ "dayPeriods-format-wide-pm": "오후",
+ "dateFormat-full": "y년 M월 d일 EEEE",
+ "dateFormatItem-Md": "M. d.",
+ "field-era": "연호",
+ "dateFormatItem-yM": "yyyy. M.",
+ "months-standAlone-wide": [
+ "1월",
+ "2월",
+ "3월",
+ "4월",
+ "5월",
+ "6월",
+ "7월",
+ "8월",
+ "9월",
+ "10월",
+ "11월",
+ "12월"
+ ],
+ "timeFormat-short": "a h:mm",
+ "quarters-format-wide": [
+ "제 1/4분기",
+ "제 2/4분기",
+ "제 3/4분기",
+ "제 4/4분기"
+ ],
+ "timeFormat-long": "a h시 m분 s초 z",
+ "field-year": "년",
+ "dateFormatItem-yMMM": "y년 MMM",
+ "dateFormatItem-yQ": "y년 Q분기",
+ "field-hour": "시",
+ "dateFormatItem-MMdd": "MM. dd",
+ "months-format-abbr": [
+ "1월",
+ "2월",
+ "3월",
+ "4월",
+ "5월",
+ "6월",
+ "7월",
+ "8월",
+ "9월",
+ "10월",
+ "11월",
+ "12월"
+ ],
+ "dateFormatItem-yyQ": "yy년 Q분기",
+ "timeFormat-full": "a h시 m분 s초 zzzz",
+ "field-day-relative+0": "오늘",
+ "field-day-relative+1": "내일",
+ "field-day-relative+2": "모레",
+ "dateFormatItem-H": "H시",
+ "field-day-relative+3": "3일후",
+ "months-standAlone-abbr": [
+ "1월",
+ "2월",
+ "3월",
+ "4월",
+ "5월",
+ "6월",
+ "7월",
+ "8월",
+ "9월",
+ "10월",
+ "11월",
+ "12월"
+ ],
+ "quarters-format-abbr": [
+ "1분기",
+ "2분기",
+ "3분기",
+ "4분기"
+ ],
+ "quarters-standAlone-wide": [
+ "제 1/4분기",
+ "제 2/4분기",
+ "제 3/4분기",
+ "제 4/4분기"
+ ],
+ "dateFormatItem-HHmmss": "HH:mm:ss",
+ "dateFormatItem-M": "M월",
+ "days-standAlone-wide": [
+ "일요일",
+ "월요일",
+ "화요일",
+ "수요일",
+ "목요일",
+ "금요일",
+ "토요일"
+ ],
+ "dateFormatItem-yyMMM": "yy년 MMM",
+ "timeFormat-medium": "a h:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "1분기",
+ "2분기",
+ "3분기",
+ "4분기"
+ ],
+ "eraAbbr": [
+ "기원전",
+ "서기"
+ ],
+ "field-minute": "분",
+ "field-dayperiod": "오전/오후",
+ "days-standAlone-abbr": [
+ "일",
+ "월",
+ "화",
+ "수",
+ "목",
+ "금",
+ "토"
+ ],
+ "dateFormatItem-d": "d일",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "어제",
+ "dateFormatItem-h": "a h시",
+ "dateTimeFormat-long": "{1} {0}",
+ "field-day-relative+-2": "그저께",
+ "field-day-relative+-3": "그끄제",
+ "dateFormatItem-MMMd": "MMM d일",
+ "dateFormatItem-MEd": "M. d. (E)",
+ "dateTimeFormat-full": "{1} {0}",
+ "field-day": "일",
+ "days-format-wide": [
+ "일요일",
+ "월요일",
+ "화요일",
+ "수요일",
+ "목요일",
+ "금요일",
+ "토요일"
+ ],
+ "field-zone": "시간대",
+ "dateFormatItem-yyyyMM": "yyyy. MM",
+ "dateFormatItem-y": "y년",
+ "months-standAlone-narrow": [
+ "1월",
+ "2월",
+ "3월",
+ "4월",
+ "5월",
+ "6월",
+ "7월",
+ "8월",
+ "9월",
+ "10월",
+ "11월",
+ "12월"
+ ],
+ "dateFormatItem-yyMM": "YY. M.",
+ "dateFormatItem-hm": "a h:mm",
+ "days-format-abbr": [
+ "일",
+ "월",
+ "화",
+ "수",
+ "목",
+ "금",
+ "토"
+ ],
+ "dateFormatItem-yMMMd": "y년 MMM d일",
+ "eraNames": [
+ "서력기원전",
+ "서력기원"
+ ],
+ "days-format-narrow": [
+ "일",
+ "월",
+ "화",
+ "수",
+ "목",
+ "금",
+ "토"
+ ],
+ "field-month": "월",
+ "days-standAlone-narrow": [
+ "일",
+ "월",
+ "화",
+ "수",
+ "목",
+ "금",
+ "토"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "오전",
+ "dateFormat-short": "yy. M. d.",
+ "field-second": "초",
+ "dateFormatItem-yMMMEd": "y년 MMM d일 EEE",
+ "dateFormatItem-Ed": "d일 (E)",
+ "field-week": "주",
+ "dateFormat-medium": "yyyy. M. d.",
+ "dateFormatItem-mmss": "mm:ss",
+ "dateTimeFormat-short": "{1} {0}",
+ "dateFormatItem-Hms": "H시 m분 s초",
+ "dateFormatItem-hms": "a h:mm:ss"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ko/number.js b/lib/dojo/cldr/nls/ko/number.js
index 70be2f666..746274dad 100644
--- a/lib/dojo/cldr/nls/ko/number.js
+++ b/lib/dojo/cldr/nls/ko/number.js
@@ -1 +1,8 @@
-({"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ko/number",{"group":",","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0%","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ko/number.js.uncompressed.js b/lib/dojo/cldr/nls/ko/number.js.uncompressed.js
new file mode 100644
index 000000000..b010f19b5
--- /dev/null
+++ b/lib/dojo/cldr/nls/ko/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/ko/number", //begin v1.x content
+{
+ "group": ",",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ".",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "¤#,##0.00",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/nb/currency.js b/lib/dojo/cldr/nls/nb/currency.js
index 88fcff8df..5aef21785 100644
--- a/lib/dojo/cldr/nls/nb/currency.js
+++ b/lib/dojo/cldr/nls/nb/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Hongkong-dollar","CHF_displayName":"sveitsiske franc","CHF_symbol":"CHF","JPY_symbol":"JPY","CAD_displayName":"kanadiske dollar","CNY_displayName":"kinesiske yuan renminbi","USD_symbol":"USD","AUD_displayName":"australske dollar","JPY_displayName":"japanske yen","CAD_symbol":"CAD","USD_displayName":"amerikanske dollar","EUR_symbol":"EUR","CNY_symbol":"CNY","GBP_displayName":"britiske pund sterling","GBP_symbol":"GBP","AUD_symbol":"AUD","EUR_displayName":"euro","HKD_symbol":"HK$"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/nb/currency",{"HKD_displayName":"Hongkong-dollar","CHF_displayName":"sveitsiske franc","CHF_symbol":"CHF","JPY_symbol":"JPY","CAD_displayName":"kanadiske dollar","CNY_displayName":"kinesiske yuan renminbi","USD_symbol":"USD","AUD_displayName":"australske dollar","JPY_displayName":"japanske yen","CAD_symbol":"CAD","USD_displayName":"amerikanske dollar","EUR_symbol":"EUR","CNY_symbol":"CNY","GBP_displayName":"britiske pund sterling","GBP_symbol":"GBP","AUD_symbol":"AUD","EUR_displayName":"euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/nb/currency.js.uncompressed.js b/lib/dojo/cldr/nls/nb/currency.js.uncompressed.js
new file mode 100644
index 000000000..5b98b047d
--- /dev/null
+++ b/lib/dojo/cldr/nls/nb/currency.js.uncompressed.js
@@ -0,0 +1,23 @@
+define(
+"dojo/cldr/nls/nb/currency", //begin v1.x content
+{
+ "HKD_displayName": "Hongkong-dollar",
+ "CHF_displayName": "sveitsiske franc",
+ "CHF_symbol": "CHF",
+ "JPY_symbol": "JPY",
+ "CAD_displayName": "kanadiske dollar",
+ "CNY_displayName": "kinesiske yuan renminbi",
+ "USD_symbol": "USD",
+ "AUD_displayName": "australske dollar",
+ "JPY_displayName": "japanske yen",
+ "CAD_symbol": "CAD",
+ "USD_displayName": "amerikanske dollar",
+ "EUR_symbol": "EUR",
+ "CNY_symbol": "CNY",
+ "GBP_displayName": "britiske pund sterling",
+ "GBP_symbol": "GBP",
+ "AUD_symbol": "AUD",
+ "EUR_displayName": "euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/nb/gregorian.js b/lib/dojo/cldr/nls/nb/gregorian.js
index 409a7cc48..a2366bb52 100644
--- a/lib/dojo/cldr/nls/nb/gregorian.js
+++ b/lib/dojo/cldr/nls/nb/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"ukedag","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d.M.yyyy","dateFormatItem-MMMEd":"E d. MMM","eraNarrow":["f.Kr.","e.Kr."],"dateFormat-long":"d. MMMM y","months-format-wide":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"dateFormatItem-EEEd":"EEE d.","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d. MMMM y","dateFormatItem-Md":"d.M.","field-era":"tidsalder","dateFormatItem-yM":"M y","months-standAlone-wide":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"timeFormat-short":"HH:mm","quarters-format-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"timeFormat-long":"HH:mm:ss z","field-year":"år","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q yyyy","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"time","dateFormatItem-MMdd":"dd.MM","months-format-abbr":["jan.","feb.","mars","apr.","mai","juni","juli","aug.","sep.","okt.","nov.","des."],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"'kl'. HH:mm:ss zzzz","field-day-relative+0":"i dag","field-day-relative+1":"i morgen","field-day-relative+2":"i overmorgen","field-day-relative+3":"i overovermorgen","months-standAlone-abbr":["jan.","feb.","mars","apr.","mai","juni","juli","aug.","sep.","okt.","nov.","des."],"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"dateFormatItem-M":"L","days-standAlone-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["K1","K2","K3","K4"],"eraAbbr":["f.Kr.","e.Kr."],"field-minute":"minutt","field-dayperiod":"AM/PM","days-standAlone-abbr":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"dateFormatItem-d":"d.","dateFormatItem-ms":"mm.ss","field-day-relative+-1":"i går","field-day-relative+-2":"i forgårs","field-day-relative+-3":"i forforgårs","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E d.M","field-day":"dag","days-format-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"field-zone":"sone","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM.yy","dateFormatItem-hm":"h:mm a","days-format-abbr":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"eraNames":["f.Kr.","e.Kr."],"days-format-narrow":["S","M","T","O","T","F","L"],"field-month":"måned","days-standAlone-narrow":["S","M","T","O","T","F","L"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"AM","dateFormat-short":"dd.MM.yy","field-second":"sekund","dateFormatItem-yMMMEd":"EEE d. MMM y","field-week":"uke","dateFormat-medium":"d. MMM y","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/nb/gregorian",{"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"ukedag","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d.M.yyyy","dateFormatItem-MMMEd":"E d. MMM","eraNarrow":["f.Kr.","e.Kr."],"dateFormat-long":"d. MMMM y","months-format-wide":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"dateFormatItem-EEEd":"EEE d.","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d. MMMM y","dateFormatItem-Md":"d.M.","field-era":"tidsalder","dateFormatItem-yM":"M y","months-standAlone-wide":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"timeFormat-short":"HH:mm","quarters-format-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"timeFormat-long":"HH:mm:ss z","field-year":"år","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q yyyy","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"time","dateFormatItem-MMdd":"dd.MM","months-format-abbr":["jan.","feb.","mars","apr.","mai","juni","juli","aug.","sep.","okt.","nov.","des."],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"'kl'. HH:mm:ss zzzz","field-day-relative+0":"i dag","field-day-relative+1":"i morgen","field-day-relative+2":"i overmorgen","field-day-relative+3":"i overovermorgen","months-standAlone-abbr":["jan.","feb.","mars","apr.","mai","juni","juli","aug.","sep.","okt.","nov.","des."],"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"dateFormatItem-M":"L","days-standAlone-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["K1","K2","K3","K4"],"eraAbbr":["f.Kr.","e.Kr."],"field-minute":"minutt","field-dayperiod":"AM/PM","days-standAlone-abbr":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"dateFormatItem-d":"d.","dateFormatItem-ms":"mm.ss","field-day-relative+-1":"i går","field-day-relative+-2":"i forgårs","field-day-relative+-3":"i forforgårs","dateFormatItem-MMMd":"d. MMM","dateFormatItem-MEd":"E d.M","field-day":"dag","days-format-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"field-zone":"sone","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM.yy","dateFormatItem-hm":"h:mm a","days-format-abbr":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"eraNames":["f.Kr.","e.Kr."],"days-format-narrow":["S","M","T","O","T","F","L"],"field-month":"måned","days-standAlone-narrow":["S","M","T","O","T","F","L"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"AM","dateFormat-short":"dd.MM.yy","field-second":"sekund","dateFormatItem-yMMMEd":"EEE d. MMM y","field-week":"uke","dateFormat-medium":"d. MMM y","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/nb/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/nb/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..96ea62977
--- /dev/null
+++ b/lib/dojo/cldr/nls/nb/gregorian.js.uncompressed.js
@@ -0,0 +1,234 @@
+define(
+"dojo/cldr/nls/nb/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "field-weekday": "ukedag",
+ "dateFormatItem-yyQQQQ": "QQQQ yy",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yMEd": "EEE d.M.yyyy",
+ "dateFormatItem-MMMEd": "E d. MMM",
+ "eraNarrow": [
+ "f.Kr.",
+ "e.Kr."
+ ],
+ "dateFormat-long": "d. MMMM y",
+ "months-format-wide": [
+ "januar",
+ "februar",
+ "mars",
+ "april",
+ "mai",
+ "juni",
+ "juli",
+ "august",
+ "september",
+ "oktober",
+ "november",
+ "desember"
+ ],
+ "dateFormatItem-EEEd": "EEE d.",
+ "dayPeriods-format-wide-pm": "PM",
+ "dateFormat-full": "EEEE d. MMMM y",
+ "dateFormatItem-Md": "d.M.",
+ "field-era": "tidsalder",
+ "dateFormatItem-yM": "M y",
+ "months-standAlone-wide": [
+ "januar",
+ "februar",
+ "mars",
+ "april",
+ "mai",
+ "juni",
+ "juli",
+ "august",
+ "september",
+ "oktober",
+ "november",
+ "desember"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "1. kvartal",
+ "2. kvartal",
+ "3. kvartal",
+ "4. kvartal"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "field-year": "år",
+ "dateFormatItem-yMMM": "MMM y",
+ "dateFormatItem-yQ": "Q yyyy",
+ "dateFormatItem-yyyyMMMM": "MMMM y",
+ "field-hour": "time",
+ "dateFormatItem-MMdd": "dd.MM",
+ "months-format-abbr": [
+ "jan.",
+ "feb.",
+ "mars",
+ "apr.",
+ "mai",
+ "juni",
+ "juli",
+ "aug.",
+ "sep.",
+ "okt.",
+ "nov.",
+ "des."
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "'kl'. HH:mm:ss zzzz",
+ "field-day-relative+0": "i dag",
+ "field-day-relative+1": "i morgen",
+ "field-day-relative+2": "i overmorgen",
+ "field-day-relative+3": "i overovermorgen",
+ "months-standAlone-abbr": [
+ "jan.",
+ "feb.",
+ "mars",
+ "apr.",
+ "mai",
+ "juni",
+ "juli",
+ "aug.",
+ "sep.",
+ "okt.",
+ "nov.",
+ "des."
+ ],
+ "quarters-format-abbr": [
+ "K1",
+ "K2",
+ "K3",
+ "K4"
+ ],
+ "quarters-standAlone-wide": [
+ "1. kvartal",
+ "2. kvartal",
+ "3. kvartal",
+ "4. kvartal"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "søndag",
+ "mandag",
+ "tirsdag",
+ "onsdag",
+ "torsdag",
+ "fredag",
+ "lørdag"
+ ],
+ "dateFormatItem-yyMMM": "MMM yy",
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "K1",
+ "K2",
+ "K3",
+ "K4"
+ ],
+ "eraAbbr": [
+ "f.Kr.",
+ "e.Kr."
+ ],
+ "field-minute": "minutt",
+ "field-dayperiod": "AM/PM",
+ "days-standAlone-abbr": [
+ "søn.",
+ "man.",
+ "tir.",
+ "ons.",
+ "tor.",
+ "fre.",
+ "lør."
+ ],
+ "dateFormatItem-d": "d.",
+ "dateFormatItem-ms": "mm.ss",
+ "field-day-relative+-1": "i går",
+ "field-day-relative+-2": "i forgårs",
+ "field-day-relative+-3": "i forforgårs",
+ "dateFormatItem-MMMd": "d. MMM",
+ "dateFormatItem-MEd": "E d.M",
+ "field-day": "dag",
+ "days-format-wide": [
+ "søndag",
+ "mandag",
+ "tirsdag",
+ "onsdag",
+ "torsdag",
+ "fredag",
+ "lørdag"
+ ],
+ "field-zone": "sone",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateFormatItem-yyMM": "MM.yy",
+ "dateFormatItem-hm": "h:mm a",
+ "days-format-abbr": [
+ "søn.",
+ "man.",
+ "tir.",
+ "ons.",
+ "tor.",
+ "fre.",
+ "lør."
+ ],
+ "eraNames": [
+ "f.Kr.",
+ "e.Kr."
+ ],
+ "days-format-narrow": [
+ "S",
+ "M",
+ "T",
+ "O",
+ "T",
+ "F",
+ "L"
+ ],
+ "field-month": "måned",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "O",
+ "T",
+ "F",
+ "L"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "AM",
+ "dateFormat-short": "dd.MM.yy",
+ "field-second": "sekund",
+ "dateFormatItem-yMMMEd": "EEE d. MMM y",
+ "field-week": "uke",
+ "dateFormat-medium": "d. MMM y",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-hms": "h:mm:ss a"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/nb/number.js b/lib/dojo/cldr/nls/nb/number.js
index 058217994..d2db253c0 100644
--- a/lib/dojo/cldr/nls/nb/number.js
+++ b/lib/dojo/cldr/nls/nb/number.js
@@ -1 +1,8 @@
-({"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/nb/number",{"group":" ","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0 %","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/nb/number.js.uncompressed.js b/lib/dojo/cldr/nls/nb/number.js.uncompressed.js
new file mode 100644
index 000000000..5ad1f1a69
--- /dev/null
+++ b/lib/dojo/cldr/nls/nb/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/nb/number", //begin v1.x content
+{
+ "group": " ",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0 %",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "¤ #,##0.00",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/nl/currency.js b/lib/dojo/cldr/nls/nl/currency.js
index fb04881cd..231c697f8 100644
--- a/lib/dojo/cldr/nls/nl/currency.js
+++ b/lib/dojo/cldr/nls/nl/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Hongkongse dollar","CHF_displayName":"Zwitserse franc","CAD_displayName":"Canadese dollar","CNY_displayName":"Chinese yuan renminbi","AUD_displayName":"Australische dollar","JPY_displayName":"Japanse yen","USD_displayName":"Amerikaanse dollar","GBP_displayName":"Brits pond sterling","EUR_displayName":"Euro","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/nl/currency",{"HKD_displayName":"Hongkongse dollar","CHF_displayName":"Zwitserse franc","CAD_displayName":"Canadese dollar","CNY_displayName":"Chinese yuan renminbi","AUD_displayName":"Australische dollar","JPY_displayName":"Japanse yen","USD_displayName":"Amerikaanse dollar","GBP_displayName":"Brits pond sterling","EUR_displayName":"Euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/nl/currency.js.uncompressed.js b/lib/dojo/cldr/nls/nl/currency.js.uncompressed.js
new file mode 100644
index 000000000..1b9d07010
--- /dev/null
+++ b/lib/dojo/cldr/nls/nl/currency.js.uncompressed.js
@@ -0,0 +1,15 @@
+define(
+"dojo/cldr/nls/nl/currency", //begin v1.x content
+{
+ "HKD_displayName": "Hongkongse dollar",
+ "CHF_displayName": "Zwitserse franc",
+ "CAD_displayName": "Canadese dollar",
+ "CNY_displayName": "Chinese yuan renminbi",
+ "AUD_displayName": "Australische dollar",
+ "JPY_displayName": "Japanse yen",
+ "USD_displayName": "Amerikaanse dollar",
+ "GBP_displayName": "Brits pond sterling",
+ "EUR_displayName": "Euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/nl/gregorian.js b/lib/dojo/cldr/nls/nl/gregorian.js
index 9e3ba2c1c..cb40132b0 100644
--- a/lib/dojo/cldr/nls/nl/gregorian.js
+++ b/lib/dojo/cldr/nls/nl/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"Dag van de week","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d-M-y","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["v. Chr.","n. Chr."],"dateFormat-long":"d MMMM y","months-format-wide":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d MMMM y","dateFormatItem-Md":"d-M","field-era":"Tijdperk","dateFormatItem-yM":"M-y","months-standAlone-wide":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"timeFormat-short":"HH:mm","quarters-format-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"timeFormat-long":"HH:mm:ss z","field-year":"Jaar","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q yyyy","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"Uur","dateFormatItem-MMdd":"dd-MM","months-format-abbr":["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"vandaag","field-day-relative+1":"morgen","field-day-relative+2":"overmorgen","field-day-relative+3":"overovermorgen","months-standAlone-abbr":["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"dateFormatItem-M":"L","days-standAlone-wide":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"dateFormatItem-MMMMd":"d MMMM","dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["K1","K2","K3","K4"],"eraAbbr":["v. Chr.","n. Chr."],"field-minute":"Minuut","field-dayperiod":"AM/PM","days-standAlone-abbr":["zo","ma","di","wo","do","vr","za"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"gisteren","field-day-relative+-2":"eergisteren","field-day-relative+-3":"eereergisteren","dateFormatItem-MMMd":"d-MMM","dateFormatItem-MEd":"E d-M","field-day":"Dag","days-format-wide":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"field-zone":"Zone","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM-yy","days-format-abbr":["zo","ma","di","wo","do","vr","za"],"eraNames":["Voor Christus","na Christus"],"days-format-narrow":["Z","M","D","W","D","V","Z"],"field-month":"Maand","days-standAlone-narrow":["Z","M","D","W","D","V","Z"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"AM","dateFormat-short":"dd-MM-yy","dateFormatItem-MMd":"d-MM","field-second":"Seconde","dateFormatItem-yMMMEd":"EEE d MMM y","dateFormatItem-Ed":"E d","field-week":"Week","dateFormat-medium":"d MMM y","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/nl/gregorian",{"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"Dag van de week","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d-M-y","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["v. Chr.","n. Chr."],"dateFormat-long":"d MMMM y","months-format-wide":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE d MMMM y","dateFormatItem-Md":"d-M","field-era":"Tijdperk","dateFormatItem-yM":"M-y","months-standAlone-wide":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"timeFormat-short":"HH:mm","quarters-format-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"timeFormat-long":"HH:mm:ss z","field-year":"Jaar","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q yyyy","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"Uur","dateFormatItem-MMdd":"dd-MM","months-format-abbr":["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"vandaag","field-day-relative+1":"morgen","field-day-relative+2":"overmorgen","field-day-relative+3":"overovermorgen","months-standAlone-abbr":["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"dateFormatItem-M":"L","days-standAlone-wide":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"dateFormatItem-MMMMd":"d MMMM","dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["K1","K2","K3","K4"],"eraAbbr":["v. Chr.","n. Chr."],"field-minute":"Minuut","field-dayperiod":"AM/PM","days-standAlone-abbr":["zo","ma","di","wo","do","vr","za"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"gisteren","field-day-relative+-2":"eergisteren","field-day-relative+-3":"eereergisteren","dateFormatItem-MMMd":"d-MMM","dateFormatItem-MEd":"E d-M","field-day":"Dag","days-format-wide":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"field-zone":"Zone","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM-yy","days-format-abbr":["zo","ma","di","wo","do","vr","za"],"eraNames":["Voor Christus","na Christus"],"days-format-narrow":["Z","M","D","W","D","V","Z"],"field-month":"Maand","days-standAlone-narrow":["Z","M","D","W","D","V","Z"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"AM","dateFormat-short":"dd-MM-yy","dateFormatItem-MMd":"d-MM","field-second":"Seconde","dateFormatItem-yMMMEd":"EEE d MMM y","dateFormatItem-Ed":"E d","field-week":"Week","dateFormat-medium":"d MMM y"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/nl/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/nl/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..efb6a63fa
--- /dev/null
+++ b/lib/dojo/cldr/nls/nl/gregorian.js.uncompressed.js
@@ -0,0 +1,233 @@
+define(
+"dojo/cldr/nls/nl/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "field-weekday": "Dag van de week",
+ "dateFormatItem-yyQQQQ": "QQQQ yy",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yMEd": "EEE d-M-y",
+ "dateFormatItem-MMMEd": "E d MMM",
+ "eraNarrow": [
+ "v. Chr.",
+ "n. Chr."
+ ],
+ "dateFormat-long": "d MMMM y",
+ "months-format-wide": [
+ "januari",
+ "februari",
+ "maart",
+ "april",
+ "mei",
+ "juni",
+ "juli",
+ "augustus",
+ "september",
+ "oktober",
+ "november",
+ "december"
+ ],
+ "dayPeriods-format-wide-pm": "PM",
+ "dateFormat-full": "EEEE d MMMM y",
+ "dateFormatItem-Md": "d-M",
+ "field-era": "Tijdperk",
+ "dateFormatItem-yM": "M-y",
+ "months-standAlone-wide": [
+ "januari",
+ "februari",
+ "maart",
+ "april",
+ "mei",
+ "juni",
+ "juli",
+ "augustus",
+ "september",
+ "oktober",
+ "november",
+ "december"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "1e kwartaal",
+ "2e kwartaal",
+ "3e kwartaal",
+ "4e kwartaal"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "field-year": "Jaar",
+ "dateFormatItem-yMMM": "MMM y",
+ "dateFormatItem-yQ": "Q yyyy",
+ "dateFormatItem-yyyyMMMM": "MMMM y",
+ "field-hour": "Uur",
+ "dateFormatItem-MMdd": "dd-MM",
+ "months-format-abbr": [
+ "jan.",
+ "feb.",
+ "mrt.",
+ "apr.",
+ "mei",
+ "jun.",
+ "jul.",
+ "aug.",
+ "sep.",
+ "okt.",
+ "nov.",
+ "dec."
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "field-day-relative+0": "vandaag",
+ "field-day-relative+1": "morgen",
+ "field-day-relative+2": "overmorgen",
+ "field-day-relative+3": "overovermorgen",
+ "months-standAlone-abbr": [
+ "jan.",
+ "feb.",
+ "mrt.",
+ "apr.",
+ "mei",
+ "jun.",
+ "jul.",
+ "aug.",
+ "sep.",
+ "okt.",
+ "nov.",
+ "dec."
+ ],
+ "quarters-format-abbr": [
+ "K1",
+ "K2",
+ "K3",
+ "K4"
+ ],
+ "quarters-standAlone-wide": [
+ "1e kwartaal",
+ "2e kwartaal",
+ "3e kwartaal",
+ "4e kwartaal"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "zondag",
+ "maandag",
+ "dinsdag",
+ "woensdag",
+ "donderdag",
+ "vrijdag",
+ "zaterdag"
+ ],
+ "dateFormatItem-MMMMd": "d MMMM",
+ "dateFormatItem-yyMMM": "MMM yy",
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "K1",
+ "K2",
+ "K3",
+ "K4"
+ ],
+ "eraAbbr": [
+ "v. Chr.",
+ "n. Chr."
+ ],
+ "field-minute": "Minuut",
+ "field-dayperiod": "AM/PM",
+ "days-standAlone-abbr": [
+ "zo",
+ "ma",
+ "di",
+ "wo",
+ "do",
+ "vr",
+ "za"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "gisteren",
+ "field-day-relative+-2": "eergisteren",
+ "field-day-relative+-3": "eereergisteren",
+ "dateFormatItem-MMMd": "d-MMM",
+ "dateFormatItem-MEd": "E d-M",
+ "field-day": "Dag",
+ "days-format-wide": [
+ "zondag",
+ "maandag",
+ "dinsdag",
+ "woensdag",
+ "donderdag",
+ "vrijdag",
+ "zaterdag"
+ ],
+ "field-zone": "Zone",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateFormatItem-yyMM": "MM-yy",
+ "days-format-abbr": [
+ "zo",
+ "ma",
+ "di",
+ "wo",
+ "do",
+ "vr",
+ "za"
+ ],
+ "eraNames": [
+ "Voor Christus",
+ "na Christus"
+ ],
+ "days-format-narrow": [
+ "Z",
+ "M",
+ "D",
+ "W",
+ "D",
+ "V",
+ "Z"
+ ],
+ "field-month": "Maand",
+ "days-standAlone-narrow": [
+ "Z",
+ "M",
+ "D",
+ "W",
+ "D",
+ "V",
+ "Z"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "AM",
+ "dateFormat-short": "dd-MM-yy",
+ "dateFormatItem-MMd": "d-MM",
+ "field-second": "Seconde",
+ "dateFormatItem-yMMMEd": "EEE d MMM y",
+ "dateFormatItem-Ed": "E d",
+ "field-week": "Week",
+ "dateFormat-medium": "d MMM y"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/nl/number.js b/lib/dojo/cldr/nls/nl/number.js
index 3edd9e714..a3a148975 100644
--- a/lib/dojo/cldr/nls/nl/number.js
+++ b/lib/dojo/cldr/nls/nl/number.js
@@ -1 +1,8 @@
-({"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/nl/number",{"group":".","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0%","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/nl/number.js.uncompressed.js b/lib/dojo/cldr/nls/nl/number.js.uncompressed.js
new file mode 100644
index 000000000..01b9a005b
--- /dev/null
+++ b/lib/dojo/cldr/nls/nl/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/nl/number", //begin v1.x content
+{
+ "group": ".",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "¤ #,##0.00;¤ #,##0.00-",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/number.js b/lib/dojo/cldr/nls/number.js
index ee347cd0b..3bd12adbc 100644
--- a/lib/dojo/cldr/nls/number.js
+++ b/lib/dojo/cldr/nls/number.js
@@ -1 +1,8 @@
-({"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/number",{root:{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencyFormat":"¤ #,##0.00","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"ar":true,"ca":true,"cs":true,"da":true,"de":true,"el":true,"en":true,"en-au":true,"en-gb":true,"es":true,"fi":true,"fr":true,"fr-ch":true,"he":true,"hu":true,"it":true,"ja":true,"ko":true,"nb":true,"nl":true,"pl":true,"pt":true,"pt-pt":true,"ro":true,"ru":true,"sk":true,"sl":true,"sv":true,"th":true,"tr":true,"zh":true,"zh-hant":true,"zh-hk":true}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/number.js.uncompressed.js b/lib/dojo/cldr/nls/number.js.uncompressed.js
new file mode 100644
index 000000000..1e0c0b86f
--- /dev/null
+++ b/lib/dojo/cldr/nls/number.js.uncompressed.js
@@ -0,0 +1,64 @@
+define("dojo/cldr/nls/number", { root:
+
+//begin v1.x content
+{
+ "scientificFormat": "#E0",
+ "currencySpacing-afterCurrency-currencyMatch": "[:letter:]",
+ "infinity": "∞",
+ "list": ";",
+ "percentSign": "%",
+ "minusSign": "-",
+ "currencySpacing-beforeCurrency-surroundingMatch": "[:digit:]",
+ "decimalFormat-short": "000T",
+ "currencySpacing-afterCurrency-insertBetween": " ",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "plusSign": "+",
+ "currencySpacing-afterCurrency-surroundingMatch": "[:digit:]",
+ "currencySpacing-beforeCurrency-currencyMatch": "[:letter:]",
+ "currencyFormat": "¤ #,##0.00",
+ "perMille": "‰",
+ "group": ",",
+ "percentFormat": "#,##0%",
+ "decimalFormat": "#,##0.###",
+ "decimal": ".",
+ "patternDigit": "#",
+ "currencySpacing-beforeCurrency-insertBetween": " ",
+ "exponential": "E"
+}
+//end v1.x content
+,
+ "ar": true,
+ "ca": true,
+ "cs": true,
+ "da": true,
+ "de": true,
+ "el": true,
+ "en": true,
+ "en-au": true,
+ "en-gb": true,
+ "es": true,
+ "fi": true,
+ "fr": true,
+ "fr-ch": true,
+ "he": true,
+ "hu": true,
+ "it": true,
+ "ja": true,
+ "ko": true,
+ "nb": true,
+ "nl": true,
+ "pl": true,
+ "pt": true,
+ "pt-pt": true,
+ "ro": true,
+ "ru": true,
+ "sk": true,
+ "sl": true,
+ "sv": true,
+ "th": true,
+ "tr": true,
+ "zh": true,
+ "zh-hant": true,
+ "zh-hk": true
+}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pl/currency.js b/lib/dojo/cldr/nls/pl/currency.js
index d1849ec9e..43991212f 100644
--- a/lib/dojo/cldr/nls/pl/currency.js
+++ b/lib/dojo/cldr/nls/pl/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"dolar hongkoński","CHF_displayName":"frank szwajcarski","CAD_displayName":"dolar kanadyjski","CNY_displayName":"juan renminbi","AUD_displayName":"dolar australijski","JPY_displayName":"jen japoński","USD_displayName":"dolar amerykański ","GBP_displayName":"funt szterling","EUR_displayName":"euro","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/pl/currency",{"HKD_displayName":"dolar hongkoński","CHF_displayName":"frank szwajcarski","CAD_displayName":"dolar kanadyjski","CNY_displayName":"juan renminbi","AUD_displayName":"dolar australijski","JPY_displayName":"jen japoński","USD_displayName":"dolar amerykański ","GBP_displayName":"funt szterling","EUR_displayName":"euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pl/currency.js.uncompressed.js b/lib/dojo/cldr/nls/pl/currency.js.uncompressed.js
new file mode 100644
index 000000000..f944998f4
--- /dev/null
+++ b/lib/dojo/cldr/nls/pl/currency.js.uncompressed.js
@@ -0,0 +1,15 @@
+define(
+"dojo/cldr/nls/pl/currency", //begin v1.x content
+{
+ "HKD_displayName": "dolar hongkoński",
+ "CHF_displayName": "frank szwajcarski",
+ "CAD_displayName": "dolar kanadyjski",
+ "CNY_displayName": "juan renminbi",
+ "AUD_displayName": "dolar australijski",
+ "JPY_displayName": "jen japoński",
+ "USD_displayName": "dolar amerykański ",
+ "GBP_displayName": "funt szterling",
+ "EUR_displayName": "euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pl/gregorian.js b/lib/dojo/cldr/nls/pl/gregorian.js
index ca45fcf4e..32e4e0fd5 100644
--- a/lib/dojo/cldr/nls/pl/gregorian.js
+++ b/lib/dojo/cldr/nls/pl/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["s","l","m","k","m","c","l","s","w","p","l","g"],"field-weekday":"Dzień tygodnia","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, d.MM.yyyy","dateFormatItem-MMMEd":"E, d MMM","eraNarrow":["p.n.e.","n.e."],"dayPeriods-format-wide-earlyMorning":"nad ranem","dayPeriods-format-wide-morning":"rano","dateFormat-long":"d MMMM y","months-format-wide":["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia"],"dayPeriods-format-wide-evening":"wieczorem","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, d MMMM y","dateFormatItem-Md":"d.MM","dayPeriods-format-wide-noon":"w południe","field-era":"Era","dateFormatItem-yM":"MM.yyyy","months-standAlone-wide":["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień"],"timeFormat-short":"HH:mm","quarters-format-wide":["I kwartał","II kwartał","III kwartał","IV kwartał"],"timeFormat-long":"HH:mm:ss z","field-year":"Rok","dateFormatItem-yQ":"yyyy Q","dateFormatItem-yyyyMMMM":"LLLL y","field-hour":"Godzina","dateFormatItem-MMdd":"d.MM","months-format-abbr":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"Dzisiaj","field-day-relative+1":"Jutro","field-day-relative+2":"Pojutrze","field-day-relative+3":"Za trzy dni","months-standAlone-abbr":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["I kwartał","II kwartał","III kwartał","IV kwartał"],"dateFormatItem-M":"L","days-standAlone-wide":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"dateFormatItem-MMMMd":"d MMMM","dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["1 kw.","2 kw.","3 kw.","4 kw."],"eraAbbr":["p.n.e.","n.e."],"field-minute":"Minuta","field-dayperiod":"Dayperiod","days-standAlone-abbr":["niedz.","pon.","wt.","śr.","czw.","pt.","sob."],"dayPeriods-format-wide-night":"w nocy","dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"Wczoraj","dateFormatItem-h":"hh a","field-day-relative+-2":"Przedwczoraj","field-day-relative+-3":"Trzy dni temu","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, d.MM","dayPeriods-format-wide-lateMorning":"przed południem","dateFormatItem-yMMMM":"LLLL y","field-day":"Dzień","days-format-wide":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"field-zone":"Strefa","dateFormatItem-yyyyMM":"MM.yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["s","l","m","k","m","c","l","s","w","p","l","g"],"dateFormatItem-hm":"hh:mm a","days-format-abbr":["niedz.","pon.","wt.","śr.","czw.","pt.","sob."],"eraNames":["p.n.e.","n.e."],"days-format-narrow":["N","P","W","Ś","C","P","S"],"field-month":"Miesiąc","days-standAlone-narrow":["N","P","W","Ś","C","P","S"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"AM","dateFormat-short":"dd.MM.yyyy","dayPeriods-format-wide-afternoon":"po południu","field-second":"Sekunda","dateFormatItem-yMMMEd":"EEE, d MMM y","dateFormatItem-Ed":"E, d","field-week":"Tydzień","dateFormat-medium":"d MMM y","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"hh:mm:ss a","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yMMM":"y MMM","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-narrow":["1","2","3","4"],"dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/pl/gregorian",{"months-format-narrow":["s","l","m","k","m","c","l","s","w","p","l","g"],"field-weekday":"Dzień tygodnia","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, d.MM.yyyy","dateFormatItem-MMMEd":"E, d MMM","eraNarrow":["p.n.e.","n.e."],"dayPeriods-format-wide-earlyMorning":"nad ranem","dayPeriods-format-wide-morning":"rano","dateFormat-long":"d MMMM y","months-format-wide":["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia"],"dayPeriods-format-wide-evening":"wieczorem","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, d MMMM y","dateFormatItem-Md":"d.MM","dayPeriods-format-wide-noon":"w południe","field-era":"Era","dateFormatItem-yM":"MM.yyyy","months-standAlone-wide":["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień"],"timeFormat-short":"HH:mm","quarters-format-wide":["I kwartał","II kwartał","III kwartał","IV kwartał"],"timeFormat-long":"HH:mm:ss z","field-year":"Rok","dateFormatItem-yQ":"yyyy Q","dateFormatItem-yyyyMMMM":"LLLL y","field-hour":"Godzina","dateFormatItem-MMdd":"d.MM","months-format-abbr":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"Dzisiaj","field-day-relative+1":"Jutro","field-day-relative+2":"Pojutrze","field-day-relative+3":"Za trzy dni","months-standAlone-abbr":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["I kwartał","II kwartał","III kwartał","IV kwartał"],"dateFormatItem-M":"L","days-standAlone-wide":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"dateFormatItem-MMMMd":"d MMMM","dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["1 kw.","2 kw.","3 kw.","4 kw."],"eraAbbr":["p.n.e.","n.e."],"field-minute":"Minuta","field-dayperiod":"Dayperiod","days-standAlone-abbr":["niedz.","pon.","wt.","śr.","czw.","pt.","sob."],"dayPeriods-format-wide-night":"w nocy","dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"Wczoraj","dateFormatItem-h":"hh a","field-day-relative+-2":"Przedwczoraj","field-day-relative+-3":"Trzy dni temu","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, d.MM","dayPeriods-format-wide-lateMorning":"przed południem","dateFormatItem-yMMMM":"LLLL y","field-day":"Dzień","days-format-wide":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"field-zone":"Strefa","dateFormatItem-yyyyMM":"MM.yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["s","l","m","k","m","c","l","s","w","p","l","g"],"dateFormatItem-hm":"hh:mm a","days-format-abbr":["niedz.","pon.","wt.","śr.","czw.","pt.","sob."],"eraNames":["p.n.e.","n.e."],"days-format-narrow":["N","P","W","Ś","C","P","S"],"field-month":"Miesiąc","days-standAlone-narrow":["N","P","W","Ś","C","P","S"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"AM","dateFormat-short":"dd.MM.yyyy","dayPeriods-format-wide-afternoon":"po południu","field-second":"Sekunda","dateFormatItem-yMMMEd":"EEE, d MMM y","dateFormatItem-Ed":"E, d","field-week":"Tydzień","dateFormat-medium":"d MMM y","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"hh:mm:ss a"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pl/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/pl/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..fae60533c
--- /dev/null
+++ b/lib/dojo/cldr/nls/pl/gregorian.js.uncompressed.js
@@ -0,0 +1,242 @@
+define(
+"dojo/cldr/nls/pl/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "s",
+ "l",
+ "m",
+ "k",
+ "m",
+ "c",
+ "l",
+ "s",
+ "w",
+ "p",
+ "l",
+ "g"
+ ],
+ "field-weekday": "Dzień tygodnia",
+ "dateFormatItem-yQQQ": "y QQQ",
+ "dateFormatItem-yMEd": "EEE, d.MM.yyyy",
+ "dateFormatItem-MMMEd": "E, d MMM",
+ "eraNarrow": [
+ "p.n.e.",
+ "n.e."
+ ],
+ "dayPeriods-format-wide-earlyMorning": "nad ranem",
+ "dayPeriods-format-wide-morning": "rano",
+ "dateFormat-long": "d MMMM y",
+ "months-format-wide": [
+ "stycznia",
+ "lutego",
+ "marca",
+ "kwietnia",
+ "maja",
+ "czerwca",
+ "lipca",
+ "sierpnia",
+ "września",
+ "października",
+ "listopada",
+ "grudnia"
+ ],
+ "dayPeriods-format-wide-evening": "wieczorem",
+ "dayPeriods-format-wide-pm": "PM",
+ "dateFormat-full": "EEEE, d MMMM y",
+ "dateFormatItem-Md": "d.MM",
+ "dayPeriods-format-wide-noon": "w południe",
+ "field-era": "Era",
+ "dateFormatItem-yM": "MM.yyyy",
+ "months-standAlone-wide": [
+ "styczeń",
+ "luty",
+ "marzec",
+ "kwiecień",
+ "maj",
+ "czerwiec",
+ "lipiec",
+ "sierpień",
+ "wrzesień",
+ "październik",
+ "listopad",
+ "grudzień"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "I kwartał",
+ "II kwartał",
+ "III kwartał",
+ "IV kwartał"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "field-year": "Rok",
+ "dateFormatItem-yQ": "yyyy Q",
+ "dateFormatItem-yyyyMMMM": "LLLL y",
+ "field-hour": "Godzina",
+ "dateFormatItem-MMdd": "d.MM",
+ "months-format-abbr": [
+ "sty",
+ "lut",
+ "mar",
+ "kwi",
+ "maj",
+ "cze",
+ "lip",
+ "sie",
+ "wrz",
+ "paź",
+ "lis",
+ "gru"
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "field-day-relative+0": "Dzisiaj",
+ "field-day-relative+1": "Jutro",
+ "field-day-relative+2": "Pojutrze",
+ "field-day-relative+3": "Za trzy dni",
+ "months-standAlone-abbr": [
+ "sty",
+ "lut",
+ "mar",
+ "kwi",
+ "maj",
+ "cze",
+ "lip",
+ "sie",
+ "wrz",
+ "paź",
+ "lis",
+ "gru"
+ ],
+ "quarters-format-abbr": [
+ "K1",
+ "K2",
+ "K3",
+ "K4"
+ ],
+ "quarters-standAlone-wide": [
+ "I kwartał",
+ "II kwartał",
+ "III kwartał",
+ "IV kwartał"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "niedziela",
+ "poniedziałek",
+ "wtorek",
+ "środa",
+ "czwartek",
+ "piątek",
+ "sobota"
+ ],
+ "dateFormatItem-MMMMd": "d MMMM",
+ "dateFormatItem-yyMMM": "MMM yy",
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "1 kw.",
+ "2 kw.",
+ "3 kw.",
+ "4 kw."
+ ],
+ "eraAbbr": [
+ "p.n.e.",
+ "n.e."
+ ],
+ "field-minute": "Minuta",
+ "field-dayperiod": "Dayperiod",
+ "days-standAlone-abbr": [
+ "niedz.",
+ "pon.",
+ "wt.",
+ "śr.",
+ "czw.",
+ "pt.",
+ "sob."
+ ],
+ "dayPeriods-format-wide-night": "w nocy",
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "Wczoraj",
+ "dateFormatItem-h": "hh a",
+ "field-day-relative+-2": "Przedwczoraj",
+ "field-day-relative+-3": "Trzy dni temu",
+ "dateFormatItem-MMMd": "d MMM",
+ "dateFormatItem-MEd": "E, d.MM",
+ "dayPeriods-format-wide-lateMorning": "przed południem",
+ "dateFormatItem-yMMMM": "LLLL y",
+ "field-day": "Dzień",
+ "days-format-wide": [
+ "niedziela",
+ "poniedziałek",
+ "wtorek",
+ "środa",
+ "czwartek",
+ "piątek",
+ "sobota"
+ ],
+ "field-zone": "Strefa",
+ "dateFormatItem-yyyyMM": "MM.yyyy",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "s",
+ "l",
+ "m",
+ "k",
+ "m",
+ "c",
+ "l",
+ "s",
+ "w",
+ "p",
+ "l",
+ "g"
+ ],
+ "dateFormatItem-hm": "hh:mm a",
+ "days-format-abbr": [
+ "niedz.",
+ "pon.",
+ "wt.",
+ "śr.",
+ "czw.",
+ "pt.",
+ "sob."
+ ],
+ "eraNames": [
+ "p.n.e.",
+ "n.e."
+ ],
+ "days-format-narrow": [
+ "N",
+ "P",
+ "W",
+ "Ś",
+ "C",
+ "P",
+ "S"
+ ],
+ "field-month": "Miesiąc",
+ "days-standAlone-narrow": [
+ "N",
+ "P",
+ "W",
+ "Ś",
+ "C",
+ "P",
+ "S"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "AM",
+ "dateFormat-short": "dd.MM.yyyy",
+ "dayPeriods-format-wide-afternoon": "po południu",
+ "field-second": "Sekunda",
+ "dateFormatItem-yMMMEd": "EEE, d MMM y",
+ "dateFormatItem-Ed": "E, d",
+ "field-week": "Tydzień",
+ "dateFormat-medium": "d MMM y",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-hms": "hh:mm:ss a"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pl/number.js b/lib/dojo/cldr/nls/pl/number.js
index 66776161f..066ee7cbd 100644
--- a/lib/dojo/cldr/nls/pl/number.js
+++ b/lib/dojo/cldr/nls/pl/number.js
@@ -1 +1,8 @@
-({"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/pl/number",{"group":" ","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0%","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pl/number.js.uncompressed.js b/lib/dojo/cldr/nls/pl/number.js.uncompressed.js
new file mode 100644
index 000000000..cf88cb55c
--- /dev/null
+++ b/lib/dojo/cldr/nls/pl/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/pl/number", //begin v1.x content
+{
+ "group": " ",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pt-pt/gregorian.js b/lib/dojo/cldr/nls/pt-pt/gregorian.js
index ce4e079af..2668c22a4 100644
--- a/lib/dojo/cldr/nls/pt-pt/gregorian.js
+++ b/lib/dojo/cldr/nls/pt-pt/gregorian.js
@@ -1 +1,8 @@
-({"quarters-standAlone-wide":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"quarters-format-abbr":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"dayPeriods-standAlone-wide-am":"a.m.","dateFormat-medium":"d 'de' MMM 'de' yyyy","quarters-standAlone-abbr":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"dateFormatItem-Hm":"HH:mm","dayPeriods-standAlone-abbr-pm":"p.m.","dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-hm":"h:mm a","months-standAlone-wide":["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],"dayPeriods-standAlone-abbr-am":"a.m.","dayPeriods-format-wide-pm":"Depois do meio-dia","months-standAlone-abbr":["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],"dateFormatItem-yQQQ":"QQQ 'de' y","dayPeriods-format-wide-am":"Antes do meio-dia","dateFormatItem-Hms":"HH:mm:ss","dayPeriods-format-abbr-pm":"p.m.","dateFormatItem-yyQ":"QQQ 'de' yy","dateFormatItem-ms":"mm:ss","dayPeriods-format-abbr-am":"a.m.","months-format-wide":["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],"days-standAlone-wide":["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],"dateFormatItem-HHmm":"HH:mm","months-format-abbr":["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],"days-standAlone-abbr":["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],"days-format-wide":["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],"dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yQ":"QQQ 'de' yyyy","quarters-format-wide":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"dayPeriods-standAlone-wide-pm":"p.m.","days-format-abbr":["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"Dia da semana","dateFormatItem-yMEd":"EEE, dd/MM/yyyy","dateFormatItem-MMMEd":"EEE, d 'de' MMM","eraNarrow":["a.C.","d.C."],"dayPeriods-format-wide-morning":"manhã","dateFormat-long":"d 'de' MMMM 'de' y","dateFormatItem-EEEd":"EEE, d","dateFormat-full":"EEEE, d 'de' MMMM 'de' y","dateFormatItem-Md":"d/M","dayPeriods-format-wide-noon":"meio-dia","field-era":"Era","dateFormatItem-yM":"MM/yyyy","timeFormat-short":"HH:mm","timeFormat-long":"HH'h'mm'min'ss's' z","field-year":"Ano","dateFormatItem-yMMM":"MMM 'de' y","field-hour":"Hora","dateFormatItem-MMdd":"dd/MM","timeFormat-full":"HH'h'mm'min'ss's' zzzz","field-day-relative+0":"Hoje","field-day-relative+1":"Amanhã","field-day-relative+2":"Depois de amanhã","field-day-relative+3":"Daqui a três dias","dateFormatItem-M":"L","dateFormatItem-yyyyMMM":"MMM 'de' y","dateFormatItem-yyMMMEEEd":"EEE, d 'de' MMM 'de' yy","dateFormatItem-yyMMM":"MMM 'de' yy","timeFormat-medium":"HH:mm:ss","eraAbbr":["a.C.","d.C."],"field-minute":"Minuto","field-dayperiod":"Período do dia","dayPeriods-format-wide-night":"noite","dateFormatItem-yyMMMd":"d 'de' MMM 'de' yy","dateFormatItem-d":"d","field-day-relative+-1":"Ontem","field-day-relative+-2":"Anteontem","field-day-relative+-3":"Há três dias","dateFormatItem-MMMd":"d 'de' MMM","dateFormatItem-MEd":"EEE, dd/MM","field-day":"Dia","field-zone":"Fuso","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM/yy","eraNames":["Antes de Cristo","Ano do Senhor"],"days-format-narrow":["D","S","T","Q","Q","S","S"],"field-month":"Mês","days-standAlone-narrow":["D","S","T","Q","Q","S","S"],"dateFormatItem-MMM":"LLL","dateFormat-short":"dd/MM/yy","dayPeriods-format-wide-afternoon":"tarde","field-second":"Segundo","dateFormatItem-yMMMEd":"EEE, d 'de' MMM 'de' y","field-week":"Semana","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/pt-pt/gregorian",{"quarters-standAlone-wide":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"quarters-format-abbr":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"dayPeriods-standAlone-wide-am":"a.m.","dateFormat-medium":"d 'de' MMM 'de' yyyy","quarters-standAlone-abbr":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"dateFormatItem-Hm":"HH:mm","dayPeriods-standAlone-abbr-pm":"p.m.","dateFormatItem-HHmmss":"HH:mm:ss","dateFormatItem-hm":"h:mm a","months-standAlone-wide":["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],"dayPeriods-standAlone-abbr-am":"a.m.","dayPeriods-format-wide-pm":"Depois do meio-dia","months-standAlone-abbr":["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],"dateFormatItem-yQQQ":"QQQ 'de' y","dayPeriods-format-wide-am":"Antes do meio-dia","dateFormatItem-Hms":"HH:mm:ss","dayPeriods-format-abbr-pm":"p.m.","dateFormatItem-yyQ":"QQQ 'de' yy","dateFormatItem-ms":"mm:ss","dayPeriods-format-abbr-am":"a.m.","months-format-wide":["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],"days-standAlone-wide":["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],"dateFormatItem-HHmm":"HH:mm","months-format-abbr":["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],"days-standAlone-abbr":["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],"days-format-wide":["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],"dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yQ":"QQQ 'de' yyyy","quarters-format-wide":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"dayPeriods-standAlone-wide-pm":"p.m.","days-format-abbr":["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pt-pt/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/pt-pt/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..4b9ceee2b
--- /dev/null
+++ b/lib/dojo/cldr/nls/pt-pt/gregorian.js.uncompressed.js
@@ -0,0 +1,141 @@
+define(
+"dojo/cldr/nls/pt-pt/gregorian", //begin v1.x content
+{
+ "quarters-standAlone-wide": [
+ "1.º trimestre",
+ "2.º trimestre",
+ "3.º trimestre",
+ "4.º trimestre"
+ ],
+ "quarters-format-abbr": [
+ "1.º trimestre",
+ "2.º trimestre",
+ "3.º trimestre",
+ "4.º trimestre"
+ ],
+ "dayPeriods-standAlone-wide-am": "a.m.",
+ "dateFormat-medium": "d 'de' MMM 'de' yyyy",
+ "quarters-standAlone-abbr": [
+ "1.º trimestre",
+ "2.º trimestre",
+ "3.º trimestre",
+ "4.º trimestre"
+ ],
+ "dateFormatItem-Hm": "HH:mm",
+ "dayPeriods-standAlone-abbr-pm": "p.m.",
+ "dateFormatItem-HHmmss": "HH:mm:ss",
+ "dateFormatItem-hm": "h:mm a",
+ "months-standAlone-wide": [
+ "Janeiro",
+ "Fevereiro",
+ "Março",
+ "Abril",
+ "Maio",
+ "Junho",
+ "Julho",
+ "Agosto",
+ "Setembro",
+ "Outubro",
+ "Novembro",
+ "Dezembro"
+ ],
+ "dayPeriods-standAlone-abbr-am": "a.m.",
+ "dayPeriods-format-wide-pm": "Depois do meio-dia",
+ "months-standAlone-abbr": [
+ "Jan",
+ "Fev",
+ "Mar",
+ "Abr",
+ "Mai",
+ "Jun",
+ "Jul",
+ "Ago",
+ "Set",
+ "Out",
+ "Nov",
+ "Dez"
+ ],
+ "dateFormatItem-yQQQ": "QQQ 'de' y",
+ "dayPeriods-format-wide-am": "Antes do meio-dia",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dayPeriods-format-abbr-pm": "p.m.",
+ "dateFormatItem-yyQ": "QQQ 'de' yy",
+ "dateFormatItem-ms": "mm:ss",
+ "dayPeriods-format-abbr-am": "a.m.",
+ "months-format-wide": [
+ "Janeiro",
+ "Fevereiro",
+ "Março",
+ "Abril",
+ "Maio",
+ "Junho",
+ "Julho",
+ "Agosto",
+ "Setembro",
+ "Outubro",
+ "Novembro",
+ "Dezembro"
+ ],
+ "days-standAlone-wide": [
+ "Domingo",
+ "Segunda-feira",
+ "Terça-feira",
+ "Quarta-feira",
+ "Quinta-feira",
+ "Sexta-feira",
+ "Sábado"
+ ],
+ "dateFormatItem-HHmm": "HH:mm",
+ "months-format-abbr": [
+ "Jan",
+ "Fev",
+ "Mar",
+ "Abr",
+ "Mai",
+ "Jun",
+ "Jul",
+ "Ago",
+ "Set",
+ "Out",
+ "Nov",
+ "Dez"
+ ],
+ "days-standAlone-abbr": [
+ "Domingo",
+ "Segunda-feira",
+ "Terça-feira",
+ "Quarta-feira",
+ "Quinta-feira",
+ "Sexta-feira",
+ "Sábado"
+ ],
+ "days-format-wide": [
+ "Domingo",
+ "Segunda-feira",
+ "Terça-feira",
+ "Quarta-feira",
+ "Quinta-feira",
+ "Sexta-feira",
+ "Sábado"
+ ],
+ "dateFormatItem-hms": "h:mm:ss a",
+ "dateFormatItem-yQ": "QQQ 'de' yyyy",
+ "quarters-format-wide": [
+ "1.º trimestre",
+ "2.º trimestre",
+ "3.º trimestre",
+ "4.º trimestre"
+ ],
+ "dayPeriods-standAlone-wide-pm": "p.m.",
+ "days-format-abbr": [
+ "Domingo",
+ "Segunda-feira",
+ "Terça-feira",
+ "Quarta-feira",
+ "Quinta-feira",
+ "Sexta-feira",
+ "Sábado"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pt-pt/number.js b/lib/dojo/cldr/nls/pt-pt/number.js
index 3dc20dbe4..2d0ccea06 100644
--- a/lib/dojo/cldr/nls/pt-pt/number.js
+++ b/lib/dojo/cldr/nls/pt-pt/number.js
@@ -1 +1,8 @@
-({"currencyFormat":"#,##0.00 ¤","group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/pt-pt/number",{"currencyFormat":"#,##0.00 ¤","group":" "}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pt-pt/number.js.uncompressed.js b/lib/dojo/cldr/nls/pt-pt/number.js.uncompressed.js
new file mode 100644
index 000000000..54ffa82b8
--- /dev/null
+++ b/lib/dojo/cldr/nls/pt-pt/number.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dojo/cldr/nls/pt-pt/number", //begin v1.x content
+{
+ "currencyFormat": "#,##0.00 ¤",
+ "group": " "
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pt/currency.js b/lib/dojo/cldr/nls/pt/currency.js
index 2e055699a..b5fa38baa 100644
--- a/lib/dojo/cldr/nls/pt/currency.js
+++ b/lib/dojo/cldr/nls/pt/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Dólar de Hong Kong","CHF_displayName":"Franco suíço","CAD_displayName":"Dólar canadense","CNY_displayName":"Yuan Renminbi chinês","AUD_displayName":"Dólar australiano","JPY_displayName":"Iene japonês","USD_displayName":"Dólar norte-americano","GBP_displayName":"Libra esterlina britânica","EUR_displayName":"Euro","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/pt/currency",{"HKD_displayName":"Dólar de Hong Kong","CHF_displayName":"Franco suíço","CAD_displayName":"Dólar canadense","CNY_displayName":"Yuan Renminbi chinês","AUD_displayName":"Dólar australiano","JPY_displayName":"Iene japonês","USD_displayName":"Dólar norte-americano","GBP_displayName":"Libra esterlina britânica","EUR_displayName":"Euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pt/currency.js.uncompressed.js b/lib/dojo/cldr/nls/pt/currency.js.uncompressed.js
new file mode 100644
index 000000000..6c5bba522
--- /dev/null
+++ b/lib/dojo/cldr/nls/pt/currency.js.uncompressed.js
@@ -0,0 +1,15 @@
+define(
+"dojo/cldr/nls/pt/currency", //begin v1.x content
+{
+ "HKD_displayName": "Dólar de Hong Kong",
+ "CHF_displayName": "Franco suíço",
+ "CAD_displayName": "Dólar canadense",
+ "CNY_displayName": "Yuan Renminbi chinês",
+ "AUD_displayName": "Dólar australiano",
+ "JPY_displayName": "Iene japonês",
+ "USD_displayName": "Dólar norte-americano",
+ "GBP_displayName": "Libra esterlina britânica",
+ "EUR_displayName": "Euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pt/gregorian.js b/lib/dojo/cldr/nls/pt/gregorian.js
index 296fb10e2..c77d9e6c3 100644
--- a/lib/dojo/cldr/nls/pt/gregorian.js
+++ b/lib/dojo/cldr/nls/pt/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"Dia da semana","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, dd/MM/yyyy","dateFormatItem-MMMEd":"EEE, d 'de' MMM","eraNarrow":["a.C.","d.C."],"dayPeriods-format-wide-morning":"manhã","dateFormat-long":"d 'de' MMMM 'de' y","months-format-wide":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"dateFormatItem-EEEd":"EEE, d","dateFormat-full":"EEEE, d 'de' MMMM 'de' y","dateFormatItem-Md":"d/M","dayPeriods-format-wide-noon":"meio-dia","field-era":"Era","dateFormatItem-yM":"MM/yyyy","months-standAlone-wide":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"timeFormat-short":"HH:mm","quarters-format-wide":["1º trimestre","2º trimestre","3º trimestre","4º trimestre"],"timeFormat-long":"HH'h'mm'min'ss's' z","field-year":"Ano","dateFormatItem-yMMM":"MMM 'de' y","dateFormatItem-yQ":"yyyy Q","field-hour":"Hora","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH'h'mm'min'ss's' zzzz","field-day-relative+0":"Hoje","field-day-relative+1":"Amanhã","field-day-relative+2":"Depois de amanhã","field-day-relative+3":"Daqui a três dias","months-standAlone-abbr":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1º trimestre","2º trimestre","3º trimestre","4º trimestre"],"dateFormatItem-HHmmss":"HH'h'mm'min'ss's'","dateFormatItem-M":"L","days-standAlone-wide":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"dateFormatItem-yyyyMMM":"MMM 'de' y","dateFormatItem-yyMMMEEEd":"EEE, d 'de' MMM 'de' yy","dateFormatItem-yyMMM":"MMM 'de' yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH'h'mm","quarters-standAlone-abbr":["T1","T2","T3","T4"],"eraAbbr":["a.C.","d.C."],"field-minute":"Minuto","field-dayperiod":"Período do dia","days-standAlone-abbr":["dom","seg","ter","qua","qui","sex","sáb"],"dayPeriods-format-wide-night":"noite","dateFormatItem-yyMMMd":"d 'de' MMM 'de' yy","dateFormatItem-d":"d","dateFormatItem-ms":"mm'min'ss's'","field-day-relative+-1":"Ontem","field-day-relative+-2":"Anteontem","field-day-relative+-3":"Há três dias","dateFormatItem-MMMd":"d 'de' MMM","dateFormatItem-MEd":"EEE, dd/MM","field-day":"Dia","days-format-wide":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"field-zone":"Fuso","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM/yy","days-format-abbr":["dom","seg","ter","qua","qui","sex","sáb"],"eraNames":["Antes de Cristo","Ano do Senhor"],"days-format-narrow":["D","S","T","Q","Q","S","S"],"field-month":"Mês","days-standAlone-narrow":["D","S","T","Q","Q","S","S"],"dateFormatItem-MMM":"LLL","dateFormatItem-HHmm":"HH'h'mm","dateFormat-short":"dd/MM/yy","dayPeriods-format-wide-afternoon":"tarde","field-second":"Segundo","dateFormatItem-yMMMEd":"EEE, d 'de' MMM 'de' y","field-week":"Semana","dateFormat-medium":"dd/MM/yyyy","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"PM","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/pt/gregorian",{"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-weekday":"Dia da semana","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, dd/MM/yyyy","dateFormatItem-MMMEd":"EEE, d 'de' MMM","eraNarrow":["a.C.","d.C."],"dayPeriods-format-wide-morning":"manhã","dateFormat-long":"d 'de' MMMM 'de' y","months-format-wide":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"dateFormatItem-EEEd":"EEE, d","dateFormat-full":"EEEE, d 'de' MMMM 'de' y","dateFormatItem-Md":"d/M","dayPeriods-format-wide-noon":"meio-dia","field-era":"Era","dateFormatItem-yM":"MM/yyyy","months-standAlone-wide":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"timeFormat-short":"HH:mm","quarters-format-wide":["1º trimestre","2º trimestre","3º trimestre","4º trimestre"],"timeFormat-long":"HH'h'mm'min'ss's' z","field-year":"Ano","dateFormatItem-yMMM":"MMM 'de' y","dateFormatItem-yQ":"yyyy Q","field-hour":"Hora","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH'h'mm'min'ss's' zzzz","field-day-relative+0":"Hoje","field-day-relative+1":"Amanhã","field-day-relative+2":"Depois de amanhã","field-day-relative+3":"Daqui a três dias","months-standAlone-abbr":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"quarters-format-abbr":["T1","T2","T3","T4"],"quarters-standAlone-wide":["1º trimestre","2º trimestre","3º trimestre","4º trimestre"],"dateFormatItem-HHmmss":"HH'h'mm'min'ss's'","dateFormatItem-M":"L","days-standAlone-wide":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"dateFormatItem-yyyyMMM":"MMM 'de' y","dateFormatItem-yyMMMEEEd":"EEE, d 'de' MMM 'de' yy","dateFormatItem-yyMMM":"MMM 'de' yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH'h'mm","quarters-standAlone-abbr":["T1","T2","T3","T4"],"eraAbbr":["a.C.","d.C."],"field-minute":"Minuto","field-dayperiod":"Período do dia","days-standAlone-abbr":["dom","seg","ter","qua","qui","sex","sáb"],"dayPeriods-format-wide-night":"noite","dateFormatItem-yyMMMd":"d 'de' MMM 'de' yy","dateFormatItem-d":"d","dateFormatItem-ms":"mm'min'ss's'","field-day-relative+-1":"Ontem","field-day-relative+-2":"Anteontem","field-day-relative+-3":"Há três dias","dateFormatItem-MMMd":"d 'de' MMM","dateFormatItem-MEd":"EEE, dd/MM","field-day":"Dia","days-format-wide":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"field-zone":"Fuso","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"MM/yy","days-format-abbr":["dom","seg","ter","qua","qui","sex","sáb"],"eraNames":["Antes de Cristo","Ano do Senhor"],"days-format-narrow":["D","S","T","Q","Q","S","S"],"field-month":"Mês","days-standAlone-narrow":["D","S","T","Q","Q","S","S"],"dateFormatItem-MMM":"LLL","dateFormatItem-HHmm":"HH'h'mm","dateFormat-short":"dd/MM/yy","dayPeriods-format-wide-afternoon":"tarde","field-second":"Segundo","dateFormatItem-yMMMEd":"EEE, d 'de' MMM 'de' y","field-week":"Semana","dateFormat-medium":"dd/MM/yyyy"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pt/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/pt/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..2308f9abc
--- /dev/null
+++ b/lib/dojo/cldr/nls/pt/gregorian.js.uncompressed.js
@@ -0,0 +1,237 @@
+define(
+"dojo/cldr/nls/pt/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "field-weekday": "Dia da semana",
+ "dateFormatItem-yQQQ": "y QQQ",
+ "dateFormatItem-yMEd": "EEE, dd/MM/yyyy",
+ "dateFormatItem-MMMEd": "EEE, d 'de' MMM",
+ "eraNarrow": [
+ "a.C.",
+ "d.C."
+ ],
+ "dayPeriods-format-wide-morning": "manhã",
+ "dateFormat-long": "d 'de' MMMM 'de' y",
+ "months-format-wide": [
+ "janeiro",
+ "fevereiro",
+ "março",
+ "abril",
+ "maio",
+ "junho",
+ "julho",
+ "agosto",
+ "setembro",
+ "outubro",
+ "novembro",
+ "dezembro"
+ ],
+ "dateFormatItem-EEEd": "EEE, d",
+ "dateFormat-full": "EEEE, d 'de' MMMM 'de' y",
+ "dateFormatItem-Md": "d/M",
+ "dayPeriods-format-wide-noon": "meio-dia",
+ "field-era": "Era",
+ "dateFormatItem-yM": "MM/yyyy",
+ "months-standAlone-wide": [
+ "janeiro",
+ "fevereiro",
+ "março",
+ "abril",
+ "maio",
+ "junho",
+ "julho",
+ "agosto",
+ "setembro",
+ "outubro",
+ "novembro",
+ "dezembro"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "1º trimestre",
+ "2º trimestre",
+ "3º trimestre",
+ "4º trimestre"
+ ],
+ "timeFormat-long": "HH'h'mm'min'ss's' z",
+ "field-year": "Ano",
+ "dateFormatItem-yMMM": "MMM 'de' y",
+ "dateFormatItem-yQ": "yyyy Q",
+ "field-hour": "Hora",
+ "dateFormatItem-MMdd": "dd/MM",
+ "months-format-abbr": [
+ "jan",
+ "fev",
+ "mar",
+ "abr",
+ "mai",
+ "jun",
+ "jul",
+ "ago",
+ "set",
+ "out",
+ "nov",
+ "dez"
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "HH'h'mm'min'ss's' zzzz",
+ "field-day-relative+0": "Hoje",
+ "field-day-relative+1": "Amanhã",
+ "field-day-relative+2": "Depois de amanhã",
+ "field-day-relative+3": "Daqui a três dias",
+ "months-standAlone-abbr": [
+ "jan",
+ "fev",
+ "mar",
+ "abr",
+ "mai",
+ "jun",
+ "jul",
+ "ago",
+ "set",
+ "out",
+ "nov",
+ "dez"
+ ],
+ "quarters-format-abbr": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "quarters-standAlone-wide": [
+ "1º trimestre",
+ "2º trimestre",
+ "3º trimestre",
+ "4º trimestre"
+ ],
+ "dateFormatItem-HHmmss": "HH'h'mm'min'ss's'",
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "domingo",
+ "segunda-feira",
+ "terça-feira",
+ "quarta-feira",
+ "quinta-feira",
+ "sexta-feira",
+ "sábado"
+ ],
+ "dateFormatItem-yyyyMMM": "MMM 'de' y",
+ "dateFormatItem-yyMMMEEEd": "EEE, d 'de' MMM 'de' yy",
+ "dateFormatItem-yyMMM": "MMM 'de' yy",
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH'h'mm",
+ "quarters-standAlone-abbr": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "eraAbbr": [
+ "a.C.",
+ "d.C."
+ ],
+ "field-minute": "Minuto",
+ "field-dayperiod": "Período do dia",
+ "days-standAlone-abbr": [
+ "dom",
+ "seg",
+ "ter",
+ "qua",
+ "qui",
+ "sex",
+ "sáb"
+ ],
+ "dayPeriods-format-wide-night": "noite",
+ "dateFormatItem-yyMMMd": "d 'de' MMM 'de' yy",
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm'min'ss's'",
+ "field-day-relative+-1": "Ontem",
+ "field-day-relative+-2": "Anteontem",
+ "field-day-relative+-3": "Há três dias",
+ "dateFormatItem-MMMd": "d 'de' MMM",
+ "dateFormatItem-MEd": "EEE, dd/MM",
+ "field-day": "Dia",
+ "days-format-wide": [
+ "domingo",
+ "segunda-feira",
+ "terça-feira",
+ "quarta-feira",
+ "quinta-feira",
+ "sexta-feira",
+ "sábado"
+ ],
+ "field-zone": "Fuso",
+ "dateFormatItem-yyyyMM": "MM/yyyy",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateFormatItem-yyMM": "MM/yy",
+ "days-format-abbr": [
+ "dom",
+ "seg",
+ "ter",
+ "qua",
+ "qui",
+ "sex",
+ "sáb"
+ ],
+ "eraNames": [
+ "Antes de Cristo",
+ "Ano do Senhor"
+ ],
+ "days-format-narrow": [
+ "D",
+ "S",
+ "T",
+ "Q",
+ "Q",
+ "S",
+ "S"
+ ],
+ "field-month": "Mês",
+ "days-standAlone-narrow": [
+ "D",
+ "S",
+ "T",
+ "Q",
+ "Q",
+ "S",
+ "S"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dateFormatItem-HHmm": "HH'h'mm",
+ "dateFormat-short": "dd/MM/yy",
+ "dayPeriods-format-wide-afternoon": "tarde",
+ "field-second": "Segundo",
+ "dateFormatItem-yMMMEd": "EEE, d 'de' MMM 'de' y",
+ "field-week": "Semana",
+ "dateFormat-medium": "dd/MM/yyyy"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pt/number.js b/lib/dojo/cldr/nls/pt/number.js
index 8323386bb..c288a98f2 100644
--- a/lib/dojo/cldr/nls/pt/number.js
+++ b/lib/dojo/cldr/nls/pt/number.js
@@ -1 +1,8 @@
-({"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;(¤#,##0.00)","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/pt/number",{"group":".","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0%","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;(¤#,##0.00)","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/pt/number.js.uncompressed.js b/lib/dojo/cldr/nls/pt/number.js.uncompressed.js
new file mode 100644
index 000000000..19fa80cf5
--- /dev/null
+++ b/lib/dojo/cldr/nls/pt/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/pt/number", //begin v1.x content
+{
+ "group": ".",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "¤#,##0.00;(¤#,##0.00)",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ro/buddhist.js b/lib/dojo/cldr/nls/ro/buddhist.js
index 7f27100b5..fefffc9bc 100644
--- a/lib/dojo/cldr/nls/ro/buddhist.js
+++ b/lib/dojo/cldr/nls/ro/buddhist.js
@@ -1 +1,8 @@
-({"quarters-format-abbr":["trim. I","trim. II","trim. III","trim. IV"],"dateFormat-medium":"d MMM y G","dateFormatItem-MMMEd":"E, d MMM","dateFormatItem-MEd":"E, d MMM","dateFormatItem-yMEd":"EEE, d/M/yyyy","eraNarrow":["e.b."],"dateTimeFormat-medium":"{1}, {0}","dateFormatItem-Md":"d.M","months-standAlone-narrow":["I","F","M","A","M","I","I","A","S","O","N","D"],"dateFormatItem-EEEd":"EEE d","eraNames":["era budistă"],"days-standAlone-narrow":["D","L","M","M","J","V","S"],"dateTimeFormat-long":"{1}, {0}","dateFormatItem-yQQQ":"QQQ y","quarters-standAlone-narrow":["T1","T2","T3","T4"],"dateFormat-long":"d MMMM y G","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE, d MMM y","dateTimeFormat-short":"{1}, {0}","months-format-wide":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"dateTimeFormat-full":"{1}, {0}","dateFormatItem-yM":"M.yyyy","months-format-abbr":["ian.","feb.","mar.","apr.","mai","iun.","iul.","aug.","sept.","oct.","nov.","dec."],"eraAbbr":["e.b."],"days-format-wide":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"dateFormatItem-yQ":"'trimestrul' Q y","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["trimestrul I","trimestrul al II-lea","trimestrul al III-lea","trimestrul al IV-lea"],"dateFormat-full":"EEEE, d MMMM, y G","dateFormatItem-MMMd":"d MMM","days-format-abbr":["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dayPeriods-format-wide-pm":"PM","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","timeFormat-long":"HH:mm:ss z","dateTimeFormats-appendItem-Era":"{0} {1}","timeFormat-full":"HH:mm:ss zzzz","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","months-standAlone-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ro/buddhist",{"quarters-format-abbr":["trim. I","trim. II","trim. III","trim. IV"],"dateFormat-medium":"d MMM y G","dateFormatItem-MMMEd":"E, d MMM","dateFormatItem-MEd":"E, d MMM","dateFormatItem-yMEd":"EEE, d/M/yyyy","eraNarrow":["e.b."],"dateTimeFormat-medium":"{1}, {0}","dateFormatItem-Md":"d.M","months-standAlone-narrow":["I","F","M","A","M","I","I","A","S","O","N","D"],"dateFormatItem-EEEd":"EEE d","eraNames":["era budistă"],"days-standAlone-narrow":["D","L","M","M","J","V","S"],"dateTimeFormat-long":"{1}, {0}","dateFormatItem-yQQQ":"QQQ y","quarters-standAlone-narrow":["T1","T2","T3","T4"],"dateFormat-long":"d MMMM y G","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE, d MMM y","dateTimeFormat-short":"{1}, {0}","months-format-wide":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"dateTimeFormat-full":"{1}, {0}","dateFormatItem-yM":"M.yyyy","months-format-abbr":["ian.","feb.","mar.","apr.","mai","iun.","iul.","aug.","sept.","oct.","nov.","dec."],"eraAbbr":["e.b."],"days-format-wide":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"dateFormatItem-yQ":"'trimestrul' Q y","dateFormatItem-yMMM":"MMM y","quarters-format-wide":["trimestrul I","trimestrul al II-lea","trimestrul al III-lea","trimestrul al IV-lea"],"dateFormat-full":"EEEE, d MMMM, y G","dateFormatItem-MMMd":"d MMM","days-format-abbr":["Du","Lu","Ma","Mi","Jo","Vi","Sâ"]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ro/buddhist.js.uncompressed.js b/lib/dojo/cldr/nls/ro/buddhist.js.uncompressed.js
new file mode 100644
index 000000000..f831421ed
--- /dev/null
+++ b/lib/dojo/cldr/nls/ro/buddhist.js.uncompressed.js
@@ -0,0 +1,121 @@
+define(
+"dojo/cldr/nls/ro/buddhist", //begin v1.x content
+{
+ "quarters-format-abbr": [
+ "trim. I",
+ "trim. II",
+ "trim. III",
+ "trim. IV"
+ ],
+ "dateFormat-medium": "d MMM y G",
+ "dateFormatItem-MMMEd": "E, d MMM",
+ "dateFormatItem-MEd": "E, d MMM",
+ "dateFormatItem-yMEd": "EEE, d/M/yyyy",
+ "eraNarrow": [
+ "e.b."
+ ],
+ "dateTimeFormat-medium": "{1}, {0}",
+ "dateFormatItem-Md": "d.M",
+ "months-standAlone-narrow": [
+ "I",
+ "F",
+ "M",
+ "A",
+ "M",
+ "I",
+ "I",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateFormatItem-EEEd": "EEE d",
+ "eraNames": [
+ "era budistă"
+ ],
+ "days-standAlone-narrow": [
+ "D",
+ "L",
+ "M",
+ "M",
+ "J",
+ "V",
+ "S"
+ ],
+ "dateTimeFormat-long": "{1}, {0}",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "quarters-standAlone-narrow": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "dateFormat-long": "d MMMM y G",
+ "dateFormat-short": "d/M/yyyy",
+ "dateFormatItem-yMMMEd": "EEE, d MMM y",
+ "dateTimeFormat-short": "{1}, {0}",
+ "months-format-wide": [
+ "ianuarie",
+ "februarie",
+ "martie",
+ "aprilie",
+ "mai",
+ "iunie",
+ "iulie",
+ "august",
+ "septembrie",
+ "octombrie",
+ "noiembrie",
+ "decembrie"
+ ],
+ "dateTimeFormat-full": "{1}, {0}",
+ "dateFormatItem-yM": "M.yyyy",
+ "months-format-abbr": [
+ "ian.",
+ "feb.",
+ "mar.",
+ "apr.",
+ "mai",
+ "iun.",
+ "iul.",
+ "aug.",
+ "sept.",
+ "oct.",
+ "nov.",
+ "dec."
+ ],
+ "eraAbbr": [
+ "e.b."
+ ],
+ "days-format-wide": [
+ "duminică",
+ "luni",
+ "marți",
+ "miercuri",
+ "joi",
+ "vineri",
+ "sâmbătă"
+ ],
+ "dateFormatItem-yQ": "'trimestrul' Q y",
+ "dateFormatItem-yMMM": "MMM y",
+ "quarters-format-wide": [
+ "trimestrul I",
+ "trimestrul al II-lea",
+ "trimestrul al III-lea",
+ "trimestrul al IV-lea"
+ ],
+ "dateFormat-full": "EEEE, d MMMM, y G",
+ "dateFormatItem-MMMd": "d MMM",
+ "days-format-abbr": [
+ "Du",
+ "Lu",
+ "Ma",
+ "Mi",
+ "Jo",
+ "Vi",
+ "Sâ"
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ro/currency.js b/lib/dojo/cldr/nls/ro/currency.js
index 63a82a5ea..a6343ea5c 100644
--- a/lib/dojo/cldr/nls/ro/currency.js
+++ b/lib/dojo/cldr/nls/ro/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"dolar Hong Kong","CHF_displayName":"franc elvețian","CAD_displayName":"dolar canadian","CNY_displayName":"yuan renminbi chinezesc","AUD_displayName":"dolar australian","JPY_displayName":"yen japonez","USD_displayName":"dolar american","GBP_displayName":"liră sterlină","EUR_displayName":"euro","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ro/currency",{"HKD_displayName":"dolar Hong Kong","CHF_displayName":"franc elvețian","CAD_displayName":"dolar canadian","CNY_displayName":"yuan renminbi chinezesc","AUD_displayName":"dolar australian","JPY_displayName":"yen japonez","USD_displayName":"dolar american","GBP_displayName":"liră sterlină","EUR_displayName":"euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ro/currency.js.uncompressed.js b/lib/dojo/cldr/nls/ro/currency.js.uncompressed.js
new file mode 100644
index 000000000..05ffad43a
--- /dev/null
+++ b/lib/dojo/cldr/nls/ro/currency.js.uncompressed.js
@@ -0,0 +1,15 @@
+define(
+"dojo/cldr/nls/ro/currency", //begin v1.x content
+{
+ "HKD_displayName": "dolar Hong Kong",
+ "CHF_displayName": "franc elvețian",
+ "CAD_displayName": "dolar canadian",
+ "CNY_displayName": "yuan renminbi chinezesc",
+ "AUD_displayName": "dolar australian",
+ "JPY_displayName": "yen japonez",
+ "USD_displayName": "dolar american",
+ "GBP_displayName": "liră sterlină",
+ "EUR_displayName": "euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ro/gregorian.js b/lib/dojo/cldr/nls/ro/gregorian.js
index a5f14eda5..c154bd127 100644
--- a/lib/dojo/cldr/nls/ro/gregorian.js
+++ b/lib/dojo/cldr/nls/ro/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["I","F","M","A","M","I","I","A","S","O","N","D"],"quarters-standAlone-narrow":["T1","T2","T3","T4"],"field-weekday":"zi a săptămânii","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE, d/M/yyyy","dateFormatItem-MMMEd":"E, d MMM","eraNarrow":["î.Hr.","d.Hr."],"dateFormat-long":"d MMMM y","months-format-wide":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"dateTimeFormat-medium":"{1}, {0}","dateFormatItem-EEEd":"EEE d","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, d MMMM y","dateFormatItem-Md":"d.M","field-era":"eră","dateFormatItem-yM":"M.yyyy","months-standAlone-wide":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"timeFormat-short":"HH:mm","quarters-format-wide":["trimestrul I","trimestrul al II-lea","trimestrul al III-lea","trimestrul al IV-lea"],"timeFormat-long":"HH:mm:ss z","field-year":"an","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"'trimestrul' Q y","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"oră","dateFormatItem-MMdd":"dd.MM","months-format-abbr":["ian.","feb.","mar.","apr.","mai","iun.","iul.","aug.","sept.","oct.","nov.","dec."],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"azi","field-day-relative+1":"mâine","field-day-relative+2":"poimâine","field-day-relative+3":"răspoimâine","months-standAlone-abbr":["ian.","feb.","mar.","apr.","mai","iun.","iul.","aug.","sept.","oct.","nov.","dec."],"quarters-format-abbr":["trim. I","trim. II","trim. III","trim. IV"],"quarters-standAlone-wide":["trimestrul I","trimestrul al II-lea","trimestrul al III-lea","trimestrul al IV-lea"],"dateFormatItem-M":"L","days-standAlone-wide":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"dateFormatItem-MMMMd":"d MMMM","dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["trim. I","trim. II","trim. III","trim. IV"],"eraAbbr":["î.Hr.","d.Hr."],"field-minute":"minut","field-dayperiod":"perioada zilei","days-standAlone-abbr":["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["T1","T2","T3","T4"],"field-day-relative+-1":"ieri","dateTimeFormat-long":"{1}, {0}","field-day-relative+-2":"alaltăieri","field-day-relative+-3":"răsalaltăieri","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, d MMM","dateTimeFormat-full":"{1}, {0}","dateFormatItem-yMMMM":"MMMM y","field-day":"zi","days-format-wide":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"field-zone":"zonă","dateFormatItem-yyyyMM":"MM.yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["I","F","M","A","M","I","I","A","S","O","N","D"],"dateFormatItem-yyMM":"MM.yy","days-format-abbr":["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],"eraNames":["înainte de Hristos","după Hristos"],"days-format-narrow":["D","L","M","M","J","V","S"],"field-month":"lună","days-standAlone-narrow":["D","L","M","M","J","V","S"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"AM","dateFormatItem-MMMMEd":"E, d MMMM","dateFormat-short":"dd.MM.yyyy","field-second":"secundă","dateFormatItem-yMMMEd":"EEE, d MMM y","field-week":"săptămână","dateFormat-medium":"dd.MM.yyyy","dateTimeFormat-short":"{1}, {0}","dateFormatItem-MMMEEEd":"EEE, d MMM","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","dateFormatItem-h":"h a","dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ro/gregorian",{"months-format-narrow":["I","F","M","A","M","I","I","A","S","O","N","D"],"quarters-standAlone-narrow":["T1","T2","T3","T4"],"field-weekday":"zi a săptămânii","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE, d/M/yyyy","dateFormatItem-MMMEd":"E, d MMM","eraNarrow":["î.Hr.","d.Hr."],"dateFormat-long":"d MMMM y","months-format-wide":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"dateTimeFormat-medium":"{1}, {0}","dateFormatItem-EEEd":"EEE d","dayPeriods-format-wide-pm":"PM","dateFormat-full":"EEEE, d MMMM y","dateFormatItem-Md":"d.M","field-era":"eră","dateFormatItem-yM":"M.yyyy","months-standAlone-wide":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"timeFormat-short":"HH:mm","quarters-format-wide":["trimestrul I","trimestrul al II-lea","trimestrul al III-lea","trimestrul al IV-lea"],"timeFormat-long":"HH:mm:ss z","field-year":"an","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"'trimestrul' Q y","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"oră","dateFormatItem-MMdd":"dd.MM","months-format-abbr":["ian.","feb.","mar.","apr.","mai","iun.","iul.","aug.","sept.","oct.","nov.","dec."],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"azi","field-day-relative+1":"mâine","field-day-relative+2":"poimâine","field-day-relative+3":"răspoimâine","months-standAlone-abbr":["ian.","feb.","mar.","apr.","mai","iun.","iul.","aug.","sept.","oct.","nov.","dec."],"quarters-format-abbr":["trim. I","trim. II","trim. III","trim. IV"],"quarters-standAlone-wide":["trimestrul I","trimestrul al II-lea","trimestrul al III-lea","trimestrul al IV-lea"],"dateFormatItem-M":"L","days-standAlone-wide":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"dateFormatItem-MMMMd":"d MMMM","dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["trim. I","trim. II","trim. III","trim. IV"],"eraAbbr":["î.Hr.","d.Hr."],"field-minute":"minut","field-dayperiod":"perioada zilei","days-standAlone-abbr":["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["T1","T2","T3","T4"],"field-day-relative+-1":"ieri","dateTimeFormat-long":"{1}, {0}","field-day-relative+-2":"alaltăieri","field-day-relative+-3":"răsalaltăieri","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, d MMM","dateTimeFormat-full":"{1}, {0}","dateFormatItem-yMMMM":"MMMM y","field-day":"zi","days-format-wide":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"field-zone":"zonă","dateFormatItem-yyyyMM":"MM.yyyy","dateFormatItem-y":"y","months-standAlone-narrow":["I","F","M","A","M","I","I","A","S","O","N","D"],"dateFormatItem-yyMM":"MM.yy","days-format-abbr":["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],"eraNames":["înainte de Hristos","după Hristos"],"days-format-narrow":["D","L","M","M","J","V","S"],"field-month":"lună","days-standAlone-narrow":["D","L","M","M","J","V","S"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"AM","dateFormatItem-MMMMEd":"E, d MMMM","dateFormat-short":"dd.MM.yyyy","field-second":"secundă","dateFormatItem-yMMMEd":"EEE, d MMM y","field-week":"săptămână","dateFormat-medium":"dd.MM.yyyy","dateTimeFormat-short":"{1}, {0}","dateFormatItem-MMMEEEd":"EEE, d MMM"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ro/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/ro/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..bcce21a87
--- /dev/null
+++ b/lib/dojo/cldr/nls/ro/gregorian.js.uncompressed.js
@@ -0,0 +1,251 @@
+define(
+"dojo/cldr/nls/ro/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "I",
+ "F",
+ "M",
+ "A",
+ "M",
+ "I",
+ "I",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "quarters-standAlone-narrow": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "field-weekday": "zi a săptămânii",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yMEd": "EEE, d/M/yyyy",
+ "dateFormatItem-MMMEd": "E, d MMM",
+ "eraNarrow": [
+ "î.Hr.",
+ "d.Hr."
+ ],
+ "dateFormat-long": "d MMMM y",
+ "months-format-wide": [
+ "ianuarie",
+ "februarie",
+ "martie",
+ "aprilie",
+ "mai",
+ "iunie",
+ "iulie",
+ "august",
+ "septembrie",
+ "octombrie",
+ "noiembrie",
+ "decembrie"
+ ],
+ "dateTimeFormat-medium": "{1}, {0}",
+ "dateFormatItem-EEEd": "EEE d",
+ "dayPeriods-format-wide-pm": "PM",
+ "dateFormat-full": "EEEE, d MMMM y",
+ "dateFormatItem-Md": "d.M",
+ "field-era": "eră",
+ "dateFormatItem-yM": "M.yyyy",
+ "months-standAlone-wide": [
+ "ianuarie",
+ "februarie",
+ "martie",
+ "aprilie",
+ "mai",
+ "iunie",
+ "iulie",
+ "august",
+ "septembrie",
+ "octombrie",
+ "noiembrie",
+ "decembrie"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "trimestrul I",
+ "trimestrul al II-lea",
+ "trimestrul al III-lea",
+ "trimestrul al IV-lea"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "field-year": "an",
+ "dateFormatItem-yMMM": "MMM y",
+ "dateFormatItem-yQ": "'trimestrul' Q y",
+ "dateFormatItem-yyyyMMMM": "MMMM y",
+ "field-hour": "oră",
+ "dateFormatItem-MMdd": "dd.MM",
+ "months-format-abbr": [
+ "ian.",
+ "feb.",
+ "mar.",
+ "apr.",
+ "mai",
+ "iun.",
+ "iul.",
+ "aug.",
+ "sept.",
+ "oct.",
+ "nov.",
+ "dec."
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "field-day-relative+0": "azi",
+ "field-day-relative+1": "mâine",
+ "field-day-relative+2": "poimâine",
+ "field-day-relative+3": "răspoimâine",
+ "months-standAlone-abbr": [
+ "ian.",
+ "feb.",
+ "mar.",
+ "apr.",
+ "mai",
+ "iun.",
+ "iul.",
+ "aug.",
+ "sept.",
+ "oct.",
+ "nov.",
+ "dec."
+ ],
+ "quarters-format-abbr": [
+ "trim. I",
+ "trim. II",
+ "trim. III",
+ "trim. IV"
+ ],
+ "quarters-standAlone-wide": [
+ "trimestrul I",
+ "trimestrul al II-lea",
+ "trimestrul al III-lea",
+ "trimestrul al IV-lea"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "duminică",
+ "luni",
+ "marți",
+ "miercuri",
+ "joi",
+ "vineri",
+ "sâmbătă"
+ ],
+ "dateFormatItem-MMMMd": "d MMMM",
+ "dateFormatItem-yyMMM": "MMM yy",
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "trim. I",
+ "trim. II",
+ "trim. III",
+ "trim. IV"
+ ],
+ "eraAbbr": [
+ "î.Hr.",
+ "d.Hr."
+ ],
+ "field-minute": "minut",
+ "field-dayperiod": "perioada zilei",
+ "days-standAlone-abbr": [
+ "Du",
+ "Lu",
+ "Ma",
+ "Mi",
+ "Jo",
+ "Vi",
+ "Sâ"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "quarters-format-narrow": [
+ "T1",
+ "T2",
+ "T3",
+ "T4"
+ ],
+ "field-day-relative+-1": "ieri",
+ "dateTimeFormat-long": "{1}, {0}",
+ "field-day-relative+-2": "alaltăieri",
+ "field-day-relative+-3": "răsalaltăieri",
+ "dateFormatItem-MMMd": "d MMM",
+ "dateFormatItem-MEd": "E, d MMM",
+ "dateTimeFormat-full": "{1}, {0}",
+ "dateFormatItem-yMMMM": "MMMM y",
+ "field-day": "zi",
+ "days-format-wide": [
+ "duminică",
+ "luni",
+ "marți",
+ "miercuri",
+ "joi",
+ "vineri",
+ "sâmbătă"
+ ],
+ "field-zone": "zonă",
+ "dateFormatItem-yyyyMM": "MM.yyyy",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "I",
+ "F",
+ "M",
+ "A",
+ "M",
+ "I",
+ "I",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateFormatItem-yyMM": "MM.yy",
+ "days-format-abbr": [
+ "Du",
+ "Lu",
+ "Ma",
+ "Mi",
+ "Jo",
+ "Vi",
+ "Sâ"
+ ],
+ "eraNames": [
+ "înainte de Hristos",
+ "după Hristos"
+ ],
+ "days-format-narrow": [
+ "D",
+ "L",
+ "M",
+ "M",
+ "J",
+ "V",
+ "S"
+ ],
+ "field-month": "lună",
+ "days-standAlone-narrow": [
+ "D",
+ "L",
+ "M",
+ "M",
+ "J",
+ "V",
+ "S"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "AM",
+ "dateFormatItem-MMMMEd": "E, d MMMM",
+ "dateFormat-short": "dd.MM.yyyy",
+ "field-second": "secundă",
+ "dateFormatItem-yMMMEd": "EEE, d MMM y",
+ "field-week": "săptămână",
+ "dateFormat-medium": "dd.MM.yyyy",
+ "dateTimeFormat-short": "{1}, {0}",
+ "dateFormatItem-MMMEEEd": "EEE, d MMM"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ro/number.js b/lib/dojo/cldr/nls/ro/number.js
index 4f0befd38..a9b2e7734 100644
--- a/lib/dojo/cldr/nls/ro/number.js
+++ b/lib/dojo/cldr/nls/ro/number.js
@@ -1 +1,8 @@
-({"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ro/number",{"group":".","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0%","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ro/number.js.uncompressed.js b/lib/dojo/cldr/nls/ro/number.js.uncompressed.js
new file mode 100644
index 000000000..3cdc0af5c
--- /dev/null
+++ b/lib/dojo/cldr/nls/ro/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/ro/number", //begin v1.x content
+{
+ "group": ".",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ru/currency.js b/lib/dojo/cldr/nls/ru/currency.js
index fb05c6ddf..15e6fbe79 100644
--- a/lib/dojo/cldr/nls/ru/currency.js
+++ b/lib/dojo/cldr/nls/ru/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Гонконгский доллар","CHF_displayName":"Швейцарский франк","CAD_displayName":"Канадский доллар","CNY_displayName":"Юань Ренминби","USD_symbol":"$","AUD_displayName":"Австралийский доллар","JPY_displayName":"Японская иена","USD_displayName":"Доллар США","GBP_displayName":"Английский фунт стерлингов","EUR_displayName":"Евро","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ru/currency",{"HKD_displayName":"Гонконгский доллар","CHF_displayName":"Швейцарский франк","CAD_displayName":"Канадский доллар","CNY_displayName":"Юань Ренминби","USD_symbol":"$","AUD_displayName":"Австралийский доллар","JPY_displayName":"Японская иена","USD_displayName":"Доллар США","GBP_displayName":"Английский фунт стерлингов","EUR_displayName":"Евро"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ru/currency.js.uncompressed.js b/lib/dojo/cldr/nls/ru/currency.js.uncompressed.js
new file mode 100644
index 000000000..93694a8c6
--- /dev/null
+++ b/lib/dojo/cldr/nls/ru/currency.js.uncompressed.js
@@ -0,0 +1,16 @@
+define(
+"dojo/cldr/nls/ru/currency", //begin v1.x content
+{
+ "HKD_displayName": "Гонконгский доллар",
+ "CHF_displayName": "Швейцарский франк",
+ "CAD_displayName": "Канадский доллар",
+ "CNY_displayName": "Юань Ренминби",
+ "USD_symbol": "$",
+ "AUD_displayName": "Австралийский доллар",
+ "JPY_displayName": "Японская иена",
+ "USD_displayName": "Доллар США",
+ "GBP_displayName": "Английский фунт стерлингов",
+ "EUR_displayName": "Евро"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ru/gregorian.js b/lib/dojo/cldr/nls/ru/gregorian.js
index 7d91ce88e..33f16f881 100644
--- a/lib/dojo/cldr/nls/ru/gregorian.js
+++ b/lib/dojo/cldr/nls/ru/gregorian.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"M.y","field-dayperiod":"AM/PM","field-minute":"Минута","eraNames":["до н.э.","н.э."],"dateFormatItem-MMMEd":"ccc, d MMM","field-day-relative+-1":"Вчера","field-weekday":"День недели","dateFormatItem-yQQQ":"y QQQ","field-day-relative+-2":"Позавчера","dateFormatItem-MMdd":"dd.MM","days-standAlone-wide":["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"field-era":"Эра","field-hour":"Час","quarters-standAlone-abbr":["1-й кв.","2-й кв.","3-й кв.","4-й кв."],"dateFormatItem-yyMMMEEEd":"EEE, d MMM yy","dateFormatItem-y":"y","timeFormat-full":"H:mm:ss zzzz","dateFormatItem-yyyy":"y","months-standAlone-abbr":["янв.","февр.","март","апр.","май","июнь","июль","авг.","сент.","окт.","нояб.","дек."],"dateFormatItem-Ed":"E, d","dateFormatItem-yMMM":"LLL y","field-day-relative+0":"Сегодня","dateFormatItem-yyyyLLLL":"LLLL y","field-day-relative+1":"Завтра","days-standAlone-narrow":["В","П","В","С","Ч","П","С"],"eraAbbr":["до н.э.","н.э."],"field-day-relative+2":"Послезавтра","dateFormatItem-yyyyMM":"MM.yyyy","dateFormatItem-yyyyMMMM":"LLLL y","dateFormat-long":"d MMMM y 'г'.","timeFormat-medium":"H:mm:ss","field-zone":"Часовой пояс","dateFormatItem-Hm":"H:mm","dateFormat-medium":"dd.MM.yyyy","dateFormatItem-yyMM":"MM.yy","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-yyMMM":"LLL yy","quarters-standAlone-wide":["1-й квартал","2-й квартал","3-й квартал","4-й квартал"],"dateFormatItem-ms":"mm:ss","dateFormatItem-yyyyQQQQ":"QQQQ y 'г'.","field-year":"Год","months-standAlone-wide":["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],"field-week":"Неделя","dateFormatItem-MMMd":"d MMM","dateFormatItem-yyQ":"Q yy","timeFormat-long":"H:mm:ss z","months-format-abbr":["янв.","февр.","марта","апр.","мая","июня","июля","авг.","сент.","окт.","нояб.","дек."],"timeFormat-short":"H:mm","dateFormatItem-H":"H","field-month":"Месяц","quarters-format-abbr":["1-й кв.","2-й кв.","3-й кв.","4-й кв."],"days-format-abbr":["вс","пн","вт","ср","чт","пт","сб"],"dateFormatItem-M":"L","days-format-narrow":["В","П","В","С","Ч","П","С"],"field-second":"Секунда","field-day":"День","dateFormatItem-MEd":"E, d.M","months-format-narrow":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"days-standAlone-abbr":["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],"dateFormat-short":"dd.MM.yy","dateFormatItem-yMMMEd":"E, d MMM y","dateFormat-full":"EEEE, d MMMM y 'г'.","dateFormatItem-Md":"d.M","dateFormatItem-yMEd":"EEE, d.M.y","months-format-wide":["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"],"dateFormatItem-d":"d","quarters-format-wide":["1-й квартал","2-й квартал","3-й квартал","4-й квартал"],"days-format-wide":["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],"eraNarrow":["до н.э.","н.э."],"quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-wide-pm":"PM","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dayPeriods-format-wide-am":"AM","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ru/gregorian",{"dateFormatItem-yM":"M.y","field-dayperiod":"AM/PM","field-minute":"Минута","eraNames":["до н.э.","н.э."],"dateFormatItem-MMMEd":"ccc, d MMM","field-day-relative+-1":"Вчера","field-weekday":"День недели","dateFormatItem-yQQQ":"y QQQ","field-day-relative+-2":"Позавчера","dateFormatItem-MMdd":"dd.MM","days-standAlone-wide":["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"field-era":"Эра","field-hour":"Час","quarters-standAlone-abbr":["1-й кв.","2-й кв.","3-й кв.","4-й кв."],"dateFormatItem-yyMMMEEEd":"EEE, d MMM yy","dateFormatItem-y":"y","timeFormat-full":"H:mm:ss zzzz","dateFormatItem-yyyy":"y","months-standAlone-abbr":["янв.","февр.","март","апр.","май","июнь","июль","авг.","сент.","окт.","нояб.","дек."],"dateFormatItem-Ed":"E, d","dateFormatItem-yMMM":"LLL y","field-day-relative+0":"Сегодня","dateFormatItem-yyyyLLLL":"LLLL y","field-day-relative+1":"Завтра","days-standAlone-narrow":["В","П","В","С","Ч","П","С"],"eraAbbr":["до н.э.","н.э."],"field-day-relative+2":"Послезавтра","dateFormatItem-yyyyMM":"MM.yyyy","dateFormatItem-yyyyMMMM":"LLLL y","dateFormat-long":"d MMMM y 'г'.","timeFormat-medium":"H:mm:ss","field-zone":"Часовой пояс","dateFormatItem-Hm":"H:mm","dateFormat-medium":"dd.MM.yyyy","dateFormatItem-yyMM":"MM.yy","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-yyMMM":"LLL yy","quarters-standAlone-wide":["1-й квартал","2-й квартал","3-й квартал","4-й квартал"],"dateFormatItem-ms":"mm:ss","dateFormatItem-yyyyQQQQ":"QQQQ y 'г'.","field-year":"Год","months-standAlone-wide":["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],"field-week":"Неделя","dateFormatItem-MMMd":"d MMM","dateFormatItem-yyQ":"Q yy","timeFormat-long":"H:mm:ss z","months-format-abbr":["янв.","февр.","марта","апр.","мая","июня","июля","авг.","сент.","окт.","нояб.","дек."],"timeFormat-short":"H:mm","dateFormatItem-H":"H","field-month":"Месяц","quarters-format-abbr":["1-й кв.","2-й кв.","3-й кв.","4-й кв."],"days-format-abbr":["вс","пн","вт","ср","чт","пт","сб"],"dateFormatItem-M":"L","days-format-narrow":["В","П","В","С","Ч","П","С"],"field-second":"Секунда","field-day":"День","dateFormatItem-MEd":"E, d.M","months-format-narrow":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"days-standAlone-abbr":["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],"dateFormat-short":"dd.MM.yy","dateFormatItem-yMMMEd":"E, d MMM y","dateFormat-full":"EEEE, d MMMM y 'г'.","dateFormatItem-Md":"d.M","dateFormatItem-yMEd":"EEE, d.M.y","months-format-wide":["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"],"dateFormatItem-d":"d","quarters-format-wide":["1-й квартал","2-й квартал","3-й квартал","4-й квартал"],"days-format-wide":["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],"eraNarrow":["до н.э.","н.э."]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ru/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/ru/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..26fb1b5aa
--- /dev/null
+++ b/lib/dojo/cldr/nls/ru/gregorian.js.uncompressed.js
@@ -0,0 +1,232 @@
+define(
+"dojo/cldr/nls/ru/gregorian", //begin v1.x content
+{
+ "dateFormatItem-yM": "M.y",
+ "field-dayperiod": "AM/PM",
+ "field-minute": "Минута",
+ "eraNames": [
+ "до н.э.",
+ "н.э."
+ ],
+ "dateFormatItem-MMMEd": "ccc, d MMM",
+ "field-day-relative+-1": "Вчера",
+ "field-weekday": "День недели",
+ "dateFormatItem-yQQQ": "y QQQ",
+ "field-day-relative+-2": "Позавчера",
+ "dateFormatItem-MMdd": "dd.MM",
+ "days-standAlone-wide": [
+ "Воскресенье",
+ "Понедельник",
+ "Вторник",
+ "Среда",
+ "Четверг",
+ "Пятница",
+ "Суббота"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "months-standAlone-narrow": [
+ "Я",
+ "Ф",
+ "М",
+ "А",
+ "М",
+ "И",
+ "И",
+ "А",
+ "С",
+ "О",
+ "Н",
+ "Д"
+ ],
+ "field-era": "Эра",
+ "field-hour": "Час",
+ "quarters-standAlone-abbr": [
+ "1-й кв.",
+ "2-й кв.",
+ "3-й кв.",
+ "4-й кв."
+ ],
+ "dateFormatItem-yyMMMEEEd": "EEE, d MMM yy",
+ "dateFormatItem-y": "y",
+ "timeFormat-full": "H:mm:ss zzzz",
+ "dateFormatItem-yyyy": "y",
+ "months-standAlone-abbr": [
+ "янв.",
+ "февр.",
+ "март",
+ "апр.",
+ "май",
+ "июнь",
+ "июль",
+ "авг.",
+ "сент.",
+ "окт.",
+ "нояб.",
+ "дек."
+ ],
+ "dateFormatItem-Ed": "E, d",
+ "dateFormatItem-yMMM": "LLL y",
+ "field-day-relative+0": "Сегодня",
+ "dateFormatItem-yyyyLLLL": "LLLL y",
+ "field-day-relative+1": "Завтра",
+ "days-standAlone-narrow": [
+ "В",
+ "П",
+ "В",
+ "С",
+ "Ч",
+ "П",
+ "С"
+ ],
+ "eraAbbr": [
+ "до н.э.",
+ "н.э."
+ ],
+ "field-day-relative+2": "Послезавтра",
+ "dateFormatItem-yyyyMM": "MM.yyyy",
+ "dateFormatItem-yyyyMMMM": "LLLL y",
+ "dateFormat-long": "d MMMM y 'г'.",
+ "timeFormat-medium": "H:mm:ss",
+ "field-zone": "Часовой пояс",
+ "dateFormatItem-Hm": "H:mm",
+ "dateFormat-medium": "dd.MM.yyyy",
+ "dateFormatItem-yyMM": "MM.yy",
+ "dateFormatItem-Hms": "H:mm:ss",
+ "dateFormatItem-yyMMM": "LLL yy",
+ "quarters-standAlone-wide": [
+ "1-й квартал",
+ "2-й квартал",
+ "3-й квартал",
+ "4-й квартал"
+ ],
+ "dateFormatItem-ms": "mm:ss",
+ "dateFormatItem-yyyyQQQQ": "QQQQ y 'г'.",
+ "field-year": "Год",
+ "months-standAlone-wide": [
+ "Январь",
+ "Февраль",
+ "Март",
+ "Апрель",
+ "Май",
+ "Июнь",
+ "Июль",
+ "Август",
+ "Сентябрь",
+ "Октябрь",
+ "Ноябрь",
+ "Декабрь"
+ ],
+ "field-week": "Неделя",
+ "dateFormatItem-MMMd": "d MMM",
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-long": "H:mm:ss z",
+ "months-format-abbr": [
+ "янв.",
+ "февр.",
+ "марта",
+ "апр.",
+ "мая",
+ "июня",
+ "июля",
+ "авг.",
+ "сент.",
+ "окт.",
+ "нояб.",
+ "дек."
+ ],
+ "timeFormat-short": "H:mm",
+ "dateFormatItem-H": "H",
+ "field-month": "Месяц",
+ "quarters-format-abbr": [
+ "1-й кв.",
+ "2-й кв.",
+ "3-й кв.",
+ "4-й кв."
+ ],
+ "days-format-abbr": [
+ "вс",
+ "пн",
+ "вт",
+ "ср",
+ "чт",
+ "пт",
+ "сб"
+ ],
+ "dateFormatItem-M": "L",
+ "days-format-narrow": [
+ "В",
+ "П",
+ "В",
+ "С",
+ "Ч",
+ "П",
+ "С"
+ ],
+ "field-second": "Секунда",
+ "field-day": "День",
+ "dateFormatItem-MEd": "E, d.M",
+ "months-format-narrow": [
+ "Я",
+ "Ф",
+ "М",
+ "А",
+ "М",
+ "И",
+ "И",
+ "А",
+ "С",
+ "О",
+ "Н",
+ "Д"
+ ],
+ "days-standAlone-abbr": [
+ "Вс",
+ "Пн",
+ "Вт",
+ "Ср",
+ "Чт",
+ "Пт",
+ "Сб"
+ ],
+ "dateFormat-short": "dd.MM.yy",
+ "dateFormatItem-yMMMEd": "E, d MMM y",
+ "dateFormat-full": "EEEE, d MMMM y 'г'.",
+ "dateFormatItem-Md": "d.M",
+ "dateFormatItem-yMEd": "EEE, d.M.y",
+ "months-format-wide": [
+ "января",
+ "февраля",
+ "марта",
+ "апреля",
+ "мая",
+ "июня",
+ "июля",
+ "августа",
+ "сентября",
+ "октября",
+ "ноября",
+ "декабря"
+ ],
+ "dateFormatItem-d": "d",
+ "quarters-format-wide": [
+ "1-й квартал",
+ "2-й квартал",
+ "3-й квартал",
+ "4-й квартал"
+ ],
+ "days-format-wide": [
+ "воскресенье",
+ "понедельник",
+ "вторник",
+ "среда",
+ "четверг",
+ "пятница",
+ "суббота"
+ ],
+ "eraNarrow": [
+ "до н.э.",
+ "н.э."
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ru/number.js b/lib/dojo/cldr/nls/ru/number.js
index be45af22b..bfa8f2fd5 100644
--- a/lib/dojo/cldr/nls/ru/number.js
+++ b/lib/dojo/cldr/nls/ru/number.js
@@ -1 +1,8 @@
-({"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/ru/number",{"group":" ","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0 %","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/ru/number.js.uncompressed.js b/lib/dojo/cldr/nls/ru/number.js.uncompressed.js
new file mode 100644
index 000000000..0afed8711
--- /dev/null
+++ b/lib/dojo/cldr/nls/ru/number.js.uncompressed.js
@@ -0,0 +1,21 @@
+define(
+"dojo/cldr/nls/ru/number", //begin v1.x content
+{
+ "group": " ",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0 %",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sk/currency.js b/lib/dojo/cldr/nls/sk/currency.js
index f1b79665a..8fe9859b2 100644
--- a/lib/dojo/cldr/nls/sk/currency.js
+++ b/lib/dojo/cldr/nls/sk/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Hong Kongský dolár","CHF_displayName":"Švajčiarský frank","CAD_displayName":"Kanadský dolár","CNY_displayName":"Čínsky Yuan Renminbi","AUD_displayName":"Austrálsky dolár","JPY_displayName":"Japonský yen","USD_displayName":"US dolár","GBP_displayName":"Britská libra","EUR_displayName":"Euro","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/sk/currency",{"HKD_displayName":"Hong Kongský dolár","CHF_displayName":"Švajčiarský frank","CAD_displayName":"Kanadský dolár","CNY_displayName":"Čínsky Yuan Renminbi","AUD_displayName":"Austrálsky dolár","JPY_displayName":"Japonský yen","USD_displayName":"US dolár","GBP_displayName":"Britská libra","EUR_displayName":"Euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sk/currency.js.uncompressed.js b/lib/dojo/cldr/nls/sk/currency.js.uncompressed.js
new file mode 100644
index 000000000..9b4095a38
--- /dev/null
+++ b/lib/dojo/cldr/nls/sk/currency.js.uncompressed.js
@@ -0,0 +1,15 @@
+define(
+"dojo/cldr/nls/sk/currency", //begin v1.x content
+{
+ "HKD_displayName": "Hong Kongský dolár",
+ "CHF_displayName": "Švajčiarský frank",
+ "CAD_displayName": "Kanadský dolár",
+ "CNY_displayName": "Čínsky Yuan Renminbi",
+ "AUD_displayName": "Austrálsky dolár",
+ "JPY_displayName": "Japonský yen",
+ "USD_displayName": "US dolár",
+ "GBP_displayName": "Britská libra",
+ "EUR_displayName": "Euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sk/gregorian.js b/lib/dojo/cldr/nls/sk/gregorian.js
index 513ec559c..c5629b3ad 100644
--- a/lib/dojo/cldr/nls/sk/gregorian.js
+++ b/lib/dojo/cldr/nls/sk/gregorian.js
@@ -1 +1,8 @@
-({"field-dayperiod":"Časť dňa","dateFormatItem-yQ":"Q yyyy","dayPeriods-format-wide-pm":"popoludní","field-minute":"Minúta","eraNames":["pred n.l.","n.l."],"dateFormatItem-MMMEd":"E, d. MMM","field-day-relative+-1":"Včera","field-weekday":"Deň v týždni","dateFormatItem-yQQQ":"QQQ y","field-day-relative+-2":"Predvčerom","field-day-relative+-3":"Pred tromi dňami","days-standAlone-wide":["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],"months-standAlone-narrow":["j","f","m","a","m","j","j","a","s","o","n","d"],"field-era":"Éra","field-hour":"Hodina","dayPeriods-format-wide-am":"dopoludnia","timeFormat-full":"H:mm:ss zzzz","months-standAlone-abbr":["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"],"dateFormatItem-yMMM":"LLL y","field-day-relative+0":"Dnes","field-day-relative+1":"Zajtra","days-standAlone-narrow":["N","P","U","S","Š","P","S"],"eraAbbr":["pred n.l.","n.l."],"field-day-relative+2":"Pozajtra","field-day-relative+3":"O tri dni","dateFormatItem-yyyyMMMM":"LLLL y","dateFormat-long":"d. MMMM y","timeFormat-medium":"H:mm:ss","dateFormatItem-EEEd":"EEE, d.","field-zone":"Pásmo","dateFormatItem-Hm":"H:mm","dateFormat-medium":"d.M.yyyy","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-yyQQQQ":"QQQQ yy","quarters-standAlone-wide":["1. štvrťrok","2. štvrťrok","3. štvrťrok","4. štvrťrok"],"dateFormatItem-yMMMM":"LLLL y","dateFormatItem-ms":"mm:ss","field-year":"Rok","months-standAlone-wide":["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],"field-week":"Týždeň","dateFormatItem-MMMMEd":"E, d. MMMM","dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q yy","timeFormat-long":"H:mm:ss z","months-format-abbr":["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"],"timeFormat-short":"H:mm","dateFormatItem-H":"H","field-month":"Mesiac","dateFormatItem-MMMMd":"d. MMMM","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"days-format-abbr":["ne","po","ut","st","št","pi","so"],"dateFormatItem-mmss":"mm:ss","days-format-narrow":["N","P","U","S","Š","P","S"],"field-second":"Sekunda","field-day":"Deň","dateFormatItem-MEd":"E, d.M.","months-format-narrow":["j","f","m","a","m","j","j","a","s","o","n","d"],"days-standAlone-abbr":["ne","po","ut","st","št","pi","so"],"dateFormat-short":"d.M.yyyy","dateFormatItem-yyyyM":"M.yyyy","dateFormatItem-yMMMEd":"EEE, d. MMM y","dateFormat-full":"EEEE, d. MMMM y","dateFormatItem-Md":"d.M.","dateFormatItem-yMEd":"EEE, d.M.yyyy","months-format-wide":["januára","februára","marca","apríla","mája","júna","júla","augusta","septembra","októbra","novembra","decembra"],"dateFormatItem-d":"d.","quarters-format-wide":["1. štvrťrok","2. štvrťrok","3. štvrťrok","4. štvrťrok"],"days-format-wide":["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],"eraNarrow":["pred n.l.","n.l."],"quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yM":"y-M","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-M":"L","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/sk/gregorian",{"field-dayperiod":"Časť dňa","dateFormatItem-yQ":"Q yyyy","dayPeriods-format-wide-pm":"popoludní","field-minute":"Minúta","eraNames":["pred n.l.","n.l."],"dateFormatItem-MMMEd":"E, d. MMM","field-day-relative+-1":"Včera","field-weekday":"Deň v týždni","dateFormatItem-yQQQ":"QQQ y","field-day-relative+-2":"Predvčerom","field-day-relative+-3":"Pred tromi dňami","days-standAlone-wide":["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],"months-standAlone-narrow":["j","f","m","a","m","j","j","a","s","o","n","d"],"field-era":"Éra","field-hour":"Hodina","dayPeriods-format-wide-am":"dopoludnia","timeFormat-full":"H:mm:ss zzzz","months-standAlone-abbr":["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"],"dateFormatItem-yMMM":"LLL y","field-day-relative+0":"Dnes","field-day-relative+1":"Zajtra","days-standAlone-narrow":["N","P","U","S","Š","P","S"],"eraAbbr":["pred n.l.","n.l."],"field-day-relative+2":"Pozajtra","field-day-relative+3":"O tri dni","dateFormatItem-yyyyMMMM":"LLLL y","dateFormat-long":"d. MMMM y","timeFormat-medium":"H:mm:ss","dateFormatItem-EEEd":"EEE, d.","field-zone":"Pásmo","dateFormatItem-Hm":"H:mm","dateFormat-medium":"d.M.yyyy","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-yyQQQQ":"QQQQ yy","quarters-standAlone-wide":["1. štvrťrok","2. štvrťrok","3. štvrťrok","4. štvrťrok"],"dateFormatItem-yMMMM":"LLLL y","dateFormatItem-ms":"mm:ss","field-year":"Rok","months-standAlone-wide":["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],"field-week":"Týždeň","dateFormatItem-MMMMEd":"E, d. MMMM","dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q yy","timeFormat-long":"H:mm:ss z","months-format-abbr":["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"],"timeFormat-short":"H:mm","dateFormatItem-H":"H","field-month":"Mesiac","dateFormatItem-MMMMd":"d. MMMM","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"days-format-abbr":["ne","po","ut","st","št","pi","so"],"dateFormatItem-mmss":"mm:ss","days-format-narrow":["N","P","U","S","Š","P","S"],"field-second":"Sekunda","field-day":"Deň","dateFormatItem-MEd":"E, d.M.","months-format-narrow":["j","f","m","a","m","j","j","a","s","o","n","d"],"days-standAlone-abbr":["ne","po","ut","st","št","pi","so"],"dateFormat-short":"d.M.yyyy","dateFormatItem-yyyyM":"M.yyyy","dateFormatItem-yMMMEd":"EEE, d. MMM y","dateFormat-full":"EEEE, d. MMMM y","dateFormatItem-Md":"d.M.","dateFormatItem-yMEd":"EEE, d.M.yyyy","months-format-wide":["januára","februára","marca","apríla","mája","júna","júla","augusta","septembra","októbra","novembra","decembra"],"dateFormatItem-d":"d.","quarters-format-wide":["1. štvrťrok","2. štvrťrok","3. štvrťrok","4. štvrťrok"],"days-format-wide":["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],"eraNarrow":["pred n.l.","n.l."]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sk/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/sk/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..578f7a5a5
--- /dev/null
+++ b/lib/dojo/cldr/nls/sk/gregorian.js.uncompressed.js
@@ -0,0 +1,225 @@
+define(
+"dojo/cldr/nls/sk/gregorian", //begin v1.x content
+{
+ "field-dayperiod": "Časť dňa",
+ "dateFormatItem-yQ": "Q yyyy",
+ "dayPeriods-format-wide-pm": "popoludní",
+ "field-minute": "Minúta",
+ "eraNames": [
+ "pred n.l.",
+ "n.l."
+ ],
+ "dateFormatItem-MMMEd": "E, d. MMM",
+ "field-day-relative+-1": "Včera",
+ "field-weekday": "Deň v týždni",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "field-day-relative+-2": "Predvčerom",
+ "field-day-relative+-3": "Pred tromi dňami",
+ "days-standAlone-wide": [
+ "nedeľa",
+ "pondelok",
+ "utorok",
+ "streda",
+ "štvrtok",
+ "piatok",
+ "sobota"
+ ],
+ "months-standAlone-narrow": [
+ "j",
+ "f",
+ "m",
+ "a",
+ "m",
+ "j",
+ "j",
+ "a",
+ "s",
+ "o",
+ "n",
+ "d"
+ ],
+ "field-era": "Éra",
+ "field-hour": "Hodina",
+ "dayPeriods-format-wide-am": "dopoludnia",
+ "timeFormat-full": "H:mm:ss zzzz",
+ "months-standAlone-abbr": [
+ "jan",
+ "feb",
+ "mar",
+ "apr",
+ "máj",
+ "jún",
+ "júl",
+ "aug",
+ "sep",
+ "okt",
+ "nov",
+ "dec"
+ ],
+ "dateFormatItem-yMMM": "LLL y",
+ "field-day-relative+0": "Dnes",
+ "field-day-relative+1": "Zajtra",
+ "days-standAlone-narrow": [
+ "N",
+ "P",
+ "U",
+ "S",
+ "Š",
+ "P",
+ "S"
+ ],
+ "eraAbbr": [
+ "pred n.l.",
+ "n.l."
+ ],
+ "field-day-relative+2": "Pozajtra",
+ "field-day-relative+3": "O tri dni",
+ "dateFormatItem-yyyyMMMM": "LLLL y",
+ "dateFormat-long": "d. MMMM y",
+ "timeFormat-medium": "H:mm:ss",
+ "dateFormatItem-EEEd": "EEE, d.",
+ "field-zone": "Pásmo",
+ "dateFormatItem-Hm": "H:mm",
+ "dateFormat-medium": "d.M.yyyy",
+ "dateFormatItem-Hms": "H:mm:ss",
+ "dateFormatItem-yyQQQQ": "QQQQ yy",
+ "quarters-standAlone-wide": [
+ "1. štvrťrok",
+ "2. štvrťrok",
+ "3. štvrťrok",
+ "4. štvrťrok"
+ ],
+ "dateFormatItem-yMMMM": "LLLL y",
+ "dateFormatItem-ms": "mm:ss",
+ "field-year": "Rok",
+ "months-standAlone-wide": [
+ "január",
+ "február",
+ "marec",
+ "apríl",
+ "máj",
+ "jún",
+ "júl",
+ "august",
+ "september",
+ "október",
+ "november",
+ "december"
+ ],
+ "field-week": "Týždeň",
+ "dateFormatItem-MMMMEd": "E, d. MMMM",
+ "dateFormatItem-MMMd": "d. MMM",
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-long": "H:mm:ss z",
+ "months-format-abbr": [
+ "jan",
+ "feb",
+ "mar",
+ "apr",
+ "máj",
+ "jún",
+ "júl",
+ "aug",
+ "sep",
+ "okt",
+ "nov",
+ "dec"
+ ],
+ "timeFormat-short": "H:mm",
+ "dateFormatItem-H": "H",
+ "field-month": "Mesiac",
+ "dateFormatItem-MMMMd": "d. MMMM",
+ "quarters-format-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "days-format-abbr": [
+ "ne",
+ "po",
+ "ut",
+ "st",
+ "št",
+ "pi",
+ "so"
+ ],
+ "dateFormatItem-mmss": "mm:ss",
+ "days-format-narrow": [
+ "N",
+ "P",
+ "U",
+ "S",
+ "Š",
+ "P",
+ "S"
+ ],
+ "field-second": "Sekunda",
+ "field-day": "Deň",
+ "dateFormatItem-MEd": "E, d.M.",
+ "months-format-narrow": [
+ "j",
+ "f",
+ "m",
+ "a",
+ "m",
+ "j",
+ "j",
+ "a",
+ "s",
+ "o",
+ "n",
+ "d"
+ ],
+ "days-standAlone-abbr": [
+ "ne",
+ "po",
+ "ut",
+ "st",
+ "št",
+ "pi",
+ "so"
+ ],
+ "dateFormat-short": "d.M.yyyy",
+ "dateFormatItem-yyyyM": "M.yyyy",
+ "dateFormatItem-yMMMEd": "EEE, d. MMM y",
+ "dateFormat-full": "EEEE, d. MMMM y",
+ "dateFormatItem-Md": "d.M.",
+ "dateFormatItem-yMEd": "EEE, d.M.yyyy",
+ "months-format-wide": [
+ "januára",
+ "februára",
+ "marca",
+ "apríla",
+ "mája",
+ "júna",
+ "júla",
+ "augusta",
+ "septembra",
+ "októbra",
+ "novembra",
+ "decembra"
+ ],
+ "dateFormatItem-d": "d.",
+ "quarters-format-wide": [
+ "1. štvrťrok",
+ "2. štvrťrok",
+ "3. štvrťrok",
+ "4. štvrťrok"
+ ],
+ "days-format-wide": [
+ "nedeľa",
+ "pondelok",
+ "utorok",
+ "streda",
+ "štvrtok",
+ "piatok",
+ "sobota"
+ ],
+ "eraNarrow": [
+ "pred n.l.",
+ "n.l."
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sk/number.js b/lib/dojo/cldr/nls/sk/number.js
index 8d495cd0f..3bbb8cac6 100644
--- a/lib/dojo/cldr/nls/sk/number.js
+++ b/lib/dojo/cldr/nls/sk/number.js
@@ -1 +1,8 @@
-({"currencyFormat":"#,##0.00 ¤","group":" ","decimal":",","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","percentFormat":"#,##0%","decimalFormat":"#,##0.###","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/sk/number",{"currencyFormat":"#,##0.00 ¤","group":" ","decimal":","}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sk/number.js.uncompressed.js b/lib/dojo/cldr/nls/sk/number.js.uncompressed.js
new file mode 100644
index 000000000..756c23ebc
--- /dev/null
+++ b/lib/dojo/cldr/nls/sk/number.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dojo/cldr/nls/sk/number", //begin v1.x content
+{
+ "currencyFormat": "#,##0.00 ¤",
+ "group": " ",
+ "decimal": ","
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sl/currency.js b/lib/dojo/cldr/nls/sl/currency.js
index f071a988d..a704c6f4b 100644
--- a/lib/dojo/cldr/nls/sl/currency.js
+++ b/lib/dojo/cldr/nls/sl/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"hongkonški dolar","CHF_displayName":"švicarski frank","JPY_symbol":"¥","CAD_displayName":"kanadski dolar","CNY_displayName":"kitajski juan renminbi","USD_symbol":"$","AUD_displayName":"avstralski dolar","JPY_displayName":"japonski jen","USD_displayName":"ameriški dolar","GBP_displayName":"britanski funt","EUR_displayName":"evro","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/sl/currency",{"HKD_displayName":"hongkonški dolar","CHF_displayName":"švicarski frank","JPY_symbol":"¥","CAD_displayName":"kanadski dolar","CNY_displayName":"kitajski juan renminbi","USD_symbol":"$","AUD_displayName":"avstralski dolar","JPY_displayName":"japonski jen","USD_displayName":"ameriški dolar","GBP_displayName":"britanski funt","EUR_displayName":"evro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sl/currency.js.uncompressed.js b/lib/dojo/cldr/nls/sl/currency.js.uncompressed.js
new file mode 100644
index 000000000..d1167f39d
--- /dev/null
+++ b/lib/dojo/cldr/nls/sl/currency.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dojo/cldr/nls/sl/currency", //begin v1.x content
+{
+ "HKD_displayName": "hongkonški dolar",
+ "CHF_displayName": "švicarski frank",
+ "JPY_symbol": "¥",
+ "CAD_displayName": "kanadski dolar",
+ "CNY_displayName": "kitajski juan renminbi",
+ "USD_symbol": "$",
+ "AUD_displayName": "avstralski dolar",
+ "JPY_displayName": "japonski jen",
+ "USD_displayName": "ameriški dolar",
+ "GBP_displayName": "britanski funt",
+ "EUR_displayName": "evro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sl/gregorian.js b/lib/dojo/cldr/nls/sl/gregorian.js
index 52562be1a..2f695f40f 100644
--- a/lib/dojo/cldr/nls/sl/gregorian.js
+++ b/lib/dojo/cldr/nls/sl/gregorian.js
@@ -1 +1,8 @@
-({"field-dayperiod":"Čas dneva","dayPeriods-format-wide-pm":"pop.","field-minute":"Minuta","eraNames":["pred našim štetjem","naše štetje"],"dateFormatItem-MMMEd":"E., d. MMM","field-day-relative+-1":"Včeraj","field-weekday":"Dan v tednu","field-day-relative+-2":"Predvčerajšnjim","field-day-relative+-3":"Pred tremi dnevi","days-standAlone-wide":["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],"months-standAlone-narrow":["j","f","m","a","m","j","j","a","s","o","n","d"],"field-era":"Doba","field-hour":"Ura","dayPeriods-format-wide-am":"dop.","dateFormatItem-y":"y","timeFormat-full":"HH:mm:ss zzzz","months-standAlone-abbr":["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],"dateFormatItem-Ed":"E., d.","dateFormatItem-yMMM":"MMM y","field-day-relative+0":"Danes","field-day-relative+1":"Jutri","days-standAlone-narrow":["n","p","t","s","č","p","s"],"eraAbbr":["pr. n. št.","po Kr."],"field-day-relative+2":"Pojutrišnjem","field-day-relative+3":"Čez tri dni","dateFormatItem-yyyyMMMM":"MMMM y","dateFormat-long":"dd. MMMM y","timeFormat-medium":"HH:mm:ss","field-zone":"Območje","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"d. MMM yyyy","dateFormatItem-Hms":"HH:mm:ss","quarters-standAlone-wide":["1. četrtletje","2. četrtletje","3. četrtletje","4. četrtletje"],"dateFormatItem-ms":"mm:ss","field-year":"Leto","field-week":"Teden","months-standAlone-wide":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q/yy","timeFormat-long":"HH:mm:ss z","months-format-abbr":["jan.","feb.","mar.","apr.","maj","jun.","jul.","avg.","sep.","okt.","nov.","dec."],"timeFormat-short":"HH:mm","field-month":"Mesec","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"days-format-abbr":["ned","pon","tor","sre","čet","pet","sob"],"dateFormatItem-mmss":"mm:ss","days-format-narrow":["n","p","t","s","č","p","s"],"field-second":"Sekunda","field-day":"Dan","dateFormatItem-MEd":"E., d. MM.","months-format-narrow":["j","f","m","a","m","j","j","a","s","o","n","d"],"days-standAlone-abbr":["ned","pon","tor","sre","čet","pet","sob"],"dateFormat-short":"d. MM. yy","dateFormatItem-yyyyM":"M/yyyy","dateFormatItem-yMMMEd":"E., d. MMM y","dateFormat-full":"EEEE, dd. MMMM y","dateFormatItem-Md":"d. M.","dateFormatItem-yMEd":"E., d. M. y","months-format-wide":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"quarters-format-wide":["1. četrtletje","2. četrtletje","3. četrtletje","4. četrtletje"],"days-format-wide":["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],"eraNarrow":["pr. n. št.","po Kr."],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"y QQQ","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yM":"y-M","dateFormatItem-yQ":"y Q","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","dateFormatItem-M":"L","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"dateFormatItem-d":"d","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/sl/gregorian",{"field-dayperiod":"Čas dneva","dayPeriods-format-wide-pm":"pop.","field-minute":"Minuta","eraNames":["pred našim štetjem","naše štetje"],"dateFormatItem-MMMEd":"E., d. MMM","field-day-relative+-1":"Včeraj","field-weekday":"Dan v tednu","field-day-relative+-2":"Predvčerajšnjim","field-day-relative+-3":"Pred tremi dnevi","days-standAlone-wide":["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],"months-standAlone-narrow":["j","f","m","a","m","j","j","a","s","o","n","d"],"field-era":"Doba","field-hour":"Ura","dayPeriods-format-wide-am":"dop.","dateFormatItem-y":"y","timeFormat-full":"HH:mm:ss zzzz","months-standAlone-abbr":["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],"dateFormatItem-Ed":"E., d.","dateFormatItem-yMMM":"MMM y","field-day-relative+0":"Danes","field-day-relative+1":"Jutri","days-standAlone-narrow":["n","p","t","s","č","p","s"],"eraAbbr":["pr. n. št.","po Kr."],"field-day-relative+2":"Pojutrišnjem","field-day-relative+3":"Čez tri dni","dateFormatItem-yyyyMMMM":"MMMM y","dateFormat-long":"dd. MMMM y","timeFormat-medium":"HH:mm:ss","field-zone":"Območje","dateFormatItem-Hm":"HH:mm","dateFormat-medium":"d. MMM yyyy","dateFormatItem-Hms":"HH:mm:ss","quarters-standAlone-wide":["1. četrtletje","2. četrtletje","3. četrtletje","4. četrtletje"],"dateFormatItem-ms":"mm:ss","field-year":"Leto","field-week":"Teden","months-standAlone-wide":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"dateFormatItem-MMMd":"d. MMM","dateFormatItem-yyQ":"Q/yy","timeFormat-long":"HH:mm:ss z","months-format-abbr":["jan.","feb.","mar.","apr.","maj","jun.","jul.","avg.","sep.","okt.","nov.","dec."],"timeFormat-short":"HH:mm","field-month":"Mesec","quarters-format-abbr":["Q1","Q2","Q3","Q4"],"days-format-abbr":["ned","pon","tor","sre","čet","pet","sob"],"dateFormatItem-mmss":"mm:ss","days-format-narrow":["n","p","t","s","č","p","s"],"field-second":"Sekunda","field-day":"Dan","dateFormatItem-MEd":"E., d. MM.","months-format-narrow":["j","f","m","a","m","j","j","a","s","o","n","d"],"days-standAlone-abbr":["ned","pon","tor","sre","čet","pet","sob"],"dateFormat-short":"d. MM. yy","dateFormatItem-yyyyM":"M/yyyy","dateFormatItem-yMMMEd":"E., d. MMM y","dateFormat-full":"EEEE, dd. MMMM y","dateFormatItem-Md":"d. M.","dateFormatItem-yMEd":"E., d. M. y","months-format-wide":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"quarters-format-wide":["1. četrtletje","2. četrtletje","3. četrtletje","4. četrtletje"],"days-format-wide":["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],"eraNarrow":["pr. n. št.","po Kr."]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sl/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/sl/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..a6f44d7ef
--- /dev/null
+++ b/lib/dojo/cldr/nls/sl/gregorian.js.uncompressed.js
@@ -0,0 +1,218 @@
+define(
+"dojo/cldr/nls/sl/gregorian", //begin v1.x content
+{
+ "field-dayperiod": "Čas dneva",
+ "dayPeriods-format-wide-pm": "pop.",
+ "field-minute": "Minuta",
+ "eraNames": [
+ "pred našim štetjem",
+ "naše štetje"
+ ],
+ "dateFormatItem-MMMEd": "E., d. MMM",
+ "field-day-relative+-1": "Včeraj",
+ "field-weekday": "Dan v tednu",
+ "field-day-relative+-2": "Predvčerajšnjim",
+ "field-day-relative+-3": "Pred tremi dnevi",
+ "days-standAlone-wide": [
+ "nedelja",
+ "ponedeljek",
+ "torek",
+ "sreda",
+ "četrtek",
+ "petek",
+ "sobota"
+ ],
+ "months-standAlone-narrow": [
+ "j",
+ "f",
+ "m",
+ "a",
+ "m",
+ "j",
+ "j",
+ "a",
+ "s",
+ "o",
+ "n",
+ "d"
+ ],
+ "field-era": "Doba",
+ "field-hour": "Ura",
+ "dayPeriods-format-wide-am": "dop.",
+ "dateFormatItem-y": "y",
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "months-standAlone-abbr": [
+ "jan",
+ "feb",
+ "mar",
+ "apr",
+ "maj",
+ "jun",
+ "jul",
+ "avg",
+ "sep",
+ "okt",
+ "nov",
+ "dec"
+ ],
+ "dateFormatItem-Ed": "E., d.",
+ "dateFormatItem-yMMM": "MMM y",
+ "field-day-relative+0": "Danes",
+ "field-day-relative+1": "Jutri",
+ "days-standAlone-narrow": [
+ "n",
+ "p",
+ "t",
+ "s",
+ "č",
+ "p",
+ "s"
+ ],
+ "eraAbbr": [
+ "pr. n. št.",
+ "po Kr."
+ ],
+ "field-day-relative+2": "Pojutrišnjem",
+ "field-day-relative+3": "Čez tri dni",
+ "dateFormatItem-yyyyMMMM": "MMMM y",
+ "dateFormat-long": "dd. MMMM y",
+ "timeFormat-medium": "HH:mm:ss",
+ "field-zone": "Območje",
+ "dateFormatItem-Hm": "HH:mm",
+ "dateFormat-medium": "d. MMM yyyy",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "quarters-standAlone-wide": [
+ "1. četrtletje",
+ "2. četrtletje",
+ "3. četrtletje",
+ "4. četrtletje"
+ ],
+ "dateFormatItem-ms": "mm:ss",
+ "field-year": "Leto",
+ "field-week": "Teden",
+ "months-standAlone-wide": [
+ "januar",
+ "februar",
+ "marec",
+ "april",
+ "maj",
+ "junij",
+ "julij",
+ "avgust",
+ "september",
+ "oktober",
+ "november",
+ "december"
+ ],
+ "dateFormatItem-MMMd": "d. MMM",
+ "dateFormatItem-yyQ": "Q/yy",
+ "timeFormat-long": "HH:mm:ss z",
+ "months-format-abbr": [
+ "jan.",
+ "feb.",
+ "mar.",
+ "apr.",
+ "maj",
+ "jun.",
+ "jul.",
+ "avg.",
+ "sep.",
+ "okt.",
+ "nov.",
+ "dec."
+ ],
+ "timeFormat-short": "HH:mm",
+ "field-month": "Mesec",
+ "quarters-format-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "days-format-abbr": [
+ "ned",
+ "pon",
+ "tor",
+ "sre",
+ "čet",
+ "pet",
+ "sob"
+ ],
+ "dateFormatItem-mmss": "mm:ss",
+ "days-format-narrow": [
+ "n",
+ "p",
+ "t",
+ "s",
+ "č",
+ "p",
+ "s"
+ ],
+ "field-second": "Sekunda",
+ "field-day": "Dan",
+ "dateFormatItem-MEd": "E., d. MM.",
+ "months-format-narrow": [
+ "j",
+ "f",
+ "m",
+ "a",
+ "m",
+ "j",
+ "j",
+ "a",
+ "s",
+ "o",
+ "n",
+ "d"
+ ],
+ "days-standAlone-abbr": [
+ "ned",
+ "pon",
+ "tor",
+ "sre",
+ "čet",
+ "pet",
+ "sob"
+ ],
+ "dateFormat-short": "d. MM. yy",
+ "dateFormatItem-yyyyM": "M/yyyy",
+ "dateFormatItem-yMMMEd": "E., d. MMM y",
+ "dateFormat-full": "EEEE, dd. MMMM y",
+ "dateFormatItem-Md": "d. M.",
+ "dateFormatItem-yMEd": "E., d. M. y",
+ "months-format-wide": [
+ "januar",
+ "februar",
+ "marec",
+ "april",
+ "maj",
+ "junij",
+ "julij",
+ "avgust",
+ "september",
+ "oktober",
+ "november",
+ "december"
+ ],
+ "quarters-format-wide": [
+ "1. četrtletje",
+ "2. četrtletje",
+ "3. četrtletje",
+ "4. četrtletje"
+ ],
+ "days-format-wide": [
+ "nedelja",
+ "ponedeljek",
+ "torek",
+ "sreda",
+ "četrtek",
+ "petek",
+ "sobota"
+ ],
+ "eraNarrow": [
+ "pr. n. št.",
+ "po Kr."
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sl/number.js b/lib/dojo/cldr/nls/sl/number.js
index 2d85e97a1..60bceac74 100644
--- a/lib/dojo/cldr/nls/sl/number.js
+++ b/lib/dojo/cldr/nls/sl/number.js
@@ -1 +1,8 @@
-({"group":".","percentSign":"%","exponential":"e","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/sl/number",{"group":".","percentSign":"%","exponential":"e","scientificFormat":"#E0","percentFormat":"#,##0%","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sl/number.js.uncompressed.js b/lib/dojo/cldr/nls/sl/number.js.uncompressed.js
new file mode 100644
index 000000000..e027d0a92
--- /dev/null
+++ b/lib/dojo/cldr/nls/sl/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/sl/number", //begin v1.x content
+{
+ "group": ".",
+ "percentSign": "%",
+ "exponential": "e",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sv/currency.js b/lib/dojo/cldr/nls/sv/currency.js
index 76a878a93..0fb6bf18a 100644
--- a/lib/dojo/cldr/nls/sv/currency.js
+++ b/lib/dojo/cldr/nls/sv/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Hongkong-dollar","CHF_displayName":"schweizisk franc","CHF_symbol":"CHF","CAD_displayName":"kanadensisk dollar","CNY_displayName":"kinesisk yuan renminbi","AUD_displayName":"australisk dollar","JPY_displayName":"japansk yen","CAD_symbol":"CAD","USD_displayName":"US-dollar","CNY_symbol":"CNY","GBP_displayName":"brittiskt pund sterling","EUR_displayName":"euro","USD_symbol":"US$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/sv/currency",{"HKD_displayName":"Hongkong-dollar","CHF_displayName":"schweizisk franc","CHF_symbol":"CHF","CAD_displayName":"kanadensisk dollar","CNY_displayName":"kinesisk yuan renminbi","AUD_displayName":"australisk dollar","JPY_displayName":"japansk yen","CAD_symbol":"CAD","USD_displayName":"US-dollar","CNY_symbol":"CNY","GBP_displayName":"brittiskt pund sterling","EUR_displayName":"euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sv/currency.js.uncompressed.js b/lib/dojo/cldr/nls/sv/currency.js.uncompressed.js
new file mode 100644
index 000000000..759588a3b
--- /dev/null
+++ b/lib/dojo/cldr/nls/sv/currency.js.uncompressed.js
@@ -0,0 +1,18 @@
+define(
+"dojo/cldr/nls/sv/currency", //begin v1.x content
+{
+ "HKD_displayName": "Hongkong-dollar",
+ "CHF_displayName": "schweizisk franc",
+ "CHF_symbol": "CHF",
+ "CAD_displayName": "kanadensisk dollar",
+ "CNY_displayName": "kinesisk yuan renminbi",
+ "AUD_displayName": "australisk dollar",
+ "JPY_displayName": "japansk yen",
+ "CAD_symbol": "CAD",
+ "USD_displayName": "US-dollar",
+ "CNY_symbol": "CNY",
+ "GBP_displayName": "brittiskt pund sterling",
+ "EUR_displayName": "euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sv/gregorian.js b/lib/dojo/cldr/nls/sv/gregorian.js
index 757dfade2..aee96c11e 100644
--- a/lib/dojo/cldr/nls/sv/gregorian.js
+++ b/lib/dojo/cldr/nls/sv/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"veckodag","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, yyyy-MM-dd","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["f.Kr.","e.Kr."],"dateFormat-long":"d MMMM y","months-format-wide":["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],"dateFormatItem-EEEd":"EEE d","dayPeriods-format-wide-pm":"em","dateFormat-full":"EEEE'en' 'den' d:'e' MMMM y","dateFormatItem-Md":"d/M","dateFormatItem-MMMMEEEd":"EEE d MMMM","field-era":"era","dateFormatItem-yM":"yyyy-MM","months-standAlone-wide":["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],"timeFormat-short":"HH:mm","quarters-format-wide":["1:a kvartalet","2:a kvartalet","3:e kvartalet","4:e kvartalet"],"timeFormat-long":"HH:mm:ss z","field-year":"år","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"yyyy Q","field-hour":"timme","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"'kl'. HH:mm:ss zzzz","field-day-relative+0":"i dag","field-day-relative+1":"i morgon","field-day-relative+2":"i övermorgon","field-day-relative+3":"i överövermorgon","months-standAlone-abbr":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1:a kvartalet","2:a kvartalet","3:e kvartalet","4:e kvartalet"],"dateFormatItem-M":"L","days-standAlone-wide":["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],"dateFormatItem-yyyyMMM":"MMM y","dateFormatItem-MMMMd":"d:'e' MMMM","dateFormatItem-yyMMM":"MMM -yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["K1","K2","K3","K4"],"eraAbbr":["f.Kr.","e.Kr."],"field-minute":"minut","field-dayperiod":"fm/em","days-standAlone-abbr":["sön","mån","tis","ons","tors","fre","lör"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"i går","field-day-relative+-2":"i förrgår","field-day-relative+-3":"i förrförrgår","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d/M","field-day":"dag","days-format-wide":["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],"field-zone":"tidszon","dateFormatItem-yyyyMM":"yyyy-MM","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"yy-MM","dateFormatItem-hm":"h:mm a","days-format-abbr":["sön","mån","tis","ons","tors","fre","lör"],"eraNames":["före Kristus","efter Kristus"],"days-format-narrow":["S","M","T","O","T","F","L"],"field-month":"månad","days-standAlone-narrow":["S","M","T","O","T","F","L"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"fm","dateFormatItem-MMMMEd":"E d:'e' MMMM","dateFormat-short":"yyyy-MM-dd","dateFormatItem-MMd":"d/M","field-second":"sekund","dateFormatItem-yMMMEd":"EEE d MMM y","field-week":"vecka","dateFormat-medium":"d MMM y","dateFormatItem-yyyyQQQQ":"QQQQ y","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateFormatItem-H":"HH","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/sv/gregorian",{"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"veckodag","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, yyyy-MM-dd","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["f.Kr.","e.Kr."],"dateFormat-long":"d MMMM y","months-format-wide":["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],"dateFormatItem-EEEd":"EEE d","dayPeriods-format-wide-pm":"em","dateFormat-full":"EEEE'en' 'den' d:'e' MMMM y","dateFormatItem-Md":"d/M","dateFormatItem-MMMMEEEd":"EEE d MMMM","field-era":"era","dateFormatItem-yM":"yyyy-MM","months-standAlone-wide":["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],"timeFormat-short":"HH:mm","quarters-format-wide":["1:a kvartalet","2:a kvartalet","3:e kvartalet","4:e kvartalet"],"timeFormat-long":"HH:mm:ss z","field-year":"år","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"yyyy Q","field-hour":"timme","dateFormatItem-MMdd":"dd/MM","months-format-abbr":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"'kl'. HH:mm:ss zzzz","field-day-relative+0":"i dag","field-day-relative+1":"i morgon","field-day-relative+2":"i övermorgon","field-day-relative+3":"i överövermorgon","months-standAlone-abbr":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],"quarters-format-abbr":["K1","K2","K3","K4"],"quarters-standAlone-wide":["1:a kvartalet","2:a kvartalet","3:e kvartalet","4:e kvartalet"],"dateFormatItem-M":"L","days-standAlone-wide":["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],"dateFormatItem-yyyyMMM":"MMM y","dateFormatItem-MMMMd":"d:'e' MMMM","dateFormatItem-yyMMM":"MMM -yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["K1","K2","K3","K4"],"eraAbbr":["f.Kr.","e.Kr."],"field-minute":"minut","field-dayperiod":"fm/em","days-standAlone-abbr":["sön","mån","tis","ons","tors","fre","lör"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"i går","field-day-relative+-2":"i förrgår","field-day-relative+-3":"i förrförrgår","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E d/M","field-day":"dag","days-format-wide":["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],"field-zone":"tidszon","dateFormatItem-yyyyMM":"yyyy-MM","dateFormatItem-y":"y","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateFormatItem-yyMM":"yy-MM","dateFormatItem-hm":"h:mm a","days-format-abbr":["sön","mån","tis","ons","tors","fre","lör"],"eraNames":["före Kristus","efter Kristus"],"days-format-narrow":["S","M","T","O","T","F","L"],"field-month":"månad","days-standAlone-narrow":["S","M","T","O","T","F","L"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"fm","dateFormatItem-MMMMEd":"E d:'e' MMMM","dateFormat-short":"yyyy-MM-dd","dateFormatItem-MMd":"d/M","field-second":"sekund","dateFormatItem-yMMMEd":"EEE d MMM y","field-week":"vecka","dateFormat-medium":"d MMM y","dateFormatItem-yyyyQQQQ":"QQQQ y","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sv/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/sv/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..7637d31e7
--- /dev/null
+++ b/lib/dojo/cldr/nls/sv/gregorian.js.uncompressed.js
@@ -0,0 +1,245 @@
+define(
+"dojo/cldr/nls/sv/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "quarters-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4"
+ ],
+ "field-weekday": "veckodag",
+ "dateFormatItem-yQQQ": "y QQQ",
+ "dateFormatItem-yMEd": "EEE, yyyy-MM-dd",
+ "dateFormatItem-MMMEd": "E d MMM",
+ "eraNarrow": [
+ "f.Kr.",
+ "e.Kr."
+ ],
+ "dateFormat-long": "d MMMM y",
+ "months-format-wide": [
+ "januari",
+ "februari",
+ "mars",
+ "april",
+ "maj",
+ "juni",
+ "juli",
+ "augusti",
+ "september",
+ "oktober",
+ "november",
+ "december"
+ ],
+ "dateFormatItem-EEEd": "EEE d",
+ "dayPeriods-format-wide-pm": "em",
+ "dateFormat-full": "EEEE'en' 'den' d:'e' MMMM y",
+ "dateFormatItem-Md": "d/M",
+ "dateFormatItem-MMMMEEEd": "EEE d MMMM",
+ "field-era": "era",
+ "dateFormatItem-yM": "yyyy-MM",
+ "months-standAlone-wide": [
+ "januari",
+ "februari",
+ "mars",
+ "april",
+ "maj",
+ "juni",
+ "juli",
+ "augusti",
+ "september",
+ "oktober",
+ "november",
+ "december"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "1:a kvartalet",
+ "2:a kvartalet",
+ "3:e kvartalet",
+ "4:e kvartalet"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "field-year": "år",
+ "dateFormatItem-yMMM": "MMM y",
+ "dateFormatItem-yQ": "yyyy Q",
+ "field-hour": "timme",
+ "dateFormatItem-MMdd": "dd/MM",
+ "months-format-abbr": [
+ "jan",
+ "feb",
+ "mar",
+ "apr",
+ "maj",
+ "jun",
+ "jul",
+ "aug",
+ "sep",
+ "okt",
+ "nov",
+ "dec"
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "'kl'. HH:mm:ss zzzz",
+ "field-day-relative+0": "i dag",
+ "field-day-relative+1": "i morgon",
+ "field-day-relative+2": "i övermorgon",
+ "field-day-relative+3": "i överövermorgon",
+ "months-standAlone-abbr": [
+ "jan",
+ "feb",
+ "mar",
+ "apr",
+ "maj",
+ "jun",
+ "jul",
+ "aug",
+ "sep",
+ "okt",
+ "nov",
+ "dec"
+ ],
+ "quarters-format-abbr": [
+ "K1",
+ "K2",
+ "K3",
+ "K4"
+ ],
+ "quarters-standAlone-wide": [
+ "1:a kvartalet",
+ "2:a kvartalet",
+ "3:e kvartalet",
+ "4:e kvartalet"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "söndag",
+ "måndag",
+ "tisdag",
+ "onsdag",
+ "torsdag",
+ "fredag",
+ "lördag"
+ ],
+ "dateFormatItem-yyyyMMM": "MMM y",
+ "dateFormatItem-MMMMd": "d:'e' MMMM",
+ "dateFormatItem-yyMMM": "MMM -yy",
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "K1",
+ "K2",
+ "K3",
+ "K4"
+ ],
+ "eraAbbr": [
+ "f.Kr.",
+ "e.Kr."
+ ],
+ "field-minute": "minut",
+ "field-dayperiod": "fm/em",
+ "days-standAlone-abbr": [
+ "sön",
+ "mån",
+ "tis",
+ "ons",
+ "tors",
+ "fre",
+ "lör"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "i går",
+ "field-day-relative+-2": "i förrgår",
+ "field-day-relative+-3": "i förrförrgår",
+ "dateFormatItem-MMMd": "d MMM",
+ "dateFormatItem-MEd": "E d/M",
+ "field-day": "dag",
+ "days-format-wide": [
+ "söndag",
+ "måndag",
+ "tisdag",
+ "onsdag",
+ "torsdag",
+ "fredag",
+ "lördag"
+ ],
+ "field-zone": "tidszon",
+ "dateFormatItem-yyyyMM": "yyyy-MM",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D"
+ ],
+ "dateFormatItem-yyMM": "yy-MM",
+ "dateFormatItem-hm": "h:mm a",
+ "days-format-abbr": [
+ "sön",
+ "mån",
+ "tis",
+ "ons",
+ "tors",
+ "fre",
+ "lör"
+ ],
+ "eraNames": [
+ "före Kristus",
+ "efter Kristus"
+ ],
+ "days-format-narrow": [
+ "S",
+ "M",
+ "T",
+ "O",
+ "T",
+ "F",
+ "L"
+ ],
+ "field-month": "månad",
+ "days-standAlone-narrow": [
+ "S",
+ "M",
+ "T",
+ "O",
+ "T",
+ "F",
+ "L"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "fm",
+ "dateFormatItem-MMMMEd": "E d:'e' MMMM",
+ "dateFormat-short": "yyyy-MM-dd",
+ "dateFormatItem-MMd": "d/M",
+ "field-second": "sekund",
+ "dateFormatItem-yMMMEd": "EEE d MMM y",
+ "field-week": "vecka",
+ "dateFormat-medium": "d MMM y",
+ "dateFormatItem-yyyyQQQQ": "QQQQ y",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-hms": "h:mm:ss a"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sv/number.js b/lib/dojo/cldr/nls/sv/number.js
index eedc15d2e..89d9db5d6 100644
--- a/lib/dojo/cldr/nls/sv/number.js
+++ b/lib/dojo/cldr/nls/sv/number.js
@@ -1 +1,8 @@
-({"group":" ","percentSign":"%","exponential":"×10^","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"−","decimal":",","nan":"¤¤¤","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/sv/number",{"group":" ","percentSign":"%","exponential":"×10^","scientificFormat":"#E0","percentFormat":"#,##0 %","list":";","infinity":"∞","patternDigit":"#","minusSign":"−","decimal":",","nan":"¤¤¤","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/sv/number.js.uncompressed.js b/lib/dojo/cldr/nls/sv/number.js.uncompressed.js
new file mode 100644
index 000000000..513f5fd00
--- /dev/null
+++ b/lib/dojo/cldr/nls/sv/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/sv/number", //begin v1.x content
+{
+ "group": " ",
+ "percentSign": "%",
+ "exponential": "×10^",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0 %",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "−",
+ "decimal": ",",
+ "nan": "¤¤¤",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/th/buddhist.js b/lib/dojo/cldr/nls/th/buddhist.js
index d1876f7b1..38c6140e9 100644
--- a/lib/dojo/cldr/nls/th/buddhist.js
+++ b/lib/dojo/cldr/nls/th/buddhist.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"M/yyyy","dateFormatItem-yQ":"Q yyyy","dayPeriods-format-wide-pm":"หลังเที่ยง","eraNames":["พุทธศักราช"],"dateFormatItem-MMMEd":"E d MMM","dateTimeFormat-full":"{1}, {0}","dateFormatItem-yQQQ":"QQQ y","months-standAlone-narrow":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"dateTimeFormat-short":"{1}, {0}","dayPeriods-format-wide-am":"ก่อนเที่ยง","dateTimeFormat-medium":"{1}, {0}","timeFormat-full":"H นาฬิกา m นาที ss วินาที zzzz","dateFormatItem-yMMM":"MMM y","days-standAlone-narrow":["อ","จ","อ","พ","พ","ศ","ส"],"eraAbbr":["พ.ศ."],"dateFormat-long":"d MMMM y","timeFormat-medium":"H:mm:ss","dateFormatItem-EEEd":"EEE d","dateFormatItem-Hm":"H:mm","dateFormat-medium":"d MMM y","dateFormatItem-Hms":"H:mm:ss","dateTimeFormat-long":"{1}, {0}","dateFormatItem-MMMd":"d MMM","timeFormat-long":"H นาฬิกา m นาที ss วินาที z","months-format-abbr":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"timeFormat-short":"H:mm","dateFormatItem-H":"H","days-format-abbr":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"dateFormatItem-MEd":"E, d/M","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE d MMM y","dateFormat-full":"EEEEที่ d MMMM G y","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE d/M/yyyy","months-format-wide":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"quarters-format-wide":["ไตรมาส 1","ไตรมาส 2","ไตรมาส 3","ไตรมาส 4"],"days-format-wide":["วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์"],"eraNarrow":["พ.ศ."],"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","months-standAlone-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"dateFormatItem-M":"L","days-standAlone-wide":["1","2","3","4","5","6","7"],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-y":"y","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","days-format-narrow":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/th/buddhist",{"dateFormatItem-yM":"M/yyyy","dateFormatItem-yQ":"Q yyyy","dayPeriods-format-wide-pm":"หลังเที่ยง","eraNames":["พุทธศักราช"],"dateFormatItem-MMMEd":"E d MMM","dateTimeFormat-full":"{1}, {0}","dateFormatItem-yQQQ":"QQQ y","months-standAlone-narrow":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"dateTimeFormat-short":"{1}, {0}","dayPeriods-format-wide-am":"ก่อนเที่ยง","dateTimeFormat-medium":"{1}, {0}","timeFormat-full":"H นาฬิกา m นาที ss วินาที zzzz","dateFormatItem-yMMM":"MMM y","days-standAlone-narrow":["อ","จ","อ","พ","พ","ศ","ส"],"eraAbbr":["พ.ศ."],"dateFormat-long":"d MMMM y","timeFormat-medium":"H:mm:ss","dateFormatItem-EEEd":"EEE d","dateFormatItem-Hm":"H:mm","dateFormat-medium":"d MMM y","dateFormatItem-Hms":"H:mm:ss","dateTimeFormat-long":"{1}, {0}","dateFormatItem-MMMd":"d MMM","timeFormat-long":"H นาฬิกา m นาที ss วินาที z","months-format-abbr":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"timeFormat-short":"H:mm","dateFormatItem-H":"H","days-format-abbr":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"dateFormatItem-MEd":"E, d/M","dateFormat-short":"d/M/yyyy","dateFormatItem-yMMMEd":"EEE d MMM y","dateFormat-full":"EEEEที่ d MMMM G y","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE d/M/yyyy","months-format-wide":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"quarters-format-wide":["ไตรมาส 1","ไตรมาส 2","ไตรมาส 3","ไตรมาส 4"],"days-format-wide":["วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์"],"eraNarrow":["พ.ศ."]}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/th/buddhist.js.uncompressed.js b/lib/dojo/cldr/nls/th/buddhist.js.uncompressed.js
new file mode 100644
index 000000000..5947c4765
--- /dev/null
+++ b/lib/dojo/cldr/nls/th/buddhist.js.uncompressed.js
@@ -0,0 +1,118 @@
+define(
+"dojo/cldr/nls/th/buddhist", //begin v1.x content
+{
+ "dateFormatItem-yM": "M/yyyy",
+ "dateFormatItem-yQ": "Q yyyy",
+ "dayPeriods-format-wide-pm": "หลังเที่ยง",
+ "eraNames": [
+ "พุทธศักราช"
+ ],
+ "dateFormatItem-MMMEd": "E d MMM",
+ "dateTimeFormat-full": "{1}, {0}",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "months-standAlone-narrow": [
+ "ม.ค.",
+ "ก.พ.",
+ "มี.ค.",
+ "เม.ย.",
+ "พ.ค.",
+ "มิ.ย.",
+ "ก.ค.",
+ "ส.ค.",
+ "ก.ย.",
+ "ต.ค.",
+ "พ.ย.",
+ "ธ.ค."
+ ],
+ "dateTimeFormat-short": "{1}, {0}",
+ "dayPeriods-format-wide-am": "ก่อนเที่ยง",
+ "dateTimeFormat-medium": "{1}, {0}",
+ "timeFormat-full": "H นาฬิกา m นาที ss วินาที zzzz",
+ "dateFormatItem-yMMM": "MMM y",
+ "days-standAlone-narrow": [
+ "อ",
+ "จ",
+ "อ",
+ "พ",
+ "พ",
+ "ศ",
+ "ส"
+ ],
+ "eraAbbr": [
+ "พ.ศ."
+ ],
+ "dateFormat-long": "d MMMM y",
+ "timeFormat-medium": "H:mm:ss",
+ "dateFormatItem-EEEd": "EEE d",
+ "dateFormatItem-Hm": "H:mm",
+ "dateFormat-medium": "d MMM y",
+ "dateFormatItem-Hms": "H:mm:ss",
+ "dateTimeFormat-long": "{1}, {0}",
+ "dateFormatItem-MMMd": "d MMM",
+ "timeFormat-long": "H นาฬิกา m นาที ss วินาที z",
+ "months-format-abbr": [
+ "ม.ค.",
+ "ก.พ.",
+ "มี.ค.",
+ "เม.ย.",
+ "พ.ค.",
+ "มิ.ย.",
+ "ก.ค.",
+ "ส.ค.",
+ "ก.ย.",
+ "ต.ค.",
+ "พ.ย.",
+ "ธ.ค."
+ ],
+ "timeFormat-short": "H:mm",
+ "dateFormatItem-H": "H",
+ "days-format-abbr": [
+ "อา.",
+ "จ.",
+ "อ.",
+ "พ.",
+ "พฤ.",
+ "ศ.",
+ "ส."
+ ],
+ "dateFormatItem-MEd": "E, d/M",
+ "dateFormat-short": "d/M/yyyy",
+ "dateFormatItem-yMMMEd": "EEE d MMM y",
+ "dateFormat-full": "EEEEที่ d MMMM G y",
+ "dateFormatItem-Md": "d/M",
+ "dateFormatItem-yMEd": "EEE d/M/yyyy",
+ "months-format-wide": [
+ "มกราคม",
+ "กุมภาพันธ์",
+ "มีนาคม",
+ "เมษายน",
+ "พฤษภาคม",
+ "มิถุนายน",
+ "กรกฎาคม",
+ "สิงหาคม",
+ "กันยายน",
+ "ตุลาคม",
+ "พฤศจิกายน",
+ "ธันวาคม"
+ ],
+ "quarters-format-wide": [
+ "ไตรมาส 1",
+ "ไตรมาส 2",
+ "ไตรมาส 3",
+ "ไตรมาส 4"
+ ],
+ "days-format-wide": [
+ "วันอาทิตย์",
+ "วันจันทร์",
+ "วันอังคาร",
+ "วันพุธ",
+ "วันพฤหัสบดี",
+ "วันศุกร์",
+ "วันเสาร์"
+ ],
+ "eraNarrow": [
+ "พ.ศ."
+ ]
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/th/currency.js b/lib/dojo/cldr/nls/th/currency.js
index e2f76cca2..66d836e2f 100644
--- a/lib/dojo/cldr/nls/th/currency.js
+++ b/lib/dojo/cldr/nls/th/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"ดอลลาร์ฮ่องกง","CHF_displayName":"ฟรังก์สวิส","JPY_symbol":"¥","CAD_displayName":"ดอลลาร์แคนาดา","CNY_displayName":"หยวนเหรินหมินปี้ (สาธารณรัฐประชาชนจีน)","AUD_displayName":"ดอลลาร์ออสเตรเลีย","JPY_displayName":"เยนญี่ปุ่น","USD_displayName":"ดอลลาร์สหรัฐ","GBP_displayName":"ปอนด์สเตอร์ลิง (สหราชอาณาจักร)","EUR_displayName":"ยูโร","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/th/currency",{"HKD_displayName":"ดอลลาร์ฮ่องกง","CHF_displayName":"ฟรังก์สวิส","JPY_symbol":"¥","CAD_displayName":"ดอลลาร์แคนาดา","CNY_displayName":"หยวนเหรินหมินปี้ (สาธารณรัฐประชาชนจีน)","AUD_displayName":"ดอลลาร์ออสเตรเลีย","JPY_displayName":"เยนญี่ปุ่น","USD_displayName":"ดอลลาร์สหรัฐ","GBP_displayName":"ปอนด์สเตอร์ลิง (สหราชอาณาจักร)","EUR_displayName":"ยูโร"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/th/currency.js.uncompressed.js b/lib/dojo/cldr/nls/th/currency.js.uncompressed.js
new file mode 100644
index 000000000..1042c0455
--- /dev/null
+++ b/lib/dojo/cldr/nls/th/currency.js.uncompressed.js
@@ -0,0 +1,16 @@
+define(
+"dojo/cldr/nls/th/currency", //begin v1.x content
+{
+ "HKD_displayName": "ดอลลาร์ฮ่องกง",
+ "CHF_displayName": "ฟรังก์สวิส",
+ "JPY_symbol": "¥",
+ "CAD_displayName": "ดอลลาร์แคนาดา",
+ "CNY_displayName": "หยวนเหรินหมินปี้ (สาธารณรัฐประชาชนจีน)",
+ "AUD_displayName": "ดอลลาร์ออสเตรเลีย",
+ "JPY_displayName": "เยนญี่ปุ่น",
+ "USD_displayName": "ดอลลาร์สหรัฐ",
+ "GBP_displayName": "ปอนด์สเตอร์ลิง (สหราชอาณาจักร)",
+ "EUR_displayName": "ยูโร"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/th/gregorian.js b/lib/dojo/cldr/nls/th/gregorian.js
index ee17118f8..5198811a2 100644
--- a/lib/dojo/cldr/nls/th/gregorian.js
+++ b/lib/dojo/cldr/nls/th/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"field-weekday":"วันในสัปดาห์","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d/M/yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["ก่อน ค.ศ.","ค.ศ."],"dateFormat-long":"d MMMM y","months-format-wide":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"dateTimeFormat-medium":"{1}, {0}","dateFormatItem-EEEd":"EEE d","dayPeriods-format-wide-pm":"หลังเที่ยง","dateFormat-full":"EEEEที่ d MMMM G y","dateFormatItem-Md":"d/M","field-era":"สมัย","dateFormatItem-yM":"M/yyyy","months-standAlone-wide":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"timeFormat-short":"H:mm","quarters-format-wide":["ไตรมาส 1","ไตรมาส 2","ไตรมาส 3","ไตรมาส 4"],"timeFormat-long":"H นาฬิกา m นาที ss วินาที z","field-year":"ปี","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q yyyy","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"ชั่วโมง","months-format-abbr":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"H นาฬิกา m นาที ss วินาที zzzz","field-day-relative+0":"วันนี้","field-day-relative+1":"พรุ่งนี้","field-day-relative+2":"มะรืนนี้","dateFormatItem-H":"H","field-day-relative+3":"สามวันต่อจากนี้","months-standAlone-abbr":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["ไตรมาส 1","ไตรมาส 2","ไตรมาส 3","ไตรมาส 4"],"dateFormatItem-M":"L","days-standAlone-wide":["วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์"],"dateFormatItem-MMMMd":"d MMMM","timeFormat-medium":"H:mm:ss","dateFormatItem-Hm":"H:mm","eraAbbr":["ปีก่อน ค.ศ.","ค.ศ."],"field-minute":"นาที","field-dayperiod":"ช่วงวัน","days-standAlone-abbr":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"เมื่อวาน","dateTimeFormat-long":"{1}, {0}","field-day-relative+-2":"เมื่อวานซืน","field-day-relative+-3":"สามวันก่อน","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, d/M","dateTimeFormat-full":"{1}, {0}","dateFormatItem-yMMMM":"MMMM y","field-day":"วัน","days-format-wide":["วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์"],"field-zone":"เขต","dateFormatItem-y":"y","months-standAlone-narrow":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"days-format-abbr":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"eraNames":["ปีก่อนคริสต์ศักราช","คริสต์ศักราช"],"days-format-narrow":["อ","จ","อ","พ","พ","ศ","ส"],"field-month":"เดือน","days-standAlone-narrow":["อ","จ","อ","พ","พ","ศ","ส"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"ก่อนเที่ยง","dateFormatItem-MMMMEd":"E d MMMM","dateFormat-short":"d/M/yyyy","field-second":"วินาที","dateFormatItem-yMMMEd":"EEE d MMM y","field-week":"สัปดาห์","dateFormat-medium":"d MMM y","dateFormatItem-yyyyM":"M/yyyy","dateFormatItem-mmss":"mm:ss","dateTimeFormat-short":"{1}, {0}","dateFormatItem-Hms":"H:mm:ss","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateFormatItem-hm":"h:mm a","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateFormatItem-hms":"h:mm:ss a"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/th/gregorian",{"months-format-narrow":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"field-weekday":"วันในสัปดาห์","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d/M/yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["ก่อน ค.ศ.","ค.ศ."],"dateFormat-long":"d MMMM y","months-format-wide":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"dateTimeFormat-medium":"{1}, {0}","dateFormatItem-EEEd":"EEE d","dayPeriods-format-wide-pm":"หลังเที่ยง","dateFormat-full":"EEEEที่ d MMMM G y","dateFormatItem-Md":"d/M","field-era":"สมัย","dateFormatItem-yM":"M/yyyy","months-standAlone-wide":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"timeFormat-short":"H:mm","quarters-format-wide":["ไตรมาส 1","ไตรมาส 2","ไตรมาส 3","ไตรมาส 4"],"timeFormat-long":"H นาฬิกา m นาที ss วินาที z","field-year":"ปี","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q yyyy","dateFormatItem-yyyyMMMM":"MMMM y","field-hour":"ชั่วโมง","months-format-abbr":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"H นาฬิกา m นาที ss วินาที zzzz","field-day-relative+0":"วันนี้","field-day-relative+1":"พรุ่งนี้","field-day-relative+2":"มะรืนนี้","dateFormatItem-H":"H","field-day-relative+3":"สามวันต่อจากนี้","months-standAlone-abbr":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"quarters-format-abbr":["Q1","Q2","Q3","Q4"],"quarters-standAlone-wide":["ไตรมาส 1","ไตรมาส 2","ไตรมาส 3","ไตรมาส 4"],"dateFormatItem-M":"L","days-standAlone-wide":["วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์"],"dateFormatItem-MMMMd":"d MMMM","timeFormat-medium":"H:mm:ss","dateFormatItem-Hm":"H:mm","eraAbbr":["ปีก่อน ค.ศ.","ค.ศ."],"field-minute":"นาที","field-dayperiod":"ช่วงวัน","days-standAlone-abbr":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"เมื่อวาน","dateTimeFormat-long":"{1}, {0}","field-day-relative+-2":"เมื่อวานซืน","field-day-relative+-3":"สามวันก่อน","dateFormatItem-MMMd":"d MMM","dateFormatItem-MEd":"E, d/M","dateTimeFormat-full":"{1}, {0}","dateFormatItem-yMMMM":"MMMM y","field-day":"วัน","days-format-wide":["วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์"],"field-zone":"เขต","dateFormatItem-y":"y","months-standAlone-narrow":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"days-format-abbr":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"eraNames":["ปีก่อนคริสต์ศักราช","คริสต์ศักราช"],"days-format-narrow":["อ","จ","อ","พ","พ","ศ","ส"],"field-month":"เดือน","days-standAlone-narrow":["อ","จ","อ","พ","พ","ศ","ส"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"ก่อนเที่ยง","dateFormatItem-MMMMEd":"E d MMMM","dateFormat-short":"d/M/yyyy","field-second":"วินาที","dateFormatItem-yMMMEd":"EEE d MMM y","field-week":"สัปดาห์","dateFormat-medium":"d MMM y","dateFormatItem-yyyyM":"M/yyyy","dateFormatItem-mmss":"mm:ss","dateTimeFormat-short":"{1}, {0}","dateFormatItem-Hms":"H:mm:ss"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/th/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/th/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..05b41ea05
--- /dev/null
+++ b/lib/dojo/cldr/nls/th/gregorian.js.uncompressed.js
@@ -0,0 +1,232 @@
+define(
+"dojo/cldr/nls/th/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "ม.ค.",
+ "ก.พ.",
+ "มี.ค.",
+ "เม.ย.",
+ "พ.ค.",
+ "มิ.ย.",
+ "ก.ค.",
+ "ส.ค.",
+ "ก.ย.",
+ "ต.ค.",
+ "พ.ย.",
+ "ธ.ค."
+ ],
+ "field-weekday": "วันในสัปดาห์",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yMEd": "EEE d/M/yyyy",
+ "dateFormatItem-MMMEd": "E d MMM",
+ "eraNarrow": [
+ "ก่อน ค.ศ.",
+ "ค.ศ."
+ ],
+ "dateFormat-long": "d MMMM y",
+ "months-format-wide": [
+ "มกราคม",
+ "กุมภาพันธ์",
+ "มีนาคม",
+ "เมษายน",
+ "พฤษภาคม",
+ "มิถุนายน",
+ "กรกฎาคม",
+ "สิงหาคม",
+ "กันยายน",
+ "ตุลาคม",
+ "พฤศจิกายน",
+ "ธันวาคม"
+ ],
+ "dateTimeFormat-medium": "{1}, {0}",
+ "dateFormatItem-EEEd": "EEE d",
+ "dayPeriods-format-wide-pm": "หลังเที่ยง",
+ "dateFormat-full": "EEEEที่ d MMMM G y",
+ "dateFormatItem-Md": "d/M",
+ "field-era": "สมัย",
+ "dateFormatItem-yM": "M/yyyy",
+ "months-standAlone-wide": [
+ "มกราคม",
+ "กุมภาพันธ์",
+ "มีนาคม",
+ "เมษายน",
+ "พฤษภาคม",
+ "มิถุนายน",
+ "กรกฎาคม",
+ "สิงหาคม",
+ "กันยายน",
+ "ตุลาคม",
+ "พฤศจิกายน",
+ "ธันวาคม"
+ ],
+ "timeFormat-short": "H:mm",
+ "quarters-format-wide": [
+ "ไตรมาส 1",
+ "ไตรมาส 2",
+ "ไตรมาส 3",
+ "ไตรมาส 4"
+ ],
+ "timeFormat-long": "H นาฬิกา m นาที ss วินาที z",
+ "field-year": "ปี",
+ "dateFormatItem-yMMM": "MMM y",
+ "dateFormatItem-yQ": "Q yyyy",
+ "dateFormatItem-yyyyMMMM": "MMMM y",
+ "field-hour": "ชั่วโมง",
+ "months-format-abbr": [
+ "ม.ค.",
+ "ก.พ.",
+ "มี.ค.",
+ "เม.ย.",
+ "พ.ค.",
+ "มิ.ย.",
+ "ก.ค.",
+ "ส.ค.",
+ "ก.ย.",
+ "ต.ค.",
+ "พ.ย.",
+ "ธ.ค."
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "H นาฬิกา m นาที ss วินาที zzzz",
+ "field-day-relative+0": "วันนี้",
+ "field-day-relative+1": "พรุ่งนี้",
+ "field-day-relative+2": "มะรืนนี้",
+ "dateFormatItem-H": "H",
+ "field-day-relative+3": "สามวันต่อจากนี้",
+ "months-standAlone-abbr": [
+ "ม.ค.",
+ "ก.พ.",
+ "มี.ค.",
+ "เม.ย.",
+ "พ.ค.",
+ "มิ.ย.",
+ "ก.ค.",
+ "ส.ค.",
+ "ก.ย.",
+ "ต.ค.",
+ "พ.ย.",
+ "ธ.ค."
+ ],
+ "quarters-format-abbr": [
+ "Q1",
+ "Q2",
+ "Q3",
+ "Q4"
+ ],
+ "quarters-standAlone-wide": [
+ "ไตรมาส 1",
+ "ไตรมาส 2",
+ "ไตรมาส 3",
+ "ไตรมาส 4"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "วันอาทิตย์",
+ "วันจันทร์",
+ "วันอังคาร",
+ "วันพุธ",
+ "วันพฤหัสบดี",
+ "วันศุกร์",
+ "วันเสาร์"
+ ],
+ "dateFormatItem-MMMMd": "d MMMM",
+ "timeFormat-medium": "H:mm:ss",
+ "dateFormatItem-Hm": "H:mm",
+ "eraAbbr": [
+ "ปีก่อน ค.ศ.",
+ "ค.ศ."
+ ],
+ "field-minute": "นาที",
+ "field-dayperiod": "ช่วงวัน",
+ "days-standAlone-abbr": [
+ "อา.",
+ "จ.",
+ "อ.",
+ "พ.",
+ "พฤ.",
+ "ศ.",
+ "ส."
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "เมื่อวาน",
+ "dateTimeFormat-long": "{1}, {0}",
+ "field-day-relative+-2": "เมื่อวานซืน",
+ "field-day-relative+-3": "สามวันก่อน",
+ "dateFormatItem-MMMd": "d MMM",
+ "dateFormatItem-MEd": "E, d/M",
+ "dateTimeFormat-full": "{1}, {0}",
+ "dateFormatItem-yMMMM": "MMMM y",
+ "field-day": "วัน",
+ "days-format-wide": [
+ "วันอาทิตย์",
+ "วันจันทร์",
+ "วันอังคาร",
+ "วันพุธ",
+ "วันพฤหัสบดี",
+ "วันศุกร์",
+ "วันเสาร์"
+ ],
+ "field-zone": "เขต",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "ม.ค.",
+ "ก.พ.",
+ "มี.ค.",
+ "เม.ย.",
+ "พ.ค.",
+ "มิ.ย.",
+ "ก.ค.",
+ "ส.ค.",
+ "ก.ย.",
+ "ต.ค.",
+ "พ.ย.",
+ "ธ.ค."
+ ],
+ "days-format-abbr": [
+ "อา.",
+ "จ.",
+ "อ.",
+ "พ.",
+ "พฤ.",
+ "ศ.",
+ "ส."
+ ],
+ "eraNames": [
+ "ปีก่อนคริสต์ศักราช",
+ "คริสต์ศักราช"
+ ],
+ "days-format-narrow": [
+ "อ",
+ "จ",
+ "อ",
+ "พ",
+ "พ",
+ "ศ",
+ "ส"
+ ],
+ "field-month": "เดือน",
+ "days-standAlone-narrow": [
+ "อ",
+ "จ",
+ "อ",
+ "พ",
+ "พ",
+ "ศ",
+ "ส"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "ก่อนเที่ยง",
+ "dateFormatItem-MMMMEd": "E d MMMM",
+ "dateFormat-short": "d/M/yyyy",
+ "field-second": "วินาที",
+ "dateFormatItem-yMMMEd": "EEE d MMM y",
+ "field-week": "สัปดาห์",
+ "dateFormat-medium": "d MMM y",
+ "dateFormatItem-yyyyM": "M/yyyy",
+ "dateFormatItem-mmss": "mm:ss",
+ "dateTimeFormat-short": "{1}, {0}",
+ "dateFormatItem-Hms": "H:mm:ss"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/th/number.js b/lib/dojo/cldr/nls/th/number.js
index 393dd6cbd..4881638b7 100644
--- a/lib/dojo/cldr/nls/th/number.js
+++ b/lib/dojo/cldr/nls/th/number.js
@@ -1 +1,8 @@
-({"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;¤-#,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/th/number",{"group":",","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"#,##0%","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;¤-#,##0.00","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/th/number.js.uncompressed.js b/lib/dojo/cldr/nls/th/number.js.uncompressed.js
new file mode 100644
index 000000000..c74ccaec7
--- /dev/null
+++ b/lib/dojo/cldr/nls/th/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/th/number", //begin v1.x content
+{
+ "group": ",",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ".",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "¤#,##0.00;¤-#,##0.00",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/tr/currency.js b/lib/dojo/cldr/nls/tr/currency.js
index 4e8104eb1..5a54850a4 100644
--- a/lib/dojo/cldr/nls/tr/currency.js
+++ b/lib/dojo/cldr/nls/tr/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"Hong Kong Doları","CHF_displayName":"İsviçre Frangı","JPY_symbol":"¥","CAD_displayName":"Kanada Doları","CNY_displayName":"Çin Yuanı Renminbi","USD_symbol":"$","AUD_displayName":"Avustralya Doları","JPY_displayName":"Japon Yeni","USD_displayName":"ABD Doları","GBP_displayName":"İngiliz Sterlini","EUR_displayName":"Euro","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","AUD_symbol":"AU$","CNY_symbol":"CN¥","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/tr/currency",{"HKD_displayName":"Hong Kong Doları","CHF_displayName":"İsviçre Frangı","JPY_symbol":"¥","CAD_displayName":"Kanada Doları","CNY_displayName":"Çin Yuanı Renminbi","USD_symbol":"$","AUD_displayName":"Avustralya Doları","JPY_displayName":"Japon Yeni","USD_displayName":"ABD Doları","GBP_displayName":"İngiliz Sterlini","EUR_displayName":"Euro"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/tr/currency.js.uncompressed.js b/lib/dojo/cldr/nls/tr/currency.js.uncompressed.js
new file mode 100644
index 000000000..962047cca
--- /dev/null
+++ b/lib/dojo/cldr/nls/tr/currency.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dojo/cldr/nls/tr/currency", //begin v1.x content
+{
+ "HKD_displayName": "Hong Kong Doları",
+ "CHF_displayName": "İsviçre Frangı",
+ "JPY_symbol": "¥",
+ "CAD_displayName": "Kanada Doları",
+ "CNY_displayName": "Çin Yuanı Renminbi",
+ "USD_symbol": "$",
+ "AUD_displayName": "Avustralya Doları",
+ "JPY_displayName": "Japon Yeni",
+ "USD_displayName": "ABD Doları",
+ "GBP_displayName": "İngiliz Sterlini",
+ "EUR_displayName": "Euro"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/tr/gregorian.js b/lib/dojo/cldr/nls/tr/gregorian.js
index 16c39aa0f..cb19a1aac 100644
--- a/lib/dojo/cldr/nls/tr/gregorian.js
+++ b/lib/dojo/cldr/nls/tr/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["O","Ş","M","N","M","H","T","A","E","E","K","A"],"field-weekday":"Haftanın Günü","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"dd.MM.yyyy EEE","dateFormatItem-MMMEd":"dd MMM E","eraNarrow":["MÖ","MS"],"dateFormat-long":"dd MMMM y","months-format-wide":["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],"dateFormatItem-EEEd":"d EEE","dayPeriods-format-wide-pm":"PM","dateFormat-full":"dd MMMM y EEEE","dateFormatItem-Md":"dd/MM","field-era":"Miladi Dönem","dateFormatItem-yM":"M/yyyy","months-standAlone-wide":["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],"timeFormat-short":"HH:mm","quarters-format-wide":["1. çeyrek","2. çeyrek","3. çeyrek","4. çeyrek"],"timeFormat-long":"HH:mm:ss z","field-year":"Yıl","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q yyyy","field-hour":"Saat","months-format-abbr":["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"Bugün","field-day-relative+1":"Yarın","field-day-relative+2":"Yarından sonraki gün","dateFormatItem-H":"HH","field-day-relative+3":"Üç gün sonra","months-standAlone-abbr":["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],"quarters-format-abbr":["Ç1","Ç2","Ç3","Ç4"],"quarters-standAlone-wide":["1. çeyrek","2. çeyrek","3. çeyrek","4. çeyrek"],"dateFormatItem-M":"L","days-standAlone-wide":["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],"dateFormatItem-MMMMd":"dd MMMM","dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Ç1","Ç2","Ç3","Ç4"],"eraAbbr":["MÖ","MS"],"field-minute":"Dakika","field-dayperiod":"AM/PM","days-standAlone-abbr":["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"Dün","field-day-relative+-2":"Evvelsi gün","field-day-relative+-3":"Üç gün önce","dateFormatItem-MMMd":"dd MMM","dateFormatItem-MEd":"dd/MM E","dateFormatItem-yMMMM":"MMMM y","field-day":"Gün","days-format-wide":["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],"field-zone":"Saat Dilimi","dateFormatItem-y":"y","months-standAlone-narrow":["O","Ş","M","N","M","H","T","A","E","E","K","A"],"dateFormatItem-yyMM":"MM/yy","dateFormatItem-hm":"h:mm a","days-format-abbr":["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],"eraNames":["Milattan Önce","Milattan Sonra"],"days-format-narrow":["P","P","S","Ç","P","C","C"],"field-month":"Ay","days-standAlone-narrow":["P","P","S","Ç","P","C","C"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"AM","dateFormatItem-MMMMEd":"dd MMMM E","dateFormat-short":"dd.MM.yyyy","field-second":"Saniye","dateFormatItem-yMMMEd":"dd MMM y EEE","dateFormatItem-Ed":"d E","field-week":"Hafta","dateFormat-medium":"dd MMM y","dateFormatItem-mmss":"mm:ss","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yyyy":"y","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-narrow":["1","2","3","4"],"dateFormatItem-h":"h a","dateTimeFormat-long":"{1} {0}","dayPeriods-format-narrow-am":"AM","dateTimeFormat-full":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/tr/gregorian",{"months-format-narrow":["O","Ş","M","N","M","H","T","A","E","E","K","A"],"field-weekday":"Haftanın Günü","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"dd.MM.yyyy EEE","dateFormatItem-MMMEd":"dd MMM E","eraNarrow":["MÖ","MS"],"dateFormat-long":"dd MMMM y","months-format-wide":["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],"dateFormatItem-EEEd":"d EEE","dayPeriods-format-wide-pm":"PM","dateFormat-full":"dd MMMM y EEEE","dateFormatItem-Md":"dd/MM","field-era":"Miladi Dönem","dateFormatItem-yM":"M/yyyy","months-standAlone-wide":["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],"timeFormat-short":"HH:mm","quarters-format-wide":["1. çeyrek","2. çeyrek","3. çeyrek","4. çeyrek"],"timeFormat-long":"HH:mm:ss z","field-year":"Yıl","dateFormatItem-yMMM":"MMM y","dateFormatItem-yQ":"Q yyyy","field-hour":"Saat","months-format-abbr":["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],"dateFormatItem-yyQ":"Q yy","timeFormat-full":"HH:mm:ss zzzz","field-day-relative+0":"Bugün","field-day-relative+1":"Yarın","field-day-relative+2":"Yarından sonraki gün","dateFormatItem-H":"HH","field-day-relative+3":"Üç gün sonra","months-standAlone-abbr":["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],"quarters-format-abbr":["Ç1","Ç2","Ç3","Ç4"],"quarters-standAlone-wide":["1. çeyrek","2. çeyrek","3. çeyrek","4. çeyrek"],"dateFormatItem-M":"L","days-standAlone-wide":["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],"dateFormatItem-MMMMd":"dd MMMM","dateFormatItem-yyMMM":"MMM yy","timeFormat-medium":"HH:mm:ss","dateFormatItem-Hm":"HH:mm","quarters-standAlone-abbr":["Ç1","Ç2","Ç3","Ç4"],"eraAbbr":["MÖ","MS"],"field-minute":"Dakika","field-dayperiod":"AM/PM","days-standAlone-abbr":["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],"dateFormatItem-d":"d","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"Dün","field-day-relative+-2":"Evvelsi gün","field-day-relative+-3":"Üç gün önce","dateFormatItem-MMMd":"dd MMM","dateFormatItem-MEd":"dd/MM E","dateFormatItem-yMMMM":"MMMM y","field-day":"Gün","days-format-wide":["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],"field-zone":"Saat Dilimi","dateFormatItem-y":"y","months-standAlone-narrow":["O","Ş","M","N","M","H","T","A","E","E","K","A"],"dateFormatItem-yyMM":"MM/yy","dateFormatItem-hm":"h:mm a","days-format-abbr":["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],"eraNames":["Milattan Önce","Milattan Sonra"],"days-format-narrow":["P","P","S","Ç","P","C","C"],"field-month":"Ay","days-standAlone-narrow":["P","P","S","Ç","P","C","C"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"AM","dateFormatItem-MMMMEd":"dd MMMM E","dateFormat-short":"dd.MM.yyyy","field-second":"Saniye","dateFormatItem-yMMMEd":"dd MMM y EEE","dateFormatItem-Ed":"d E","field-week":"Hafta","dateFormat-medium":"dd MMM y","dateFormatItem-mmss":"mm:ss","dateFormatItem-Hms":"HH:mm:ss","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yyyy":"y"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/tr/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/tr/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..b55841257
--- /dev/null
+++ b/lib/dojo/cldr/nls/tr/gregorian.js.uncompressed.js
@@ -0,0 +1,239 @@
+define(
+"dojo/cldr/nls/tr/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "O",
+ "Ş",
+ "M",
+ "N",
+ "M",
+ "H",
+ "T",
+ "A",
+ "E",
+ "E",
+ "K",
+ "A"
+ ],
+ "field-weekday": "Haftanın Günü",
+ "dateFormatItem-yyQQQQ": "QQQQ yy",
+ "dateFormatItem-yQQQ": "QQQ y",
+ "dateFormatItem-yMEd": "dd.MM.yyyy EEE",
+ "dateFormatItem-MMMEd": "dd MMM E",
+ "eraNarrow": [
+ "MÖ",
+ "MS"
+ ],
+ "dateFormat-long": "dd MMMM y",
+ "months-format-wide": [
+ "Ocak",
+ "Şubat",
+ "Mart",
+ "Nisan",
+ "Mayıs",
+ "Haziran",
+ "Temmuz",
+ "Ağustos",
+ "Eylül",
+ "Ekim",
+ "Kasım",
+ "Aralık"
+ ],
+ "dateFormatItem-EEEd": "d EEE",
+ "dayPeriods-format-wide-pm": "PM",
+ "dateFormat-full": "dd MMMM y EEEE",
+ "dateFormatItem-Md": "dd/MM",
+ "field-era": "Miladi Dönem",
+ "dateFormatItem-yM": "M/yyyy",
+ "months-standAlone-wide": [
+ "Ocak",
+ "Şubat",
+ "Mart",
+ "Nisan",
+ "Mayıs",
+ "Haziran",
+ "Temmuz",
+ "Ağustos",
+ "Eylül",
+ "Ekim",
+ "Kasım",
+ "Aralık"
+ ],
+ "timeFormat-short": "HH:mm",
+ "quarters-format-wide": [
+ "1. çeyrek",
+ "2. çeyrek",
+ "3. çeyrek",
+ "4. çeyrek"
+ ],
+ "timeFormat-long": "HH:mm:ss z",
+ "field-year": "Yıl",
+ "dateFormatItem-yMMM": "MMM y",
+ "dateFormatItem-yQ": "Q yyyy",
+ "field-hour": "Saat",
+ "months-format-abbr": [
+ "Oca",
+ "Şub",
+ "Mar",
+ "Nis",
+ "May",
+ "Haz",
+ "Tem",
+ "Ağu",
+ "Eyl",
+ "Eki",
+ "Kas",
+ "Ara"
+ ],
+ "dateFormatItem-yyQ": "Q yy",
+ "timeFormat-full": "HH:mm:ss zzzz",
+ "field-day-relative+0": "Bugün",
+ "field-day-relative+1": "Yarın",
+ "field-day-relative+2": "Yarından sonraki gün",
+ "dateFormatItem-H": "HH",
+ "field-day-relative+3": "Üç gün sonra",
+ "months-standAlone-abbr": [
+ "Oca",
+ "Şub",
+ "Mar",
+ "Nis",
+ "May",
+ "Haz",
+ "Tem",
+ "Ağu",
+ "Eyl",
+ "Eki",
+ "Kas",
+ "Ara"
+ ],
+ "quarters-format-abbr": [
+ "Ç1",
+ "Ç2",
+ "Ç3",
+ "Ç4"
+ ],
+ "quarters-standAlone-wide": [
+ "1. çeyrek",
+ "2. çeyrek",
+ "3. çeyrek",
+ "4. çeyrek"
+ ],
+ "dateFormatItem-M": "L",
+ "days-standAlone-wide": [
+ "Pazar",
+ "Pazartesi",
+ "Salı",
+ "Çarşamba",
+ "Perşembe",
+ "Cuma",
+ "Cumartesi"
+ ],
+ "dateFormatItem-MMMMd": "dd MMMM",
+ "dateFormatItem-yyMMM": "MMM yy",
+ "timeFormat-medium": "HH:mm:ss",
+ "dateFormatItem-Hm": "HH:mm",
+ "quarters-standAlone-abbr": [
+ "Ç1",
+ "Ç2",
+ "Ç3",
+ "Ç4"
+ ],
+ "eraAbbr": [
+ "MÖ",
+ "MS"
+ ],
+ "field-minute": "Dakika",
+ "field-dayperiod": "AM/PM",
+ "days-standAlone-abbr": [
+ "Paz",
+ "Pzt",
+ "Sal",
+ "Çar",
+ "Per",
+ "Cum",
+ "Cmt"
+ ],
+ "dateFormatItem-d": "d",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "Dün",
+ "field-day-relative+-2": "Evvelsi gün",
+ "field-day-relative+-3": "Üç gün önce",
+ "dateFormatItem-MMMd": "dd MMM",
+ "dateFormatItem-MEd": "dd/MM E",
+ "dateFormatItem-yMMMM": "MMMM y",
+ "field-day": "Gün",
+ "days-format-wide": [
+ "Pazar",
+ "Pazartesi",
+ "Salı",
+ "Çarşamba",
+ "Perşembe",
+ "Cuma",
+ "Cumartesi"
+ ],
+ "field-zone": "Saat Dilimi",
+ "dateFormatItem-y": "y",
+ "months-standAlone-narrow": [
+ "O",
+ "Ş",
+ "M",
+ "N",
+ "M",
+ "H",
+ "T",
+ "A",
+ "E",
+ "E",
+ "K",
+ "A"
+ ],
+ "dateFormatItem-yyMM": "MM/yy",
+ "dateFormatItem-hm": "h:mm a",
+ "days-format-abbr": [
+ "Paz",
+ "Pzt",
+ "Sal",
+ "Çar",
+ "Per",
+ "Cum",
+ "Cmt"
+ ],
+ "eraNames": [
+ "Milattan Önce",
+ "Milattan Sonra"
+ ],
+ "days-format-narrow": [
+ "P",
+ "P",
+ "S",
+ "Ç",
+ "P",
+ "C",
+ "C"
+ ],
+ "field-month": "Ay",
+ "days-standAlone-narrow": [
+ "P",
+ "P",
+ "S",
+ "Ç",
+ "P",
+ "C",
+ "C"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "AM",
+ "dateFormatItem-MMMMEd": "dd MMMM E",
+ "dateFormat-short": "dd.MM.yyyy",
+ "field-second": "Saniye",
+ "dateFormatItem-yMMMEd": "dd MMM y EEE",
+ "dateFormatItem-Ed": "d E",
+ "field-week": "Hafta",
+ "dateFormat-medium": "dd MMM y",
+ "dateFormatItem-mmss": "mm:ss",
+ "dateFormatItem-Hms": "HH:mm:ss",
+ "dateFormatItem-hms": "h:mm:ss a",
+ "dateFormatItem-yyyy": "y"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/tr/number.js b/lib/dojo/cldr/nls/tr/number.js
index 7a3e4ea80..1cd3ab7e5 100644
--- a/lib/dojo/cldr/nls/tr/number.js
+++ b/lib/dojo/cldr/nls/tr/number.js
@@ -1 +1,8 @@
-({"group":".","percentSign":"%","exponential":"E","percentFormat":"% #,##0","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/tr/number",{"group":".","percentSign":"%","exponential":"E","scientificFormat":"#E0","percentFormat":"% #,##0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/tr/number.js.uncompressed.js b/lib/dojo/cldr/nls/tr/number.js.uncompressed.js
new file mode 100644
index 000000000..fa3d8e97b
--- /dev/null
+++ b/lib/dojo/cldr/nls/tr/number.js.uncompressed.js
@@ -0,0 +1,22 @@
+define(
+"dojo/cldr/nls/tr/number", //begin v1.x content
+{
+ "group": ".",
+ "percentSign": "%",
+ "exponential": "E",
+ "scientificFormat": "#E0",
+ "percentFormat": "% #,##0",
+ "list": ";",
+ "infinity": "∞",
+ "patternDigit": "#",
+ "minusSign": "-",
+ "decimal": ",",
+ "nan": "NaN",
+ "nativeZeroDigit": "0",
+ "perMille": "‰",
+ "decimalFormat": "#,##0.###",
+ "currencyFormat": "#,##0.00 ¤",
+ "plusSign": "+"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hant/buddhist.js b/lib/dojo/cldr/nls/zh-hant/buddhist.js
index 5e8a565ad..fb929d3d7 100644
--- a/lib/dojo/cldr/nls/zh-hant/buddhist.js
+++ b/lib/dojo/cldr/nls/zh-hant/buddhist.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"Gy/M","dateFormatItem-yQ":"Gy年QQQ","dayPeriods-format-wide-pm":"下午","dateFormatItem-MMMEd":"MMMd日E","dateTimeFormat-full":"{1}{0}","dateFormatItem-hms":"ah:mm:ss","dateFormatItem-yQQQ":"Gy年QQQ","dateFormatItem-MMdd":"MM/dd","dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"上午","dateFormatItem-y":"Gy年","timeFormat-full":"zzzzah時mm分ss秒","dateFormatItem-yyyy":"y年","months-standAlone-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"dateFormatItem-Ed":"d日(E)","dateFormatItem-yMMM":"Gy年M月","days-standAlone-narrow":["日","一","二","三","四","五","六"],"dateFormatItem-yyyyMMMM":"y年MMMM","dateFormat-long":"Gy年M月d日","timeFormat-medium":"ah:mm:ss","dateFormatItem-EEEd":"d EEE","dateFormatItem-Hm":"H:mm","dateFormatItem-yyMM":"Gyy/MM","dateFormat-medium":"Gy/M/d","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-yyMMM":"Gyy年MMM","dateFormatItem-yMd":"Gy/M/d","dateFormatItem-ms":"mm:ss","dateTimeFormat-long":"{1}{0}","months-standAlone-wide":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"dateFormatItem-MMMd":"MMMd日","dateFormatItem-yyQ":"Gyy年第Q季度","timeFormat-long":"zah時mm分ss秒","months-format-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-H":"H時","timeFormat-short":"ah:mm","quarters-format-abbr":["1季","2季","3季","4季"],"dateFormatItem-MMMMdd":"MMMMdd日","days-format-abbr":["週日","週一","週二","週三","週四","週五","週六"],"dateFormatItem-M":"M月","dateFormatItem-yMMMd":"Gy年MMMd日","dateFormatItem-MEd":"M/d(E)","dateFormatItem-hm":"ah:mm","dateFormat-short":"Gy/M/d","dateFormatItem-yyyyM":"y年M月","dateFormatItem-yMMMEd":"Gy年M月d日EEE","dateFormat-full":"Gy年M月d日EEEE","dateFormatItem-Md":"M/d","dateFormatItem-yMEd":"Gy/M/d(EEE)","months-format-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-d":"d日","quarters-format-wide":["第1季","第2季","第3季","第4季"],"days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-h":"ah時","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"eraNarrow":["BE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormat-medium":"{1} {0}","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["BE"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","eraNames":["BE"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/zh-hant/buddhist",{"dateFormatItem-yM":"Gy/M","dateFormatItem-yQ":"Gy年QQQ","dayPeriods-format-wide-pm":"下午","dateFormatItem-MMMEd":"MMMd日E","dateTimeFormat-full":"{1}{0}","dateFormatItem-hms":"ah:mm:ss","dateFormatItem-yQQQ":"Gy年QQQ","dateFormatItem-MMdd":"MM/dd","dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"上午","dateFormatItem-y":"Gy年","timeFormat-full":"zzzzah時mm分ss秒","dateFormatItem-yyyy":"y年","months-standAlone-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"dateFormatItem-Ed":"d日(E)","dateFormatItem-yMMM":"Gy年M月","days-standAlone-narrow":["日","一","二","三","四","五","六"],"dateFormatItem-yyyyMMMM":"y年MMMM","dateFormat-long":"Gy年M月d日","timeFormat-medium":"ah:mm:ss","dateFormatItem-EEEd":"d EEE","dateFormatItem-Hm":"H:mm","dateFormatItem-yyMM":"Gyy/MM","dateFormat-medium":"Gy/M/d","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-yyMMM":"Gyy年MMM","dateFormatItem-yMd":"Gy/M/d","dateFormatItem-ms":"mm:ss","dateTimeFormat-long":"{1}{0}","months-standAlone-wide":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"dateFormatItem-MMMd":"MMMd日","dateFormatItem-yyQ":"Gyy年第Q季度","timeFormat-long":"zah時mm分ss秒","months-format-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-H":"H時","timeFormat-short":"ah:mm","quarters-format-abbr":["1季","2季","3季","4季"],"dateFormatItem-MMMMdd":"MMMMdd日","days-format-abbr":["週日","週一","週二","週三","週四","週五","週六"],"dateFormatItem-M":"M月","dateFormatItem-yMMMd":"Gy年MMMd日","dateFormatItem-MEd":"M/d(E)","dateFormatItem-hm":"ah:mm","dateFormat-short":"Gy/M/d","dateFormatItem-yyyyM":"y年M月","dateFormatItem-yMMMEd":"Gy年M月d日EEE","dateFormat-full":"Gy年M月d日EEEE","dateFormatItem-Md":"M/d","dateFormatItem-yMEd":"Gy/M/d(EEE)","months-format-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-d":"d日","quarters-format-wide":["第1季","第2季","第3季","第4季"],"days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-h":"ah時"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hant/buddhist.js.uncompressed.js b/lib/dojo/cldr/nls/zh-hant/buddhist.js.uncompressed.js
new file mode 100644
index 000000000..af310b0c6
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hant/buddhist.js.uncompressed.js
@@ -0,0 +1,146 @@
+define(
+"dojo/cldr/nls/zh-hant/buddhist", //begin v1.x content
+{
+ "dateFormatItem-yM": "Gy/M",
+ "dateFormatItem-yQ": "Gy年QQQ",
+ "dayPeriods-format-wide-pm": "下午",
+ "dateFormatItem-MMMEd": "MMMd日E",
+ "dateTimeFormat-full": "{1}{0}",
+ "dateFormatItem-hms": "ah:mm:ss",
+ "dateFormatItem-yQQQ": "Gy年QQQ",
+ "dateFormatItem-MMdd": "MM/dd",
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "上午",
+ "dateFormatItem-y": "Gy年",
+ "timeFormat-full": "zzzzah時mm分ss秒",
+ "dateFormatItem-yyyy": "y年",
+ "months-standAlone-abbr": [
+ "一月",
+ "二月",
+ "三月",
+ "四月",
+ "五月",
+ "六月",
+ "七月",
+ "八月",
+ "九月",
+ "十月",
+ "十一月",
+ "十二月"
+ ],
+ "dateFormatItem-Ed": "d日(E)",
+ "dateFormatItem-yMMM": "Gy年M月",
+ "days-standAlone-narrow": [
+ "日",
+ "一",
+ "二",
+ "三",
+ "四",
+ "五",
+ "六"
+ ],
+ "dateFormatItem-yyyyMMMM": "y年MMMM",
+ "dateFormat-long": "Gy年M月d日",
+ "timeFormat-medium": "ah:mm:ss",
+ "dateFormatItem-EEEd": "d EEE",
+ "dateFormatItem-Hm": "H:mm",
+ "dateFormatItem-yyMM": "Gyy/MM",
+ "dateFormat-medium": "Gy/M/d",
+ "dateFormatItem-Hms": "H:mm:ss",
+ "dateFormatItem-yyMMM": "Gyy年MMM",
+ "dateFormatItem-yMd": "Gy/M/d",
+ "dateFormatItem-ms": "mm:ss",
+ "dateTimeFormat-long": "{1}{0}",
+ "months-standAlone-wide": [
+ "一月",
+ "二月",
+ "三月",
+ "四月",
+ "五月",
+ "六月",
+ "七月",
+ "八月",
+ "九月",
+ "十月",
+ "十一月",
+ "十二月"
+ ],
+ "dateFormatItem-MMMd": "MMMd日",
+ "dateFormatItem-yyQ": "Gyy年第Q季度",
+ "timeFormat-long": "zah時mm分ss秒",
+ "months-format-abbr": [
+ "1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月"
+ ],
+ "dateFormatItem-H": "H時",
+ "timeFormat-short": "ah:mm",
+ "quarters-format-abbr": [
+ "1季",
+ "2季",
+ "3季",
+ "4季"
+ ],
+ "dateFormatItem-MMMMdd": "MMMMdd日",
+ "days-format-abbr": [
+ "週日",
+ "週一",
+ "週二",
+ "週三",
+ "週四",
+ "週五",
+ "週六"
+ ],
+ "dateFormatItem-M": "M月",
+ "dateFormatItem-yMMMd": "Gy年MMMd日",
+ "dateFormatItem-MEd": "M/d(E)",
+ "dateFormatItem-hm": "ah:mm",
+ "dateFormat-short": "Gy/M/d",
+ "dateFormatItem-yyyyM": "y年M月",
+ "dateFormatItem-yMMMEd": "Gy年M月d日EEE",
+ "dateFormat-full": "Gy年M月d日EEEE",
+ "dateFormatItem-Md": "M/d",
+ "dateFormatItem-yMEd": "Gy/M/d(EEE)",
+ "months-format-wide": [
+ "1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月"
+ ],
+ "dateFormatItem-d": "d日",
+ "quarters-format-wide": [
+ "第1季",
+ "第2季",
+ "第3季",
+ "第4季"
+ ],
+ "days-format-wide": [
+ "星期日",
+ "星期一",
+ "星期二",
+ "星期三",
+ "星期四",
+ "星期五",
+ "星期六"
+ ],
+ "dateFormatItem-h": "ah時"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hant/currency.js b/lib/dojo/cldr/nls/zh-hant/currency.js
index 289e9bb5f..be12a4e7b 100644
--- a/lib/dojo/cldr/nls/zh-hant/currency.js
+++ b/lib/dojo/cldr/nls/zh-hant/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"港幣","CHF_displayName":"瑞士法郎","CAD_displayName":"加幣","CNY_displayName":"人民幣","USD_symbol":"$","AUD_displayName":"澳幣","JPY_displayName":"日圓","CNY_symbol":"¥","GBP_displayName":"英鎊","EUR_displayName":"歐元","USD_displayName":"美元","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/zh-hant/currency",{"HKD_displayName":"港幣","CHF_displayName":"瑞士法郎","CAD_displayName":"加幣","CNY_displayName":"人民幣","USD_symbol":"$","AUD_displayName":"澳幣","JPY_displayName":"日圓","CNY_symbol":"¥","GBP_displayName":"英鎊","EUR_displayName":"歐元"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hant/currency.js.uncompressed.js b/lib/dojo/cldr/nls/zh-hant/currency.js.uncompressed.js
new file mode 100644
index 000000000..c2614477f
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hant/currency.js.uncompressed.js
@@ -0,0 +1,16 @@
+define(
+"dojo/cldr/nls/zh-hant/currency", //begin v1.x content
+{
+ "HKD_displayName": "港幣",
+ "CHF_displayName": "瑞士法郎",
+ "CAD_displayName": "加幣",
+ "CNY_displayName": "人民幣",
+ "USD_symbol": "$",
+ "AUD_displayName": "澳幣",
+ "JPY_displayName": "日圓",
+ "CNY_symbol": "¥",
+ "GBP_displayName": "英鎊",
+ "EUR_displayName": "歐元"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hant/gregorian.js b/lib/dojo/cldr/nls/zh-hant/gregorian.js
index a32d30434..98a066dd4 100644
--- a/lib/dojo/cldr/nls/zh-hant/gregorian.js
+++ b/lib/dojo/cldr/nls/zh-hant/gregorian.js
@@ -1 +1,8 @@
-({"field-weekday":"週天","dateFormatItem-yQQQ":"y年QQQ","dateFormatItem-yMEd":"yyyy/M/d(EEE)","dateFormatItem-MMMEd":"MMMd日E","eraNarrow":["西元前","西元"],"dateFormat-long":"y年M月d日","months-format-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"下午","dateFormat-full":"y年M月d日EEEE","dateFormatItem-Md":"M/d","field-era":"年代","dateFormatItem-yM":"yyyy/M","months-standAlone-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"timeFormat-short":"ah:mm","quarters-format-wide":["第1季","第2季","第3季","第4季"],"timeFormat-long":"zah時mm分ss秒","field-year":"年","dateFormatItem-yMMM":"y年M月","dateFormatItem-yQ":"y年QQQ","field-hour":"小時","dateFormatItem-MMdd":"MM/dd","months-format-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-yyQ":"yy年第Q季度","timeFormat-full":"zzzzah時mm分ss秒","field-day-relative+0":"今天","field-day-relative+1":"明天","field-day-relative+2":"後天","dateFormatItem-H":"H時","field-day-relative+3":"大後天","months-standAlone-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"quarters-format-abbr":["1季","2季","3季","4季"],"quarters-standAlone-wide":["第1季","第2季","第3季","第4季"],"dateFormatItem-M":"M月","days-standAlone-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-yyMMM":"yy年MMM","timeFormat-medium":"ah:mm:ss","dateFormatItem-Hm":"H:mm","quarters-standAlone-abbr":["1季","2季","3季","4季"],"eraAbbr":["西元前","西元"],"field-minute":"分鐘","field-dayperiod":"上午/下午","days-standAlone-abbr":["週日","週一","週二","週三","週四","週五","週六"],"dateFormatItem-d":"d日","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"昨天","dateFormatItem-h":"ah時","dateTimeFormat-long":"{1}{0}","field-day-relative+-2":"前天","field-day-relative+-3":"大前天","dateFormatItem-MMMd":"MMMd日","dateFormatItem-MEd":"M/d(E)","dateTimeFormat-full":"{1}{0}","field-day":"日","days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"field-zone":"區域","dateFormatItem-y":"y年","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-yyMM":"yy-MM","dateFormatItem-hm":"ah:mm","days-format-abbr":["週日","週一","週二","週三","週四","週五","週六"],"dateFormatItem-yMMMd":"y年MMMd日","eraNames":["西元前","西元"],"days-format-narrow":["日","一","二","三","四","五","六"],"field-month":"月","days-standAlone-narrow":["日","一","二","三","四","五","六"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"上午","dateFormatItem-MMMMdd":"MMMMdd日","dateFormat-short":"yy/M/d","field-second":"秒","dateFormatItem-yMMMEd":"y年M月d日EEE","dateFormatItem-Ed":"d日(E)","field-week":"週","dateFormat-medium":"yyyy/M/d","dateFormatItem-yyyyM":"y年M月","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"ah:mm:ss","dateFormatItem-yyyy":"y年","months-format-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dayPeriods-format-wide-earlyMorning":"清晨","dayPeriods-format-wide-morning":"上午","dateFormatItem-yyyyMMMM":"y年MMMM","dayPeriods-format-wide-night":"晚上","dayPeriods-format-wide-midDay":"中午","dayPeriods-format-wide-weeHours":"凌晨","dayPeriods-format-wide-afternoon":"下午","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/zh-hant/gregorian",{"field-weekday":"週天","dateFormatItem-yQQQ":"y年QQQ","dateFormatItem-yMEd":"yyyy/M/d(EEE)","dateFormatItem-MMMEd":"MMMd日E","eraNarrow":["西元前","西元"],"dateFormat-long":"y年M月d日","months-format-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"下午","dateFormat-full":"y年M月d日EEEE","dateFormatItem-Md":"M/d","field-era":"年代","dateFormatItem-yM":"yyyy/M","months-standAlone-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"timeFormat-short":"ah:mm","quarters-format-wide":["第1季","第2季","第3季","第4季"],"timeFormat-long":"zah時mm分ss秒","field-year":"年","dateFormatItem-yMMM":"y年M月","dateFormatItem-yQ":"y年QQQ","field-hour":"小時","dateFormatItem-MMdd":"MM/dd","months-format-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-yyQ":"yy年第Q季度","timeFormat-full":"zzzzah時mm分ss秒","field-day-relative+0":"今天","field-day-relative+1":"明天","field-day-relative+2":"後天","dateFormatItem-H":"H時","field-day-relative+3":"大後天","months-standAlone-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"quarters-format-abbr":["1季","2季","3季","4季"],"quarters-standAlone-wide":["第1季","第2季","第3季","第4季"],"dateFormatItem-M":"M月","days-standAlone-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-yyMMM":"yy年MMM","timeFormat-medium":"ah:mm:ss","dateFormatItem-Hm":"H:mm","quarters-standAlone-abbr":["1季","2季","3季","4季"],"eraAbbr":["西元前","西元"],"field-minute":"分鐘","field-dayperiod":"上午/下午","days-standAlone-abbr":["週日","週一","週二","週三","週四","週五","週六"],"dateFormatItem-d":"d日","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"昨天","dateFormatItem-h":"ah時","dateTimeFormat-long":"{1}{0}","field-day-relative+-2":"前天","field-day-relative+-3":"大前天","dateFormatItem-MMMd":"MMMd日","dateFormatItem-MEd":"M/d(E)","dateTimeFormat-full":"{1}{0}","field-day":"日","days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"field-zone":"區域","dateFormatItem-y":"y年","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormatItem-yyMM":"yy-MM","dateFormatItem-hm":"ah:mm","days-format-abbr":["週日","週一","週二","週三","週四","週五","週六"],"dateFormatItem-yMMMd":"y年MMMd日","eraNames":["西元前","西元"],"days-format-narrow":["日","一","二","三","四","五","六"],"field-month":"月","days-standAlone-narrow":["日","一","二","三","四","五","六"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"上午","dateFormatItem-MMMMdd":"MMMMdd日","dateFormat-short":"yy/M/d","field-second":"秒","dateFormatItem-yMMMEd":"y年M月d日EEE","dateFormatItem-Ed":"d日(E)","field-week":"週","dateFormat-medium":"yyyy/M/d","dateFormatItem-yyyyM":"y年M月","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"ah:mm:ss","dateFormatItem-yyyy":"y年"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hant/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/zh-hant/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..ed7e396e2
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hant/gregorian.js.uncompressed.js
@@ -0,0 +1,228 @@
+define(
+"dojo/cldr/nls/zh-hant/gregorian", //begin v1.x content
+{
+ "field-weekday": "週天",
+ "dateFormatItem-yQQQ": "y年QQQ",
+ "dateFormatItem-yMEd": "yyyy/M/d(EEE)",
+ "dateFormatItem-MMMEd": "MMMd日E",
+ "eraNarrow": [
+ "西元前",
+ "西元"
+ ],
+ "dateFormat-long": "y年M月d日",
+ "months-format-wide": [
+ "1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月"
+ ],
+ "dateTimeFormat-medium": "{1} {0}",
+ "dayPeriods-format-wide-pm": "下午",
+ "dateFormat-full": "y年M月d日EEEE",
+ "dateFormatItem-Md": "M/d",
+ "field-era": "年代",
+ "dateFormatItem-yM": "yyyy/M",
+ "months-standAlone-wide": [
+ "1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月"
+ ],
+ "timeFormat-short": "ah:mm",
+ "quarters-format-wide": [
+ "第1季",
+ "第2季",
+ "第3季",
+ "第4季"
+ ],
+ "timeFormat-long": "zah時mm分ss秒",
+ "field-year": "年",
+ "dateFormatItem-yMMM": "y年M月",
+ "dateFormatItem-yQ": "y年QQQ",
+ "field-hour": "小時",
+ "dateFormatItem-MMdd": "MM/dd",
+ "months-format-abbr": [
+ "1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月"
+ ],
+ "dateFormatItem-yyQ": "yy年第Q季度",
+ "timeFormat-full": "zzzzah時mm分ss秒",
+ "field-day-relative+0": "今天",
+ "field-day-relative+1": "明天",
+ "field-day-relative+2": "後天",
+ "dateFormatItem-H": "H時",
+ "field-day-relative+3": "大後天",
+ "months-standAlone-abbr": [
+ "一月",
+ "二月",
+ "三月",
+ "四月",
+ "五月",
+ "六月",
+ "七月",
+ "八月",
+ "九月",
+ "十月",
+ "十一月",
+ "十二月"
+ ],
+ "quarters-format-abbr": [
+ "1季",
+ "2季",
+ "3季",
+ "4季"
+ ],
+ "quarters-standAlone-wide": [
+ "第1季",
+ "第2季",
+ "第3季",
+ "第4季"
+ ],
+ "dateFormatItem-M": "M月",
+ "days-standAlone-wide": [
+ "星期日",
+ "星期一",
+ "星期二",
+ "星期三",
+ "星期四",
+ "星期五",
+ "星期六"
+ ],
+ "dateFormatItem-yyMMM": "yy年MMM",
+ "timeFormat-medium": "ah:mm:ss",
+ "dateFormatItem-Hm": "H:mm",
+ "quarters-standAlone-abbr": [
+ "1季",
+ "2季",
+ "3季",
+ "4季"
+ ],
+ "eraAbbr": [
+ "西元前",
+ "西元"
+ ],
+ "field-minute": "分鐘",
+ "field-dayperiod": "上午/下午",
+ "days-standAlone-abbr": [
+ "週日",
+ "週一",
+ "週二",
+ "週三",
+ "週四",
+ "週五",
+ "週六"
+ ],
+ "dateFormatItem-d": "d日",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "昨天",
+ "dateFormatItem-h": "ah時",
+ "dateTimeFormat-long": "{1}{0}",
+ "field-day-relative+-2": "前天",
+ "field-day-relative+-3": "大前天",
+ "dateFormatItem-MMMd": "MMMd日",
+ "dateFormatItem-MEd": "M/d(E)",
+ "dateTimeFormat-full": "{1}{0}",
+ "field-day": "日",
+ "days-format-wide": [
+ "星期日",
+ "星期一",
+ "星期二",
+ "星期三",
+ "星期四",
+ "星期五",
+ "星期六"
+ ],
+ "field-zone": "區域",
+ "dateFormatItem-y": "y年",
+ "months-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dateFormatItem-yyMM": "yy-MM",
+ "dateFormatItem-hm": "ah:mm",
+ "days-format-abbr": [
+ "週日",
+ "週一",
+ "週二",
+ "週三",
+ "週四",
+ "週五",
+ "週六"
+ ],
+ "dateFormatItem-yMMMd": "y年MMMd日",
+ "eraNames": [
+ "西元前",
+ "西元"
+ ],
+ "days-format-narrow": [
+ "日",
+ "一",
+ "二",
+ "三",
+ "四",
+ "五",
+ "六"
+ ],
+ "field-month": "月",
+ "days-standAlone-narrow": [
+ "日",
+ "一",
+ "二",
+ "三",
+ "四",
+ "五",
+ "六"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "上午",
+ "dateFormatItem-MMMMdd": "MMMMdd日",
+ "dateFormat-short": "yy/M/d",
+ "field-second": "秒",
+ "dateFormatItem-yMMMEd": "y年M月d日EEE",
+ "dateFormatItem-Ed": "d日(E)",
+ "field-week": "週",
+ "dateFormat-medium": "yyyy/M/d",
+ "dateFormatItem-yyyyM": "y年M月",
+ "dateTimeFormat-short": "{1} {0}",
+ "dateFormatItem-Hms": "H:mm:ss",
+ "dateFormatItem-hms": "ah:mm:ss",
+ "dateFormatItem-yyyy": "y年"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hant/islamic.js b/lib/dojo/cldr/nls/zh-hant/islamic.js
index e46d2179d..5967498db 100644
--- a/lib/dojo/cldr/nls/zh-hant/islamic.js
+++ b/lib/dojo/cldr/nls/zh-hant/islamic.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"yyyy/M","dateFormatItem-yQ":"y年QQQ","dayPeriods-format-wide-pm":"下午","dateFormatItem-MMMEd":"MMMd日E","dateTimeFormat-full":"{1}{0}","dateFormatItem-hms":"ah:mm:ss","dateFormatItem-yQQQ":"y年QQQ","dateFormatItem-MMdd":"MM/dd","dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"上午","dateFormatItem-y":"y年","timeFormat-full":"zzzzah時mm分ss秒","dateFormatItem-yyyy":"Gy年","dateFormatItem-Ed":"d日(E)","dateFormatItem-yMMM":"y年M月","days-standAlone-narrow":["日","一","二","三","四","五","六"],"dateFormat-long":"Gy年M月d日","timeFormat-medium":"ah:mm:ss","dateFormatItem-Hm":"H:mm","dateFormat-medium":"Gy/M/d","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-ms":"mm:ss","dateTimeFormat-long":"{1}{0}","dateFormatItem-yyyyMd":"Gy/M/d","dateFormatItem-yyyyMMMd":"Gy年M月d日","dateFormatItem-MMMd":"MMMd日","timeFormat-long":"zah時mm分ss秒","timeFormat-short":"ah:mm","dateFormatItem-H":"H時","quarters-format-abbr":["1季","2季","3季","4季"],"days-format-abbr":["週日","週一","週二","週三","週四","週五","週六"],"dateFormatItem-MMMMdd":"MMMMdd日","dateFormatItem-M":"M月","dateFormatItem-MEd":"M/d(E)","dateFormatItem-hm":"ah:mm","dateFormat-short":"Gy/M/d","dateFormatItem-yyyyM":"Gy/M","dateFormatItem-yMMMEd":"y年M月d日EEE","dateFormat-full":"Gy年M月d日EEEE","dateFormatItem-Md":"M/d","dateFormatItem-yyyyQ":"Gy年QQQ","dateFormatItem-yMEd":"yyyy/M/d(EEE)","dateFormatItem-yyyyMMM":"Gy年M月","dateFormatItem-d":"d日","quarters-format-wide":["第1季","第2季","第3季","第4季"],"days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-h":"ah時","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"eraNarrow":["AH"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","months-format-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","months-standAlone-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"dateTimeFormats-appendItem-Era":"{0} {1}","months-format-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","months-standAlone-abbr":["Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H."],"quarters-standAlone-wide":["Q1","Q2","Q3","Q4"],"days-standAlone-wide":["1","2","3","4","5","6","7"],"quarters-standAlone-abbr":["Q1","Q2","Q3","Q4"],"eraAbbr":["AH"],"days-standAlone-abbr":["1","2","3","4","5","6","7"],"quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","eraNames":["AH"],"days-format-narrow":["1","2","3","4","5","6","7"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM","dateTimeFormat-short":"{1} {0}"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/zh-hant/islamic",{"dateFormatItem-yM":"yyyy/M","dateFormatItem-yQ":"y年QQQ","dayPeriods-format-wide-pm":"下午","dateFormatItem-MMMEd":"MMMd日E","dateTimeFormat-full":"{1}{0}","dateFormatItem-hms":"ah:mm:ss","dateFormatItem-yQQQ":"y年QQQ","dateFormatItem-MMdd":"MM/dd","dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"上午","dateFormatItem-y":"y年","timeFormat-full":"zzzzah時mm分ss秒","dateFormatItem-yyyy":"Gy年","dateFormatItem-Ed":"d日(E)","dateFormatItem-yMMM":"y年M月","days-standAlone-narrow":["日","一","二","三","四","五","六"],"dateFormat-long":"Gy年M月d日","timeFormat-medium":"ah:mm:ss","dateFormatItem-Hm":"H:mm","dateFormat-medium":"Gy/M/d","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-ms":"mm:ss","dateTimeFormat-long":"{1}{0}","dateFormatItem-yyyyMd":"Gy/M/d","dateFormatItem-yyyyMMMd":"Gy年M月d日","dateFormatItem-MMMd":"MMMd日","timeFormat-long":"zah時mm分ss秒","timeFormat-short":"ah:mm","dateFormatItem-H":"H時","quarters-format-abbr":["1季","2季","3季","4季"],"days-format-abbr":["週日","週一","週二","週三","週四","週五","週六"],"dateFormatItem-MMMMdd":"MMMMdd日","dateFormatItem-M":"M月","dateFormatItem-MEd":"M/d(E)","dateFormatItem-hm":"ah:mm","dateFormat-short":"Gy/M/d","dateFormatItem-yyyyM":"Gy/M","dateFormatItem-yMMMEd":"y年M月d日EEE","dateFormat-full":"Gy年M月d日EEEE","dateFormatItem-Md":"M/d","dateFormatItem-yyyyQ":"Gy年QQQ","dateFormatItem-yMEd":"yyyy/M/d(EEE)","dateFormatItem-yyyyMMM":"Gy年M月","dateFormatItem-d":"d日","quarters-format-wide":["第1季","第2季","第3季","第4季"],"days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-h":"ah時"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hant/islamic.js.uncompressed.js b/lib/dojo/cldr/nls/zh-hant/islamic.js.uncompressed.js
new file mode 100644
index 000000000..f0b7db446
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hant/islamic.js.uncompressed.js
@@ -0,0 +1,87 @@
+define(
+"dojo/cldr/nls/zh-hant/islamic", //begin v1.x content
+{
+ "dateFormatItem-yM": "yyyy/M",
+ "dateFormatItem-yQ": "y年QQQ",
+ "dayPeriods-format-wide-pm": "下午",
+ "dateFormatItem-MMMEd": "MMMd日E",
+ "dateTimeFormat-full": "{1}{0}",
+ "dateFormatItem-hms": "ah:mm:ss",
+ "dateFormatItem-yQQQ": "y年QQQ",
+ "dateFormatItem-MMdd": "MM/dd",
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "上午",
+ "dateFormatItem-y": "y年",
+ "timeFormat-full": "zzzzah時mm分ss秒",
+ "dateFormatItem-yyyy": "Gy年",
+ "dateFormatItem-Ed": "d日(E)",
+ "dateFormatItem-yMMM": "y年M月",
+ "days-standAlone-narrow": [
+ "日",
+ "一",
+ "二",
+ "三",
+ "四",
+ "五",
+ "六"
+ ],
+ "dateFormat-long": "Gy年M月d日",
+ "timeFormat-medium": "ah:mm:ss",
+ "dateFormatItem-Hm": "H:mm",
+ "dateFormat-medium": "Gy/M/d",
+ "dateFormatItem-Hms": "H:mm:ss",
+ "dateFormatItem-ms": "mm:ss",
+ "dateTimeFormat-long": "{1}{0}",
+ "dateFormatItem-yyyyMd": "Gy/M/d",
+ "dateFormatItem-yyyyMMMd": "Gy年M月d日",
+ "dateFormatItem-MMMd": "MMMd日",
+ "timeFormat-long": "zah時mm分ss秒",
+ "timeFormat-short": "ah:mm",
+ "dateFormatItem-H": "H時",
+ "quarters-format-abbr": [
+ "1季",
+ "2季",
+ "3季",
+ "4季"
+ ],
+ "days-format-abbr": [
+ "週日",
+ "週一",
+ "週二",
+ "週三",
+ "週四",
+ "週五",
+ "週六"
+ ],
+ "dateFormatItem-MMMMdd": "MMMMdd日",
+ "dateFormatItem-M": "M月",
+ "dateFormatItem-MEd": "M/d(E)",
+ "dateFormatItem-hm": "ah:mm",
+ "dateFormat-short": "Gy/M/d",
+ "dateFormatItem-yyyyM": "Gy/M",
+ "dateFormatItem-yMMMEd": "y年M月d日EEE",
+ "dateFormat-full": "Gy年M月d日EEEE",
+ "dateFormatItem-Md": "M/d",
+ "dateFormatItem-yyyyQ": "Gy年QQQ",
+ "dateFormatItem-yMEd": "yyyy/M/d(EEE)",
+ "dateFormatItem-yyyyMMM": "Gy年M月",
+ "dateFormatItem-d": "d日",
+ "quarters-format-wide": [
+ "第1季",
+ "第2季",
+ "第3季",
+ "第4季"
+ ],
+ "days-format-wide": [
+ "星期日",
+ "星期一",
+ "星期二",
+ "星期三",
+ "星期四",
+ "星期五",
+ "星期六"
+ ],
+ "dateFormatItem-h": "ah時"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hant/number.js b/lib/dojo/cldr/nls/zh-hant/number.js
index 159717470..b7f8f06ec 100644
--- a/lib/dojo/cldr/nls/zh-hant/number.js
+++ b/lib/dojo/cldr/nls/zh-hant/number.js
@@ -1 +1,8 @@
-({"currencyFormat":"¤#,##0.00","decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/zh-hant/number",{"currencyFormat":"¤#,##0.00"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hant/number.js.uncompressed.js b/lib/dojo/cldr/nls/zh-hant/number.js.uncompressed.js
new file mode 100644
index 000000000..e50992960
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hant/number.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dojo/cldr/nls/zh-hant/number", //begin v1.x content
+{
+ "currencyFormat": "¤#,##0.00"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hk/currency.js b/lib/dojo/cldr/nls/zh-hk/currency.js
index aab119f0a..7191c7df6 100644
--- a/lib/dojo/cldr/nls/zh-hk/currency.js
+++ b/lib/dojo/cldr/nls/zh-hk/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"港幣","HKD_symbol":"HK$","CAD_displayName":"加幣","CNY_displayName":"人民幣","USD_symbol":"$","AUD_displayName":"澳幣","JPY_displayName":"日圓","GBP_displayName":"英鎊","EUR_displayName":"歐元","CHF_displayName":"瑞士法郎","USD_displayName":"美元","CNY_symbol":"¥","CAD_symbol":"CA$","GBP_symbol":"£","JPY_symbol":"JP¥","AUD_symbol":"AU$","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/zh-hk/currency",{"HKD_displayName":"港幣","HKD_symbol":"HK$","CAD_displayName":"加幣","CNY_displayName":"人民幣","USD_symbol":"$","AUD_displayName":"澳幣","JPY_displayName":"日圓","GBP_displayName":"英鎊","EUR_displayName":"歐元"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hk/currency.js.uncompressed.js b/lib/dojo/cldr/nls/zh-hk/currency.js.uncompressed.js
new file mode 100644
index 000000000..48ce9a403
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hk/currency.js.uncompressed.js
@@ -0,0 +1,15 @@
+define(
+"dojo/cldr/nls/zh-hk/currency", //begin v1.x content
+{
+ "HKD_displayName": "港幣",
+ "HKD_symbol": "HK$",
+ "CAD_displayName": "加幣",
+ "CNY_displayName": "人民幣",
+ "USD_symbol": "$",
+ "AUD_displayName": "澳幣",
+ "JPY_displayName": "日圓",
+ "GBP_displayName": "英鎊",
+ "EUR_displayName": "歐元"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hk/gregorian.js b/lib/dojo/cldr/nls/zh-hk/gregorian.js
index fe3a9a00d..436681258 100644
--- a/lib/dojo/cldr/nls/zh-hk/gregorian.js
+++ b/lib/dojo/cldr/nls/zh-hk/gregorian.js
@@ -1 +1,8 @@
-({"dateFormatItem-yM":"yyyy/M","field-minute":"分鐘","eraNames":["西元前","西元"],"field-weekday":"週天","dateFormatItem-MMdd":"MM/dd","field-day-relative+-3":"大前天","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormat-short":"{1} {0}","field-era":"年代","field-hour":"小時","dateTimeFormat-medium":"{1} {0}","quarters-standAlone-abbr":["第1季","第2季","第3季","第4季"],"timeFormat-full":"zzzzah時mm分ss秒","dateFormatItem-Ed":"d日(E)","dateFormatItem-yMMM":"y年M月","eraAbbr":["西元前","西元"],"field-day-relative+2":"後天","field-day-relative+3":"大後天","dateFormat-long":"y年M月d日","timeFormat-medium":"ah:mm:ss","field-zone":"區域","dateFormat-medium":"yyyy/M/d","quarters-standAlone-wide":["第1季","第2季","第3季","第4季"],"field-week":"週","timeFormat-long":"zah時mm分ss秒","dateFormatItem-H":"H時","quarters-format-abbr":["第1季","第2季","第3季","第4季"],"field-second":"秒","dateFormatItem-MEd":"M/d(E)","dateFormat-short":"yy/M/d","dateFormatItem-yMMMEd":"y年M月d日EEE","dateFormat-full":"y年M月d日EEEE","dateFormatItem-Md":"M/d","dateFormatItem-yMEd":"yyyy/M/d(EEE)","quarters-format-wide":["第1季","第2季","第3季","第4季"],"eraNarrow":["西元前","西元"],"dateFormatItem-h":"ah時","months-format-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-yQQQ":"y年QQQ","dateFormatItem-MMMEd":"MMMd日E","dayPeriods-format-wide-earlyMorning":"清晨","dayPeriods-format-wide-morning":"上午","months-format-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dayPeriods-format-wide-pm":"下午","months-standAlone-wide":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"timeFormat-short":"ah:mm","field-year":"年","dateFormatItem-yQ":"y年QQQ","dateFormatItem-yyyyMMMM":"y年MMMM","months-format-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-yyQ":"yy年第Q季度","field-day-relative+0":"今天","field-day-relative+1":"明天","months-standAlone-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"dateFormatItem-M":"M月","days-standAlone-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-yyMMM":"yy年MMM","dateFormatItem-Hm":"H:mm","field-dayperiod":"上午/下午","days-standAlone-abbr":["周日","周一","周二","周三","周四","周五","周六"],"dayPeriods-format-wide-night":"晚上","dateFormatItem-d":"d日","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"昨天","dateTimeFormat-long":"{1}{0}","field-day-relative+-2":"前天","dateFormatItem-MMMd":"MMMd日","dayPeriods-format-wide-midDay":"中午","dateTimeFormat-full":"{1}{0}","field-day":"日","days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-y":"y年","dateFormatItem-yyMM":"yy-MM","dateFormatItem-hm":"ah:mm","days-format-abbr":["周日","周一","周二","周三","周四","周五","周六"],"dateFormatItem-yMMMd":"y年MMMd日","days-format-narrow":["日","一","二","三","四","五","六"],"field-month":"月","days-standAlone-narrow":["日","一","二","三","四","五","六"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"上午","dateFormatItem-MMMMdd":"MMMMdd日","dayPeriods-format-wide-weeHours":"凌晨","dayPeriods-format-wide-afternoon":"下午","dateFormatItem-yyyyM":"y年M月","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"ah:mm:ss","dateFormatItem-yyyy":"y年","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/zh-hk/gregorian",{"dateFormatItem-yM":"yyyy/M","field-minute":"分鐘","eraNames":["西元前","西元"],"field-weekday":"週天","dateFormatItem-MMdd":"MM/dd","field-day-relative+-3":"大前天","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormat-short":"{1} {0}","field-era":"年代","field-hour":"小時","dateTimeFormat-medium":"{1} {0}","quarters-standAlone-abbr":["第1季","第2季","第3季","第4季"],"timeFormat-full":"zzzzah時mm分ss秒","dateFormatItem-Ed":"d日(E)","dateFormatItem-yMMM":"y年M月","eraAbbr":["西元前","西元"],"field-day-relative+2":"後天","field-day-relative+3":"大後天","dateFormat-long":"y年M月d日","timeFormat-medium":"ah:mm:ss","field-zone":"區域","dateFormat-medium":"yyyy/M/d","quarters-standAlone-wide":["第1季","第2季","第3季","第4季"],"field-week":"週","timeFormat-long":"zah時mm分ss秒","dateFormatItem-H":"H時","quarters-format-abbr":["第1季","第2季","第3季","第4季"],"field-second":"秒","dateFormatItem-MEd":"M/d(E)","dateFormat-short":"yy/M/d","dateFormatItem-yMMMEd":"y年M月d日EEE","dateFormat-full":"y年M月d日EEEE","dateFormatItem-Md":"M/d","dateFormatItem-yMEd":"yyyy/M/d(EEE)","quarters-format-wide":["第1季","第2季","第3季","第4季"],"eraNarrow":["西元前","西元"],"dateFormatItem-h":"ah時"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hk/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/zh-hk/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..8a8ae33d0
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hk/gregorian.js.uncompressed.js
@@ -0,0 +1,85 @@
+define(
+"dojo/cldr/nls/zh-hk/gregorian", //begin v1.x content
+{
+ "dateFormatItem-yM": "yyyy/M",
+ "field-minute": "分鐘",
+ "eraNames": [
+ "西元前",
+ "西元"
+ ],
+ "field-weekday": "週天",
+ "dateFormatItem-MMdd": "MM/dd",
+ "field-day-relative+-3": "大前天",
+ "months-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "dateTimeFormat-short": "{1} {0}",
+ "field-era": "年代",
+ "field-hour": "小時",
+ "dateTimeFormat-medium": "{1} {0}",
+ "quarters-standAlone-abbr": [
+ "第1季",
+ "第2季",
+ "第3季",
+ "第4季"
+ ],
+ "timeFormat-full": "zzzzah時mm分ss秒",
+ "dateFormatItem-Ed": "d日(E)",
+ "dateFormatItem-yMMM": "y年M月",
+ "eraAbbr": [
+ "西元前",
+ "西元"
+ ],
+ "field-day-relative+2": "後天",
+ "field-day-relative+3": "大後天",
+ "dateFormat-long": "y年M月d日",
+ "timeFormat-medium": "ah:mm:ss",
+ "field-zone": "區域",
+ "dateFormat-medium": "yyyy/M/d",
+ "quarters-standAlone-wide": [
+ "第1季",
+ "第2季",
+ "第3季",
+ "第4季"
+ ],
+ "field-week": "週",
+ "timeFormat-long": "zah時mm分ss秒",
+ "dateFormatItem-H": "H時",
+ "quarters-format-abbr": [
+ "第1季",
+ "第2季",
+ "第3季",
+ "第4季"
+ ],
+ "field-second": "秒",
+ "dateFormatItem-MEd": "M/d(E)",
+ "dateFormat-short": "yy/M/d",
+ "dateFormatItem-yMMMEd": "y年M月d日EEE",
+ "dateFormat-full": "y年M月d日EEEE",
+ "dateFormatItem-Md": "M/d",
+ "dateFormatItem-yMEd": "yyyy/M/d(EEE)",
+ "quarters-format-wide": [
+ "第1季",
+ "第2季",
+ "第3季",
+ "第4季"
+ ],
+ "eraNarrow": [
+ "西元前",
+ "西元"
+ ],
+ "dateFormatItem-h": "ah時"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hk/number.js b/lib/dojo/cldr/nls/zh-hk/number.js
index 159717470..ede243a2b 100644
--- a/lib/dojo/cldr/nls/zh-hk/number.js
+++ b/lib/dojo/cldr/nls/zh-hk/number.js
@@ -1 +1,8 @@
-({"currencyFormat":"¤#,##0.00","decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/zh-hk/number",{"currencyFormat":"¤#,##0.00"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-hk/number.js.uncompressed.js b/lib/dojo/cldr/nls/zh-hk/number.js.uncompressed.js
new file mode 100644
index 000000000..bec7643df
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-hk/number.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dojo/cldr/nls/zh-hk/number", //begin v1.x content
+{
+ "currencyFormat": "¤#,##0.00"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-tw/currency.js b/lib/dojo/cldr/nls/zh-tw/currency.js
index 4622f4a29..583a96f04 100644
--- a/lib/dojo/cldr/nls/zh-tw/currency.js
+++ b/lib/dojo/cldr/nls/zh-tw/currency.js
@@ -1 +1,8 @@
-({"USD_symbol":"$","EUR_displayName":"歐元","HKD_displayName":"港幣","CAD_displayName":"加幣","JPY_displayName":"日圓","GBP_displayName":"英鎊","AUD_displayName":"澳幣","CNY_displayName":"人民幣","CHF_displayName":"瑞士法郎","USD_displayName":"美元","CNY_symbol":"¥","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/zh-tw/currency",{"USD_symbol":"$","EUR_displayName":"歐元","HKD_displayName":"港幣","CAD_displayName":"加幣","JPY_displayName":"日圓","GBP_displayName":"英鎊","AUD_displayName":"澳幣","CNY_displayName":"人民幣"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-tw/currency.js.uncompressed.js b/lib/dojo/cldr/nls/zh-tw/currency.js.uncompressed.js
new file mode 100644
index 000000000..29173a91d
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-tw/currency.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dojo/cldr/nls/zh-tw/currency", //begin v1.x content
+{
+ "USD_symbol": "$",
+ "EUR_displayName": "歐元",
+ "HKD_displayName": "港幣",
+ "CAD_displayName": "加幣",
+ "JPY_displayName": "日圓",
+ "GBP_displayName": "英鎊",
+ "AUD_displayName": "澳幣",
+ "CNY_displayName": "人民幣"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-tw/gregorian.js b/lib/dojo/cldr/nls/zh-tw/gregorian.js
index be7dfc659..5bf9bd984 100644
--- a/lib/dojo/cldr/nls/zh-tw/gregorian.js
+++ b/lib/dojo/cldr/nls/zh-tw/gregorian.js
@@ -1 +1,8 @@
-({"quarters-standAlone-wide":["第1季","第2季","第3季","第4季"],"quarters-format-abbr":["第1季","第2季","第3季","第4季"],"dateFormat-medium":"yyyy/M/d","field-second":"秒","quarters-standAlone-abbr":["第1季","第2季","第3季","第4季"],"dateFormatItem-MMdd":"MM/dd","dateFormatItem-MEd":"M/d(E)","dateFormatItem-yMEd":"yyyy/M/d(EEE)","field-week":"週","dateFormatItem-H":"H時","eraNarrow":["西元前","西元"],"field-day-relative+-3":"大前天","timeFormat-full":"zzzzah時mm分ss秒","dateFormatItem-Md":"M/d","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"eraNames":["西元前","西元"],"field-minute":"分鐘","field-hour":"小時","field-day-relative+2":"後天","field-day-relative+3":"大後天","dateFormat-short":"yy/M/d","dateFormatItem-yMMMEd":"y年M月d日EEE","field-era":"年代","dateFormatItem-yM":"yyyy/M","timeFormat-long":"zah時mm分ss秒","eraAbbr":["西元前","西元"],"dateFormatItem-h":"ah時","dateFormatItem-yMMM":"y年M月","quarters-format-wide":["第1季","第2季","第3季","第4季"],"field-weekday":"週天","field-zone":"區域","dateFormatItem-Ed":"d日(E)","months-format-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-yQQQ":"y年QQQ","dateFormatItem-MMMEd":"MMMd日E","dayPeriods-format-wide-earlyMorning":"清晨","dayPeriods-format-wide-morning":"上午","dateFormat-long":"y年M月d日","months-format-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"下午","dateFormat-full":"y年M月d日EEEE","months-standAlone-wide":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"timeFormat-short":"ah:mm","field-year":"年","dateFormatItem-yQ":"y年QQQ","dateFormatItem-yyyyMMMM":"y年MMMM","months-format-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-yyQ":"yy年第Q季度","field-day-relative+0":"今天","field-day-relative+1":"明天","months-standAlone-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"dateFormatItem-M":"M月","days-standAlone-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-yyMMM":"yy年MMM","timeFormat-medium":"ah:mm:ss","dateFormatItem-Hm":"H:mm","field-dayperiod":"上午/下午","days-standAlone-abbr":["周日","周一","周二","周三","周四","周五","周六"],"dayPeriods-format-wide-night":"晚上","dateFormatItem-d":"d日","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"昨天","dateTimeFormat-long":"{1}{0}","field-day-relative+-2":"前天","dateFormatItem-MMMd":"MMMd日","dayPeriods-format-wide-midDay":"中午","dateTimeFormat-full":"{1}{0}","field-day":"日","days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-y":"y年","dateFormatItem-yyMM":"yy-MM","dateFormatItem-hm":"ah:mm","days-format-abbr":["周日","周一","周二","周三","周四","周五","周六"],"dateFormatItem-yMMMd":"y年MMMd日","days-format-narrow":["日","一","二","三","四","五","六"],"field-month":"月","days-standAlone-narrow":["日","一","二","三","四","五","六"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"上午","dateFormatItem-MMMMdd":"MMMMdd日","dayPeriods-format-wide-weeHours":"凌晨","dayPeriods-format-wide-afternoon":"下午","dateFormatItem-yyyyM":"y年M月","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"ah:mm:ss","dateFormatItem-yyyy":"y年","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/zh-tw/gregorian",{"quarters-standAlone-wide":["第1季","第2季","第3季","第4季"],"quarters-format-abbr":["第1季","第2季","第3季","第4季"],"dateFormat-medium":"yyyy/M/d","field-second":"秒","quarters-standAlone-abbr":["第1季","第2季","第3季","第4季"],"dateFormatItem-MMdd":"MM/dd","dateFormatItem-MEd":"M/d(E)","dateFormatItem-yMEd":"yyyy/M/d(EEE)","field-week":"週","dateFormatItem-H":"H時","eraNarrow":["西元前","西元"],"field-day-relative+-3":"大前天","timeFormat-full":"zzzzah時mm分ss秒","dateFormatItem-Md":"M/d","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"eraNames":["西元前","西元"],"field-minute":"分鐘","field-hour":"小時","field-day-relative+2":"後天","field-day-relative+3":"大後天","dateFormat-short":"yy/M/d","dateFormatItem-yMMMEd":"y年M月d日EEE","field-era":"年代","dateFormatItem-yM":"yyyy/M","timeFormat-long":"zah時mm分ss秒","eraAbbr":["西元前","西元"],"dateFormatItem-h":"ah時","dateFormatItem-yMMM":"y年M月","quarters-format-wide":["第1季","第2季","第3季","第4季"],"field-weekday":"週天","field-zone":"區域","dateFormatItem-Ed":"d日(E)"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh-tw/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/zh-tw/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..71336e508
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh-tw/gregorian.js.uncompressed.js
@@ -0,0 +1,80 @@
+define(
+"dojo/cldr/nls/zh-tw/gregorian", //begin v1.x content
+{
+ "quarters-standAlone-wide": [
+ "第1季",
+ "第2季",
+ "第3季",
+ "第4季"
+ ],
+ "quarters-format-abbr": [
+ "第1季",
+ "第2季",
+ "第3季",
+ "第4季"
+ ],
+ "dateFormat-medium": "yyyy/M/d",
+ "field-second": "秒",
+ "quarters-standAlone-abbr": [
+ "第1季",
+ "第2季",
+ "第3季",
+ "第4季"
+ ],
+ "dateFormatItem-MMdd": "MM/dd",
+ "dateFormatItem-MEd": "M/d(E)",
+ "dateFormatItem-yMEd": "yyyy/M/d(EEE)",
+ "field-week": "週",
+ "dateFormatItem-H": "H時",
+ "eraNarrow": [
+ "西元前",
+ "西元"
+ ],
+ "field-day-relative+-3": "大前天",
+ "timeFormat-full": "zzzzah時mm分ss秒",
+ "dateFormatItem-Md": "M/d",
+ "months-standAlone-narrow": [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12"
+ ],
+ "eraNames": [
+ "西元前",
+ "西元"
+ ],
+ "field-minute": "分鐘",
+ "field-hour": "小時",
+ "field-day-relative+2": "後天",
+ "field-day-relative+3": "大後天",
+ "dateFormat-short": "yy/M/d",
+ "dateFormatItem-yMMMEd": "y年M月d日EEE",
+ "field-era": "年代",
+ "dateFormatItem-yM": "yyyy/M",
+ "timeFormat-long": "zah時mm分ss秒",
+ "eraAbbr": [
+ "西元前",
+ "西元"
+ ],
+ "dateFormatItem-h": "ah時",
+ "dateFormatItem-yMMM": "y年M月",
+ "quarters-format-wide": [
+ "第1季",
+ "第2季",
+ "第3季",
+ "第4季"
+ ],
+ "field-weekday": "週天",
+ "field-zone": "區域",
+ "dateFormatItem-Ed": "d日(E)"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh/currency.js b/lib/dojo/cldr/nls/zh/currency.js
index 960d5e585..c0a50f7da 100644
--- a/lib/dojo/cldr/nls/zh/currency.js
+++ b/lib/dojo/cldr/nls/zh/currency.js
@@ -1 +1,8 @@
-({"HKD_displayName":"港元","CHF_displayName":"瑞士法郎","CAD_displayName":"加拿大元","CNY_displayName":"人民币","AUD_displayName":"澳大利亚元","JPY_displayName":"日元","USD_displayName":"美元","CNY_symbol":"¥","GBP_displayName":"英镑","EUR_displayName":"欧元","USD_symbol":"US$","CAD_symbol":"CA$","GBP_symbol":"£","HKD_symbol":"HK$","JPY_symbol":"JP¥","AUD_symbol":"AU$","EUR_symbol":"€"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/zh/currency",{"HKD_displayName":"港元","CHF_displayName":"瑞士法郎","CAD_displayName":"加拿大元","CNY_displayName":"人民币","AUD_displayName":"澳大利亚元","JPY_displayName":"日元","USD_displayName":"美元","CNY_symbol":"¥","GBP_displayName":"英镑","EUR_displayName":"欧元"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh/currency.js.uncompressed.js b/lib/dojo/cldr/nls/zh/currency.js.uncompressed.js
new file mode 100644
index 000000000..d005656f2
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh/currency.js.uncompressed.js
@@ -0,0 +1,16 @@
+define(
+"dojo/cldr/nls/zh/currency", //begin v1.x content
+{
+ "HKD_displayName": "港元",
+ "CHF_displayName": "瑞士法郎",
+ "CAD_displayName": "加拿大元",
+ "CNY_displayName": "人民币",
+ "AUD_displayName": "澳大利亚元",
+ "JPY_displayName": "日元",
+ "USD_displayName": "美元",
+ "CNY_symbol": "¥",
+ "GBP_displayName": "英镑",
+ "EUR_displayName": "欧元"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh/gregorian.js b/lib/dojo/cldr/nls/zh/gregorian.js
index 9509b4364..efeedefe1 100644
--- a/lib/dojo/cldr/nls/zh/gregorian.js
+++ b/lib/dojo/cldr/nls/zh/gregorian.js
@@ -1 +1,8 @@
-({"months-format-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"field-weekday":"周天","dateFormatItem-yQQQ":"y年QQQ","dateFormatItem-yMEd":"y年M月d日,E","dateFormatItem-MMMEd":"MMMd日E","eraNarrow":["公元前","公元"],"dayPeriods-format-wide-earlyMorning":"清晨","dayPeriods-format-wide-morning":"上午","dateFormat-long":"y年M月d日","months-format-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"下午","dateFormat-full":"y年M月d日EEEE","dateFormatItem-Md":"M-d","field-era":"时期","dateFormatItem-yM":"yyyy-M","months-standAlone-wide":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"timeFormat-short":"ah:mm","quarters-format-wide":["第1季度","第2季度","第3季度","第4季度"],"timeFormat-long":"zah时mm分ss秒","field-year":"年","dateFormatItem-yMMM":"y年MMM","dateFormatItem-yQ":"y年QQQ","dateFormatItem-yyyyMMMM":"y年MMMM","field-hour":"小时","dateFormatItem-MMdd":"MM-dd","months-format-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-yyQ":"yy年第Q季度","timeFormat-full":"zzzzah时mm分ss秒","field-day-relative+0":"今天","field-day-relative+1":"明天","field-day-relative+2":"后天","dateFormatItem-H":"H时","months-standAlone-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"quarters-format-abbr":["1季","2季","3季","4季"],"quarters-standAlone-wide":["第1季度","第2季度","第3季度","第4季度"],"dateFormatItem-M":"M月","days-standAlone-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-yyMMM":"yy年MMM","timeFormat-medium":"ah:mm:ss","dateFormatItem-Hm":"H:mm","quarters-standAlone-abbr":["1季","2季","3季","4季"],"eraAbbr":["公元前","公元"],"field-minute":"分钟","field-dayperiod":"上午/下午","days-standAlone-abbr":["周日","周一","周二","周三","周四","周五","周六"],"dayPeriods-format-wide-night":"晚上","dateFormatItem-d":"d日","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"昨天","dateFormatItem-h":"ah时","dateTimeFormat-long":"{1}{0}","field-day-relative+-2":"前天","dateFormatItem-MMMd":"MMMd日","dayPeriods-format-wide-midDay":"中午","dateFormatItem-MEd":"M-dE","dateTimeFormat-full":"{1}{0}","field-day":"日","days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"field-zone":"区域","dateFormatItem-y":"y年","months-standAlone-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-yyMM":"yy-MM","dateFormatItem-hm":"ah:mm","days-format-abbr":["周日","周一","周二","周三","周四","周五","周六"],"dateFormatItem-yMMMd":"y年MMMd日","eraNames":["公元前","公元"],"days-format-narrow":["日","一","二","三","四","五","六"],"field-month":"月","days-standAlone-narrow":["日","一","二","三","四","五","六"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"上午","dateFormatItem-MMMMdd":"MMMMdd日","dayPeriods-format-wide-weeHours":"凌晨","dateFormat-short":"yy-M-d","dayPeriods-format-wide-afternoon":"下午","field-second":"秒钟","dateFormatItem-yMMMEd":"y年MMMd日EEE","dateFormatItem-Ed":"d日E","field-week":"周","dateFormat-medium":"yyyy-M-d","dateFormatItem-yyyyM":"y年M月","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"ah:mm:ss","dateFormatItem-yyyy":"y年","quarters-standAlone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormatItem-EEEd":"d EEE","dayPeriods-format-abbr-am":"AM","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","quarters-format-narrow":["1","2","3","4"],"dayPeriods-format-narrow-am":"AM","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dayPeriods-format-abbr-pm":"PM","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dayPeriods-format-narrow-pm":"PM"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/zh/gregorian",{"months-format-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"field-weekday":"周天","dateFormatItem-yQQQ":"y年QQQ","dateFormatItem-yMEd":"y年M月d日,E","dateFormatItem-MMMEd":"MMMd日E","eraNarrow":["公元前","公元"],"dayPeriods-format-wide-earlyMorning":"清晨","dayPeriods-format-wide-morning":"上午","dateFormat-long":"y年M月d日","months-format-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateTimeFormat-medium":"{1} {0}","dayPeriods-format-wide-pm":"下午","dateFormat-full":"y年M月d日EEEE","dateFormatItem-Md":"M-d","field-era":"时期","dateFormatItem-yM":"yyyy-M","months-standAlone-wide":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"timeFormat-short":"ah:mm","quarters-format-wide":["第1季度","第2季度","第3季度","第4季度"],"timeFormat-long":"zah时mm分ss秒","field-year":"年","dateFormatItem-yMMM":"y年MMM","dateFormatItem-yQ":"y年QQQ","dateFormatItem-yyyyMMMM":"y年MMMM","field-hour":"小时","dateFormatItem-MMdd":"MM-dd","months-format-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-yyQ":"yy年第Q季度","timeFormat-full":"zzzzah时mm分ss秒","field-day-relative+0":"今天","field-day-relative+1":"明天","field-day-relative+2":"后天","dateFormatItem-H":"H时","months-standAlone-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"quarters-format-abbr":["1季","2季","3季","4季"],"quarters-standAlone-wide":["第1季度","第2季度","第3季度","第4季度"],"dateFormatItem-M":"M月","days-standAlone-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"dateFormatItem-yyMMM":"yy年MMM","timeFormat-medium":"ah:mm:ss","dateFormatItem-Hm":"H:mm","quarters-standAlone-abbr":["1季","2季","3季","4季"],"eraAbbr":["公元前","公元"],"field-minute":"分钟","field-dayperiod":"上午/下午","days-standAlone-abbr":["周日","周一","周二","周三","周四","周五","周六"],"dayPeriods-format-wide-night":"晚上","dateFormatItem-d":"d日","dateFormatItem-ms":"mm:ss","field-day-relative+-1":"昨天","dateFormatItem-h":"ah时","dateTimeFormat-long":"{1}{0}","field-day-relative+-2":"前天","dateFormatItem-MMMd":"MMMd日","dayPeriods-format-wide-midDay":"中午","dateFormatItem-MEd":"M-dE","dateTimeFormat-full":"{1}{0}","field-day":"日","days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"field-zone":"区域","dateFormatItem-y":"y年","months-standAlone-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-yyMM":"yy-MM","dateFormatItem-hm":"ah:mm","days-format-abbr":["周日","周一","周二","周三","周四","周五","周六"],"dateFormatItem-yMMMd":"y年MMMd日","eraNames":["公元前","公元"],"days-format-narrow":["日","一","二","三","四","五","六"],"field-month":"月","days-standAlone-narrow":["日","一","二","三","四","五","六"],"dateFormatItem-MMM":"LLL","dayPeriods-format-wide-am":"上午","dateFormatItem-MMMMdd":"MMMMdd日","dayPeriods-format-wide-weeHours":"凌晨","dateFormat-short":"yy-M-d","dayPeriods-format-wide-afternoon":"下午","field-second":"秒钟","dateFormatItem-yMMMEd":"y年MMMd日EEE","dateFormatItem-Ed":"d日E","field-week":"周","dateFormat-medium":"yyyy-M-d","dateFormatItem-yyyyM":"y年M月","dateTimeFormat-short":"{1} {0}","dateFormatItem-Hms":"H:mm:ss","dateFormatItem-hms":"ah:mm:ss","dateFormatItem-yyyy":"y年"}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh/gregorian.js.uncompressed.js b/lib/dojo/cldr/nls/zh/gregorian.js.uncompressed.js
new file mode 100644
index 000000000..ff2229a56
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh/gregorian.js.uncompressed.js
@@ -0,0 +1,247 @@
+define(
+"dojo/cldr/nls/zh/gregorian", //begin v1.x content
+{
+ "months-format-narrow": [
+ "1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月"
+ ],
+ "field-weekday": "周天",
+ "dateFormatItem-yQQQ": "y年QQQ",
+ "dateFormatItem-yMEd": "y年M月d日,E",
+ "dateFormatItem-MMMEd": "MMMd日E",
+ "eraNarrow": [
+ "公元前",
+ "公元"
+ ],
+ "dayPeriods-format-wide-earlyMorning": "清晨",
+ "dayPeriods-format-wide-morning": "上午",
+ "dateFormat-long": "y年M月d日",
+ "months-format-wide": [
+ "1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月"
+ ],
+ "dateTimeFormat-medium": "{1} {0}",
+ "dayPeriods-format-wide-pm": "下午",
+ "dateFormat-full": "y年M月d日EEEE",
+ "dateFormatItem-Md": "M-d",
+ "field-era": "时期",
+ "dateFormatItem-yM": "yyyy-M",
+ "months-standAlone-wide": [
+ "一月",
+ "二月",
+ "三月",
+ "四月",
+ "五月",
+ "六月",
+ "七月",
+ "八月",
+ "九月",
+ "十月",
+ "十一月",
+ "十二月"
+ ],
+ "timeFormat-short": "ah:mm",
+ "quarters-format-wide": [
+ "第1季度",
+ "第2季度",
+ "第3季度",
+ "第4季度"
+ ],
+ "timeFormat-long": "zah时mm分ss秒",
+ "field-year": "年",
+ "dateFormatItem-yMMM": "y年MMM",
+ "dateFormatItem-yQ": "y年QQQ",
+ "dateFormatItem-yyyyMMMM": "y年MMMM",
+ "field-hour": "小时",
+ "dateFormatItem-MMdd": "MM-dd",
+ "months-format-abbr": [
+ "1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月"
+ ],
+ "dateFormatItem-yyQ": "yy年第Q季度",
+ "timeFormat-full": "zzzzah时mm分ss秒",
+ "field-day-relative+0": "今天",
+ "field-day-relative+1": "明天",
+ "field-day-relative+2": "后天",
+ "dateFormatItem-H": "H时",
+ "months-standAlone-abbr": [
+ "一月",
+ "二月",
+ "三月",
+ "四月",
+ "五月",
+ "六月",
+ "七月",
+ "八月",
+ "九月",
+ "十月",
+ "十一月",
+ "十二月"
+ ],
+ "quarters-format-abbr": [
+ "1季",
+ "2季",
+ "3季",
+ "4季"
+ ],
+ "quarters-standAlone-wide": [
+ "第1季度",
+ "第2季度",
+ "第3季度",
+ "第4季度"
+ ],
+ "dateFormatItem-M": "M月",
+ "days-standAlone-wide": [
+ "星期日",
+ "星期一",
+ "星期二",
+ "星期三",
+ "星期四",
+ "星期五",
+ "星期六"
+ ],
+ "dateFormatItem-yyMMM": "yy年MMM",
+ "timeFormat-medium": "ah:mm:ss",
+ "dateFormatItem-Hm": "H:mm",
+ "quarters-standAlone-abbr": [
+ "1季",
+ "2季",
+ "3季",
+ "4季"
+ ],
+ "eraAbbr": [
+ "公元前",
+ "公元"
+ ],
+ "field-minute": "分钟",
+ "field-dayperiod": "上午/下午",
+ "days-standAlone-abbr": [
+ "周日",
+ "周一",
+ "周二",
+ "周三",
+ "周四",
+ "周五",
+ "周六"
+ ],
+ "dayPeriods-format-wide-night": "晚上",
+ "dateFormatItem-d": "d日",
+ "dateFormatItem-ms": "mm:ss",
+ "field-day-relative+-1": "昨天",
+ "dateFormatItem-h": "ah时",
+ "dateTimeFormat-long": "{1}{0}",
+ "field-day-relative+-2": "前天",
+ "dateFormatItem-MMMd": "MMMd日",
+ "dayPeriods-format-wide-midDay": "中午",
+ "dateFormatItem-MEd": "M-dE",
+ "dateTimeFormat-full": "{1}{0}",
+ "field-day": "日",
+ "days-format-wide": [
+ "星期日",
+ "星期一",
+ "星期二",
+ "星期三",
+ "星期四",
+ "星期五",
+ "星期六"
+ ],
+ "field-zone": "区域",
+ "dateFormatItem-y": "y年",
+ "months-standAlone-narrow": [
+ "1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月"
+ ],
+ "dateFormatItem-yyMM": "yy-MM",
+ "dateFormatItem-hm": "ah:mm",
+ "days-format-abbr": [
+ "周日",
+ "周一",
+ "周二",
+ "周三",
+ "周四",
+ "周五",
+ "周六"
+ ],
+ "dateFormatItem-yMMMd": "y年MMMd日",
+ "eraNames": [
+ "公元前",
+ "公元"
+ ],
+ "days-format-narrow": [
+ "日",
+ "一",
+ "二",
+ "三",
+ "四",
+ "五",
+ "六"
+ ],
+ "field-month": "月",
+ "days-standAlone-narrow": [
+ "日",
+ "一",
+ "二",
+ "三",
+ "四",
+ "五",
+ "六"
+ ],
+ "dateFormatItem-MMM": "LLL",
+ "dayPeriods-format-wide-am": "上午",
+ "dateFormatItem-MMMMdd": "MMMMdd日",
+ "dayPeriods-format-wide-weeHours": "凌晨",
+ "dateFormat-short": "yy-M-d",
+ "dayPeriods-format-wide-afternoon": "下午",
+ "field-second": "秒钟",
+ "dateFormatItem-yMMMEd": "y年MMMd日EEE",
+ "dateFormatItem-Ed": "d日E",
+ "field-week": "周",
+ "dateFormat-medium": "yyyy-M-d",
+ "dateFormatItem-yyyyM": "y年M月",
+ "dateTimeFormat-short": "{1} {0}",
+ "dateFormatItem-Hms": "H:mm:ss",
+ "dateFormatItem-hms": "ah:mm:ss",
+ "dateFormatItem-yyyy": "y年"
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh/number.js b/lib/dojo/cldr/nls/zh/number.js
index dbde35c64..b14f7bdcd 100644
--- a/lib/dojo/cldr/nls/zh/number.js
+++ b/lib/dojo/cldr/nls/zh/number.js
@@ -1 +1,8 @@
-({"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/cldr/nls/zh/number",{"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":"."}); \ No newline at end of file
diff --git a/lib/dojo/cldr/nls/zh/number.js.uncompressed.js b/lib/dojo/cldr/nls/zh/number.js.uncompressed.js
new file mode 100644
index 000000000..45d00ac20
--- /dev/null
+++ b/lib/dojo/cldr/nls/zh/number.js.uncompressed.js
@@ -0,0 +1,12 @@
+define(
+"dojo/cldr/nls/zh/number", //begin v1.x content
+{
+ "decimalFormat": "#,##0.###",
+ "group": ",",
+ "scientificFormat": "#E0",
+ "percentFormat": "#,##0%",
+ "currencyFormat": "¤#,##0.00",
+ "decimal": "."
+}
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/cldr/supplemental.js b/lib/dojo/cldr/supplemental.js
index 4ceef4f78..40519d09b 100644
--- a/lib/dojo/cldr/supplemental.js
+++ b/lib/dojo/cldr/supplemental.js
@@ -4,79 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.cldr.supplemental"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.cldr.supplemental"] = true;
-dojo.provide("dojo.cldr.supplemental");
-dojo.require("dojo.i18n");
-
-dojo.getObject("cldr.supplemental", true, dojo);
-
-dojo.cldr.supplemental.getFirstDayOfWeek = function(/*String?*/locale){
-// summary: Returns a zero-based index for first day of the week
-// description:
-// Returns a zero-based index for first day of the week, as used by the local (Gregorian) calendar.
-// e.g. Sunday (returns 0), or Monday (returns 1)
-
- // from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/weekData/firstDay
- var firstDay = {/*default is 1=Monday*/
- mv:5,
- ae:6,af:6,bh:6,dj:6,dz:6,eg:6,er:6,et:6,iq:6,ir:6,jo:6,ke:6,kw:6,
- ly:6,ma:6,om:6,qa:6,sa:6,sd:6,so:6,sy:6,tn:6,ye:6,
- ar:0,as:0,az:0,bw:0,ca:0,cn:0,fo:0,ge:0,gl:0,gu:0,hk:0,
- il:0,'in':0,jm:0,jp:0,kg:0,kr:0,la:0,mh:0,mn:0,mo:0,mp:0,
- mt:0,nz:0,ph:0,pk:0,sg:0,th:0,tt:0,tw:0,um:0,us:0,uz:0,
- vi:0,zw:0
-// variant. do not use? gb:0,
- };
-
- var country = dojo.cldr.supplemental._region(locale);
- var dow = firstDay[country];
- return (dow === undefined) ? 1 : dow; /*Number*/
-};
-
-dojo.cldr.supplemental._region = function(/*String?*/locale){
- locale = dojo.i18n.normalizeLocale(locale);
- var tags = locale.split('-');
- var region = tags[1];
- if(!region){
- // IE often gives language only (#2269)
- // Arbitrary mappings of language-only locales to a country:
- region = {de:"de", en:"us", es:"es", fi:"fi", fr:"fr", he:"il", hu:"hu", it:"it",
- ja:"jp", ko:"kr", nl:"nl", pt:"br", sv:"se", zh:"cn"}[tags[0]];
- }else if(region.length == 4){
- // The ISO 3166 country code is usually in the second position, unless a
- // 4-letter script is given. See http://www.ietf.org/rfc/rfc4646.txt
- region = tags[2];
- }
- return region;
-};
-
-dojo.cldr.supplemental.getWeekend = function(/*String?*/locale){
-// summary: Returns a hash containing the start and end days of the weekend
-// description:
-// Returns a hash containing the start and end days of the weekend according to local custom using locale,
-// or by default in the user's locale.
-// e.g. {start:6, end:0}
-
- // from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/weekData/weekend{Start,End}
- var weekendStart = {/*default is 6=Saturday*/
- 'in':0,
- af:4,dz:4,ir:4,om:4,sa:4,ye:4,
- ae:5,bh:5,eg:5,il:5,iq:5,jo:5,kw:5,ly:5,ma:5,qa:5,sd:5,sy:5,tn:5
- };
-
- var weekendEnd = {/*default is 0=Sunday*/
- af:5,dz:5,ir:5,om:5,sa:5,ye:5,
- ae:6,bh:5,eg:6,il:6,iq:6,jo:6,kw:6,ly:6,ma:6,qa:6,sd:6,sy:6,tn:6
- };
-
- var country = dojo.cldr.supplemental._region(locale);
- var start = weekendStart[country];
- var end = weekendEnd[country];
- if(start === undefined){start=6;}
- if(end === undefined){end=0;}
- return {start:start, end:end}; /*Object {start,end}*/
-};
-
-}
+//>>built
+define("dojo/cldr/supplemental",["../_base/kernel","../_base/lang","../i18n"],function(_1,_2){_2.getObject("cldr.supplemental",true,_1);_1.cldr.supplemental.getFirstDayOfWeek=function(_3){var _4={mv:5,ae:6,af:6,bh:6,dj:6,dz:6,eg:6,er:6,et:6,iq:6,ir:6,jo:6,ke:6,kw:6,ly:6,ma:6,om:6,qa:6,sa:6,sd:6,so:6,sy:6,tn:6,ye:6,ar:0,as:0,az:0,bw:0,ca:0,cn:0,fo:0,ge:0,gl:0,gu:0,hk:0,il:0,"in":0,jm:0,jp:0,kg:0,kr:0,la:0,mh:0,mn:0,mo:0,mp:0,mt:0,nz:0,ph:0,pk:0,sg:0,th:0,tt:0,tw:0,um:0,us:0,uz:0,vi:0,zw:0};var _5=_1.cldr.supplemental._region(_3);var _6=_4[_5];return (_6===undefined)?1:_6;};_1.cldr.supplemental._region=function(_7){_7=_1.i18n.normalizeLocale(_7);var _8=_7.split("-");var _9=_8[1];if(!_9){_9={de:"de",en:"us",es:"es",fi:"fi",fr:"fr",he:"il",hu:"hu",it:"it",ja:"jp",ko:"kr",nl:"nl",pt:"br",sv:"se",zh:"cn"}[_8[0]];}else{if(_9.length==4){_9=_8[2];}}return _9;};_1.cldr.supplemental.getWeekend=function(_a){var _b={"in":0,af:4,dz:4,ir:4,om:4,sa:4,ye:4,ae:5,bh:5,eg:5,il:5,iq:5,jo:5,kw:5,ly:5,ma:5,qa:5,sd:5,sy:5,tn:5};var _c={af:5,dz:5,ir:5,om:5,sa:5,ye:5,ae:6,bh:5,eg:6,il:6,iq:6,jo:6,kw:6,ly:6,ma:6,qa:6,sd:6,sy:6,tn:6};var _d=_1.cldr.supplemental._region(_a);var _e=_b[_d];var _f=_c[_d];if(_e===undefined){_e=6;}if(_f===undefined){_f=0;}return {start:_e,end:_f};};return _1.cldr.supplemental;}); \ No newline at end of file
diff --git a/lib/dojo/cldr/supplemental.js.uncompressed.js b/lib/dojo/cldr/supplemental.js.uncompressed.js
new file mode 100644
index 000000000..ee6449425
--- /dev/null
+++ b/lib/dojo/cldr/supplemental.js.uncompressed.js
@@ -0,0 +1,77 @@
+define("dojo/cldr/supplemental", ["../_base/kernel", "../_base/lang", "../i18n"], function(dojo, lang) {
+ // module:
+ // dojo/cldr/supplemental
+ // summary:
+ // TODOC
+
+lang.getObject("cldr.supplemental", true, dojo);
+
+dojo.cldr.supplemental.getFirstDayOfWeek = function(/*String?*/locale){
+// summary: Returns a zero-based index for first day of the week
+// description:
+// Returns a zero-based index for first day of the week, as used by the local (Gregorian) calendar.
+// e.g. Sunday (returns 0), or Monday (returns 1)
+
+ // from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/weekData/firstDay
+ var firstDay = {/*default is 1=Monday*/
+ mv:5,
+ ae:6,af:6,bh:6,dj:6,dz:6,eg:6,er:6,et:6,iq:6,ir:6,jo:6,ke:6,kw:6,
+ ly:6,ma:6,om:6,qa:6,sa:6,sd:6,so:6,sy:6,tn:6,ye:6,
+ ar:0,as:0,az:0,bw:0,ca:0,cn:0,fo:0,ge:0,gl:0,gu:0,hk:0,
+ il:0,'in':0,jm:0,jp:0,kg:0,kr:0,la:0,mh:0,mn:0,mo:0,mp:0,
+ mt:0,nz:0,ph:0,pk:0,sg:0,th:0,tt:0,tw:0,um:0,us:0,uz:0,
+ vi:0,zw:0
+// variant. do not use? gb:0,
+ };
+
+ var country = dojo.cldr.supplemental._region(locale);
+ var dow = firstDay[country];
+ return (dow === undefined) ? 1 : dow; /*Number*/
+};
+
+dojo.cldr.supplemental._region = function(/*String?*/locale){
+ locale = dojo.i18n.normalizeLocale(locale);
+ var tags = locale.split('-');
+ var region = tags[1];
+ if(!region){
+ // IE often gives language only (#2269)
+ // Arbitrary mappings of language-only locales to a country:
+ region = {de:"de", en:"us", es:"es", fi:"fi", fr:"fr", he:"il", hu:"hu", it:"it",
+ ja:"jp", ko:"kr", nl:"nl", pt:"br", sv:"se", zh:"cn"}[tags[0]];
+ }else if(region.length == 4){
+ // The ISO 3166 country code is usually in the second position, unless a
+ // 4-letter script is given. See http://www.ietf.org/rfc/rfc4646.txt
+ region = tags[2];
+ }
+ return region;
+};
+
+dojo.cldr.supplemental.getWeekend = function(/*String?*/locale){
+// summary: Returns a hash containing the start and end days of the weekend
+// description:
+// Returns a hash containing the start and end days of the weekend according to local custom using locale,
+// or by default in the user's locale.
+// e.g. {start:6, end:0}
+
+ // from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/weekData/weekend{Start,End}
+ var weekendStart = {/*default is 6=Saturday*/
+ 'in':0,
+ af:4,dz:4,ir:4,om:4,sa:4,ye:4,
+ ae:5,bh:5,eg:5,il:5,iq:5,jo:5,kw:5,ly:5,ma:5,qa:5,sd:5,sy:5,tn:5
+ };
+
+ var weekendEnd = {/*default is 0=Sunday*/
+ af:5,dz:5,ir:5,om:5,sa:5,ye:5,
+ ae:6,bh:5,eg:6,il:6,iq:6,jo:6,kw:6,ly:6,ma:6,qa:6,sd:6,sy:6,tn:6
+ };
+
+ var country = dojo.cldr.supplemental._region(locale);
+ var start = weekendStart[country];
+ var end = weekendEnd[country];
+ if(start === undefined){start=6;}
+ if(end === undefined){end=0;}
+ return {start:start, end:end}; /*Object {start,end}*/
+};
+
+return dojo.cldr.supplemental;
+});
diff --git a/lib/dojo/colors.js b/lib/dojo/colors.js
index dfb8f89e6..38d572105 100644
--- a/lib/dojo/colors.js
+++ b/lib/dojo/colors.js
@@ -4,235 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.colors"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.colors"] = true;
-dojo.provide("dojo.colors");
-
-dojo.getObject("colors", true, dojo);
-
-//TODO: this module appears to break naming conventions
-
-/*=====
-dojo.colors = {
- // summary: Color utilities
-}
-=====*/
-
-(function(){
- // this is a standard conversion prescribed by the CSS3 Color Module
- var hue2rgb = function(m1, m2, h){
- if(h < 0){ ++h; }
- if(h > 1){ --h; }
- var h6 = 6 * h;
- if(h6 < 1){ return m1 + (m2 - m1) * h6; }
- if(2 * h < 1){ return m2; }
- if(3 * h < 2){ return m1 + (m2 - m1) * (2 / 3 - h) * 6; }
- return m1;
- };
-
- dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){
- // summary:
- // get rgb(a) array from css-style color declarations
- // description:
- // this function can handle all 4 CSS3 Color Module formats: rgb,
- // rgba, hsl, hsla, including rgb(a) with percentage values.
- var m = color.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);
- if(m){
- var c = m[2].split(/\s*,\s*/), l = c.length, t = m[1], a;
- if((t == "rgb" && l == 3) || (t == "rgba" && l == 4)){
- var r = c[0];
- if(r.charAt(r.length - 1) == "%"){
- // 3 rgb percentage values
- a = dojo.map(c, function(x){
- return parseFloat(x) * 2.56;
- });
- if(l == 4){ a[3] = c[3]; }
- return dojo.colorFromArray(a, obj); // dojo.Color
- }
- return dojo.colorFromArray(c, obj); // dojo.Color
- }
- if((t == "hsl" && l == 3) || (t == "hsla" && l == 4)){
- // normalize hsl values
- var H = ((parseFloat(c[0]) % 360) + 360) % 360 / 360,
- S = parseFloat(c[1]) / 100,
- L = parseFloat(c[2]) / 100,
- // calculate rgb according to the algorithm
- // recommended by the CSS3 Color Module
- m2 = L <= 0.5 ? L * (S + 1) : L + S - L * S,
- m1 = 2 * L - m2;
- a = [
- hue2rgb(m1, m2, H + 1 / 3) * 256,
- hue2rgb(m1, m2, H) * 256,
- hue2rgb(m1, m2, H - 1 / 3) * 256,
- 1
- ];
- if(l == 4){ a[3] = c[3]; }
- return dojo.colorFromArray(a, obj); // dojo.Color
- }
- }
- return null; // dojo.Color
- };
-
- var confine = function(c, low, high){
- // summary:
- // sanitize a color component by making sure it is a number,
- // and clamping it to valid values
- c = Number(c);
- return isNaN(c) ? high : c < low ? low : c > high ? high : c; // Number
- };
-
- dojo.Color.prototype.sanitize = function(){
- // summary: makes sure that the object has correct attributes
- var t = this;
- t.r = Math.round(confine(t.r, 0, 255));
- t.g = Math.round(confine(t.g, 0, 255));
- t.b = Math.round(confine(t.b, 0, 255));
- t.a = confine(t.a, 0, 1);
- return this; // dojo.Color
- };
-})();
-
-
-dojo.colors.makeGrey = function(/*Number*/ g, /*Number?*/ a){
- // summary: creates a greyscale color with an optional alpha
- return dojo.colorFromArray([g, g, g, a]);
-};
-
-// mixin all CSS3 named colors not already in _base, along with SVG 1.0 variant spellings
-dojo.mixin(dojo.Color.named, {
- aliceblue: [240,248,255],
- antiquewhite: [250,235,215],
- aquamarine: [127,255,212],
- azure: [240,255,255],
- beige: [245,245,220],
- bisque: [255,228,196],
- blanchedalmond: [255,235,205],
- blueviolet: [138,43,226],
- brown: [165,42,42],
- burlywood: [222,184,135],
- cadetblue: [95,158,160],
- chartreuse: [127,255,0],
- chocolate: [210,105,30],
- coral: [255,127,80],
- cornflowerblue: [100,149,237],
- cornsilk: [255,248,220],
- crimson: [220,20,60],
- cyan: [0,255,255],
- darkblue: [0,0,139],
- darkcyan: [0,139,139],
- darkgoldenrod: [184,134,11],
- darkgray: [169,169,169],
- darkgreen: [0,100,0],
- darkgrey: [169,169,169],
- darkkhaki: [189,183,107],
- darkmagenta: [139,0,139],
- darkolivegreen: [85,107,47],
- darkorange: [255,140,0],
- darkorchid: [153,50,204],
- darkred: [139,0,0],
- darksalmon: [233,150,122],
- darkseagreen: [143,188,143],
- darkslateblue: [72,61,139],
- darkslategray: [47,79,79],
- darkslategrey: [47,79,79],
- darkturquoise: [0,206,209],
- darkviolet: [148,0,211],
- deeppink: [255,20,147],
- deepskyblue: [0,191,255],
- dimgray: [105,105,105],
- dimgrey: [105,105,105],
- dodgerblue: [30,144,255],
- firebrick: [178,34,34],
- floralwhite: [255,250,240],
- forestgreen: [34,139,34],
- gainsboro: [220,220,220],
- ghostwhite: [248,248,255],
- gold: [255,215,0],
- goldenrod: [218,165,32],
- greenyellow: [173,255,47],
- grey: [128,128,128],
- honeydew: [240,255,240],
- hotpink: [255,105,180],
- indianred: [205,92,92],
- indigo: [75,0,130],
- ivory: [255,255,240],
- khaki: [240,230,140],
- lavender: [230,230,250],
- lavenderblush: [255,240,245],
- lawngreen: [124,252,0],
- lemonchiffon: [255,250,205],
- lightblue: [173,216,230],
- lightcoral: [240,128,128],
- lightcyan: [224,255,255],
- lightgoldenrodyellow: [250,250,210],
- lightgray: [211,211,211],
- lightgreen: [144,238,144],
- lightgrey: [211,211,211],
- lightpink: [255,182,193],
- lightsalmon: [255,160,122],
- lightseagreen: [32,178,170],
- lightskyblue: [135,206,250],
- lightslategray: [119,136,153],
- lightslategrey: [119,136,153],
- lightsteelblue: [176,196,222],
- lightyellow: [255,255,224],
- limegreen: [50,205,50],
- linen: [250,240,230],
- magenta: [255,0,255],
- mediumaquamarine: [102,205,170],
- mediumblue: [0,0,205],
- mediumorchid: [186,85,211],
- mediumpurple: [147,112,219],
- mediumseagreen: [60,179,113],
- mediumslateblue: [123,104,238],
- mediumspringgreen: [0,250,154],
- mediumturquoise: [72,209,204],
- mediumvioletred: [199,21,133],
- midnightblue: [25,25,112],
- mintcream: [245,255,250],
- mistyrose: [255,228,225],
- moccasin: [255,228,181],
- navajowhite: [255,222,173],
- oldlace: [253,245,230],
- olivedrab: [107,142,35],
- orange: [255,165,0],
- orangered: [255,69,0],
- orchid: [218,112,214],
- palegoldenrod: [238,232,170],
- palegreen: [152,251,152],
- paleturquoise: [175,238,238],
- palevioletred: [219,112,147],
- papayawhip: [255,239,213],
- peachpuff: [255,218,185],
- peru: [205,133,63],
- pink: [255,192,203],
- plum: [221,160,221],
- powderblue: [176,224,230],
- rosybrown: [188,143,143],
- royalblue: [65,105,225],
- saddlebrown: [139,69,19],
- salmon: [250,128,114],
- sandybrown: [244,164,96],
- seagreen: [46,139,87],
- seashell: [255,245,238],
- sienna: [160,82,45],
- skyblue: [135,206,235],
- slateblue: [106,90,205],
- slategray: [112,128,144],
- slategrey: [112,128,144],
- snow: [255,250,250],
- springgreen: [0,255,127],
- steelblue: [70,130,180],
- tan: [210,180,140],
- thistle: [216,191,216],
- tomato: [255,99,71],
- transparent: [0, 0, 0, 0],
- turquoise: [64,224,208],
- violet: [238,130,238],
- wheat: [245,222,179],
- whitesmoke: [245,245,245],
- yellowgreen: [154,205,50]
-});
-
-}
+//>>built
+define("dojo/colors",["./_base/kernel","./_base/lang","./_base/Color","./_base/array"],function(_1,_2,_3,_4){var _5=_2.getObject("dojo.colors",true);var _6=function(m1,m2,h){if(h<0){++h;}if(h>1){--h;}var h6=6*h;if(h6<1){return m1+(m2-m1)*h6;}if(2*h<1){return m2;}if(3*h<2){return m1+(m2-m1)*(2/3-h)*6;}return m1;};_1.colorFromRgb=_3.fromRgb=function(_7,_8){var m=_7.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);if(m){var c=m[2].split(/\s*,\s*/),l=c.length,t=m[1],a;if((t=="rgb"&&l==3)||(t=="rgba"&&l==4)){var r=c[0];if(r.charAt(r.length-1)=="%"){a=_4.map(c,function(x){return parseFloat(x)*2.56;});if(l==4){a[3]=c[3];}return _3.fromArray(a,_8);}return _3.fromArray(c,_8);}if((t=="hsl"&&l==3)||(t=="hsla"&&l==4)){var H=((parseFloat(c[0])%360)+360)%360/360,S=parseFloat(c[1])/100,L=parseFloat(c[2])/100,m2=L<=0.5?L*(S+1):L+S-L*S,m1=2*L-m2;a=[_6(m1,m2,H+1/3)*256,_6(m1,m2,H)*256,_6(m1,m2,H-1/3)*256,1];if(l==4){a[3]=c[3];}return _3.fromArray(a,_8);}}return null;};var _9=function(c,_a,_b){c=Number(c);return isNaN(c)?_b:c<_a?_a:c>_b?_b:c;};_3.prototype.sanitize=function(){var t=this;t.r=Math.round(_9(t.r,0,255));t.g=Math.round(_9(t.g,0,255));t.b=Math.round(_9(t.b,0,255));t.a=_9(t.a,0,1);return this;};_5.makeGrey=_3.makeGrey=function(g,a){return _3.fromArray([g,g,g,a]);};_2.mixin(_3.named,{"aliceblue":[240,248,255],"antiquewhite":[250,235,215],"aquamarine":[127,255,212],"azure":[240,255,255],"beige":[245,245,220],"bisque":[255,228,196],"blanchedalmond":[255,235,205],"blueviolet":[138,43,226],"brown":[165,42,42],"burlywood":[222,184,135],"cadetblue":[95,158,160],"chartreuse":[127,255,0],"chocolate":[210,105,30],"coral":[255,127,80],"cornflowerblue":[100,149,237],"cornsilk":[255,248,220],"crimson":[220,20,60],"cyan":[0,255,255],"darkblue":[0,0,139],"darkcyan":[0,139,139],"darkgoldenrod":[184,134,11],"darkgray":[169,169,169],"darkgreen":[0,100,0],"darkgrey":[169,169,169],"darkkhaki":[189,183,107],"darkmagenta":[139,0,139],"darkolivegreen":[85,107,47],"darkorange":[255,140,0],"darkorchid":[153,50,204],"darkred":[139,0,0],"darksalmon":[233,150,122],"darkseagreen":[143,188,143],"darkslateblue":[72,61,139],"darkslategray":[47,79,79],"darkslategrey":[47,79,79],"darkturquoise":[0,206,209],"darkviolet":[148,0,211],"deeppink":[255,20,147],"deepskyblue":[0,191,255],"dimgray":[105,105,105],"dimgrey":[105,105,105],"dodgerblue":[30,144,255],"firebrick":[178,34,34],"floralwhite":[255,250,240],"forestgreen":[34,139,34],"gainsboro":[220,220,220],"ghostwhite":[248,248,255],"gold":[255,215,0],"goldenrod":[218,165,32],"greenyellow":[173,255,47],"grey":[128,128,128],"honeydew":[240,255,240],"hotpink":[255,105,180],"indianred":[205,92,92],"indigo":[75,0,130],"ivory":[255,255,240],"khaki":[240,230,140],"lavender":[230,230,250],"lavenderblush":[255,240,245],"lawngreen":[124,252,0],"lemonchiffon":[255,250,205],"lightblue":[173,216,230],"lightcoral":[240,128,128],"lightcyan":[224,255,255],"lightgoldenrodyellow":[250,250,210],"lightgray":[211,211,211],"lightgreen":[144,238,144],"lightgrey":[211,211,211],"lightpink":[255,182,193],"lightsalmon":[255,160,122],"lightseagreen":[32,178,170],"lightskyblue":[135,206,250],"lightslategray":[119,136,153],"lightslategrey":[119,136,153],"lightsteelblue":[176,196,222],"lightyellow":[255,255,224],"limegreen":[50,205,50],"linen":[250,240,230],"magenta":[255,0,255],"mediumaquamarine":[102,205,170],"mediumblue":[0,0,205],"mediumorchid":[186,85,211],"mediumpurple":[147,112,219],"mediumseagreen":[60,179,113],"mediumslateblue":[123,104,238],"mediumspringgreen":[0,250,154],"mediumturquoise":[72,209,204],"mediumvioletred":[199,21,133],"midnightblue":[25,25,112],"mintcream":[245,255,250],"mistyrose":[255,228,225],"moccasin":[255,228,181],"navajowhite":[255,222,173],"oldlace":[253,245,230],"olivedrab":[107,142,35],"orange":[255,165,0],"orangered":[255,69,0],"orchid":[218,112,214],"palegoldenrod":[238,232,170],"palegreen":[152,251,152],"paleturquoise":[175,238,238],"palevioletred":[219,112,147],"papayawhip":[255,239,213],"peachpuff":[255,218,185],"peru":[205,133,63],"pink":[255,192,203],"plum":[221,160,221],"powderblue":[176,224,230],"rosybrown":[188,143,143],"royalblue":[65,105,225],"saddlebrown":[139,69,19],"salmon":[250,128,114],"sandybrown":[244,164,96],"seagreen":[46,139,87],"seashell":[255,245,238],"sienna":[160,82,45],"skyblue":[135,206,235],"slateblue":[106,90,205],"slategray":[112,128,144],"slategrey":[112,128,144],"snow":[255,250,250],"springgreen":[0,255,127],"steelblue":[70,130,180],"tan":[210,180,140],"thistle":[216,191,216],"tomato":[255,99,71],"turquoise":[64,224,208],"violet":[238,130,238],"wheat":[245,222,179],"whitesmoke":[245,245,245],"yellowgreen":[154,205,50]});return _3;}); \ No newline at end of file
diff --git a/lib/dojo/colors.js.uncompressed.js b/lib/dojo/colors.js.uncompressed.js
new file mode 100644
index 000000000..a51e19acb
--- /dev/null
+++ b/lib/dojo/colors.js.uncompressed.js
@@ -0,0 +1,232 @@
+define("dojo/colors", ["./_base/kernel", "./_base/lang", "./_base/Color", "./_base/array"], function(dojo, lang, Color, ArrayUtil) {
+ // module:
+ // dojo/colors
+ // summary:
+ // TODOC
+
+ var ColorExt = lang.getObject("dojo.colors", true);
+
+//TODO: this module appears to break naming conventions
+
+/*=====
+ lang.mixin(dojo, {
+ colors: {
+ // summary: Color utilities, extending Base dojo.Color
+ }
+ });
+=====*/
+
+ // this is a standard conversion prescribed by the CSS3 Color Module
+ var hue2rgb = function(m1, m2, h){
+ if(h < 0){ ++h; }
+ if(h > 1){ --h; }
+ var h6 = 6 * h;
+ if(h6 < 1){ return m1 + (m2 - m1) * h6; }
+ if(2 * h < 1){ return m2; }
+ if(3 * h < 2){ return m1 + (m2 - m1) * (2 / 3 - h) * 6; }
+ return m1;
+ };
+ // Override base Color.fromRgb with the impl in this module
+ dojo.colorFromRgb = Color.fromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){
+ // summary:
+ // get rgb(a) array from css-style color declarations
+ // description:
+ // this function can handle all 4 CSS3 Color Module formats: rgb,
+ // rgba, hsl, hsla, including rgb(a) with percentage values.
+ var m = color.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);
+ if(m){
+ var c = m[2].split(/\s*,\s*/), l = c.length, t = m[1], a;
+ if((t == "rgb" && l == 3) || (t == "rgba" && l == 4)){
+ var r = c[0];
+ if(r.charAt(r.length - 1) == "%"){
+ // 3 rgb percentage values
+ a = ArrayUtil.map(c, function(x){
+ return parseFloat(x) * 2.56;
+ });
+ if(l == 4){ a[3] = c[3]; }
+ return Color.fromArray(a, obj); // dojo.Color
+ }
+ return Color.fromArray(c, obj); // dojo.Color
+ }
+ if((t == "hsl" && l == 3) || (t == "hsla" && l == 4)){
+ // normalize hsl values
+ var H = ((parseFloat(c[0]) % 360) + 360) % 360 / 360,
+ S = parseFloat(c[1]) / 100,
+ L = parseFloat(c[2]) / 100,
+ // calculate rgb according to the algorithm
+ // recommended by the CSS3 Color Module
+ m2 = L <= 0.5 ? L * (S + 1) : L + S - L * S,
+ m1 = 2 * L - m2;
+ a = [
+ hue2rgb(m1, m2, H + 1 / 3) * 256,
+ hue2rgb(m1, m2, H) * 256,
+ hue2rgb(m1, m2, H - 1 / 3) * 256,
+ 1
+ ];
+ if(l == 4){ a[3] = c[3]; }
+ return Color.fromArray(a, obj); // dojo.Color
+ }
+ }
+ return null; // dojo.Color
+ };
+
+ var confine = function(c, low, high){
+ // summary:
+ // sanitize a color component by making sure it is a number,
+ // and clamping it to valid values
+ c = Number(c);
+ return isNaN(c) ? high : c < low ? low : c > high ? high : c; // Number
+ };
+
+ Color.prototype.sanitize = function(){
+ // summary: makes sure that the object has correct attributes
+ var t = this;
+ t.r = Math.round(confine(t.r, 0, 255));
+ t.g = Math.round(confine(t.g, 0, 255));
+ t.b = Math.round(confine(t.b, 0, 255));
+ t.a = confine(t.a, 0, 1);
+ return this; // dojo.Color
+ };
+
+ ColorExt.makeGrey = Color.makeGrey = function(/*Number*/ g, /*Number?*/ a){
+ // summary: creates a greyscale color with an optional alpha
+ return Color.fromArray([g, g, g, a]); // dojo.Color
+ };
+
+ // mixin all CSS3 named colors not already in _base, along with SVG 1.0 variant spellings
+ lang.mixin(Color.named, {
+ "aliceblue": [240,248,255],
+ "antiquewhite": [250,235,215],
+ "aquamarine": [127,255,212],
+ "azure": [240,255,255],
+ "beige": [245,245,220],
+ "bisque": [255,228,196],
+ "blanchedalmond": [255,235,205],
+ "blueviolet": [138,43,226],
+ "brown": [165,42,42],
+ "burlywood": [222,184,135],
+ "cadetblue": [95,158,160],
+ "chartreuse": [127,255,0],
+ "chocolate": [210,105,30],
+ "coral": [255,127,80],
+ "cornflowerblue": [100,149,237],
+ "cornsilk": [255,248,220],
+ "crimson": [220,20,60],
+ "cyan": [0,255,255],
+ "darkblue": [0,0,139],
+ "darkcyan": [0,139,139],
+ "darkgoldenrod": [184,134,11],
+ "darkgray": [169,169,169],
+ "darkgreen": [0,100,0],
+ "darkgrey": [169,169,169],
+ "darkkhaki": [189,183,107],
+ "darkmagenta": [139,0,139],
+ "darkolivegreen": [85,107,47],
+ "darkorange": [255,140,0],
+ "darkorchid": [153,50,204],
+ "darkred": [139,0,0],
+ "darksalmon": [233,150,122],
+ "darkseagreen": [143,188,143],
+ "darkslateblue": [72,61,139],
+ "darkslategray": [47,79,79],
+ "darkslategrey": [47,79,79],
+ "darkturquoise": [0,206,209],
+ "darkviolet": [148,0,211],
+ "deeppink": [255,20,147],
+ "deepskyblue": [0,191,255],
+ "dimgray": [105,105,105],
+ "dimgrey": [105,105,105],
+ "dodgerblue": [30,144,255],
+ "firebrick": [178,34,34],
+ "floralwhite": [255,250,240],
+ "forestgreen": [34,139,34],
+ "gainsboro": [220,220,220],
+ "ghostwhite": [248,248,255],
+ "gold": [255,215,0],
+ "goldenrod": [218,165,32],
+ "greenyellow": [173,255,47],
+ "grey": [128,128,128],
+ "honeydew": [240,255,240],
+ "hotpink": [255,105,180],
+ "indianred": [205,92,92],
+ "indigo": [75,0,130],
+ "ivory": [255,255,240],
+ "khaki": [240,230,140],
+ "lavender": [230,230,250],
+ "lavenderblush": [255,240,245],
+ "lawngreen": [124,252,0],
+ "lemonchiffon": [255,250,205],
+ "lightblue": [173,216,230],
+ "lightcoral": [240,128,128],
+ "lightcyan": [224,255,255],
+ "lightgoldenrodyellow": [250,250,210],
+ "lightgray": [211,211,211],
+ "lightgreen": [144,238,144],
+ "lightgrey": [211,211,211],
+ "lightpink": [255,182,193],
+ "lightsalmon": [255,160,122],
+ "lightseagreen": [32,178,170],
+ "lightskyblue": [135,206,250],
+ "lightslategray": [119,136,153],
+ "lightslategrey": [119,136,153],
+ "lightsteelblue": [176,196,222],
+ "lightyellow": [255,255,224],
+ "limegreen": [50,205,50],
+ "linen": [250,240,230],
+ "magenta": [255,0,255],
+ "mediumaquamarine": [102,205,170],
+ "mediumblue": [0,0,205],
+ "mediumorchid": [186,85,211],
+ "mediumpurple": [147,112,219],
+ "mediumseagreen": [60,179,113],
+ "mediumslateblue": [123,104,238],
+ "mediumspringgreen": [0,250,154],
+ "mediumturquoise": [72,209,204],
+ "mediumvioletred": [199,21,133],
+ "midnightblue": [25,25,112],
+ "mintcream": [245,255,250],
+ "mistyrose": [255,228,225],
+ "moccasin": [255,228,181],
+ "navajowhite": [255,222,173],
+ "oldlace": [253,245,230],
+ "olivedrab": [107,142,35],
+ "orange": [255,165,0],
+ "orangered": [255,69,0],
+ "orchid": [218,112,214],
+ "palegoldenrod": [238,232,170],
+ "palegreen": [152,251,152],
+ "paleturquoise": [175,238,238],
+ "palevioletred": [219,112,147],
+ "papayawhip": [255,239,213],
+ "peachpuff": [255,218,185],
+ "peru": [205,133,63],
+ "pink": [255,192,203],
+ "plum": [221,160,221],
+ "powderblue": [176,224,230],
+ "rosybrown": [188,143,143],
+ "royalblue": [65,105,225],
+ "saddlebrown": [139,69,19],
+ "salmon": [250,128,114],
+ "sandybrown": [244,164,96],
+ "seagreen": [46,139,87],
+ "seashell": [255,245,238],
+ "sienna": [160,82,45],
+ "skyblue": [135,206,235],
+ "slateblue": [106,90,205],
+ "slategray": [112,128,144],
+ "slategrey": [112,128,144],
+ "snow": [255,250,250],
+ "springgreen": [0,255,127],
+ "steelblue": [70,130,180],
+ "tan": [210,180,140],
+ "thistle": [216,191,216],
+ "tomato": [255,99,71],
+ "turquoise": [64,224,208],
+ "violet": [238,130,238],
+ "wheat": [245,222,179],
+ "whitesmoke": [245,245,245],
+ "yellowgreen": [154,205,50]
+ });
+
+ return Color;
+});
diff --git a/lib/dojo/cookie.js b/lib/dojo/cookie.js
index 32d2718d9..a32e0bb13 100644
--- a/lib/dojo/cookie.js
+++ b/lib/dojo/cookie.js
@@ -4,99 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.cookie"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.cookie"] = true;
-dojo.provide("dojo.cookie");
-dojo.require("dojo.regexp");
-
-
-/*=====
-dojo.__cookieProps = function(){
- // expires: Date|String|Number?
- // If a number, the number of days from today at which the cookie
- // will expire. If a date, the date past which the cookie will expire.
- // If expires is in the past, the cookie will be deleted.
- // If expires is omitted or is 0, the cookie will expire when the browser closes. << FIXME: 0 seems to disappear right away? FF3.
- // path: String?
- // The path to use for the cookie.
- // domain: String?
- // The domain to use for the cookie.
- // secure: Boolean?
- // Whether to only send the cookie on secure connections
- this.expires = expires;
- this.path = path;
- this.domain = domain;
- this.secure = secure;
-}
-=====*/
-
-
-dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/props){
- // summary:
- // Get or set a cookie.
- // description:
- // If one argument is passed, returns the value of the cookie
- // For two or more arguments, acts as a setter.
- // name:
- // Name of the cookie
- // value:
- // Value for the cookie
- // props:
- // Properties for the cookie
- // example:
- // set a cookie with the JSON-serialized contents of an object which
- // will expire 5 days from now:
- // | dojo.cookie("configObj", dojo.toJson(config), { expires: 5 });
- //
- // example:
- // de-serialize a cookie back into a JavaScript object:
- // | var config = dojo.fromJson(dojo.cookie("configObj"));
- //
- // example:
- // delete a cookie:
- // | dojo.cookie("configObj", null, {expires: -1});
- var c = document.cookie;
- if(arguments.length == 1){
- var matches = c.match(new RegExp("(?:^|; )" + dojo.regexp.escapeString(name) + "=([^;]*)"));
- return matches ? decodeURIComponent(matches[1]) : undefined; // String or undefined
- }else{
- props = props || {};
-// FIXME: expires=0 seems to disappear right away, not on close? (FF3) Change docs?
- var exp = props.expires;
- if(typeof exp == "number"){
- var d = new Date();
- d.setTime(d.getTime() + exp*24*60*60*1000);
- exp = props.expires = d;
- }
- if(exp && exp.toUTCString){ props.expires = exp.toUTCString(); }
-
- value = encodeURIComponent(value);
- var updatedCookie = name + "=" + value, propName;
- for(propName in props){
- updatedCookie += "; " + propName;
- var propValue = props[propName];
- if(propValue !== true){ updatedCookie += "=" + propValue; }
- }
- document.cookie = updatedCookie;
- }
-};
-
-dojo.cookie.isSupported = function(){
- // summary:
- // Use to determine if the current browser supports cookies or not.
- //
- // Returns true if user allows cookies.
- // Returns false if user doesn't allow cookies.
-
- if(!("cookieEnabled" in navigator)){
- this("__djCookieTest__", "CookiesAllowed");
- navigator.cookieEnabled = this("__djCookieTest__") == "CookiesAllowed";
- if(navigator.cookieEnabled){
- this("__djCookieTest__", "", {expires: -1});
- }
- }
- return navigator.cookieEnabled;
-};
-
-}
+//>>built
+define("dojo/cookie",["./_base/kernel","./regexp"],function(_1,_2){_1.cookie=function(_3,_4,_5){var c=document.cookie,_6;if(arguments.length==1){var _7=c.match(new RegExp("(?:^|; )"+_2.escapeString(_3)+"=([^;]*)"));_6=_7?decodeURIComponent(_7[1]):undefined;}else{_5=_5||{};var _8=_5.expires;if(typeof _8=="number"){var d=new Date();d.setTime(d.getTime()+_8*24*60*60*1000);_8=_5.expires=d;}if(_8&&_8.toUTCString){_5.expires=_8.toUTCString();}_4=encodeURIComponent(_4);var _9=_3+"="+_4,_a;for(_a in _5){_9+="; "+_a;var _b=_5[_a];if(_b!==true){_9+="="+_b;}}document.cookie=_9;}return _6;};_1.cookie.isSupported=function(){if(!("cookieEnabled" in navigator)){this("__djCookieTest__","CookiesAllowed");navigator.cookieEnabled=this("__djCookieTest__")=="CookiesAllowed";if(navigator.cookieEnabled){this("__djCookieTest__","",{expires:-1});}}return navigator.cookieEnabled;};return _1.cookie;}); \ No newline at end of file
diff --git a/lib/dojo/cookie.js.uncompressed.js b/lib/dojo/cookie.js.uncompressed.js
new file mode 100644
index 000000000..09300ef7c
--- /dev/null
+++ b/lib/dojo/cookie.js.uncompressed.js
@@ -0,0 +1,98 @@
+define("dojo/cookie", ["./_base/kernel", "./regexp"], function(dojo, regexp) {
+ // module:
+ // dojo/cookie
+ // summary:
+ // TODOC
+
+
+/*=====
+dojo.__cookieProps = function(){
+ // expires: Date|String|Number?
+ // If a number, the number of days from today at which the cookie
+ // will expire. If a date, the date past which the cookie will expire.
+ // If expires is in the past, the cookie will be deleted.
+ // If expires is omitted or is 0, the cookie will expire when the browser closes.
+ // path: String?
+ // The path to use for the cookie.
+ // domain: String?
+ // The domain to use for the cookie.
+ // secure: Boolean?
+ // Whether to only send the cookie on secure connections
+ this.expires = expires;
+ this.path = path;
+ this.domain = domain;
+ this.secure = secure;
+}
+=====*/
+
+
+dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/props){
+ // summary:
+ // Get or set a cookie.
+ // description:
+ // If one argument is passed, returns the value of the cookie
+ // For two or more arguments, acts as a setter.
+ // name:
+ // Name of the cookie
+ // value:
+ // Value for the cookie
+ // props:
+ // Properties for the cookie
+ // example:
+ // set a cookie with the JSON-serialized contents of an object which
+ // will expire 5 days from now:
+ // | dojo.cookie("configObj", dojo.toJson(config), { expires: 5 });
+ //
+ // example:
+ // de-serialize a cookie back into a JavaScript object:
+ // | var config = dojo.fromJson(dojo.cookie("configObj"));
+ //
+ // example:
+ // delete a cookie:
+ // | dojo.cookie("configObj", null, {expires: -1});
+ var c = document.cookie, ret;
+ if(arguments.length == 1){
+ var matches = c.match(new RegExp("(?:^|; )" + regexp.escapeString(name) + "=([^;]*)"));
+ ret = matches ? decodeURIComponent(matches[1]) : undefined;
+ }else{
+ props = props || {};
+// FIXME: expires=0 seems to disappear right away, not on close? (FF3) Change docs?
+ var exp = props.expires;
+ if(typeof exp == "number"){
+ var d = new Date();
+ d.setTime(d.getTime() + exp*24*60*60*1000);
+ exp = props.expires = d;
+ }
+ if(exp && exp.toUTCString){ props.expires = exp.toUTCString(); }
+
+ value = encodeURIComponent(value);
+ var updatedCookie = name + "=" + value, propName;
+ for(propName in props){
+ updatedCookie += "; " + propName;
+ var propValue = props[propName];
+ if(propValue !== true){ updatedCookie += "=" + propValue; }
+ }
+ document.cookie = updatedCookie;
+ }
+ return ret; // String|undefined
+};
+
+dojo.cookie.isSupported = function(){
+ // summary:
+ // Use to determine if the current browser supports cookies or not.
+ //
+ // Returns true if user allows cookies.
+ // Returns false if user doesn't allow cookies.
+
+ if(!("cookieEnabled" in navigator)){
+ this("__djCookieTest__", "CookiesAllowed");
+ navigator.cookieEnabled = this("__djCookieTest__") == "CookiesAllowed";
+ if(navigator.cookieEnabled){
+ this("__djCookieTest__", "", {expires: -1});
+ }
+ }
+ return navigator.cookieEnabled;
+};
+
+return dojo.cookie;
+});
diff --git a/lib/dojo/currency.js b/lib/dojo/currency.js
index 8ae564618..4e9e249a9 100644
--- a/lib/dojo/currency.js
+++ b/lib/dojo/currency.js
@@ -4,137 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.currency"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.currency"] = true;
-dojo.provide("dojo.currency");
-dojo.require("dojo.number");
-dojo.require("dojo.i18n");
-dojo.requireLocalization("dojo.cldr", "currency", null, "ROOT,ar,ca,cs,da,de,el,en,en-au,en-ca,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,ro,ru,sk,sl,sv,th,tr,zh,zh-hant,zh-hk,zh-tw");
-dojo.require("dojo.cldr.monetary");
-
-dojo.getObject("currency", true, dojo);
-
-/*=====
-dojo.currency = {
- // summary: localized formatting and parsing routines for currencies
- //
- // description: extends dojo.number to provide culturally-appropriate formatting of values
- // in various world currencies, including use of a currency symbol. The currencies are specified
- // by a three-letter international symbol in all uppercase, and support for the currencies is
- // provided by the data in `dojo.cldr`. The scripts generating dojo.cldr specify which
- // currency support is included. A fixed number of decimal places is determined based
- // on the currency type and is not determined by the 'pattern' argument. The fractional
- // portion is optional, by default, and variable length decimals are not supported.
-}
-=====*/
-
-dojo.currency._mixInDefaults = function(options){
- options = options || {};
- options.type = "currency";
-
- // Get locale-dependent currency data, like the symbol
- var bundle = dojo.i18n.getLocalization("dojo.cldr", "currency", options.locale) || {};
-
- // Mixin locale-independent currency data, like # of places
- var iso = options.currency;
- var data = dojo.cldr.monetary.getData(iso);
-
- dojo.forEach(["displayName","symbol","group","decimal"], function(prop){
- data[prop] = bundle[iso+"_"+prop];
- });
-
- data.fractional = [true, false];
-
- // Mixin with provided options
- return dojo.mixin(data, options);
-};
-
-/*=====
-dojo.declare("dojo.currency.__FormatOptions", [dojo.number.__FormatOptions], {
- // type: String?
- // Should not be set. Value is assumed to be "currency".
- // symbol: String?
- // localized currency symbol. The default will be looked up in table of supported currencies in `dojo.cldr`
- // A [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code will be used if not found.
- // currency: String?
- // an [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD".
- // For use with dojo.currency only.
- // places: Number?
- // number of decimal places to show. Default is defined based on which currency is used.
- type: "",
- symbol: "",
- currency: "",
- places: ""
-});
-=====*/
-
-dojo.currency.format = function(/*Number*/value, /*dojo.currency.__FormatOptions?*/options){
-// summary:
-// Format a Number as a currency, using locale-specific settings
-//
-// description:
-// Create a string from a Number using a known, localized pattern.
-// [Formatting patterns](http://www.unicode.org/reports/tr35/#Number_Elements)
-// appropriate to the locale are chosen from the [CLDR](http://unicode.org/cldr)
-// as well as the appropriate symbols and delimiters and number of decimal places.
-//
-// value:
-// the number to be formatted.
-
- return dojo.number.format(value, dojo.currency._mixInDefaults(options));
-};
-
-dojo.currency.regexp = function(/*dojo.number.__RegexpOptions?*/options){
-//
-// summary:
-// Builds the regular needed to parse a currency value
-//
-// description:
-// Returns regular expression with positive and negative match, group and decimal separators
-// Note: the options.places default, the number of decimal places to accept, is defined by the currency type.
- return dojo.number.regexp(dojo.currency._mixInDefaults(options)); // String
-};
-
-/*=====
-dojo.declare("dojo.currency.__ParseOptions", [dojo.number.__ParseOptions], {
- // type: String?
- // Should not be set. Value is assumed to be currency.
- // currency: String?
- // an [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD".
- // For use with dojo.currency only.
- // symbol: String?
- // localized currency symbol. The default will be looked up in table of supported currencies in `dojo.cldr`
- // A [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code will be used if not found.
- // places: Number?
- // fixed number of decimal places to accept. The default is determined based on which currency is used.
- // fractional: Boolean?|Array?
- // Whether to include the fractional portion, where the number of decimal places are implied by the currency
- // or explicit 'places' parameter. The value [true,false] makes the fractional portion optional.
- // By default for currencies, it the fractional portion is optional.
- type: "",
- currency: "",
- symbol: "",
- places: "",
- fractional: ""
-});
-=====*/
-
-dojo.currency.parse = function(/*String*/expression, /*dojo.currency.__ParseOptions?*/options){
- //
- // summary:
- // Convert a properly formatted currency string to a primitive Number,
- // using locale-specific settings.
- //
- // description:
- // Create a Number from a string using a known, localized pattern.
- // [Formatting patterns](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
- // are chosen appropriate to the locale, as well as the appropriate symbols and delimiters
- // and number of decimal places.
- //
- // expression: A string representation of a currency value
-
- return dojo.number.parse(expression, dojo.currency._mixInDefaults(options));
-};
-
-}
+//>>built
+define("dojo/currency",["./_base/kernel","./_base/lang","./_base/array","./number","./i18n","./i18n!./cldr/nls/currency","./cldr/monetary"],function(_1,_2,_3,_4,_5,_6,_7){_2.getObject("currency",true,_1);_1.currency._mixInDefaults=function(_8){_8=_8||{};_8.type="currency";var _9=_5.getLocalization("dojo.cldr","currency",_8.locale)||{};var _a=_8.currency;var _b=_7.getData(_a);_3.forEach(["displayName","symbol","group","decimal"],function(_c){_b[_c]=_9[_a+"_"+_c];});_b.fractional=[true,false];return _2.mixin(_b,_8);};_1.currency.format=function(_d,_e){return _4.format(_d,_1.currency._mixInDefaults(_e));};_1.currency.regexp=function(_f){return _4.regexp(_1.currency._mixInDefaults(_f));};_1.currency.parse=function(_10,_11){return _4.parse(_10,_1.currency._mixInDefaults(_11));};return _1.currency;}); \ No newline at end of file
diff --git a/lib/dojo/currency.js.uncompressed.js b/lib/dojo/currency.js.uncompressed.js
new file mode 100644
index 000000000..7b17f1fb2
--- /dev/null
+++ b/lib/dojo/currency.js.uncompressed.js
@@ -0,0 +1,132 @@
+define("dojo/currency", ["./_base/kernel", "./_base/lang", "./_base/array", "./number", "./i18n", "./i18n!./cldr/nls/currency", "./cldr/monetary"], function(dojo, lang, darray, dnumber, i18n, nlsCurrency, cldrMonetary) {
+ // module:
+ // dojo/currency
+ // summary:
+ // TODOC
+
+lang.getObject("currency", true, dojo);
+
+/*=====
+dojo.currency = {
+ // summary: localized formatting and parsing routines for currencies
+ //
+ // description: extends dojo.number to provide culturally-appropriate formatting of values
+ // in various world currencies, including use of a currency symbol. The currencies are specified
+ // by a three-letter international symbol in all uppercase, and support for the currencies is
+ // provided by the data in `dojo.cldr`. The scripts generating dojo.cldr specify which
+ // currency support is included. A fixed number of decimal places is determined based
+ // on the currency type and is not determined by the 'pattern' argument. The fractional
+ // portion is optional, by default, and variable length decimals are not supported.
+}
+=====*/
+
+dojo.currency._mixInDefaults = function(options){
+ options = options || {};
+ options.type = "currency";
+
+ // Get locale-dependent currency data, like the symbol
+ var bundle = i18n.getLocalization("dojo.cldr", "currency", options.locale) || {};
+
+ // Mixin locale-independent currency data, like # of places
+ var iso = options.currency;
+ var data = cldrMonetary.getData(iso);
+
+ darray.forEach(["displayName","symbol","group","decimal"], function(prop){
+ data[prop] = bundle[iso+"_"+prop];
+ });
+
+ data.fractional = [true, false];
+
+ // Mixin with provided options
+ return lang.mixin(data, options);
+};
+
+/*=====
+dojo.declare("dojo.currency.__FormatOptions", [dojo.number.__FormatOptions], {
+ // type: String?
+ // Should not be set. Value is assumed to be "currency".
+ // symbol: String?
+ // localized currency symbol. The default will be looked up in table of supported currencies in `dojo.cldr`
+ // A [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code will be used if not found.
+ // currency: String?
+ // an [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD".
+ // For use with dojo.currency only.
+ // places: Number?
+ // number of decimal places to show. Default is defined based on which currency is used.
+ type: "",
+ symbol: "",
+ currency: "",
+ places: ""
+});
+=====*/
+
+dojo.currency.format = function(/*Number*/value, /*dojo.currency.__FormatOptions?*/options){
+// summary:
+// Format a Number as a currency, using locale-specific settings
+//
+// description:
+// Create a string from a Number using a known, localized pattern.
+// [Formatting patterns](http://www.unicode.org/reports/tr35/#Number_Elements)
+// appropriate to the locale are chosen from the [CLDR](http://unicode.org/cldr)
+// as well as the appropriate symbols and delimiters and number of decimal places.
+//
+// value:
+// the number to be formatted.
+
+ return dnumber.format(value, dojo.currency._mixInDefaults(options));
+};
+
+dojo.currency.regexp = function(/*dojo.number.__RegexpOptions?*/options){
+//
+// summary:
+// Builds the regular needed to parse a currency value
+//
+// description:
+// Returns regular expression with positive and negative match, group and decimal separators
+// Note: the options.places default, the number of decimal places to accept, is defined by the currency type.
+ return dnumber.regexp(dojo.currency._mixInDefaults(options)); // String
+};
+
+/*=====
+dojo.declare("dojo.currency.__ParseOptions", [dojo.number.__ParseOptions], {
+ // type: String?
+ // Should not be set. Value is assumed to be currency.
+ // currency: String?
+ // an [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD".
+ // For use with dojo.currency only.
+ // symbol: String?
+ // localized currency symbol. The default will be looked up in table of supported currencies in `dojo.cldr`
+ // A [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code will be used if not found.
+ // places: Number?
+ // fixed number of decimal places to accept. The default is determined based on which currency is used.
+ // fractional: Boolean?|Array?
+ // Whether to include the fractional portion, where the number of decimal places are implied by the currency
+ // or explicit 'places' parameter. The value [true,false] makes the fractional portion optional.
+ // By default for currencies, it the fractional portion is optional.
+ type: "",
+ currency: "",
+ symbol: "",
+ places: "",
+ fractional: ""
+});
+=====*/
+
+dojo.currency.parse = function(/*String*/expression, /*dojo.currency.__ParseOptions?*/options){
+ //
+ // summary:
+ // Convert a properly formatted currency string to a primitive Number,
+ // using locale-specific settings.
+ //
+ // description:
+ // Create a Number from a string using a known, localized pattern.
+ // [Formatting patterns](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+ // are chosen appropriate to the locale, as well as the appropriate symbols and delimiters
+ // and number of decimal places.
+ //
+ // expression: A string representation of a currency value
+
+ return dnumber.parse(expression, dojo.currency._mixInDefaults(options));
+};
+
+return dojo.currency;
+});
diff --git a/lib/dojo/data/ItemFileReadStore.js b/lib/dojo/data/ItemFileReadStore.js
index 9d175ca2c..b57daa2de 100644
--- a/lib/dojo/data/ItemFileReadStore.js
+++ b/lib/dojo/data/ItemFileReadStore.js
@@ -4,947 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.data.ItemFileReadStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.ItemFileReadStore"] = true;
-dojo.provide("dojo.data.ItemFileReadStore");
-dojo.require("dojo.data.util.filter");
-dojo.require("dojo.data.util.simpleFetch");
-dojo.require("dojo.date.stamp");
-
-
-dojo.declare("dojo.data.ItemFileReadStore", null,{
- // summary:
- // The ItemFileReadStore implements the dojo.data.api.Read API and reads
- // data from JSON files that have contents in this format --
- // { items: [
- // { name:'Kermit', color:'green', age:12, friends:['Gonzo', {_reference:{name:'Fozzie Bear'}}]},
- // { name:'Fozzie Bear', wears:['hat', 'tie']},
- // { name:'Miss Piggy', pets:'Foo-Foo'}
- // ]}
- // Note that it can also contain an 'identifer' property that specified which attribute on the items
- // in the array of items that acts as the unique identifier for that item.
- //
- constructor: function(/* Object */ keywordParameters){
- // summary: constructor
- // keywordParameters: {url: String}
- // keywordParameters: {data: jsonObject}
- // keywordParameters: {typeMap: object)
- // The structure of the typeMap object is as follows:
- // {
- // type0: function || object,
- // type1: function || object,
- // ...
- // typeN: function || object
- // }
- // Where if it is a function, it is assumed to be an object constructor that takes the
- // value of _value as the initialization parameters. If it is an object, then it is assumed
- // to be an object of general form:
- // {
- // type: function, //constructor.
- // deserialize: function(value) //The function that parses the value and constructs the object defined by type appropriately.
- // }
-
- this._arrayOfAllItems = [];
- this._arrayOfTopLevelItems = [];
- this._loadFinished = false;
- this._jsonFileUrl = keywordParameters.url;
- this._ccUrl = keywordParameters.url;
- this.url = keywordParameters.url;
- this._jsonData = keywordParameters.data;
- this.data = null;
- this._datatypeMap = keywordParameters.typeMap || {};
- if(!this._datatypeMap['Date']){
- //If no default mapping for dates, then set this as default.
- //We use the dojo.date.stamp here because the ISO format is the 'dojo way'
- //of generically representing dates.
- this._datatypeMap['Date'] = {
- type: Date,
- deserialize: function(value){
- return dojo.date.stamp.fromISOString(value);
- }
- };
- }
- this._features = {'dojo.data.api.Read':true, 'dojo.data.api.Identity':true};
- this._itemsByIdentity = null;
- this._storeRefPropName = "_S"; // Default name for the store reference to attach to every item.
- this._itemNumPropName = "_0"; // Default Item Id for isItem to attach to every item.
- this._rootItemPropName = "_RI"; // Default Item Id for isItem to attach to every item.
- this._reverseRefMap = "_RRM"; // Default attribute for constructing a reverse reference map for use with reference integrity
- this._loadInProgress = false; //Got to track the initial load to prevent duelling loads of the dataset.
- this._queuedFetches = [];
- if(keywordParameters.urlPreventCache !== undefined){
- this.urlPreventCache = keywordParameters.urlPreventCache?true:false;
- }
- if(keywordParameters.hierarchical !== undefined){
- this.hierarchical = keywordParameters.hierarchical?true:false;
- }
- if(keywordParameters.clearOnClose){
- this.clearOnClose = true;
- }
- if("failOk" in keywordParameters){
- this.failOk = keywordParameters.failOk?true:false;
- }
- },
-
- url: "", // use "" rather than undefined for the benefit of the parser (#3539)
-
- //Internal var, crossCheckUrl. Used so that setting either url or _jsonFileUrl, can still trigger a reload
- //when clearOnClose and close is used.
- _ccUrl: "",
-
- data: null, // define this so that the parser can populate it
-
- typeMap: null, //Define so parser can populate.
-
- //Parameter to allow users to specify if a close call should force a reload or not.
- //By default, it retains the old behavior of not clearing if close is called. But
- //if set true, the store will be reset to default state. Note that by doing this,
- //all item handles will become invalid and a new fetch must be issued.
- clearOnClose: false,
-
- //Parameter to allow specifying if preventCache should be passed to the xhrGet call or not when loading data from a url.
- //Note this does not mean the store calls the server on each fetch, only that the data load has preventCache set as an option.
- //Added for tracker: #6072
- urlPreventCache: false,
-
- //Parameter for specifying that it is OK for the xhrGet call to fail silently.
- failOk: false,
-
- //Parameter to indicate to process data from the url as hierarchical
- //(data items can contain other data items in js form). Default is true
- //for backwards compatibility. False means only root items are processed
- //as items, all child objects outside of type-mapped objects and those in
- //specific reference format, are left straight JS data objects.
- hierarchical: true,
-
- _assertIsItem: function(/* item */ item){
- // summary:
- // This function tests whether the item passed in is indeed an item in the store.
- // item:
- // The item to test for being contained by the store.
- if(!this.isItem(item)){
- throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");
- }
- },
-
- _assertIsAttribute: function(/* attribute-name-string */ attribute){
- // summary:
- // This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
- // attribute:
- // The attribute to test for being contained by the store.
- if(typeof attribute !== "string"){
- throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");
- }
- },
-
- getValue: function( /* item */ item,
- /* attribute-name-string */ attribute,
- /* value? */ defaultValue){
- // summary:
- // See dojo.data.api.Read.getValue()
- var values = this.getValues(item, attribute);
- return (values.length > 0)?values[0]:defaultValue; // mixed
- },
-
- getValues: function(/* item */ item,
- /* attribute-name-string */ attribute){
- // summary:
- // See dojo.data.api.Read.getValues()
-
- this._assertIsItem(item);
- this._assertIsAttribute(attribute);
- // Clone it before returning. refs: #10474
- return (item[attribute] || []).slice(0); // Array
- },
-
- getAttributes: function(/* item */ item){
- // summary:
- // See dojo.data.api.Read.getAttributes()
- this._assertIsItem(item);
- var attributes = [];
- for(var key in item){
- // Save off only the real item attributes, not the special id marks for O(1) isItem.
- if((key !== this._storeRefPropName) && (key !== this._itemNumPropName) && (key !== this._rootItemPropName) && (key !== this._reverseRefMap)){
- attributes.push(key);
- }
- }
- return attributes; // Array
- },
-
- hasAttribute: function( /* item */ item,
- /* attribute-name-string */ attribute){
- // summary:
- // See dojo.data.api.Read.hasAttribute()
- this._assertIsItem(item);
- this._assertIsAttribute(attribute);
- return (attribute in item);
- },
-
- containsValue: function(/* item */ item,
- /* attribute-name-string */ attribute,
- /* anything */ value){
- // summary:
- // See dojo.data.api.Read.containsValue()
- var regexp = undefined;
- if(typeof value === "string"){
- regexp = dojo.data.util.filter.patternToRegExp(value, false);
- }
- return this._containsValue(item, attribute, value, regexp); //boolean.
- },
-
- _containsValue: function( /* item */ item,
- /* attribute-name-string */ attribute,
- /* anything */ value,
- /* RegExp?*/ regexp){
- // summary:
- // Internal function for looking at the values contained by the item.
- // description:
- // Internal function for looking at the values contained by the item. This
- // function allows for denoting if the comparison should be case sensitive for
- // strings or not (for handling filtering cases where string case should not matter)
- //
- // item:
- // The data item to examine for attribute values.
- // attribute:
- // The attribute to inspect.
- // value:
- // The value to match.
- // regexp:
- // Optional regular expression generated off value if value was of string type to handle wildcarding.
- // If present and attribute values are string, then it can be used for comparison instead of 'value'
- return dojo.some(this.getValues(item, attribute), function(possibleValue){
- if(possibleValue !== null && !dojo.isObject(possibleValue) && regexp){
- if(possibleValue.toString().match(regexp)){
- return true; // Boolean
- }
- }else if(value === possibleValue){
- return true; // Boolean
- }
- });
- },
-
- isItem: function(/* anything */ something){
- // summary:
- // See dojo.data.api.Read.isItem()
- if(something && something[this._storeRefPropName] === this){
- if(this._arrayOfAllItems[something[this._itemNumPropName]] === something){
- return true;
- }
- }
- return false; // Boolean
- },
-
- isItemLoaded: function(/* anything */ something){
- // summary:
- // See dojo.data.api.Read.isItemLoaded()
- return this.isItem(something); //boolean
- },
-
- loadItem: function(/* object */ keywordArgs){
- // summary:
- // See dojo.data.api.Read.loadItem()
- this._assertIsItem(keywordArgs.item);
- },
-
- getFeatures: function(){
- // summary:
- // See dojo.data.api.Read.getFeatures()
- return this._features; //Object
- },
-
- getLabel: function(/* item */ item){
- // summary:
- // See dojo.data.api.Read.getLabel()
- if(this._labelAttr && this.isItem(item)){
- return this.getValue(item,this._labelAttr); //String
- }
- return undefined; //undefined
- },
-
- getLabelAttributes: function(/* item */ item){
- // summary:
- // See dojo.data.api.Read.getLabelAttributes()
- if(this._labelAttr){
- return [this._labelAttr]; //array
- }
- return null; //null
- },
-
- _fetchItems: function( /* Object */ keywordArgs,
- /* Function */ findCallback,
- /* Function */ errorCallback){
- // summary:
- // See dojo.data.util.simpleFetch.fetch()
- var self = this,
- filter = function(requestArgs, arrayOfItems){
- var items = [],
- i, key;
- if(requestArgs.query){
- var value,
- ignoreCase = requestArgs.queryOptions ? requestArgs.queryOptions.ignoreCase : false;
-
- //See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the
- //same value for each item examined. Much more efficient.
- var regexpList = {};
- for(key in requestArgs.query){
- value = requestArgs.query[key];
- if(typeof value === "string"){
- regexpList[key] = dojo.data.util.filter.patternToRegExp(value, ignoreCase);
- }else if(value instanceof RegExp){
- regexpList[key] = value;
- }
- }
- for(i = 0; i < arrayOfItems.length; ++i){
- var match = true;
- var candidateItem = arrayOfItems[i];
- if(candidateItem === null){
- match = false;
- }else{
- for(key in requestArgs.query){
- value = requestArgs.query[key];
- if(!self._containsValue(candidateItem, key, value, regexpList[key])){
- match = false;
- }
- }
- }
- if(match){
- items.push(candidateItem);
- }
- }
- findCallback(items, requestArgs);
- }else{
- // We want a copy to pass back in case the parent wishes to sort the array.
- // We shouldn't allow resort of the internal list, so that multiple callers
- // can get lists and sort without affecting each other. We also need to
- // filter out any null values that have been left as a result of deleteItem()
- // calls in ItemFileWriteStore.
- for(i = 0; i < arrayOfItems.length; ++i){
- var item = arrayOfItems[i];
- if(item !== null){
- items.push(item);
- }
- }
- findCallback(items, requestArgs);
- }
- };
-
- if(this._loadFinished){
- filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
- }else{
- //Do a check on the JsonFileUrl and crosscheck it.
- //If it doesn't match the cross-check, it needs to be updated
- //This allows for either url or _jsonFileUrl to he changed to
- //reset the store load location. Done this way for backwards
- //compatibility. People use _jsonFileUrl (even though officially
- //private.
- if(this._jsonFileUrl !== this._ccUrl){
- dojo.deprecated("dojo.data.ItemFileReadStore: ",
- "To change the url, set the url property of the store," +
- " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");
- this._ccUrl = this._jsonFileUrl;
- this.url = this._jsonFileUrl;
- }else if(this.url !== this._ccUrl){
- this._jsonFileUrl = this.url;
- this._ccUrl = this.url;
- }
-
- //See if there was any forced reset of data.
- if(this.data != null){
- this._jsonData = this.data;
- this.data = null;
- }
-
- if(this._jsonFileUrl){
- //If fetches come in before the loading has finished, but while
- //a load is in progress, we have to defer the fetching to be
- //invoked in the callback.
- if(this._loadInProgress){
- this._queuedFetches.push({args: keywordArgs, filter: filter});
- }else{
- this._loadInProgress = true;
- var getArgs = {
- url: self._jsonFileUrl,
- handleAs: "json-comment-optional",
- preventCache: this.urlPreventCache,
- failOk: this.failOk
- };
- var getHandler = dojo.xhrGet(getArgs);
- getHandler.addCallback(function(data){
- try{
- self._getItemsFromLoadedData(data);
- self._loadFinished = true;
- self._loadInProgress = false;
-
- filter(keywordArgs, self._getItemsArray(keywordArgs.queryOptions));
- self._handleQueuedFetches();
- }catch(e){
- self._loadFinished = true;
- self._loadInProgress = false;
- errorCallback(e, keywordArgs);
- }
- });
- getHandler.addErrback(function(error){
- self._loadInProgress = false;
- errorCallback(error, keywordArgs);
- });
-
- //Wire up the cancel to abort of the request
- //This call cancel on the deferred if it hasn't been called
- //yet and then will chain to the simple abort of the
- //simpleFetch keywordArgs
- var oldAbort = null;
- if(keywordArgs.abort){
- oldAbort = keywordArgs.abort;
- }
- keywordArgs.abort = function(){
- var df = getHandler;
- if(df && df.fired === -1){
- df.cancel();
- df = null;
- }
- if(oldAbort){
- oldAbort.call(keywordArgs);
- }
- };
- }
- }else if(this._jsonData){
- try{
- this._loadFinished = true;
- this._getItemsFromLoadedData(this._jsonData);
- this._jsonData = null;
- filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
- }catch(e){
- errorCallback(e, keywordArgs);
- }
- }else{
- errorCallback(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."), keywordArgs);
- }
- }
- },
-
- _handleQueuedFetches: function(){
- // summary:
- // Internal function to execute delayed request in the store.
- //Execute any deferred fetches now.
- if(this._queuedFetches.length > 0){
- for(var i = 0; i < this._queuedFetches.length; i++){
- var fData = this._queuedFetches[i],
- delayedQuery = fData.args,
- delayedFilter = fData.filter;
- if(delayedFilter){
- delayedFilter(delayedQuery, this._getItemsArray(delayedQuery.queryOptions));
- }else{
- this.fetchItemByIdentity(delayedQuery);
- }
- }
- this._queuedFetches = [];
- }
- },
-
- _getItemsArray: function(/*object?*/queryOptions){
- // summary:
- // Internal function to determine which list of items to search over.
- // queryOptions: The query options parameter, if any.
- if(queryOptions && queryOptions.deep){
- return this._arrayOfAllItems;
- }
- return this._arrayOfTopLevelItems;
- },
-
- close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
- // summary:
- // See dojo.data.api.Read.close()
- if(this.clearOnClose &&
- this._loadFinished &&
- !this._loadInProgress){
- //Reset all internalsback to default state. This will force a reload
- //on next fetch. This also checks that the data or url param was set
- //so that the store knows it can get data. Without one of those being set,
- //the next fetch will trigger an error.
-
- if(((this._jsonFileUrl == "" || this._jsonFileUrl == null) &&
- (this.url == "" || this.url == null)
- ) && this.data == null){
- console.debug("dojo.data.ItemFileReadStore: WARNING! Data reload " +
- " information has not been provided." +
- " Please set 'url' or 'data' to the appropriate value before" +
- " the next fetch");
- }
- this._arrayOfAllItems = [];
- this._arrayOfTopLevelItems = [];
- this._loadFinished = false;
- this._itemsByIdentity = null;
- this._loadInProgress = false;
- this._queuedFetches = [];
- }
- },
-
- _getItemsFromLoadedData: function(/* Object */ dataObject){
- // summary:
- // Function to parse the loaded data into item format and build the internal items array.
- // description:
- // Function to parse the loaded data into item format and build the internal items array.
- //
- // dataObject:
- // The JS data object containing the raw data to convery into item format.
- //
- // returns: array
- // Array of items in store item format.
-
- // First, we define a couple little utility functions...
- var addingArrays = false,
- self = this;
-
- function valueIsAnItem(/* anything */ aValue){
- // summary:
- // Given any sort of value that could be in the raw json data,
- // return true if we should interpret the value as being an
- // item itself, rather than a literal value or a reference.
- // example:
- // | false == valueIsAnItem("Kermit");
- // | false == valueIsAnItem(42);
- // | false == valueIsAnItem(new Date());
- // | false == valueIsAnItem({_type:'Date', _value:'1802-05-14'});
- // | false == valueIsAnItem({_reference:'Kermit'});
- // | true == valueIsAnItem({name:'Kermit', color:'green'});
- // | true == valueIsAnItem({iggy:'pop'});
- // | true == valueIsAnItem({foo:42});
- var isItem = (
- (aValue !== null) &&
- (typeof aValue === "object") &&
- (!dojo.isArray(aValue) || addingArrays) &&
- (!dojo.isFunction(aValue)) &&
- (aValue.constructor == Object || dojo.isArray(aValue)) &&
- (typeof aValue._reference === "undefined") &&
- (typeof aValue._type === "undefined") &&
- (typeof aValue._value === "undefined") &&
- self.hierarchical
- );
- return isItem;
- }
-
- function addItemAndSubItemsToArrayOfAllItems(/* Item */ anItem){
- self._arrayOfAllItems.push(anItem);
- for(var attribute in anItem){
- var valueForAttribute = anItem[attribute];
- if(valueForAttribute){
- if(dojo.isArray(valueForAttribute)){
- var valueArray = valueForAttribute;
- for(var k = 0; k < valueArray.length; ++k){
- var singleValue = valueArray[k];
- if(valueIsAnItem(singleValue)){
- addItemAndSubItemsToArrayOfAllItems(singleValue);
- }
- }
- }else{
- if(valueIsAnItem(valueForAttribute)){
- addItemAndSubItemsToArrayOfAllItems(valueForAttribute);
- }
- }
- }
- }
- }
-
- this._labelAttr = dataObject.label;
-
- // We need to do some transformations to convert the data structure
- // that we read from the file into a format that will be convenient
- // to work with in memory.
-
- // Step 1: Walk through the object hierarchy and build a list of all items
- var i,
- item;
- this._arrayOfAllItems = [];
- this._arrayOfTopLevelItems = dataObject.items;
-
- for(i = 0; i < this._arrayOfTopLevelItems.length; ++i){
- item = this._arrayOfTopLevelItems[i];
- if(dojo.isArray(item)){
- addingArrays = true;
- }
- addItemAndSubItemsToArrayOfAllItems(item);
- item[this._rootItemPropName]=true;
- }
-
- // Step 2: Walk through all the attribute values of all the items,
- // and replace single values with arrays. For example, we change this:
- // { name:'Miss Piggy', pets:'Foo-Foo'}
- // into this:
- // { name:['Miss Piggy'], pets:['Foo-Foo']}
- //
- // We also store the attribute names so we can validate our store
- // reference and item id special properties for the O(1) isItem
- var allAttributeNames = {},
- key;
-
- for(i = 0; i < this._arrayOfAllItems.length; ++i){
- item = this._arrayOfAllItems[i];
- for(key in item){
- if(key !== this._rootItemPropName){
- var value = item[key];
- if(value !== null){
- if(!dojo.isArray(value)){
- item[key] = [value];
- }
- }else{
- item[key] = [null];
- }
- }
- allAttributeNames[key]=key;
- }
- }
-
- // Step 3: Build unique property names to use for the _storeRefPropName and _itemNumPropName
- // This should go really fast, it will generally never even run the loop.
- while(allAttributeNames[this._storeRefPropName]){
- this._storeRefPropName += "_";
- }
- while(allAttributeNames[this._itemNumPropName]){
- this._itemNumPropName += "_";
- }
- while(allAttributeNames[this._reverseRefMap]){
- this._reverseRefMap += "_";
- }
-
- // Step 4: Some data files specify an optional 'identifier', which is
- // the name of an attribute that holds the identity of each item.
- // If this data file specified an identifier attribute, then build a
- // hash table of items keyed by the identity of the items.
- var arrayOfValues;
-
- var identifier = dataObject.identifier;
- if(identifier){
- this._itemsByIdentity = {};
- this._features['dojo.data.api.Identity'] = identifier;
- for(i = 0; i < this._arrayOfAllItems.length; ++i){
- item = this._arrayOfAllItems[i];
- arrayOfValues = item[identifier];
- var identity = arrayOfValues[0];
- if(!Object.hasOwnProperty.call(this._itemsByIdentity, identity)){
- this._itemsByIdentity[identity] = item;
- }else{
- if(this._jsonFileUrl){
- throw new Error("dojo.data.ItemFileReadStore: The json data as specified by: [" + this._jsonFileUrl + "] is malformed. Items within the list have identifier: [" + identifier + "]. Value collided: [" + identity + "]");
- }else if(this._jsonData){
- throw new Error("dojo.data.ItemFileReadStore: The json data provided by the creation arguments is malformed. Items within the list have identifier: [" + identifier + "]. Value collided: [" + identity + "]");
- }
- }
- }
- }else{
- this._features['dojo.data.api.Identity'] = Number;
- }
-
- // Step 5: Walk through all the items, and set each item's properties
- // for _storeRefPropName and _itemNumPropName, so that store.isItem() will return true.
- for(i = 0; i < this._arrayOfAllItems.length; ++i){
- item = this._arrayOfAllItems[i];
- item[this._storeRefPropName] = this;
- item[this._itemNumPropName] = i;
- }
-
- // Step 6: We walk through all the attribute values of all the items,
- // looking for type/value literals and item-references.
- //
- // We replace item-references with pointers to items. For example, we change:
- // { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
- // into this:
- // { name:['Kermit'], friends:[miss_piggy] }
- // (where miss_piggy is the object representing the 'Miss Piggy' item).
- //
- // We replace type/value pairs with typed-literals. For example, we change:
- // { name:['Nelson Mandela'], born:[{_type:'Date', _value:'1918-07-18'}] }
- // into this:
- // { name:['Kermit'], born:(new Date(1918, 6, 18)) }
- //
- // We also generate the associate map for all items for the O(1) isItem function.
- for(i = 0; i < this._arrayOfAllItems.length; ++i){
- item = this._arrayOfAllItems[i]; // example: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
- for(key in item){
- arrayOfValues = item[key]; // example: [{_reference:{name:'Miss Piggy'}}]
- for(var j = 0; j < arrayOfValues.length; ++j){
- value = arrayOfValues[j]; // example: {_reference:{name:'Miss Piggy'}}
- if(value !== null && typeof value == "object"){
- if(("_type" in value) && ("_value" in value)){
- var type = value._type; // examples: 'Date', 'Color', or 'ComplexNumber'
- var mappingObj = this._datatypeMap[type]; // examples: Date, dojo.Color, foo.math.ComplexNumber, {type: dojo.Color, deserialize(value){ return new dojo.Color(value)}}
- if(!mappingObj){
- throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '" + type + "'");
- }else if(dojo.isFunction(mappingObj)){
- arrayOfValues[j] = new mappingObj(value._value);
- }else if(dojo.isFunction(mappingObj.deserialize)){
- arrayOfValues[j] = mappingObj.deserialize(value._value);
- }else{
- throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");
- }
- }
- if(value._reference){
- var referenceDescription = value._reference; // example: {name:'Miss Piggy'}
- if(!dojo.isObject(referenceDescription)){
- // example: 'Miss Piggy'
- // from an item like: { name:['Kermit'], friends:[{_reference:'Miss Piggy'}]}
- arrayOfValues[j] = this._getItemByIdentity(referenceDescription);
- }else{
- // example: {name:'Miss Piggy'}
- // from an item like: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
- for(var k = 0; k < this._arrayOfAllItems.length; ++k){
- var candidateItem = this._arrayOfAllItems[k],
- found = true;
- for(var refKey in referenceDescription){
- if(candidateItem[refKey] != referenceDescription[refKey]){
- found = false;
- }
- }
- if(found){
- arrayOfValues[j] = candidateItem;
- }
- }
- }
- if(this.referenceIntegrity){
- var refItem = arrayOfValues[j];
- if(this.isItem(refItem)){
- this._addReferenceToMap(refItem, item, key);
- }
- }
- }else if(this.isItem(value)){
- //It's a child item (not one referenced through _reference).
- //We need to treat this as a referenced item, so it can be cleaned up
- //in a write store easily.
- if(this.referenceIntegrity){
- this._addReferenceToMap(value, item, key);
- }
- }
- }
- }
- }
- }
- },
-
- _addReferenceToMap: function(/*item*/ refItem, /*item*/ parentItem, /*string*/ attribute){
- // summary:
- // Method to add an reference map entry for an item and attribute.
- // description:
- // Method to add an reference map entry for an item and attribute. //
- // refItem:
- // The item that is referenced.
- // parentItem:
- // The item that holds the new reference to refItem.
- // attribute:
- // The attribute on parentItem that contains the new reference.
-
- //Stub function, does nothing. Real processing is in ItemFileWriteStore.
- },
-
- getIdentity: function(/* item */ item){
- // summary:
- // See dojo.data.api.Identity.getIdentity()
- var identifier = this._features['dojo.data.api.Identity'];
- if(identifier === Number){
- return item[this._itemNumPropName]; // Number
- }else{
- var arrayOfValues = item[identifier];
- if(arrayOfValues){
- return arrayOfValues[0]; // Object || String
- }
- }
- return null; // null
- },
-
- fetchItemByIdentity: function(/* Object */ keywordArgs){
- // summary:
- // See dojo.data.api.Identity.fetchItemByIdentity()
-
- // Hasn't loaded yet, we have to trigger the load.
- var item,
- scope;
- if(!this._loadFinished){
- var self = this;
- //Do a check on the JsonFileUrl and crosscheck it.
- //If it doesn't match the cross-check, it needs to be updated
- //This allows for either url or _jsonFileUrl to he changed to
- //reset the store load location. Done this way for backwards
- //compatibility. People use _jsonFileUrl (even though officially
- //private.
- if(this._jsonFileUrl !== this._ccUrl){
- dojo.deprecated("dojo.data.ItemFileReadStore: ",
- "To change the url, set the url property of the store," +
- " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");
- this._ccUrl = this._jsonFileUrl;
- this.url = this._jsonFileUrl;
- }else if(this.url !== this._ccUrl){
- this._jsonFileUrl = this.url;
- this._ccUrl = this.url;
- }
-
- //See if there was any forced reset of data.
- if(this.data != null && this._jsonData == null){
- this._jsonData = this.data;
- this.data = null;
- }
-
- if(this._jsonFileUrl){
-
- if(this._loadInProgress){
- this._queuedFetches.push({args: keywordArgs});
- }else{
- this._loadInProgress = true;
- var getArgs = {
- url: self._jsonFileUrl,
- handleAs: "json-comment-optional",
- preventCache: this.urlPreventCache,
- failOk: this.failOk
- };
- var getHandler = dojo.xhrGet(getArgs);
- getHandler.addCallback(function(data){
- var scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
- try{
- self._getItemsFromLoadedData(data);
- self._loadFinished = true;
- self._loadInProgress = false;
- item = self._getItemByIdentity(keywordArgs.identity);
- if(keywordArgs.onItem){
- keywordArgs.onItem.call(scope, item);
- }
- self._handleQueuedFetches();
- }catch(error){
- self._loadInProgress = false;
- if(keywordArgs.onError){
- keywordArgs.onError.call(scope, error);
- }
- }
- });
- getHandler.addErrback(function(error){
- self._loadInProgress = false;
- if(keywordArgs.onError){
- var scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
- keywordArgs.onError.call(scope, error);
- }
- });
- }
-
- }else if(this._jsonData){
- // Passed in data, no need to xhr.
- self._getItemsFromLoadedData(self._jsonData);
- self._jsonData = null;
- self._loadFinished = true;
- item = self._getItemByIdentity(keywordArgs.identity);
- if(keywordArgs.onItem){
- scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
- keywordArgs.onItem.call(scope, item);
- }
- }
- }else{
- // Already loaded. We can just look it up and call back.
- item = this._getItemByIdentity(keywordArgs.identity);
- if(keywordArgs.onItem){
- scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
- keywordArgs.onItem.call(scope, item);
- }
- }
- },
-
- _getItemByIdentity: function(/* Object */ identity){
- // summary:
- // Internal function to look an item up by its identity map.
- var item = null;
- if(this._itemsByIdentity &&
- Object.hasOwnProperty.call(this._itemsByIdentity, identity)){
- item = this._itemsByIdentity[identity];
- }else if (Object.hasOwnProperty.call(this._arrayOfAllItems, identity)){
- item = this._arrayOfAllItems[identity];
- }
- if(item === undefined){
- item = null;
- }
- return item; // Object
- },
-
- getIdentityAttributes: function(/* item */ item){
- // summary:
- // See dojo.data.api.Identity.getIdentityAttributes()
-
- var identifier = this._features['dojo.data.api.Identity'];
- if(identifier === Number){
- // If (identifier === Number) it means getIdentity() just returns
- // an integer item-number for each item. The dojo.data.api.Identity
- // spec says we need to return null if the identity is not composed
- // of attributes
- return null; // null
- }else{
- return [identifier]; // Array
- }
- },
-
- _forceLoad: function(){
- // summary:
- // Internal function to force a load of the store if it hasn't occurred yet. This is required
- // for specific functions to work properly.
- var self = this;
- //Do a check on the JsonFileUrl and crosscheck it.
- //If it doesn't match the cross-check, it needs to be updated
- //This allows for either url or _jsonFileUrl to he changed to
- //reset the store load location. Done this way for backwards
- //compatibility. People use _jsonFileUrl (even though officially
- //private.
- if(this._jsonFileUrl !== this._ccUrl){
- dojo.deprecated("dojo.data.ItemFileReadStore: ",
- "To change the url, set the url property of the store," +
- " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");
- this._ccUrl = this._jsonFileUrl;
- this.url = this._jsonFileUrl;
- }else if(this.url !== this._ccUrl){
- this._jsonFileUrl = this.url;
- this._ccUrl = this.url;
- }
-
- //See if there was any forced reset of data.
- if(this.data != null){
- this._jsonData = this.data;
- this.data = null;
- }
-
- if(this._jsonFileUrl){
- var getArgs = {
- url: this._jsonFileUrl,
- handleAs: "json-comment-optional",
- preventCache: this.urlPreventCache,
- failOk: this.failOk,
- sync: true
- };
- var getHandler = dojo.xhrGet(getArgs);
- getHandler.addCallback(function(data){
- try{
- //Check to be sure there wasn't another load going on concurrently
- //So we don't clobber data that comes in on it. If there is a load going on
- //then do not save this data. It will potentially clobber current data.
- //We mainly wanted to sync/wait here.
- //TODO: Revisit the loading scheme of this store to improve multi-initial
- //request handling.
- if(self._loadInProgress !== true && !self._loadFinished){
- self._getItemsFromLoadedData(data);
- self._loadFinished = true;
- }else if(self._loadInProgress){
- //Okay, we hit an error state we can't recover from. A forced load occurred
- //while an async load was occurring. Since we cannot block at this point, the best
- //that can be managed is to throw an error.
- throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress.");
- }
- }catch(e){
- console.log(e);
- throw e;
- }
- });
- getHandler.addErrback(function(error){
- throw error;
- });
- }else if(this._jsonData){
- self._getItemsFromLoadedData(self._jsonData);
- self._jsonData = null;
- self._loadFinished = true;
- }
- }
-});
-//Mix in the simple fetch implementation to this class.
-dojo.extend(dojo.data.ItemFileReadStore,dojo.data.util.simpleFetch);
-
-}
+//>>built
+define("dojo/data/ItemFileReadStore",["../_base/kernel","../_base/lang","../_base/declare","../_base/array","../_base/xhr","../Evented","../_base/window","./util/filter","./util/simpleFetch","../date/stamp"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){var _b=_3("dojo.data.ItemFileReadStore",[_6],{constructor:function(_c){this._arrayOfAllItems=[];this._arrayOfTopLevelItems=[];this._loadFinished=false;this._jsonFileUrl=_c.url;this._ccUrl=_c.url;this.url=_c.url;this._jsonData=_c.data;this.data=null;this._datatypeMap=_c.typeMap||{};if(!this._datatypeMap["Date"]){this._datatypeMap["Date"]={type:Date,deserialize:function(_d){return _a.fromISOString(_d);}};}this._features={"dojo.data.api.Read":true,"dojo.data.api.Identity":true};this._itemsByIdentity=null;this._storeRefPropName="_S";this._itemNumPropName="_0";this._rootItemPropName="_RI";this._reverseRefMap="_RRM";this._loadInProgress=false;this._queuedFetches=[];if(_c.urlPreventCache!==undefined){this.urlPreventCache=_c.urlPreventCache?true:false;}if(_c.hierarchical!==undefined){this.hierarchical=_c.hierarchical?true:false;}if(_c.clearOnClose){this.clearOnClose=true;}if("failOk" in _c){this.failOk=_c.failOk?true:false;}},url:"",_ccUrl:"",data:null,typeMap:null,clearOnClose:false,urlPreventCache:false,failOk:false,hierarchical:true,_assertIsItem:function(_e){if(!this.isItem(_e)){throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");}},_assertIsAttribute:function(_f){if(typeof _f!=="string"){throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");}},getValue:function(_10,_11,_12){var _13=this.getValues(_10,_11);return (_13.length>0)?_13[0]:_12;},getValues:function(_14,_15){this._assertIsItem(_14);this._assertIsAttribute(_15);return (_14[_15]||[]).slice(0);},getAttributes:function(_16){this._assertIsItem(_16);var _17=[];for(var key in _16){if((key!==this._storeRefPropName)&&(key!==this._itemNumPropName)&&(key!==this._rootItemPropName)&&(key!==this._reverseRefMap)){_17.push(key);}}return _17;},hasAttribute:function(_18,_19){this._assertIsItem(_18);this._assertIsAttribute(_19);return (_19 in _18);},containsValue:function(_1a,_1b,_1c){var _1d=undefined;if(typeof _1c==="string"){_1d=_8.patternToRegExp(_1c,false);}return this._containsValue(_1a,_1b,_1c,_1d);},_containsValue:function(_1e,_1f,_20,_21){return _4.some(this.getValues(_1e,_1f),function(_22){if(_22!==null&&!_2.isObject(_22)&&_21){if(_22.toString().match(_21)){return true;}}else{if(_20===_22){return true;}}});},isItem:function(_23){if(_23&&_23[this._storeRefPropName]===this){if(this._arrayOfAllItems[_23[this._itemNumPropName]]===_23){return true;}}return false;},isItemLoaded:function(_24){return this.isItem(_24);},loadItem:function(_25){this._assertIsItem(_25.item);},getFeatures:function(){return this._features;},getLabel:function(_26){if(this._labelAttr&&this.isItem(_26)){return this.getValue(_26,this._labelAttr);}return undefined;},getLabelAttributes:function(_27){if(this._labelAttr){return [this._labelAttr];}return null;},_fetchItems:function(_28,_29,_2a){var _2b=this,_2c=function(_2d,_2e){var _2f=[],i,key;if(_2d.query){var _30,_31=_2d.queryOptions?_2d.queryOptions.ignoreCase:false;var _32={};for(key in _2d.query){_30=_2d.query[key];if(typeof _30==="string"){_32[key]=_8.patternToRegExp(_30,_31);}else{if(_30 instanceof RegExp){_32[key]=_30;}}}for(i=0;i<_2e.length;++i){var _33=true;var _34=_2e[i];if(_34===null){_33=false;}else{for(key in _2d.query){_30=_2d.query[key];if(!_2b._containsValue(_34,key,_30,_32[key])){_33=false;}}}if(_33){_2f.push(_34);}}_29(_2f,_2d);}else{for(i=0;i<_2e.length;++i){var _35=_2e[i];if(_35!==null){_2f.push(_35);}}_29(_2f,_2d);}};if(this._loadFinished){_2c(_28,this._getItemsArray(_28.queryOptions));}else{if(this._jsonFileUrl!==this._ccUrl){_1.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){if(this._loadInProgress){this._queuedFetches.push({args:_28,filter:_2c});}else{this._loadInProgress=true;var _36={url:_2b._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _37=_5.get(_36);_37.addCallback(function(_38){try{_2b._getItemsFromLoadedData(_38);_2b._loadFinished=true;_2b._loadInProgress=false;_2c(_28,_2b._getItemsArray(_28.queryOptions));_2b._handleQueuedFetches();}catch(e){_2b._loadFinished=true;_2b._loadInProgress=false;_2a(e,_28);}});_37.addErrback(function(_39){_2b._loadInProgress=false;_2a(_39,_28);});var _3a=null;if(_28.abort){_3a=_28.abort;}_28.abort=function(){var df=_37;if(df&&df.fired===-1){df.cancel();df=null;}if(_3a){_3a.call(_28);}};}}else{if(this._jsonData){try{this._loadFinished=true;this._getItemsFromLoadedData(this._jsonData);this._jsonData=null;_2c(_28,this._getItemsArray(_28.queryOptions));}catch(e){_2a(e,_28);}}else{_2a(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."),_28);}}}},_handleQueuedFetches:function(){if(this._queuedFetches.length>0){for(var i=0;i<this._queuedFetches.length;i++){var _3b=this._queuedFetches[i],_3c=_3b.args,_3d=_3b.filter;if(_3d){_3d(_3c,this._getItemsArray(_3c.queryOptions));}else{this.fetchItemByIdentity(_3c);}}this._queuedFetches=[];}},_getItemsArray:function(_3e){if(_3e&&_3e.deep){return this._arrayOfAllItems;}return this._arrayOfTopLevelItems;},close:function(_3f){if(this.clearOnClose&&this._loadFinished&&!this._loadInProgress){if(((this._jsonFileUrl==""||this._jsonFileUrl==null)&&(this.url==""||this.url==null))&&this.data==null){}this._arrayOfAllItems=[];this._arrayOfTopLevelItems=[];this._loadFinished=false;this._itemsByIdentity=null;this._loadInProgress=false;this._queuedFetches=[];}},_getItemsFromLoadedData:function(_40){var _41=false,_42=this;function _43(_44){return (_44!==null)&&(typeof _44==="object")&&(!_2.isArray(_44)||_41)&&(!_2.isFunction(_44))&&(_44.constructor==Object||_2.isArray(_44))&&(typeof _44._reference==="undefined")&&(typeof _44._type==="undefined")&&(typeof _44._value==="undefined")&&_42.hierarchical;};function _45(_46){_42._arrayOfAllItems.push(_46);for(var _47 in _46){var _48=_46[_47];if(_48){if(_2.isArray(_48)){var _49=_48;for(var k=0;k<_49.length;++k){var _4a=_49[k];if(_43(_4a)){_45(_4a);}}}else{if(_43(_48)){_45(_48);}}}}};this._labelAttr=_40.label;var i,_4b;this._arrayOfAllItems=[];this._arrayOfTopLevelItems=_40.items;for(i=0;i<this._arrayOfTopLevelItems.length;++i){_4b=this._arrayOfTopLevelItems[i];if(_2.isArray(_4b)){_41=true;}_45(_4b);_4b[this._rootItemPropName]=true;}var _4c={},key;for(i=0;i<this._arrayOfAllItems.length;++i){_4b=this._arrayOfAllItems[i];for(key in _4b){if(key!==this._rootItemPropName){var _4d=_4b[key];if(_4d!==null){if(!_2.isArray(_4d)){_4b[key]=[_4d];}}else{_4b[key]=[null];}}_4c[key]=key;}}while(_4c[this._storeRefPropName]){this._storeRefPropName+="_";}while(_4c[this._itemNumPropName]){this._itemNumPropName+="_";}while(_4c[this._reverseRefMap]){this._reverseRefMap+="_";}var _4e;var _4f=_40.identifier;if(_4f){this._itemsByIdentity={};this._features["dojo.data.api.Identity"]=_4f;for(i=0;i<this._arrayOfAllItems.length;++i){_4b=this._arrayOfAllItems[i];_4e=_4b[_4f];var _50=_4e[0];if(!Object.hasOwnProperty.call(this._itemsByIdentity,_50)){this._itemsByIdentity[_50]=_4b;}else{if(this._jsonFileUrl){throw new Error("dojo.data.ItemFileReadStore: The json data as specified by: ["+this._jsonFileUrl+"] is malformed. Items within the list have identifier: ["+_4f+"]. Value collided: ["+_50+"]");}else{if(this._jsonData){throw new Error("dojo.data.ItemFileReadStore: The json data provided by the creation arguments is malformed. Items within the list have identifier: ["+_4f+"]. Value collided: ["+_50+"]");}}}}}else{this._features["dojo.data.api.Identity"]=Number;}for(i=0;i<this._arrayOfAllItems.length;++i){_4b=this._arrayOfAllItems[i];_4b[this._storeRefPropName]=this;_4b[this._itemNumPropName]=i;}for(i=0;i<this._arrayOfAllItems.length;++i){_4b=this._arrayOfAllItems[i];for(key in _4b){_4e=_4b[key];for(var j=0;j<_4e.length;++j){_4d=_4e[j];if(_4d!==null&&typeof _4d=="object"){if(("_type" in _4d)&&("_value" in _4d)){var _51=_4d._type;var _52=this._datatypeMap[_51];if(!_52){throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '"+_51+"'");}else{if(_2.isFunction(_52)){_4e[j]=new _52(_4d._value);}else{if(_2.isFunction(_52.deserialize)){_4e[j]=_52.deserialize(_4d._value);}else{throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");}}}}if(_4d._reference){var _53=_4d._reference;if(!_2.isObject(_53)){_4e[j]=this._getItemByIdentity(_53);}else{for(var k=0;k<this._arrayOfAllItems.length;++k){var _54=this._arrayOfAllItems[k],_55=true;for(var _56 in _53){if(_54[_56]!=_53[_56]){_55=false;}}if(_55){_4e[j]=_54;}}}if(this.referenceIntegrity){var _57=_4e[j];if(this.isItem(_57)){this._addReferenceToMap(_57,_4b,key);}}}else{if(this.isItem(_4d)){if(this.referenceIntegrity){this._addReferenceToMap(_4d,_4b,key);}}}}}}}},_addReferenceToMap:function(_58,_59,_5a){},getIdentity:function(_5b){var _5c=this._features["dojo.data.api.Identity"];if(_5c===Number){return _5b[this._itemNumPropName];}else{var _5d=_5b[_5c];if(_5d){return _5d[0];}}return null;},fetchItemByIdentity:function(_5e){var _5f,_60;if(!this._loadFinished){var _61=this;if(this._jsonFileUrl!==this._ccUrl){_1.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null&&this._jsonData==null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){if(this._loadInProgress){this._queuedFetches.push({args:_5e});}else{this._loadInProgress=true;var _62={url:_61._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _63=_5.get(_62);_63.addCallback(function(_64){var _65=_5e.scope?_5e.scope:_7.global;try{_61._getItemsFromLoadedData(_64);_61._loadFinished=true;_61._loadInProgress=false;_5f=_61._getItemByIdentity(_5e.identity);if(_5e.onItem){_5e.onItem.call(_65,_5f);}_61._handleQueuedFetches();}catch(error){_61._loadInProgress=false;if(_5e.onError){_5e.onError.call(_65,error);}}});_63.addErrback(function(_66){_61._loadInProgress=false;if(_5e.onError){var _67=_5e.scope?_5e.scope:_7.global;_5e.onError.call(_67,_66);}});}}else{if(this._jsonData){_61._getItemsFromLoadedData(_61._jsonData);_61._jsonData=null;_61._loadFinished=true;_5f=_61._getItemByIdentity(_5e.identity);if(_5e.onItem){_60=_5e.scope?_5e.scope:_7.global;_5e.onItem.call(_60,_5f);}}}}else{_5f=this._getItemByIdentity(_5e.identity);if(_5e.onItem){_60=_5e.scope?_5e.scope:_7.global;_5e.onItem.call(_60,_5f);}}},_getItemByIdentity:function(_68){var _69=null;if(this._itemsByIdentity){if(Object.hasOwnProperty.call(this._itemsByIdentity,_68)){_69=this._itemsByIdentity[_68];}}else{if(Object.hasOwnProperty.call(this._arrayOfAllItems,_68)){_69=this._arrayOfAllItems[_68];}}if(_69===undefined){_69=null;}return _69;},getIdentityAttributes:function(_6a){var _6b=this._features["dojo.data.api.Identity"];if(_6b===Number){return null;}else{return [_6b];}},_forceLoad:function(){var _6c=this;if(this._jsonFileUrl!==this._ccUrl){_1.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){var _6d={url:this._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk,sync:true};var _6e=_5.get(_6d);_6e.addCallback(function(_6f){try{if(_6c._loadInProgress!==true&&!_6c._loadFinished){_6c._getItemsFromLoadedData(_6f);_6c._loadFinished=true;}else{if(_6c._loadInProgress){throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress.");}}}catch(e){throw e;}});_6e.addErrback(function(_70){throw _70;});}else{if(this._jsonData){_6c._getItemsFromLoadedData(_6c._jsonData);_6c._jsonData=null;_6c._loadFinished=true;}}}});_2.extend(_b,_9);return _b;}); \ No newline at end of file
diff --git a/lib/dojo/data/ItemFileReadStore.js.uncompressed.js b/lib/dojo/data/ItemFileReadStore.js.uncompressed.js
new file mode 100644
index 000000000..431831a04
--- /dev/null
+++ b/lib/dojo/data/ItemFileReadStore.js.uncompressed.js
@@ -0,0 +1,945 @@
+define("dojo/data/ItemFileReadStore", ["../_base/kernel", "../_base/lang", "../_base/declare", "../_base/array", "../_base/xhr",
+ "../Evented", "../_base/window", "./util/filter", "./util/simpleFetch", "../date/stamp"
+], function(kernel, lang, declare, array, xhr, Evented, window, filterUtil, simpleFetch, dateStamp) {
+ // module:
+ // dojo/data/ItemFileReadStore
+ // summary:
+ // TODOC
+
+
+var ItemFileReadStore = declare("dojo.data.ItemFileReadStore", [Evented],{
+ // summary:
+ // The ItemFileReadStore implements the dojo.data.api.Read API and reads
+ // data from JSON files that have contents in this format --
+ // { items: [
+ // { name:'Kermit', color:'green', age:12, friends:['Gonzo', {_reference:{name:'Fozzie Bear'}}]},
+ // { name:'Fozzie Bear', wears:['hat', 'tie']},
+ // { name:'Miss Piggy', pets:'Foo-Foo'}
+ // ]}
+ // Note that it can also contain an 'identifer' property that specified which attribute on the items
+ // in the array of items that acts as the unique identifier for that item.
+ //
+ constructor: function(/* Object */ keywordParameters){
+ // summary: constructor
+ // keywordParameters: {url: String}
+ // keywordParameters: {data: jsonObject}
+ // keywordParameters: {typeMap: object)
+ // The structure of the typeMap object is as follows:
+ // {
+ // type0: function || object,
+ // type1: function || object,
+ // ...
+ // typeN: function || object
+ // }
+ // Where if it is a function, it is assumed to be an object constructor that takes the
+ // value of _value as the initialization parameters. If it is an object, then it is assumed
+ // to be an object of general form:
+ // {
+ // type: function, //constructor.
+ // deserialize: function(value) //The function that parses the value and constructs the object defined by type appropriately.
+ // }
+
+ this._arrayOfAllItems = [];
+ this._arrayOfTopLevelItems = [];
+ this._loadFinished = false;
+ this._jsonFileUrl = keywordParameters.url;
+ this._ccUrl = keywordParameters.url;
+ this.url = keywordParameters.url;
+ this._jsonData = keywordParameters.data;
+ this.data = null;
+ this._datatypeMap = keywordParameters.typeMap || {};
+ if(!this._datatypeMap['Date']){
+ //If no default mapping for dates, then set this as default.
+ //We use the dojo.date.stamp here because the ISO format is the 'dojo way'
+ //of generically representing dates.
+ this._datatypeMap['Date'] = {
+ type: Date,
+ deserialize: function(value){
+ return dateStamp.fromISOString(value);
+ }
+ };
+ }
+ this._features = {'dojo.data.api.Read':true, 'dojo.data.api.Identity':true};
+ this._itemsByIdentity = null;
+ this._storeRefPropName = "_S"; // Default name for the store reference to attach to every item.
+ this._itemNumPropName = "_0"; // Default Item Id for isItem to attach to every item.
+ this._rootItemPropName = "_RI"; // Default Item Id for isItem to attach to every item.
+ this._reverseRefMap = "_RRM"; // Default attribute for constructing a reverse reference map for use with reference integrity
+ this._loadInProgress = false; //Got to track the initial load to prevent duelling loads of the dataset.
+ this._queuedFetches = [];
+ if(keywordParameters.urlPreventCache !== undefined){
+ this.urlPreventCache = keywordParameters.urlPreventCache?true:false;
+ }
+ if(keywordParameters.hierarchical !== undefined){
+ this.hierarchical = keywordParameters.hierarchical?true:false;
+ }
+ if(keywordParameters.clearOnClose){
+ this.clearOnClose = true;
+ }
+ if("failOk" in keywordParameters){
+ this.failOk = keywordParameters.failOk?true:false;
+ }
+ },
+
+ url: "", // use "" rather than undefined for the benefit of the parser (#3539)
+
+ //Internal var, crossCheckUrl. Used so that setting either url or _jsonFileUrl, can still trigger a reload
+ //when clearOnClose and close is used.
+ _ccUrl: "",
+
+ data: null, // define this so that the parser can populate it
+
+ typeMap: null, //Define so parser can populate.
+
+ //Parameter to allow users to specify if a close call should force a reload or not.
+ //By default, it retains the old behavior of not clearing if close is called. But
+ //if set true, the store will be reset to default state. Note that by doing this,
+ //all item handles will become invalid and a new fetch must be issued.
+ clearOnClose: false,
+
+ //Parameter to allow specifying if preventCache should be passed to the xhrGet call or not when loading data from a url.
+ //Note this does not mean the store calls the server on each fetch, only that the data load has preventCache set as an option.
+ //Added for tracker: #6072
+ urlPreventCache: false,
+
+ //Parameter for specifying that it is OK for the xhrGet call to fail silently.
+ failOk: false,
+
+ //Parameter to indicate to process data from the url as hierarchical
+ //(data items can contain other data items in js form). Default is true
+ //for backwards compatibility. False means only root items are processed
+ //as items, all child objects outside of type-mapped objects and those in
+ //specific reference format, are left straight JS data objects.
+ hierarchical: true,
+
+ _assertIsItem: function(/* item */ item){
+ // summary:
+ // This function tests whether the item passed in is indeed an item in the store.
+ // item:
+ // The item to test for being contained by the store.
+ if(!this.isItem(item)){
+ throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");
+ }
+ },
+
+ _assertIsAttribute: function(/* attribute-name-string */ attribute){
+ // summary:
+ // This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
+ // attribute:
+ // The attribute to test for being contained by the store.
+ if(typeof attribute !== "string"){
+ throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");
+ }
+ },
+
+ getValue: function( /* item */ item,
+ /* attribute-name-string */ attribute,
+ /* value? */ defaultValue){
+ // summary:
+ // See dojo.data.api.Read.getValue()
+ var values = this.getValues(item, attribute);
+ return (values.length > 0)?values[0]:defaultValue; // mixed
+ },
+
+ getValues: function(/* item */ item,
+ /* attribute-name-string */ attribute){
+ // summary:
+ // See dojo.data.api.Read.getValues()
+
+ this._assertIsItem(item);
+ this._assertIsAttribute(attribute);
+ // Clone it before returning. refs: #10474
+ return (item[attribute] || []).slice(0); // Array
+ },
+
+ getAttributes: function(/* item */ item){
+ // summary:
+ // See dojo.data.api.Read.getAttributes()
+ this._assertIsItem(item);
+ var attributes = [];
+ for(var key in item){
+ // Save off only the real item attributes, not the special id marks for O(1) isItem.
+ if((key !== this._storeRefPropName) && (key !== this._itemNumPropName) && (key !== this._rootItemPropName) && (key !== this._reverseRefMap)){
+ attributes.push(key);
+ }
+ }
+ return attributes; // Array
+ },
+
+ hasAttribute: function( /* item */ item,
+ /* attribute-name-string */ attribute){
+ // summary:
+ // See dojo.data.api.Read.hasAttribute()
+ this._assertIsItem(item);
+ this._assertIsAttribute(attribute);
+ return (attribute in item);
+ },
+
+ containsValue: function(/* item */ item,
+ /* attribute-name-string */ attribute,
+ /* anything */ value){
+ // summary:
+ // See dojo.data.api.Read.containsValue()
+ var regexp = undefined;
+ if(typeof value === "string"){
+ regexp = filterUtil.patternToRegExp(value, false);
+ }
+ return this._containsValue(item, attribute, value, regexp); //boolean.
+ },
+
+ _containsValue: function( /* item */ item,
+ /* attribute-name-string */ attribute,
+ /* anything */ value,
+ /* RegExp?*/ regexp){
+ // summary:
+ // Internal function for looking at the values contained by the item.
+ // description:
+ // Internal function for looking at the values contained by the item. This
+ // function allows for denoting if the comparison should be case sensitive for
+ // strings or not (for handling filtering cases where string case should not matter)
+ //
+ // item:
+ // The data item to examine for attribute values.
+ // attribute:
+ // The attribute to inspect.
+ // value:
+ // The value to match.
+ // regexp:
+ // Optional regular expression generated off value if value was of string type to handle wildcarding.
+ // If present and attribute values are string, then it can be used for comparison instead of 'value'
+ return array.some(this.getValues(item, attribute), function(possibleValue){
+ if(possibleValue !== null && !lang.isObject(possibleValue) && regexp){
+ if(possibleValue.toString().match(regexp)){
+ return true; // Boolean
+ }
+ }else if(value === possibleValue){
+ return true; // Boolean
+ }
+ });
+ },
+
+ isItem: function(/* anything */ something){
+ // summary:
+ // See dojo.data.api.Read.isItem()
+ if(something && something[this._storeRefPropName] === this){
+ if(this._arrayOfAllItems[something[this._itemNumPropName]] === something){
+ return true;
+ }
+ }
+ return false; // Boolean
+ },
+
+ isItemLoaded: function(/* anything */ something){
+ // summary:
+ // See dojo.data.api.Read.isItemLoaded()
+ return this.isItem(something); //boolean
+ },
+
+ loadItem: function(/* object */ keywordArgs){
+ // summary:
+ // See dojo.data.api.Read.loadItem()
+ this._assertIsItem(keywordArgs.item);
+ },
+
+ getFeatures: function(){
+ // summary:
+ // See dojo.data.api.Read.getFeatures()
+ return this._features; //Object
+ },
+
+ getLabel: function(/* item */ item){
+ // summary:
+ // See dojo.data.api.Read.getLabel()
+ if(this._labelAttr && this.isItem(item)){
+ return this.getValue(item,this._labelAttr); //String
+ }
+ return undefined; //undefined
+ },
+
+ getLabelAttributes: function(/* item */ item){
+ // summary:
+ // See dojo.data.api.Read.getLabelAttributes()
+ if(this._labelAttr){
+ return [this._labelAttr]; //array
+ }
+ return null; //null
+ },
+
+ _fetchItems: function( /* Object */ keywordArgs,
+ /* Function */ findCallback,
+ /* Function */ errorCallback){
+ // summary:
+ // See dojo.data.util.simpleFetch.fetch()
+ var self = this,
+ filter = function(requestArgs, arrayOfItems){
+ var items = [],
+ i, key;
+ if(requestArgs.query){
+ var value,
+ ignoreCase = requestArgs.queryOptions ? requestArgs.queryOptions.ignoreCase : false;
+
+ //See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the
+ //same value for each item examined. Much more efficient.
+ var regexpList = {};
+ for(key in requestArgs.query){
+ value = requestArgs.query[key];
+ if(typeof value === "string"){
+ regexpList[key] = filterUtil.patternToRegExp(value, ignoreCase);
+ }else if(value instanceof RegExp){
+ regexpList[key] = value;
+ }
+ }
+ for(i = 0; i < arrayOfItems.length; ++i){
+ var match = true;
+ var candidateItem = arrayOfItems[i];
+ if(candidateItem === null){
+ match = false;
+ }else{
+ for(key in requestArgs.query){
+ value = requestArgs.query[key];
+ if(!self._containsValue(candidateItem, key, value, regexpList[key])){
+ match = false;
+ }
+ }
+ }
+ if(match){
+ items.push(candidateItem);
+ }
+ }
+ findCallback(items, requestArgs);
+ }else{
+ // We want a copy to pass back in case the parent wishes to sort the array.
+ // We shouldn't allow resort of the internal list, so that multiple callers
+ // can get lists and sort without affecting each other. We also need to
+ // filter out any null values that have been left as a result of deleteItem()
+ // calls in ItemFileWriteStore.
+ for(i = 0; i < arrayOfItems.length; ++i){
+ var item = arrayOfItems[i];
+ if(item !== null){
+ items.push(item);
+ }
+ }
+ findCallback(items, requestArgs);
+ }
+ };
+
+ if(this._loadFinished){
+ filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
+ }else{
+ //Do a check on the JsonFileUrl and crosscheck it.
+ //If it doesn't match the cross-check, it needs to be updated
+ //This allows for either url or _jsonFileUrl to he changed to
+ //reset the store load location. Done this way for backwards
+ //compatibility. People use _jsonFileUrl (even though officially
+ //private.
+ if(this._jsonFileUrl !== this._ccUrl){
+ kernel.deprecated("dojo.data.ItemFileReadStore: ",
+ "To change the url, set the url property of the store," +
+ " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");
+ this._ccUrl = this._jsonFileUrl;
+ this.url = this._jsonFileUrl;
+ }else if(this.url !== this._ccUrl){
+ this._jsonFileUrl = this.url;
+ this._ccUrl = this.url;
+ }
+
+ //See if there was any forced reset of data.
+ if(this.data != null){
+ this._jsonData = this.data;
+ this.data = null;
+ }
+
+ if(this._jsonFileUrl){
+ //If fetches come in before the loading has finished, but while
+ //a load is in progress, we have to defer the fetching to be
+ //invoked in the callback.
+ if(this._loadInProgress){
+ this._queuedFetches.push({args: keywordArgs, filter: filter});
+ }else{
+ this._loadInProgress = true;
+ var getArgs = {
+ url: self._jsonFileUrl,
+ handleAs: "json-comment-optional",
+ preventCache: this.urlPreventCache,
+ failOk: this.failOk
+ };
+ var getHandler = xhr.get(getArgs);
+ getHandler.addCallback(function(data){
+ try{
+ self._getItemsFromLoadedData(data);
+ self._loadFinished = true;
+ self._loadInProgress = false;
+
+ filter(keywordArgs, self._getItemsArray(keywordArgs.queryOptions));
+ self._handleQueuedFetches();
+ }catch(e){
+ self._loadFinished = true;
+ self._loadInProgress = false;
+ errorCallback(e, keywordArgs);
+ }
+ });
+ getHandler.addErrback(function(error){
+ self._loadInProgress = false;
+ errorCallback(error, keywordArgs);
+ });
+
+ //Wire up the cancel to abort of the request
+ //This call cancel on the deferred if it hasn't been called
+ //yet and then will chain to the simple abort of the
+ //simpleFetch keywordArgs
+ var oldAbort = null;
+ if(keywordArgs.abort){
+ oldAbort = keywordArgs.abort;
+ }
+ keywordArgs.abort = function(){
+ var df = getHandler;
+ if(df && df.fired === -1){
+ df.cancel();
+ df = null;
+ }
+ if(oldAbort){
+ oldAbort.call(keywordArgs);
+ }
+ };
+ }
+ }else if(this._jsonData){
+ try{
+ this._loadFinished = true;
+ this._getItemsFromLoadedData(this._jsonData);
+ this._jsonData = null;
+ filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
+ }catch(e){
+ errorCallback(e, keywordArgs);
+ }
+ }else{
+ errorCallback(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."), keywordArgs);
+ }
+ }
+ },
+
+ _handleQueuedFetches: function(){
+ // summary:
+ // Internal function to execute delayed request in the store.
+ //Execute any deferred fetches now.
+ if(this._queuedFetches.length > 0){
+ for(var i = 0; i < this._queuedFetches.length; i++){
+ var fData = this._queuedFetches[i],
+ delayedQuery = fData.args,
+ delayedFilter = fData.filter;
+ if(delayedFilter){
+ delayedFilter(delayedQuery, this._getItemsArray(delayedQuery.queryOptions));
+ }else{
+ this.fetchItemByIdentity(delayedQuery);
+ }
+ }
+ this._queuedFetches = [];
+ }
+ },
+
+ _getItemsArray: function(/*object?*/queryOptions){
+ // summary:
+ // Internal function to determine which list of items to search over.
+ // queryOptions: The query options parameter, if any.
+ if(queryOptions && queryOptions.deep){
+ return this._arrayOfAllItems;
+ }
+ return this._arrayOfTopLevelItems;
+ },
+
+ close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
+ // summary:
+ // See dojo.data.api.Read.close()
+ if(this.clearOnClose &&
+ this._loadFinished &&
+ !this._loadInProgress){
+ //Reset all internalsback to default state. This will force a reload
+ //on next fetch. This also checks that the data or url param was set
+ //so that the store knows it can get data. Without one of those being set,
+ //the next fetch will trigger an error.
+
+ if(((this._jsonFileUrl == "" || this._jsonFileUrl == null) &&
+ (this.url == "" || this.url == null)
+ ) && this.data == null){
+ console.debug("dojo.data.ItemFileReadStore: WARNING! Data reload " +
+ " information has not been provided." +
+ " Please set 'url' or 'data' to the appropriate value before" +
+ " the next fetch");
+ }
+ this._arrayOfAllItems = [];
+ this._arrayOfTopLevelItems = [];
+ this._loadFinished = false;
+ this._itemsByIdentity = null;
+ this._loadInProgress = false;
+ this._queuedFetches = [];
+ }
+ },
+
+ _getItemsFromLoadedData: function(/* Object */ dataObject){
+ // summary:
+ // Function to parse the loaded data into item format and build the internal items array.
+ // description:
+ // Function to parse the loaded data into item format and build the internal items array.
+ //
+ // dataObject:
+ // The JS data object containing the raw data to convery into item format.
+ //
+ // returns: array
+ // Array of items in store item format.
+
+ // First, we define a couple little utility functions...
+ var addingArrays = false,
+ self = this;
+
+ function valueIsAnItem(/* anything */ aValue){
+ // summary:
+ // Given any sort of value that could be in the raw json data,
+ // return true if we should interpret the value as being an
+ // item itself, rather than a literal value or a reference.
+ // example:
+ // | false == valueIsAnItem("Kermit");
+ // | false == valueIsAnItem(42);
+ // | false == valueIsAnItem(new Date());
+ // | false == valueIsAnItem({_type:'Date', _value:'1802-05-14'});
+ // | false == valueIsAnItem({_reference:'Kermit'});
+ // | true == valueIsAnItem({name:'Kermit', color:'green'});
+ // | true == valueIsAnItem({iggy:'pop'});
+ // | true == valueIsAnItem({foo:42});
+ return (aValue !== null) &&
+ (typeof aValue === "object") &&
+ (!lang.isArray(aValue) || addingArrays) &&
+ (!lang.isFunction(aValue)) &&
+ (aValue.constructor == Object || lang.isArray(aValue)) &&
+ (typeof aValue._reference === "undefined") &&
+ (typeof aValue._type === "undefined") &&
+ (typeof aValue._value === "undefined") &&
+ self.hierarchical;
+ }
+
+ function addItemAndSubItemsToArrayOfAllItems(/* Item */ anItem){
+ self._arrayOfAllItems.push(anItem);
+ for(var attribute in anItem){
+ var valueForAttribute = anItem[attribute];
+ if(valueForAttribute){
+ if(lang.isArray(valueForAttribute)){
+ var valueArray = valueForAttribute;
+ for(var k = 0; k < valueArray.length; ++k){
+ var singleValue = valueArray[k];
+ if(valueIsAnItem(singleValue)){
+ addItemAndSubItemsToArrayOfAllItems(singleValue);
+ }
+ }
+ }else{
+ if(valueIsAnItem(valueForAttribute)){
+ addItemAndSubItemsToArrayOfAllItems(valueForAttribute);
+ }
+ }
+ }
+ }
+ }
+
+ this._labelAttr = dataObject.label;
+
+ // We need to do some transformations to convert the data structure
+ // that we read from the file into a format that will be convenient
+ // to work with in memory.
+
+ // Step 1: Walk through the object hierarchy and build a list of all items
+ var i,
+ item;
+ this._arrayOfAllItems = [];
+ this._arrayOfTopLevelItems = dataObject.items;
+
+ for(i = 0; i < this._arrayOfTopLevelItems.length; ++i){
+ item = this._arrayOfTopLevelItems[i];
+ if(lang.isArray(item)){
+ addingArrays = true;
+ }
+ addItemAndSubItemsToArrayOfAllItems(item);
+ item[this._rootItemPropName]=true;
+ }
+
+ // Step 2: Walk through all the attribute values of all the items,
+ // and replace single values with arrays. For example, we change this:
+ // { name:'Miss Piggy', pets:'Foo-Foo'}
+ // into this:
+ // { name:['Miss Piggy'], pets:['Foo-Foo']}
+ //
+ // We also store the attribute names so we can validate our store
+ // reference and item id special properties for the O(1) isItem
+ var allAttributeNames = {},
+ key;
+
+ for(i = 0; i < this._arrayOfAllItems.length; ++i){
+ item = this._arrayOfAllItems[i];
+ for(key in item){
+ if(key !== this._rootItemPropName){
+ var value = item[key];
+ if(value !== null){
+ if(!lang.isArray(value)){
+ item[key] = [value];
+ }
+ }else{
+ item[key] = [null];
+ }
+ }
+ allAttributeNames[key]=key;
+ }
+ }
+
+ // Step 3: Build unique property names to use for the _storeRefPropName and _itemNumPropName
+ // This should go really fast, it will generally never even run the loop.
+ while(allAttributeNames[this._storeRefPropName]){
+ this._storeRefPropName += "_";
+ }
+ while(allAttributeNames[this._itemNumPropName]){
+ this._itemNumPropName += "_";
+ }
+ while(allAttributeNames[this._reverseRefMap]){
+ this._reverseRefMap += "_";
+ }
+
+ // Step 4: Some data files specify an optional 'identifier', which is
+ // the name of an attribute that holds the identity of each item.
+ // If this data file specified an identifier attribute, then build a
+ // hash table of items keyed by the identity of the items.
+ var arrayOfValues;
+
+ var identifier = dataObject.identifier;
+ if(identifier){
+ this._itemsByIdentity = {};
+ this._features['dojo.data.api.Identity'] = identifier;
+ for(i = 0; i < this._arrayOfAllItems.length; ++i){
+ item = this._arrayOfAllItems[i];
+ arrayOfValues = item[identifier];
+ var identity = arrayOfValues[0];
+ if(!Object.hasOwnProperty.call(this._itemsByIdentity, identity)){
+ this._itemsByIdentity[identity] = item;
+ }else{
+ if(this._jsonFileUrl){
+ throw new Error("dojo.data.ItemFileReadStore: The json data as specified by: [" + this._jsonFileUrl + "] is malformed. Items within the list have identifier: [" + identifier + "]. Value collided: [" + identity + "]");
+ }else if(this._jsonData){
+ throw new Error("dojo.data.ItemFileReadStore: The json data provided by the creation arguments is malformed. Items within the list have identifier: [" + identifier + "]. Value collided: [" + identity + "]");
+ }
+ }
+ }
+ }else{
+ this._features['dojo.data.api.Identity'] = Number;
+ }
+
+ // Step 5: Walk through all the items, and set each item's properties
+ // for _storeRefPropName and _itemNumPropName, so that store.isItem() will return true.
+ for(i = 0; i < this._arrayOfAllItems.length; ++i){
+ item = this._arrayOfAllItems[i];
+ item[this._storeRefPropName] = this;
+ item[this._itemNumPropName] = i;
+ }
+
+ // Step 6: We walk through all the attribute values of all the items,
+ // looking for type/value literals and item-references.
+ //
+ // We replace item-references with pointers to items. For example, we change:
+ // { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
+ // into this:
+ // { name:['Kermit'], friends:[miss_piggy] }
+ // (where miss_piggy is the object representing the 'Miss Piggy' item).
+ //
+ // We replace type/value pairs with typed-literals. For example, we change:
+ // { name:['Nelson Mandela'], born:[{_type:'Date', _value:'1918-07-18'}] }
+ // into this:
+ // { name:['Kermit'], born:(new Date(1918, 6, 18)) }
+ //
+ // We also generate the associate map for all items for the O(1) isItem function.
+ for(i = 0; i < this._arrayOfAllItems.length; ++i){
+ item = this._arrayOfAllItems[i]; // example: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
+ for(key in item){
+ arrayOfValues = item[key]; // example: [{_reference:{name:'Miss Piggy'}}]
+ for(var j = 0; j < arrayOfValues.length; ++j){
+ value = arrayOfValues[j]; // example: {_reference:{name:'Miss Piggy'}}
+ if(value !== null && typeof value == "object"){
+ if(("_type" in value) && ("_value" in value)){
+ var type = value._type; // examples: 'Date', 'Color', or 'ComplexNumber'
+ var mappingObj = this._datatypeMap[type]; // examples: Date, dojo.Color, foo.math.ComplexNumber, {type: dojo.Color, deserialize(value){ return new dojo.Color(value)}}
+ if(!mappingObj){
+ throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '" + type + "'");
+ }else if(lang.isFunction(mappingObj)){
+ arrayOfValues[j] = new mappingObj(value._value);
+ }else if(lang.isFunction(mappingObj.deserialize)){
+ arrayOfValues[j] = mappingObj.deserialize(value._value);
+ }else{
+ throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");
+ }
+ }
+ if(value._reference){
+ var referenceDescription = value._reference; // example: {name:'Miss Piggy'}
+ if(!lang.isObject(referenceDescription)){
+ // example: 'Miss Piggy'
+ // from an item like: { name:['Kermit'], friends:[{_reference:'Miss Piggy'}]}
+ arrayOfValues[j] = this._getItemByIdentity(referenceDescription);
+ }else{
+ // example: {name:'Miss Piggy'}
+ // from an item like: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
+ for(var k = 0; k < this._arrayOfAllItems.length; ++k){
+ var candidateItem = this._arrayOfAllItems[k],
+ found = true;
+ for(var refKey in referenceDescription){
+ if(candidateItem[refKey] != referenceDescription[refKey]){
+ found = false;
+ }
+ }
+ if(found){
+ arrayOfValues[j] = candidateItem;
+ }
+ }
+ }
+ if(this.referenceIntegrity){
+ var refItem = arrayOfValues[j];
+ if(this.isItem(refItem)){
+ this._addReferenceToMap(refItem, item, key);
+ }
+ }
+ }else if(this.isItem(value)){
+ //It's a child item (not one referenced through _reference).
+ //We need to treat this as a referenced item, so it can be cleaned up
+ //in a write store easily.
+ if(this.referenceIntegrity){
+ this._addReferenceToMap(value, item, key);
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+
+ _addReferenceToMap: function(/*item*/ refItem, /*item*/ parentItem, /*string*/ attribute){
+ // summary:
+ // Method to add an reference map entry for an item and attribute.
+ // description:
+ // Method to add an reference map entry for an item and attribute. //
+ // refItem:
+ // The item that is referenced.
+ // parentItem:
+ // The item that holds the new reference to refItem.
+ // attribute:
+ // The attribute on parentItem that contains the new reference.
+
+ //Stub function, does nothing. Real processing is in ItemFileWriteStore.
+ },
+
+ getIdentity: function(/* item */ item){
+ // summary:
+ // See dojo.data.api.Identity.getIdentity()
+ var identifier = this._features['dojo.data.api.Identity'];
+ if(identifier === Number){
+ return item[this._itemNumPropName]; // Number
+ }else{
+ var arrayOfValues = item[identifier];
+ if(arrayOfValues){
+ return arrayOfValues[0]; // Object || String
+ }
+ }
+ return null; // null
+ },
+
+ fetchItemByIdentity: function(/* Object */ keywordArgs){
+ // summary:
+ // See dojo.data.api.Identity.fetchItemByIdentity()
+
+ // Hasn't loaded yet, we have to trigger the load.
+ var item,
+ scope;
+ if(!this._loadFinished){
+ var self = this;
+ //Do a check on the JsonFileUrl and crosscheck it.
+ //If it doesn't match the cross-check, it needs to be updated
+ //This allows for either url or _jsonFileUrl to he changed to
+ //reset the store load location. Done this way for backwards
+ //compatibility. People use _jsonFileUrl (even though officially
+ //private.
+ if(this._jsonFileUrl !== this._ccUrl){
+ kernel.deprecated("dojo.data.ItemFileReadStore: ",
+ "To change the url, set the url property of the store," +
+ " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");
+ this._ccUrl = this._jsonFileUrl;
+ this.url = this._jsonFileUrl;
+ }else if(this.url !== this._ccUrl){
+ this._jsonFileUrl = this.url;
+ this._ccUrl = this.url;
+ }
+
+ //See if there was any forced reset of data.
+ if(this.data != null && this._jsonData == null){
+ this._jsonData = this.data;
+ this.data = null;
+ }
+
+ if(this._jsonFileUrl){
+
+ if(this._loadInProgress){
+ this._queuedFetches.push({args: keywordArgs});
+ }else{
+ this._loadInProgress = true;
+ var getArgs = {
+ url: self._jsonFileUrl,
+ handleAs: "json-comment-optional",
+ preventCache: this.urlPreventCache,
+ failOk: this.failOk
+ };
+ var getHandler = xhr.get(getArgs);
+ getHandler.addCallback(function(data){
+ var scope = keywordArgs.scope?keywordArgs.scope:window.global;
+ try{
+ self._getItemsFromLoadedData(data);
+ self._loadFinished = true;
+ self._loadInProgress = false;
+ item = self._getItemByIdentity(keywordArgs.identity);
+ if(keywordArgs.onItem){
+ keywordArgs.onItem.call(scope, item);
+ }
+ self._handleQueuedFetches();
+ }catch(error){
+ self._loadInProgress = false;
+ if(keywordArgs.onError){
+ keywordArgs.onError.call(scope, error);
+ }
+ }
+ });
+ getHandler.addErrback(function(error){
+ self._loadInProgress = false;
+ if(keywordArgs.onError){
+ var scope = keywordArgs.scope?keywordArgs.scope:window.global;
+ keywordArgs.onError.call(scope, error);
+ }
+ });
+ }
+
+ }else if(this._jsonData){
+ // Passed in data, no need to xhr.
+ self._getItemsFromLoadedData(self._jsonData);
+ self._jsonData = null;
+ self._loadFinished = true;
+ item = self._getItemByIdentity(keywordArgs.identity);
+ if(keywordArgs.onItem){
+ scope = keywordArgs.scope?keywordArgs.scope:window.global;
+ keywordArgs.onItem.call(scope, item);
+ }
+ }
+ }else{
+ // Already loaded. We can just look it up and call back.
+ item = this._getItemByIdentity(keywordArgs.identity);
+ if(keywordArgs.onItem){
+ scope = keywordArgs.scope?keywordArgs.scope:window.global;
+ keywordArgs.onItem.call(scope, item);
+ }
+ }
+ },
+
+ _getItemByIdentity: function(/* Object */ identity){
+ // summary:
+ // Internal function to look an item up by its identity map.
+ var item = null;
+ if(this._itemsByIdentity){
+ // If this map is defined, we need to just try to get it. If it fails
+ // the item does not exist.
+ if(Object.hasOwnProperty.call(this._itemsByIdentity, identity)){
+ item = this._itemsByIdentity[identity];
+ }
+ }else if (Object.hasOwnProperty.call(this._arrayOfAllItems, identity)){
+ item = this._arrayOfAllItems[identity];
+ }
+ if(item === undefined){
+ item = null;
+ }
+ return item; // Object
+ },
+
+ getIdentityAttributes: function(/* item */ item){
+ // summary:
+ // See dojo.data.api.Identity.getIdentityAttributes()
+
+ var identifier = this._features['dojo.data.api.Identity'];
+ if(identifier === Number){
+ // If (identifier === Number) it means getIdentity() just returns
+ // an integer item-number for each item. The dojo.data.api.Identity
+ // spec says we need to return null if the identity is not composed
+ // of attributes
+ return null; // null
+ }else{
+ return [identifier]; // Array
+ }
+ },
+
+ _forceLoad: function(){
+ // summary:
+ // Internal function to force a load of the store if it hasn't occurred yet. This is required
+ // for specific functions to work properly.
+ var self = this;
+ //Do a check on the JsonFileUrl and crosscheck it.
+ //If it doesn't match the cross-check, it needs to be updated
+ //This allows for either url or _jsonFileUrl to he changed to
+ //reset the store load location. Done this way for backwards
+ //compatibility. People use _jsonFileUrl (even though officially
+ //private.
+ if(this._jsonFileUrl !== this._ccUrl){
+ kernel.deprecated("dojo.data.ItemFileReadStore: ",
+ "To change the url, set the url property of the store," +
+ " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");
+ this._ccUrl = this._jsonFileUrl;
+ this.url = this._jsonFileUrl;
+ }else if(this.url !== this._ccUrl){
+ this._jsonFileUrl = this.url;
+ this._ccUrl = this.url;
+ }
+
+ //See if there was any forced reset of data.
+ if(this.data != null){
+ this._jsonData = this.data;
+ this.data = null;
+ }
+
+ if(this._jsonFileUrl){
+ var getArgs = {
+ url: this._jsonFileUrl,
+ handleAs: "json-comment-optional",
+ preventCache: this.urlPreventCache,
+ failOk: this.failOk,
+ sync: true
+ };
+ var getHandler = xhr.get(getArgs);
+ getHandler.addCallback(function(data){
+ try{
+ //Check to be sure there wasn't another load going on concurrently
+ //So we don't clobber data that comes in on it. If there is a load going on
+ //then do not save this data. It will potentially clobber current data.
+ //We mainly wanted to sync/wait here.
+ //TODO: Revisit the loading scheme of this store to improve multi-initial
+ //request handling.
+ if(self._loadInProgress !== true && !self._loadFinished){
+ self._getItemsFromLoadedData(data);
+ self._loadFinished = true;
+ }else if(self._loadInProgress){
+ //Okay, we hit an error state we can't recover from. A forced load occurred
+ //while an async load was occurring. Since we cannot block at this point, the best
+ //that can be managed is to throw an error.
+ throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress.");
+ }
+ }catch(e){
+ console.log(e);
+ throw e;
+ }
+ });
+ getHandler.addErrback(function(error){
+ throw error;
+ });
+ }else if(this._jsonData){
+ self._getItemsFromLoadedData(self._jsonData);
+ self._jsonData = null;
+ self._loadFinished = true;
+ }
+ }
+});
+//Mix in the simple fetch implementation to this class.
+lang.extend(ItemFileReadStore,simpleFetch);
+
+return ItemFileReadStore;
+});
diff --git a/lib/dojo/data/ItemFileWriteStore.js b/lib/dojo/data/ItemFileWriteStore.js
index 2c0f3b326..25651cf92 100644
--- a/lib/dojo/data/ItemFileWriteStore.js
+++ b/lib/dojo/data/ItemFileWriteStore.js
@@ -4,815 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.data.ItemFileWriteStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.ItemFileWriteStore"] = true;
-dojo.provide("dojo.data.ItemFileWriteStore");
-dojo.require("dojo.data.ItemFileReadStore");
-
-
-dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
- constructor: function(/* object */ keywordParameters){
- // keywordParameters: {typeMap: object)
- // The structure of the typeMap object is as follows:
- // {
- // type0: function || object,
- // type1: function || object,
- // ...
- // typeN: function || object
- // }
- // Where if it is a function, it is assumed to be an object constructor that takes the
- // value of _value as the initialization parameters. It is serialized assuming object.toString()
- // serialization. If it is an object, then it is assumed
- // to be an object of general form:
- // {
- // type: function, //constructor.
- // deserialize: function(value) //The function that parses the value and constructs the object defined by type appropriately.
- // serialize: function(object) //The function that converts the object back into the proper file format form.
- // }
-
- // ItemFileWriteStore extends ItemFileReadStore to implement these additional dojo.data APIs
- this._features['dojo.data.api.Write'] = true;
- this._features['dojo.data.api.Notification'] = true;
-
- // For keeping track of changes so that we can implement isDirty and revert
- this._pending = {
- _newItems:{},
- _modifiedItems:{},
- _deletedItems:{}
- };
-
- if(!this._datatypeMap['Date'].serialize){
- this._datatypeMap['Date'].serialize = function(obj){
- return dojo.date.stamp.toISOString(obj, {zulu:true});
- };
- }
- //Disable only if explicitly set to false.
- if(keywordParameters && (keywordParameters.referenceIntegrity === false)){
- this.referenceIntegrity = false;
- }
-
- // this._saveInProgress is set to true, briefly, from when save() is first called to when it completes
- this._saveInProgress = false;
- },
-
- referenceIntegrity: true, //Flag that defaultly enabled reference integrity tracking. This way it can also be disabled pogrammatially or declaratively.
-
- _assert: function(/* boolean */ condition){
- if(!condition){
- throw new Error("assertion failed in ItemFileWriteStore");
- }
- },
-
- _getIdentifierAttribute: function(){
- var identifierAttribute = this.getFeatures()['dojo.data.api.Identity'];
- // this._assert((identifierAttribute === Number) || (dojo.isString(identifierAttribute)));
- return identifierAttribute;
- },
-
-
-/* dojo.data.api.Write */
-
- newItem: function(/* Object? */ keywordArgs, /* Object? */ parentInfo){
- // summary: See dojo.data.api.Write.newItem()
-
- this._assert(!this._saveInProgress);
-
- if(!this._loadFinished){
- // We need to do this here so that we'll be able to find out what
- // identifierAttribute was specified in the data file.
- this._forceLoad();
- }
-
- if(typeof keywordArgs != "object" && typeof keywordArgs != "undefined"){
- throw new Error("newItem() was passed something other than an object");
- }
- var newIdentity = null;
- var identifierAttribute = this._getIdentifierAttribute();
- if(identifierAttribute === Number){
- newIdentity = this._arrayOfAllItems.length;
- }else{
- newIdentity = keywordArgs[identifierAttribute];
- if(typeof newIdentity === "undefined"){
- throw new Error("newItem() was not passed an identity for the new item");
- }
- if(dojo.isArray(newIdentity)){
- throw new Error("newItem() was not passed an single-valued identity");
- }
- }
-
- // make sure this identity is not already in use by another item, if identifiers were
- // defined in the file. Otherwise it would be the item count,
- // which should always be unique in this case.
- if(this._itemsByIdentity){
- this._assert(typeof this._itemsByIdentity[newIdentity] === "undefined");
- }
- this._assert(typeof this._pending._newItems[newIdentity] === "undefined");
- this._assert(typeof this._pending._deletedItems[newIdentity] === "undefined");
-
- var newItem = {};
- newItem[this._storeRefPropName] = this;
- newItem[this._itemNumPropName] = this._arrayOfAllItems.length;
- if(this._itemsByIdentity){
- this._itemsByIdentity[newIdentity] = newItem;
- //We have to set the identifier now, otherwise we can't look it
- //up at calls to setValueorValues in parentInfo handling.
- newItem[identifierAttribute] = [newIdentity];
- }
- this._arrayOfAllItems.push(newItem);
-
- //We need to construct some data for the onNew call too...
- var pInfo = null;
-
- // Now we need to check to see where we want to assign this thingm if any.
- if(parentInfo && parentInfo.parent && parentInfo.attribute){
- pInfo = {
- item: parentInfo.parent,
- attribute: parentInfo.attribute,
- oldValue: undefined
- };
-
- //See if it is multi-valued or not and handle appropriately
- //Generally, all attributes are multi-valued for this store
- //So, we only need to append if there are already values present.
- var values = this.getValues(parentInfo.parent, parentInfo.attribute);
- if(values && values.length > 0){
- var tempValues = values.slice(0, values.length);
- if(values.length === 1){
- pInfo.oldValue = values[0];
- }else{
- pInfo.oldValue = values.slice(0, values.length);
- }
- tempValues.push(newItem);
- this._setValueOrValues(parentInfo.parent, parentInfo.attribute, tempValues, false);
- pInfo.newValue = this.getValues(parentInfo.parent, parentInfo.attribute);
- }else{
- this._setValueOrValues(parentInfo.parent, parentInfo.attribute, newItem, false);
- pInfo.newValue = newItem;
- }
- }else{
- //Toplevel item, add to both top list as well as all list.
- newItem[this._rootItemPropName]=true;
- this._arrayOfTopLevelItems.push(newItem);
- }
-
- this._pending._newItems[newIdentity] = newItem;
-
- //Clone over the properties to the new item
- for(var key in keywordArgs){
- if(key === this._storeRefPropName || key === this._itemNumPropName){
- // Bummer, the user is trying to do something like
- // newItem({_S:"foo"}). Unfortunately, our superclass,
- // ItemFileReadStore, is already using _S in each of our items
- // to hold private info. To avoid a naming collision, we
- // need to move all our private info to some other property
- // of all the items/objects. So, we need to iterate over all
- // the items and do something like:
- // item.__S = item._S;
- // item._S = undefined;
- // But first we have to make sure the new "__S" variable is
- // not in use, which means we have to iterate over all the
- // items checking for that.
- throw new Error("encountered bug in ItemFileWriteStore.newItem");
- }
- var value = keywordArgs[key];
- if(!dojo.isArray(value)){
- value = [value];
- }
- newItem[key] = value;
- if(this.referenceIntegrity){
- for(var i = 0; i < value.length; i++){
- var val = value[i];
- if(this.isItem(val)){
- this._addReferenceToMap(val, newItem, key);
- }
- }
- }
- }
- this.onNew(newItem, pInfo); // dojo.data.api.Notification call
- return newItem; // item
- },
-
- _removeArrayElement: function(/* Array */ array, /* anything */ element){
- var index = dojo.indexOf(array, element);
- if(index != -1){
- array.splice(index, 1);
- return true;
- }
- return false;
- },
-
- deleteItem: function(/* item */ item){
- // summary: See dojo.data.api.Write.deleteItem()
- this._assert(!this._saveInProgress);
- this._assertIsItem(item);
-
- // Remove this item from the _arrayOfAllItems, but leave a null value in place
- // of the item, so as not to change the length of the array, so that in newItem()
- // we can still safely do: newIdentity = this._arrayOfAllItems.length;
- var indexInArrayOfAllItems = item[this._itemNumPropName];
- var identity = this.getIdentity(item);
-
- //If we have reference integrity on, we need to do reference cleanup for the deleted item
- if(this.referenceIntegrity){
- //First scan all the attributes of this items for references and clean them up in the map
- //As this item is going away, no need to track its references anymore.
-
- //Get the attributes list before we generate the backup so it
- //doesn't pollute the attributes list.
- var attributes = this.getAttributes(item);
-
- //Backup the map, we'll have to restore it potentially, in a revert.
- if(item[this._reverseRefMap]){
- item["backup_" + this._reverseRefMap] = dojo.clone(item[this._reverseRefMap]);
- }
-
- //TODO: This causes a reversion problem. This list won't be restored on revert since it is
- //attached to the 'value'. item, not ours. Need to back tese up somehow too.
- //Maybe build a map of the backup of the entries and attach it to the deleted item to be restored
- //later. Or just record them and call _addReferenceToMap on them in revert.
- dojo.forEach(attributes, function(attribute){
- dojo.forEach(this.getValues(item, attribute), function(value){
- if(this.isItem(value)){
- //We have to back up all the references we had to others so they can be restored on a revert.
- if(!item["backupRefs_" + this._reverseRefMap]){
- item["backupRefs_" + this._reverseRefMap] = [];
- }
- item["backupRefs_" + this._reverseRefMap].push({id: this.getIdentity(value), attr: attribute});
- this._removeReferenceFromMap(value, item, attribute);
- }
- }, this);
- }, this);
-
- //Next, see if we have references to this item, if we do, we have to clean them up too.
- var references = item[this._reverseRefMap];
- if(references){
- //Look through all the items noted as references to clean them up.
- for(var itemId in references){
- var containingItem = null;
- if(this._itemsByIdentity){
- containingItem = this._itemsByIdentity[itemId];
- }else{
- containingItem = this._arrayOfAllItems[itemId];
- }
- //We have a reference to a containing item, now we have to process the
- //attributes and clear all references to the item being deleted.
- if(containingItem){
- for(var attribute in references[itemId]){
- var oldValues = this.getValues(containingItem, attribute) || [];
- var newValues = dojo.filter(oldValues, function(possibleItem){
- return !(this.isItem(possibleItem) && this.getIdentity(possibleItem) == identity);
- }, this);
- //Remove the note of the reference to the item and set the values on the modified attribute.
- this._removeReferenceFromMap(item, containingItem, attribute);
- if(newValues.length < oldValues.length){
- this._setValueOrValues(containingItem, attribute, newValues, true);
- }
- }
- }
- }
- }
- }
-
- this._arrayOfAllItems[indexInArrayOfAllItems] = null;
-
- item[this._storeRefPropName] = null;
- if(this._itemsByIdentity){
- delete this._itemsByIdentity[identity];
- }
- this._pending._deletedItems[identity] = item;
-
- //Remove from the toplevel items, if necessary...
- if(item[this._rootItemPropName]){
- this._removeArrayElement(this._arrayOfTopLevelItems, item);
- }
- this.onDelete(item); // dojo.data.api.Notification call
- return true;
- },
-
- setValue: function(/* item */ item, /* attribute-name-string */ attribute, /* almost anything */ value){
- // summary: See dojo.data.api.Write.set()
- return this._setValueOrValues(item, attribute, value, true); // boolean
- },
-
- setValues: function(/* item */ item, /* attribute-name-string */ attribute, /* array */ values){
- // summary: See dojo.data.api.Write.setValues()
- return this._setValueOrValues(item, attribute, values, true); // boolean
- },
-
- unsetAttribute: function(/* item */ item, /* attribute-name-string */ attribute){
- // summary: See dojo.data.api.Write.unsetAttribute()
- return this._setValueOrValues(item, attribute, [], true);
- },
-
- _setValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute, /* anything */ newValueOrValues, /*boolean?*/ callOnSet){
- this._assert(!this._saveInProgress);
-
- // Check for valid arguments
- this._assertIsItem(item);
- this._assert(dojo.isString(attribute));
- this._assert(typeof newValueOrValues !== "undefined");
-
- // Make sure the user isn't trying to change the item's identity
- var identifierAttribute = this._getIdentifierAttribute();
- if(attribute == identifierAttribute){
- throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");
- }
-
- // To implement the Notification API, we need to make a note of what
- // the old attribute value was, so that we can pass that info when
- // we call the onSet method.
- var oldValueOrValues = this._getValueOrValues(item, attribute);
-
- var identity = this.getIdentity(item);
- if(!this._pending._modifiedItems[identity]){
- // Before we actually change the item, we make a copy of it to
- // record the original state, so that we'll be able to revert if
- // the revert method gets called. If the item has already been
- // modified then there's no need to do this now, since we already
- // have a record of the original state.
- var copyOfItemState = {};
- for(var key in item){
- if((key === this._storeRefPropName) || (key === this._itemNumPropName) || (key === this._rootItemPropName)){
- copyOfItemState[key] = item[key];
- }else if(key === this._reverseRefMap){
- copyOfItemState[key] = dojo.clone(item[key]);
- }else{
- copyOfItemState[key] = item[key].slice(0, item[key].length);
- }
- }
- // Now mark the item as dirty, and save the copy of the original state
- this._pending._modifiedItems[identity] = copyOfItemState;
- }
-
- // Okay, now we can actually change this attribute on the item
- var success = false;
-
- if(dojo.isArray(newValueOrValues) && newValueOrValues.length === 0){
-
- // If we were passed an empty array as the value, that counts
- // as "unsetting" the attribute, so we need to remove this
- // attribute from the item.
- success = delete item[attribute];
- newValueOrValues = undefined; // used in the onSet Notification call below
-
- if(this.referenceIntegrity && oldValueOrValues){
- var oldValues = oldValueOrValues;
- if(!dojo.isArray(oldValues)){
- oldValues = [oldValues];
- }
- for(var i = 0; i < oldValues.length; i++){
- var value = oldValues[i];
- if(this.isItem(value)){
- this._removeReferenceFromMap(value, item, attribute);
- }
- }
- }
- }else{
- var newValueArray;
- if(dojo.isArray(newValueOrValues)){
- var newValues = newValueOrValues;
- // Unfortunately, it's not safe to just do this:
- // newValueArray = newValues;
- // Instead, we need to copy the array, which slice() does very nicely.
- // This is so that our internal data structure won't
- // get corrupted if the user mucks with the values array *after*
- // calling setValues().
- newValueArray = newValueOrValues.slice(0, newValueOrValues.length);
- }else{
- newValueArray = [newValueOrValues];
- }
-
- //We need to handle reference integrity if this is on.
- //In the case of set, we need to see if references were added or removed
- //and update the reference tracking map accordingly.
- if(this.referenceIntegrity){
- if(oldValueOrValues){
- var oldValues = oldValueOrValues;
- if(!dojo.isArray(oldValues)){
- oldValues = [oldValues];
- }
- //Use an associative map to determine what was added/removed from the list.
- //Should be O(n) performant. First look at all the old values and make a list of them
- //Then for any item not in the old list, we add it. If it was already present, we remove it.
- //Then we pass over the map and any references left it it need to be removed (IE, no match in
- //the new values list).
- var map = {};
- dojo.forEach(oldValues, function(possibleItem){
- if(this.isItem(possibleItem)){
- var id = this.getIdentity(possibleItem);
- map[id.toString()] = true;
- }
- }, this);
- dojo.forEach(newValueArray, function(possibleItem){
- if(this.isItem(possibleItem)){
- var id = this.getIdentity(possibleItem);
- if(map[id.toString()]){
- delete map[id.toString()];
- }else{
- this._addReferenceToMap(possibleItem, item, attribute);
- }
- }
- }, this);
- for(var rId in map){
- var removedItem;
- if(this._itemsByIdentity){
- removedItem = this._itemsByIdentity[rId];
- }else{
- removedItem = this._arrayOfAllItems[rId];
- }
- this._removeReferenceFromMap(removedItem, item, attribute);
- }
- }else{
- //Everything is new (no old values) so we have to just
- //insert all the references, if any.
- for(var i = 0; i < newValueArray.length; i++){
- var value = newValueArray[i];
- if(this.isItem(value)){
- this._addReferenceToMap(value, item, attribute);
- }
- }
- }
- }
- item[attribute] = newValueArray;
- success = true;
- }
-
- // Now we make the dojo.data.api.Notification call
- if(callOnSet){
- this.onSet(item, attribute, oldValueOrValues, newValueOrValues);
- }
- return success; // boolean
- },
-
- _addReferenceToMap: function(/*item*/ refItem, /*item*/ parentItem, /*string*/ attribute){
- // summary:
- // Method to add an reference map entry for an item and attribute.
- // description:
- // Method to add an reference map entry for an item and attribute. //
- // refItem:
- // The item that is referenced.
- // parentItem:
- // The item that holds the new reference to refItem.
- // attribute:
- // The attribute on parentItem that contains the new reference.
-
- var parentId = this.getIdentity(parentItem);
- var references = refItem[this._reverseRefMap];
-
- if(!references){
- references = refItem[this._reverseRefMap] = {};
- }
- var itemRef = references[parentId];
- if(!itemRef){
- itemRef = references[parentId] = {};
- }
- itemRef[attribute] = true;
- },
-
- _removeReferenceFromMap: function(/* item */ refItem, /* item */ parentItem, /*strin*/ attribute){
- // summary:
- // Method to remove an reference map entry for an item and attribute.
- // description:
- // Method to remove an reference map entry for an item and attribute. This will
- // also perform cleanup on the map such that if there are no more references at all to
- // the item, its reference object and entry are removed.
- //
- // refItem:
- // The item that is referenced.
- // parentItem:
- // The item holding a reference to refItem.
- // attribute:
- // The attribute on parentItem that contains the reference.
- var identity = this.getIdentity(parentItem);
- var references = refItem[this._reverseRefMap];
- var itemId;
- if(references){
- for(itemId in references){
- if(itemId == identity){
- delete references[itemId][attribute];
- if(this._isEmpty(references[itemId])){
- delete references[itemId];
- }
- }
- }
- if(this._isEmpty(references)){
- delete refItem[this._reverseRefMap];
- }
- }
- },
-
- _dumpReferenceMap: function(){
- // summary:
- // Function to dump the reverse reference map of all items in the store for debug purposes.
- // description:
- // Function to dump the reverse reference map of all items in the store for debug purposes.
- var i;
- for(i = 0; i < this._arrayOfAllItems.length; i++){
- var item = this._arrayOfAllItems[i];
- if(item && item[this._reverseRefMap]){
- console.log("Item: [" + this.getIdentity(item) + "] is referenced by: " + dojo.toJson(item[this._reverseRefMap]));
- }
- }
- },
-
- _getValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute){
- var valueOrValues = undefined;
- if(this.hasAttribute(item, attribute)){
- var valueArray = this.getValues(item, attribute);
- if(valueArray.length == 1){
- valueOrValues = valueArray[0];
- }else{
- valueOrValues = valueArray;
- }
- }
- return valueOrValues;
- },
-
- _flatten: function(/* anything */ value){
- if(this.isItem(value)){
- var item = value;
- // Given an item, return an serializable object that provides a
- // reference to the item.
- // For example, given kermit:
- // var kermit = store.newItem({id:2, name:"Kermit"});
- // we want to return
- // {_reference:2}
- var identity = this.getIdentity(item);
- var referenceObject = {_reference: identity};
- return referenceObject;
- }else{
- if(typeof value === "object"){
- for(var type in this._datatypeMap){
- var typeMap = this._datatypeMap[type];
- if(dojo.isObject(typeMap) && !dojo.isFunction(typeMap)){
- if(value instanceof typeMap.type){
- if(!typeMap.serialize){
- throw new Error("ItemFileWriteStore: No serializer defined for type mapping: [" + type + "]");
- }
- return {_type: type, _value: typeMap.serialize(value)};
- }
- } else if(value instanceof typeMap){
- //SImple mapping, therefore, return as a toString serialization.
- return {_type: type, _value: value.toString()};
- }
- }
- }
- return value;
- }
- },
-
- _getNewFileContentString: function(){
- // summary:
- // Generate a string that can be saved to a file.
- // The result should look similar to:
- // http://trac.dojotoolkit.org/browser/dojo/trunk/tests/data/countries.json
- var serializableStructure = {};
-
- var identifierAttribute = this._getIdentifierAttribute();
- if(identifierAttribute !== Number){
- serializableStructure.identifier = identifierAttribute;
- }
- if(this._labelAttr){
- serializableStructure.label = this._labelAttr;
- }
- serializableStructure.items = [];
- for(var i = 0; i < this._arrayOfAllItems.length; ++i){
- var item = this._arrayOfAllItems[i];
- if(item !== null){
- var serializableItem = {};
- for(var key in item){
- if(key !== this._storeRefPropName && key !== this._itemNumPropName && key !== this._reverseRefMap && key !== this._rootItemPropName){
- var attribute = key;
- var valueArray = this.getValues(item, attribute);
- if(valueArray.length == 1){
- serializableItem[attribute] = this._flatten(valueArray[0]);
- }else{
- var serializableArray = [];
- for(var j = 0; j < valueArray.length; ++j){
- serializableArray.push(this._flatten(valueArray[j]));
- serializableItem[attribute] = serializableArray;
- }
- }
- }
- }
- serializableStructure.items.push(serializableItem);
- }
- }
- var prettyPrint = true;
- return dojo.toJson(serializableStructure, prettyPrint);
- },
-
- _isEmpty: function(something){
- // summary:
- // Function to determine if an array or object has no properties or values.
- // something:
- // The array or object to examine.
- var empty = true;
- if(dojo.isObject(something)){
- var i;
- for(i in something){
- empty = false;
- break;
- }
- }else if(dojo.isArray(something)){
- if(something.length > 0){
- empty = false;
- }
- }
- return empty; //boolean
- },
-
- save: function(/* object */ keywordArgs){
- // summary: See dojo.data.api.Write.save()
- this._assert(!this._saveInProgress);
-
- // this._saveInProgress is set to true, briefly, from when save is first called to when it completes
- this._saveInProgress = true;
-
- var self = this;
- var saveCompleteCallback = function(){
- self._pending = {
- _newItems:{},
- _modifiedItems:{},
- _deletedItems:{}
- };
-
- self._saveInProgress = false; // must come after this._pending is cleared, but before any callbacks
- if(keywordArgs && keywordArgs.onComplete){
- var scope = keywordArgs.scope || dojo.global;
- keywordArgs.onComplete.call(scope);
- }
- };
- var saveFailedCallback = function(err){
- self._saveInProgress = false;
- if(keywordArgs && keywordArgs.onError){
- var scope = keywordArgs.scope || dojo.global;
- keywordArgs.onError.call(scope, err);
- }
- };
-
- if(this._saveEverything){
- var newFileContentString = this._getNewFileContentString();
- this._saveEverything(saveCompleteCallback, saveFailedCallback, newFileContentString);
- }
- if(this._saveCustom){
- this._saveCustom(saveCompleteCallback, saveFailedCallback);
- }
- if(!this._saveEverything && !this._saveCustom){
- // Looks like there is no user-defined save-handler function.
- // That's fine, it just means the datastore is acting as a "mock-write"
- // store -- changes get saved in memory but don't get saved to disk.
- saveCompleteCallback();
- }
- },
-
- revert: function(){
- // summary: See dojo.data.api.Write.revert()
- this._assert(!this._saveInProgress);
-
- var identity;
- for(identity in this._pending._modifiedItems){
- // find the original item and the modified item that replaced it
- var copyOfItemState = this._pending._modifiedItems[identity];
- var modifiedItem = null;
- if(this._itemsByIdentity){
- modifiedItem = this._itemsByIdentity[identity];
- }else{
- modifiedItem = this._arrayOfAllItems[identity];
- }
-
- // Restore the original item into a full-fledged item again, we want to try to
- // keep the same object instance as if we don't it, causes bugs like #9022.
- copyOfItemState[this._storeRefPropName] = this;
- for(key in modifiedItem){
- delete modifiedItem[key];
- }
- dojo.mixin(modifiedItem, copyOfItemState);
- }
- var deletedItem;
- for(identity in this._pending._deletedItems){
- deletedItem = this._pending._deletedItems[identity];
- deletedItem[this._storeRefPropName] = this;
- var index = deletedItem[this._itemNumPropName];
-
- //Restore the reverse refererence map, if any.
- if(deletedItem["backup_" + this._reverseRefMap]){
- deletedItem[this._reverseRefMap] = deletedItem["backup_" + this._reverseRefMap];
- delete deletedItem["backup_" + this._reverseRefMap];
- }
- this._arrayOfAllItems[index] = deletedItem;
- if(this._itemsByIdentity){
- this._itemsByIdentity[identity] = deletedItem;
- }
- if(deletedItem[this._rootItemPropName]){
- this._arrayOfTopLevelItems.push(deletedItem);
- }
- }
- //We have to pass through it again and restore the reference maps after all the
- //undeletes have occurred.
- for(identity in this._pending._deletedItems){
- deletedItem = this._pending._deletedItems[identity];
- if(deletedItem["backupRefs_" + this._reverseRefMap]){
- dojo.forEach(deletedItem["backupRefs_" + this._reverseRefMap], function(reference){
- var refItem;
- if(this._itemsByIdentity){
- refItem = this._itemsByIdentity[reference.id];
- }else{
- refItem = this._arrayOfAllItems[reference.id];
- }
- this._addReferenceToMap(refItem, deletedItem, reference.attr);
- }, this);
- delete deletedItem["backupRefs_" + this._reverseRefMap];
- }
- }
-
- for(identity in this._pending._newItems){
- var newItem = this._pending._newItems[identity];
- newItem[this._storeRefPropName] = null;
- // null out the new item, but don't change the array index so
- // so we can keep using _arrayOfAllItems.length.
- this._arrayOfAllItems[newItem[this._itemNumPropName]] = null;
- if(newItem[this._rootItemPropName]){
- this._removeArrayElement(this._arrayOfTopLevelItems, newItem);
- }
- if(this._itemsByIdentity){
- delete this._itemsByIdentity[identity];
- }
- }
-
- this._pending = {
- _newItems:{},
- _modifiedItems:{},
- _deletedItems:{}
- };
- return true; // boolean
- },
-
- isDirty: function(/* item? */ item){
- // summary: See dojo.data.api.Write.isDirty()
- if(item){
- // return true if the item is dirty
- var identity = this.getIdentity(item);
- return new Boolean(this._pending._newItems[identity] ||
- this._pending._modifiedItems[identity] ||
- this._pending._deletedItems[identity]).valueOf(); // boolean
- }else{
- // return true if the store is dirty -- which means return true
- // if there are any new items, dirty items, or modified items
- if(!this._isEmpty(this._pending._newItems) ||
- !this._isEmpty(this._pending._modifiedItems) ||
- !this._isEmpty(this._pending._deletedItems)){
- return true;
- }
- return false; // boolean
- }
- },
-
-/* dojo.data.api.Notification */
-
- onSet: function(/* item */ item,
- /*attribute-name-string*/ attribute,
- /*object | array*/ oldValue,
- /*object | array*/ newValue){
- // summary: See dojo.data.api.Notification.onSet()
-
- // No need to do anything. This method is here just so that the
- // client code can connect observers to it.
- },
-
- onNew: function(/* item */ newItem, /*object?*/ parentInfo){
- // summary: See dojo.data.api.Notification.onNew()
-
- // No need to do anything. This method is here just so that the
- // client code can connect observers to it.
- },
-
- onDelete: function(/* item */ deletedItem){
- // summary: See dojo.data.api.Notification.onDelete()
-
- // No need to do anything. This method is here just so that the
- // client code can connect observers to it.
- },
-
- close: function(/* object? */ request){
- // summary:
- // Over-ride of base close function of ItemFileReadStore to add in check for store state.
- // description:
- // Over-ride of base close function of ItemFileReadStore to add in check for store state.
- // If the store is still dirty (unsaved changes), then an error will be thrown instead of
- // clearing the internal state for reload from the url.
-
- //Clear if not dirty ... or throw an error
- if(this.clearOnClose){
- if(!this.isDirty()){
- this.inherited(arguments);
- }else{
- //Only throw an error if the store was dirty and we were loading from a url (cannot reload from url until state is saved).
- throw new Error("dojo.data.ItemFileWriteStore: There are unsaved changes present in the store. Please save or revert the changes before invoking close.");
- }
- }
- }
-});
-
-}
+//>>built
+define("dojo/data/ItemFileWriteStore",["../_base/lang","../_base/declare","../_base/array","../_base/json","../_base/window","./ItemFileReadStore","../date/stamp"],function(_1,_2,_3,_4,_5,_6,_7){return _2("dojo.data.ItemFileWriteStore",_6,{constructor:function(_8){this._features["dojo.data.api.Write"]=true;this._features["dojo.data.api.Notification"]=true;this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};if(!this._datatypeMap["Date"].serialize){this._datatypeMap["Date"].serialize=function(_9){return _7.toISOString(_9,{zulu:true});};}if(_8&&(_8.referenceIntegrity===false)){this.referenceIntegrity=false;}this._saveInProgress=false;},referenceIntegrity:true,_assert:function(_a){if(!_a){throw new Error("assertion failed in ItemFileWriteStore");}},_getIdentifierAttribute:function(){return this.getFeatures()["dojo.data.api.Identity"];},newItem:function(_b,_c){this._assert(!this._saveInProgress);if(!this._loadFinished){this._forceLoad();}if(typeof _b!="object"&&typeof _b!="undefined"){throw new Error("newItem() was passed something other than an object");}var _d=null;var _e=this._getIdentifierAttribute();if(_e===Number){_d=this._arrayOfAllItems.length;}else{_d=_b[_e];if(typeof _d==="undefined"){throw new Error("newItem() was not passed an identity for the new item");}if(_1.isArray(_d)){throw new Error("newItem() was not passed an single-valued identity");}}if(this._itemsByIdentity){this._assert(typeof this._itemsByIdentity[_d]==="undefined");}this._assert(typeof this._pending._newItems[_d]==="undefined");this._assert(typeof this._pending._deletedItems[_d]==="undefined");var _f={};_f[this._storeRefPropName]=this;_f[this._itemNumPropName]=this._arrayOfAllItems.length;if(this._itemsByIdentity){this._itemsByIdentity[_d]=_f;_f[_e]=[_d];}this._arrayOfAllItems.push(_f);var _10=null;if(_c&&_c.parent&&_c.attribute){_10={item:_c.parent,attribute:_c.attribute,oldValue:undefined};var _11=this.getValues(_c.parent,_c.attribute);if(_11&&_11.length>0){var _12=_11.slice(0,_11.length);if(_11.length===1){_10.oldValue=_11[0];}else{_10.oldValue=_11.slice(0,_11.length);}_12.push(_f);this._setValueOrValues(_c.parent,_c.attribute,_12,false);_10.newValue=this.getValues(_c.parent,_c.attribute);}else{this._setValueOrValues(_c.parent,_c.attribute,_f,false);_10.newValue=_f;}}else{_f[this._rootItemPropName]=true;this._arrayOfTopLevelItems.push(_f);}this._pending._newItems[_d]=_f;for(var key in _b){if(key===this._storeRefPropName||key===this._itemNumPropName){throw new Error("encountered bug in ItemFileWriteStore.newItem");}var _13=_b[key];if(!_1.isArray(_13)){_13=[_13];}_f[key]=_13;if(this.referenceIntegrity){for(var i=0;i<_13.length;i++){var val=_13[i];if(this.isItem(val)){this._addReferenceToMap(val,_f,key);}}}}this.onNew(_f,_10);return _f;},_removeArrayElement:function(_14,_15){var _16=_3.indexOf(_14,_15);if(_16!=-1){_14.splice(_16,1);return true;}return false;},deleteItem:function(_17){this._assert(!this._saveInProgress);this._assertIsItem(_17);var _18=_17[this._itemNumPropName];var _19=this.getIdentity(_17);if(this.referenceIntegrity){var _1a=this.getAttributes(_17);if(_17[this._reverseRefMap]){_17["backup_"+this._reverseRefMap]=_1.clone(_17[this._reverseRefMap]);}_3.forEach(_1a,function(_1b){_3.forEach(this.getValues(_17,_1b),function(_1c){if(this.isItem(_1c)){if(!_17["backupRefs_"+this._reverseRefMap]){_17["backupRefs_"+this._reverseRefMap]=[];}_17["backupRefs_"+this._reverseRefMap].push({id:this.getIdentity(_1c),attr:_1b});this._removeReferenceFromMap(_1c,_17,_1b);}},this);},this);var _1d=_17[this._reverseRefMap];if(_1d){for(var _1e in _1d){var _1f=null;if(this._itemsByIdentity){_1f=this._itemsByIdentity[_1e];}else{_1f=this._arrayOfAllItems[_1e];}if(_1f){for(var _20 in _1d[_1e]){var _21=this.getValues(_1f,_20)||[];var _22=_3.filter(_21,function(_23){return !(this.isItem(_23)&&this.getIdentity(_23)==_19);},this);this._removeReferenceFromMap(_17,_1f,_20);if(_22.length<_21.length){this._setValueOrValues(_1f,_20,_22,true);}}}}}}this._arrayOfAllItems[_18]=null;_17[this._storeRefPropName]=null;if(this._itemsByIdentity){delete this._itemsByIdentity[_19];}this._pending._deletedItems[_19]=_17;if(_17[this._rootItemPropName]){this._removeArrayElement(this._arrayOfTopLevelItems,_17);}this.onDelete(_17);return true;},setValue:function(_24,_25,_26){return this._setValueOrValues(_24,_25,_26,true);},setValues:function(_27,_28,_29){return this._setValueOrValues(_27,_28,_29,true);},unsetAttribute:function(_2a,_2b){return this._setValueOrValues(_2a,_2b,[],true);},_setValueOrValues:function(_2c,_2d,_2e,_2f){this._assert(!this._saveInProgress);this._assertIsItem(_2c);this._assert(_1.isString(_2d));this._assert(typeof _2e!=="undefined");var _30=this._getIdentifierAttribute();if(_2d==_30){throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");}var _31=this._getValueOrValues(_2c,_2d);var _32=this.getIdentity(_2c);if(!this._pending._modifiedItems[_32]){var _33={};for(var key in _2c){if((key===this._storeRefPropName)||(key===this._itemNumPropName)||(key===this._rootItemPropName)){_33[key]=_2c[key];}else{if(key===this._reverseRefMap){_33[key]=_1.clone(_2c[key]);}else{_33[key]=_2c[key].slice(0,_2c[key].length);}}}this._pending._modifiedItems[_32]=_33;}var _34=false;if(_1.isArray(_2e)&&_2e.length===0){_34=delete _2c[_2d];_2e=undefined;if(this.referenceIntegrity&&_31){var _35=_31;if(!_1.isArray(_35)){_35=[_35];}for(var i=0;i<_35.length;i++){var _36=_35[i];if(this.isItem(_36)){this._removeReferenceFromMap(_36,_2c,_2d);}}}}else{var _37;if(_1.isArray(_2e)){_37=_2e.slice(0,_2e.length);}else{_37=[_2e];}if(this.referenceIntegrity){if(_31){var _35=_31;if(!_1.isArray(_35)){_35=[_35];}var map={};_3.forEach(_35,function(_38){if(this.isItem(_38)){var id=this.getIdentity(_38);map[id.toString()]=true;}},this);_3.forEach(_37,function(_39){if(this.isItem(_39)){var id=this.getIdentity(_39);if(map[id.toString()]){delete map[id.toString()];}else{this._addReferenceToMap(_39,_2c,_2d);}}},this);for(var rId in map){var _3a;if(this._itemsByIdentity){_3a=this._itemsByIdentity[rId];}else{_3a=this._arrayOfAllItems[rId];}this._removeReferenceFromMap(_3a,_2c,_2d);}}else{for(var i=0;i<_37.length;i++){var _36=_37[i];if(this.isItem(_36)){this._addReferenceToMap(_36,_2c,_2d);}}}}_2c[_2d]=_37;_34=true;}if(_2f){this.onSet(_2c,_2d,_31,_2e);}return _34;},_addReferenceToMap:function(_3b,_3c,_3d){var _3e=this.getIdentity(_3c);var _3f=_3b[this._reverseRefMap];if(!_3f){_3f=_3b[this._reverseRefMap]={};}var _40=_3f[_3e];if(!_40){_40=_3f[_3e]={};}_40[_3d]=true;},_removeReferenceFromMap:function(_41,_42,_43){var _44=this.getIdentity(_42);var _45=_41[this._reverseRefMap];var _46;if(_45){for(_46 in _45){if(_46==_44){delete _45[_46][_43];if(this._isEmpty(_45[_46])){delete _45[_46];}}}if(this._isEmpty(_45)){delete _41[this._reverseRefMap];}}},_dumpReferenceMap:function(){var i;for(i=0;i<this._arrayOfAllItems.length;i++){var _47=this._arrayOfAllItems[i];if(_47&&_47[this._reverseRefMap]){}}},_getValueOrValues:function(_48,_49){var _4a=undefined;if(this.hasAttribute(_48,_49)){var _4b=this.getValues(_48,_49);if(_4b.length==1){_4a=_4b[0];}else{_4a=_4b;}}return _4a;},_flatten:function(_4c){if(this.isItem(_4c)){return {_reference:this.getIdentity(_4c)};}else{if(typeof _4c==="object"){for(var _4d in this._datatypeMap){var _4e=this._datatypeMap[_4d];if(_1.isObject(_4e)&&!_1.isFunction(_4e)){if(_4c instanceof _4e.type){if(!_4e.serialize){throw new Error("ItemFileWriteStore: No serializer defined for type mapping: ["+_4d+"]");}return {_type:_4d,_value:_4e.serialize(_4c)};}}else{if(_4c instanceof _4e){return {_type:_4d,_value:_4c.toString()};}}}}return _4c;}},_getNewFileContentString:function(){var _4f={};var _50=this._getIdentifierAttribute();if(_50!==Number){_4f.identifier=_50;}if(this._labelAttr){_4f.label=this._labelAttr;}_4f.items=[];for(var i=0;i<this._arrayOfAllItems.length;++i){var _51=this._arrayOfAllItems[i];if(_51!==null){var _52={};for(var key in _51){if(key!==this._storeRefPropName&&key!==this._itemNumPropName&&key!==this._reverseRefMap&&key!==this._rootItemPropName){var _53=this.getValues(_51,key);if(_53.length==1){_52[key]=this._flatten(_53[0]);}else{var _54=[];for(var j=0;j<_53.length;++j){_54.push(this._flatten(_53[j]));_52[key]=_54;}}}}_4f.items.push(_52);}}var _55=true;return _4.toJson(_4f,_55);},_isEmpty:function(_56){var _57=true;if(_1.isObject(_56)){var i;for(i in _56){_57=false;break;}}else{if(_1.isArray(_56)){if(_56.length>0){_57=false;}}}return _57;},save:function(_58){this._assert(!this._saveInProgress);this._saveInProgress=true;var _59=this;var _5a=function(){_59._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};_59._saveInProgress=false;if(_58&&_58.onComplete){var _5b=_58.scope||_5.global;_58.onComplete.call(_5b);}};var _5c=function(err){_59._saveInProgress=false;if(_58&&_58.onError){var _5d=_58.scope||_5.global;_58.onError.call(_5d,err);}};if(this._saveEverything){var _5e=this._getNewFileContentString();this._saveEverything(_5a,_5c,_5e);}if(this._saveCustom){this._saveCustom(_5a,_5c);}if(!this._saveEverything&&!this._saveCustom){_5a();}},revert:function(){this._assert(!this._saveInProgress);var _5f;for(_5f in this._pending._modifiedItems){var _60=this._pending._modifiedItems[_5f];var _61=null;if(this._itemsByIdentity){_61=this._itemsByIdentity[_5f];}else{_61=this._arrayOfAllItems[_5f];}_60[this._storeRefPropName]=this;for(var key in _61){delete _61[key];}_1.mixin(_61,_60);}var _62;for(_5f in this._pending._deletedItems){_62=this._pending._deletedItems[_5f];_62[this._storeRefPropName]=this;var _63=_62[this._itemNumPropName];if(_62["backup_"+this._reverseRefMap]){_62[this._reverseRefMap]=_62["backup_"+this._reverseRefMap];delete _62["backup_"+this._reverseRefMap];}this._arrayOfAllItems[_63]=_62;if(this._itemsByIdentity){this._itemsByIdentity[_5f]=_62;}if(_62[this._rootItemPropName]){this._arrayOfTopLevelItems.push(_62);}}for(_5f in this._pending._deletedItems){_62=this._pending._deletedItems[_5f];if(_62["backupRefs_"+this._reverseRefMap]){_3.forEach(_62["backupRefs_"+this._reverseRefMap],function(_64){var _65;if(this._itemsByIdentity){_65=this._itemsByIdentity[_64.id];}else{_65=this._arrayOfAllItems[_64.id];}this._addReferenceToMap(_65,_62,_64.attr);},this);delete _62["backupRefs_"+this._reverseRefMap];}}for(_5f in this._pending._newItems){var _66=this._pending._newItems[_5f];_66[this._storeRefPropName]=null;this._arrayOfAllItems[_66[this._itemNumPropName]]=null;if(_66[this._rootItemPropName]){this._removeArrayElement(this._arrayOfTopLevelItems,_66);}if(this._itemsByIdentity){delete this._itemsByIdentity[_5f];}}this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};return true;},isDirty:function(_67){if(_67){var _68=this.getIdentity(_67);return new Boolean(this._pending._newItems[_68]||this._pending._modifiedItems[_68]||this._pending._deletedItems[_68]).valueOf();}else{return !this._isEmpty(this._pending._newItems)||!this._isEmpty(this._pending._modifiedItems)||!this._isEmpty(this._pending._deletedItems);}},onSet:function(_69,_6a,_6b,_6c){},onNew:function(_6d,_6e){},onDelete:function(_6f){},close:function(_70){if(this.clearOnClose){if(!this.isDirty()){this.inherited(arguments);}else{throw new Error("dojo.data.ItemFileWriteStore: There are unsaved changes present in the store. Please save or revert the changes before invoking close.");}}}});}); \ No newline at end of file
diff --git a/lib/dojo/data/ItemFileWriteStore.js.uncompressed.js b/lib/dojo/data/ItemFileWriteStore.js.uncompressed.js
new file mode 100644
index 000000000..50d91929b
--- /dev/null
+++ b/lib/dojo/data/ItemFileWriteStore.js.uncompressed.js
@@ -0,0 +1,805 @@
+define("dojo/data/ItemFileWriteStore", ["../_base/lang", "../_base/declare", "../_base/array", "../_base/json", "../_base/window",
+ "./ItemFileReadStore", "../date/stamp"
+], function(lang, declare, arrayUtil, jsonUtil, window, ItemFileReadStore, dateStamp) {
+ // module:
+ // dojo/data/ItemFileWriteStore
+ // summary:
+ // TODOC
+
+/*===== var ItemFileReadStore = dojo.data.ItemFileReadStore; =====*/
+return declare("dojo.data.ItemFileWriteStore", ItemFileReadStore, {
+ constructor: function(/* object */ keywordParameters){
+ // keywordParameters: {typeMap: object)
+ // The structure of the typeMap object is as follows:
+ // {
+ // type0: function || object,
+ // type1: function || object,
+ // ...
+ // typeN: function || object
+ // }
+ // Where if it is a function, it is assumed to be an object constructor that takes the
+ // value of _value as the initialization parameters. It is serialized assuming object.toString()
+ // serialization. If it is an object, then it is assumed
+ // to be an object of general form:
+ // {
+ // type: function, //constructor.
+ // deserialize: function(value) //The function that parses the value and constructs the object defined by type appropriately.
+ // serialize: function(object) //The function that converts the object back into the proper file format form.
+ // }
+
+ // ItemFileWriteStore extends ItemFileReadStore to implement these additional dojo.data APIs
+ this._features['dojo.data.api.Write'] = true;
+ this._features['dojo.data.api.Notification'] = true;
+
+ // For keeping track of changes so that we can implement isDirty and revert
+ this._pending = {
+ _newItems:{},
+ _modifiedItems:{},
+ _deletedItems:{}
+ };
+
+ if(!this._datatypeMap['Date'].serialize){
+ this._datatypeMap['Date'].serialize = function(obj){
+ return dateStamp.toISOString(obj, {zulu:true});
+ };
+ }
+ //Disable only if explicitly set to false.
+ if(keywordParameters && (keywordParameters.referenceIntegrity === false)){
+ this.referenceIntegrity = false;
+ }
+
+ // this._saveInProgress is set to true, briefly, from when save() is first called to when it completes
+ this._saveInProgress = false;
+ },
+
+ referenceIntegrity: true, //Flag that defaultly enabled reference integrity tracking. This way it can also be disabled pogrammatially or declaratively.
+
+ _assert: function(/* boolean */ condition){
+ if(!condition){
+ throw new Error("assertion failed in ItemFileWriteStore");
+ }
+ },
+
+ _getIdentifierAttribute: function(){
+ // this._assert((identifierAttribute === Number) || (dojo.isString(identifierAttribute)));
+ return this.getFeatures()['dojo.data.api.Identity'];
+ },
+
+
+/* dojo.data.api.Write */
+
+ newItem: function(/* Object? */ keywordArgs, /* Object? */ parentInfo){
+ // summary: See dojo.data.api.Write.newItem()
+
+ this._assert(!this._saveInProgress);
+
+ if(!this._loadFinished){
+ // We need to do this here so that we'll be able to find out what
+ // identifierAttribute was specified in the data file.
+ this._forceLoad();
+ }
+
+ if(typeof keywordArgs != "object" && typeof keywordArgs != "undefined"){
+ throw new Error("newItem() was passed something other than an object");
+ }
+ var newIdentity = null;
+ var identifierAttribute = this._getIdentifierAttribute();
+ if(identifierAttribute === Number){
+ newIdentity = this._arrayOfAllItems.length;
+ }else{
+ newIdentity = keywordArgs[identifierAttribute];
+ if(typeof newIdentity === "undefined"){
+ throw new Error("newItem() was not passed an identity for the new item");
+ }
+ if(lang.isArray(newIdentity)){
+ throw new Error("newItem() was not passed an single-valued identity");
+ }
+ }
+
+ // make sure this identity is not already in use by another item, if identifiers were
+ // defined in the file. Otherwise it would be the item count,
+ // which should always be unique in this case.
+ if(this._itemsByIdentity){
+ this._assert(typeof this._itemsByIdentity[newIdentity] === "undefined");
+ }
+ this._assert(typeof this._pending._newItems[newIdentity] === "undefined");
+ this._assert(typeof this._pending._deletedItems[newIdentity] === "undefined");
+
+ var newItem = {};
+ newItem[this._storeRefPropName] = this;
+ newItem[this._itemNumPropName] = this._arrayOfAllItems.length;
+ if(this._itemsByIdentity){
+ this._itemsByIdentity[newIdentity] = newItem;
+ //We have to set the identifier now, otherwise we can't look it
+ //up at calls to setValueorValues in parentInfo handling.
+ newItem[identifierAttribute] = [newIdentity];
+ }
+ this._arrayOfAllItems.push(newItem);
+
+ //We need to construct some data for the onNew call too...
+ var pInfo = null;
+
+ // Now we need to check to see where we want to assign this thingm if any.
+ if(parentInfo && parentInfo.parent && parentInfo.attribute){
+ pInfo = {
+ item: parentInfo.parent,
+ attribute: parentInfo.attribute,
+ oldValue: undefined
+ };
+
+ //See if it is multi-valued or not and handle appropriately
+ //Generally, all attributes are multi-valued for this store
+ //So, we only need to append if there are already values present.
+ var values = this.getValues(parentInfo.parent, parentInfo.attribute);
+ if(values && values.length > 0){
+ var tempValues = values.slice(0, values.length);
+ if(values.length === 1){
+ pInfo.oldValue = values[0];
+ }else{
+ pInfo.oldValue = values.slice(0, values.length);
+ }
+ tempValues.push(newItem);
+ this._setValueOrValues(parentInfo.parent, parentInfo.attribute, tempValues, false);
+ pInfo.newValue = this.getValues(parentInfo.parent, parentInfo.attribute);
+ }else{
+ this._setValueOrValues(parentInfo.parent, parentInfo.attribute, newItem, false);
+ pInfo.newValue = newItem;
+ }
+ }else{
+ //Toplevel item, add to both top list as well as all list.
+ newItem[this._rootItemPropName]=true;
+ this._arrayOfTopLevelItems.push(newItem);
+ }
+
+ this._pending._newItems[newIdentity] = newItem;
+
+ //Clone over the properties to the new item
+ for(var key in keywordArgs){
+ if(key === this._storeRefPropName || key === this._itemNumPropName){
+ // Bummer, the user is trying to do something like
+ // newItem({_S:"foo"}). Unfortunately, our superclass,
+ // ItemFileReadStore, is already using _S in each of our items
+ // to hold private info. To avoid a naming collision, we
+ // need to move all our private info to some other property
+ // of all the items/objects. So, we need to iterate over all
+ // the items and do something like:
+ // item.__S = item._S;
+ // item._S = undefined;
+ // But first we have to make sure the new "__S" variable is
+ // not in use, which means we have to iterate over all the
+ // items checking for that.
+ throw new Error("encountered bug in ItemFileWriteStore.newItem");
+ }
+ var value = keywordArgs[key];
+ if(!lang.isArray(value)){
+ value = [value];
+ }
+ newItem[key] = value;
+ if(this.referenceIntegrity){
+ for(var i = 0; i < value.length; i++){
+ var val = value[i];
+ if(this.isItem(val)){
+ this._addReferenceToMap(val, newItem, key);
+ }
+ }
+ }
+ }
+ this.onNew(newItem, pInfo); // dojo.data.api.Notification call
+ return newItem; // item
+ },
+
+ _removeArrayElement: function(/* Array */ array, /* anything */ element){
+ var index = arrayUtil.indexOf(array, element);
+ if(index != -1){
+ array.splice(index, 1);
+ return true;
+ }
+ return false;
+ },
+
+ deleteItem: function(/* item */ item){
+ // summary: See dojo.data.api.Write.deleteItem()
+ this._assert(!this._saveInProgress);
+ this._assertIsItem(item);
+
+ // Remove this item from the _arrayOfAllItems, but leave a null value in place
+ // of the item, so as not to change the length of the array, so that in newItem()
+ // we can still safely do: newIdentity = this._arrayOfAllItems.length;
+ var indexInArrayOfAllItems = item[this._itemNumPropName];
+ var identity = this.getIdentity(item);
+
+ //If we have reference integrity on, we need to do reference cleanup for the deleted item
+ if(this.referenceIntegrity){
+ //First scan all the attributes of this items for references and clean them up in the map
+ //As this item is going away, no need to track its references anymore.
+
+ //Get the attributes list before we generate the backup so it
+ //doesn't pollute the attributes list.
+ var attributes = this.getAttributes(item);
+
+ //Backup the map, we'll have to restore it potentially, in a revert.
+ if(item[this._reverseRefMap]){
+ item["backup_" + this._reverseRefMap] = lang.clone(item[this._reverseRefMap]);
+ }
+
+ //TODO: This causes a reversion problem. This list won't be restored on revert since it is
+ //attached to the 'value'. item, not ours. Need to back tese up somehow too.
+ //Maybe build a map of the backup of the entries and attach it to the deleted item to be restored
+ //later. Or just record them and call _addReferenceToMap on them in revert.
+ arrayUtil.forEach(attributes, function(attribute){
+ arrayUtil.forEach(this.getValues(item, attribute), function(value){
+ if(this.isItem(value)){
+ //We have to back up all the references we had to others so they can be restored on a revert.
+ if(!item["backupRefs_" + this._reverseRefMap]){
+ item["backupRefs_" + this._reverseRefMap] = [];
+ }
+ item["backupRefs_" + this._reverseRefMap].push({id: this.getIdentity(value), attr: attribute});
+ this._removeReferenceFromMap(value, item, attribute);
+ }
+ }, this);
+ }, this);
+
+ //Next, see if we have references to this item, if we do, we have to clean them up too.
+ var references = item[this._reverseRefMap];
+ if(references){
+ //Look through all the items noted as references to clean them up.
+ for(var itemId in references){
+ var containingItem = null;
+ if(this._itemsByIdentity){
+ containingItem = this._itemsByIdentity[itemId];
+ }else{
+ containingItem = this._arrayOfAllItems[itemId];
+ }
+ //We have a reference to a containing item, now we have to process the
+ //attributes and clear all references to the item being deleted.
+ if(containingItem){
+ for(var attribute in references[itemId]){
+ var oldValues = this.getValues(containingItem, attribute) || [];
+ var newValues = arrayUtil.filter(oldValues, function(possibleItem){
+ return !(this.isItem(possibleItem) && this.getIdentity(possibleItem) == identity);
+ }, this);
+ //Remove the note of the reference to the item and set the values on the modified attribute.
+ this._removeReferenceFromMap(item, containingItem, attribute);
+ if(newValues.length < oldValues.length){
+ this._setValueOrValues(containingItem, attribute, newValues, true);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ this._arrayOfAllItems[indexInArrayOfAllItems] = null;
+
+ item[this._storeRefPropName] = null;
+ if(this._itemsByIdentity){
+ delete this._itemsByIdentity[identity];
+ }
+ this._pending._deletedItems[identity] = item;
+
+ //Remove from the toplevel items, if necessary...
+ if(item[this._rootItemPropName]){
+ this._removeArrayElement(this._arrayOfTopLevelItems, item);
+ }
+ this.onDelete(item); // dojo.data.api.Notification call
+ return true;
+ },
+
+ setValue: function(/* item */ item, /* attribute-name-string */ attribute, /* almost anything */ value){
+ // summary: See dojo.data.api.Write.set()
+ return this._setValueOrValues(item, attribute, value, true); // boolean
+ },
+
+ setValues: function(/* item */ item, /* attribute-name-string */ attribute, /* array */ values){
+ // summary: See dojo.data.api.Write.setValues()
+ return this._setValueOrValues(item, attribute, values, true); // boolean
+ },
+
+ unsetAttribute: function(/* item */ item, /* attribute-name-string */ attribute){
+ // summary: See dojo.data.api.Write.unsetAttribute()
+ return this._setValueOrValues(item, attribute, [], true);
+ },
+
+ _setValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute, /* anything */ newValueOrValues, /*boolean?*/ callOnSet){
+ this._assert(!this._saveInProgress);
+
+ // Check for valid arguments
+ this._assertIsItem(item);
+ this._assert(lang.isString(attribute));
+ this._assert(typeof newValueOrValues !== "undefined");
+
+ // Make sure the user isn't trying to change the item's identity
+ var identifierAttribute = this._getIdentifierAttribute();
+ if(attribute == identifierAttribute){
+ throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");
+ }
+
+ // To implement the Notification API, we need to make a note of what
+ // the old attribute value was, so that we can pass that info when
+ // we call the onSet method.
+ var oldValueOrValues = this._getValueOrValues(item, attribute);
+
+ var identity = this.getIdentity(item);
+ if(!this._pending._modifiedItems[identity]){
+ // Before we actually change the item, we make a copy of it to
+ // record the original state, so that we'll be able to revert if
+ // the revert method gets called. If the item has already been
+ // modified then there's no need to do this now, since we already
+ // have a record of the original state.
+ var copyOfItemState = {};
+ for(var key in item){
+ if((key === this._storeRefPropName) || (key === this._itemNumPropName) || (key === this._rootItemPropName)){
+ copyOfItemState[key] = item[key];
+ }else if(key === this._reverseRefMap){
+ copyOfItemState[key] = lang.clone(item[key]);
+ }else{
+ copyOfItemState[key] = item[key].slice(0, item[key].length);
+ }
+ }
+ // Now mark the item as dirty, and save the copy of the original state
+ this._pending._modifiedItems[identity] = copyOfItemState;
+ }
+
+ // Okay, now we can actually change this attribute on the item
+ var success = false;
+
+ if(lang.isArray(newValueOrValues) && newValueOrValues.length === 0){
+
+ // If we were passed an empty array as the value, that counts
+ // as "unsetting" the attribute, so we need to remove this
+ // attribute from the item.
+ success = delete item[attribute];
+ newValueOrValues = undefined; // used in the onSet Notification call below
+
+ if(this.referenceIntegrity && oldValueOrValues){
+ var oldValues = oldValueOrValues;
+ if(!lang.isArray(oldValues)){
+ oldValues = [oldValues];
+ }
+ for(var i = 0; i < oldValues.length; i++){
+ var value = oldValues[i];
+ if(this.isItem(value)){
+ this._removeReferenceFromMap(value, item, attribute);
+ }
+ }
+ }
+ }else{
+ var newValueArray;
+ if(lang.isArray(newValueOrValues)){
+ // Unfortunately, it's not safe to just do this:
+ // newValueArray = newValueOrValues;
+ // Instead, we need to copy the array, which slice() does very nicely.
+ // This is so that our internal data structure won't
+ // get corrupted if the user mucks with the values array *after*
+ // calling setValues().
+ newValueArray = newValueOrValues.slice(0, newValueOrValues.length);
+ }else{
+ newValueArray = [newValueOrValues];
+ }
+
+ //We need to handle reference integrity if this is on.
+ //In the case of set, we need to see if references were added or removed
+ //and update the reference tracking map accordingly.
+ if(this.referenceIntegrity){
+ if(oldValueOrValues){
+ var oldValues = oldValueOrValues;
+ if(!lang.isArray(oldValues)){
+ oldValues = [oldValues];
+ }
+ //Use an associative map to determine what was added/removed from the list.
+ //Should be O(n) performant. First look at all the old values and make a list of them
+ //Then for any item not in the old list, we add it. If it was already present, we remove it.
+ //Then we pass over the map and any references left it it need to be removed (IE, no match in
+ //the new values list).
+ var map = {};
+ arrayUtil.forEach(oldValues, function(possibleItem){
+ if(this.isItem(possibleItem)){
+ var id = this.getIdentity(possibleItem);
+ map[id.toString()] = true;
+ }
+ }, this);
+ arrayUtil.forEach(newValueArray, function(possibleItem){
+ if(this.isItem(possibleItem)){
+ var id = this.getIdentity(possibleItem);
+ if(map[id.toString()]){
+ delete map[id.toString()];
+ }else{
+ this._addReferenceToMap(possibleItem, item, attribute);
+ }
+ }
+ }, this);
+ for(var rId in map){
+ var removedItem;
+ if(this._itemsByIdentity){
+ removedItem = this._itemsByIdentity[rId];
+ }else{
+ removedItem = this._arrayOfAllItems[rId];
+ }
+ this._removeReferenceFromMap(removedItem, item, attribute);
+ }
+ }else{
+ //Everything is new (no old values) so we have to just
+ //insert all the references, if any.
+ for(var i = 0; i < newValueArray.length; i++){
+ var value = newValueArray[i];
+ if(this.isItem(value)){
+ this._addReferenceToMap(value, item, attribute);
+ }
+ }
+ }
+ }
+ item[attribute] = newValueArray;
+ success = true;
+ }
+
+ // Now we make the dojo.data.api.Notification call
+ if(callOnSet){
+ this.onSet(item, attribute, oldValueOrValues, newValueOrValues);
+ }
+ return success; // boolean
+ },
+
+ _addReferenceToMap: function(/* item */ refItem, /* item */ parentItem, /* string */ attribute){
+ // summary:
+ // Method to add an reference map entry for an item and attribute.
+ // description:
+ // Method to add an reference map entry for an item and attribute. //
+ // refItem:
+ // The item that is referenced.
+ // parentItem:
+ // The item that holds the new reference to refItem.
+ // attribute:
+ // The attribute on parentItem that contains the new reference.
+
+ var parentId = this.getIdentity(parentItem);
+ var references = refItem[this._reverseRefMap];
+
+ if(!references){
+ references = refItem[this._reverseRefMap] = {};
+ }
+ var itemRef = references[parentId];
+ if(!itemRef){
+ itemRef = references[parentId] = {};
+ }
+ itemRef[attribute] = true;
+ },
+
+ _removeReferenceFromMap: function(/* item */ refItem, /* item */ parentItem, /* string */ attribute){
+ // summary:
+ // Method to remove an reference map entry for an item and attribute.
+ // description:
+ // Method to remove an reference map entry for an item and attribute. This will
+ // also perform cleanup on the map such that if there are no more references at all to
+ // the item, its reference object and entry are removed.
+ //
+ // refItem:
+ // The item that is referenced.
+ // parentItem:
+ // The item holding a reference to refItem.
+ // attribute:
+ // The attribute on parentItem that contains the reference.
+ var identity = this.getIdentity(parentItem);
+ var references = refItem[this._reverseRefMap];
+ var itemId;
+ if(references){
+ for(itemId in references){
+ if(itemId == identity){
+ delete references[itemId][attribute];
+ if(this._isEmpty(references[itemId])){
+ delete references[itemId];
+ }
+ }
+ }
+ if(this._isEmpty(references)){
+ delete refItem[this._reverseRefMap];
+ }
+ }
+ },
+
+ _dumpReferenceMap: function(){
+ // summary:
+ // Function to dump the reverse reference map of all items in the store for debug purposes.
+ // description:
+ // Function to dump the reverse reference map of all items in the store for debug purposes.
+ var i;
+ for(i = 0; i < this._arrayOfAllItems.length; i++){
+ var item = this._arrayOfAllItems[i];
+ if(item && item[this._reverseRefMap]){
+ console.log("Item: [" + this.getIdentity(item) + "] is referenced by: " + jsonUtil.toJson(item[this._reverseRefMap]));
+ }
+ }
+ },
+
+ _getValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute){
+ var valueOrValues = undefined;
+ if(this.hasAttribute(item, attribute)){
+ var valueArray = this.getValues(item, attribute);
+ if(valueArray.length == 1){
+ valueOrValues = valueArray[0];
+ }else{
+ valueOrValues = valueArray;
+ }
+ }
+ return valueOrValues;
+ },
+
+ _flatten: function(/* anything */ value){
+ if(this.isItem(value)){
+ // Given an item, return an serializable object that provides a
+ // reference to the item.
+ // For example, given kermit:
+ // var kermit = store.newItem({id:2, name:"Kermit"});
+ // we want to return
+ // {_reference:2}
+ return {_reference: this.getIdentity(value)};
+ }else{
+ if(typeof value === "object"){
+ for(var type in this._datatypeMap){
+ var typeMap = this._datatypeMap[type];
+ if(lang.isObject(typeMap) && !lang.isFunction(typeMap)){
+ if(value instanceof typeMap.type){
+ if(!typeMap.serialize){
+ throw new Error("ItemFileWriteStore: No serializer defined for type mapping: [" + type + "]");
+ }
+ return {_type: type, _value: typeMap.serialize(value)};
+ }
+ } else if(value instanceof typeMap){
+ //SImple mapping, therefore, return as a toString serialization.
+ return {_type: type, _value: value.toString()};
+ }
+ }
+ }
+ return value;
+ }
+ },
+
+ _getNewFileContentString: function(){
+ // summary:
+ // Generate a string that can be saved to a file.
+ // The result should look similar to:
+ // http://trac.dojotoolkit.org/browser/dojo/trunk/tests/data/countries.json
+ var serializableStructure = {};
+
+ var identifierAttribute = this._getIdentifierAttribute();
+ if(identifierAttribute !== Number){
+ serializableStructure.identifier = identifierAttribute;
+ }
+ if(this._labelAttr){
+ serializableStructure.label = this._labelAttr;
+ }
+ serializableStructure.items = [];
+ for(var i = 0; i < this._arrayOfAllItems.length; ++i){
+ var item = this._arrayOfAllItems[i];
+ if(item !== null){
+ var serializableItem = {};
+ for(var key in item){
+ if(key !== this._storeRefPropName && key !== this._itemNumPropName && key !== this._reverseRefMap && key !== this._rootItemPropName){
+ var valueArray = this.getValues(item, key);
+ if(valueArray.length == 1){
+ serializableItem[key] = this._flatten(valueArray[0]);
+ }else{
+ var serializableArray = [];
+ for(var j = 0; j < valueArray.length; ++j){
+ serializableArray.push(this._flatten(valueArray[j]));
+ serializableItem[key] = serializableArray;
+ }
+ }
+ }
+ }
+ serializableStructure.items.push(serializableItem);
+ }
+ }
+ var prettyPrint = true;
+ return jsonUtil.toJson(serializableStructure, prettyPrint);
+ },
+
+ _isEmpty: function(something){
+ // summary:
+ // Function to determine if an array or object has no properties or values.
+ // something:
+ // The array or object to examine.
+ var empty = true;
+ if(lang.isObject(something)){
+ var i;
+ for(i in something){
+ empty = false;
+ break;
+ }
+ }else if(lang.isArray(something)){
+ if(something.length > 0){
+ empty = false;
+ }
+ }
+ return empty; //boolean
+ },
+
+ save: function(/* object */ keywordArgs){
+ // summary: See dojo.data.api.Write.save()
+ this._assert(!this._saveInProgress);
+
+ // this._saveInProgress is set to true, briefly, from when save is first called to when it completes
+ this._saveInProgress = true;
+
+ var self = this;
+ var saveCompleteCallback = function(){
+ self._pending = {
+ _newItems:{},
+ _modifiedItems:{},
+ _deletedItems:{}
+ };
+
+ self._saveInProgress = false; // must come after this._pending is cleared, but before any callbacks
+ if(keywordArgs && keywordArgs.onComplete){
+ var scope = keywordArgs.scope || window.global;
+ keywordArgs.onComplete.call(scope);
+ }
+ };
+ var saveFailedCallback = function(err){
+ self._saveInProgress = false;
+ if(keywordArgs && keywordArgs.onError){
+ var scope = keywordArgs.scope || window.global;
+ keywordArgs.onError.call(scope, err);
+ }
+ };
+
+ if(this._saveEverything){
+ var newFileContentString = this._getNewFileContentString();
+ this._saveEverything(saveCompleteCallback, saveFailedCallback, newFileContentString);
+ }
+ if(this._saveCustom){
+ this._saveCustom(saveCompleteCallback, saveFailedCallback);
+ }
+ if(!this._saveEverything && !this._saveCustom){
+ // Looks like there is no user-defined save-handler function.
+ // That's fine, it just means the datastore is acting as a "mock-write"
+ // store -- changes get saved in memory but don't get saved to disk.
+ saveCompleteCallback();
+ }
+ },
+
+ revert: function(){
+ // summary: See dojo.data.api.Write.revert()
+ this._assert(!this._saveInProgress);
+
+ var identity;
+ for(identity in this._pending._modifiedItems){
+ // find the original item and the modified item that replaced it
+ var copyOfItemState = this._pending._modifiedItems[identity];
+ var modifiedItem = null;
+ if(this._itemsByIdentity){
+ modifiedItem = this._itemsByIdentity[identity];
+ }else{
+ modifiedItem = this._arrayOfAllItems[identity];
+ }
+
+ // Restore the original item into a full-fledged item again, we want to try to
+ // keep the same object instance as if we don't it, causes bugs like #9022.
+ copyOfItemState[this._storeRefPropName] = this;
+ for(var key in modifiedItem){
+ delete modifiedItem[key];
+ }
+ lang.mixin(modifiedItem, copyOfItemState);
+ }
+ var deletedItem;
+ for(identity in this._pending._deletedItems){
+ deletedItem = this._pending._deletedItems[identity];
+ deletedItem[this._storeRefPropName] = this;
+ var index = deletedItem[this._itemNumPropName];
+
+ //Restore the reverse refererence map, if any.
+ if(deletedItem["backup_" + this._reverseRefMap]){
+ deletedItem[this._reverseRefMap] = deletedItem["backup_" + this._reverseRefMap];
+ delete deletedItem["backup_" + this._reverseRefMap];
+ }
+ this._arrayOfAllItems[index] = deletedItem;
+ if(this._itemsByIdentity){
+ this._itemsByIdentity[identity] = deletedItem;
+ }
+ if(deletedItem[this._rootItemPropName]){
+ this._arrayOfTopLevelItems.push(deletedItem);
+ }
+ }
+ //We have to pass through it again and restore the reference maps after all the
+ //undeletes have occurred.
+ for(identity in this._pending._deletedItems){
+ deletedItem = this._pending._deletedItems[identity];
+ if(deletedItem["backupRefs_" + this._reverseRefMap]){
+ arrayUtil.forEach(deletedItem["backupRefs_" + this._reverseRefMap], function(reference){
+ var refItem;
+ if(this._itemsByIdentity){
+ refItem = this._itemsByIdentity[reference.id];
+ }else{
+ refItem = this._arrayOfAllItems[reference.id];
+ }
+ this._addReferenceToMap(refItem, deletedItem, reference.attr);
+ }, this);
+ delete deletedItem["backupRefs_" + this._reverseRefMap];
+ }
+ }
+
+ for(identity in this._pending._newItems){
+ var newItem = this._pending._newItems[identity];
+ newItem[this._storeRefPropName] = null;
+ // null out the new item, but don't change the array index so
+ // so we can keep using _arrayOfAllItems.length.
+ this._arrayOfAllItems[newItem[this._itemNumPropName]] = null;
+ if(newItem[this._rootItemPropName]){
+ this._removeArrayElement(this._arrayOfTopLevelItems, newItem);
+ }
+ if(this._itemsByIdentity){
+ delete this._itemsByIdentity[identity];
+ }
+ }
+
+ this._pending = {
+ _newItems:{},
+ _modifiedItems:{},
+ _deletedItems:{}
+ };
+ return true; // boolean
+ },
+
+ isDirty: function(/* item? */ item){
+ // summary: See dojo.data.api.Write.isDirty()
+ if(item){
+ // return true if the item is dirty
+ var identity = this.getIdentity(item);
+ return new Boolean(this._pending._newItems[identity] ||
+ this._pending._modifiedItems[identity] ||
+ this._pending._deletedItems[identity]).valueOf(); // boolean
+ }else{
+ // return true if the store is dirty -- which means return true
+ // if there are any new items, dirty items, or modified items
+ return !this._isEmpty(this._pending._newItems) ||
+ !this._isEmpty(this._pending._modifiedItems) ||
+ !this._isEmpty(this._pending._deletedItems); // boolean
+ }
+ },
+
+/* dojo.data.api.Notification */
+
+ onSet: function(/* item */ item,
+ /*attribute-name-string*/ attribute,
+ /*object|array*/ oldValue,
+ /*object|array*/ newValue){
+ // summary: See dojo.data.api.Notification.onSet()
+
+ // No need to do anything. This method is here just so that the
+ // client code can connect observers to it.
+ },
+
+ onNew: function(/* item */ newItem, /*object?*/ parentInfo){
+ // summary: See dojo.data.api.Notification.onNew()
+
+ // No need to do anything. This method is here just so that the
+ // client code can connect observers to it.
+ },
+
+ onDelete: function(/* item */ deletedItem){
+ // summary: See dojo.data.api.Notification.onDelete()
+
+ // No need to do anything. This method is here just so that the
+ // client code can connect observers to it.
+ },
+
+ close: function(/* object? */ request){
+ // summary:
+ // Over-ride of base close function of ItemFileReadStore to add in check for store state.
+ // description:
+ // Over-ride of base close function of ItemFileReadStore to add in check for store state.
+ // If the store is still dirty (unsaved changes), then an error will be thrown instead of
+ // clearing the internal state for reload from the url.
+
+ //Clear if not dirty ... or throw an error
+ if(this.clearOnClose){
+ if(!this.isDirty()){
+ this.inherited(arguments);
+ }else{
+ //Only throw an error if the store was dirty and we were loading from a url (cannot reload from url until state is saved).
+ throw new Error("dojo.data.ItemFileWriteStore: There are unsaved changes present in the store. Please save or revert the changes before invoking close.");
+ }
+ }
+ }
+});
+
+});
diff --git a/lib/dojo/data/ObjectStore.js b/lib/dojo/data/ObjectStore.js
index 8ccc4f853..f0c241379 100644
--- a/lib/dojo/data/ObjectStore.js
+++ b/lib/dojo/data/ObjectStore.js
@@ -4,484 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.data.ObjectStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.ObjectStore"] = true;
-dojo.provide("dojo.data.ObjectStore");
-dojo.require("dojo.regexp");
-
-
-
-dojo.declare("dojo.data.ObjectStore", null,{
- objectStore: null,
- constructor: function(options){
- // summary:
- // A Dojo Data implementation that wraps Dojo object stores for backwards
- // compatibility.
- // options:
- // The configuration information to pass into the data store.
- // options.objectStore:
- // The object store to use as the source provider for this data store
- dojo.mixin(this, options);
- },
- labelProperty: "label",
-
- getValue: function(/*Object*/ item, /*String*/property, /*value?*/defaultValue){
- // summary:
- // Gets the value of an item's 'property'
- //
- // item:
- // The item to get the value from
- // property:
- // property to look up value for
- // defaultValue:
- // the default value
-
- return typeof item.get === "function" ? item.get(property) :
- property in item ?
- item[property] : defaultValue;
- },
- getValues: function(item, property){
- // summary:
- // Gets the value of an item's 'property' and returns
- // it. If this value is an array it is just returned,
- // if not, the value is added to an array and that is returned.
- //
- // item: /* object */
- // property: /* string */
- // property to look up value for
-
- var val = this.getValue(item,property);
- return val instanceof Array ? val : val === undefined ? [] : [val];
- },
-
- getAttributes: function(item){
- // summary:
- // Gets the available attributes of an item's 'property' and returns
- // it as an array.
- //
- // item: /* object */
-
- var res = [];
- for(var i in item){
- if(item.hasOwnProperty(i) && !(i.charAt(0) == '_' && i.charAt(1) == '_')){
- res.push(i);
- }
- }
- return res;
- },
-
- hasAttribute: function(item,attribute){
- // summary:
- // Checks to see if item has attribute
- //
- // item: /* object */
- // attribute: /* string */
- return attribute in item;
- },
-
- containsValue: function(item, attribute, value){
- // summary:
- // Checks to see if 'item' has 'value' at 'attribute'
- //
- // item: /* object */
- // attribute: /* string */
- // value: /* anything */
- return dojo.indexOf(this.getValues(item,attribute),value) > -1;
- },
-
-
- isItem: function(item){
- // summary:
- // Checks to see if the argument is an item
- //
- // item: /* object */
- // attribute: /* string */
-
- // we have no way of determining if it belongs, we just have object returned from
- // service queries
- return (typeof item == 'object') && item && !(item instanceof Date);
- },
-
- isItemLoaded: function(item){
- // summary:
- // Checks to see if the item is loaded.
- //
- // item: /* object */
-
- return item && typeof item.load !== "function";
- },
-
- loadItem: function(args){
- // summary:
- // Loads an item and calls the callback handler. Note, that this will call the callback
- // handler even if the item is loaded. Consequently, you can use loadItem to ensure
- // that an item is loaded is situations when the item may or may not be loaded yet.
- // If you access a value directly through property access, you can use this to load
- // a lazy value as well (doesn't need to be an item).
- //
- // example:
- // store.loadItem({
- // item: item, // this item may or may not be loaded
- // onItem: function(item){
- // // do something with the item
- // }
- // });
-
- var item;
- if(typeof args.item.load === "function"){
- dojo.when(args.item.load(), function(result){
- item = result; // in synchronous mode this can allow loadItem to return the value
- var func = result instanceof Error ? args.onError : args.onItem;
- if(func){
- func.call(args.scope, result);
- }
- });
- }else if(args.onItem){
- // even if it is already loaded, we will use call the callback, this makes it easier to
- // use when it is not known if the item is loaded (you can always safely call loadItem).
- args.onItem.call(args.scope, args.item);
- }
- return item;
- },
- close: function(request){
- return request && request.abort && request.abort();
- },
- fetch: function(args){
- // summary:
- // See dojo.data.api.Read.fetch
- //
-
- args = args || {};
- var self = this;
- var scope = args.scope || self;
- var query = args.query;
- if(typeof query == "object"){ // can be null, but that is ignore by for-in
- query = dojo.delegate(query); // don't modify the original
- for(var i in query){
- // find any strings and convert them to regular expressions for wildcard support
- var required = query[i];
- if(typeof required == "string"){
- query[i] = RegExp("^" + dojo.regexp.escapeString(required, "*?").replace(/\*/g, '.*').replace(/\?/g, '.') + "$", args.queryOptions && args.queryOptions.ignoreCase ? "mi" : "m");
- query[i].toString = (function(original){
- return function(){
- return original;
- }
- })(required);
- }
- }
- }
-
- var results = this.objectStore.query(query, args);
- dojo.when(results.total, function(totalCount){
- dojo.when(results, function(results){
- if(args.onBegin){
- args.onBegin.call(scope, totalCount || results.length, args);
- }
- if(args.onItem){
- for(var i=0; i<results.length;i++){
- args.onItem.call(scope, results[i], args);
- }
- }
- if(args.onComplete){
- args.onComplete.call(scope, args.onItem ? null : results, args);
- }
- return results;
- }, errorHandler);
- }, errorHandler);
- function errorHandler(error){
- if(args.onError){
- args.onError.call(scope, error, args);
- }
- }
- args.abort = function(){
- // abort the request
- if(results.cancel){
- results.cancel();
- }
- };
- args.store = this;
- return args;
- },
- getFeatures: function(){
- // summary:
- // return the store feature set
-
- return {
- "dojo.data.api.Read": !!this.objectStore.get,
- "dojo.data.api.Identity": true,
- "dojo.data.api.Write": !!this.objectStore.put,
- "dojo.data.api.Notification": true
- };
- },
-
- getLabel: function(/* item */ item){
- // summary:
- // See dojo.data.api.Read.getLabel()
- if(this.isItem(item)){
- return this.getValue(item,this.labelProperty); //String
- }
- return undefined; //undefined
- },
-
- getLabelAttributes: function(/* item */ item){
- // summary:
- // See dojo.data.api.Read.getLabelAttributes()
- return [this.labelProperty]; //array
- },
-
- //Identity API Support
-
-
- getIdentity: function(item){
- return item.getId ? item.getId() : item[this.objectStore.idProperty || "id"];
- },
-
- getIdentityAttributes: function(item){
- // summary:
- // returns the attributes which are used to make up the
- // identity of an item. Basically returns this.objectStore.idProperty
-
- return [this.objectStore.idProperty];
- },
-
- fetchItemByIdentity: function(args){
- // summary:
- // fetch an item by its identity, by looking in our index of what we have loaded
- var item;
- dojo.when(this.objectStore.get(args.identity),
- function(result){
- item = result;
- args.onItem.call(args.scope, result);
- },
- function(error){
- args.onError.call(args.scope, error);
- }
- );
- return item;
- },
-
- newItem: function(data, parentInfo){
- // summary:
- // adds a new item to the store at the specified point.
- // Takes two parameters, data, and options.
- //
- // data: /* object */
- // The data to be added in as an item.
- if(parentInfo){
- // get the previous value or any empty array
- var values = this.getValue(parentInfo.parent,parentInfo.attribute,[]);
- // set the new value
- values = values.concat([data]);
- data.__parent = values;
- this.setValue(parentInfo.parent, parentInfo.attribute, values);
- }
- this._dirtyObjects.push({object:data, save: true});
- this.onNew(data);
- return data;
- },
- deleteItem: function(item){
- // summary:
- // deletes item and any references to that item from the store.
- //
- // item:
- // item to delete
- //
-
- // If the desire is to delete only one reference, unsetAttribute or
- // setValue is the way to go.
- this.changing(item, true);
-
- this.onDelete(item);
- },
- setValue: function(item, attribute, value){
- // summary:
- // sets 'attribute' on 'item' to 'value'
-
- var old = item[attribute];
- this.changing(item);
- item[attribute]=value;
- this.onSet(item,attribute,old,value);
- },
- setValues: function(item, attribute, values){
- // summary:
- // sets 'attribute' on 'item' to 'value' value
- // must be an array.
-
-
- if(!dojo.isArray(values)){
- throw new Error("setValues expects to be passed an Array object as its value");
- }
- this.setValue(item,attribute,values);
- },
-
- unsetAttribute: function(item, attribute){
- // summary:
- // unsets 'attribute' on 'item'
-
- this.changing(item);
- var old = item[attribute];
- delete item[attribute];
- this.onSet(item,attribute,old,undefined);
- },
-
- _dirtyObjects: [],
-
- changing: function(object,_deleting){
- // summary:
- // adds an object to the list of dirty objects. This object
- // contains a reference to the object itself as well as a
- // cloned and trimmed version of old object for use with
- // revert.
- object.__isDirty = true;
- //if an object is already in the list of dirty objects, don't add it again
- //or it will overwrite the premodification data set.
- for(var i=0; i<this._dirtyObjects.length; i++){
- var dirty = this._dirtyObjects[i];
- if(object==dirty.object){
- if(_deleting){
- // we are deleting, no object is an indicator of deletiong
- dirty.object = false;
- if(!this._saveNotNeeded){
- dirty.save = true;
- }
- }
- return;
- }
- }
- var old = object instanceof Array ? [] : {};
- for(i in object){
- if(object.hasOwnProperty(i)){
- old[i] = object[i];
- }
- }
- this._dirtyObjects.push({object: !_deleting && object, old: old, save: !this._saveNotNeeded});
- },
-
- save: function(kwArgs){
- // summary:
- // Saves the dirty data using object store provider. See dojo.data.api.Write for API.
- //
- // kwArgs.global:
- // This will cause the save to commit the dirty data for all
- // ObjectStores as a single transaction.
- //
- // kwArgs.revertOnError
- // This will cause the changes to be reverted if there is an
- // error on the save. By default a revert is executed unless
- // a value of false is provide for this parameter.
-
- kwArgs = kwArgs || {};
- var result, actions = [];
- var alreadyRecorded = {};
- var savingObjects = [];
- var self;
- var dirtyObjects = this._dirtyObjects;
- var left = dirtyObjects.length;// this is how many changes are remaining to be received from the server
- try{
- dojo.connect(kwArgs,"onError",function(){
- if(kwArgs.revertOnError !== false){
- var postCommitDirtyObjects = dirtyObjects;
- dirtyObjects = savingObjects;
- var numDirty = 0; // make sure this does't do anything if it is called again
- jr.revert(); // revert if there was an error
- self._dirtyObjects = postCommitDirtyObjects;
- }
- else{
- self._dirtyObjects = dirtyObject.concat(savingObjects);
- }
- });
- if(this.objectStore.transaction){
- var transaction = this.objectStore.transaction();
- }
- for(var i = 0; i < dirtyObjects.length; i++){
- var dirty = dirtyObjects[i];
- var object = dirty.object;
- var old = dirty.old;
- delete object.__isDirty;
- if(object){
- result = this.objectStore.put(object, {overwrite: !!old});
- }
- else{
- result = this.objectStore.remove(this.getIdentity(old));
- }
- savingObjects.push(dirty);
- dirtyObjects.splice(i--,1);
- dojo.when(result, function(value){
- if(!(--left)){
- if(kwArgs.onComplete){
- kwArgs.onComplete.call(kwArgs.scope, actions);
- }
- }
- },function(value){
-
- // on an error we want to revert, first we want to separate any changes that were made since the commit
- left = -1; // first make sure that success isn't called
- kwArgs.onError.call(kwArgs.scope, value);
- });
-
- }
- if(transaction){
- transaction.commit();
- }
- }catch(e){
- kwArgs.onError.call(kwArgs.scope, value);
- }
-
-
- },
-
- revert: function(kwArgs){
- // summary
- // returns any modified data to its original state prior to a save();
- //
- var dirtyObjects = this._dirtyObjects;
- for(var i = dirtyObjects.length; i > 0;){
- i--;
- var dirty = dirtyObjects[i];
- var object = dirty.object;
- var old = dirty.old;
- if(object && old){
- // changed
- for(var j in old){
- if(old.hasOwnProperty(j) && object[j] !== old[j]){
- this.onSet(object, j, object[j], old[j]);
- object[j] = old[j];
- }
- }
- for(j in object){
- if(!old.hasOwnProperty(j)){
- this.onSet(object, j, object[j]);
- delete object[j];
- }
- }
- }else if(!old){
- // was an addition, remove it
- this.onDelete(object);
- }else{
- // was a deletion, we will add it back
- this.onNew(old);
- }
- delete (object || old).__isDirty;
- dirtyObjects.splice(i, 1);
- }
-
-
- },
- isDirty: function(item){
- // summary
- // returns true if the item is marked as dirty or true if there are any dirty items
- if(!item){
- return !!this._dirtyObjects.length;
- }
- return item.__isDirty;
- },
- //Notifcation Support
-
- onSet: function(){},
- onNew: function(){},
- onDelete: function(){}
- }
-);
-
-}
+//>>built
+define("dojo/data/ObjectStore",["../_base/lang","../Evented","../_base/declare","../_base/Deferred","../_base/array","../_base/connect","../regexp"],function(_1,_2,_3,_4,_5,_6,_7){return _3("dojo.data.ObjectStore",[_2],{objectStore:null,constructor:function(_8){_1.mixin(this,_8);},labelProperty:"label",getValue:function(_9,_a,_b){return typeof _9.get==="function"?_9.get(_a):_a in _9?_9[_a]:_b;},getValues:function(_c,_d){var _e=this.getValue(_c,_d);return _e instanceof Array?_e:_e===undefined?[]:[_e];},getAttributes:function(_f){var res=[];for(var i in _f){if(_f.hasOwnProperty(i)&&!(i.charAt(0)=="_"&&i.charAt(1)=="_")){res.push(i);}}return res;},hasAttribute:function(_10,_11){return _11 in _10;},containsValue:function(_12,_13,_14){return _5.indexOf(this.getValues(_12,_13),_14)>-1;},isItem:function(_15){return (typeof _15=="object")&&_15&&!(_15 instanceof Date);},isItemLoaded:function(_16){return _16&&typeof _16.load!=="function";},loadItem:function(_17){var _18;if(typeof _17.item.load==="function"){_4.when(_17.item.load(),function(_19){_18=_19;var _1a=_19 instanceof Error?_17.onError:_17.onItem;if(_1a){_1a.call(_17.scope,_19);}});}else{if(_17.onItem){_17.onItem.call(_17.scope,_17.item);}}return _18;},close:function(_1b){return _1b&&_1b.abort&&_1b.abort();},fetch:function(_1c){_1c=_1.delegate(_1c,_1c&&_1c.queryOptions);var _1d=this;var _1e=_1c.scope||_1d;var _1f=_1c.query;if(typeof _1f=="object"){_1f=_1.delegate(_1f);for(var i in _1f){var _20=_1f[i];if(typeof _20=="string"){_1f[i]=RegExp("^"+_7.escapeString(_20,"*?").replace(/\*/g,".*").replace(/\?/g,".")+"$",_1c.ignoreCase?"mi":"m");_1f[i].toString=(function(_21){return function(){return _21;};})(_20);}}}var _22=this.objectStore.query(_1f,_1c);_4.when(_22.total,function(_23){_4.when(_22,function(_24){if(_1c.onBegin){_1c.onBegin.call(_1e,_23||_24.length,_1c);}if(_1c.onItem){for(var i=0;i<_24.length;i++){_1c.onItem.call(_1e,_24[i],_1c);}}if(_1c.onComplete){_1c.onComplete.call(_1e,_1c.onItem?null:_24,_1c);}return _24;},_25);},_25);function _25(_26){if(_1c.onError){_1c.onError.call(_1e,_26,_1c);}};_1c.abort=function(){if(_22.cancel){_22.cancel();}};if(_22.observe){if(this.observing){this.observing.cancel();}this.observing=_22.observe(function(_27,_28,_29){if(_5.indexOf(_1d._dirtyObjects,_27)==-1){if(_28==-1){_1d.onNew(_27);}else{if(_29==-1){_1d.onDelete(_27);}else{for(var i in _27){if(i!=_1d.objectStore.idProperty){_1d.onSet(_27,i,null,_27[i]);}}}}}},true);}this.onFetch(_22);_1c.store=this;return _1c;},getFeatures:function(){return {"dojo.data.api.Read":!!this.objectStore.get,"dojo.data.api.Identity":true,"dojo.data.api.Write":!!this.objectStore.put,"dojo.data.api.Notification":true};},getLabel:function(_2a){if(this.isItem(_2a)){return this.getValue(_2a,this.labelProperty);}return undefined;},getLabelAttributes:function(_2b){return [this.labelProperty];},getIdentity:function(_2c){return this.objectStore.getIdentity?this.objectStore.getIdentity(_2c):_2c[this.objectStore.idProperty||"id"];},getIdentityAttributes:function(_2d){return [this.objectStore.idProperty];},fetchItemByIdentity:function(_2e){var _2f;_4.when(this.objectStore.get(_2e.identity),function(_30){_2f=_30;_2e.onItem.call(_2e.scope,_30);},function(_31){_2e.onError.call(_2e.scope,_31);});return _2f;},newItem:function(_32,_33){if(_33){var _34=this.getValue(_33.parent,_33.attribute,[]);_34=_34.concat([_32]);_32.__parent=_34;this.setValue(_33.parent,_33.attribute,_34);}this._dirtyObjects.push({object:_32,save:true});this.onNew(_32);return _32;},deleteItem:function(_35){this.changing(_35,true);this.onDelete(_35);},setValue:function(_36,_37,_38){var old=_36[_37];this.changing(_36);_36[_37]=_38;this.onSet(_36,_37,old,_38);},setValues:function(_39,_3a,_3b){if(!_1.isArray(_3b)){throw new Error("setValues expects to be passed an Array object as its value");}this.setValue(_39,_3a,_3b);},unsetAttribute:function(_3c,_3d){this.changing(_3c);var old=_3c[_3d];delete _3c[_3d];this.onSet(_3c,_3d,old,undefined);},_dirtyObjects:[],changing:function(_3e,_3f){_3e.__isDirty=true;for(var i=0;i<this._dirtyObjects.length;i++){var _40=this._dirtyObjects[i];if(_3e==_40.object){if(_3f){_40.object=false;if(!this._saveNotNeeded){_40.save=true;}}return;}}var old=_3e instanceof Array?[]:{};for(i in _3e){if(_3e.hasOwnProperty(i)){old[i]=_3e[i];}}this._dirtyObjects.push({object:!_3f&&_3e,old:old,save:!this._saveNotNeeded});},save:function(_41){_41=_41||{};var _42,_43=[];var _44=[];var _45=this;var _46=this._dirtyObjects;var _47=_46.length;try{_6.connect(_41,"onError",function(){if(_41.revertOnError!==false){var _48=_46;_46=_44;_45.revert();_45._dirtyObjects=_48;}else{_45._dirtyObjects=_46.concat(_44);}});if(this.objectStore.transaction){var _49=this.objectStore.transaction();}for(var i=0;i<_46.length;i++){var _4a=_46[i];var _4b=_4a.object;var old=_4a.old;delete _4b.__isDirty;if(_4b){_42=this.objectStore.put(_4b,{overwrite:!!old});}else{if(typeof old!="undefined"){_42=this.objectStore.remove(this.getIdentity(old));}}_44.push(_4a);_46.splice(i--,1);_4.when(_42,function(_4c){if(!(--_47)){if(_41.onComplete){_41.onComplete.call(_41.scope,_43);}}},function(_4d){_47=-1;_41.onError.call(_41.scope,_4d);});}if(_49){_49.commit();}}catch(e){_41.onError.call(_41.scope,value);}},revert:function(_4e){var _4f=this._dirtyObjects;for(var i=_4f.length;i>0;){i--;var _50=_4f[i];var _51=_50.object;var old=_50.old;if(_51&&old){for(var j in old){if(old.hasOwnProperty(j)&&_51[j]!==old[j]){this.onSet(_51,j,_51[j],old[j]);_51[j]=old[j];}}for(j in _51){if(!old.hasOwnProperty(j)){this.onSet(_51,j,_51[j]);delete _51[j];}}}else{if(!old){this.onDelete(_51);}else{this.onNew(old);}}delete (_51||old).__isDirty;_4f.splice(i,1);}},isDirty:function(_52){if(!_52){return !!this._dirtyObjects.length;}return _52.__isDirty;},onSet:function(){},onNew:function(){},onDelete:function(){},onFetch:function(_53){}});}); \ No newline at end of file
diff --git a/lib/dojo/data/ObjectStore.js.uncompressed.js b/lib/dojo/data/ObjectStore.js.uncompressed.js
new file mode 100644
index 000000000..8f54e6a4f
--- /dev/null
+++ b/lib/dojo/data/ObjectStore.js.uncompressed.js
@@ -0,0 +1,505 @@
+define("dojo/data/ObjectStore", ["../_base/lang", "../Evented", "../_base/declare", "../_base/Deferred", "../_base/array",
+ "../_base/connect", "../regexp"
+], function(lang, Evented, declare, Deferred, array, connect, regexp) {
+ // module:
+ // dojo/data/ObjectStore
+ // summary:
+ // TODOC
+
+
+return declare("dojo.data.ObjectStore", [Evented],{
+ objectStore: null,
+ constructor: function(options){
+ // summary:
+ // A Dojo Data implementation that wraps Dojo object stores for backwards
+ // compatibility.
+ // options:
+ // The configuration information to pass into the data store.
+ // options.objectStore:
+ // The object store to use as the source provider for this data store
+ lang.mixin(this, options);
+ },
+ labelProperty: "label",
+
+ getValue: function(/*Object*/ item, /*String*/property, /*value?*/defaultValue){
+ // summary:
+ // Gets the value of an item's 'property'
+ //
+ // item:
+ // The item to get the value from
+ // property:
+ // property to look up value for
+ // defaultValue:
+ // the default value
+
+ return typeof item.get === "function" ? item.get(property) :
+ property in item ?
+ item[property] : defaultValue;
+ },
+ getValues: function(item, property){
+ // summary:
+ // Gets the value of an item's 'property' and returns
+ // it. If this value is an array it is just returned,
+ // if not, the value is added to an array and that is returned.
+ //
+ // item: /* object */
+ // property: /* string */
+ // property to look up value for
+
+ var val = this.getValue(item,property);
+ return val instanceof Array ? val : val === undefined ? [] : [val];
+ },
+
+ getAttributes: function(item){
+ // summary:
+ // Gets the available attributes of an item's 'property' and returns
+ // it as an array.
+ //
+ // item: /* object */
+
+ var res = [];
+ for(var i in item){
+ if(item.hasOwnProperty(i) && !(i.charAt(0) == '_' && i.charAt(1) == '_')){
+ res.push(i);
+ }
+ }
+ return res;
+ },
+
+ hasAttribute: function(item,attribute){
+ // summary:
+ // Checks to see if item has attribute
+ //
+ // item: /* object */
+ // attribute: /* string */
+ return attribute in item;
+ },
+
+ containsValue: function(item, attribute, value){
+ // summary:
+ // Checks to see if 'item' has 'value' at 'attribute'
+ //
+ // item: /* object */
+ // attribute: /* string */
+ // value: /* anything */
+ return array.indexOf(this.getValues(item,attribute),value) > -1;
+ },
+
+
+ isItem: function(item){
+ // summary:
+ // Checks to see if the argument is an item
+ //
+ // item: /* object */
+ // attribute: /* string */
+
+ // we have no way of determining if it belongs, we just have object returned from
+ // service queries
+ return (typeof item == 'object') && item && !(item instanceof Date);
+ },
+
+ isItemLoaded: function(item){
+ // summary:
+ // Checks to see if the item is loaded.
+ //
+ // item: /* object */
+
+ return item && typeof item.load !== "function";
+ },
+
+ loadItem: function(args){
+ // summary:
+ // Loads an item and calls the callback handler. Note, that this will call the callback
+ // handler even if the item is loaded. Consequently, you can use loadItem to ensure
+ // that an item is loaded is situations when the item may or may not be loaded yet.
+ // If you access a value directly through property access, you can use this to load
+ // a lazy value as well (doesn't need to be an item).
+ //
+ // example:
+ // store.loadItem({
+ // item: item, // this item may or may not be loaded
+ // onItem: function(item){
+ // // do something with the item
+ // }
+ // });
+
+ var item;
+ if(typeof args.item.load === "function"){
+ Deferred.when(args.item.load(), function(result){
+ item = result; // in synchronous mode this can allow loadItem to return the value
+ var func = result instanceof Error ? args.onError : args.onItem;
+ if(func){
+ func.call(args.scope, result);
+ }
+ });
+ }else if(args.onItem){
+ // even if it is already loaded, we will use call the callback, this makes it easier to
+ // use when it is not known if the item is loaded (you can always safely call loadItem).
+ args.onItem.call(args.scope, args.item);
+ }
+ return item;
+ },
+ close: function(request){
+ return request && request.abort && request.abort();
+ },
+ fetch: function(args){
+ // summary:
+ // See dojo.data.api.Read.fetch
+ //
+
+ args = lang.delegate(args, args && args.queryOptions);
+ var self = this;
+ var scope = args.scope || self;
+ var query = args.query;
+ if(typeof query == "object"){ // can be null, but that is ignore by for-in
+ query = lang.delegate(query); // don't modify the original
+ for(var i in query){
+ // find any strings and convert them to regular expressions for wildcard support
+ var required = query[i];
+ if(typeof required == "string"){
+ query[i] = RegExp("^" + regexp.escapeString(required, "*?").replace(/\*/g, '.*').replace(/\?/g, '.') + "$", args.ignoreCase ? "mi" : "m");
+ query[i].toString = (function(original){
+ return function(){
+ return original;
+ }
+ })(required);
+ }
+ }
+ }
+
+ var results = this.objectStore.query(query, args);
+ Deferred.when(results.total, function(totalCount){
+ Deferred.when(results, function(results){
+ if(args.onBegin){
+ args.onBegin.call(scope, totalCount || results.length, args);
+ }
+ if(args.onItem){
+ for(var i=0; i<results.length;i++){
+ args.onItem.call(scope, results[i], args);
+ }
+ }
+ if(args.onComplete){
+ args.onComplete.call(scope, args.onItem ? null : results, args);
+ }
+ return results;
+ }, errorHandler);
+ }, errorHandler);
+ function errorHandler(error){
+ if(args.onError){
+ args.onError.call(scope, error, args);
+ }
+ }
+ args.abort = function(){
+ // abort the request
+ if(results.cancel){
+ results.cancel();
+ }
+ };
+ if(results.observe){
+ if(this.observing){
+ // if we were previously observing, cancel the last time to avoid multiple notifications. Just the best we can do for the impedance mismatch between APIs
+ this.observing.cancel();
+ }
+ this.observing = results.observe(function(object, removedFrom, insertedInto){
+ if(array.indexOf(self._dirtyObjects, object) == -1){
+ if(removedFrom == -1){
+ self.onNew(object);
+ }
+ else if(insertedInto == -1){
+ self.onDelete(object);
+ }
+ else{
+ for(var i in object){
+ if(i != self.objectStore.idProperty){
+ self.onSet(object, i, null, object[i]);
+ }
+ }
+ }
+ }
+ }, true);
+ }
+ this.onFetch(results);
+ args.store = this;
+ return args;
+ },
+ getFeatures: function(){
+ // summary:
+ // return the store feature set
+
+ return {
+ "dojo.data.api.Read": !!this.objectStore.get,
+ "dojo.data.api.Identity": true,
+ "dojo.data.api.Write": !!this.objectStore.put,
+ "dojo.data.api.Notification": true
+ };
+ },
+
+ getLabel: function(/* item */ item){
+ // summary:
+ // See dojo.data.api.Read.getLabel()
+ if(this.isItem(item)){
+ return this.getValue(item,this.labelProperty); //String
+ }
+ return undefined; //undefined
+ },
+
+ getLabelAttributes: function(/* item */ item){
+ // summary:
+ // See dojo.data.api.Read.getLabelAttributes()
+ return [this.labelProperty]; //array
+ },
+
+ //Identity API Support
+
+
+ getIdentity: function(item){
+ return this.objectStore.getIdentity ? this.objectStore.getIdentity(item) : item[this.objectStore.idProperty || "id"];
+ },
+
+ getIdentityAttributes: function(item){
+ // summary:
+ // returns the attributes which are used to make up the
+ // identity of an item. Basically returns this.objectStore.idProperty
+
+ return [this.objectStore.idProperty];
+ },
+
+ fetchItemByIdentity: function(args){
+ // summary:
+ // fetch an item by its identity, by looking in our index of what we have loaded
+ var item;
+ Deferred.when(this.objectStore.get(args.identity),
+ function(result){
+ item = result;
+ args.onItem.call(args.scope, result);
+ },
+ function(error){
+ args.onError.call(args.scope, error);
+ }
+ );
+ return item;
+ },
+
+ newItem: function(data, parentInfo){
+ // summary:
+ // adds a new item to the store at the specified point.
+ // Takes two parameters, data, and options.
+ //
+ // data: Object
+ // The data to be added in as an item.
+
+ // TODOC: parentInfo
+ if(parentInfo){
+ // get the previous value or any empty array
+ var values = this.getValue(parentInfo.parent,parentInfo.attribute,[]);
+ // set the new value
+ values = values.concat([data]);
+ data.__parent = values;
+ this.setValue(parentInfo.parent, parentInfo.attribute, values);
+ }
+ this._dirtyObjects.push({object:data, save: true});
+ this.onNew(data);
+ return data;
+ },
+ deleteItem: function(item){
+ // summary:
+ // deletes item and any references to that item from the store.
+ //
+ // item:
+ // item to delete
+ //
+
+ // If the desire is to delete only one reference, unsetAttribute or
+ // setValue is the way to go.
+ this.changing(item, true);
+
+ this.onDelete(item);
+ },
+ setValue: function(item, attribute, value){
+ // summary:
+ // sets 'attribute' on 'item' to 'value'
+
+ var old = item[attribute];
+ this.changing(item);
+ item[attribute]=value;
+ this.onSet(item,attribute,old,value);
+ },
+ setValues: function(item, attribute, values){
+ // summary:
+ // sets 'attribute' on 'item' to 'value' value
+ // must be an array.
+
+ if(!lang.isArray(values)){
+ throw new Error("setValues expects to be passed an Array object as its value");
+ }
+ this.setValue(item,attribute,values);
+ },
+
+ unsetAttribute: function(item, attribute){
+ // summary:
+ // unsets 'attribute' on 'item'
+
+ this.changing(item);
+ var old = item[attribute];
+ delete item[attribute];
+ this.onSet(item,attribute,old,undefined);
+ },
+
+ _dirtyObjects: [],
+
+ changing: function(object,_deleting){
+ // summary:
+ // adds an object to the list of dirty objects. This object
+ // contains a reference to the object itself as well as a
+ // cloned and trimmed version of old object for use with
+ // revert.
+ object.__isDirty = true;
+ //if an object is already in the list of dirty objects, don't add it again
+ //or it will overwrite the premodification data set.
+ for(var i=0; i<this._dirtyObjects.length; i++){
+ var dirty = this._dirtyObjects[i];
+ if(object==dirty.object){
+ if(_deleting){
+ // we are deleting, no object is an indicator of deletiong
+ dirty.object = false;
+ if(!this._saveNotNeeded){
+ dirty.save = true;
+ }
+ }
+ return;
+ }
+ }
+ var old = object instanceof Array ? [] : {};
+ for(i in object){
+ if(object.hasOwnProperty(i)){
+ old[i] = object[i];
+ }
+ }
+ this._dirtyObjects.push({object: !_deleting && object, old: old, save: !this._saveNotNeeded});
+ },
+
+ save: function(kwArgs){
+ // summary:
+ // Saves the dirty data using object store provider. See dojo.data.api.Write for API.
+ //
+ // kwArgs.global:
+ // This will cause the save to commit the dirty data for all
+ // ObjectStores as a single transaction.
+ //
+ // kwArgs.revertOnError
+ // This will cause the changes to be reverted if there is an
+ // error on the save. By default a revert is executed unless
+ // a value of false is provide for this parameter.
+
+ // TODOC: kwArgs pseudo
+ kwArgs = kwArgs || {};
+ var result, actions = [];
+ var savingObjects = [];
+ var self = this;
+ var dirtyObjects = this._dirtyObjects;
+ var left = dirtyObjects.length;// this is how many changes are remaining to be received from the server
+ try{
+ connect.connect(kwArgs,"onError",function(){
+ if(kwArgs.revertOnError !== false){
+ var postCommitDirtyObjects = dirtyObjects;
+ dirtyObjects = savingObjects;
+ self.revert(); // revert if there was an error
+ self._dirtyObjects = postCommitDirtyObjects;
+ }
+ else{
+ self._dirtyObjects = dirtyObjects.concat(savingObjects);
+ }
+ });
+ if(this.objectStore.transaction){
+ var transaction = this.objectStore.transaction();
+ }
+ for(var i = 0; i < dirtyObjects.length; i++){
+ var dirty = dirtyObjects[i];
+ var object = dirty.object;
+ var old = dirty.old;
+ delete object.__isDirty;
+ if(object){
+ result = this.objectStore.put(object, {overwrite: !!old});
+ }
+ else if(typeof old != "undefined"){
+ result = this.objectStore.remove(this.getIdentity(old));
+ }
+ savingObjects.push(dirty);
+ dirtyObjects.splice(i--,1);
+ Deferred.when(result, function(value){
+ if(!(--left)){
+ if(kwArgs.onComplete){
+ kwArgs.onComplete.call(kwArgs.scope, actions);
+ }
+ }
+ },function(value){
+
+ // on an error we want to revert, first we want to separate any changes that were made since the commit
+ left = -1; // first make sure that success isn't called
+ kwArgs.onError.call(kwArgs.scope, value);
+ });
+
+ }
+ if(transaction){
+ transaction.commit();
+ }
+ }catch(e){
+ kwArgs.onError.call(kwArgs.scope, value);
+ }
+ },
+
+ revert: function(kwArgs){
+ // summary:
+ // returns any modified data to its original state prior to a save();
+ //
+ var dirtyObjects = this._dirtyObjects;
+ for(var i = dirtyObjects.length; i > 0;){
+ i--;
+ var dirty = dirtyObjects[i];
+ var object = dirty.object;
+ var old = dirty.old;
+ if(object && old){
+ // changed
+ for(var j in old){
+ if(old.hasOwnProperty(j) && object[j] !== old[j]){
+ this.onSet(object, j, object[j], old[j]);
+ object[j] = old[j];
+ }
+ }
+ for(j in object){
+ if(!old.hasOwnProperty(j)){
+ this.onSet(object, j, object[j]);
+ delete object[j];
+ }
+ }
+ }else if(!old){
+ // was an addition, remove it
+ this.onDelete(object);
+ }else{
+ // was a deletion, we will add it back
+ this.onNew(old);
+ }
+ delete (object || old).__isDirty;
+ dirtyObjects.splice(i, 1);
+ }
+
+ },
+ isDirty: function(item){
+ // summary:
+ // returns true if the item is marked as dirty or true if there are any dirty items
+ if(!item){
+ return !!this._dirtyObjects.length;
+ }
+ return item.__isDirty;
+ },
+ //Notifcation Support
+
+ onSet: function(){},
+ onNew: function(){},
+ onDelete: function(){},
+ // an extra to get result sets
+ onFetch: function(results){}
+
+ }
+);
+});
diff --git a/lib/dojo/data/api/Identity.js b/lib/dojo/data/api/Identity.js
index 9d99f3d64..110113bc8 100644
--- a/lib/dojo/data/api/Identity.js
+++ b/lib/dojo/data/api/Identity.js
@@ -4,112 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.data.api.Identity"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.api.Identity"] = true;
-dojo.provide("dojo.data.api.Identity");
-dojo.require("dojo.data.api.Read");
-
-
-dojo.declare("dojo.data.api.Identity", dojo.data.api.Read, {
- // summary:
- // This is an abstract API that data provider implementations conform to.
- // This file defines methods signatures and intentionally leaves all the
- // methods unimplemented.
-
- getFeatures: function(){
- // summary:
- // See dojo.data.api.Read.getFeatures()
- return {
- 'dojo.data.api.Read': true,
- 'dojo.data.api.Identity': true
- };
- },
-
- getIdentity: function(/* item */ item){
- // summary:
- // Returns a unique identifier for an item. The return value will be
- // either a string or something that has a toString() method (such as,
- // for example, a dojox.uuid.Uuid object).
- // item:
- // The item from the store from which to obtain its identifier.
- // exceptions:
- // Conforming implementations may throw an exception or return null if
- // item is not an item.
- // example:
- // | var itemId = store.getIdentity(kermit);
- // | assert(kermit === store.findByIdentity(store.getIdentity(kermit)));
- throw new Error('Unimplemented API: dojo.data.api.Identity.getIdentity');
- var itemIdentityString = null;
- return itemIdentityString; // string
- },
-
- getIdentityAttributes: function(/* item */ item){
- // summary:
- // Returns an array of attribute names that are used to generate the identity.
- // For most stores, this is a single attribute, but for some complex stores
- // such as RDB backed stores that use compound (multi-attribute) identifiers
- // it can be more than one. If the identity is not composed of attributes
- // on the item, it will return null. This function is intended to identify
- // the attributes that comprise the identity so that so that during a render
- // of all attributes, the UI can hide the the identity information if it
- // chooses.
- // item:
- // The item from the store from which to obtain the array of public attributes that
- // compose the identifier, if any.
- // example:
- // | var itemId = store.getIdentity(kermit);
- // | var identifiers = store.getIdentityAttributes(itemId);
- // | assert(typeof identifiers === "array" || identifiers === null);
- throw new Error('Unimplemented API: dojo.data.api.Identity.getIdentityAttributes');
- return null; // string
- },
-
-
- 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,
- //
- // keywordArgs:
- // An anonymous object that defines the item to locate and callbacks to invoke when the
- // item has been located and load has completed. The format of the object is as follows:
- // {
- // identity: string|object,
- // onItem: Function,
- // onError: Function,
- // scope: object
- // }
- // The *identity* parameter.
- // The identity parameter is the identity of the item you wish to locate and load
- // This attribute is required. It should be a string or an object that toString()
- // can be called on.
- //
- // The *onItem* parameter.
- // Function(item)
- // The onItem parameter is the callback to invoke when the item has been loaded. It takes only one
- // parameter, the item located, or null if none found.
- //
- // The *onError* parameter.
- // Function(error)
- // The onError parameter is the callback to invoke when the item load encountered an error. It takes only one
- // parameter, the error object
- //
- // The *scope* parameter.
- // If a scope object is provided, all of the callback functions (onItem,
- // onError, etc) will be invoked in the context of the scope object.
- // In the body of the callback function, the value of the "this"
- // keyword will be the scope object. If no scope object is provided,
- // the callback functions will be called in the context of dojo.global.
- // For example, onItem.call(scope, item, request) vs.
- // onItem.call(dojo.global, item, request)
- if(!this.isItemLoaded(keywordArgs.item)){
- throw new Error('Unimplemented API: dojo.data.api.Identity.fetchItemByIdentity');
- }
- }
-});
-
-}
+//>>built
+define("dojo/data/api/Identity",["../..","./Read"],function(_1){_1.declare("dojo.data.api.Identity",_1.data.api.Read,{getFeatures:function(){return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true};},getIdentity:function(_2){throw new Error("Unimplemented API: dojo.data.api.Identity.getIdentity");},getIdentityAttributes:function(_3){throw new Error("Unimplemented API: dojo.data.api.Identity.getIdentityAttributes");},fetchItemByIdentity:function(_4){if(!this.isItemLoaded(_4.item)){throw new Error("Unimplemented API: dojo.data.api.Identity.fetchItemByIdentity");}}});return _1.data.api.Identity;}); \ No newline at end of file
diff --git a/lib/dojo/data/api/Identity.js.uncompressed.js b/lib/dojo/data/api/Identity.js.uncompressed.js
new file mode 100644
index 000000000..2fd720703
--- /dev/null
+++ b/lib/dojo/data/api/Identity.js.uncompressed.js
@@ -0,0 +1,107 @@
+define("dojo/data/api/Identity", ["../..", "./Read"], function(dojo) {
+ // module:
+ // dojo/data/api/Identity
+ // summary:
+ // TODOC
+
+
+dojo.declare("dojo.data.api.Identity", dojo.data.api.Read, {
+ // summary:
+ // This is an abstract API that data provider implementations conform to.
+ // This file defines methods signatures and intentionally leaves all the
+ // methods unimplemented.
+
+ getFeatures: function(){
+ // summary:
+ // See dojo.data.api.Read.getFeatures()
+ return {
+ 'dojo.data.api.Read': true,
+ 'dojo.data.api.Identity': true
+ };
+ },
+
+ getIdentity: function(/* item */ item){
+ // summary:
+ // Returns a unique identifier for an item. The return value will be
+ // either a string or something that has a toString() method (such as,
+ // for example, a dojox.uuid.Uuid object).
+ // item:
+ // The item from the store from which to obtain its identifier.
+ // exceptions:
+ // Conforming implementations may throw an exception or return null if
+ // item is not an item.
+ // example:
+ // | var itemId = store.getIdentity(kermit);
+ // | assert(kermit === store.findByIdentity(store.getIdentity(kermit)));
+ throw new Error('Unimplemented API: dojo.data.api.Identity.getIdentity');
+ },
+
+ getIdentityAttributes: function(/* item */ item){
+ // summary:
+ // Returns an array of attribute names that are used to generate the identity.
+ // For most stores, this is a single attribute, but for some complex stores
+ // such as RDB backed stores that use compound (multi-attribute) identifiers
+ // it can be more than one. If the identity is not composed of attributes
+ // on the item, it will return null. This function is intended to identify
+ // the attributes that comprise the identity so that so that during a render
+ // of all attributes, the UI can hide the the identity information if it
+ // chooses.
+ // item:
+ // The item from the store from which to obtain the array of public attributes that
+ // compose the identifier, if any.
+ // example:
+ // | var itemId = store.getIdentity(kermit);
+ // | var identifiers = store.getIdentityAttributes(itemId);
+ // | assert(typeof identifiers === "array" || identifiers === null);
+ throw new Error('Unimplemented API: dojo.data.api.Identity.getIdentityAttributes');
+ },
+
+
+ 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,
+ //
+ // keywordArgs:
+ // An anonymous object that defines the item to locate and callbacks to invoke when the
+ // item has been located and load has completed. The format of the object is as follows:
+ // {
+ // identity: string|object,
+ // onItem: Function,
+ // onError: Function,
+ // scope: object
+ // }
+ // The *identity* parameter.
+ // The identity parameter is the identity of the item you wish to locate and load
+ // This attribute is required. It should be a string or an object that toString()
+ // can be called on.
+ //
+ // The *onItem* parameter.
+ // Function(item)
+ // The onItem parameter is the callback to invoke when the item has been loaded. It takes only one
+ // parameter, the item located, or null if none found.
+ //
+ // The *onError* parameter.
+ // Function(error)
+ // The onError parameter is the callback to invoke when the item load encountered an error. It takes only one
+ // parameter, the error object
+ //
+ // The *scope* parameter.
+ // If a scope object is provided, all of the callback functions (onItem,
+ // onError, etc) will be invoked in the context of the scope object.
+ // In the body of the callback function, the value of the "this"
+ // keyword will be the scope object. If no scope object is provided,
+ // the callback functions will be called in the context of dojo.global.
+ // For example, onItem.call(scope, item, request) vs.
+ // onItem.call(dojo.global, item, request)
+ if(!this.isItemLoaded(keywordArgs.item)){
+ throw new Error('Unimplemented API: dojo.data.api.Identity.fetchItemByIdentity');
+ }
+ }
+});
+
+return dojo.data.api.Identity;
+});
diff --git a/lib/dojo/data/api/Notification.js b/lib/dojo/data/api/Notification.js
index 33daa3010..d4da32e41 100644
--- a/lib/dojo/data/api/Notification.js
+++ b/lib/dojo/data/api/Notification.js
@@ -4,124 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.data.api.Notification"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.api.Notification"] = true;
-dojo.provide("dojo.data.api.Notification");
-dojo.require("dojo.data.api.Read");
-
-
-dojo.declare("dojo.data.api.Notification", dojo.data.api.Read, {
- // summary:
- // This is an abstract API that data provider implementations conform to.
- // This file defines functions signatures and intentionally leaves all the
- // functions unimplemented.
- //
- // description:
- // This API defines a set of APIs that all datastores that conform to the
- // Notifications API must implement. In general, most stores will implement
- // these APIs as no-op functions for users who wish to monitor them to be able
- // to connect to then via dojo.connect(). For non-users of dojo.connect,
- // they should be able to just replace the function on the store to obtain
- // notifications. Both read-only and read-write stores may implement
- // this feature. In the case of a read-only store, this feature makes sense if
- // the store itself does internal polling to a back-end server and periodically updates
- // its cache of items (deletes, adds, and updates).
- //
- // example:
- //
- // | function onSet(item, attribute, oldValue, newValue) {
- // | //Do something with the information...
- // | };
- // | var store = new some.newStore();
- // | dojo.connect(store, "onSet", onSet);
-
- getFeatures: function(){
- // summary:
- // See dojo.data.api.Read.getFeatures()
- return {
- 'dojo.data.api.Read': true,
- 'dojo.data.api.Notification': true
- };
- },
-
- onSet: function(/* item */ item,
- /* attribute-name-string */ attribute,
- /* object | array */ oldValue,
- /* object | array */ newValue){
- // summary:
- // This function is called any time an item is modified via setValue, setValues, unsetAttribute, etc.
- // description:
- // This function is called any time an item is modified via setValue, setValues, unsetAttribute, etc.
- // Its purpose is to provide a hook point for those who wish to monitor actions on items in the store
- // in a simple manner. The general expected usage is to dojo.connect() to the store's
- // implementation and be called after the store function is called.
- //
- // item:
- // The item being modified.
- // attribute:
- // The attribute being changed represented as a string name.
- // oldValue:
- // The old value of the attribute. In the case of single value calls, such as setValue, unsetAttribute, etc,
- // this value will be generally be an atomic value of some sort (string, int, etc, object). In the case of
- // multi-valued attributes, it will be an array.
- // newValue:
- // The new value of the attribute. In the case of single value calls, such as setValue, this value will be
- // generally be an atomic value of some sort (string, int, etc, object). In the case of multi-valued attributes,
- // it will be an array. In the case of unsetAttribute, the new value will be 'undefined'.
- //
- // returns:
- // Nothing.
- throw new Error('Unimplemented API: dojo.data.api.Notification.onSet');
- },
-
- onNew: function(/* item */ newItem, /*object?*/ parentInfo){
- // summary:
- // This function is called any time a new item is created in the store.
- // It is called immediately after the store newItem processing has completed.
- // description:
- // This function is called any time a new item is created in the store.
- // It is called immediately after the store newItem processing has completed.
- //
- // newItem:
- // The item created.
- // parentInfo:
- // An optional javascript object that is passed when the item created was placed in the store
- // hierarchy as a value f another item's attribute, instead of a root level item. Note that if this
- // function is invoked with a value for parentInfo, then onSet is not invoked stating the attribute of
- // the parent item was modified. This is to avoid getting two notification events occurring when a new item
- // with a parent is created. The structure passed in is as follows:
- // {
- // item: someItem, //The parent item
- // attribute: "attribute-name-string", //The attribute the new item was assigned to.
- // oldValue: something //Whatever was the previous value for the attribute.
- // //If it is a single-value attribute only, then this value will be a single value.
- // //If it was a multi-valued attribute, then this will be an array of all the values minues the new one.
- // newValue: something //The new value of the attribute. In the case of single value calls, such as setValue, this value will be
- // //generally be an atomic value of some sort (string, int, etc, object). In the case of multi-valued attributes,
- // //it will be an array.
- // }
- //
- // returns:
- // Nothing.
- throw new Error('Unimplemented API: dojo.data.api.Notification.onNew');
- },
-
- onDelete: function(/* item */ deletedItem){
- // summary:
- // This function is called any time an item is deleted from the store.
- // It is called immediately after the store deleteItem processing has completed.
- // description:
- // This function is called any time an item is deleted from the store.
- // It is called immediately after the store deleteItem processing has completed.
- //
- // deletedItem:
- // The item deleted.
- //
- // returns:
- // Nothing.
- throw new Error('Unimplemented API: dojo.data.api.Notification.onDelete');
- }
-});
-
-}
+//>>built
+define("dojo/data/api/Notification",["../..","./Read"],function(_1){_1.declare("dojo.data.api.Notification",_1.data.api.Read,{getFeatures:function(){return {"dojo.data.api.Read":true,"dojo.data.api.Notification":true};},onSet:function(_2,_3,_4,_5){throw new Error("Unimplemented API: dojo.data.api.Notification.onSet");},onNew:function(_6,_7){throw new Error("Unimplemented API: dojo.data.api.Notification.onNew");},onDelete:function(_8){throw new Error("Unimplemented API: dojo.data.api.Notification.onDelete");}});return _1.data.api.Notification;}); \ No newline at end of file
diff --git a/lib/dojo/data/api/Notification.js.uncompressed.js b/lib/dojo/data/api/Notification.js.uncompressed.js
new file mode 100644
index 000000000..85269bec1
--- /dev/null
+++ b/lib/dojo/data/api/Notification.js.uncompressed.js
@@ -0,0 +1,122 @@
+define("dojo/data/api/Notification", ["../..", "./Read"], function(dojo) {
+ // module:
+ // dojo/data/api/Notification
+ // summary:
+ // TODOC
+
+
+dojo.declare("dojo.data.api.Notification", dojo.data.api.Read, {
+ // summary:
+ // This is an abstract API that data provider implementations conform to.
+ // This file defines functions signatures and intentionally leaves all the
+ // functions unimplemented.
+ //
+ // description:
+ // This API defines a set of APIs that all datastores that conform to the
+ // Notifications API must implement. In general, most stores will implement
+ // these APIs as no-op functions for users who wish to monitor them to be able
+ // to connect to then via dojo.connect(). For non-users of dojo.connect,
+ // they should be able to just replace the function on the store to obtain
+ // notifications. Both read-only and read-write stores may implement
+ // this feature. In the case of a read-only store, this feature makes sense if
+ // the store itself does internal polling to a back-end server and periodically updates
+ // its cache of items (deletes, adds, and updates).
+ //
+ // example:
+ //
+ // | function onSet(item, attribute, oldValue, newValue) {
+ // | //Do something with the information...
+ // | };
+ // | var store = new some.newStore();
+ // | dojo.connect(store, "onSet", onSet);
+
+ getFeatures: function(){
+ // summary:
+ // See dojo.data.api.Read.getFeatures()
+ return {
+ 'dojo.data.api.Read': true,
+ 'dojo.data.api.Notification': true
+ };
+ },
+
+ onSet: function(/* item */ item,
+ /* attribute-name-string */ attribute,
+ /* object|array */ oldValue,
+ /* object|array */ newValue){
+ // summary:
+ // This function is called any time an item is modified via setValue, setValues, unsetAttribute, etc.
+ // description:
+ // This function is called any time an item is modified via setValue, setValues, unsetAttribute, etc.
+ // Its purpose is to provide a hook point for those who wish to monitor actions on items in the store
+ // in a simple manner. The general expected usage is to dojo.connect() to the store's
+ // implementation and be called after the store function is called.
+ //
+ // item:
+ // The item being modified.
+ // attribute:
+ // The attribute being changed represented as a string name.
+ // oldValue:
+ // The old value of the attribute. In the case of single value calls, such as setValue, unsetAttribute, etc,
+ // this value will be generally be an atomic value of some sort (string, int, etc, object). In the case of
+ // multi-valued attributes, it will be an array.
+ // newValue:
+ // The new value of the attribute. In the case of single value calls, such as setValue, this value will be
+ // generally be an atomic value of some sort (string, int, etc, object). In the case of multi-valued attributes,
+ // it will be an array. In the case of unsetAttribute, the new value will be 'undefined'.
+ //
+ // returns:
+ // Nothing.
+ throw new Error('Unimplemented API: dojo.data.api.Notification.onSet');
+ },
+
+ onNew: function(/* item */ newItem, /*object?*/ parentInfo){
+ // summary:
+ // This function is called any time a new item is created in the store.
+ // It is called immediately after the store newItem processing has completed.
+ // description:
+ // This function is called any time a new item is created in the store.
+ // It is called immediately after the store newItem processing has completed.
+ //
+ // newItem:
+ // The item created.
+ // parentInfo:
+ // An optional javascript object that is passed when the item created was placed in the store
+ // hierarchy as a value f another item's attribute, instead of a root level item. Note that if this
+ // function is invoked with a value for parentInfo, then onSet is not invoked stating the attribute of
+ // the parent item was modified. This is to avoid getting two notification events occurring when a new item
+ // with a parent is created. The structure passed in is as follows:
+ // {
+ // item: someItem, //The parent item
+ // attribute: "attribute-name-string", //The attribute the new item was assigned to.
+ // oldValue: something //Whatever was the previous value for the attribute.
+ // //If it is a single-value attribute only, then this value will be a single value.
+ // //If it was a multi-valued attribute, then this will be an array of all the values minues the new one.
+ // newValue: something //The new value of the attribute. In the case of single value calls, such as setValue, this value will be
+ // //generally be an atomic value of some sort (string, int, etc, object). In the case of multi-valued attributes,
+ // //it will be an array.
+ // }
+ //
+ // returns:
+ // Nothing.
+ throw new Error('Unimplemented API: dojo.data.api.Notification.onNew');
+ },
+
+ onDelete: function(/* item */ deletedItem){
+ // summary:
+ // This function is called any time an item is deleted from the store.
+ // It is called immediately after the store deleteItem processing has completed.
+ // description:
+ // This function is called any time an item is deleted from the store.
+ // It is called immediately after the store deleteItem processing has completed.
+ //
+ // deletedItem:
+ // The item deleted.
+ //
+ // returns:
+ // Nothing.
+ throw new Error('Unimplemented API: dojo.data.api.Notification.onDelete');
+ }
+});
+
+return dojo.data.api.Notification;
+});
diff --git a/lib/dojo/data/api/Read.js b/lib/dojo/data/api/Read.js
index ff8518cd4..4682c6f51 100644
--- a/lib/dojo/data/api/Read.js
+++ b/lib/dojo/data/api/Read.js
@@ -4,511 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.data.api.Read"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.api.Read"] = true;
-dojo.provide("dojo.data.api.Read");
-dojo.require("dojo.data.api.Request");
-
-
-dojo.declare("dojo.data.api.Read", null, {
- // summary:
- // This is an abstract API that data provider implementations conform to.
- // This file defines methods signatures and intentionally leaves all the
- // methods unimplemented. For more information on the dojo.data APIs,
- // please visit: http://www.dojotoolkit.org/node/98
-
- getValue: function( /* item */ item,
- /* attribute-name-string */ attribute,
- /* value? */ defaultValue){
- // summary:
- // Returns a single attribute value.
- // Returns defaultValue if and only if *item* does not have a value for *attribute*.
- // Returns null if and only if null was explicitly set as the attribute value.
- // Returns undefined if and only if the item does not have a value for the
- // given attribute (which is the same as saying the item does not have the attribute).
- // description:
- // Saying that an "item x does not have a value for an attribute y"
- // is identical to saying that an "item x does not have attribute y".
- // It is an oxymoron to say "that attribute is present but has no values"
- // or "the item has that attribute but does not have any attribute values".
- // If store.hasAttribute(item, attribute) returns false, then
- // store.getValue(item, attribute) will return undefined.
- //
- // item:
- // The item to access values on.
- // attribute:
- // The attribute to access represented as a string.
- // defaultValue:
- // Optional. A default value to use for the getValue return in the attribute does not exist or has no value.
- //
- // exceptions:
- // Throws an exception if *item* is not an item, or *attribute* is not a string
- // example:
- // | var darthVader = store.getValue(lukeSkywalker, "father");
- var attributeValue = null;
- throw new Error('Unimplemented API: dojo.data.api.Read.getValue');
- return attributeValue; // a literal, an item, null, or undefined (never an array)
- },
-
- getValues: function(/* item */ item,
- /* attribute-name-string */ attribute){
- // summary:
- // This getValues() method works just like the getValue() method, but getValues()
- // always returns an array rather than a single attribute value. The array
- // may be empty, may contain a single attribute value, or may contain
- // many attribute values.
- // If the item does not have a value for the given attribute, then getValues()
- // will return an empty array: []. (So, if store.hasAttribute(item, attribute)
- // has a return of false, then store.getValues(item, attribute) will return [].)
- //
- // item:
- // The item to access values on.
- // attribute:
- // The attribute to access represented as a string.
- //
- // exceptions:
- // Throws an exception if *item* is not an item, or *attribute* is not a string
- // example:
- // | var friendsOfLuke = store.getValues(lukeSkywalker, "friends");
- var array = [];
- throw new Error('Unimplemented API: dojo.data.api.Read.getValues');
- return array; // an array that may contain literals and items
- },
-
- getAttributes: function(/* item */ item){
- // summary:
- // Returns an array with all the attributes that this item has. This
- // method will always return an array; if the item has no attributes
- // at all, getAttributes() will return an empty array: [].
- //
- // item:
- // The item to access attributes on.
- //
- // exceptions:
- // Throws an exception if *item* is not an item, or *attribute* is not a string
- // example:
- // | var array = store.getAttributes(kermit);
- var array = [];
- throw new Error('Unimplemented API: dojo.data.api.Read.getAttributes');
- return array; // array
- },
-
- hasAttribute: function( /* item */ item,
- /* attribute-name-string */ attribute){
- // summary:
- // Returns true if the given *item* has a value for the given *attribute*.
- //
- // item:
- // The item to access attributes on.
- // attribute:
- // The attribute to access represented as a string.
- //
- // exceptions:
- // Throws an exception if *item* is not an item, or *attribute* is not a string
- // example:
- // | var trueOrFalse = store.hasAttribute(kermit, "color");
- throw new Error('Unimplemented API: dojo.data.api.Read.hasAttribute');
- return false; // boolean
- },
-
- containsValue: function(/* item */ item,
- /* attribute-name-string */ attribute,
- /* anything */ value){
- // summary:
- // Returns true if the given *value* is one of the values that getValues()
- // would return.
- //
- // item:
- // The item to access values on.
- // attribute:
- // The attribute to access represented as a string.
- // value:
- // The value to match as a value for the attribute.
- //
- // exceptions:
- // Throws an exception if *item* is not an item, or *attribute* is not a string
- // example:
- // | var trueOrFalse = store.containsValue(kermit, "color", "green");
- throw new Error('Unimplemented API: dojo.data.api.Read.containsValue');
- return false; // boolean
- },
-
- isItem: function(/* anything */ something){
- // summary:
- // Returns true if *something* is an item and came from the store instance.
- // Returns false if *something* is a literal, an item from another store instance,
- // or is any object other than an item.
- //
- // something:
- // Can be anything.
- //
- // example:
- // | var yes = store.isItem(store.newItem());
- // | var no = store.isItem("green");
- throw new Error('Unimplemented API: dojo.data.api.Read.isItem');
- return false; // boolean
- },
-
- isItemLoaded: function(/* anything */ something){
- // summary:
- // Returns false if isItem(something) is false. Returns false if
- // if isItem(something) is true but the the item is not yet loaded
- // in local memory (for example, if the item has not yet been read
- // from the server).
- //
- // something:
- // Can be anything.
- //
- // example:
- // | var yes = store.isItemLoaded(store.newItem());
- // | var no = store.isItemLoaded("green");
- throw new Error('Unimplemented API: dojo.data.api.Read.isItemLoaded');
- return false; // boolean
- },
-
- loadItem: function(/* object */ keywordArgs){
- // summary:
- // Given an item, this method loads the item so that a subsequent call
- // to store.isItemLoaded(item) will return true. If a call to
- // isItemLoaded() returns true before loadItem() is even called,
- // then loadItem() need not do any work at all and will not even invoke
- // the callback handlers. So, before invoking this method, check that
- // the item has not already been loaded.
- // keywordArgs:
- // An anonymous object that defines the item to load and callbacks to invoke when the
- // load has completed. The format of the object is as follows:
- // {
- // item: object,
- // onItem: Function,
- // onError: Function,
- // scope: object
- // }
- // The *item* parameter.
- // The item parameter is an object that represents the item in question that should be
- // contained by the store. This attribute is required.
-
- // The *onItem* parameter.
- // Function(item)
- // The onItem parameter is the callback to invoke when the item has been loaded. It takes only one
- // parameter, the fully loaded item.
- //
- // The *onError* parameter.
- // Function(error)
- // The onError parameter is the callback to invoke when the item load encountered an error. It takes only one
- // parameter, the error object
- //
- // The *scope* parameter.
- // If a scope object is provided, all of the callback functions (onItem,
- // onError, etc) will be invoked in the context of the scope object.
- // In the body of the callback function, the value of the "this"
- // keyword will be the scope object. If no scope object is provided,
- // the callback functions will be called in the context of dojo.global().
- // For example, onItem.call(scope, item, request) vs.
- // onItem.call(dojo.global(), item, request)
- if(!this.isItemLoaded(keywordArgs.item)){
- throw new Error('Unimplemented API: dojo.data.api.Read.loadItem');
- }
- },
-
- fetch: function(/* Object */ keywordArgs){
- // summary:
- // Given a query and set of defined options, such as a start and count of items to return,
- // this method executes the query and makes the results available as data items.
- // The format and expectations of stores is that they operate in a generally asynchronous
- // manner, therefore callbacks are always used to return items located by the fetch parameters.
- //
- // description:
- // A Request object will always be returned and is returned immediately.
- // The basic request is nothing more than the keyword args passed to fetch and
- // an additional function attached, abort(). The returned request object may then be used
- // to cancel a fetch. All data items returns are passed through the callbacks defined in the
- // fetch parameters and are not present on the 'request' object.
- //
- // This does not mean that custom stores can not add methods and properties to the request object
- // returned, only that the API does not require it. For more info about the Request API,
- // see dojo.data.api.Request
- //
- // keywordArgs:
- // The keywordArgs parameter may either be an instance of
- // conforming to dojo.data.api.Request or may be a simple anonymous object
- // that may contain any of the following:
- // {
- // query: query-object or query-string,
- // queryOptions: object,
- // onBegin: Function,
- // onItem: Function,
- // onComplete: Function,
- // onError: Function,
- // scope: object,
- // start: int
- // count: int
- // sort: array
- // }
- // All implementations should accept keywordArgs objects with any of
- // the 9 standard properties: query, onBegin, onItem, onComplete, onError
- // scope, sort, start, and count. Some implementations may accept additional
- // properties in the keywordArgs object as valid parameters, such as
- // {includeOutliers:true}.
- //
- // The *query* parameter.
- // The query may be optional in some data store implementations.
- // The dojo.data.api.Read API does not specify the syntax or semantics
- // of the query itself -- each different data store implementation
- // may have its own notion of what a query should look like.
- // However, as of dojo 0.9, 1.0, and 1.1, all the provided datastores in dojo.data
- // and dojox.data support an object structure query, where the object is a set of
- // name/value parameters such as { attrFoo: valueBar, attrFoo1: valueBar1}. Most of the
- // dijit widgets, such as ComboBox assume this to be the case when working with a datastore
- // when they dynamically update the query. Therefore, for maximum compatibility with dijit
- // widgets the recommended query parameter is a key/value object. That does not mean that the
- // the datastore may not take alternative query forms, such as a simple string, a Date, a number,
- // or a mix of such. Ultimately, The dojo.data.api.Read API is agnostic about what the query
- // format.
- // Further note: In general for query objects that accept strings as attribute
- // value matches, the store should also support basic filtering capability, such as *
- // (match any character) and ? (match single character). An example query that is a query object
- // would be like: { attrFoo: "value*"}. Which generally means match all items where they have
- // an attribute named attrFoo, with a value that starts with 'value'.
- //
- // The *queryOptions* parameter
- // The queryOptions parameter is an optional parameter used to specify optiosn that may modify
- // the query in some fashion, such as doing a case insensitive search, or doing a deep search
- // where all items in a hierarchical representation of data are scanned instead of just the root
- // items. It currently defines two options that all datastores should attempt to honor if possible:
- // {
- // ignoreCase: boolean, //Whether or not the query should match case sensitively or not. Default behaviour is false.
- // deep: boolean //Whether or not a fetch should do a deep search of items and all child
- // //items instead of just root-level items in a datastore. Default is false.
- // }
- //
- // The *onBegin* parameter.
- // function(size, request);
- // If an onBegin callback function is provided, the callback function
- // will be called just once, before the first onItem callback is called.
- // The onBegin callback function will be passed two arguments, the
- // the total number of items identified and the Request object. If the total number is
- // unknown, then size will be -1. Note that size is not necessarily the size of the
- // collection of items returned from the query, as the request may have specified to return only a
- // subset of the total set of items through the use of the start and count parameters.
- //
- // The *onItem* parameter.
- // function(item, request);
- // If an onItem callback function is provided, the callback function
- // will be called as each item in the result is received. The callback
- // function will be passed two arguments: the item itself, and the
- // Request object.
- //
- // The *onComplete* parameter.
- // function(items, request);
- //
- // If an onComplete callback function is provided, the callback function
- // will be called just once, after the last onItem callback is called.
- // Note that if the onItem callback is not present, then onComplete will be passed
- // an array containing all items which matched the query and the request object.
- // If the onItem callback is present, then onComplete is called as:
- // onComplete(null, request).
- //
- // The *onError* parameter.
- // function(errorData, request);
- // If an onError callback function is provided, the callback function
- // will be called if there is any sort of error while attempting to
- // execute the query.
- // The onError callback function will be passed two arguments:
- // an Error object and the Request object.
- //
- // The *scope* parameter.
- // If a scope object is provided, all of the callback functions (onItem,
- // onComplete, onError, etc) will be invoked in the context of the scope
- // object. In the body of the callback function, the value of the "this"
- // keyword will be the scope object. If no scope object is provided,
- // the callback functions will be called in the context of dojo.global().
- // For example, onItem.call(scope, item, request) vs.
- // onItem.call(dojo.global(), item, request)
- //
- // The *start* parameter.
- // If a start parameter is specified, this is a indication to the datastore to
- // only start returning items once the start number of items have been located and
- // skipped. When this parameter is paired withh 'count', the store should be able
- // to page across queries with millions of hits by only returning subsets of the
- // hits for each query
- //
- // The *count* parameter.
- // If a count parameter is specified, this is a indication to the datastore to
- // only return up to that many items. This allows a fetch call that may have
- // millions of item matches to be paired down to something reasonable.
- //
- // The *sort* parameter.
- // If a sort parameter is specified, this is a indication to the datastore to
- // sort the items in some manner before returning the items. The array is an array of
- // javascript objects that must conform to the following format to be applied to the
- // fetching of items:
- // {
- // attribute: attribute || attribute-name-string,
- // descending: true|false; // Optional. Default is false.
- // }
- // Note that when comparing attributes, if an item contains no value for the attribute
- // (undefined), then it the default ascending sort logic should push it to the bottom
- // of the list. In the descending order case, it such items should appear at the top of the list.
- //
- // returns:
- // The fetch() method will return a javascript object conforming to the API
- // defined in dojo.data.api.Request. In general, it will be the keywordArgs
- // object returned with the required functions in Request.js attached.
- // Its general purpose is to provide a convenient way for a caller to abort an
- // ongoing fetch.
- //
- // The Request object may also have additional properties when it is returned
- // such as request.store property, which is a pointer to the datastore object that
- // fetch() is a method of.
- //
- // exceptions:
- // Throws an exception if the query is not valid, or if the query
- // is required but was not supplied.
- //
- // example:
- // Fetch all books identified by the query and call 'showBooks' when complete
- // | var request = store.fetch({query:"all books", onComplete: showBooks});
- // example:
- // Fetch all items in the story and call 'showEverything' when complete.
- // | var request = store.fetch(onComplete: showEverything);
- // example:
- // Fetch only 10 books that match the query 'all books', starting at the fifth book found during the search.
- // This demonstrates how paging can be done for specific queries.
- // | var request = store.fetch({query:"all books", start: 4, count: 10, onComplete: showBooks});
- // example:
- // Fetch all items that match the query, calling 'callback' each time an item is located.
- // | var request = store.fetch({query:"foo/bar", onItem:callback});
- // example:
- // Fetch the first 100 books by author King, call showKing when up to 100 items have been located.
- // | var request = store.fetch({query:{author:"King"}, start: 0, count:100, onComplete: showKing});
- // example:
- // Locate the books written by Author King, sort it on title and publisher, then return the first 100 items from the sorted items.
- // | var request = store.fetch({query:{author:"King"}, sort: [{ attribute: "title", descending: true}, {attribute: "publisher"}], ,start: 0, count:100, onComplete: 'showKing'});
- // example:
- // Fetch the first 100 books by authors starting with the name King, then call showKing when up to 100 items have been located.
- // | var request = store.fetch({query:{author:"King*"}, start: 0, count:100, onComplete: showKing});
- // example:
- // Fetch the first 100 books by authors ending with 'ing', but only have one character before it (King, Bing, Ling, Sing, etc.), then call showBooks when up to 100 items have been located.
- // | var request = store.fetch({query:{author:"?ing"}, start: 0, count:100, onComplete: showBooks});
- // example:
- // Fetch the first 100 books by author King, where the name may appear as King, king, KING, kInG, and so on, then call showKing when up to 100 items have been located.
- // | var request = store.fetch({query:{author:"King"}, queryOptions:(ignoreCase: true}, start: 0, count:100, onComplete: showKing});
- // example:
- // Paging
- // | var store = new dojo.data.LargeRdbmsStore({url:"jdbc:odbc:foobar"});
- // | var fetchArgs = {
- // | query: {type:"employees", name:"Hillary *"}, // string matching
- // | sort: [{attribute:"department", descending:true}],
- // | start: 0,
- // | count: 20,
- // | scope: displayer,
- // | onBegin: showThrobber,
- // | onItem: displayItem,
- // | onComplete: stopThrobber,
- // | onError: handleFetchError,
- // | };
- // | store.fetch(fetchArgs);
- // | ...
- // and then when the user presses the "Next Page" button...
- // | fetchArgs.start += 20;
- // | store.fetch(fetchArgs); // get the next 20 items
- var request = null;
- throw new Error('Unimplemented API: dojo.data.api.Read.fetch');
- return request; // an object conforming to the dojo.data.api.Request API
- },
-
- getFeatures: function(){
- // summary:
- // The getFeatures() method returns an simple keyword values object
- // that specifies what interface features the datastore implements.
- // A simple CsvStore may be read-only, and the only feature it
- // implements will be the 'dojo.data.api.Read' interface, so the
- // getFeatures() method will return an object like this one:
- // {'dojo.data.api.Read': true}.
- // A more sophisticated datastore might implement a variety of
- // interface features, like 'dojo.data.api.Read', 'dojo.data.api.Write',
- // 'dojo.data.api.Identity', and 'dojo.data.api.Attribution'.
- return {
- 'dojo.data.api.Read': true
- };
- },
-
- close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
- // summary:
- // The close() method is intended for instructing the store to 'close' out
- // any information associated with a particular request.
- //
- // description:
- // The close() method is intended for instructing the store to 'close' out
- // any information associated with a particular request. In general, this API
- // expects to recieve as a parameter a request object returned from a fetch.
- // It will then close out anything associated with that request, such as
- // clearing any internal datastore caches and closing any 'open' connections.
- // For some store implementations, this call may be a no-op.
- //
- // request:
- // An instance of a request for the store to use to identify what to close out.
- // If no request is passed, then the store should clear all internal caches (if any)
- // and close out all 'open' connections. It does not render the store unusable from
- // there on, it merely cleans out any current data and resets the store to initial
- // state.
- //
- // example:
- // | var request = store.fetch({onComplete: doSomething});
- // | ...
- // | store.close(request);
- throw new Error('Unimplemented API: dojo.data.api.Read.close');
- },
-
- getLabel: function(/* item */ item){
- // summary:
- // Method to inspect the item and return a user-readable 'label' for the item
- // that provides a general/adequate description of what the item is.
- //
- // description:
- // Method to inspect the item and return a user-readable 'label' for the item
- // that provides a general/adequate description of what the item is. In general
- // most labels will be a specific attribute value or collection of the attribute
- // values that combine to label the item in some manner. For example for an item
- // that represents a person it may return the label as: "firstname lastlame" where
- // the firstname and lastname are attributes on the item. If the store is unable
- // to determine an adequate human readable label, it should return undefined. Users that wish
- // to customize how a store instance labels items should replace the getLabel() function on
- // their instance of the store, or extend the store and replace the function in
- // the extension class.
- //
- // item:
- // The item to return the label for.
- //
- // returns:
- // A user-readable string representing the item or undefined if no user-readable label can
- // be generated.
- throw new Error('Unimplemented API: dojo.data.api.Read.getLabel');
- return undefined;
- },
-
- getLabelAttributes: function(/* item */ item){
- // summary:
- // Method to inspect the item and return an array of what attributes of the item were used
- // to generate its label, if any.
- //
- // description:
- // Method to inspect the item and return an array of what attributes of the item were used
- // to generate its label, if any. This function is to assist UI developers in knowing what
- // attributes can be ignored out of the attributes an item has when displaying it, in cases
- // where the UI is using the label as an overall identifer should they wish to hide
- // redundant information.
- //
- // item:
- // The item to return the list of label attributes for.
- //
- // returns:
- // An array of attribute names that were used to generate the label, or null if public attributes
- // were not used to generate the label.
- throw new Error('Unimplemented API: dojo.data.api.Read.getLabelAttributes');
- return null;
- }
-});
-
-}
+//>>built
+define("dojo/data/api/Read",["../..","./Request"],function(_1){_1.declare("dojo.data.api.Read",null,{getValue:function(_2,_3,_4){throw new Error("Unimplemented API: dojo.data.api.Read.getValue");},getValues:function(_5,_6){throw new Error("Unimplemented API: dojo.data.api.Read.getValues");},getAttributes:function(_7){throw new Error("Unimplemented API: dojo.data.api.Read.getAttributes");},hasAttribute:function(_8,_9){throw new Error("Unimplemented API: dojo.data.api.Read.hasAttribute");},containsValue:function(_a,_b,_c){throw new Error("Unimplemented API: dojo.data.api.Read.containsValue");},isItem:function(_d){throw new Error("Unimplemented API: dojo.data.api.Read.isItem");},isItemLoaded:function(_e){throw new Error("Unimplemented API: dojo.data.api.Read.isItemLoaded");},loadItem:function(_f){if(!this.isItemLoaded(_f.item)){throw new Error("Unimplemented API: dojo.data.api.Read.loadItem");}},fetch:function(_10){throw new Error("Unimplemented API: dojo.data.api.Read.fetch");},getFeatures:function(){return {"dojo.data.api.Read":true};},close:function(_11){throw new Error("Unimplemented API: dojo.data.api.Read.close");},getLabel:function(_12){throw new Error("Unimplemented API: dojo.data.api.Read.getLabel");},getLabelAttributes:function(_13){throw new Error("Unimplemented API: dojo.data.api.Read.getLabelAttributes");}});return _1.data.api.Read;}); \ No newline at end of file
diff --git a/lib/dojo/data/api/Read.js.uncompressed.js b/lib/dojo/data/api/Read.js.uncompressed.js
new file mode 100644
index 000000000..0a4a154d8
--- /dev/null
+++ b/lib/dojo/data/api/Read.js.uncompressed.js
@@ -0,0 +1,485 @@
+define("dojo/data/api/Read", ["../..", "./Request"], function(dojo) {
+ // module:
+ // dojo/data/api/Read
+ // summary:
+ // TODOC
+
+
+dojo.declare("dojo.data.api.Read", null, {
+ // summary:
+ // This is an abstract API that data provider implementations conform to.
+ // This file defines methods signatures and intentionally leaves all the
+ // methods unimplemented. For more information on the dojo.data APIs,
+ // please visit: http://www.dojotoolkit.org/node/98
+
+ getValue: function( /* item */ item,
+ /* attribute-name-string */ attribute,
+ /* value? */ defaultValue){
+ // summary:
+ // Returns a single attribute value.
+ // Returns defaultValue if and only if *item* does not have a value for *attribute*.
+ // Returns null if and only if null was explicitly set as the attribute value.
+ // Returns undefined if and only if the item does not have a value for the
+ // given attribute (which is the same as saying the item does not have the attribute).
+ // description:
+ // Saying that an "item x does not have a value for an attribute y"
+ // is identical to saying that an "item x does not have attribute y".
+ // It is an oxymoron to say "that attribute is present but has no values"
+ // or "the item has that attribute but does not have any attribute values".
+ // If store.hasAttribute(item, attribute) returns false, then
+ // store.getValue(item, attribute) will return undefined.
+ // item:
+ // The item to access values on.
+ // attribute:
+ // The attribute to access represented as a string.
+ // defaultValue:
+ // Optional. A default value to use for the getValue return in the attribute does not exist or has no value.
+ // returns:
+ // a literal, an item, null, or undefined (never an array)
+ // exceptions:
+ // Throws an exception if *item* is not an item, or *attribute* is not a string
+ // example:
+ // | var darthVader = store.getValue(lukeSkywalker, "father");
+ throw new Error('Unimplemented API: dojo.data.api.Read.getValue');
+ },
+
+ getValues: function(/* item */ item,
+ /* attribute-name-string */ attribute){
+ // summary:
+ // This getValues() method works just like the getValue() method, but getValues()
+ // always returns an array rather than a single attribute value. The array
+ // may be empty, may contain a single attribute value, or may contain
+ // many attribute values.
+ // If the item does not have a value for the given attribute, then getValues()
+ // will return an empty array: []. (So, if store.hasAttribute(item, attribute)
+ // has a return of false, then store.getValues(item, attribute) will return [].)
+ // item:
+ // The item to access values on.
+ // attribute:
+ // The attribute to access represented as a string.
+ // returns:
+ // an array that may contain literals and items
+ // exceptions:
+ // Throws an exception if *item* is not an item, or *attribute* is not a string
+ // example:
+ // | var friendsOfLuke = store.getValues(lukeSkywalker, "friends");
+ throw new Error('Unimplemented API: dojo.data.api.Read.getValues');
+ },
+
+ getAttributes: function(/* item */ item){
+ // summary:
+ // Returns an array with all the attributes that this item has. This
+ // method will always return an array; if the item has no attributes
+ // at all, getAttributes() will return an empty array: [].
+ // item:
+ // The item to access attributes on.
+ // exceptions:
+ // Throws an exception if *item* is not an item, or *attribute* is not a string
+ // example:
+ // | var array = store.getAttributes(kermit);
+ throw new Error('Unimplemented API: dojo.data.api.Read.getAttributes');
+ },
+
+ hasAttribute: function( /* item */ item,
+ /* attribute-name-string */ attribute){
+ // summary:
+ // Returns true if the given *item* has a value for the given *attribute*.
+ // item:
+ // The item to access attributes on.
+ // attribute:
+ // The attribute to access represented as a string.
+ // exceptions:
+ // Throws an exception if *item* is not an item, or *attribute* is not a string
+ // example:
+ // | var trueOrFalse = store.hasAttribute(kermit, "color");
+ throw new Error('Unimplemented API: dojo.data.api.Read.hasAttribute');
+ },
+
+ containsValue: function(/* item */ item,
+ /* attribute-name-string */ attribute,
+ /* anything */ value){
+ // summary:
+ // Returns true if the given *value* is one of the values that getValues()
+ // would return.
+ // item:
+ // The item to access values on.
+ // attribute:
+ // The attribute to access represented as a string.
+ // value:
+ // The value to match as a value for the attribute.
+ // exceptions:
+ // Throws an exception if *item* is not an item, or *attribute* is not a string
+ // example:
+ // | var trueOrFalse = store.containsValue(kermit, "color", "green");
+ throw new Error('Unimplemented API: dojo.data.api.Read.containsValue');
+ },
+
+ isItem: function(/* anything */ something){
+ // summary:
+ // Returns true if *something* is an item and came from the store instance.
+ // Returns false if *something* is a literal, an item from another store instance,
+ // or is any object other than an item.
+ // something:
+ // Can be anything.
+ // example:
+ // | var yes = store.isItem(store.newItem());
+ // | var no = store.isItem("green");
+ throw new Error('Unimplemented API: dojo.data.api.Read.isItem');
+ },
+
+ isItemLoaded: function(/* anything */ something){
+ // summary:
+ // Returns false if isItem(something) is false. Returns false if
+ // if isItem(something) is true but the the item is not yet loaded
+ // in local memory (for example, if the item has not yet been read
+ // from the server).
+ // something:
+ // Can be anything.
+ // example:
+ // | var yes = store.isItemLoaded(store.newItem());
+ // | var no = store.isItemLoaded("green");
+ throw new Error('Unimplemented API: dojo.data.api.Read.isItemLoaded');
+ },
+
+ loadItem: function(/* object */ keywordArgs){
+ // summary:
+ // Given an item, this method loads the item so that a subsequent call
+ // to store.isItemLoaded(item) will return true. If a call to
+ // isItemLoaded() returns true before loadItem() is even called,
+ // then loadItem() need not do any work at all and will not even invoke
+ // the callback handlers. So, before invoking this method, check that
+ // the item has not already been loaded.
+ // keywordArgs:
+ // An anonymous object that defines the item to load and callbacks to invoke when the
+ // load has completed. The format of the object is as follows:
+ // {
+ // item: object,
+ // onItem: Function,
+ // onError: Function,
+ // scope: object
+ // }
+ // The *item* parameter.
+ // The item parameter is an object that represents the item in question that should be
+ // contained by the store. This attribute is required.
+ //
+ // The *onItem* parameter.
+ // Function(item)
+ // The onItem parameter is the callback to invoke when the item has been loaded. It takes only one
+ // parameter, the fully loaded item.
+ //
+ // The *onError* parameter.
+ // Function(error)
+ // The onError parameter is the callback to invoke when the item load encountered an error. It takes only one
+ // parameter, the error object
+ //
+ // The *scope* parameter.
+ // If a scope object is provided, all of the callback functions (onItem,
+ // onError, etc) will be invoked in the context of the scope object.
+ // In the body of the callback function, the value of the "this"
+ // keyword will be the scope object. If no scope object is provided,
+ // the callback functions will be called in the context of dojo.global().
+ // For example, onItem.call(scope, item, request) vs.
+ // onItem.call(dojo.global(), item, request)
+ if(!this.isItemLoaded(keywordArgs.item)){
+ throw new Error('Unimplemented API: dojo.data.api.Read.loadItem');
+ }
+ },
+
+ fetch: function(/* Object */ keywordArgs){
+ // summary:
+ // Given a query and set of defined options, such as a start and count of items to return,
+ // this method executes the query and makes the results available as data items.
+ // The format and expectations of stores is that they operate in a generally asynchronous
+ // manner, therefore callbacks are always used to return items located by the fetch parameters.
+ //
+ // description:
+ // A Request object will always be returned and is returned immediately.
+ // The basic request is nothing more than the keyword args passed to fetch and
+ // an additional function attached, abort(). The returned request object may then be used
+ // to cancel a fetch. All data items returns are passed through the callbacks defined in the
+ // fetch parameters and are not present on the 'request' object.
+ //
+ // This does not mean that custom stores can not add methods and properties to the request object
+ // returned, only that the API does not require it. For more info about the Request API,
+ // see dojo.data.api.Request
+ //
+ // keywordArgs:
+ // The keywordArgs parameter may either be an instance of
+ // conforming to dojo.data.api.Request or may be a simple anonymous object
+ // that may contain any of the following:
+ // {
+ // query: query-object or query-string,
+ // queryOptions: object,
+ // onBegin: Function,
+ // onItem: Function,
+ // onComplete: Function,
+ // onError: Function,
+ // scope: object,
+ // start: int
+ // count: int
+ // sort: array
+ // }
+ // All implementations should accept keywordArgs objects with any of
+ // the 9 standard properties: query, onBegin, onItem, onComplete, onError
+ // scope, sort, start, and count. Some implementations may accept additional
+ // properties in the keywordArgs object as valid parameters, such as
+ // {includeOutliers:true}.
+ //
+ // The *query* parameter.
+ // The query may be optional in some data store implementations.
+ // The dojo.data.api.Read API does not specify the syntax or semantics
+ // of the query itself -- each different data store implementation
+ // may have its own notion of what a query should look like.
+ // However, as of dojo 0.9, 1.0, and 1.1, all the provided datastores in dojo.data
+ // and dojox.data support an object structure query, where the object is a set of
+ // name/value parameters such as { attrFoo: valueBar, attrFoo1: valueBar1}. Most of the
+ // dijit widgets, such as ComboBox assume this to be the case when working with a datastore
+ // when they dynamically update the query. Therefore, for maximum compatibility with dijit
+ // widgets the recommended query parameter is a key/value object. That does not mean that the
+ // the datastore may not take alternative query forms, such as a simple string, a Date, a number,
+ // or a mix of such. Ultimately, The dojo.data.api.Read API is agnostic about what the query
+ // format.
+ // Further note: In general for query objects that accept strings as attribute
+ // value matches, the store should also support basic filtering capability, such as *
+ // (match any character) and ? (match single character). An example query that is a query object
+ // would be like: { attrFoo: "value*"}. Which generally means match all items where they have
+ // an attribute named attrFoo, with a value that starts with 'value'.
+ //
+ // The *queryOptions* parameter
+ // The queryOptions parameter is an optional parameter used to specify optiosn that may modify
+ // the query in some fashion, such as doing a case insensitive search, or doing a deep search
+ // where all items in a hierarchical representation of data are scanned instead of just the root
+ // items. It currently defines two options that all datastores should attempt to honor if possible:
+ // {
+ // ignoreCase: boolean, //Whether or not the query should match case sensitively or not. Default behaviour is false.
+ // deep: boolean //Whether or not a fetch should do a deep search of items and all child
+ // //items instead of just root-level items in a datastore. Default is false.
+ // }
+ //
+ // The *onBegin* parameter.
+ // function(size, request);
+ // If an onBegin callback function is provided, the callback function
+ // will be called just once, before the first onItem callback is called.
+ // The onBegin callback function will be passed two arguments, the
+ // the total number of items identified and the Request object. If the total number is
+ // unknown, then size will be -1. Note that size is not necessarily the size of the
+ // collection of items returned from the query, as the request may have specified to return only a
+ // subset of the total set of items through the use of the start and count parameters.
+ //
+ // The *onItem* parameter.
+ // function(item, request);
+ // If an onItem callback function is provided, the callback function
+ // will be called as each item in the result is received. The callback
+ // function will be passed two arguments: the item itself, and the
+ // Request object.
+ //
+ // The *onComplete* parameter.
+ // function(items, request);
+ //
+ // If an onComplete callback function is provided, the callback function
+ // will be called just once, after the last onItem callback is called.
+ // Note that if the onItem callback is not present, then onComplete will be passed
+ // an array containing all items which matched the query and the request object.
+ // If the onItem callback is present, then onComplete is called as:
+ // onComplete(null, request).
+ //
+ // The *onError* parameter.
+ // function(errorData, request);
+ // If an onError callback function is provided, the callback function
+ // will be called if there is any sort of error while attempting to
+ // execute the query.
+ // The onError callback function will be passed two arguments:
+ // an Error object and the Request object.
+ //
+ // The *scope* parameter.
+ // If a scope object is provided, all of the callback functions (onItem,
+ // onComplete, onError, etc) will be invoked in the context of the scope
+ // object. In the body of the callback function, the value of the "this"
+ // keyword will be the scope object. If no scope object is provided,
+ // the callback functions will be called in the context of dojo.global().
+ // For example, onItem.call(scope, item, request) vs.
+ // onItem.call(dojo.global(), item, request)
+ //
+ // The *start* parameter.
+ // If a start parameter is specified, this is a indication to the datastore to
+ // only start returning items once the start number of items have been located and
+ // skipped. When this parameter is paired with 'count', the store should be able
+ // to page across queries with millions of hits by only returning subsets of the
+ // hits for each query
+ //
+ // The *count* parameter.
+ // If a count parameter is specified, this is a indication to the datastore to
+ // only return up to that many items. This allows a fetch call that may have
+ // millions of item matches to be paired down to something reasonable.
+ //
+ // The *sort* parameter.
+ // If a sort parameter is specified, this is a indication to the datastore to
+ // sort the items in some manner before returning the items. The array is an array of
+ // javascript objects that must conform to the following format to be applied to the
+ // fetching of items:
+ // {
+ // attribute: attribute || attribute-name-string,
+ // descending: true|false; // Optional. Default is false.
+ // }
+ // Note that when comparing attributes, if an item contains no value for the attribute
+ // (undefined), then it the default ascending sort logic should push it to the bottom
+ // of the list. In the descending order case, it such items should appear at the top of the list.
+ //
+ // returns:
+ // The fetch() method will return a javascript object conforming to the API
+ // defined in dojo.data.api.Request. In general, it will be the keywordArgs
+ // object returned with the required functions in Request.js attached.
+ // Its general purpose is to provide a convenient way for a caller to abort an
+ // ongoing fetch.
+ //
+ // The Request object may also have additional properties when it is returned
+ // such as request.store property, which is a pointer to the datastore object that
+ // fetch() is a method of.
+ //
+ // exceptions:
+ // Throws an exception if the query is not valid, or if the query
+ // is required but was not supplied.
+ //
+ // example:
+ // Fetch all books identified by the query and call 'showBooks' when complete
+ // | var request = store.fetch({query:"all books", onComplete: showBooks});
+ // example:
+ // Fetch all items in the story and call 'showEverything' when complete.
+ // | var request = store.fetch(onComplete: showEverything);
+ // example:
+ // Fetch only 10 books that match the query 'all books', starting at the fifth book found during the search.
+ // This demonstrates how paging can be done for specific queries.
+ // | var request = store.fetch({query:"all books", start: 4, count: 10, onComplete: showBooks});
+ // example:
+ // Fetch all items that match the query, calling 'callback' each time an item is located.
+ // | var request = store.fetch({query:"foo/bar", onItem:callback});
+ // example:
+ // Fetch the first 100 books by author King, call showKing when up to 100 items have been located.
+ // | var request = store.fetch({query:{author:"King"}, start: 0, count:100, onComplete: showKing});
+ // example:
+ // Locate the books written by Author King, sort it on title and publisher, then return the first 100 items from the sorted items.
+ // | var request = store.fetch({query:{author:"King"}, sort: [{ attribute: "title", descending: true}, {attribute: "publisher"}], ,start: 0, count:100, onComplete: 'showKing'});
+ // example:
+ // Fetch the first 100 books by authors starting with the name King, then call showKing when up to 100 items have been located.
+ // | var request = store.fetch({query:{author:"King*"}, start: 0, count:100, onComplete: showKing});
+ // example:
+ // Fetch the first 100 books by authors ending with 'ing', but only have one character before it (King, Bing, Ling, Sing, etc.), then call showBooks when up to 100 items have been located.
+ // | var request = store.fetch({query:{author:"?ing"}, start: 0, count:100, onComplete: showBooks});
+ // example:
+ // Fetch the first 100 books by author King, where the name may appear as King, king, KING, kInG, and so on, then call showKing when up to 100 items have been located.
+ // | var request = store.fetch({query:{author:"King"}, queryOptions:(ignoreCase: true}, start: 0, count:100, onComplete: showKing});
+ // example:
+ // Paging
+ // | var store = new dojo.data.LargeRdbmsStore({url:"jdbc:odbc:foobar"});
+ // | var fetchArgs = {
+ // | query: {type:"employees", name:"Hillary *"}, // string matching
+ // | sort: [{attribute:"department", descending:true}],
+ // | start: 0,
+ // | count: 20,
+ // | scope: displayer,
+ // | onBegin: showThrobber,
+ // | onItem: displayItem,
+ // | onComplete: stopThrobber,
+ // | onError: handleFetchError,
+ // | };
+ // | store.fetch(fetchArgs);
+ // | ...
+ // and then when the user presses the "Next Page" button...
+ // | fetchArgs.start += 20;
+ // | store.fetch(fetchArgs); // get the next 20 items
+ throw new Error('Unimplemented API: dojo.data.api.Read.fetch');
+ },
+
+ getFeatures: function(){
+ // summary:
+ // The getFeatures() method returns an simple keyword values object
+ // that specifies what interface features the datastore implements.
+ // A simple CsvStore may be read-only, and the only feature it
+ // implements will be the 'dojo.data.api.Read' interface, so the
+ // getFeatures() method will return an object like this one:
+ // {'dojo.data.api.Read': true}.
+ // A more sophisticated datastore might implement a variety of
+ // interface features, like 'dojo.data.api.Read', 'dojo.data.api.Write',
+ // 'dojo.data.api.Identity', and 'dojo.data.api.Attribution'.
+ return {
+ 'dojo.data.api.Read': true
+ };
+ },
+
+ close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
+ // summary:
+ // The close() method is intended for instructing the store to 'close' out
+ // any information associated with a particular request.
+ //
+ // description:
+ // The close() method is intended for instructing the store to 'close' out
+ // any information associated with a particular request. In general, this API
+ // expects to recieve as a parameter a request object returned from a fetch.
+ // It will then close out anything associated with that request, such as
+ // clearing any internal datastore caches and closing any 'open' connections.
+ // For some store implementations, this call may be a no-op.
+ //
+ // request:
+ // An instance of a request for the store to use to identify what to close out.
+ // If no request is passed, then the store should clear all internal caches (if any)
+ // and close out all 'open' connections. It does not render the store unusable from
+ // there on, it merely cleans out any current data and resets the store to initial
+ // state.
+ //
+ // example:
+ // | var request = store.fetch({onComplete: doSomething});
+ // | ...
+ // | store.close(request);
+ throw new Error('Unimplemented API: dojo.data.api.Read.close');
+ },
+
+ getLabel: function(/* item */ item){
+ // summary:
+ // Method to inspect the item and return a user-readable 'label' for the item
+ // that provides a general/adequate description of what the item is.
+ //
+ // description:
+ // Method to inspect the item and return a user-readable 'label' for the item
+ // that provides a general/adequate description of what the item is. In general
+ // most labels will be a specific attribute value or collection of the attribute
+ // values that combine to label the item in some manner. For example for an item
+ // that represents a person it may return the label as: "firstname lastlame" where
+ // the firstname and lastname are attributes on the item. If the store is unable
+ // to determine an adequate human readable label, it should return undefined. Users that wish
+ // to customize how a store instance labels items should replace the getLabel() function on
+ // their instance of the store, or extend the store and replace the function in
+ // the extension class.
+ //
+ // item:
+ // The item to return the label for.
+ //
+ // returns:
+ // A user-readable string representing the item or undefined if no user-readable label can
+ // be generated.
+ throw new Error('Unimplemented API: dojo.data.api.Read.getLabel');
+ },
+
+ getLabelAttributes: function(/* item */ item){
+ // summary:
+ // Method to inspect the item and return an array of what attributes of the item were used
+ // to generate its label, if any.
+ //
+ // description:
+ // Method to inspect the item and return an array of what attributes of the item were used
+ // to generate its label, if any. This function is to assist UI developers in knowing what
+ // attributes can be ignored out of the attributes an item has when displaying it, in cases
+ // where the UI is using the label as an overall identifer should they wish to hide
+ // redundant information.
+ //
+ // item:
+ // The item to return the list of label attributes for.
+ //
+ // returns:
+ // An array of attribute names that were used to generate the label, or null if public attributes
+ // were not used to generate the label.
+ throw new Error('Unimplemented API: dojo.data.api.Read.getLabelAttributes');
+ }
+});
+
+return dojo.data.api.Read;
+});
diff --git a/lib/dojo/data/api/Request.js b/lib/dojo/data/api/Request.js
index 5c94cb5e0..83b3696aa 100644
--- a/lib/dojo/data/api/Request.js
+++ b/lib/dojo/data/api/Request.js
@@ -4,37 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.data.api.Request"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.api.Request"] = true;
-dojo.provide("dojo.data.api.Request");
-
-
-dojo.declare("dojo.data.api.Request", null, {
- // summary:
- // This class defines out the semantics of what a 'Request' object looks like
- // when returned from a fetch() method. In general, a request object is
- // nothing more than the original keywordArgs from fetch with an abort function
- // attached to it to allow users to abort a particular request if they so choose.
- // No other functions are required on a general Request object return. That does not
- // inhibit other store implementations from adding extentions to it, of course.
- //
- // This is an abstract API that data provider implementations conform to.
- // This file defines methods signatures and intentionally leaves all the
- // methods unimplemented.
- //
- // For more details on fetch, see dojo.data.api.Read.fetch().
-
- abort: function(){
- // summary:
- // This function is a hook point for stores to provide as a way for
- // a fetch to be halted mid-processing.
- // description:
- // This function is a hook point for stores to provide as a way for
- // a fetch to be halted mid-processing. For more details on the fetch() api,
- // please see dojo.data.api.Read.fetch().
- throw new Error('Unimplemented API: dojo.data.api.Request.abort');
- }
-});
-
-}
+//>>built
+define("dojo/data/api/Request",["../.."],function(_1){_1.declare("dojo.data.api.Request",null,{abort:function(){throw new Error("Unimplemented API: dojo.data.api.Request.abort");}});return _1.data.api.Request;}); \ No newline at end of file
diff --git a/lib/dojo/data/api/Request.js.uncompressed.js b/lib/dojo/data/api/Request.js.uncompressed.js
new file mode 100644
index 000000000..7ee5123bc
--- /dev/null
+++ b/lib/dojo/data/api/Request.js.uncompressed.js
@@ -0,0 +1,36 @@
+define("dojo/data/api/Request", ["../.."], function(dojo) {
+ // module:
+ // dojo/data/api/Request
+ // summary:
+ // TODOC
+
+
+dojo.declare("dojo.data.api.Request", null, {
+ // summary:
+ // This class defines out the semantics of what a 'Request' object looks like
+ // when returned from a fetch() method. In general, a request object is
+ // nothing more than the original keywordArgs from fetch with an abort function
+ // attached to it to allow users to abort a particular request if they so choose.
+ // No other functions are required on a general Request object return. That does not
+ // inhibit other store implementations from adding extentions to it, of course.
+ //
+ // This is an abstract API that data provider implementations conform to.
+ // This file defines methods signatures and intentionally leaves all the
+ // methods unimplemented.
+ //
+ // For more details on fetch, see dojo.data.api.Read.fetch().
+
+ abort: function(){
+ // summary:
+ // This function is a hook point for stores to provide as a way for
+ // a fetch to be halted mid-processing.
+ // description:
+ // This function is a hook point for stores to provide as a way for
+ // a fetch to be halted mid-processing. For more details on the fetch() api,
+ // please see dojo.data.api.Read.fetch().
+ throw new Error('Unimplemented API: dojo.data.api.Request.abort');
+ }
+});
+
+return dojo.data.api.Request;
+});
diff --git a/lib/dojo/data/api/Write.js b/lib/dojo/data/api/Write.js
index 08779180b..33392dc42 100644
--- a/lib/dojo/data/api/Write.js
+++ b/lib/dojo/data/api/Write.js
@@ -4,231 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.data.api.Write"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.api.Write"] = true;
-dojo.provide("dojo.data.api.Write");
-dojo.require("dojo.data.api.Read");
-
-
-dojo.declare("dojo.data.api.Write", dojo.data.api.Read, {
- // summary:
- // This is an abstract API that data provider implementations conform to.
- // This file defines function signatures and intentionally leaves all the
- // functionss unimplemented.
-
- getFeatures: function(){
- // summary:
- // See dojo.data.api.Read.getFeatures()
- return {
- 'dojo.data.api.Read': true,
- 'dojo.data.api.Write': true
- };
- },
-
- newItem: function(/* Object? */ keywordArgs, /*Object?*/ parentInfo){
- // summary:
- // Returns a newly created item. Sets the attributes of the new
- // item based on the *keywordArgs* provided. In general, the attribute
- // names in the keywords become the attributes in the new item and as for
- // the attribute values in keywordArgs, they become the values of the attributes
- // in the new item. In addition, for stores that support hierarchical item
- // creation, an optional second parameter is accepted that defines what item is the parent
- // of the new item and what attribute of that item should the new item be assigned to.
- // In general, this will assume that the attribute targetted is multi-valued and a new item
- // is appended onto the list of values for that attribute.
- //
- // keywordArgs:
- // A javascript object defining the initial content of the item as a set of JavaScript 'property name: value' pairs.
- // parentInfo:
- // An optional javascript object defining what item is the parent of this item (in a hierarchical store. Not all stores do hierarchical items),
- // and what attribute of that parent to assign the new item to. If this is present, and the attribute specified
- // is a multi-valued attribute, it will append this item into the array of values for that attribute. The structure
- // of the object is as follows:
- // {
- // parent: someItem,
- // attribute: "attribute-name-string"
- // }
- //
- // exceptions:
- // Throws an exception if *keywordArgs* is a string or a number or
- // anything other than a simple anonymous object.
- // Throws an exception if the item in parentInfo is not an item from the store
- // or if the attribute isn't an attribute name string.
- // example:
- // | var kermit = store.newItem({name: "Kermit", color:[blue, green]});
-
- var newItem;
- throw new Error('Unimplemented API: dojo.data.api.Write.newItem');
- return newItem; // item
- },
-
- deleteItem: function(/* item */ item){
- // summary:
- // Deletes an item from the store.
- //
- // item:
- // The item to delete.
- //
- // exceptions:
- // Throws an exception if the argument *item* is not an item
- // (if store.isItem(item) returns false).
- // example:
- // | var success = store.deleteItem(kermit);
- throw new Error('Unimplemented API: dojo.data.api.Write.deleteItem');
- return false; // boolean
- },
-
- setValue: function( /* item */ item,
- /* string */ attribute,
- /* almost anything */ value){
- // summary:
- // Sets the value of an attribute on an item.
- // Replaces any previous value or values.
- //
- // item:
- // The item to modify.
- // attribute:
- // The attribute of the item to change represented as a string name.
- // value:
- // The value to assign to the item.
- //
- // exceptions:
- // Throws an exception if *item* is not an item, or if *attribute*
- // is neither an attribute object or a string.
- // Throws an exception if *value* is undefined.
- // example:
- // | var success = store.set(kermit, "color", "green");
- throw new Error('Unimplemented API: dojo.data.api.Write.setValue');
- return false; // boolean
- },
-
- setValues: function(/* item */ item,
- /* string */ attribute,
- /* array */ values){
- // summary:
- // Adds each value in the *values* array as a value of the given
- // attribute on the given item.
- // Replaces any previous value or values.
- // Calling store.setValues(x, y, []) (with *values* as an empty array) has
- // the same effect as calling store.unsetAttribute(x, y).
- //
- // item:
- // The item to modify.
- // attribute:
- // The attribute of the item to change represented as a string name.
- // values:
- // An array of values to assign to the attribute..
- //
- // exceptions:
- // Throws an exception if *values* is not an array, if *item* is not an
- // item, or if *attribute* is neither an attribute object or a string.
- // example:
- // | var success = store.setValues(kermit, "color", ["green", "aqua"]);
- // | success = store.setValues(kermit, "color", []);
- // | if (success) {assert(!store.hasAttribute(kermit, "color"));}
- throw new Error('Unimplemented API: dojo.data.api.Write.setValues');
- return false; // boolean
- },
-
- unsetAttribute: function( /* item */ item,
- /* string */ attribute){
- // summary:
- // Deletes all the values of an attribute on an item.
- //
- // item:
- // The item to modify.
- // attribute:
- // The attribute of the item to unset represented as a string.
- //
- // exceptions:
- // Throws an exception if *item* is not an item, or if *attribute*
- // is neither an attribute object or a string.
- // example:
- // | var success = store.unsetAttribute(kermit, "color");
- // | if (success) {assert(!store.hasAttribute(kermit, "color"));}
- throw new Error('Unimplemented API: dojo.data.api.Write.clear');
- return false; // boolean
- },
-
- save: function(/* object */ keywordArgs){
- // summary:
- // Saves to the server all the changes that have been made locally.
- // The save operation may take some time and is generally performed
- // in an asynchronous fashion. The outcome of the save action is
- // is passed into the set of supported callbacks for the save.
- //
- // keywordArgs:
- // {
- // onComplete: function
- // onError: function
- // scope: object
- // }
- //
- // The *onComplete* parameter.
- // function();
- //
- // If an onComplete callback function is provided, the callback function
- // will be called just once, after the save has completed. No parameters
- // are generally passed to the onComplete.
- //
- // The *onError* parameter.
- // function(errorData);
- //
- // If an onError callback function is provided, the callback function
- // will be called if there is any sort of error while attempting to
- // execute the save. The onError function will be based one parameter, the
- // error.
- //
- // The *scope* parameter.
- // If a scope object is provided, all of the callback function (
- // onComplete, onError, etc) will be invoked in the context of the scope
- // object. In the body of the callback function, the value of the "this"
- // keyword will be the scope object. If no scope object is provided,
- // the callback functions will be called in the context of dojo.global.
- // For example, onComplete.call(scope) vs.
- // onComplete.call(dojo.global)
- //
- // returns:
- // Nothing. Since the saves are generally asynchronous, there is
- // no need to return anything. All results are passed via callbacks.
- // example:
- // | store.save({onComplete: onSave});
- // | store.save({scope: fooObj, onComplete: onSave, onError: saveFailed});
- throw new Error('Unimplemented API: dojo.data.api.Write.save');
- },
-
- revert: function(){
- // summary:
- // Discards any unsaved changes.
- // description:
- // Discards any unsaved changes.
- //
- // example:
- // | var success = store.revert();
- throw new Error('Unimplemented API: dojo.data.api.Write.revert');
- return false; // boolean
- },
-
- isDirty: function(/* item? */ item){
- // summary:
- // Given an item, isDirty() returns true if the item has been modified
- // since the last save(). If isDirty() is called with no *item* argument,
- // then this function returns true if any item has been modified since
- // the last save().
- //
- // item:
- // The item to check.
- //
- // exceptions:
- // Throws an exception if isDirty() is passed an argument and the
- // argument is not an item.
- // example:
- // | var trueOrFalse = store.isDirty(kermit); // true if kermit is dirty
- // | var trueOrFalse = store.isDirty(); // true if any item is dirty
- throw new Error('Unimplemented API: dojo.data.api.Write.isDirty');
- return false; // boolean
- }
-});
-
-}
+//>>built
+define("dojo/data/api/Write",["../..","./Read"],function(_1){_1.declare("dojo.data.api.Write",_1.data.api.Read,{getFeatures:function(){return {"dojo.data.api.Read":true,"dojo.data.api.Write":true};},newItem:function(_2,_3){throw new Error("Unimplemented API: dojo.data.api.Write.newItem");},deleteItem:function(_4){throw new Error("Unimplemented API: dojo.data.api.Write.deleteItem");},setValue:function(_5,_6,_7){throw new Error("Unimplemented API: dojo.data.api.Write.setValue");},setValues:function(_8,_9,_a){throw new Error("Unimplemented API: dojo.data.api.Write.setValues");},unsetAttribute:function(_b,_c){throw new Error("Unimplemented API: dojo.data.api.Write.clear");},save:function(_d){throw new Error("Unimplemented API: dojo.data.api.Write.save");},revert:function(){throw new Error("Unimplemented API: dojo.data.api.Write.revert");},isDirty:function(_e){throw new Error("Unimplemented API: dojo.data.api.Write.isDirty");}});return _1.data.api.Write;}); \ No newline at end of file
diff --git a/lib/dojo/data/api/Write.js.uncompressed.js b/lib/dojo/data/api/Write.js.uncompressed.js
new file mode 100644
index 000000000..972c95129
--- /dev/null
+++ b/lib/dojo/data/api/Write.js.uncompressed.js
@@ -0,0 +1,221 @@
+define("dojo/data/api/Write", ["../..", "./Read"], function(dojo) {
+ // module:
+ // dojo/data/api/Write
+ // summary:
+ // TODOC
+
+
+dojo.declare("dojo.data.api.Write", dojo.data.api.Read, {
+ // summary:
+ // This is an abstract API that data provider implementations conform to.
+ // This file defines function signatures and intentionally leaves all the
+ // functionss unimplemented.
+
+ getFeatures: function(){
+ // summary:
+ // See dojo.data.api.Read.getFeatures()
+ return {
+ 'dojo.data.api.Read': true,
+ 'dojo.data.api.Write': true
+ };
+ },
+
+ newItem: function(/* Object? */ keywordArgs, /*Object?*/ parentInfo){
+ // summary:
+ // Returns a newly created item. Sets the attributes of the new
+ // item based on the *keywordArgs* provided. In general, the attribute
+ // names in the keywords become the attributes in the new item and as for
+ // the attribute values in keywordArgs, they become the values of the attributes
+ // in the new item. In addition, for stores that support hierarchical item
+ // creation, an optional second parameter is accepted that defines what item is the parent
+ // of the new item and what attribute of that item should the new item be assigned to.
+ // In general, this will assume that the attribute targetted is multi-valued and a new item
+ // is appended onto the list of values for that attribute.
+ //
+ // keywordArgs:
+ // A javascript object defining the initial content of the item as a set of JavaScript 'property name: value' pairs.
+ // parentInfo:
+ // An optional javascript object defining what item is the parent of this item (in a hierarchical store. Not all stores do hierarchical items),
+ // and what attribute of that parent to assign the new item to. If this is present, and the attribute specified
+ // is a multi-valued attribute, it will append this item into the array of values for that attribute. The structure
+ // of the object is as follows:
+ // {
+ // parent: someItem,
+ // attribute: "attribute-name-string"
+ // }
+ //
+ // exceptions:
+ // Throws an exception if *keywordArgs* is a string or a number or
+ // anything other than a simple anonymous object.
+ // Throws an exception if the item in parentInfo is not an item from the store
+ // or if the attribute isn't an attribute name string.
+ // example:
+ // | var kermit = store.newItem({name: "Kermit", color:[blue, green]});
+
+ throw new Error('Unimplemented API: dojo.data.api.Write.newItem');
+ },
+
+ deleteItem: function(/* item */ item){
+ // summary:
+ // Deletes an item from the store.
+ //
+ // item:
+ // The item to delete.
+ //
+ // exceptions:
+ // Throws an exception if the argument *item* is not an item
+ // (if store.isItem(item) returns false).
+ // example:
+ // | var success = store.deleteItem(kermit);
+ throw new Error('Unimplemented API: dojo.data.api.Write.deleteItem');
+ },
+
+ setValue: function( /* item */ item,
+ /* string */ attribute,
+ /* almost anything */ value){
+ // summary:
+ // Sets the value of an attribute on an item.
+ // Replaces any previous value or values.
+ //
+ // item:
+ // The item to modify.
+ // attribute:
+ // The attribute of the item to change represented as a string name.
+ // value:
+ // The value to assign to the item.
+ //
+ // exceptions:
+ // Throws an exception if *item* is not an item, or if *attribute*
+ // is neither an attribute object or a string.
+ // Throws an exception if *value* is undefined.
+ // example:
+ // | var success = store.set(kermit, "color", "green");
+ throw new Error('Unimplemented API: dojo.data.api.Write.setValue');
+ },
+
+ setValues: function(/* item */ item,
+ /* string */ attribute,
+ /* array */ values){
+ // summary:
+ // Adds each value in the *values* array as a value of the given
+ // attribute on the given item.
+ // Replaces any previous value or values.
+ // Calling store.setValues(x, y, []) (with *values* as an empty array) has
+ // the same effect as calling store.unsetAttribute(x, y).
+ //
+ // item:
+ // The item to modify.
+ // attribute:
+ // The attribute of the item to change represented as a string name.
+ // values:
+ // An array of values to assign to the attribute..
+ //
+ // exceptions:
+ // Throws an exception if *values* is not an array, if *item* is not an
+ // item, or if *attribute* is neither an attribute object or a string.
+ // example:
+ // | var success = store.setValues(kermit, "color", ["green", "aqua"]);
+ // | success = store.setValues(kermit, "color", []);
+ // | if (success) {assert(!store.hasAttribute(kermit, "color"));}
+ throw new Error('Unimplemented API: dojo.data.api.Write.setValues');
+ },
+
+ unsetAttribute: function( /* item */ item,
+ /* string */ attribute){
+ // summary:
+ // Deletes all the values of an attribute on an item.
+ //
+ // item:
+ // The item to modify.
+ // attribute:
+ // The attribute of the item to unset represented as a string.
+ //
+ // exceptions:
+ // Throws an exception if *item* is not an item, or if *attribute*
+ // is neither an attribute object or a string.
+ // example:
+ // | var success = store.unsetAttribute(kermit, "color");
+ // | if (success) {assert(!store.hasAttribute(kermit, "color"));}
+ throw new Error('Unimplemented API: dojo.data.api.Write.clear');
+ },
+
+ save: function(/* object */ keywordArgs){
+ // summary:
+ // Saves to the server all the changes that have been made locally.
+ // The save operation may take some time and is generally performed
+ // in an asynchronous fashion. The outcome of the save action is
+ // is passed into the set of supported callbacks for the save.
+ //
+ // keywordArgs:
+ // {
+ // onComplete: function
+ // onError: function
+ // scope: object
+ // }
+ //
+ // The *onComplete* parameter.
+ // function();
+ //
+ // If an onComplete callback function is provided, the callback function
+ // will be called just once, after the save has completed. No parameters
+ // are generally passed to the onComplete.
+ //
+ // The *onError* parameter.
+ // function(errorData);
+ //
+ // If an onError callback function is provided, the callback function
+ // will be called if there is any sort of error while attempting to
+ // execute the save. The onError function will be based one parameter, the
+ // error.
+ //
+ // The *scope* parameter.
+ // If a scope object is provided, all of the callback function (
+ // onComplete, onError, etc) will be invoked in the context of the scope
+ // object. In the body of the callback function, the value of the "this"
+ // keyword will be the scope object. If no scope object is provided,
+ // the callback functions will be called in the context of dojo.global.
+ // For example, onComplete.call(scope) vs.
+ // onComplete.call(dojo.global)
+ //
+ // returns:
+ // Nothing. Since the saves are generally asynchronous, there is
+ // no need to return anything. All results are passed via callbacks.
+ // example:
+ // | store.save({onComplete: onSave});
+ // | store.save({scope: fooObj, onComplete: onSave, onError: saveFailed});
+ throw new Error('Unimplemented API: dojo.data.api.Write.save');
+ },
+
+ revert: function(){
+ // summary:
+ // Discards any unsaved changes.
+ // description:
+ // Discards any unsaved changes.
+ //
+ // example:
+ // | var success = store.revert();
+ throw new Error('Unimplemented API: dojo.data.api.Write.revert');
+ },
+
+ isDirty: function(/* item? */ item){
+ // summary:
+ // Given an item, isDirty() returns true if the item has been modified
+ // since the last save(). If isDirty() is called with no *item* argument,
+ // then this function returns true if any item has been modified since
+ // the last save().
+ //
+ // item:
+ // The item to check.
+ //
+ // exceptions:
+ // Throws an exception if isDirty() is passed an argument and the
+ // argument is not an item.
+ // example:
+ // | var trueOrFalse = store.isDirty(kermit); // true if kermit is dirty
+ // | var trueOrFalse = store.isDirty(); // true if any item is dirty
+ throw new Error('Unimplemented API: dojo.data.api.Write.isDirty');
+ }
+});
+
+return dojo.data.api.Write;
+});
diff --git a/lib/dojo/data/util/filter.js b/lib/dojo/data/util/filter.js
index 909cc49bc..582b31131 100644
--- a/lib/dojo/data/util/filter.js
+++ b/lib/dojo/data/util/filter.js
@@ -4,75 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.data.util.filter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.util.filter"] = true;
-dojo.provide("dojo.data.util.filter");
-
-dojo.getObject("data.util.filter", true, dojo);
-
-dojo.data.util.filter.patternToRegExp = function(/*String*/pattern, /*boolean?*/ ignoreCase){
- // summary:
- // Helper function to convert a simple pattern to a regular expression for matching.
- // description:
- // Returns a regular expression object that conforms to the defined conversion rules.
- // For example:
- // ca* -> /^ca.*$/
- // *ca* -> /^.*ca.*$/
- // *c\*a* -> /^.*c\*a.*$/
- // *c\*a?* -> /^.*c\*a..*$/
- // and so on.
- //
- // pattern: string
- // A simple matching pattern to convert that follows basic rules:
- // * Means match anything, so ca* means match anything starting with ca
- // ? Means match single character. So, b?b will match to bob and bab, and so on.
- // \ is an escape character. So for example, \* means do not treat * as a match, but literal character *.
- // To use a \ as a character in the string, it must be escaped. So in the pattern it should be
- // represented by \\ to be treated as an ordinary \ character instead of an escape.
- //
- // ignoreCase:
- // An optional flag to indicate if the pattern matching should be treated as case-sensitive or not when comparing
- // By default, it is assumed case sensitive.
-
- var rxp = "^";
- var c = null;
- for(var i = 0; i < pattern.length; i++){
- c = pattern.charAt(i);
- switch(c){
- case '\\':
- rxp += c;
- i++;
- rxp += pattern.charAt(i);
- break;
- case '*':
- rxp += ".*"; break;
- case '?':
- rxp += "."; break;
- case '$':
- case '^':
- case '/':
- case '+':
- case '.':
- case '|':
- case '(':
- case ')':
- case '{':
- case '}':
- case '[':
- case ']':
- rxp += "\\"; //fallthrough
- default:
- rxp += c;
- }
- }
- rxp += "$";
- if(ignoreCase){
- return new RegExp(rxp,"mi"); //RegExp
- }else{
- return new RegExp(rxp,"m"); //RegExp
- }
-
-};
-
-}
+//>>built
+define("dojo/data/util/filter",["dojo/_base/lang"],function(_1){var _2=_1.getObject("dojo.data.util.filter",true);_2.patternToRegExp=function(_3,_4){var _5="^";var c=null;for(var i=0;i<_3.length;i++){c=_3.charAt(i);switch(c){case "\\":_5+=c;i++;_5+=_3.charAt(i);break;case "*":_5+=".*";break;case "?":_5+=".";break;case "$":case "^":case "/":case "+":case ".":case "|":case "(":case ")":case "{":case "}":case "[":case "]":_5+="\\";default:_5+=c;}}_5+="$";if(_4){return new RegExp(_5,"mi");}else{return new RegExp(_5,"m");}};return _2;}); \ No newline at end of file
diff --git a/lib/dojo/data/util/filter.js.uncompressed.js b/lib/dojo/data/util/filter.js.uncompressed.js
new file mode 100644
index 000000000..5d310434d
--- /dev/null
+++ b/lib/dojo/data/util/filter.js.uncompressed.js
@@ -0,0 +1,74 @@
+define("dojo/data/util/filter", ["dojo/_base/lang"], function(lang) {
+ // module:
+ // dojo/data/util/filter
+ // summary:
+ // TODOC
+
+var filter = lang.getObject("dojo.data.util.filter", true);
+
+filter.patternToRegExp = function(/*String*/pattern, /*boolean?*/ ignoreCase){
+ // summary:
+ // Helper function to convert a simple pattern to a regular expression for matching.
+ // description:
+ // Returns a regular expression object that conforms to the defined conversion rules.
+ // For example:
+ // ca* -> /^ca.*$/
+ // *ca* -> /^.*ca.*$/
+ // *c\*a* -> /^.*c\*a.*$/
+ // *c\*a?* -> /^.*c\*a..*$/
+ // and so on.
+ //
+ // pattern: string
+ // A simple matching pattern to convert that follows basic rules:
+ // * Means match anything, so ca* means match anything starting with ca
+ // ? Means match single character. So, b?b will match to bob and bab, and so on.
+ // \ is an escape character. So for example, \* means do not treat * as a match, but literal character *.
+ // To use a \ as a character in the string, it must be escaped. So in the pattern it should be
+ // represented by \\ to be treated as an ordinary \ character instead of an escape.
+ //
+ // ignoreCase:
+ // An optional flag to indicate if the pattern matching should be treated as case-sensitive or not when comparing
+ // By default, it is assumed case sensitive.
+
+ var rxp = "^";
+ var c = null;
+ for(var i = 0; i < pattern.length; i++){
+ c = pattern.charAt(i);
+ switch(c){
+ case '\\':
+ rxp += c;
+ i++;
+ rxp += pattern.charAt(i);
+ break;
+ case '*':
+ rxp += ".*"; break;
+ case '?':
+ rxp += "."; break;
+ case '$':
+ case '^':
+ case '/':
+ case '+':
+ case '.':
+ case '|':
+ case '(':
+ case ')':
+ case '{':
+ case '}':
+ case '[':
+ case ']':
+ rxp += "\\"; //fallthrough
+ default:
+ rxp += c;
+ }
+ }
+ rxp += "$";
+ if(ignoreCase){
+ return new RegExp(rxp,"mi"); //RegExp
+ }else{
+ return new RegExp(rxp,"m"); //RegExp
+ }
+
+};
+
+return filter;
+});
diff --git a/lib/dojo/data/util/simpleFetch.js b/lib/dojo/data/util/simpleFetch.js
index b3f859b48..d339ecda6 100644
--- a/lib/dojo/data/util/simpleFetch.js
+++ b/lib/dojo/data/util/simpleFetch.js
@@ -4,96 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.data.util.simpleFetch"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.util.simpleFetch"] = true;
-dojo.provide("dojo.data.util.simpleFetch");
-dojo.require("dojo.data.util.sorter");
-
-dojo.getObject("data.util.simpleFetch", true, dojo);
-
-dojo.data.util.simpleFetch.fetch = function(/* Object? */ request){
- // summary:
- // The simpleFetch mixin is designed to serve as a set of function(s) that can
- // be mixed into other datastore implementations to accelerate their development.
- // The simpleFetch mixin should work well for any datastore that can respond to a _fetchItems()
- // call by returning an array of all the found items that matched the query. The simpleFetch mixin
- // is not designed to work for datastores that respond to a fetch() call by incrementally
- // loading items, or sequentially loading partial batches of the result
- // set. For datastores that mixin simpleFetch, simpleFetch
- // implements a fetch method that automatically handles eight of the fetch()
- // arguments -- onBegin, onItem, onComplete, onError, start, count, sort and scope
- // The class mixing in simpleFetch should not implement fetch(),
- // but should instead implement a _fetchItems() method. The _fetchItems()
- // method takes three arguments, the keywordArgs object that was passed
- // to fetch(), a callback function to be called when the result array is
- // available, and an error callback to be called if something goes wrong.
- // The _fetchItems() method should ignore any keywordArgs parameters for
- // start, count, onBegin, onItem, onComplete, onError, sort, and scope.
- // The _fetchItems() method needs to correctly handle any other keywordArgs
- // parameters, including the query parameter and any optional parameters
- // (such as includeChildren). The _fetchItems() method should create an array of
- // result items and pass it to the fetchHandler along with the original request object
- // -- or, the _fetchItems() method may, if it wants to, create an new request object
- // with other specifics about the request that are specific to the datastore and pass
- // that as the request object to the handler.
- //
- // For more information on this specific function, see dojo.data.api.Read.fetch()
- request = request || {};
- if(!request.store){
- request.store = this;
- }
- var self = this;
-
- var _errorHandler = function(errorData, requestObject){
- if(requestObject.onError){
- var scope = requestObject.scope || dojo.global;
- requestObject.onError.call(scope, errorData, requestObject);
- }
- };
-
- var _fetchHandler = function(items, requestObject){
- var oldAbortFunction = requestObject.abort || null;
- var aborted = false;
-
- var startIndex = requestObject.start?requestObject.start:0;
- var endIndex = (requestObject.count && (requestObject.count !== Infinity))?(startIndex + requestObject.count):items.length;
-
- requestObject.abort = function(){
- aborted = true;
- if(oldAbortFunction){
- oldAbortFunction.call(requestObject);
- }
- };
-
- var scope = requestObject.scope || dojo.global;
- if(!requestObject.store){
- requestObject.store = self;
- }
- if(requestObject.onBegin){
- requestObject.onBegin.call(scope, items.length, requestObject);
- }
- if(requestObject.sort){
- items.sort(dojo.data.util.sorter.createSortFunction(requestObject.sort, self));
- }
- if(requestObject.onItem){
- for(var i = startIndex; (i < items.length) && (i < endIndex); ++i){
- var item = items[i];
- if(!aborted){
- requestObject.onItem.call(scope, item, requestObject);
- }
- }
- }
- if(requestObject.onComplete && !aborted){
- var subset = null;
- if(!requestObject.onItem){
- subset = items.slice(startIndex, endIndex);
- }
- requestObject.onComplete.call(scope, subset, requestObject);
- }
- };
- this._fetchItems(request, _fetchHandler, _errorHandler);
- return request; // Object
-};
-
-}
+//>>built
+define("dojo/data/util/simpleFetch",["dojo/_base/lang","dojo/_base/window","./sorter"],function(_1,_2,_3){var _4=_1.getObject("dojo.data.util.simpleFetch",true);_4.fetch=function(_5){_5=_5||{};if(!_5.store){_5.store=this;}var _6=this;var _7=function(_8,_9){if(_9.onError){var _a=_9.scope||_2.global;_9.onError.call(_a,_8,_9);}};var _b=function(_c,_d){var _e=_d.abort||null;var _f=false;var _10=_d.start?_d.start:0;var _11=(_d.count&&(_d.count!==Infinity))?(_10+_d.count):_c.length;_d.abort=function(){_f=true;if(_e){_e.call(_d);}};var _12=_d.scope||_2.global;if(!_d.store){_d.store=_6;}if(_d.onBegin){_d.onBegin.call(_12,_c.length,_d);}if(_d.sort){_c.sort(_3.createSortFunction(_d.sort,_6));}if(_d.onItem){for(var i=_10;(i<_c.length)&&(i<_11);++i){var _13=_c[i];if(!_f){_d.onItem.call(_12,_13,_d);}}}if(_d.onComplete&&!_f){var _14=null;if(!_d.onItem){_14=_c.slice(_10,_11);}_d.onComplete.call(_12,_14,_d);}};this._fetchItems(_5,_b,_7);return _5;};return _4;}); \ No newline at end of file
diff --git a/lib/dojo/data/util/simpleFetch.js.uncompressed.js b/lib/dojo/data/util/simpleFetch.js.uncompressed.js
new file mode 100644
index 000000000..ffcf22f65
--- /dev/null
+++ b/lib/dojo/data/util/simpleFetch.js.uncompressed.js
@@ -0,0 +1,95 @@
+define("dojo/data/util/simpleFetch", ["dojo/_base/lang", "dojo/_base/window", "./sorter"],
+ function(lang, winUtil, sorter) {
+ // module:
+ // dojo/data/util/simpleFetch
+ // summary:
+ // TODOC
+
+var simpleFetch = lang.getObject("dojo.data.util.simpleFetch", true);
+
+simpleFetch.fetch = function(/* Object? */ request){
+ // summary:
+ // The simpleFetch mixin is designed to serve as a set of function(s) that can
+ // be mixed into other datastore implementations to accelerate their development.
+ // The simpleFetch mixin should work well for any datastore that can respond to a _fetchItems()
+ // call by returning an array of all the found items that matched the query. The simpleFetch mixin
+ // is not designed to work for datastores that respond to a fetch() call by incrementally
+ // loading items, or sequentially loading partial batches of the result
+ // set. For datastores that mixin simpleFetch, simpleFetch
+ // implements a fetch method that automatically handles eight of the fetch()
+ // arguments -- onBegin, onItem, onComplete, onError, start, count, sort and scope
+ // The class mixing in simpleFetch should not implement fetch(),
+ // but should instead implement a _fetchItems() method. The _fetchItems()
+ // method takes three arguments, the keywordArgs object that was passed
+ // to fetch(), a callback function to be called when the result array is
+ // available, and an error callback to be called if something goes wrong.
+ // The _fetchItems() method should ignore any keywordArgs parameters for
+ // start, count, onBegin, onItem, onComplete, onError, sort, and scope.
+ // The _fetchItems() method needs to correctly handle any other keywordArgs
+ // parameters, including the query parameter and any optional parameters
+ // (such as includeChildren). The _fetchItems() method should create an array of
+ // result items and pass it to the fetchHandler along with the original request object
+ // -- or, the _fetchItems() method may, if it wants to, create an new request object
+ // with other specifics about the request that are specific to the datastore and pass
+ // that as the request object to the handler.
+ //
+ // For more information on this specific function, see dojo.data.api.Read.fetch()
+ request = request || {};
+ if(!request.store){
+ request.store = this;
+ }
+ var self = this;
+
+ var _errorHandler = function(errorData, requestObject){
+ if(requestObject.onError){
+ var scope = requestObject.scope || winUtil.global;
+ requestObject.onError.call(scope, errorData, requestObject);
+ }
+ };
+
+ var _fetchHandler = function(items, requestObject){
+ var oldAbortFunction = requestObject.abort || null;
+ var aborted = false;
+
+ var startIndex = requestObject.start?requestObject.start:0;
+ var endIndex = (requestObject.count && (requestObject.count !== Infinity))?(startIndex + requestObject.count):items.length;
+
+ requestObject.abort = function(){
+ aborted = true;
+ if(oldAbortFunction){
+ oldAbortFunction.call(requestObject);
+ }
+ };
+
+ var scope = requestObject.scope || winUtil.global;
+ if(!requestObject.store){
+ requestObject.store = self;
+ }
+ if(requestObject.onBegin){
+ requestObject.onBegin.call(scope, items.length, requestObject);
+ }
+ if(requestObject.sort){
+ items.sort(sorter.createSortFunction(requestObject.sort, self));
+ }
+ if(requestObject.onItem){
+ for(var i = startIndex; (i < items.length) && (i < endIndex); ++i){
+ var item = items[i];
+ if(!aborted){
+ requestObject.onItem.call(scope, item, requestObject);
+ }
+ }
+ }
+ if(requestObject.onComplete && !aborted){
+ var subset = null;
+ if(!requestObject.onItem){
+ subset = items.slice(startIndex, endIndex);
+ }
+ requestObject.onComplete.call(scope, subset, requestObject);
+ }
+ };
+ this._fetchItems(request, _fetchHandler, _errorHandler);
+ return request; // Object
+};
+
+return simpleFetch;
+});
diff --git a/lib/dojo/data/util/sorter.js b/lib/dojo/data/util/sorter.js
index 539d3ca02..2591fe18e 100644
--- a/lib/dojo/data/util/sorter.js
+++ b/lib/dojo/data/util/sorter.js
@@ -4,101 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.data.util.sorter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.util.sorter"] = true;
-dojo.provide("dojo.data.util.sorter");
-
-dojo.getObject("data.util.sorter", true, dojo);
-
-dojo.data.util.sorter.basicComparator = function( /*anything*/ a,
- /*anything*/ b){
- // summary:
- // Basic comparision function that compares if an item is greater or less than another item
- // description:
- // returns 1 if a > b, -1 if a < b, 0 if equal.
- // 'null' values (null, undefined) are treated as larger values so that they're pushed to the end of the list.
- // And compared to each other, null is equivalent to undefined.
-
- //null is a problematic compare, so if null, we set to undefined.
- //Makes the check logic simple, compact, and consistent
- //And (null == undefined) === true, so the check later against null
- //works for undefined and is less bytes.
- var r = -1;
- if(a === null){
- a = undefined;
- }
- if(b === null){
- b = undefined;
- }
- if(a == b){
- r = 0;
- }else if(a > b || a == null){
- r = 1;
- }
- return r; //int {-1,0,1}
-};
-
-dojo.data.util.sorter.createSortFunction = function( /* attributes array */sortSpec,
- /*dojo.data.core.Read*/ store){
- // summary:
- // Helper function to generate the sorting function based off the list of sort attributes.
- // description:
- // The sort function creation will look for a property on the store called 'comparatorMap'. If it exists
- // it will look in the mapping for comparisons function for the attributes. If one is found, it will
- // use it instead of the basic comparator, which is typically used for strings, ints, booleans, and dates.
- // Returns the sorting function for this particular list of attributes and sorting directions.
- //
- // sortSpec: array
- // A JS object that array that defines out what attribute names to sort on and whether it should be descenting or asending.
- // The objects should be formatted as follows:
- // {
- // attribute: "attributeName-string" || attribute,
- // descending: true|false; // Default is false.
- // }
- // store: object
- // The datastore object to look up item values from.
- //
- var sortFunctions=[];
-
- function createSortFunction(attr, dir, comp, s){
- //Passing in comp and s (comparator and store), makes this
- //function much faster.
- return function(itemA, itemB){
- var a = s.getValue(itemA, attr);
- var b = s.getValue(itemB, attr);
- return dir * comp(a,b); //int
- };
- }
- var sortAttribute;
- var map = store.comparatorMap;
- var bc = dojo.data.util.sorter.basicComparator;
- for(var i = 0; i < sortSpec.length; i++){
- sortAttribute = sortSpec[i];
- var attr = sortAttribute.attribute;
- if(attr){
- var dir = (sortAttribute.descending) ? -1 : 1;
- var comp = bc;
- if(map){
- if(typeof attr !== "string" && ("toString" in attr)){
- attr = attr.toString();
- }
- comp = map[attr] || bc;
- }
- sortFunctions.push(createSortFunction(attr,
- dir, comp, store));
- }
- }
- return function(rowA, rowB){
- var i=0;
- while(i < sortFunctions.length){
- var ret = sortFunctions[i++](rowA, rowB);
- if(ret !== 0){
- return ret;//int
- }
- }
- return 0; //int
- }; // Function
-};
-
-}
+//>>built
+define("dojo/data/util/sorter",["dojo/_base/lang"],function(_1){var _2=_1.getObject("dojo.data.util.sorter",true);_2.basicComparator=function(a,b){var r=-1;if(a===null){a=undefined;}if(b===null){b=undefined;}if(a==b){r=0;}else{if(a>b||a==null){r=1;}}return r;};_2.createSortFunction=function(_3,_4){var _5=[];function _6(_7,_8,_9,s){return function(_a,_b){var a=s.getValue(_a,_7);var b=s.getValue(_b,_7);return _8*_9(a,b);};};var _c;var _d=_4.comparatorMap;var bc=_2.basicComparator;for(var i=0;i<_3.length;i++){_c=_3[i];var _e=_c.attribute;if(_e){var _f=(_c.descending)?-1:1;var _10=bc;if(_d){if(typeof _e!=="string"&&("toString" in _e)){_e=_e.toString();}_10=_d[_e]||bc;}_5.push(_6(_e,_f,_10,_4));}}return function(_11,_12){var i=0;while(i<_5.length){var ret=_5[i++](_11,_12);if(ret!==0){return ret;}}return 0;};};return _2;}); \ No newline at end of file
diff --git a/lib/dojo/data/util/sorter.js.uncompressed.js b/lib/dojo/data/util/sorter.js.uncompressed.js
new file mode 100644
index 000000000..82356858c
--- /dev/null
+++ b/lib/dojo/data/util/sorter.js.uncompressed.js
@@ -0,0 +1,99 @@
+define("dojo/data/util/sorter", ["dojo/_base/lang"], function(lang) {
+ // module:
+ // dojo/data/util/sorter
+ // summary:
+ // TODOC
+
+var sorter = lang.getObject("dojo.data.util.sorter", true);
+
+sorter.basicComparator = function( /*anything*/ a,
+ /*anything*/ b){
+ // summary:
+ // Basic comparision function that compares if an item is greater or less than another item
+ // description:
+ // returns 1 if a > b, -1 if a < b, 0 if equal.
+ // 'null' values (null, undefined) are treated as larger values so that they're pushed to the end of the list.
+ // And compared to each other, null is equivalent to undefined.
+
+ //null is a problematic compare, so if null, we set to undefined.
+ //Makes the check logic simple, compact, and consistent
+ //And (null == undefined) === true, so the check later against null
+ //works for undefined and is less bytes.
+ var r = -1;
+ if(a === null){
+ a = undefined;
+ }
+ if(b === null){
+ b = undefined;
+ }
+ if(a == b){
+ r = 0;
+ }else if(a > b || a == null){
+ r = 1;
+ }
+ return r; //int {-1,0,1}
+};
+
+sorter.createSortFunction = function( /* attributes array */sortSpec, /*dojo.data.core.Read*/ store){
+ // summary:
+ // Helper function to generate the sorting function based off the list of sort attributes.
+ // description:
+ // The sort function creation will look for a property on the store called 'comparatorMap'. If it exists
+ // it will look in the mapping for comparisons function for the attributes. If one is found, it will
+ // use it instead of the basic comparator, which is typically used for strings, ints, booleans, and dates.
+ // Returns the sorting function for this particular list of attributes and sorting directions.
+ //
+ // sortSpec: array
+ // A JS object that array that defines out what attribute names to sort on and whether it should be descenting or asending.
+ // The objects should be formatted as follows:
+ // {
+ // attribute: "attributeName-string" || attribute,
+ // descending: true|false; // Default is false.
+ // }
+ // store: object
+ // The datastore object to look up item values from.
+ //
+ var sortFunctions=[];
+
+ function createSortFunction(attr, dir, comp, s){
+ //Passing in comp and s (comparator and store), makes this
+ //function much faster.
+ return function(itemA, itemB){
+ var a = s.getValue(itemA, attr);
+ var b = s.getValue(itemB, attr);
+ return dir * comp(a,b); //int
+ };
+ }
+ var sortAttribute;
+ var map = store.comparatorMap;
+ var bc = sorter.basicComparator;
+ for(var i = 0; i < sortSpec.length; i++){
+ sortAttribute = sortSpec[i];
+ var attr = sortAttribute.attribute;
+ if(attr){
+ var dir = (sortAttribute.descending) ? -1 : 1;
+ var comp = bc;
+ if(map){
+ if(typeof attr !== "string" && ("toString" in attr)){
+ attr = attr.toString();
+ }
+ comp = map[attr] || bc;
+ }
+ sortFunctions.push(createSortFunction(attr,
+ dir, comp, store));
+ }
+ }
+ return function(rowA, rowB){
+ var i=0;
+ while(i < sortFunctions.length){
+ var ret = sortFunctions[i++](rowA, rowB);
+ if(ret !== 0){
+ return ret;//int
+ }
+ }
+ return 0; //int
+ }; // Function
+};
+
+return sorter;
+});
diff --git a/lib/dojo/date.js b/lib/dojo/date.js
index e961b5a86..55a1bdf27 100644
--- a/lib/dojo/date.js
+++ b/lib/dojo/date.js
@@ -4,348 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.date"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.date"] = true;
-dojo.provide("dojo.date");
-
-dojo.getObject("date", true, dojo);
-
-/*=====
-dojo.date = {
- // summary: Date manipulation utilities
-}
-=====*/
-
-dojo.date.getDaysInMonth = function(/*Date*/dateObject){
- // summary:
- // Returns the number of days in the month used by dateObject
- var month = dateObject.getMonth();
- var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
- if(month == 1 && dojo.date.isLeapYear(dateObject)){ return 29; } // Number
- return days[month]; // Number
-};
-
-dojo.date.isLeapYear = function(/*Date*/dateObject){
- // summary:
- // Determines if the year of the dateObject is a leap year
- // description:
- // Leap years are years with an additional day YYYY-02-29, where the
- // year number is a multiple of four with the following exception: If
- // a year is a multiple of 100, then it is only a leap year if it is
- // also a multiple of 400. For example, 1900 was not a leap year, but
- // 2000 is one.
-
- var year = dateObject.getFullYear();
- return !(year%400) || (!(year%4) && !!(year%100)); // Boolean
-};
-
-// FIXME: This is not localized
-dojo.date.getTimezoneName = function(/*Date*/dateObject){
- // summary:
- // Get the user's time zone as provided by the browser
- // dateObject:
- // Needed because the timezone may vary with time (daylight savings)
- // description:
- // Try to get time zone info from toString or toLocaleString method of
- // the Date object -- UTC offset is not a time zone. See
- // http://www.twinsun.com/tz/tz-link.htm Note: results may be
- // inconsistent across browsers.
-
- var str = dateObject.toString(); // Start looking in toString
- var tz = ''; // The result -- return empty string if nothing found
- var match;
-
- // First look for something in parentheses -- fast lookup, no regex
- var pos = str.indexOf('(');
- if(pos > -1){
- tz = str.substring(++pos, str.indexOf(')'));
- }else{
- // If at first you don't succeed ...
- // If IE knows about the TZ, it appears before the year
- // Capital letters or slash before a 4-digit year
- // at the end of string
- var pat = /([A-Z\/]+) \d{4}$/;
- if((match = str.match(pat))){
- tz = match[1];
- }else{
- // Some browsers (e.g. Safari) glue the TZ on the end
- // of toLocaleString instead of putting it in toString
- str = dateObject.toLocaleString();
- // Capital letters or slash -- end of string,
- // after space
- pat = / ([A-Z\/]+)$/;
- if((match = str.match(pat))){
- tz = match[1];
- }
- }
- }
-
- // Make sure it doesn't somehow end up return AM or PM
- return (tz == 'AM' || tz == 'PM') ? '' : tz; // String
-};
-
-// Utility methods to do arithmetic calculations with Dates
-
-dojo.date.compare = function(/*Date*/date1, /*Date?*/date2, /*String?*/portion){
- // summary:
- // Compare two date objects by date, time, or both.
- // description:
- // Returns 0 if equal, positive if a > b, else negative.
- // date1:
- // Date object
- // date2:
- // Date object. If not specified, the current Date is used.
- // portion:
- // A string indicating the "date" or "time" portion of a Date object.
- // Compares both "date" and "time" by default. One of the following:
- // "date", "time", "datetime"
-
- // Extra step required in copy for IE - see #3112
- date1 = new Date(+date1);
- date2 = new Date(+(date2 || new Date()));
-
- if(portion == "date"){
- // Ignore times and compare dates.
- date1.setHours(0, 0, 0, 0);
- date2.setHours(0, 0, 0, 0);
- }else if(portion == "time"){
- // Ignore dates and compare times.
- date1.setFullYear(0, 0, 0);
- date2.setFullYear(0, 0, 0);
- }
-
- if(date1 > date2){ return 1; } // int
- if(date1 < date2){ return -1; } // int
- return 0; // int
-};
-
-dojo.date.add = function(/*Date*/date, /*String*/interval, /*int*/amount){
- // summary:
- // Add to a Date in intervals of different size, from milliseconds to years
- // date: Date
- // Date object to start with
- // interval:
- // A string representing the interval. One of the following:
- // "year", "month", "day", "hour", "minute", "second",
- // "millisecond", "quarter", "week", "weekday"
- // amount:
- // How much to add to the date.
-
- var sum = new Date(+date); // convert to Number before copying to accomodate IE (#3112)
- var fixOvershoot = false;
- var property = "Date";
-
- switch(interval){
- case "day":
- break;
- case "weekday":
- //i18n FIXME: assumes Saturday/Sunday weekend, but this is not always true. see dojo.cldr.supplemental
-
- // Divide the increment time span into weekspans plus leftover days
- // e.g., 8 days is one 5-day weekspan / and two leftover days
- // Can't have zero leftover days, so numbers divisible by 5 get
- // a days value of 5, and the remaining days make up the number of weeks
- var days, weeks;
- var mod = amount % 5;
- if(!mod){
- days = (amount > 0) ? 5 : -5;
- weeks = (amount > 0) ? ((amount-5)/5) : ((amount+5)/5);
- }else{
- days = mod;
- weeks = parseInt(amount/5);
- }
- // Get weekday value for orig date param
- var strt = date.getDay();
- // Orig date is Sat / positive incrementer
- // Jump over Sun
- var adj = 0;
- if(strt == 6 && amount > 0){
- adj = 1;
- }else if(strt == 0 && amount < 0){
- // Orig date is Sun / negative incrementer
- // Jump back over Sat
- adj = -1;
- }
- // Get weekday val for the new date
- var trgt = strt + days;
- // New date is on Sat or Sun
- if(trgt == 0 || trgt == 6){
- adj = (amount > 0) ? 2 : -2;
- }
- // Increment by number of weeks plus leftover days plus
- // weekend adjustments
- amount = (7 * weeks) + days + adj;
- break;
- case "year":
- property = "FullYear";
- // Keep increment/decrement from 2/29 out of March
- fixOvershoot = true;
- break;
- case "week":
- amount *= 7;
- break;
- case "quarter":
- // Naive quarter is just three months
- amount *= 3;
- // fallthrough...
- case "month":
- // Reset to last day of month if you overshoot
- fixOvershoot = true;
- property = "Month";
- break;
-// case "hour":
-// case "minute":
-// case "second":
-// case "millisecond":
- default:
- property = "UTC"+interval.charAt(0).toUpperCase() + interval.substring(1) + "s";
- }
-
- if(property){
- sum["set"+property](sum["get"+property]()+amount);
- }
-
- if(fixOvershoot && (sum.getDate() < date.getDate())){
- sum.setDate(0);
- }
-
- return sum; // Date
-};
-
-dojo.date.difference = function(/*Date*/date1, /*Date?*/date2, /*String?*/interval){
- // summary:
- // Get the difference in a specific unit of time (e.g., number of
- // months, weeks, days, etc.) between two dates, rounded to the
- // nearest integer.
- // date1:
- // Date object
- // date2:
- // Date object. If not specified, the current Date is used.
- // interval:
- // A string representing the interval. One of the following:
- // "year", "month", "day", "hour", "minute", "second",
- // "millisecond", "quarter", "week", "weekday"
- // Defaults to "day".
-
- date2 = date2 || new Date();
- interval = interval || "day";
- var yearDiff = date2.getFullYear() - date1.getFullYear();
- var delta = 1; // Integer return value
-
- switch(interval){
- case "quarter":
- var m1 = date1.getMonth();
- var m2 = date2.getMonth();
- // Figure out which quarter the months are in
- var q1 = Math.floor(m1/3) + 1;
- var q2 = Math.floor(m2/3) + 1;
- // Add quarters for any year difference between the dates
- q2 += (yearDiff * 4);
- delta = q2 - q1;
- break;
- case "weekday":
- var days = Math.round(dojo.date.difference(date1, date2, "day"));
- var weeks = parseInt(dojo.date.difference(date1, date2, "week"));
- var mod = days % 7;
-
- // Even number of weeks
- if(mod == 0){
- days = weeks*5;
- }else{
- // Weeks plus spare change (< 7 days)
- var adj = 0;
- var aDay = date1.getDay();
- var bDay = date2.getDay();
-
- weeks = parseInt(days/7);
- mod = days % 7;
- // Mark the date advanced by the number of
- // round weeks (may be zero)
- var dtMark = new Date(date1);
- dtMark.setDate(dtMark.getDate()+(weeks*7));
- var dayMark = dtMark.getDay();
-
- // Spare change days -- 6 or less
- if(days > 0){
- switch(true){
- // Range starts on Sat
- case aDay == 6:
- adj = -1;
- break;
- // Range starts on Sun
- case aDay == 0:
- adj = 0;
- break;
- // Range ends on Sat
- case bDay == 6:
- adj = -1;
- break;
- // Range ends on Sun
- case bDay == 0:
- adj = -2;
- break;
- // Range contains weekend
- case (dayMark + mod) > 5:
- adj = -2;
- }
- }else if(days < 0){
- switch(true){
- // Range starts on Sat
- case aDay == 6:
- adj = 0;
- break;
- // Range starts on Sun
- case aDay == 0:
- adj = 1;
- break;
- // Range ends on Sat
- case bDay == 6:
- adj = 2;
- break;
- // Range ends on Sun
- case bDay == 0:
- adj = 1;
- break;
- // Range contains weekend
- case (dayMark + mod) < 0:
- adj = 2;
- }
- }
- days += adj;
- days -= (weeks*2);
- }
- delta = days;
- break;
- case "year":
- delta = yearDiff;
- break;
- case "month":
- delta = (date2.getMonth() - date1.getMonth()) + (yearDiff * 12);
- break;
- case "week":
- // Truncate instead of rounding
- // Don't use Math.floor -- value may be negative
- delta = parseInt(dojo.date.difference(date1, date2, "day")/7);
- break;
- case "day":
- delta /= 24;
- // fallthrough
- case "hour":
- delta /= 60;
- // fallthrough
- case "minute":
- delta /= 60;
- // fallthrough
- case "second":
- delta /= 1000;
- // fallthrough
- case "millisecond":
- delta *= date2.getTime() - date1.getTime();
- }
-
- // Round for fractional values and DST leaps
- return Math.round(delta); // Number (integer)
-};
-
-}
+//>>built
+define("dojo/date",["./_base/kernel","./_base/lang"],function(_1,_2){_2.getObject("date",true,_1);_1.date.getDaysInMonth=function(_3){var _4=_3.getMonth();var _5=[31,28,31,30,31,30,31,31,30,31,30,31];if(_4==1&&_1.date.isLeapYear(_3)){return 29;}return _5[_4];};_1.date.isLeapYear=function(_6){var _7=_6.getFullYear();return !(_7%400)||(!(_7%4)&&!!(_7%100));};_1.date.getTimezoneName=function(_8){var _9=_8.toString();var tz="";var _a;var _b=_9.indexOf("(");if(_b>-1){tz=_9.substring(++_b,_9.indexOf(")"));}else{var _c=/([A-Z\/]+) \d{4}$/;if((_a=_9.match(_c))){tz=_a[1];}else{_9=_8.toLocaleString();_c=/ ([A-Z\/]+)$/;if((_a=_9.match(_c))){tz=_a[1];}}}return (tz=="AM"||tz=="PM")?"":tz;};_1.date.compare=function(_d,_e,_f){_d=new Date(+_d);_e=new Date(+(_e||new Date()));if(_f=="date"){_d.setHours(0,0,0,0);_e.setHours(0,0,0,0);}else{if(_f=="time"){_d.setFullYear(0,0,0);_e.setFullYear(0,0,0);}}if(_d>_e){return 1;}if(_d<_e){return -1;}return 0;};_1.date.add=function(_10,_11,_12){var sum=new Date(+_10);var _13=false;var _14="Date";switch(_11){case "day":break;case "weekday":var _15,_16;var mod=_12%5;if(!mod){_15=(_12>0)?5:-5;_16=(_12>0)?((_12-5)/5):((_12+5)/5);}else{_15=mod;_16=parseInt(_12/5);}var _17=_10.getDay();var adj=0;if(_17==6&&_12>0){adj=1;}else{if(_17==0&&_12<0){adj=-1;}}var _18=_17+_15;if(_18==0||_18==6){adj=(_12>0)?2:-2;}_12=(7*_16)+_15+adj;break;case "year":_14="FullYear";_13=true;break;case "week":_12*=7;break;case "quarter":_12*=3;case "month":_13=true;_14="Month";break;default:_14="UTC"+_11.charAt(0).toUpperCase()+_11.substring(1)+"s";}if(_14){sum["set"+_14](sum["get"+_14]()+_12);}if(_13&&(sum.getDate()<_10.getDate())){sum.setDate(0);}return sum;};_1.date.difference=function(_19,_1a,_1b){_1a=_1a||new Date();_1b=_1b||"day";var _1c=_1a.getFullYear()-_19.getFullYear();var _1d=1;switch(_1b){case "quarter":var m1=_19.getMonth();var m2=_1a.getMonth();var q1=Math.floor(m1/3)+1;var q2=Math.floor(m2/3)+1;q2+=(_1c*4);_1d=q2-q1;break;case "weekday":var _1e=Math.round(_1.date.difference(_19,_1a,"day"));var _1f=parseInt(_1.date.difference(_19,_1a,"week"));var mod=_1e%7;if(mod==0){_1e=_1f*5;}else{var adj=0;var _20=_19.getDay();var _21=_1a.getDay();_1f=parseInt(_1e/7);mod=_1e%7;var _22=new Date(_19);_22.setDate(_22.getDate()+(_1f*7));var _23=_22.getDay();if(_1e>0){switch(true){case _20==6:adj=-1;break;case _20==0:adj=0;break;case _21==6:adj=-1;break;case _21==0:adj=-2;break;case (_23+mod)>5:adj=-2;}}else{if(_1e<0){switch(true){case _20==6:adj=0;break;case _20==0:adj=1;break;case _21==6:adj=2;break;case _21==0:adj=1;break;case (_23+mod)<0:adj=2;}}}_1e+=adj;_1e-=(_1f*2);}_1d=_1e;break;case "year":_1d=_1c;break;case "month":_1d=(_1a.getMonth()-_19.getMonth())+(_1c*12);break;case "week":_1d=parseInt(_1.date.difference(_19,_1a,"day")/7);break;case "day":_1d/=24;case "hour":_1d/=60;case "minute":_1d/=60;case "second":_1d/=1000;case "millisecond":_1d*=_1a.getTime()-_19.getTime();}return Math.round(_1d);};return _1.date;}); \ No newline at end of file
diff --git a/lib/dojo/date.js.uncompressed.js b/lib/dojo/date.js.uncompressed.js
new file mode 100644
index 000000000..423561754
--- /dev/null
+++ b/lib/dojo/date.js.uncompressed.js
@@ -0,0 +1,347 @@
+define("dojo/date", ["./_base/kernel", "./_base/lang"], function(dojo, lang) {
+ // module:
+ // dojo/date
+ // summary:
+ // TODOC
+
+lang.getObject("date", true, dojo);
+
+/*=====
+dojo.date = {
+ // summary: Date manipulation utilities
+}
+=====*/
+
+dojo.date.getDaysInMonth = function(/*Date*/dateObject){
+ // summary:
+ // Returns the number of days in the month used by dateObject
+ var month = dateObject.getMonth();
+ var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+ if(month == 1 && dojo.date.isLeapYear(dateObject)){ return 29; } // Number
+ return days[month]; // Number
+};
+
+dojo.date.isLeapYear = function(/*Date*/dateObject){
+ // summary:
+ // Determines if the year of the dateObject is a leap year
+ // description:
+ // Leap years are years with an additional day YYYY-02-29, where the
+ // year number is a multiple of four with the following exception: If
+ // a year is a multiple of 100, then it is only a leap year if it is
+ // also a multiple of 400. For example, 1900 was not a leap year, but
+ // 2000 is one.
+
+ var year = dateObject.getFullYear();
+ return !(year%400) || (!(year%4) && !!(year%100)); // Boolean
+};
+
+// FIXME: This is not localized
+dojo.date.getTimezoneName = function(/*Date*/dateObject){
+ // summary:
+ // Get the user's time zone as provided by the browser
+ // dateObject:
+ // Needed because the timezone may vary with time (daylight savings)
+ // description:
+ // Try to get time zone info from toString or toLocaleString method of
+ // the Date object -- UTC offset is not a time zone. See
+ // http://www.twinsun.com/tz/tz-link.htm Note: results may be
+ // inconsistent across browsers.
+
+ var str = dateObject.toString(); // Start looking in toString
+ var tz = ''; // The result -- return empty string if nothing found
+ var match;
+
+ // First look for something in parentheses -- fast lookup, no regex
+ var pos = str.indexOf('(');
+ if(pos > -1){
+ tz = str.substring(++pos, str.indexOf(')'));
+ }else{
+ // If at first you don't succeed ...
+ // If IE knows about the TZ, it appears before the year
+ // Capital letters or slash before a 4-digit year
+ // at the end of string
+ var pat = /([A-Z\/]+) \d{4}$/;
+ if((match = str.match(pat))){
+ tz = match[1];
+ }else{
+ // Some browsers (e.g. Safari) glue the TZ on the end
+ // of toLocaleString instead of putting it in toString
+ str = dateObject.toLocaleString();
+ // Capital letters or slash -- end of string,
+ // after space
+ pat = / ([A-Z\/]+)$/;
+ if((match = str.match(pat))){
+ tz = match[1];
+ }
+ }
+ }
+
+ // Make sure it doesn't somehow end up return AM or PM
+ return (tz == 'AM' || tz == 'PM') ? '' : tz; // String
+};
+
+// Utility methods to do arithmetic calculations with Dates
+
+dojo.date.compare = function(/*Date*/date1, /*Date?*/date2, /*String?*/portion){
+ // summary:
+ // Compare two date objects by date, time, or both.
+ // description:
+ // Returns 0 if equal, positive if a > b, else negative.
+ // date1:
+ // Date object
+ // date2:
+ // Date object. If not specified, the current Date is used.
+ // portion:
+ // A string indicating the "date" or "time" portion of a Date object.
+ // Compares both "date" and "time" by default. One of the following:
+ // "date", "time", "datetime"
+
+ // Extra step required in copy for IE - see #3112
+ date1 = new Date(+date1);
+ date2 = new Date(+(date2 || new Date()));
+
+ if(portion == "date"){
+ // Ignore times and compare dates.
+ date1.setHours(0, 0, 0, 0);
+ date2.setHours(0, 0, 0, 0);
+ }else if(portion == "time"){
+ // Ignore dates and compare times.
+ date1.setFullYear(0, 0, 0);
+ date2.setFullYear(0, 0, 0);
+ }
+
+ if(date1 > date2){ return 1; } // int
+ if(date1 < date2){ return -1; } // int
+ return 0; // int
+};
+
+dojo.date.add = function(/*Date*/date, /*String*/interval, /*int*/amount){
+ // summary:
+ // Add to a Date in intervals of different size, from milliseconds to years
+ // date: Date
+ // Date object to start with
+ // interval:
+ // A string representing the interval. One of the following:
+ // "year", "month", "day", "hour", "minute", "second",
+ // "millisecond", "quarter", "week", "weekday"
+ // amount:
+ // How much to add to the date.
+
+ var sum = new Date(+date); // convert to Number before copying to accomodate IE (#3112)
+ var fixOvershoot = false;
+ var property = "Date";
+
+ switch(interval){
+ case "day":
+ break;
+ case "weekday":
+ //i18n FIXME: assumes Saturday/Sunday weekend, but this is not always true. see dojo.cldr.supplemental
+
+ // Divide the increment time span into weekspans plus leftover days
+ // e.g., 8 days is one 5-day weekspan / and two leftover days
+ // Can't have zero leftover days, so numbers divisible by 5 get
+ // a days value of 5, and the remaining days make up the number of weeks
+ var days, weeks;
+ var mod = amount % 5;
+ if(!mod){
+ days = (amount > 0) ? 5 : -5;
+ weeks = (amount > 0) ? ((amount-5)/5) : ((amount+5)/5);
+ }else{
+ days = mod;
+ weeks = parseInt(amount/5);
+ }
+ // Get weekday value for orig date param
+ var strt = date.getDay();
+ // Orig date is Sat / positive incrementer
+ // Jump over Sun
+ var adj = 0;
+ if(strt == 6 && amount > 0){
+ adj = 1;
+ }else if(strt == 0 && amount < 0){
+ // Orig date is Sun / negative incrementer
+ // Jump back over Sat
+ adj = -1;
+ }
+ // Get weekday val for the new date
+ var trgt = strt + days;
+ // New date is on Sat or Sun
+ if(trgt == 0 || trgt == 6){
+ adj = (amount > 0) ? 2 : -2;
+ }
+ // Increment by number of weeks plus leftover days plus
+ // weekend adjustments
+ amount = (7 * weeks) + days + adj;
+ break;
+ case "year":
+ property = "FullYear";
+ // Keep increment/decrement from 2/29 out of March
+ fixOvershoot = true;
+ break;
+ case "week":
+ amount *= 7;
+ break;
+ case "quarter":
+ // Naive quarter is just three months
+ amount *= 3;
+ // fallthrough...
+ case "month":
+ // Reset to last day of month if you overshoot
+ fixOvershoot = true;
+ property = "Month";
+ break;
+// case "hour":
+// case "minute":
+// case "second":
+// case "millisecond":
+ default:
+ property = "UTC"+interval.charAt(0).toUpperCase() + interval.substring(1) + "s";
+ }
+
+ if(property){
+ sum["set"+property](sum["get"+property]()+amount);
+ }
+
+ if(fixOvershoot && (sum.getDate() < date.getDate())){
+ sum.setDate(0);
+ }
+
+ return sum; // Date
+};
+
+dojo.date.difference = function(/*Date*/date1, /*Date?*/date2, /*String?*/interval){
+ // summary:
+ // Get the difference in a specific unit of time (e.g., number of
+ // months, weeks, days, etc.) between two dates, rounded to the
+ // nearest integer.
+ // date1:
+ // Date object
+ // date2:
+ // Date object. If not specified, the current Date is used.
+ // interval:
+ // A string representing the interval. One of the following:
+ // "year", "month", "day", "hour", "minute", "second",
+ // "millisecond", "quarter", "week", "weekday"
+ // Defaults to "day".
+
+ date2 = date2 || new Date();
+ interval = interval || "day";
+ var yearDiff = date2.getFullYear() - date1.getFullYear();
+ var delta = 1; // Integer return value
+
+ switch(interval){
+ case "quarter":
+ var m1 = date1.getMonth();
+ var m2 = date2.getMonth();
+ // Figure out which quarter the months are in
+ var q1 = Math.floor(m1/3) + 1;
+ var q2 = Math.floor(m2/3) + 1;
+ // Add quarters for any year difference between the dates
+ q2 += (yearDiff * 4);
+ delta = q2 - q1;
+ break;
+ case "weekday":
+ var days = Math.round(dojo.date.difference(date1, date2, "day"));
+ var weeks = parseInt(dojo.date.difference(date1, date2, "week"));
+ var mod = days % 7;
+
+ // Even number of weeks
+ if(mod == 0){
+ days = weeks*5;
+ }else{
+ // Weeks plus spare change (< 7 days)
+ var adj = 0;
+ var aDay = date1.getDay();
+ var bDay = date2.getDay();
+
+ weeks = parseInt(days/7);
+ mod = days % 7;
+ // Mark the date advanced by the number of
+ // round weeks (may be zero)
+ var dtMark = new Date(date1);
+ dtMark.setDate(dtMark.getDate()+(weeks*7));
+ var dayMark = dtMark.getDay();
+
+ // Spare change days -- 6 or less
+ if(days > 0){
+ switch(true){
+ // Range starts on Sat
+ case aDay == 6:
+ adj = -1;
+ break;
+ // Range starts on Sun
+ case aDay == 0:
+ adj = 0;
+ break;
+ // Range ends on Sat
+ case bDay == 6:
+ adj = -1;
+ break;
+ // Range ends on Sun
+ case bDay == 0:
+ adj = -2;
+ break;
+ // Range contains weekend
+ case (dayMark + mod) > 5:
+ adj = -2;
+ }
+ }else if(days < 0){
+ switch(true){
+ // Range starts on Sat
+ case aDay == 6:
+ adj = 0;
+ break;
+ // Range starts on Sun
+ case aDay == 0:
+ adj = 1;
+ break;
+ // Range ends on Sat
+ case bDay == 6:
+ adj = 2;
+ break;
+ // Range ends on Sun
+ case bDay == 0:
+ adj = 1;
+ break;
+ // Range contains weekend
+ case (dayMark + mod) < 0:
+ adj = 2;
+ }
+ }
+ days += adj;
+ days -= (weeks*2);
+ }
+ delta = days;
+ break;
+ case "year":
+ delta = yearDiff;
+ break;
+ case "month":
+ delta = (date2.getMonth() - date1.getMonth()) + (yearDiff * 12);
+ break;
+ case "week":
+ // Truncate instead of rounding
+ // Don't use Math.floor -- value may be negative
+ delta = parseInt(dojo.date.difference(date1, date2, "day")/7);
+ break;
+ case "day":
+ delta /= 24;
+ // fallthrough
+ case "hour":
+ delta /= 60;
+ // fallthrough
+ case "minute":
+ delta /= 60;
+ // fallthrough
+ case "second":
+ delta /= 1000;
+ // fallthrough
+ case "millisecond":
+ delta *= date2.getTime() - date1.getTime();
+ }
+
+ // Round for fractional values and DST leaps
+ return Math.round(delta); // Number (integer)
+};
+
+return dojo.date;
+});
diff --git a/lib/dojo/date/locale.js b/lib/dojo/date/locale.js
index 9b6b4fa62..2d029b014 100644
--- a/lib/dojo/date/locale.js
+++ b/lib/dojo/date/locale.js
@@ -4,674 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.date.locale"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.date.locale"] = true;
-dojo.provide("dojo.date.locale");
-dojo.require("dojo.date");
-dojo.require("dojo.cldr.supplemental");
-dojo.require("dojo.regexp");
-dojo.require("dojo.string");
-dojo.require("dojo.i18n");
-dojo.requireLocalization("dojo.cldr", "gregorian", null, "ROOT,ar,ca,cs,da,de,el,en,en-au,en-ca,en-gb,es,fi,fr,fr-ch,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-hant,zh-hk,zh-tw");
-
-dojo.getObject("date.locale", true, dojo);
-
-// Localization methods for Date. Honor local customs using locale-dependent dojo.cldr data.
-
-
-// Load the bundles containing localization information for
-// names and formats
-
-//NOTE: Everything in this module assumes Gregorian calendars.
-// Other calendars will be implemented in separate modules.
-
-(function(){
- // Format a pattern without literals
- function formatPattern(dateObject, bundle, options, pattern){
- return pattern.replace(/([a-z])\1*/ig, function(match){
- var s, pad,
- c = match.charAt(0),
- l = match.length,
- widthList = ["abbr", "wide", "narrow"];
- switch(c){
- case 'G':
- s = bundle[(l < 4) ? "eraAbbr" : "eraNames"][dateObject.getFullYear() < 0 ? 0 : 1];
- break;
- case 'y':
- s = dateObject.getFullYear();
- switch(l){
- case 1:
- break;
- case 2:
- if(!options.fullYear){
- s = String(s); s = s.substr(s.length - 2);
- break;
- }
- // fallthrough
- default:
- pad = true;
- }
- break;
- case 'Q':
- case 'q':
- s = Math.ceil((dateObject.getMonth()+1)/3);
-// switch(l){
-// case 1: case 2:
- pad = true;
-// break;
-// case 3: case 4: // unimplemented
-// }
- break;
- case 'M':
- var m = dateObject.getMonth();
- if(l<3){
- s = m+1; pad = true;
- }else{
- var propM = ["months", "format", widthList[l-3]].join("-");
- s = bundle[propM][m];
- }
- break;
- case 'w':
- var firstDay = 0;
- s = dojo.date.locale._getWeekOfYear(dateObject, firstDay); pad = true;
- break;
- case 'd':
- s = dateObject.getDate(); pad = true;
- break;
- case 'D':
- s = dojo.date.locale._getDayOfYear(dateObject); pad = true;
- break;
- case 'E':
- var d = dateObject.getDay();
- if(l<3){
- s = d+1; pad = true;
- }else{
- var propD = ["days", "format", widthList[l-3]].join("-");
- s = bundle[propD][d];
- }
- break;
- case 'a':
- var timePeriod = (dateObject.getHours() < 12) ? 'am' : 'pm';
- s = options[timePeriod] || bundle['dayPeriods-format-wide-' + timePeriod];
- break;
- case 'h':
- case 'H':
- case 'K':
- case 'k':
- var h = dateObject.getHours();
- // strange choices in the date format make it impossible to write this succinctly
- switch (c){
- case 'h': // 1-12
- s = (h % 12) || 12;
- break;
- case 'H': // 0-23
- s = h;
- break;
- case 'K': // 0-11
- s = (h % 12);
- break;
- case 'k': // 1-24
- s = h || 24;
- break;
- }
- pad = true;
- break;
- case 'm':
- s = dateObject.getMinutes(); pad = true;
- break;
- case 's':
- s = dateObject.getSeconds(); pad = true;
- break;
- case 'S':
- s = Math.round(dateObject.getMilliseconds() * Math.pow(10, l-3)); pad = true;
- break;
- case 'v': // FIXME: don't know what this is. seems to be same as z?
- case 'z':
- // We only have one timezone to offer; the one from the browser
- s = dojo.date.locale._getZone(dateObject, true, options);
- if(s){break;}
- l=4;
- // fallthrough... use GMT if tz not available
- case 'Z':
- var offset = dojo.date.locale._getZone(dateObject, false, options);
- var tz = [
- (offset<=0 ? "+" : "-"),
- dojo.string.pad(Math.floor(Math.abs(offset)/60), 2),
- dojo.string.pad(Math.abs(offset)% 60, 2)
- ];
- if(l==4){
- tz.splice(0, 0, "GMT");
- tz.splice(3, 0, ":");
- }
- s = tz.join("");
- break;
-// case 'Y': case 'u': case 'W': case 'F': case 'g': case 'A': case 'e':
-// console.log(match+" modifier unimplemented");
- default:
- throw new Error("dojo.date.locale.format: invalid pattern char: "+pattern);
- }
- if(pad){ s = dojo.string.pad(s, l); }
- return s;
- });
- }
-
-/*=====
- dojo.date.locale.__FormatOptions = function(){
- // selector: String
- // choice of 'time','date' (default: date and time)
- // formatLength: String
- // choice of long, short, medium or full (plus any custom additions). Defaults to 'short'
- // datePattern:String
- // override pattern with this string
- // timePattern:String
- // override pattern with this string
- // am: String
- // override strings for am in times
- // pm: String
- // override strings for pm in times
- // locale: String
- // override the locale used to determine formatting rules
- // fullYear: Boolean
- // (format only) use 4 digit years whenever 2 digit years are called for
- // strict: Boolean
- // (parse only) strict parsing, off by default
- this.selector = selector;
- this.formatLength = formatLength;
- this.datePattern = datePattern;
- this.timePattern = timePattern;
- this.am = am;
- this.pm = pm;
- this.locale = locale;
- this.fullYear = fullYear;
- this.strict = strict;
- }
-=====*/
-
-dojo.date.locale._getZone = function(/*Date*/dateObject, /*boolean*/getName, /*dojo.date.locale.__FormatOptions?*/options){
- // summary:
- // Returns the zone (or offset) for the given date and options. This
- // is broken out into a separate function so that it can be overridden
- // by timezone-aware code.
- //
- // dateObject:
- // the date and/or time being formatted.
- //
- // getName:
- // Whether to return the timezone string (if true), or the offset (if false)
- //
- // options:
- // The options being used for formatting
- if(getName){
- return dojo.date.getTimezoneName(dateObject);
- }else{
- return dateObject.getTimezoneOffset();
- }
-};
-
-
-dojo.date.locale.format = function(/*Date*/dateObject, /*dojo.date.locale.__FormatOptions?*/options){
- // summary:
- // Format a Date object as a String, using locale-specific settings.
- //
- // description:
- // Create a string from a Date object using a known localized pattern.
- // By default, this method formats both date and time from dateObject.
- // Formatting patterns are chosen appropriate to the locale. Different
- // formatting lengths may be chosen, with "full" used by default.
- // Custom patterns may be used or registered with translations using
- // the dojo.date.locale.addCustomFormats method.
- // Formatting patterns are implemented using [the syntax described at
- // unicode.org](http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns)
- //
- // dateObject:
- // the date and/or time to be formatted. If a time only is formatted,
- // the values in the year, month, and day fields are irrelevant. The
- // opposite is true when formatting only dates.
-
- options = options || {};
-
- var locale = dojo.i18n.normalizeLocale(options.locale),
- formatLength = options.formatLength || 'short',
- bundle = dojo.date.locale._getGregorianBundle(locale),
- str = [],
- sauce = dojo.hitch(this, formatPattern, dateObject, bundle, options);
- if(options.selector == "year"){
- return _processPattern(bundle["dateFormatItem-yyyy"] || "yyyy", sauce);
- }
- var pattern;
- if(options.selector != "date"){
- pattern = options.timePattern || bundle["timeFormat-"+formatLength];
- if(pattern){str.push(_processPattern(pattern, sauce));}
- }
- if(options.selector != "time"){
- pattern = options.datePattern || bundle["dateFormat-"+formatLength];
- if(pattern){str.push(_processPattern(pattern, sauce));}
- }
-
- return str.length == 1 ? str[0] : bundle["dateTimeFormat-"+formatLength].replace(/\{(\d+)\}/g,
- function(match, key){ return str[key]; }); // String
-};
-
-dojo.date.locale.regexp = function(/*dojo.date.locale.__FormatOptions?*/options){
- // summary:
- // Builds the regular needed to parse a localized date
-
- return dojo.date.locale._parseInfo(options).regexp; // String
-};
-
-dojo.date.locale._parseInfo = function(/*dojo.date.locale.__FormatOptions?*/options){
- options = options || {};
- var locale = dojo.i18n.normalizeLocale(options.locale),
- bundle = dojo.date.locale._getGregorianBundle(locale),
- formatLength = options.formatLength || 'short',
- datePattern = options.datePattern || bundle["dateFormat-" + formatLength],
- timePattern = options.timePattern || bundle["timeFormat-" + formatLength],
- pattern;
- if(options.selector == 'date'){
- pattern = datePattern;
- }else if(options.selector == 'time'){
- pattern = timePattern;
- }else{
- pattern = bundle["dateTimeFormat-"+formatLength].replace(/\{(\d+)\}/g,
- function(match, key){ return [timePattern, datePattern][key]; });
- }
-
- var tokens = [],
- re = _processPattern(pattern, dojo.hitch(this, _buildDateTimeRE, tokens, bundle, options));
- return {regexp: re, tokens: tokens, bundle: bundle};
-};
-
-dojo.date.locale.parse = function(/*String*/value, /*dojo.date.locale.__FormatOptions?*/options){
- // summary:
- // Convert a properly formatted string to a primitive Date object,
- // using locale-specific settings.
- //
- // description:
- // Create a Date object from a string using a known localized pattern.
- // By default, this method parses looking for both date and time in the string.
- // Formatting patterns are chosen appropriate to the locale. Different
- // formatting lengths may be chosen, with "full" used by default.
- // Custom patterns may be used or registered with translations using
- // the dojo.date.locale.addCustomFormats method.
- //
- // Formatting patterns are implemented using [the syntax described at
- // unicode.org](http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns)
- // When two digit years are used, a century is chosen according to a sliding
- // window of 80 years before and 20 years after present year, for both `yy` and `yyyy` patterns.
- // year < 100CE requires strict mode.
- //
- // value:
- // A string representation of a date
-
- // remove non-printing bidi control chars from input and pattern
- var controlChars = /[\u200E\u200F\u202A\u202E]/g,
- info = dojo.date.locale._parseInfo(options),
- tokens = info.tokens, bundle = info.bundle,
- re = new RegExp("^" + info.regexp.replace(controlChars, "") + "$",
- info.strict ? "" : "i"),
- match = re.exec(value && value.replace(controlChars, ""));
-
- if(!match){ return null; } // null
-
- var widthList = ['abbr', 'wide', 'narrow'],
- result = [1970,0,1,0,0,0,0], // will get converted to a Date at the end
- amPm = "",
- valid = dojo.every(match, function(v, i){
- if(!i){return true;}
- var token=tokens[i-1];
- var l=token.length;
- switch(token.charAt(0)){
- case 'y':
- if(l != 2 && options.strict){
- //interpret year literally, so '5' would be 5 A.D.
- result[0] = v;
- }else{
- if(v<100){
- v = Number(v);
- //choose century to apply, according to a sliding window
- //of 80 years before and 20 years after present year
- var year = '' + new Date().getFullYear(),
- century = year.substring(0, 2) * 100,
- cutoff = Math.min(Number(year.substring(2, 4)) + 20, 99),
- num = (v < cutoff) ? century + v : century - 100 + v;
- result[0] = num;
- }else{
- //we expected 2 digits and got more...
- if(options.strict){
- return false;
- }
- //interpret literally, so '150' would be 150 A.D.
- //also tolerate '1950', if 'yyyy' input passed to 'yy' format
- result[0] = v;
- }
- }
- break;
- case 'M':
- if(l>2){
- var months = bundle['months-format-' + widthList[l-3]].concat();
- if(!options.strict){
- //Tolerate abbreviating period in month part
- //Case-insensitive comparison
- v = v.replace(".","").toLowerCase();
- months = dojo.map(months, function(s){ return s.replace(".","").toLowerCase(); } );
- }
- v = dojo.indexOf(months, v);
- if(v == -1){
-// console.log("dojo.date.locale.parse: Could not parse month name: '" + v + "'.");
- return false;
- }
- }else{
- v--;
- }
- result[1] = v;
- break;
- case 'E':
- case 'e':
- var days = bundle['days-format-' + widthList[l-3]].concat();
- if(!options.strict){
- //Case-insensitive comparison
- v = v.toLowerCase();
- days = dojo.map(days, function(d){return d.toLowerCase();});
- }
- v = dojo.indexOf(days, v);
- if(v == -1){
-// console.log("dojo.date.locale.parse: Could not parse weekday name: '" + v + "'.");
- return false;
- }
-
- //TODO: not sure what to actually do with this input,
- //in terms of setting something on the Date obj...?
- //without more context, can't affect the actual date
- //TODO: just validate?
- break;
- case 'D':
- result[1] = 0;
- // fallthrough...
- case 'd':
- result[2] = v;
- break;
- case 'a': //am/pm
- var am = options.am || bundle['dayPeriods-format-wide-am'],
- pm = options.pm || bundle['dayPeriods-format-wide-pm'];
- if(!options.strict){
- var period = /\./g;
- v = v.replace(period,'').toLowerCase();
- am = am.replace(period,'').toLowerCase();
- pm = pm.replace(period,'').toLowerCase();
- }
- if(options.strict && v != am && v != pm){
-// console.log("dojo.date.locale.parse: Could not parse am/pm part.");
- return false;
- }
-
- // we might not have seen the hours field yet, so store the state and apply hour change later
- amPm = (v == pm) ? 'p' : (v == am) ? 'a' : '';
- break;
- case 'K': //hour (1-24)
- if(v == 24){ v = 0; }
- // fallthrough...
- case 'h': //hour (1-12)
- case 'H': //hour (0-23)
- case 'k': //hour (0-11)
- //TODO: strict bounds checking, padding
- if(v > 23){
-// console.log("dojo.date.locale.parse: Illegal hours value");
- return false;
- }
-
- //in the 12-hour case, adjusting for am/pm requires the 'a' part
- //which could come before or after the hour, so we will adjust later
- result[3] = v;
- break;
- case 'm': //minutes
- result[4] = v;
- break;
- case 's': //seconds
- result[5] = v;
- break;
- case 'S': //milliseconds
- result[6] = v;
-// break;
-// case 'w':
-//TODO var firstDay = 0;
-// default:
-//TODO: throw?
-// console.log("dojo.date.locale.parse: unsupported pattern char=" + token.charAt(0));
- }
- return true;
- });
-
- var hours = +result[3];
- if(amPm === 'p' && hours < 12){
- result[3] = hours + 12; //e.g., 3pm -> 15
- }else if(amPm === 'a' && hours == 12){
- result[3] = 0; //12am -> 0
- }
-
- //TODO: implement a getWeekday() method in order to test
- //validity of input strings containing 'EEE' or 'EEEE'...
-
- var dateObject = new Date(result[0], result[1], result[2], result[3], result[4], result[5], result[6]); // Date
- if(options.strict){
- dateObject.setFullYear(result[0]);
- }
-
- // Check for overflow. The Date() constructor normalizes things like April 32nd...
- //TODO: why isn't this done for times as well?
- var allTokens = tokens.join(""),
- dateToken = allTokens.indexOf('d') != -1,
- monthToken = allTokens.indexOf('M') != -1;
-
- if(!valid ||
- (monthToken && dateObject.getMonth() > result[1]) ||
- (dateToken && dateObject.getDate() > result[2])){
- return null;
- }
-
- // Check for underflow, due to DST shifts. See #9366
- // This assumes a 1 hour dst shift correction at midnight
- // We could compare the timezone offset after the shift and add the difference instead.
- if((monthToken && dateObject.getMonth() < result[1]) ||
- (dateToken && dateObject.getDate() < result[2])){
- dateObject = dojo.date.add(dateObject, "hour", 1);
- }
-
- return dateObject; // Date
-};
-
-function _processPattern(pattern, applyPattern, applyLiteral, applyAll){
- //summary: Process a pattern with literals in it
-
- // Break up on single quotes, treat every other one as a literal, except '' which becomes '
- var identity = function(x){return x;};
- applyPattern = applyPattern || identity;
- applyLiteral = applyLiteral || identity;
- applyAll = applyAll || identity;
-
- //split on single quotes (which escape literals in date format strings)
- //but preserve escaped single quotes (e.g., o''clock)
- var chunks = pattern.match(/(''|[^'])+/g),
- literal = pattern.charAt(0) == "'";
-
- dojo.forEach(chunks, function(chunk, i){
- if(!chunk){
- chunks[i]='';
- }else{
- chunks[i]=(literal ? applyLiteral : applyPattern)(chunk.replace(/''/g, "'"));
- literal = !literal;
- }
- });
- return applyAll(chunks.join(''));
-}
-
-function _buildDateTimeRE(tokens, bundle, options, pattern){
- pattern = dojo.regexp.escapeString(pattern);
- if(!options.strict){ pattern = pattern.replace(" a", " ?a"); } // kludge to tolerate no space before am/pm
- return pattern.replace(/([a-z])\1*/ig, function(match){
- // Build a simple regexp. Avoid captures, which would ruin the tokens list
- var s,
- c = match.charAt(0),
- l = match.length,
- p2 = '', p3 = '';
- if(options.strict){
- if(l > 1){ p2 = '0' + '{'+(l-1)+'}'; }
- if(l > 2){ p3 = '0' + '{'+(l-2)+'}'; }
- }else{
- p2 = '0?'; p3 = '0{0,2}';
- }
- switch(c){
- case 'y':
- s = '\\d{2,4}';
- break;
- case 'M':
- s = (l>2) ? '\\S+?' : '1[0-2]|'+p2+'[1-9]';
- break;
- case 'D':
- s = '[12][0-9][0-9]|3[0-5][0-9]|36[0-6]|'+p3+'[1-9][0-9]|'+p2+'[1-9]';
- break;
- case 'd':
- s = '3[01]|[12]\\d|'+p2+'[1-9]';
- break;
- case 'w':
- s = '[1-4][0-9]|5[0-3]|'+p2+'[1-9]';
- break;
- case 'E':
- s = '\\S+';
- break;
- case 'h': //hour (1-12)
- s = '1[0-2]|'+p2+'[1-9]';
- break;
- case 'k': //hour (0-11)
- s = '1[01]|'+p2+'\\d';
- break;
- case 'H': //hour (0-23)
- s = '1\\d|2[0-3]|'+p2+'\\d';
- break;
- case 'K': //hour (1-24)
- s = '1\\d|2[0-4]|'+p2+'[1-9]';
- break;
- case 'm':
- case 's':
- s = '[0-5]\\d';
- break;
- case 'S':
- s = '\\d{'+l+'}';
- break;
- case 'a':
- var am = options.am || bundle['dayPeriods-format-wide-am'],
- pm = options.pm || bundle['dayPeriods-format-wide-pm'];
- s = am + '|' + pm;
- if(!options.strict){
- if(am != am.toLowerCase()){ s += '|' + am.toLowerCase(); }
- if(pm != pm.toLowerCase()){ s += '|' + pm.toLowerCase(); }
- if(s.indexOf('.') != -1){ s += '|' + s.replace(/\./g, ""); }
- }
- s = s.replace(/\./g, "\\.");
- break;
- default:
- // case 'v':
- // case 'z':
- // case 'Z':
- s = ".*";
-// console.log("parse of date format, pattern=" + pattern);
- }
-
- if(tokens){ tokens.push(match); }
-
- return "(" + s + ")"; // add capture
- }).replace(/[\xa0 ]/g, "[\\s\\xa0]"); // normalize whitespace. Need explicit handling of \xa0 for IE.
-}
-})();
-
-(function(){
-var _customFormats = [];
-dojo.date.locale.addCustomFormats = function(/*String*/packageName, /*String*/bundleName){
- // summary:
- // Add a reference to a bundle containing localized custom formats to be
- // used by date/time formatting and parsing routines.
- //
- // description:
- // The user may add custom localized formats where the bundle has properties following the
- // same naming convention used by dojo.cldr: `dateFormat-xxxx` / `timeFormat-xxxx`
- // The pattern string should match the format used by the CLDR.
- // See dojo.date.locale.format() for details.
- // The resources must be loaded by dojo.requireLocalization() prior to use
-
- _customFormats.push({pkg:packageName,name:bundleName});
-};
-
-dojo.date.locale._getGregorianBundle = function(/*String*/locale){
- var gregorian = {};
- dojo.forEach(_customFormats, function(desc){
- var bundle = dojo.i18n.getLocalization(desc.pkg, desc.name, locale);
- gregorian = dojo.mixin(gregorian, bundle);
- }, this);
- return gregorian; /*Object*/
-};
-})();
-
-dojo.date.locale.addCustomFormats("dojo.cldr","gregorian");
-
-dojo.date.locale.getNames = function(/*String*/item, /*String*/type, /*String?*/context, /*String?*/locale){
- // summary:
- // Used to get localized strings from dojo.cldr for day or month names.
- //
- // item:
- // 'months' || 'days'
- // type:
- // 'wide' || 'narrow' || 'abbr' (e.g. "Monday", "Mon", or "M" respectively, in English)
- // context:
- // 'standAlone' || 'format' (default)
- // locale:
- // override locale used to find the names
-
- var label,
- lookup = dojo.date.locale._getGregorianBundle(locale),
- props = [item, context, type];
- if(context == 'standAlone'){
- var key = props.join('-');
- label = lookup[key];
- // Fall back to 'format' flavor of name
- if(label[0] == 1){ label = undefined; } // kludge, in the absence of real aliasing support in dojo.cldr
- }
- props[1] = 'format';
-
- // return by copy so changes won't be made accidentally to the in-memory model
- return (label || lookup[props.join('-')]).concat(); /*Array*/
-};
-
-dojo.date.locale.isWeekend = function(/*Date?*/dateObject, /*String?*/locale){
- // summary:
- // Determines if the date falls on a weekend, according to local custom.
-
- var weekend = dojo.cldr.supplemental.getWeekend(locale),
- day = (dateObject || new Date()).getDay();
- if(weekend.end < weekend.start){
- weekend.end += 7;
- if(day < weekend.start){ day += 7; }
- }
- return day >= weekend.start && day <= weekend.end; // Boolean
-};
-
-// These are used only by format and strftime. Do they need to be public? Which module should they go in?
-
-dojo.date.locale._getDayOfYear = function(/*Date*/dateObject){
- // summary: gets the day of the year as represented by dateObject
- return dojo.date.difference(new Date(dateObject.getFullYear(), 0, 1, dateObject.getHours()), dateObject) + 1; // Number
-};
-
-dojo.date.locale._getWeekOfYear = function(/*Date*/dateObject, /*Number*/firstDayOfWeek){
- if(arguments.length == 1){ firstDayOfWeek = 0; } // Sunday
-
- var firstDayOfYear = new Date(dateObject.getFullYear(), 0, 1).getDay(),
- adj = (firstDayOfYear - firstDayOfWeek + 7) % 7,
- week = Math.floor((dojo.date.locale._getDayOfYear(dateObject) + adj - 1) / 7);
-
- // if year starts on the specified day, start counting weeks at 1
- if(firstDayOfYear == firstDayOfWeek){ week++; }
-
- return week; // Number
-};
-
-}
+//>>built
+define("dojo/date/locale",["../_base/kernel","../_base/lang","../_base/array","../date","../cldr/supplemental","../regexp","../string","../i18n!../cldr/nls/gregorian"],function(_1,_2,_3,_4,_5,_6,_7,_8){_2.getObject("date.locale",true,_1);function _9(_a,_b,_c,_d){return _d.replace(/([a-z])\1*/ig,function(_e){var s,_f,c=_e.charAt(0),l=_e.length,_10=["abbr","wide","narrow"];switch(c){case "G":s=_b[(l<4)?"eraAbbr":"eraNames"][_a.getFullYear()<0?0:1];break;case "y":s=_a.getFullYear();switch(l){case 1:break;case 2:if(!_c.fullYear){s=String(s);s=s.substr(s.length-2);break;}default:_f=true;}break;case "Q":case "q":s=Math.ceil((_a.getMonth()+1)/3);_f=true;break;case "M":var m=_a.getMonth();if(l<3){s=m+1;_f=true;}else{var _11=["months","format",_10[l-3]].join("-");s=_b[_11][m];}break;case "w":var _12=0;s=_1.date.locale._getWeekOfYear(_a,_12);_f=true;break;case "d":s=_a.getDate();_f=true;break;case "D":s=_1.date.locale._getDayOfYear(_a);_f=true;break;case "E":var d=_a.getDay();if(l<3){s=d+1;_f=true;}else{var _13=["days","format",_10[l-3]].join("-");s=_b[_13][d];}break;case "a":var _14=(_a.getHours()<12)?"am":"pm";s=_c[_14]||_b["dayPeriods-format-wide-"+_14];break;case "h":case "H":case "K":case "k":var h=_a.getHours();switch(c){case "h":s=(h%12)||12;break;case "H":s=h;break;case "K":s=(h%12);break;case "k":s=h||24;break;}_f=true;break;case "m":s=_a.getMinutes();_f=true;break;case "s":s=_a.getSeconds();_f=true;break;case "S":s=Math.round(_a.getMilliseconds()*Math.pow(10,l-3));_f=true;break;case "v":case "z":s=_1.date.locale._getZone(_a,true,_c);if(s){break;}l=4;case "Z":var _15=_1.date.locale._getZone(_a,false,_c);var tz=[(_15<=0?"+":"-"),_7.pad(Math.floor(Math.abs(_15)/60),2),_7.pad(Math.abs(_15)%60,2)];if(l==4){tz.splice(0,0,"GMT");tz.splice(3,0,":");}s=tz.join("");break;default:throw new Error("dojo.date.locale.format: invalid pattern char: "+_d);}if(_f){s=_7.pad(s,l);}return s;});};_1.date.locale._getZone=function(_16,_17,_18){if(_17){return _4.getTimezoneName(_16);}else{return _16.getTimezoneOffset();}};_1.date.locale.format=function(_19,_1a){_1a=_1a||{};var _1b=_1.i18n.normalizeLocale(_1a.locale),_1c=_1a.formatLength||"short",_1d=_1.date.locale._getGregorianBundle(_1b),str=[],_1e=_2.hitch(this,_9,_19,_1d,_1a);if(_1a.selector=="year"){return _1f(_1d["dateFormatItem-yyyy"]||"yyyy",_1e);}var _20;if(_1a.selector!="date"){_20=_1a.timePattern||_1d["timeFormat-"+_1c];if(_20){str.push(_1f(_20,_1e));}}if(_1a.selector!="time"){_20=_1a.datePattern||_1d["dateFormat-"+_1c];if(_20){str.push(_1f(_20,_1e));}}return str.length==1?str[0]:_1d["dateTimeFormat-"+_1c].replace(/\{(\d+)\}/g,function(_21,key){return str[key];});};_1.date.locale.regexp=function(_22){return _1.date.locale._parseInfo(_22).regexp;};_1.date.locale._parseInfo=function(_23){_23=_23||{};var _24=_1.i18n.normalizeLocale(_23.locale),_25=_1.date.locale._getGregorianBundle(_24),_26=_23.formatLength||"short",_27=_23.datePattern||_25["dateFormat-"+_26],_28=_23.timePattern||_25["timeFormat-"+_26],_29;if(_23.selector=="date"){_29=_27;}else{if(_23.selector=="time"){_29=_28;}else{_29=_25["dateTimeFormat-"+_26].replace(/\{(\d+)\}/g,function(_2a,key){return [_28,_27][key];});}}var _2b=[],re=_1f(_29,_2.hitch(this,_2c,_2b,_25,_23));return {regexp:re,tokens:_2b,bundle:_25};};_1.date.locale.parse=function(_2d,_2e){var _2f=/[\u200E\u200F\u202A\u202E]/g,_30=_1.date.locale._parseInfo(_2e),_31=_30.tokens,_32=_30.bundle,re=new RegExp("^"+_30.regexp.replace(_2f,"")+"$",_30.strict?"":"i"),_33=re.exec(_2d&&_2d.replace(_2f,""));if(!_33){return null;}var _34=["abbr","wide","narrow"],_35=[1970,0,1,0,0,0,0],_36="",_37=_1.every(_33,function(v,i){if(!i){return true;}var _38=_31[i-1];var l=_38.length;switch(_38.charAt(0)){case "y":if(l!=2&&_2e.strict){_35[0]=v;}else{if(v<100){v=Number(v);var _39=""+new Date().getFullYear(),_3a=_39.substring(0,2)*100,_3b=Math.min(Number(_39.substring(2,4))+20,99);_35[0]=(v<_3b)?_3a+v:_3a-100+v;}else{if(_2e.strict){return false;}_35[0]=v;}}break;case "M":if(l>2){var _3c=_32["months-format-"+_34[l-3]].concat();if(!_2e.strict){v=v.replace(".","").toLowerCase();_3c=_1.map(_3c,function(s){return s.replace(".","").toLowerCase();});}v=_1.indexOf(_3c,v);if(v==-1){return false;}}else{v--;}_35[1]=v;break;case "E":case "e":var _3d=_32["days-format-"+_34[l-3]].concat();if(!_2e.strict){v=v.toLowerCase();_3d=_1.map(_3d,function(d){return d.toLowerCase();});}v=_1.indexOf(_3d,v);if(v==-1){return false;}break;case "D":_35[1]=0;case "d":_35[2]=v;break;case "a":var am=_2e.am||_32["dayPeriods-format-wide-am"],pm=_2e.pm||_32["dayPeriods-format-wide-pm"];if(!_2e.strict){var _3e=/\./g;v=v.replace(_3e,"").toLowerCase();am=am.replace(_3e,"").toLowerCase();pm=pm.replace(_3e,"").toLowerCase();}if(_2e.strict&&v!=am&&v!=pm){return false;}_36=(v==pm)?"p":(v==am)?"a":"";break;case "K":if(v==24){v=0;}case "h":case "H":case "k":if(v>23){return false;}_35[3]=v;break;case "m":_35[4]=v;break;case "s":_35[5]=v;break;case "S":_35[6]=v;}return true;});var _3f=+_35[3];if(_36==="p"&&_3f<12){_35[3]=_3f+12;}else{if(_36==="a"&&_3f==12){_35[3]=0;}}var _40=new Date(_35[0],_35[1],_35[2],_35[3],_35[4],_35[5],_35[6]);if(_2e.strict){_40.setFullYear(_35[0]);}var _41=_31.join(""),_42=_41.indexOf("d")!=-1,_43=_41.indexOf("M")!=-1;if(!_37||(_43&&_40.getMonth()>_35[1])||(_42&&_40.getDate()>_35[2])){return null;}if((_43&&_40.getMonth()<_35[1])||(_42&&_40.getDate()<_35[2])){_40=_4.add(_40,"hour",1);}return _40;};function _1f(_44,_45,_46,_47){var _48=function(x){return x;};_45=_45||_48;_46=_46||_48;_47=_47||_48;var _49=_44.match(/(''|[^'])+/g),_4a=_44.charAt(0)=="'";_1.forEach(_49,function(_4b,i){if(!_4b){_49[i]="";}else{_49[i]=(_4a?_46:_45)(_4b.replace(/''/g,"'"));_4a=!_4a;}});return _47(_49.join(""));};function _2c(_4c,_4d,_4e,_4f){_4f=_6.escapeString(_4f);if(!_4e.strict){_4f=_4f.replace(" a"," ?a");}return _4f.replace(/([a-z])\1*/ig,function(_50){var s,c=_50.charAt(0),l=_50.length,p2="",p3="";if(_4e.strict){if(l>1){p2="0"+"{"+(l-1)+"}";}if(l>2){p3="0"+"{"+(l-2)+"}";}}else{p2="0?";p3="0{0,2}";}switch(c){case "y":s="\\d{2,4}";break;case "M":s=(l>2)?"\\S+?":"1[0-2]|"+p2+"[1-9]";break;case "D":s="[12][0-9][0-9]|3[0-5][0-9]|36[0-6]|"+p2+"[1-9][0-9]|"+p3+"[1-9]";break;case "d":s="3[01]|[12]\\d|"+p2+"[1-9]";break;case "w":s="[1-4][0-9]|5[0-3]|"+p2+"[1-9]";break;case "E":s="\\S+";break;case "h":s="1[0-2]|"+p2+"[1-9]";break;case "k":s="1[01]|"+p2+"\\d";break;case "H":s="1\\d|2[0-3]|"+p2+"\\d";break;case "K":s="1\\d|2[0-4]|"+p2+"[1-9]";break;case "m":case "s":s="[0-5]\\d";break;case "S":s="\\d{"+l+"}";break;case "a":var am=_4e.am||_4d["dayPeriods-format-wide-am"],pm=_4e.pm||_4d["dayPeriods-format-wide-pm"];s=am+"|"+pm;if(!_4e.strict){if(am!=am.toLowerCase()){s+="|"+am.toLowerCase();}if(pm!=pm.toLowerCase()){s+="|"+pm.toLowerCase();}if(s.indexOf(".")!=-1){s+="|"+s.replace(/\./g,"");}}s=s.replace(/\./g,"\\.");break;default:s=".*";}if(_4c){_4c.push(_50);}return "("+s+")";}).replace(/[\xa0 ]/g,"[\\s\\xa0]");};var _51=[];_1.date.locale.addCustomFormats=function(_52,_53){_51.push({pkg:_52,name:_53});};_1.date.locale._getGregorianBundle=function(_54){var _55={};_1.forEach(_51,function(_56){var _57=_1.i18n.getLocalization(_56.pkg,_56.name,_54);_55=_2.mixin(_55,_57);},this);return _55;};_1.date.locale.addCustomFormats("dojo.cldr","gregorian");_1.date.locale.getNames=function(_58,_59,_5a,_5b){var _5c,_5d=_1.date.locale._getGregorianBundle(_5b),_5e=[_58,_5a,_59];if(_5a=="standAlone"){var key=_5e.join("-");_5c=_5d[key];if(_5c[0]==1){_5c=undefined;}}_5e[1]="format";return (_5c||_5d[_5e.join("-")]).concat();};_1.date.locale.isWeekend=function(_5f,_60){var _61=_5.getWeekend(_60),day=(_5f||new Date()).getDay();if(_61.end<_61.start){_61.end+=7;if(day<_61.start){day+=7;}}return day>=_61.start&&day<=_61.end;};_1.date.locale._getDayOfYear=function(_62){return _4.difference(new Date(_62.getFullYear(),0,1,_62.getHours()),_62)+1;};_1.date.locale._getWeekOfYear=function(_63,_64){if(arguments.length==1){_64=0;}var _65=new Date(_63.getFullYear(),0,1).getDay(),adj=(_65-_64+7)%7,_66=Math.floor((_1.date.locale._getDayOfYear(_63)+adj-1)/7);if(_65==_64){_66++;}return _66;};return _1.date.locale;}); \ No newline at end of file
diff --git a/lib/dojo/date/locale.js.uncompressed.js b/lib/dojo/date/locale.js.uncompressed.js
new file mode 100644
index 000000000..bf4682b39
--- /dev/null
+++ b/lib/dojo/date/locale.js.uncompressed.js
@@ -0,0 +1,670 @@
+define("dojo/date/locale", [
+ "../_base/kernel",
+ "../_base/lang",
+ "../_base/array",
+ "../date",
+ "../cldr/supplemental",
+ "../regexp",
+ "../string",
+ "../i18n!../cldr/nls/gregorian"
+], function(dojo, lang, array, date, cldr, regexp, string, gregorian) {
+ // module:
+ // dojo/date/locale
+ // summary:
+ // This modules defines dojo.date.locale, localization methods for Date.
+
+lang.getObject("date.locale", true, dojo);
+
+// Localization methods for Date. Honor local customs using locale-dependent dojo.cldr data.
+
+// Load the bundles containing localization information for
+// names and formats
+
+//NOTE: Everything in this module assumes Gregorian calendars.
+// Other calendars will be implemented in separate modules.
+
+ // Format a pattern without literals
+ function formatPattern(dateObject, bundle, options, pattern){
+ return pattern.replace(/([a-z])\1*/ig, function(match){
+ var s, pad,
+ c = match.charAt(0),
+ l = match.length,
+ widthList = ["abbr", "wide", "narrow"];
+ switch(c){
+ case 'G':
+ s = bundle[(l < 4) ? "eraAbbr" : "eraNames"][dateObject.getFullYear() < 0 ? 0 : 1];
+ break;
+ case 'y':
+ s = dateObject.getFullYear();
+ switch(l){
+ case 1:
+ break;
+ case 2:
+ if(!options.fullYear){
+ s = String(s); s = s.substr(s.length - 2);
+ break;
+ }
+ // fallthrough
+ default:
+ pad = true;
+ }
+ break;
+ case 'Q':
+ case 'q':
+ s = Math.ceil((dateObject.getMonth()+1)/3);
+// switch(l){
+// case 1: case 2:
+ pad = true;
+// break;
+// case 3: case 4: // unimplemented
+// }
+ break;
+ case 'M':
+ var m = dateObject.getMonth();
+ if(l<3){
+ s = m+1; pad = true;
+ }else{
+ var propM = ["months", "format", widthList[l-3]].join("-");
+ s = bundle[propM][m];
+ }
+ break;
+ case 'w':
+ var firstDay = 0;
+ s = dojo.date.locale._getWeekOfYear(dateObject, firstDay); pad = true;
+ break;
+ case 'd':
+ s = dateObject.getDate(); pad = true;
+ break;
+ case 'D':
+ s = dojo.date.locale._getDayOfYear(dateObject); pad = true;
+ break;
+ case 'E':
+ var d = dateObject.getDay();
+ if(l<3){
+ s = d+1; pad = true;
+ }else{
+ var propD = ["days", "format", widthList[l-3]].join("-");
+ s = bundle[propD][d];
+ }
+ break;
+ case 'a':
+ var timePeriod = (dateObject.getHours() < 12) ? 'am' : 'pm';
+ s = options[timePeriod] || bundle['dayPeriods-format-wide-' + timePeriod];
+ break;
+ case 'h':
+ case 'H':
+ case 'K':
+ case 'k':
+ var h = dateObject.getHours();
+ // strange choices in the date format make it impossible to write this succinctly
+ switch (c){
+ case 'h': // 1-12
+ s = (h % 12) || 12;
+ break;
+ case 'H': // 0-23
+ s = h;
+ break;
+ case 'K': // 0-11
+ s = (h % 12);
+ break;
+ case 'k': // 1-24
+ s = h || 24;
+ break;
+ }
+ pad = true;
+ break;
+ case 'm':
+ s = dateObject.getMinutes(); pad = true;
+ break;
+ case 's':
+ s = dateObject.getSeconds(); pad = true;
+ break;
+ case 'S':
+ s = Math.round(dateObject.getMilliseconds() * Math.pow(10, l-3)); pad = true;
+ break;
+ case 'v': // FIXME: don't know what this is. seems to be same as z?
+ case 'z':
+ // We only have one timezone to offer; the one from the browser
+ s = dojo.date.locale._getZone(dateObject, true, options);
+ if(s){break;}
+ l=4;
+ // fallthrough... use GMT if tz not available
+ case 'Z':
+ var offset = dojo.date.locale._getZone(dateObject, false, options);
+ var tz = [
+ (offset<=0 ? "+" : "-"),
+ string.pad(Math.floor(Math.abs(offset)/60), 2),
+ string.pad(Math.abs(offset)% 60, 2)
+ ];
+ if(l==4){
+ tz.splice(0, 0, "GMT");
+ tz.splice(3, 0, ":");
+ }
+ s = tz.join("");
+ break;
+// case 'Y': case 'u': case 'W': case 'F': case 'g': case 'A': case 'e':
+// console.log(match+" modifier unimplemented");
+ default:
+ throw new Error("dojo.date.locale.format: invalid pattern char: "+pattern);
+ }
+ if(pad){ s = string.pad(s, l); }
+ return s;
+ });
+ }
+
+/*=====
+ dojo.date.locale.__FormatOptions = function(){
+ // selector: String
+ // choice of 'time','date' (default: date and time)
+ // formatLength: String
+ // choice of long, short, medium or full (plus any custom additions). Defaults to 'short'
+ // datePattern:String
+ // override pattern with this string
+ // timePattern:String
+ // override pattern with this string
+ // am: String
+ // override strings for am in times
+ // pm: String
+ // override strings for pm in times
+ // locale: String
+ // override the locale used to determine formatting rules
+ // fullYear: Boolean
+ // (format only) use 4 digit years whenever 2 digit years are called for
+ // strict: Boolean
+ // (parse only) strict parsing, off by default
+ this.selector = selector;
+ this.formatLength = formatLength;
+ this.datePattern = datePattern;
+ this.timePattern = timePattern;
+ this.am = am;
+ this.pm = pm;
+ this.locale = locale;
+ this.fullYear = fullYear;
+ this.strict = strict;
+ }
+=====*/
+
+dojo.date.locale._getZone = function(/*Date*/dateObject, /*boolean*/getName, /*dojo.date.locale.__FormatOptions?*/options){
+ // summary:
+ // Returns the zone (or offset) for the given date and options. This
+ // is broken out into a separate function so that it can be overridden
+ // by timezone-aware code.
+ //
+ // dateObject:
+ // the date and/or time being formatted.
+ //
+ // getName:
+ // Whether to return the timezone string (if true), or the offset (if false)
+ //
+ // options:
+ // The options being used for formatting
+ if(getName){
+ return date.getTimezoneName(dateObject);
+ }else{
+ return dateObject.getTimezoneOffset();
+ }
+};
+
+
+dojo.date.locale.format = function(/*Date*/dateObject, /*dojo.date.locale.__FormatOptions?*/options){
+ // summary:
+ // Format a Date object as a String, using locale-specific settings.
+ //
+ // description:
+ // Create a string from a Date object using a known localized pattern.
+ // By default, this method formats both date and time from dateObject.
+ // Formatting patterns are chosen appropriate to the locale. Different
+ // formatting lengths may be chosen, with "full" used by default.
+ // Custom patterns may be used or registered with translations using
+ // the dojo.date.locale.addCustomFormats method.
+ // Formatting patterns are implemented using [the syntax described at
+ // unicode.org](http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns)
+ //
+ // dateObject:
+ // the date and/or time to be formatted. If a time only is formatted,
+ // the values in the year, month, and day fields are irrelevant. The
+ // opposite is true when formatting only dates.
+
+ options = options || {};
+
+ var locale = dojo.i18n.normalizeLocale(options.locale),
+ formatLength = options.formatLength || 'short',
+ bundle = dojo.date.locale._getGregorianBundle(locale),
+ str = [],
+ sauce = lang.hitch(this, formatPattern, dateObject, bundle, options);
+ if(options.selector == "year"){
+ return _processPattern(bundle["dateFormatItem-yyyy"] || "yyyy", sauce);
+ }
+ var pattern;
+ if(options.selector != "date"){
+ pattern = options.timePattern || bundle["timeFormat-"+formatLength];
+ if(pattern){str.push(_processPattern(pattern, sauce));}
+ }
+ if(options.selector != "time"){
+ pattern = options.datePattern || bundle["dateFormat-"+formatLength];
+ if(pattern){str.push(_processPattern(pattern, sauce));}
+ }
+
+ return str.length == 1 ? str[0] : bundle["dateTimeFormat-"+formatLength].replace(/\{(\d+)\}/g,
+ function(match, key){ return str[key]; }); // String
+};
+
+dojo.date.locale.regexp = function(/*dojo.date.locale.__FormatOptions?*/options){
+ // summary:
+ // Builds the regular needed to parse a localized date
+
+ return dojo.date.locale._parseInfo(options).regexp; // String
+};
+
+dojo.date.locale._parseInfo = function(/*dojo.date.locale.__FormatOptions?*/options){
+ options = options || {};
+ var locale = dojo.i18n.normalizeLocale(options.locale),
+ bundle = dojo.date.locale._getGregorianBundle(locale),
+ formatLength = options.formatLength || 'short',
+ datePattern = options.datePattern || bundle["dateFormat-" + formatLength],
+ timePattern = options.timePattern || bundle["timeFormat-" + formatLength],
+ pattern;
+ if(options.selector == 'date'){
+ pattern = datePattern;
+ }else if(options.selector == 'time'){
+ pattern = timePattern;
+ }else{
+ pattern = bundle["dateTimeFormat-"+formatLength].replace(/\{(\d+)\}/g,
+ function(match, key){ return [timePattern, datePattern][key]; });
+ }
+
+ var tokens = [],
+ re = _processPattern(pattern, lang.hitch(this, _buildDateTimeRE, tokens, bundle, options));
+ return {regexp: re, tokens: tokens, bundle: bundle};
+};
+
+dojo.date.locale.parse = function(/*String*/value, /*dojo.date.locale.__FormatOptions?*/options){
+ // summary:
+ // Convert a properly formatted string to a primitive Date object,
+ // using locale-specific settings.
+ //
+ // description:
+ // Create a Date object from a string using a known localized pattern.
+ // By default, this method parses looking for both date and time in the string.
+ // Formatting patterns are chosen appropriate to the locale. Different
+ // formatting lengths may be chosen, with "full" used by default.
+ // Custom patterns may be used or registered with translations using
+ // the dojo.date.locale.addCustomFormats method.
+ //
+ // Formatting patterns are implemented using [the syntax described at
+ // unicode.org](http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns)
+ // When two digit years are used, a century is chosen according to a sliding
+ // window of 80 years before and 20 years after present year, for both `yy` and `yyyy` patterns.
+ // year < 100CE requires strict mode.
+ //
+ // value:
+ // A string representation of a date
+
+ // remove non-printing bidi control chars from input and pattern
+ var controlChars = /[\u200E\u200F\u202A\u202E]/g,
+ info = dojo.date.locale._parseInfo(options),
+ tokens = info.tokens, bundle = info.bundle,
+ re = new RegExp("^" + info.regexp.replace(controlChars, "") + "$",
+ info.strict ? "" : "i"),
+ match = re.exec(value && value.replace(controlChars, ""));
+
+ if(!match){ return null; } // null
+
+ var widthList = ['abbr', 'wide', 'narrow'],
+ result = [1970,0,1,0,0,0,0], // will get converted to a Date at the end
+ amPm = "",
+ valid = dojo.every(match, function(v, i){
+ if(!i){return true;}
+ var token=tokens[i-1];
+ var l=token.length;
+ switch(token.charAt(0)){
+ case 'y':
+ if(l != 2 && options.strict){
+ //interpret year literally, so '5' would be 5 A.D.
+ result[0] = v;
+ }else{
+ if(v<100){
+ v = Number(v);
+ //choose century to apply, according to a sliding window
+ //of 80 years before and 20 years after present year
+ var year = '' + new Date().getFullYear(),
+ century = year.substring(0, 2) * 100,
+ cutoff = Math.min(Number(year.substring(2, 4)) + 20, 99);
+ result[0] = (v < cutoff) ? century + v : century - 100 + v;
+ }else{
+ //we expected 2 digits and got more...
+ if(options.strict){
+ return false;
+ }
+ //interpret literally, so '150' would be 150 A.D.
+ //also tolerate '1950', if 'yyyy' input passed to 'yy' format
+ result[0] = v;
+ }
+ }
+ break;
+ case 'M':
+ if(l>2){
+ var months = bundle['months-format-' + widthList[l-3]].concat();
+ if(!options.strict){
+ //Tolerate abbreviating period in month part
+ //Case-insensitive comparison
+ v = v.replace(".","").toLowerCase();
+ months = dojo.map(months, function(s){ return s.replace(".","").toLowerCase(); } );
+ }
+ v = dojo.indexOf(months, v);
+ if(v == -1){
+// console.log("dojo.date.locale.parse: Could not parse month name: '" + v + "'.");
+ return false;
+ }
+ }else{
+ v--;
+ }
+ result[1] = v;
+ break;
+ case 'E':
+ case 'e':
+ var days = bundle['days-format-' + widthList[l-3]].concat();
+ if(!options.strict){
+ //Case-insensitive comparison
+ v = v.toLowerCase();
+ days = dojo.map(days, function(d){return d.toLowerCase();});
+ }
+ v = dojo.indexOf(days, v);
+ if(v == -1){
+// console.log("dojo.date.locale.parse: Could not parse weekday name: '" + v + "'.");
+ return false;
+ }
+
+ //TODO: not sure what to actually do with this input,
+ //in terms of setting something on the Date obj...?
+ //without more context, can't affect the actual date
+ //TODO: just validate?
+ break;
+ case 'D':
+ result[1] = 0;
+ // fallthrough...
+ case 'd':
+ result[2] = v;
+ break;
+ case 'a': //am/pm
+ var am = options.am || bundle['dayPeriods-format-wide-am'],
+ pm = options.pm || bundle['dayPeriods-format-wide-pm'];
+ if(!options.strict){
+ var period = /\./g;
+ v = v.replace(period,'').toLowerCase();
+ am = am.replace(period,'').toLowerCase();
+ pm = pm.replace(period,'').toLowerCase();
+ }
+ if(options.strict && v != am && v != pm){
+// console.log("dojo.date.locale.parse: Could not parse am/pm part.");
+ return false;
+ }
+
+ // we might not have seen the hours field yet, so store the state and apply hour change later
+ amPm = (v == pm) ? 'p' : (v == am) ? 'a' : '';
+ break;
+ case 'K': //hour (1-24)
+ if(v == 24){ v = 0; }
+ // fallthrough...
+ case 'h': //hour (1-12)
+ case 'H': //hour (0-23)
+ case 'k': //hour (0-11)
+ //TODO: strict bounds checking, padding
+ if(v > 23){
+// console.log("dojo.date.locale.parse: Illegal hours value");
+ return false;
+ }
+
+ //in the 12-hour case, adjusting for am/pm requires the 'a' part
+ //which could come before or after the hour, so we will adjust later
+ result[3] = v;
+ break;
+ case 'm': //minutes
+ result[4] = v;
+ break;
+ case 's': //seconds
+ result[5] = v;
+ break;
+ case 'S': //milliseconds
+ result[6] = v;
+// break;
+// case 'w':
+//TODO var firstDay = 0;
+// default:
+//TODO: throw?
+// console.log("dojo.date.locale.parse: unsupported pattern char=" + token.charAt(0));
+ }
+ return true;
+ });
+
+ var hours = +result[3];
+ if(amPm === 'p' && hours < 12){
+ result[3] = hours + 12; //e.g., 3pm -> 15
+ }else if(amPm === 'a' && hours == 12){
+ result[3] = 0; //12am -> 0
+ }
+
+ //TODO: implement a getWeekday() method in order to test
+ //validity of input strings containing 'EEE' or 'EEEE'...
+
+ var dateObject = new Date(result[0], result[1], result[2], result[3], result[4], result[5], result[6]); // Date
+ if(options.strict){
+ dateObject.setFullYear(result[0]);
+ }
+
+ // Check for overflow. The Date() constructor normalizes things like April 32nd...
+ //TODO: why isn't this done for times as well?
+ var allTokens = tokens.join(""),
+ dateToken = allTokens.indexOf('d') != -1,
+ monthToken = allTokens.indexOf('M') != -1;
+
+ if(!valid ||
+ (monthToken && dateObject.getMonth() > result[1]) ||
+ (dateToken && dateObject.getDate() > result[2])){
+ return null;
+ }
+
+ // Check for underflow, due to DST shifts. See #9366
+ // This assumes a 1 hour dst shift correction at midnight
+ // We could compare the timezone offset after the shift and add the difference instead.
+ if((monthToken && dateObject.getMonth() < result[1]) ||
+ (dateToken && dateObject.getDate() < result[2])){
+ dateObject = date.add(dateObject, "hour", 1);
+ }
+
+ return dateObject; // Date
+};
+
+function _processPattern(pattern, applyPattern, applyLiteral, applyAll){
+ //summary: Process a pattern with literals in it
+
+ // Break up on single quotes, treat every other one as a literal, except '' which becomes '
+ var identity = function(x){return x;};
+ applyPattern = applyPattern || identity;
+ applyLiteral = applyLiteral || identity;
+ applyAll = applyAll || identity;
+
+ //split on single quotes (which escape literals in date format strings)
+ //but preserve escaped single quotes (e.g., o''clock)
+ var chunks = pattern.match(/(''|[^'])+/g),
+ literal = pattern.charAt(0) == "'";
+
+ dojo.forEach(chunks, function(chunk, i){
+ if(!chunk){
+ chunks[i]='';
+ }else{
+ chunks[i]=(literal ? applyLiteral : applyPattern)(chunk.replace(/''/g, "'"));
+ literal = !literal;
+ }
+ });
+ return applyAll(chunks.join(''));
+}
+
+function _buildDateTimeRE(tokens, bundle, options, pattern){
+ pattern = regexp.escapeString(pattern);
+ if(!options.strict){ pattern = pattern.replace(" a", " ?a"); } // kludge to tolerate no space before am/pm
+ return pattern.replace(/([a-z])\1*/ig, function(match){
+ // Build a simple regexp. Avoid captures, which would ruin the tokens list
+ var s,
+ c = match.charAt(0),
+ l = match.length,
+ p2 = '', p3 = '';
+ if(options.strict){
+ if(l > 1){ p2 = '0' + '{'+(l-1)+'}'; }
+ if(l > 2){ p3 = '0' + '{'+(l-2)+'}'; }
+ }else{
+ p2 = '0?'; p3 = '0{0,2}';
+ }
+ switch(c){
+ case 'y':
+ s = '\\d{2,4}';
+ break;
+ case 'M':
+ s = (l>2) ? '\\S+?' : '1[0-2]|'+p2+'[1-9]';
+ break;
+ case 'D':
+ s = '[12][0-9][0-9]|3[0-5][0-9]|36[0-6]|'+p2+'[1-9][0-9]|'+p3+'[1-9]';
+ break;
+ case 'd':
+ s = '3[01]|[12]\\d|'+p2+'[1-9]';
+ break;
+ case 'w':
+ s = '[1-4][0-9]|5[0-3]|'+p2+'[1-9]';
+ break;
+ case 'E':
+ s = '\\S+';
+ break;
+ case 'h': //hour (1-12)
+ s = '1[0-2]|'+p2+'[1-9]';
+ break;
+ case 'k': //hour (0-11)
+ s = '1[01]|'+p2+'\\d';
+ break;
+ case 'H': //hour (0-23)
+ s = '1\\d|2[0-3]|'+p2+'\\d';
+ break;
+ case 'K': //hour (1-24)
+ s = '1\\d|2[0-4]|'+p2+'[1-9]';
+ break;
+ case 'm':
+ case 's':
+ s = '[0-5]\\d';
+ break;
+ case 'S':
+ s = '\\d{'+l+'}';
+ break;
+ case 'a':
+ var am = options.am || bundle['dayPeriods-format-wide-am'],
+ pm = options.pm || bundle['dayPeriods-format-wide-pm'];
+ s = am + '|' + pm;
+ if(!options.strict){
+ if(am != am.toLowerCase()){ s += '|' + am.toLowerCase(); }
+ if(pm != pm.toLowerCase()){ s += '|' + pm.toLowerCase(); }
+ if(s.indexOf('.') != -1){ s += '|' + s.replace(/\./g, ""); }
+ }
+ s = s.replace(/\./g, "\\.");
+ break;
+ default:
+ // case 'v':
+ // case 'z':
+ // case 'Z':
+ s = ".*";
+// console.log("parse of date format, pattern=" + pattern);
+ }
+
+ if(tokens){ tokens.push(match); }
+
+ return "(" + s + ")"; // add capture
+ }).replace(/[\xa0 ]/g, "[\\s\\xa0]"); // normalize whitespace. Need explicit handling of \xa0 for IE.
+}
+
+var _customFormats = [];
+dojo.date.locale.addCustomFormats = function(/*String*/packageName, /*String*/bundleName){
+ // summary:
+ // Add a reference to a bundle containing localized custom formats to be
+ // used by date/time formatting and parsing routines.
+ //
+ // description:
+ // The user may add custom localized formats where the bundle has properties following the
+ // same naming convention used by dojo.cldr: `dateFormat-xxxx` / `timeFormat-xxxx`
+ // The pattern string should match the format used by the CLDR.
+ // See dojo.date.locale.format() for details.
+ // The resources must be loaded by dojo.requireLocalization() prior to use
+
+ _customFormats.push({pkg:packageName,name:bundleName});
+};
+
+dojo.date.locale._getGregorianBundle = function(/*String*/locale){
+ var gregorian = {};
+ dojo.forEach(_customFormats, function(desc){
+ var bundle = dojo.i18n.getLocalization(desc.pkg, desc.name, locale);
+ gregorian = lang.mixin(gregorian, bundle);
+ }, this);
+ return gregorian; /*Object*/
+};
+
+dojo.date.locale.addCustomFormats("dojo.cldr","gregorian");
+
+dojo.date.locale.getNames = function(/*String*/item, /*String*/type, /*String?*/context, /*String?*/locale){
+ // summary:
+ // Used to get localized strings from dojo.cldr for day or month names.
+ //
+ // item:
+ // 'months' || 'days'
+ // type:
+ // 'wide' || 'abbr' || 'narrow' (e.g. "Monday", "Mon", or "M" respectively, in English)
+ // context:
+ // 'standAlone' || 'format' (default)
+ // locale:
+ // override locale used to find the names
+
+ var label,
+ lookup = dojo.date.locale._getGregorianBundle(locale),
+ props = [item, context, type];
+ if(context == 'standAlone'){
+ var key = props.join('-');
+ label = lookup[key];
+ // Fall back to 'format' flavor of name
+ if(label[0] == 1){ label = undefined; } // kludge, in the absence of real aliasing support in dojo.cldr
+ }
+ props[1] = 'format';
+
+ // return by copy so changes won't be made accidentally to the in-memory model
+ return (label || lookup[props.join('-')]).concat(); /*Array*/
+};
+
+dojo.date.locale.isWeekend = function(/*Date?*/dateObject, /*String?*/locale){
+ // summary:
+ // Determines if the date falls on a weekend, according to local custom.
+
+ var weekend = cldr.getWeekend(locale),
+ day = (dateObject || new Date()).getDay();
+ if(weekend.end < weekend.start){
+ weekend.end += 7;
+ if(day < weekend.start){ day += 7; }
+ }
+ return day >= weekend.start && day <= weekend.end; // Boolean
+};
+
+// These are used only by format and strftime. Do they need to be public? Which module should they go in?
+
+dojo.date.locale._getDayOfYear = function(/*Date*/dateObject){
+ // summary: gets the day of the year as represented by dateObject
+ return date.difference(new Date(dateObject.getFullYear(), 0, 1, dateObject.getHours()), dateObject) + 1; // Number
+};
+
+dojo.date.locale._getWeekOfYear = function(/*Date*/dateObject, /*Number*/firstDayOfWeek){
+ if(arguments.length == 1){ firstDayOfWeek = 0; } // Sunday
+
+ var firstDayOfYear = new Date(dateObject.getFullYear(), 0, 1).getDay(),
+ adj = (firstDayOfYear - firstDayOfWeek + 7) % 7,
+ week = Math.floor((dojo.date.locale._getDayOfYear(dateObject) + adj - 1) / 7);
+
+ // if year starts on the specified day, start counting weeks at 1
+ if(firstDayOfYear == firstDayOfWeek){ week++; }
+
+ return week; // Number
+};
+
+return dojo.date.locale;
+});
diff --git a/lib/dojo/date/stamp.js b/lib/dojo/date/stamp.js
index 04b68a06a..029a0130b 100644
--- a/lib/dojo/date/stamp.js
+++ b/lib/dojo/date/stamp.js
@@ -4,147 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.date.stamp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.date.stamp"] = true;
-dojo.provide("dojo.date.stamp");
-
-dojo.getObject("date.stamp", true, dojo);
-
-// Methods to convert dates to or from a wire (string) format using well-known conventions
-
-dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/defaultTime){
- // summary:
- // Returns a Date object given a string formatted according to a subset of the ISO-8601 standard.
- //
- // description:
- // Accepts a string formatted according to a profile of ISO8601 as defined by
- // [RFC3339](http://www.ietf.org/rfc/rfc3339.txt), except that partial input is allowed.
- // Can also process dates as specified [by the W3C](http://www.w3.org/TR/NOTE-datetime)
- // The following combinations are valid:
- //
- // * dates only
- // | * yyyy
- // | * yyyy-MM
- // | * yyyy-MM-dd
- // * times only, with an optional time zone appended
- // | * THH:mm
- // | * THH:mm:ss
- // | * THH:mm:ss.SSS
- // * and "datetimes" which could be any combination of the above
- //
- // timezones may be specified as Z (for UTC) or +/- followed by a time expression HH:mm
- // Assumes the local time zone if not specified. Does not validate. Improperly formatted
- // input may return null. Arguments which are out of bounds will be handled
- // by the Date constructor (e.g. January 32nd typically gets resolved to February 1st)
- // Only years between 100 and 9999 are supported.
- //
- // formattedString:
- // A string such as 2005-06-30T08:05:00-07:00 or 2005-06-30 or T08:05:00
- //
- // defaultTime:
- // Used for defaults for fields omitted in the formattedString.
- // Uses 1970-01-01T00:00:00.0Z by default.
-
- if(!dojo.date.stamp._isoRegExp){
- dojo.date.stamp._isoRegExp =
-//TODO: could be more restrictive and check for 00-59, etc.
- /^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;
- }
-
- var match = dojo.date.stamp._isoRegExp.exec(formattedString),
- result = null;
-
- if(match){
- match.shift();
- if(match[1]){match[1]--;} // Javascript Date months are 0-based
- if(match[6]){match[6] *= 1000;} // Javascript Date expects fractional seconds as milliseconds
-
- if(defaultTime){
- // mix in defaultTime. Relatively expensive, so use || operators for the fast path of defaultTime === 0
- defaultTime = new Date(defaultTime);
- dojo.forEach(dojo.map(["FullYear", "Month", "Date", "Hours", "Minutes", "Seconds", "Milliseconds"], function(prop){
- return defaultTime["get" + prop]();
- }), function(value, index){
- match[index] = match[index] || value;
- });
- }
- result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0); //TODO: UTC defaults
- if(match[0] < 100){
- result.setFullYear(match[0] || 1970);
- }
-
- var offset = 0,
- zoneSign = match[7] && match[7].charAt(0);
- if(zoneSign != 'Z'){
- offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0);
- if(zoneSign != '-'){ offset *= -1; }
- }
- if(zoneSign){
- offset -= result.getTimezoneOffset();
- }
- if(offset){
- result.setTime(result.getTime() + offset * 60000);
- }
- }
-
- return result; // Date or null
-};
-
-/*=====
- dojo.date.stamp.__Options = function(){
- // selector: String
- // "date" or "time" for partial formatting of the Date object.
- // Both date and time will be formatted by default.
- // zulu: Boolean
- // if true, UTC/GMT is used for a timezone
- // milliseconds: Boolean
- // if true, output milliseconds
- this.selector = selector;
- this.zulu = zulu;
- this.milliseconds = milliseconds;
- }
-=====*/
-
-dojo.date.stamp.toISOString = function(/*Date*/dateObject, /*dojo.date.stamp.__Options?*/options){
- // summary:
- // Format a Date object as a string according a subset of the ISO-8601 standard
- //
- // description:
- // When options.selector is omitted, output follows [RFC3339](http://www.ietf.org/rfc/rfc3339.txt)
- // The local time zone is included as an offset from GMT, except when selector=='time' (time without a date)
- // Does not check bounds. Only years between 100 and 9999 are supported.
- //
- // dateObject:
- // A Date object
-
- var _ = function(n){ return (n < 10) ? "0" + n : n; };
- options = options || {};
- var formattedDate = [],
- getter = options.zulu ? "getUTC" : "get",
- date = "";
- if(options.selector != "time"){
- var year = dateObject[getter+"FullYear"]();
- date = ["0000".substr((year+"").length)+year, _(dateObject[getter+"Month"]()+1), _(dateObject[getter+"Date"]())].join('-');
- }
- formattedDate.push(date);
- if(options.selector != "date"){
- var time = [_(dateObject[getter+"Hours"]()), _(dateObject[getter+"Minutes"]()), _(dateObject[getter+"Seconds"]())].join(':');
- var millis = dateObject[getter+"Milliseconds"]();
- if(options.milliseconds){
- time += "."+ (millis < 100 ? "0" : "") + _(millis);
- }
- if(options.zulu){
- time += "Z";
- }else if(options.selector != "time"){
- var timezoneOffset = dateObject.getTimezoneOffset();
- var absOffset = Math.abs(timezoneOffset);
- time += (timezoneOffset > 0 ? "-" : "+") +
- _(Math.floor(absOffset/60)) + ":" + _(absOffset%60);
- }
- formattedDate.push(time);
- }
- return formattedDate.join('T'); // String
-};
-
-}
+//>>built
+define("dojo/date/stamp",["../_base/kernel","../_base/lang","../_base/array"],function(_1,_2,_3){_2.getObject("date.stamp",true,_1);_1.date.stamp.fromISOString=function(_4,_5){if(!_1.date.stamp._isoRegExp){_1.date.stamp._isoRegExp=/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;}var _6=_1.date.stamp._isoRegExp.exec(_4),_7=null;if(_6){_6.shift();if(_6[1]){_6[1]--;}if(_6[6]){_6[6]*=1000;}if(_5){_5=new Date(_5);_3.forEach(_3.map(["FullYear","Month","Date","Hours","Minutes","Seconds","Milliseconds"],function(_8){return _5["get"+_8]();}),function(_9,_a){_6[_a]=_6[_a]||_9;});}_7=new Date(_6[0]||1970,_6[1]||0,_6[2]||1,_6[3]||0,_6[4]||0,_6[5]||0,_6[6]||0);if(_6[0]<100){_7.setFullYear(_6[0]||1970);}var _b=0,_c=_6[7]&&_6[7].charAt(0);if(_c!="Z"){_b=((_6[8]||0)*60)+(Number(_6[9])||0);if(_c!="-"){_b*=-1;}}if(_c){_b-=_7.getTimezoneOffset();}if(_b){_7.setTime(_7.getTime()+_b*60000);}}return _7;};_1.date.stamp.toISOString=function(_d,_e){var _f=function(n){return (n<10)?"0"+n:n;};_e=_e||{};var _10=[],_11=_e.zulu?"getUTC":"get",_12="";if(_e.selector!="time"){var _13=_d[_11+"FullYear"]();_12=["0000".substr((_13+"").length)+_13,_f(_d[_11+"Month"]()+1),_f(_d[_11+"Date"]())].join("-");}_10.push(_12);if(_e.selector!="date"){var _14=[_f(_d[_11+"Hours"]()),_f(_d[_11+"Minutes"]()),_f(_d[_11+"Seconds"]())].join(":");var _15=_d[_11+"Milliseconds"]();if(_e.milliseconds){_14+="."+(_15<100?"0":"")+_f(_15);}if(_e.zulu){_14+="Z";}else{if(_e.selector!="time"){var _16=_d.getTimezoneOffset();var _17=Math.abs(_16);_14+=(_16>0?"-":"+")+_f(Math.floor(_17/60))+":"+_f(_17%60);}}_10.push(_14);}return _10.join("T");};return _1.date.stamp;}); \ No newline at end of file
diff --git a/lib/dojo/date/stamp.js.uncompressed.js b/lib/dojo/date/stamp.js.uncompressed.js
new file mode 100644
index 000000000..44b0ab787
--- /dev/null
+++ b/lib/dojo/date/stamp.js.uncompressed.js
@@ -0,0 +1,146 @@
+define("dojo/date/stamp", ["../_base/kernel", "../_base/lang", "../_base/array"], function(dojo, lang, array) {
+ // module:
+ // dojo/date/stamp
+ // summary:
+ // TODOC
+
+lang.getObject("date.stamp", true, dojo);
+
+// Methods to convert dates to or from a wire (string) format using well-known conventions
+
+dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/defaultTime){
+ // summary:
+ // Returns a Date object given a string formatted according to a subset of the ISO-8601 standard.
+ //
+ // description:
+ // Accepts a string formatted according to a profile of ISO8601 as defined by
+ // [RFC3339](http://www.ietf.org/rfc/rfc3339.txt), except that partial input is allowed.
+ // Can also process dates as specified [by the W3C](http://www.w3.org/TR/NOTE-datetime)
+ // The following combinations are valid:
+ //
+ // * dates only
+ // | * yyyy
+ // | * yyyy-MM
+ // | * yyyy-MM-dd
+ // * times only, with an optional time zone appended
+ // | * THH:mm
+ // | * THH:mm:ss
+ // | * THH:mm:ss.SSS
+ // * and "datetimes" which could be any combination of the above
+ //
+ // timezones may be specified as Z (for UTC) or +/- followed by a time expression HH:mm
+ // Assumes the local time zone if not specified. Does not validate. Improperly formatted
+ // input may return null. Arguments which are out of bounds will be handled
+ // by the Date constructor (e.g. January 32nd typically gets resolved to February 1st)
+ // Only years between 100 and 9999 are supported.
+ //
+ // formattedString:
+ // A string such as 2005-06-30T08:05:00-07:00 or 2005-06-30 or T08:05:00
+ //
+ // defaultTime:
+ // Used for defaults for fields omitted in the formattedString.
+ // Uses 1970-01-01T00:00:00.0Z by default.
+
+ if(!dojo.date.stamp._isoRegExp){
+ dojo.date.stamp._isoRegExp =
+//TODO: could be more restrictive and check for 00-59, etc.
+ /^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;
+ }
+
+ var match = dojo.date.stamp._isoRegExp.exec(formattedString),
+ result = null;
+
+ if(match){
+ match.shift();
+ if(match[1]){match[1]--;} // Javascript Date months are 0-based
+ if(match[6]){match[6] *= 1000;} // Javascript Date expects fractional seconds as milliseconds
+
+ if(defaultTime){
+ // mix in defaultTime. Relatively expensive, so use || operators for the fast path of defaultTime === 0
+ defaultTime = new Date(defaultTime);
+ array.forEach(array.map(["FullYear", "Month", "Date", "Hours", "Minutes", "Seconds", "Milliseconds"], function(prop){
+ return defaultTime["get" + prop]();
+ }), function(value, index){
+ match[index] = match[index] || value;
+ });
+ }
+ result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0); //TODO: UTC defaults
+ if(match[0] < 100){
+ result.setFullYear(match[0] || 1970);
+ }
+
+ var offset = 0,
+ zoneSign = match[7] && match[7].charAt(0);
+ if(zoneSign != 'Z'){
+ offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0);
+ if(zoneSign != '-'){ offset *= -1; }
+ }
+ if(zoneSign){
+ offset -= result.getTimezoneOffset();
+ }
+ if(offset){
+ result.setTime(result.getTime() + offset * 60000);
+ }
+ }
+
+ return result; // Date or null
+};
+
+/*=====
+ dojo.date.stamp.__Options = function(){
+ // selector: String
+ // "date" or "time" for partial formatting of the Date object.
+ // Both date and time will be formatted by default.
+ // zulu: Boolean
+ // if true, UTC/GMT is used for a timezone
+ // milliseconds: Boolean
+ // if true, output milliseconds
+ this.selector = selector;
+ this.zulu = zulu;
+ this.milliseconds = milliseconds;
+ }
+=====*/
+
+dojo.date.stamp.toISOString = function(/*Date*/dateObject, /*dojo.date.stamp.__Options?*/options){
+ // summary:
+ // Format a Date object as a string according a subset of the ISO-8601 standard
+ //
+ // description:
+ // When options.selector is omitted, output follows [RFC3339](http://www.ietf.org/rfc/rfc3339.txt)
+ // The local time zone is included as an offset from GMT, except when selector=='time' (time without a date)
+ // Does not check bounds. Only years between 100 and 9999 are supported.
+ //
+ // dateObject:
+ // A Date object
+
+ var _ = function(n){ return (n < 10) ? "0" + n : n; };
+ options = options || {};
+ var formattedDate = [],
+ getter = options.zulu ? "getUTC" : "get",
+ date = "";
+ if(options.selector != "time"){
+ var year = dateObject[getter+"FullYear"]();
+ date = ["0000".substr((year+"").length)+year, _(dateObject[getter+"Month"]()+1), _(dateObject[getter+"Date"]())].join('-');
+ }
+ formattedDate.push(date);
+ if(options.selector != "date"){
+ var time = [_(dateObject[getter+"Hours"]()), _(dateObject[getter+"Minutes"]()), _(dateObject[getter+"Seconds"]())].join(':');
+ var millis = dateObject[getter+"Milliseconds"]();
+ if(options.milliseconds){
+ time += "."+ (millis < 100 ? "0" : "") + _(millis);
+ }
+ if(options.zulu){
+ time += "Z";
+ }else if(options.selector != "time"){
+ var timezoneOffset = dateObject.getTimezoneOffset();
+ var absOffset = Math.abs(timezoneOffset);
+ time += (timezoneOffset > 0 ? "-" : "+") +
+ _(Math.floor(absOffset/60)) + ":" + _(absOffset%60);
+ }
+ formattedDate.push(time);
+ }
+ return formattedDate.join('T'); // String
+};
+
+return dojo.date.stamp;
+});
diff --git a/lib/dojo/dnd/AutoSource.js b/lib/dojo/dnd/AutoSource.js
new file mode 100644
index 000000000..7e1a53f48
--- /dev/null
+++ b/lib/dojo/dnd/AutoSource.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/dnd/AutoSource",["./Source"],function(_1){return dojo.declare("dojo.dnd.AutoSource",_1,{constructor:function(_2,_3){this.autoSync=true;}});}); \ No newline at end of file
diff --git a/lib/dojo/dnd/AutoSource.js.uncompressed.js b/lib/dojo/dnd/AutoSource.js.uncompressed.js
new file mode 100644
index 000000000..e37fa2e3a
--- /dev/null
+++ b/lib/dojo/dnd/AutoSource.js.uncompressed.js
@@ -0,0 +1,13 @@
+define("dojo/dnd/AutoSource", [ "./Source" ], function(Source){
+ /*===== Source = dojo.dnd.Source =====*/
+ return dojo.declare("dojo.dnd.AutoSource", Source, {
+ // summary:
+ // a source that syncs its DnD nodes by default
+
+ constructor: function(node, params){
+ // summary:
+ // constructor of the AutoSource --- see the Source constructor for details
+ this.autoSync = true;
+ }
+ });
+});
diff --git a/lib/dojo/dnd/Avatar.js b/lib/dojo/dnd/Avatar.js
index 8f43801b3..51003b9eb 100644
--- a/lib/dojo/dnd/Avatar.js
+++ b/lib/dojo/dnd/Avatar.js
@@ -4,113 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.dnd.Avatar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Avatar"] = true;
-dojo.provide("dojo.dnd.Avatar");
-dojo.require("dojo.dnd.common");
-
-
-dojo.declare("dojo.dnd.Avatar", null, {
- // summary:
- // Object that represents transferred DnD items visually
- // manager: Object
- // a DnD manager object
-
- constructor: function(manager){
- this.manager = manager;
- this.construct();
- },
-
- // methods
- construct: function(){
- // summary:
- // constructor function;
- // it is separate so it can be (dynamically) overwritten in case of need
- this.isA11y = dojo.hasClass(dojo.body(),"dijit_a11y");
- var a = dojo.create("table", {
- "class": "dojoDndAvatar",
- style: {
- position: "absolute",
- zIndex: "1999",
- margin: "0px"
- }
- }),
- source = this.manager.source, node,
- b = dojo.create("tbody", null, a),
- tr = dojo.create("tr", null, b),
- td = dojo.create("td", null, tr),
- icon = this.isA11y ? dojo.create("span", {
- id : "a11yIcon",
- innerHTML : this.manager.copy ? '+' : "<"
- }, td) : null,
- span = dojo.create("span", {
- innerHTML: source.generateText ? this._generateText() : ""
- }, td),
- k = Math.min(5, this.manager.nodes.length), i = 0;
- // we have to set the opacity on IE only after the node is live
- dojo.attr(tr, {
- "class": "dojoDndAvatarHeader",
- style: {opacity: 0.9}
- });
- for(; i < k; ++i){
- if(source.creator){
- // create an avatar representation of the node
- node = source._normalizedCreator(source.getItem(this.manager.nodes[i].id).data, "avatar").node;
- }else{
- // or just clone the node and hope it works
- node = this.manager.nodes[i].cloneNode(true);
- if(node.tagName.toLowerCase() == "tr"){
- // insert extra table nodes
- var table = dojo.create("table"),
- tbody = dojo.create("tbody", null, table);
- tbody.appendChild(node);
- node = table;
- }
- }
- node.id = "";
- tr = dojo.create("tr", null, b);
- td = dojo.create("td", null, tr);
- td.appendChild(node);
- dojo.attr(tr, {
- "class": "dojoDndAvatarItem",
- style: {opacity: (9 - i) / 10}
- });
- }
- this.node = a;
- },
- destroy: function(){
- // summary:
- // destructor for the avatar; called to remove all references so it can be garbage-collected
- dojo.destroy(this.node);
- this.node = false;
- },
- update: function(){
- // summary:
- // updates the avatar to reflect the current DnD state
- dojo[(this.manager.canDropFlag ? "add" : "remove") + "Class"](this.node, "dojoDndAvatarCanDrop");
- if (this.isA11y){
- var icon = dojo.byId("a11yIcon");
- var text = '+'; // assume canDrop && copy
- if (this.manager.canDropFlag && !this.manager.copy) {
- text = '< '; // canDrop && move
- }else if (!this.manager.canDropFlag && !this.manager.copy) {
- text = "o"; //!canDrop && move
- }else if(!this.manager.canDropFlag){
- text = 'x'; // !canDrop && copy
- }
- icon.innerHTML=text;
- }
- // replace text
- dojo.query(("tr.dojoDndAvatarHeader td span" +(this.isA11y ? " span" : "")), this.node).forEach(
- function(node){
- node.innerHTML = this._generateText();
- }, this);
- },
- _generateText: function(){
- // summary: generates a proper text to reflect copying or moving of items
- return this.manager.nodes.length.toString();
- }
-});
-
-}
+//>>built
+define("dojo/dnd/Avatar",["../main","./common"],function(_1){_1.declare("dojo.dnd.Avatar",null,{constructor:function(_2){this.manager=_2;this.construct();},construct:function(){this.isA11y=_1.hasClass(_1.body(),"dijit_a11y");var a=_1.create("table",{"class":"dojoDndAvatar",style:{position:"absolute",zIndex:"1999",margin:"0px"}}),_3=this.manager.source,_4,b=_1.create("tbody",null,a),tr=_1.create("tr",null,b),td=_1.create("td",null,tr),_5=this.isA11y?_1.create("span",{id:"a11yIcon",innerHTML:this.manager.copy?"+":"<"},td):null,_6=_1.create("span",{innerHTML:_3.generateText?this._generateText():""},td),k=Math.min(5,this.manager.nodes.length),i=0;_1.attr(tr,{"class":"dojoDndAvatarHeader",style:{opacity:0.9}});for(;i<k;++i){if(_3.creator){_4=_3._normalizedCreator(_3.getItem(this.manager.nodes[i].id).data,"avatar").node;}else{_4=this.manager.nodes[i].cloneNode(true);if(_4.tagName.toLowerCase()=="tr"){var _7=_1.create("table"),_8=_1.create("tbody",null,_7);_8.appendChild(_4);_4=_7;}}_4.id="";tr=_1.create("tr",null,b);td=_1.create("td",null,tr);td.appendChild(_4);_1.attr(tr,{"class":"dojoDndAvatarItem",style:{opacity:(9-i)/10}});}this.node=a;},destroy:function(){_1.destroy(this.node);this.node=false;},update:function(){_1[(this.manager.canDropFlag?"add":"remove")+"Class"](this.node,"dojoDndAvatarCanDrop");if(this.isA11y){var _9=_1.byId("a11yIcon");var _a="+";if(this.manager.canDropFlag&&!this.manager.copy){_a="< ";}else{if(!this.manager.canDropFlag&&!this.manager.copy){_a="o";}else{if(!this.manager.canDropFlag){_a="x";}}}_9.innerHTML=_a;}_1.query(("tr.dojoDndAvatarHeader td span"+(this.isA11y?" span":"")),this.node).forEach(function(_b){_b.innerHTML=this._generateText();},this);},_generateText:function(){return this.manager.nodes.length.toString();}});return _1.dnd.Avatar;}); \ No newline at end of file
diff --git a/lib/dojo/dnd/Avatar.js.uncompressed.js b/lib/dojo/dnd/Avatar.js.uncompressed.js
new file mode 100644
index 000000000..0cd1922c9
--- /dev/null
+++ b/lib/dojo/dnd/Avatar.js.uncompressed.js
@@ -0,0 +1,111 @@
+define("dojo/dnd/Avatar", ["../main", "./common"], function(dojo) {
+ // module:
+ // dojo/dnd/Avatar
+ // summary:
+ // TODOC
+
+
+dojo.declare("dojo.dnd.Avatar", null, {
+ // summary:
+ // Object that represents transferred DnD items visually
+ // manager: Object
+ // a DnD manager object
+
+ constructor: function(manager){
+ this.manager = manager;
+ this.construct();
+ },
+
+ // methods
+ construct: function(){
+ // summary:
+ // constructor function;
+ // it is separate so it can be (dynamically) overwritten in case of need
+ this.isA11y = dojo.hasClass(dojo.body(),"dijit_a11y");
+ var a = dojo.create("table", {
+ "class": "dojoDndAvatar",
+ style: {
+ position: "absolute",
+ zIndex: "1999",
+ margin: "0px"
+ }
+ }),
+ source = this.manager.source, node,
+ b = dojo.create("tbody", null, a),
+ tr = dojo.create("tr", null, b),
+ td = dojo.create("td", null, tr),
+ icon = this.isA11y ? dojo.create("span", {
+ id : "a11yIcon",
+ innerHTML : this.manager.copy ? '+' : "<"
+ }, td) : null,
+ span = dojo.create("span", {
+ innerHTML: source.generateText ? this._generateText() : ""
+ }, td),
+ k = Math.min(5, this.manager.nodes.length), i = 0;
+ // we have to set the opacity on IE only after the node is live
+ dojo.attr(tr, {
+ "class": "dojoDndAvatarHeader",
+ style: {opacity: 0.9}
+ });
+ for(; i < k; ++i){
+ if(source.creator){
+ // create an avatar representation of the node
+ node = source._normalizedCreator(source.getItem(this.manager.nodes[i].id).data, "avatar").node;
+ }else{
+ // or just clone the node and hope it works
+ node = this.manager.nodes[i].cloneNode(true);
+ if(node.tagName.toLowerCase() == "tr"){
+ // insert extra table nodes
+ var table = dojo.create("table"),
+ tbody = dojo.create("tbody", null, table);
+ tbody.appendChild(node);
+ node = table;
+ }
+ }
+ node.id = "";
+ tr = dojo.create("tr", null, b);
+ td = dojo.create("td", null, tr);
+ td.appendChild(node);
+ dojo.attr(tr, {
+ "class": "dojoDndAvatarItem",
+ style: {opacity: (9 - i) / 10}
+ });
+ }
+ this.node = a;
+ },
+ destroy: function(){
+ // summary:
+ // destructor for the avatar; called to remove all references so it can be garbage-collected
+ dojo.destroy(this.node);
+ this.node = false;
+ },
+ update: function(){
+ // summary:
+ // updates the avatar to reflect the current DnD state
+ dojo[(this.manager.canDropFlag ? "add" : "remove") + "Class"](this.node, "dojoDndAvatarCanDrop");
+ if (this.isA11y){
+ var icon = dojo.byId("a11yIcon");
+ var text = '+'; // assume canDrop && copy
+ if (this.manager.canDropFlag && !this.manager.copy) {
+ text = '< '; // canDrop && move
+ }else if (!this.manager.canDropFlag && !this.manager.copy) {
+ text = "o"; //!canDrop && move
+ }else if(!this.manager.canDropFlag){
+ text = 'x'; // !canDrop && copy
+ }
+ icon.innerHTML=text;
+ }
+ // replace text
+ dojo.query(("tr.dojoDndAvatarHeader td span" +(this.isA11y ? " span" : "")), this.node).forEach(
+ function(node){
+ node.innerHTML = this._generateText();
+ }, this);
+ },
+ _generateText: function(){
+ // summary: generates a proper text to reflect copying or moving of items
+ return this.manager.nodes.length.toString();
+ }
+});
+
+return dojo.dnd.Avatar;
+});
diff --git a/lib/dojo/dnd/Container.js b/lib/dojo/dnd/Container.js
index 58f34eb6b..0ab702ede 100644
--- a/lib/dojo/dnd/Container.js
+++ b/lib/dojo/dnd/Container.js
@@ -4,435 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.dnd.Container"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Container"] = true;
-dojo.provide("dojo.dnd.Container");
-dojo.require("dojo.dnd.common");
-dojo.require("dojo.parser");
-
-
-/*
- Container states:
- "" - normal state
- "Over" - mouse over a container
- Container item states:
- "" - normal state
- "Over" - mouse over a container item
-*/
-
-/*=====
-dojo.declare("dojo.dnd.__ContainerArgs", [], {
- creator: function(){
- // summary:
- // a creator function, which takes a data item, and returns an object like that:
- // {node: newNode, data: usedData, type: arrayOfStrings}
- },
-
- // skipForm: Boolean
- // don't start the drag operation, if clicked on form elements
- skipForm: false,
-
- // dropParent: Node||String
- // node or node's id to use as the parent node for dropped items
- // (must be underneath the 'node' parameter in the DOM)
- dropParent: null,
-
- // _skipStartup: Boolean
- // skip startup(), which collects children, for deferred initialization
- // (this is used in the markup mode)
- _skipStartup: false
-});
-
-dojo.dnd.Item = function(){
- // summary:
- // Represents (one of) the source node(s) being dragged.
- // Contains (at least) the "type" and "data" attributes.
- // type: String[]
- // Type(s) of this item, by default this is ["text"]
- // data: Object
- // Logical representation of the object being dragged.
- // If the drag object's type is "text" then data is a String,
- // if it's another type then data could be a different Object,
- // perhaps a name/value hash.
-
- this.type = type;
- this.data = data;
-}
-=====*/
-
-dojo.declare("dojo.dnd.Container", null, {
- // summary:
- // a Container object, which knows when mouse hovers over it,
- // and over which element it hovers
-
- // object attributes (for markup)
- skipForm: false,
-
- /*=====
- // current: DomNode
- // The DOM node the mouse is currently hovered over
- current: null,
-
- // map: Hash<String, dojo.dnd.Item>
- // Map from an item's id (which is also the DOMNode's id) to
- // the dojo.dnd.Item itself.
- map: {},
- =====*/
-
- constructor: function(node, params){
- // summary:
- // a constructor of the Container
- // node: Node
- // node or node's id to build the container on
- // params: dojo.dnd.__ContainerArgs
- // a dictionary of parameters
- this.node = dojo.byId(node);
- if(!params){ params = {}; }
- this.creator = params.creator || null;
- this.skipForm = params.skipForm;
- this.parent = params.dropParent && dojo.byId(params.dropParent);
-
- // class-specific variables
- this.map = {};
- this.current = null;
-
- // states
- this.containerState = "";
- dojo.addClass(this.node, "dojoDndContainer");
-
- // mark up children
- if(!(params && params._skipStartup)){
- this.startup();
- }
-
- // set up events
- this.events = [
- dojo.connect(this.node, "onmouseover", this, "onMouseOver"),
- dojo.connect(this.node, "onmouseout", this, "onMouseOut"),
- // cancel text selection and text dragging
- dojo.connect(this.node, "ondragstart", this, "onSelectStart"),
- dojo.connect(this.node, "onselectstart", this, "onSelectStart")
- ];
- },
-
- // object attributes (for markup)
- creator: function(){
- // summary:
- // creator function, dummy at the moment
- },
-
- // abstract access to the map
- getItem: function(/*String*/ key){
- // summary:
- // returns a data item by its key (id)
- return this.map[key]; // dojo.dnd.Item
- },
- setItem: function(/*String*/ key, /*dojo.dnd.Item*/ data){
- // summary:
- // associates a data item with its key (id)
- this.map[key] = data;
- },
- delItem: function(/*String*/ key){
- // summary:
- // removes a data item from the map by its key (id)
- delete this.map[key];
- },
- forInItems: function(/*Function*/ f, /*Object?*/ o){
- // summary:
- // iterates over a data map skipping members that
- // are present in the empty object (IE and/or 3rd-party libraries).
- o = o || dojo.global;
- var m = this.map, e = dojo.dnd._empty;
- for(var i in m){
- if(i in e){ continue; }
- f.call(o, m[i], i, this);
- }
- return o; // Object
- },
- clearItems: function(){
- // summary:
- // removes all data items from the map
- this.map = {};
- },
-
- // methods
- getAllNodes: function(){
- // summary:
- // returns a list (an array) of all valid child nodes
- return dojo.query("> .dojoDndItem", this.parent); // NodeList
- },
- sync: function(){
- // summary:
- // sync up the node list with the data map
- var map = {};
- this.getAllNodes().forEach(function(node){
- if(node.id){
- var item = this.getItem(node.id);
- if(item){
- map[node.id] = item;
- return;
- }
- }else{
- node.id = dojo.dnd.getUniqueId();
- }
- var type = node.getAttribute("dndType"),
- data = node.getAttribute("dndData");
- map[node.id] = {
- data: data || node.innerHTML,
- type: type ? type.split(/\s*,\s*/) : ["text"]
- };
- }, this);
- this.map = map;
- return this; // self
- },
- insertNodes: function(data, before, anchor){
- // summary:
- // inserts an array of new nodes before/after an anchor node
- // data: Array
- // a list of data items, which should be processed by the creator function
- // before: Boolean
- // insert before the anchor, if true, and after the anchor otherwise
- // anchor: Node
- // the anchor node to be used as a point of insertion
- if(!this.parent.firstChild){
- anchor = null;
- }else if(before){
- if(!anchor){
- anchor = this.parent.firstChild;
- }
- }else{
- if(anchor){
- anchor = anchor.nextSibling;
- }
- }
- if(anchor){
- for(var i = 0; i < data.length; ++i){
- var t = this._normalizedCreator(data[i]);
- this.setItem(t.node.id, {data: t.data, type: t.type});
- this.parent.insertBefore(t.node, anchor);
- }
- }else{
- for(var i = 0; i < data.length; ++i){
- var t = this._normalizedCreator(data[i]);
- this.setItem(t.node.id, {data: t.data, type: t.type});
- this.parent.appendChild(t.node);
- }
- }
- return this; // self
- },
- destroy: function(){
- // summary:
- // prepares this object to be garbage-collected
- dojo.forEach(this.events, dojo.disconnect);
- this.clearItems();
- this.node = this.parent = this.current = null;
- },
-
- // markup methods
- markupFactory: function(params, node){
- params._skipStartup = true;
- return new dojo.dnd.Container(node, params);
- },
- startup: function(){
- // summary:
- // collects valid child items and populate the map
-
- // set up the real parent node
- if(!this.parent){
- // use the standard algorithm, if not assigned
- this.parent = this.node;
- if(this.parent.tagName.toLowerCase() == "table"){
- var c = this.parent.getElementsByTagName("tbody");
- if(c && c.length){ this.parent = c[0]; }
- }
- }
- this.defaultCreator = dojo.dnd._defaultCreator(this.parent);
-
- // process specially marked children
- this.sync();
- },
-
- // mouse events
- onMouseOver: function(e){
- // summary:
- // event processor for onmouseover
- // e: Event
- // mouse event
- var n = e.relatedTarget;
- while(n){
- if(n == this.node){ break; }
- try{
- n = n.parentNode;
- }catch(x){
- n = null;
- }
- }
- if(!n){
- this._changeState("Container", "Over");
- this.onOverEvent();
- }
- n = this._getChildByEvent(e);
- if(this.current == n){ return; }
- if(this.current){ this._removeItemClass(this.current, "Over"); }
- if(n){ this._addItemClass(n, "Over"); }
- this.current = n;
- },
- onMouseOut: function(e){
- // summary:
- // event processor for onmouseout
- // e: Event
- // mouse event
- for(var n = e.relatedTarget; n;){
- if(n == this.node){ return; }
- try{
- n = n.parentNode;
- }catch(x){
- n = null;
- }
- }
- if(this.current){
- this._removeItemClass(this.current, "Over");
- this.current = null;
- }
- this._changeState("Container", "");
- this.onOutEvent();
- },
- onSelectStart: function(e){
- // summary:
- // event processor for onselectevent and ondragevent
- // e: Event
- // mouse event
- if(!this.skipForm || !dojo.dnd.isFormElement(e)){
- dojo.stopEvent(e);
- }
- },
-
- // utilities
- onOverEvent: function(){
- // summary:
- // this function is called once, when mouse is over our container
- },
- onOutEvent: function(){
- // summary:
- // this function is called once, when mouse is out of our container
- },
- _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);
- },
- _getChildByEvent: function(e){
- // summary:
- // gets a child, which is under the mouse at the moment, or null
- // e: Event
- // a mouse event
- var node = e.target;
- if(node){
- for(var parent = node.parentNode; parent; node = parent, parent = node.parentNode){
- if(parent == this.parent && dojo.hasClass(node, "dojoDndItem")){ return node; }
- }
- }
- return null;
- },
- _normalizedCreator: function(/*dojo.dnd.Item*/ item, /*String*/ hint){
- // summary:
- // adds all necessary data to the output of the user-supplied creator function
- var t = (this.creator || this.defaultCreator).call(this, item, hint);
- if(!dojo.isArray(t.type)){ t.type = ["text"]; }
- if(!t.node.id){ t.node.id = dojo.dnd.getUniqueId(); }
- dojo.addClass(t.node, "dojoDndItem");
- return t;
- }
-});
-
-dojo.dnd._createNode = function(tag){
- // summary:
- // returns a function, which creates an element of given tag
- // (SPAN by default) and sets its innerHTML to given text
- // tag: String
- // a tag name or empty for SPAN
- if(!tag){ return dojo.dnd._createSpan; }
- return function(text){ // Function
- return dojo.create(tag, {innerHTML: text}); // Node
- };
-};
-
-dojo.dnd._createTrTd = function(text){
- // summary:
- // creates a TR/TD structure with given text as an innerHTML of TD
- // text: String
- // a text for TD
- var tr = dojo.create("tr");
- dojo.create("td", {innerHTML: text}, tr);
- return tr; // Node
-};
-
-dojo.dnd._createSpan = function(text){
- // summary:
- // creates a SPAN element with given text as its innerHTML
- // text: String
- // a text for SPAN
- return dojo.create("span", {innerHTML: text}); // Node
-};
-
-// dojo.dnd._defaultCreatorNodes: Object
-// a dictionary that maps container tag names to child tag names
-dojo.dnd._defaultCreatorNodes = {ul: "li", ol: "li", div: "div", p: "div"};
-
-dojo.dnd._defaultCreator = function(node){
- // summary:
- // takes a parent node, and returns an appropriate creator function
- // node: Node
- // a container node
- var tag = node.tagName.toLowerCase();
- var c = tag == "tbody" || tag == "thead" ? dojo.dnd._createTrTd :
- dojo.dnd._createNode(dojo.dnd._defaultCreatorNodes[tag]);
- return function(item, hint){ // Function
- var isObj = item && dojo.isObject(item), data, type, n;
- if(isObj && item.tagName && item.nodeType && item.getAttribute){
- // process a DOM node
- data = item.getAttribute("dndData") || item.innerHTML;
- type = item.getAttribute("dndType");
- type = type ? type.split(/\s*,\s*/) : ["text"];
- n = item; // this node is going to be moved rather than copied
- }else{
- // process a DnD item object or a string
- data = (isObj && item.data) ? item.data : item;
- type = (isObj && item.type) ? item.type : ["text"];
- n = (hint == "avatar" ? dojo.dnd._createSpan : c)(String(data));
- }
- if(!n.id){
- n.id = dojo.dnd.getUniqueId();
- }
- return {node: n, data: data, type: type};
- };
-};
-
-}
+//>>built
+define("dojo/dnd/Container",["../main","../Evented","./common","../parser"],function(_1,_2){_1.declare("dojo.dnd.Container",_2,{skipForm:false,constructor:function(_3,_4){this.node=_1.byId(_3);if(!_4){_4={};}this.creator=_4.creator||null;this.skipForm=_4.skipForm;this.parent=_4.dropParent&&_1.byId(_4.dropParent);this.map={};this.current=null;this.containerState="";_1.addClass(this.node,"dojoDndContainer");if(!(_4&&_4._skipStartup)){this.startup();}this.events=[_1.connect(this.node,"onmouseover",this,"onMouseOver"),_1.connect(this.node,"onmouseout",this,"onMouseOut"),_1.connect(this.node,"ondragstart",this,"onSelectStart"),_1.connect(this.node,"onselectstart",this,"onSelectStart")];},creator:function(){},getItem:function(_5){return this.map[_5];},setItem:function(_6,_7){this.map[_6]=_7;},delItem:function(_8){delete this.map[_8];},forInItems:function(f,o){o=o||_1.global;var m=this.map,e=_1.dnd._empty;for(var i in m){if(i in e){continue;}f.call(o,m[i],i,this);}return o;},clearItems:function(){this.map={};},getAllNodes:function(){return _1.query("> .dojoDndItem",this.parent);},sync:function(){var _9={};this.getAllNodes().forEach(function(_a){if(_a.id){var _b=this.getItem(_a.id);if(_b){_9[_a.id]=_b;return;}}else{_a.id=_1.dnd.getUniqueId();}var _c=_a.getAttribute("dndType"),_d=_a.getAttribute("dndData");_9[_a.id]={data:_d||_a.innerHTML,type:_c?_c.split(/\s*,\s*/):["text"]};},this);this.map=_9;return this;},insertNodes:function(_e,_f,_10){if(!this.parent.firstChild){_10=null;}else{if(_f){if(!_10){_10=this.parent.firstChild;}}else{if(_10){_10=_10.nextSibling;}}}if(_10){for(var i=0;i<_e.length;++i){var t=this._normalizedCreator(_e[i]);this.setItem(t.node.id,{data:t.data,type:t.type});this.parent.insertBefore(t.node,_10);}}else{for(var i=0;i<_e.length;++i){var t=this._normalizedCreator(_e[i]);this.setItem(t.node.id,{data:t.data,type:t.type});this.parent.appendChild(t.node);}}return this;},destroy:function(){_1.forEach(this.events,_1.disconnect);this.clearItems();this.node=this.parent=this.current=null;},markupFactory:function(_11,_12,_13){_11._skipStartup=true;return new _13(_12,_11);},startup:function(){if(!this.parent){this.parent=this.node;if(this.parent.tagName.toLowerCase()=="table"){var c=this.parent.getElementsByTagName("tbody");if(c&&c.length){this.parent=c[0];}}}this.defaultCreator=_1.dnd._defaultCreator(this.parent);this.sync();},onMouseOver:function(e){var n=e.relatedTarget;while(n){if(n==this.node){break;}try{n=n.parentNode;}catch(x){n=null;}}if(!n){this._changeState("Container","Over");this.onOverEvent();}n=this._getChildByEvent(e);if(this.current==n){return;}if(this.current){this._removeItemClass(this.current,"Over");}if(n){this._addItemClass(n,"Over");}this.current=n;},onMouseOut:function(e){for(var n=e.relatedTarget;n;){if(n==this.node){return;}try{n=n.parentNode;}catch(x){n=null;}}if(this.current){this._removeItemClass(this.current,"Over");this.current=null;}this._changeState("Container","");this.onOutEvent();},onSelectStart:function(e){if(!this.skipForm||!_1.dnd.isFormElement(e)){_1.stopEvent(e);}},onOverEvent:function(){},onOutEvent:function(){},_changeState:function(_14,_15){var _16="dojoDnd"+_14;var _17=_14.toLowerCase()+"State";_1.replaceClass(this.node,_16+_15,_16+this[_17]);this[_17]=_15;},_addItemClass:function(_18,_19){_1.addClass(_18,"dojoDndItem"+_19);},_removeItemClass:function(_1a,_1b){_1.removeClass(_1a,"dojoDndItem"+_1b);},_getChildByEvent:function(e){var _1c=e.target;if(_1c){for(var _1d=_1c.parentNode;_1d;_1c=_1d,_1d=_1c.parentNode){if(_1d==this.parent&&_1.hasClass(_1c,"dojoDndItem")){return _1c;}}}return null;},_normalizedCreator:function(_1e,_1f){var t=(this.creator||this.defaultCreator).call(this,_1e,_1f);if(!_1.isArray(t.type)){t.type=["text"];}if(!t.node.id){t.node.id=_1.dnd.getUniqueId();}_1.addClass(t.node,"dojoDndItem");return t;}});_1.dnd._createNode=function(tag){if(!tag){return _1.dnd._createSpan;}return function(_20){return _1.create(tag,{innerHTML:_20});};};_1.dnd._createTrTd=function(_21){var tr=_1.create("tr");_1.create("td",{innerHTML:_21},tr);return tr;};_1.dnd._createSpan=function(_22){return _1.create("span",{innerHTML:_22});};_1.dnd._defaultCreatorNodes={ul:"li",ol:"li",div:"div",p:"div"};_1.dnd._defaultCreator=function(_23){var tag=_23.tagName.toLowerCase();var c=tag=="tbody"||tag=="thead"?_1.dnd._createTrTd:_1.dnd._createNode(_1.dnd._defaultCreatorNodes[tag]);return function(_24,_25){var _26=_24&&_1.isObject(_24),_27,_28,n;if(_26&&_24.tagName&&_24.nodeType&&_24.getAttribute){_27=_24.getAttribute("dndData")||_24.innerHTML;_28=_24.getAttribute("dndType");_28=_28?_28.split(/\s*,\s*/):["text"];n=_24;}else{_27=(_26&&_24.data)?_24.data:_24;_28=(_26&&_24.type)?_24.type:["text"];n=(_25=="avatar"?_1.dnd._createSpan:c)(String(_27));}if(!n.id){n.id=_1.dnd.getUniqueId();}return {node:n,data:_27,type:_28};};};return _1.dnd.Container;}); \ No newline at end of file
diff --git a/lib/dojo/dnd/Container.js.uncompressed.js b/lib/dojo/dnd/Container.js.uncompressed.js
new file mode 100644
index 000000000..c8c4181c1
--- /dev/null
+++ b/lib/dojo/dnd/Container.js.uncompressed.js
@@ -0,0 +1,432 @@
+define("dojo/dnd/Container", ["../main", "../Evented", "./common", "../parser"], function(dojo, Evented) {
+ // module:
+ // dojo/dnd/Container
+ // summary:
+ // TODOC
+
+
+/*
+ Container states:
+ "" - normal state
+ "Over" - mouse over a container
+ Container item states:
+ "" - normal state
+ "Over" - mouse over a container item
+*/
+
+/*=====
+dojo.declare("dojo.dnd.__ContainerArgs", [], {
+ creator: function(){
+ // summary:
+ // a creator function, which takes a data item, and returns an object like that:
+ // {node: newNode, data: usedData, type: arrayOfStrings}
+ },
+
+ // skipForm: Boolean
+ // don't start the drag operation, if clicked on form elements
+ skipForm: false,
+
+ // dropParent: Node||String
+ // node or node's id to use as the parent node for dropped items
+ // (must be underneath the 'node' parameter in the DOM)
+ dropParent: null,
+
+ // _skipStartup: Boolean
+ // skip startup(), which collects children, for deferred initialization
+ // (this is used in the markup mode)
+ _skipStartup: false
+});
+
+dojo.dnd.Item = function(){
+ // summary:
+ // Represents (one of) the source node(s) being dragged.
+ // Contains (at least) the "type" and "data" attributes.
+ // type: String[]
+ // Type(s) of this item, by default this is ["text"]
+ // data: Object
+ // Logical representation of the object being dragged.
+ // If the drag object's type is "text" then data is a String,
+ // if it's another type then data could be a different Object,
+ // perhaps a name/value hash.
+
+ this.type = type;
+ this.data = data;
+}
+=====*/
+
+dojo.declare("dojo.dnd.Container", Evented, {
+ // summary:
+ // a Container object, which knows when mouse hovers over it,
+ // and over which element it hovers
+
+ // object attributes (for markup)
+ skipForm: false,
+
+ /*=====
+ // current: DomNode
+ // The DOM node the mouse is currently hovered over
+ current: null,
+
+ // map: Hash<String, dojo.dnd.Item>
+ // Map from an item's id (which is also the DOMNode's id) to
+ // the dojo.dnd.Item itself.
+ map: {},
+ =====*/
+
+ constructor: function(node, params){
+ // summary:
+ // a constructor of the Container
+ // node: Node
+ // node or node's id to build the container on
+ // params: dojo.dnd.__ContainerArgs
+ // a dictionary of parameters
+ this.node = dojo.byId(node);
+ if(!params){ params = {}; }
+ this.creator = params.creator || null;
+ this.skipForm = params.skipForm;
+ this.parent = params.dropParent && dojo.byId(params.dropParent);
+
+ // class-specific variables
+ this.map = {};
+ this.current = null;
+
+ // states
+ this.containerState = "";
+ dojo.addClass(this.node, "dojoDndContainer");
+
+ // mark up children
+ if(!(params && params._skipStartup)){
+ this.startup();
+ }
+
+ // set up events
+ this.events = [
+ dojo.connect(this.node, "onmouseover", this, "onMouseOver"),
+ dojo.connect(this.node, "onmouseout", this, "onMouseOut"),
+ // cancel text selection and text dragging
+ dojo.connect(this.node, "ondragstart", this, "onSelectStart"),
+ dojo.connect(this.node, "onselectstart", this, "onSelectStart")
+ ];
+ },
+
+ // object attributes (for markup)
+ creator: function(){
+ // summary:
+ // creator function, dummy at the moment
+ },
+
+ // abstract access to the map
+ getItem: function(/*String*/ key){
+ // summary:
+ // returns a data item by its key (id)
+ return this.map[key]; // dojo.dnd.Item
+ },
+ setItem: function(/*String*/ key, /*dojo.dnd.Item*/ data){
+ // summary:
+ // associates a data item with its key (id)
+ this.map[key] = data;
+ },
+ delItem: function(/*String*/ key){
+ // summary:
+ // removes a data item from the map by its key (id)
+ delete this.map[key];
+ },
+ forInItems: function(/*Function*/ f, /*Object?*/ o){
+ // summary:
+ // iterates over a data map skipping members that
+ // are present in the empty object (IE and/or 3rd-party libraries).
+ o = o || dojo.global;
+ var m = this.map, e = dojo.dnd._empty;
+ for(var i in m){
+ if(i in e){ continue; }
+ f.call(o, m[i], i, this);
+ }
+ return o; // Object
+ },
+ clearItems: function(){
+ // summary:
+ // removes all data items from the map
+ this.map = {};
+ },
+
+ // methods
+ getAllNodes: function(){
+ // summary:
+ // returns a list (an array) of all valid child nodes
+ return dojo.query("> .dojoDndItem", this.parent); // NodeList
+ },
+ sync: function(){
+ // summary:
+ // sync up the node list with the data map
+ var map = {};
+ this.getAllNodes().forEach(function(node){
+ if(node.id){
+ var item = this.getItem(node.id);
+ if(item){
+ map[node.id] = item;
+ return;
+ }
+ }else{
+ node.id = dojo.dnd.getUniqueId();
+ }
+ var type = node.getAttribute("dndType"),
+ data = node.getAttribute("dndData");
+ map[node.id] = {
+ data: data || node.innerHTML,
+ type: type ? type.split(/\s*,\s*/) : ["text"]
+ };
+ }, this);
+ this.map = map;
+ return this; // self
+ },
+ insertNodes: function(data, before, anchor){
+ // summary:
+ // inserts an array of new nodes before/after an anchor node
+ // data: Array
+ // a list of data items, which should be processed by the creator function
+ // before: Boolean
+ // insert before the anchor, if true, and after the anchor otherwise
+ // anchor: Node
+ // the anchor node to be used as a point of insertion
+ if(!this.parent.firstChild){
+ anchor = null;
+ }else if(before){
+ if(!anchor){
+ anchor = this.parent.firstChild;
+ }
+ }else{
+ if(anchor){
+ anchor = anchor.nextSibling;
+ }
+ }
+ if(anchor){
+ for(var i = 0; i < data.length; ++i){
+ var t = this._normalizedCreator(data[i]);
+ this.setItem(t.node.id, {data: t.data, type: t.type});
+ this.parent.insertBefore(t.node, anchor);
+ }
+ }else{
+ for(var i = 0; i < data.length; ++i){
+ var t = this._normalizedCreator(data[i]);
+ this.setItem(t.node.id, {data: t.data, type: t.type});
+ this.parent.appendChild(t.node);
+ }
+ }
+ return this; // self
+ },
+ destroy: function(){
+ // summary:
+ // prepares this object to be garbage-collected
+ dojo.forEach(this.events, dojo.disconnect);
+ this.clearItems();
+ this.node = this.parent = this.current = null;
+ },
+
+ // markup methods
+ markupFactory: function(params, node, ctor){
+ params._skipStartup = true;
+ return new ctor(node, params);
+ },
+ startup: function(){
+ // summary:
+ // collects valid child items and populate the map
+
+ // set up the real parent node
+ if(!this.parent){
+ // use the standard algorithm, if not assigned
+ this.parent = this.node;
+ if(this.parent.tagName.toLowerCase() == "table"){
+ var c = this.parent.getElementsByTagName("tbody");
+ if(c && c.length){ this.parent = c[0]; }
+ }
+ }
+ this.defaultCreator = dojo.dnd._defaultCreator(this.parent);
+
+ // process specially marked children
+ this.sync();
+ },
+
+ // mouse events
+ onMouseOver: function(e){
+ // summary:
+ // event processor for onmouseover
+ // e: Event
+ // mouse event
+ var n = e.relatedTarget;
+ while(n){
+ if(n == this.node){ break; }
+ try{
+ n = n.parentNode;
+ }catch(x){
+ n = null;
+ }
+ }
+ if(!n){
+ this._changeState("Container", "Over");
+ this.onOverEvent();
+ }
+ n = this._getChildByEvent(e);
+ if(this.current == n){ return; }
+ if(this.current){ this._removeItemClass(this.current, "Over"); }
+ if(n){ this._addItemClass(n, "Over"); }
+ this.current = n;
+ },
+ onMouseOut: function(e){
+ // summary:
+ // event processor for onmouseout
+ // e: Event
+ // mouse event
+ for(var n = e.relatedTarget; n;){
+ if(n == this.node){ return; }
+ try{
+ n = n.parentNode;
+ }catch(x){
+ n = null;
+ }
+ }
+ if(this.current){
+ this._removeItemClass(this.current, "Over");
+ this.current = null;
+ }
+ this._changeState("Container", "");
+ this.onOutEvent();
+ },
+ onSelectStart: function(e){
+ // summary:
+ // event processor for onselectevent and ondragevent
+ // e: Event
+ // mouse event
+ if(!this.skipForm || !dojo.dnd.isFormElement(e)){
+ dojo.stopEvent(e);
+ }
+ },
+
+ // utilities
+ onOverEvent: function(){
+ // summary:
+ // this function is called once, when mouse is over our container
+ },
+ onOutEvent: function(){
+ // summary:
+ // this function is called once, when mouse is out of our container
+ },
+ _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);
+ },
+ _getChildByEvent: function(e){
+ // summary:
+ // gets a child, which is under the mouse at the moment, or null
+ // e: Event
+ // a mouse event
+ var node = e.target;
+ if(node){
+ for(var parent = node.parentNode; parent; node = parent, parent = node.parentNode){
+ if(parent == this.parent && dojo.hasClass(node, "dojoDndItem")){ return node; }
+ }
+ }
+ return null;
+ },
+ _normalizedCreator: function(/*dojo.dnd.Item*/ item, /*String*/ hint){
+ // summary:
+ // adds all necessary data to the output of the user-supplied creator function
+ var t = (this.creator || this.defaultCreator).call(this, item, hint);
+ if(!dojo.isArray(t.type)){ t.type = ["text"]; }
+ if(!t.node.id){ t.node.id = dojo.dnd.getUniqueId(); }
+ dojo.addClass(t.node, "dojoDndItem");
+ return t;
+ }
+});
+
+dojo.dnd._createNode = function(tag){
+ // summary:
+ // returns a function, which creates an element of given tag
+ // (SPAN by default) and sets its innerHTML to given text
+ // tag: String
+ // a tag name or empty for SPAN
+ if(!tag){ return dojo.dnd._createSpan; }
+ return function(text){ // Function
+ return dojo.create(tag, {innerHTML: text}); // Node
+ };
+};
+
+dojo.dnd._createTrTd = function(text){
+ // summary:
+ // creates a TR/TD structure with given text as an innerHTML of TD
+ // text: String
+ // a text for TD
+ var tr = dojo.create("tr");
+ dojo.create("td", {innerHTML: text}, tr);
+ return tr; // Node
+};
+
+dojo.dnd._createSpan = function(text){
+ // summary:
+ // creates a SPAN element with given text as its innerHTML
+ // text: String
+ // a text for SPAN
+ return dojo.create("span", {innerHTML: text}); // Node
+};
+
+// dojo.dnd._defaultCreatorNodes: Object
+// a dictionary that maps container tag names to child tag names
+dojo.dnd._defaultCreatorNodes = {ul: "li", ol: "li", div: "div", p: "div"};
+
+dojo.dnd._defaultCreator = function(node){
+ // summary:
+ // takes a parent node, and returns an appropriate creator function
+ // node: Node
+ // a container node
+ var tag = node.tagName.toLowerCase();
+ var c = tag == "tbody" || tag == "thead" ? dojo.dnd._createTrTd :
+ dojo.dnd._createNode(dojo.dnd._defaultCreatorNodes[tag]);
+ return function(item, hint){ // Function
+ var isObj = item && dojo.isObject(item), data, type, n;
+ if(isObj && item.tagName && item.nodeType && item.getAttribute){
+ // process a DOM node
+ data = item.getAttribute("dndData") || item.innerHTML;
+ type = item.getAttribute("dndType");
+ type = type ? type.split(/\s*,\s*/) : ["text"];
+ n = item; // this node is going to be moved rather than copied
+ }else{
+ // process a DnD item object or a string
+ data = (isObj && item.data) ? item.data : item;
+ type = (isObj && item.type) ? item.type : ["text"];
+ n = (hint == "avatar" ? dojo.dnd._createSpan : c)(String(data));
+ }
+ if(!n.id){
+ n.id = dojo.dnd.getUniqueId();
+ }
+ return {node: n, data: data, type: type};
+ };
+};
+
+return dojo.dnd.Container;
+});
diff --git a/lib/dojo/dnd/Manager.js b/lib/dojo/dnd/Manager.js
index 38611fbd4..079dffa19 100644
--- a/lib/dojo/dnd/Manager.js
+++ b/lib/dojo/dnd/Manager.js
@@ -4,217 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.dnd.Manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Manager"] = true;
-dojo.provide("dojo.dnd.Manager");
-dojo.require("dojo.dnd.common");
-dojo.require("dojo.dnd.autoscroll");
-dojo.require("dojo.dnd.Avatar");
-
-
-dojo.declare("dojo.dnd.Manager", null, {
- // summary:
- // the manager of DnD operations (usually a singleton)
- constructor: function(){
- this.avatar = null;
- this.source = null;
- this.nodes = [];
- this.copy = true;
- this.target = null;
- this.canDropFlag = false;
- this.events = [];
- },
-
- // avatar's offset from the mouse
- OFFSET_X: 16,
- OFFSET_Y: 16,
-
- // methods
- overSource: function(source){
- // summary:
- // called when a source detected a mouse-over condition
- // source: Object
- // the reporter
- if(this.avatar){
- this.target = (source && source.targetState != "Disabled") ? source : null;
- this.canDropFlag = Boolean(this.target);
- this.avatar.update();
- }
- dojo.publish("/dnd/source/over", [source]);
- },
- outSource: function(source){
- // summary:
- // called when a source detected a mouse-out condition
- // source: Object
- // the reporter
- if(this.avatar){
- if(this.target == source){
- this.target = null;
- this.canDropFlag = false;
- this.avatar.update();
- dojo.publish("/dnd/source/over", [null]);
- }
- }else{
- dojo.publish("/dnd/source/over", [null]);
- }
- },
- startDrag: function(source, nodes, copy){
- // summary:
- // called to initiate the DnD operation
- // source: Object
- // the source which provides items
- // nodes: Array
- // the list of transferred items
- // copy: Boolean
- // copy items, if true, move items otherwise
- this.source = source;
- this.nodes = nodes;
- this.copy = Boolean(copy); // normalizing to true boolean
- this.avatar = this.makeAvatar();
- dojo.body().appendChild(this.avatar.node);
- dojo.publish("/dnd/start", [source, nodes, this.copy]);
- this.events = [
- dojo.connect(dojo.doc, "onmousemove", this, "onMouseMove"),
- dojo.connect(dojo.doc, "onmouseup", this, "onMouseUp"),
- dojo.connect(dojo.doc, "onkeydown", this, "onKeyDown"),
- dojo.connect(dojo.doc, "onkeyup", this, "onKeyUp"),
- // cancel text selection and text dragging
- dojo.connect(dojo.doc, "ondragstart", dojo.stopEvent),
- dojo.connect(dojo.body(), "onselectstart", dojo.stopEvent)
- ];
- var c = "dojoDnd" + (copy ? "Copy" : "Move");
- dojo.addClass(dojo.body(), c);
- },
- canDrop: function(flag){
- // summary:
- // called to notify if the current target can accept items
- var canDropFlag = Boolean(this.target && flag);
- if(this.canDropFlag != canDropFlag){
- this.canDropFlag = canDropFlag;
- this.avatar.update();
- }
- },
- stopDrag: function(){
- // summary:
- // stop the DnD in progress
- dojo.removeClass(dojo.body(), ["dojoDndCopy", "dojoDndMove"]);
- dojo.forEach(this.events, dojo.disconnect);
- this.events = [];
- this.avatar.destroy();
- this.avatar = null;
- this.source = this.target = null;
- this.nodes = [];
- },
- makeAvatar: function(){
- // summary:
- // makes the avatar; it is separate to be overwritten dynamically, if needed
- return new dojo.dnd.Avatar(this);
- },
- updateAvatar: function(){
- // summary:
- // updates the avatar; it is separate to be overwritten dynamically, if needed
- this.avatar.update();
- },
-
- // mouse event processors
- onMouseMove: function(e){
- // summary:
- // event processor for onmousemove
- // e: Event
- // mouse event
- var a = this.avatar;
- if(a){
- dojo.dnd.autoScrollNodes(e);
- //dojo.dnd.autoScroll(e);
- var s = a.node.style;
- s.left = (e.pageX + this.OFFSET_X) + "px";
- s.top = (e.pageY + this.OFFSET_Y) + "px";
- var copy = Boolean(this.source.copyState(dojo.isCopyKey(e)));
- if(this.copy != copy){
- this._setCopyStatus(copy);
- }
- }
- },
- onMouseUp: function(e){
- // summary:
- // event processor for onmouseup
- // e: Event
- // mouse event
- if(this.avatar){
- if(this.target && this.canDropFlag){
- var copy = Boolean(this.source.copyState(dojo.isCopyKey(e))),
- params = [this.source, this.nodes, copy, this.target, e];
- dojo.publish("/dnd/drop/before", params);
- dojo.publish("/dnd/drop", params);
- }else{
- dojo.publish("/dnd/cancel");
- }
- this.stopDrag();
- }
- },
-
- // keyboard event processors
- onKeyDown: function(e){
- // summary:
- // event processor for onkeydown:
- // watching for CTRL for copy/move status, watching for ESCAPE to cancel the drag
- // e: Event
- // keyboard event
- if(this.avatar){
- switch(e.keyCode){
- case dojo.keys.CTRL:
- var copy = Boolean(this.source.copyState(true));
- if(this.copy != copy){
- this._setCopyStatus(copy);
- }
- break;
- case dojo.keys.ESCAPE:
- dojo.publish("/dnd/cancel");
- this.stopDrag();
- break;
- }
- }
- },
- onKeyUp: function(e){
- // summary:
- // event processor for onkeyup, watching for CTRL for copy/move status
- // e: Event
- // keyboard event
- if(this.avatar && e.keyCode == dojo.keys.CTRL){
- var copy = Boolean(this.source.copyState(false));
- if(this.copy != copy){
- this._setCopyStatus(copy);
- }
- }
- },
-
- // utilities
- _setCopyStatus: function(copy){
- // summary:
- // changes the copy status
- // copy: Boolean
- // the copy status
- this.copy = copy;
- this.source._markDndStatus(this.copy);
- this.updateAvatar();
- dojo.replaceClass(dojo.body(),
- "dojoDnd" + (this.copy ? "Copy" : "Move"),
- "dojoDnd" + (this.copy ? "Move" : "Copy"));
- }
-});
-
-// dojo.dnd._manager:
-// The manager singleton variable. Can be overwritten if needed.
-dojo.dnd._manager = null;
-
-dojo.dnd.manager = function(){
- // summary:
- // Returns the current DnD manager. Creates one if it is not created yet.
- if(!dojo.dnd._manager){
- dojo.dnd._manager = new dojo.dnd.Manager();
- }
- return dojo.dnd._manager; // Object
-};
-
-}
+//>>built
+define("dojo/dnd/Manager",["../main","../Evented","./common","./autoscroll","./Avatar"],function(_1,_2){var _3=_1.declare("dojo.dnd.Manager",[_2],{constructor:function(){this.avatar=null;this.source=null;this.nodes=[];this.copy=true;this.target=null;this.canDropFlag=false;this.events=[];},OFFSET_X:16,OFFSET_Y:16,overSource:function(_4){if(this.avatar){this.target=(_4&&_4.targetState!="Disabled")?_4:null;this.canDropFlag=Boolean(this.target);this.avatar.update();}_1.publish("/dnd/source/over",[_4]);},outSource:function(_5){if(this.avatar){if(this.target==_5){this.target=null;this.canDropFlag=false;this.avatar.update();_1.publish("/dnd/source/over",[null]);}}else{_1.publish("/dnd/source/over",[null]);}},startDrag:function(_6,_7,_8){this.source=_6;this.nodes=_7;this.copy=Boolean(_8);this.avatar=this.makeAvatar();_1.body().appendChild(this.avatar.node);_1.publish("/dnd/start",[_6,_7,this.copy]);this.events=[_1.connect(_1.doc,"onmousemove",this,"onMouseMove"),_1.connect(_1.doc,"onmouseup",this,"onMouseUp"),_1.connect(_1.doc,"onkeydown",this,"onKeyDown"),_1.connect(_1.doc,"onkeyup",this,"onKeyUp"),_1.connect(_1.doc,"ondragstart",_1.stopEvent),_1.connect(_1.body(),"onselectstart",_1.stopEvent)];var c="dojoDnd"+(_8?"Copy":"Move");_1.addClass(_1.body(),c);},canDrop:function(_9){var _a=Boolean(this.target&&_9);if(this.canDropFlag!=_a){this.canDropFlag=_a;this.avatar.update();}},stopDrag:function(){_1.removeClass(_1.body(),["dojoDndCopy","dojoDndMove"]);_1.forEach(this.events,_1.disconnect);this.events=[];this.avatar.destroy();this.avatar=null;this.source=this.target=null;this.nodes=[];},makeAvatar:function(){return new _1.dnd.Avatar(this);},updateAvatar:function(){this.avatar.update();},onMouseMove:function(e){var a=this.avatar;if(a){_1.dnd.autoScrollNodes(e);var s=a.node.style;s.left=(e.pageX+this.OFFSET_X)+"px";s.top=(e.pageY+this.OFFSET_Y)+"px";var _b=Boolean(this.source.copyState(_1.isCopyKey(e)));if(this.copy!=_b){this._setCopyStatus(_b);}}},onMouseUp:function(e){if(this.avatar){if(this.target&&this.canDropFlag){var _c=Boolean(this.source.copyState(_1.isCopyKey(e))),_d=[this.source,this.nodes,_c,this.target,e];_1.publish("/dnd/drop/before",_d);_1.publish("/dnd/drop",_d);}else{_1.publish("/dnd/cancel");}this.stopDrag();}},onKeyDown:function(e){if(this.avatar){switch(e.keyCode){case _1.keys.CTRL:var _e=Boolean(this.source.copyState(true));if(this.copy!=_e){this._setCopyStatus(_e);}break;case _1.keys.ESCAPE:_1.publish("/dnd/cancel");this.stopDrag();break;}}},onKeyUp:function(e){if(this.avatar&&e.keyCode==_1.keys.CTRL){var _f=Boolean(this.source.copyState(false));if(this.copy!=_f){this._setCopyStatus(_f);}}},_setCopyStatus:function(_10){this.copy=_10;this.source._markDndStatus(this.copy);this.updateAvatar();_1.replaceClass(_1.body(),"dojoDnd"+(this.copy?"Copy":"Move"),"dojoDnd"+(this.copy?"Move":"Copy"));}});_1.dnd._manager=null;_3.manager=_1.dnd.manager=function(){if(!_1.dnd._manager){_1.dnd._manager=new _1.dnd.Manager();}return _1.dnd._manager;};return _3;}); \ No newline at end of file
diff --git a/lib/dojo/dnd/Manager.js.uncompressed.js b/lib/dojo/dnd/Manager.js.uncompressed.js
new file mode 100644
index 000000000..916050f93
--- /dev/null
+++ b/lib/dojo/dnd/Manager.js.uncompressed.js
@@ -0,0 +1,213 @@
+define("dojo/dnd/Manager", ["../main", "../Evented", "./common", "./autoscroll", "./Avatar"], function(dojo, Evented) {
+ // module:
+ // dojo/dnd/Manager
+ // summary:
+ // TODOC
+
+
+var Manager = dojo.declare("dojo.dnd.Manager", [Evented], {
+ // summary:
+ // the manager of DnD operations (usually a singleton)
+ constructor: function(){
+ this.avatar = null;
+ this.source = null;
+ this.nodes = [];
+ this.copy = true;
+ this.target = null;
+ this.canDropFlag = false;
+ this.events = [];
+ },
+
+ // avatar's offset from the mouse
+ OFFSET_X: 16,
+ OFFSET_Y: 16,
+
+ // methods
+ overSource: function(source){
+ // summary:
+ // called when a source detected a mouse-over condition
+ // source: Object
+ // the reporter
+ if(this.avatar){
+ this.target = (source && source.targetState != "Disabled") ? source : null;
+ this.canDropFlag = Boolean(this.target);
+ this.avatar.update();
+ }
+ dojo.publish("/dnd/source/over", [source]);
+ },
+ outSource: function(source){
+ // summary:
+ // called when a source detected a mouse-out condition
+ // source: Object
+ // the reporter
+ if(this.avatar){
+ if(this.target == source){
+ this.target = null;
+ this.canDropFlag = false;
+ this.avatar.update();
+ dojo.publish("/dnd/source/over", [null]);
+ }
+ }else{
+ dojo.publish("/dnd/source/over", [null]);
+ }
+ },
+ startDrag: function(source, nodes, copy){
+ // summary:
+ // called to initiate the DnD operation
+ // source: Object
+ // the source which provides items
+ // nodes: Array
+ // the list of transferred items
+ // copy: Boolean
+ // copy items, if true, move items otherwise
+ this.source = source;
+ this.nodes = nodes;
+ this.copy = Boolean(copy); // normalizing to true boolean
+ this.avatar = this.makeAvatar();
+ dojo.body().appendChild(this.avatar.node);
+ dojo.publish("/dnd/start", [source, nodes, this.copy]);
+ this.events = [
+ dojo.connect(dojo.doc, "onmousemove", this, "onMouseMove"),
+ dojo.connect(dojo.doc, "onmouseup", this, "onMouseUp"),
+ dojo.connect(dojo.doc, "onkeydown", this, "onKeyDown"),
+ dojo.connect(dojo.doc, "onkeyup", this, "onKeyUp"),
+ // cancel text selection and text dragging
+ dojo.connect(dojo.doc, "ondragstart", dojo.stopEvent),
+ dojo.connect(dojo.body(), "onselectstart", dojo.stopEvent)
+ ];
+ var c = "dojoDnd" + (copy ? "Copy" : "Move");
+ dojo.addClass(dojo.body(), c);
+ },
+ canDrop: function(flag){
+ // summary:
+ // called to notify if the current target can accept items
+ var canDropFlag = Boolean(this.target && flag);
+ if(this.canDropFlag != canDropFlag){
+ this.canDropFlag = canDropFlag;
+ this.avatar.update();
+ }
+ },
+ stopDrag: function(){
+ // summary:
+ // stop the DnD in progress
+ dojo.removeClass(dojo.body(), ["dojoDndCopy", "dojoDndMove"]);
+ dojo.forEach(this.events, dojo.disconnect);
+ this.events = [];
+ this.avatar.destroy();
+ this.avatar = null;
+ this.source = this.target = null;
+ this.nodes = [];
+ },
+ makeAvatar: function(){
+ // summary:
+ // makes the avatar; it is separate to be overwritten dynamically, if needed
+ return new dojo.dnd.Avatar(this);
+ },
+ updateAvatar: function(){
+ // summary:
+ // updates the avatar; it is separate to be overwritten dynamically, if needed
+ this.avatar.update();
+ },
+
+ // mouse event processors
+ onMouseMove: function(e){
+ // summary:
+ // event processor for onmousemove
+ // e: Event
+ // mouse event
+ var a = this.avatar;
+ if(a){
+ dojo.dnd.autoScrollNodes(e);
+ //dojo.dnd.autoScroll(e);
+ var s = a.node.style;
+ s.left = (e.pageX + this.OFFSET_X) + "px";
+ s.top = (e.pageY + this.OFFSET_Y) + "px";
+ var copy = Boolean(this.source.copyState(dojo.isCopyKey(e)));
+ if(this.copy != copy){
+ this._setCopyStatus(copy);
+ }
+ }
+ },
+ onMouseUp: function(e){
+ // summary:
+ // event processor for onmouseup
+ // e: Event
+ // mouse event
+ if(this.avatar){
+ if(this.target && this.canDropFlag){
+ var copy = Boolean(this.source.copyState(dojo.isCopyKey(e))),
+ params = [this.source, this.nodes, copy, this.target, e];
+ dojo.publish("/dnd/drop/before", params);
+ dojo.publish("/dnd/drop", params);
+ }else{
+ dojo.publish("/dnd/cancel");
+ }
+ this.stopDrag();
+ }
+ },
+
+ // keyboard event processors
+ onKeyDown: function(e){
+ // summary:
+ // event processor for onkeydown:
+ // watching for CTRL for copy/move status, watching for ESCAPE to cancel the drag
+ // e: Event
+ // keyboard event
+ if(this.avatar){
+ switch(e.keyCode){
+ case dojo.keys.CTRL:
+ var copy = Boolean(this.source.copyState(true));
+ if(this.copy != copy){
+ this._setCopyStatus(copy);
+ }
+ break;
+ case dojo.keys.ESCAPE:
+ dojo.publish("/dnd/cancel");
+ this.stopDrag();
+ break;
+ }
+ }
+ },
+ onKeyUp: function(e){
+ // summary:
+ // event processor for onkeyup, watching for CTRL for copy/move status
+ // e: Event
+ // keyboard event
+ if(this.avatar && e.keyCode == dojo.keys.CTRL){
+ var copy = Boolean(this.source.copyState(false));
+ if(this.copy != copy){
+ this._setCopyStatus(copy);
+ }
+ }
+ },
+
+ // utilities
+ _setCopyStatus: function(copy){
+ // summary:
+ // changes the copy status
+ // copy: Boolean
+ // the copy status
+ this.copy = copy;
+ this.source._markDndStatus(this.copy);
+ this.updateAvatar();
+ dojo.replaceClass(dojo.body(),
+ "dojoDnd" + (this.copy ? "Copy" : "Move"),
+ "dojoDnd" + (this.copy ? "Move" : "Copy"));
+ }
+});
+
+// dojo.dnd._manager:
+// The manager singleton variable. Can be overwritten if needed.
+dojo.dnd._manager = null;
+
+Manager.manager = dojo.dnd.manager = function(){
+ // summary:
+ // Returns the current DnD manager. Creates one if it is not created yet.
+ if(!dojo.dnd._manager){
+ dojo.dnd._manager = new dojo.dnd.Manager();
+ }
+ return dojo.dnd._manager; // Object
+};
+
+return Manager;
+});
diff --git a/lib/dojo/dnd/Moveable.js b/lib/dojo/dnd/Moveable.js
index 705b8cf62..289b4cf94 100644
--- a/lib/dojo/dnd/Moveable.js
+++ b/lib/dojo/dnd/Moveable.js
@@ -4,180 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.dnd.Moveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Moveable"] = true;
-dojo.provide("dojo.dnd.Moveable");
-dojo.require("dojo.dnd.Mover");
-
-
-/*=====
-dojo.declare("dojo.dnd.__MoveableArgs", [], {
- // handle: Node||String
- // A node (or node's id), which is used as a mouse handle.
- // If omitted, the node itself is used as a handle.
- handle: null,
-
- // delay: Number
- // delay move by this number of pixels
- delay: 0,
-
- // skip: Boolean
- // skip move of form elements
- skip: false,
-
- // mover: Object
- // a constructor of custom Mover
- mover: dojo.dnd.Mover
-});
-=====*/
-
-dojo.declare("dojo.dnd.Moveable", null, {
- // object attributes (for markup)
- handle: "",
- delay: 0,
- skip: false,
-
- constructor: function(node, params){
- // summary:
- // an object, which makes a node moveable
- // node: Node
- // a node (or node's id) to be moved
- // params: dojo.dnd.__MoveableArgs?
- // optional parameters
- this.node = dojo.byId(node);
- if(!params){ params = {}; }
- this.handle = params.handle ? dojo.byId(params.handle) : null;
- if(!this.handle){ this.handle = this.node; }
- this.delay = params.delay > 0 ? params.delay : 0;
- this.skip = params.skip;
- this.mover = params.mover ? params.mover : dojo.dnd.Mover;
- this.events = [
- dojo.connect(this.handle, "onmousedown", this, "onMouseDown"),
- dojo.connect(this.handle, "ontouchstart", this, "onMouseDown"),
- // cancel text selection and text dragging
- dojo.connect(this.handle, "ondragstart", this, "onSelectStart"),
- dojo.connect(this.handle, "onselectstart", this, "onSelectStart")
- ];
- },
-
- // markup methods
- markupFactory: function(params, node){
- return new dojo.dnd.Moveable(node, params);
- },
-
- // methods
- destroy: function(){
- // summary:
- // stops watching for possible move, deletes all references, so the object can be garbage-collected
- dojo.forEach(this.events, dojo.disconnect);
- this.events = this.node = this.handle = null;
- },
-
- // mouse event processors
- onMouseDown: function(e){
- // summary:
- // event processor for onmousedown/ontouchstart, creates a Mover for the node
- // e: Event
- // mouse/touch event
- if(this.skip && dojo.dnd.isFormElement(e)){ return; }
- if(this.delay){
- this.events.push(
- dojo.connect(this.handle, "onmousemove", this, "onMouseMove"),
- dojo.connect(this.handle, "ontouchmove", this, "onMouseMove"),
- dojo.connect(this.handle, "onmouseup", this, "onMouseUp"),
- dojo.connect(this.handle, "ontouchend", this, "onMouseUp")
- );
- var pos = e.touches ? e.touches[0] : e;
- this._lastX = pos.pageX;
- this._lastY = pos.pageY;
- }else{
- this.onDragDetected(e);
- }
- dojo.stopEvent(e);
- },
- onMouseMove: function(e){
- // summary:
- // event processor for onmousemove/ontouchmove, used only for delayed drags
- // e: Event
- // mouse/touch event
- var pos = e.touches ? e.touches[0] : e;
- if(Math.abs(pos.pageX - this._lastX) > this.delay || Math.abs(pos.pageY - this._lastY) > this.delay){
- this.onMouseUp(e);
- this.onDragDetected(e);
- }
- dojo.stopEvent(e);
- },
- onMouseUp: function(e){
- // summary:
- // event processor for onmouseup, used only for delayed drags
- // e: Event
- // mouse event
- for(var i = 0; i < 2; ++i){
- dojo.disconnect(this.events.pop());
- }
- dojo.stopEvent(e);
- },
- onSelectStart: function(e){
- // summary:
- // event processor for onselectevent and ondragevent
- // e: Event
- // mouse event
- if(!this.skip || !dojo.dnd.isFormElement(e)){
- dojo.stopEvent(e);
- }
- },
-
- // local events
- onDragDetected: function(/* Event */ e){
- // summary:
- // called when the drag is detected;
- // responsible for creation of the mover
- new this.mover(this.node, e, this);
- },
- onMoveStart: function(/* dojo.dnd.Mover */ mover){
- // summary:
- // called before every move operation
- dojo.publish("/dnd/move/start", [mover]);
- dojo.addClass(dojo.body(), "dojoMove");
- dojo.addClass(this.node, "dojoMoveItem");
- },
- onMoveStop: function(/* dojo.dnd.Mover */ mover){
- // summary:
- // called after every move operation
- dojo.publish("/dnd/move/stop", [mover]);
- dojo.removeClass(dojo.body(), "dojoMove");
- dojo.removeClass(this.node, "dojoMoveItem");
- },
- onFirstMove: function(/* dojo.dnd.Mover */ mover, /* Event */ e){
- // summary:
- // called during the very first move notification;
- // can be used to initialize coordinates, can be overwritten.
-
- // default implementation does nothing
- },
- onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop, /* Event */ e){
- // summary:
- // called during every move notification;
- // should actually move the node; can be overwritten.
- this.onMoving(mover, leftTop);
- var s = mover.node.style;
- s.left = leftTop.l + "px";
- s.top = leftTop.t + "px";
- this.onMoved(mover, leftTop);
- },
- onMoving: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
- // summary:
- // called before every incremental move; can be overwritten.
-
- // default implementation does nothing
- },
- onMoved: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
- // summary:
- // called after every incremental move; can be overwritten.
-
- // default implementation does nothing
- }
-});
-
-}
+//>>built
+define("dojo/dnd/Moveable",["../main","../Evented","../touch","./Mover"],function(_1,_2,_3){_1.declare("dojo.dnd.Moveable",[_2],{handle:"",delay:0,skip:false,constructor:function(_4,_5){this.node=_1.byId(_4);if(!_5){_5={};}this.handle=_5.handle?_1.byId(_5.handle):null;if(!this.handle){this.handle=this.node;}this.delay=_5.delay>0?_5.delay:0;this.skip=_5.skip;this.mover=_5.mover?_5.mover:_1.dnd.Mover;this.events=[_1.connect(this.handle,_3.press,this,"onMouseDown"),_1.connect(this.handle,"ondragstart",this,"onSelectStart"),_1.connect(this.handle,"onselectstart",this,"onSelectStart")];},markupFactory:function(_6,_7,_8){return new _8(_7,_6);},destroy:function(){_1.forEach(this.events,_1.disconnect);this.events=this.node=this.handle=null;},onMouseDown:function(e){if(this.skip&&_1.dnd.isFormElement(e)){return;}if(this.delay){this.events.push(_1.connect(this.handle,_3.move,this,"onMouseMove"),_1.connect(this.handle,_3.release,this,"onMouseUp"));this._lastX=e.pageX;this._lastY=e.pageY;}else{this.onDragDetected(e);}_1.stopEvent(e);},onMouseMove:function(e){if(Math.abs(e.pageX-this._lastX)>this.delay||Math.abs(e.pageY-this._lastY)>this.delay){this.onMouseUp(e);this.onDragDetected(e);}_1.stopEvent(e);},onMouseUp:function(e){for(var i=0;i<2;++i){_1.disconnect(this.events.pop());}_1.stopEvent(e);},onSelectStart:function(e){if(!this.skip||!_1.dnd.isFormElement(e)){_1.stopEvent(e);}},onDragDetected:function(e){new this.mover(this.node,e,this);},onMoveStart:function(_9){_1.publish("/dnd/move/start",[_9]);_1.addClass(_1.body(),"dojoMove");_1.addClass(this.node,"dojoMoveItem");},onMoveStop:function(_a){_1.publish("/dnd/move/stop",[_a]);_1.removeClass(_1.body(),"dojoMove");_1.removeClass(this.node,"dojoMoveItem");},onFirstMove:function(_b,e){},onMove:function(_c,_d,e){this.onMoving(_c,_d);var s=_c.node.style;s.left=_d.l+"px";s.top=_d.t+"px";this.onMoved(_c,_d);},onMoving:function(_e,_f){},onMoved:function(_10,_11){}});return _1.dnd.Moveable;}); \ No newline at end of file
diff --git a/lib/dojo/dnd/Moveable.js.uncompressed.js b/lib/dojo/dnd/Moveable.js.uncompressed.js
new file mode 100644
index 000000000..e3a3ad8a9
--- /dev/null
+++ b/lib/dojo/dnd/Moveable.js.uncompressed.js
@@ -0,0 +1,173 @@
+define("dojo/dnd/Moveable", ["../main", "../Evented", "../touch", "./Mover"], function(dojo, Evented, touch) {
+ // module:
+ // dojo/dnd/Moveable
+ // summary:
+ // TODOC
+
+
+/*=====
+dojo.declare("dojo.dnd.__MoveableArgs", [], {
+ // handle: Node||String
+ // A node (or node's id), which is used as a mouse handle.
+ // If omitted, the node itself is used as a handle.
+ handle: null,
+
+ // delay: Number
+ // delay move by this number of pixels
+ delay: 0,
+
+ // skip: Boolean
+ // skip move of form elements
+ skip: false,
+
+ // mover: Object
+ // a constructor of custom Mover
+ mover: dojo.dnd.Mover
+});
+=====*/
+
+dojo.declare("dojo.dnd.Moveable", [Evented], {
+ // object attributes (for markup)
+ handle: "",
+ delay: 0,
+ skip: false,
+
+ constructor: function(node, params){
+ // summary:
+ // an object, which makes a node moveable
+ // node: Node
+ // a node (or node's id) to be moved
+ // params: dojo.dnd.__MoveableArgs?
+ // optional parameters
+ this.node = dojo.byId(node);
+ if(!params){ params = {}; }
+ this.handle = params.handle ? dojo.byId(params.handle) : null;
+ if(!this.handle){ this.handle = this.node; }
+ this.delay = params.delay > 0 ? params.delay : 0;
+ this.skip = params.skip;
+ this.mover = params.mover ? params.mover : dojo.dnd.Mover;
+ this.events = [
+ dojo.connect(this.handle, touch.press, this, "onMouseDown"),
+ // cancel text selection and text dragging
+ dojo.connect(this.handle, "ondragstart", this, "onSelectStart"),
+ dojo.connect(this.handle, "onselectstart", this, "onSelectStart")
+ ];
+ },
+
+ // markup methods
+ markupFactory: function(params, node, ctor){
+ return new ctor(node, params);
+ },
+
+ // methods
+ destroy: function(){
+ // summary:
+ // stops watching for possible move, deletes all references, so the object can be garbage-collected
+ dojo.forEach(this.events, dojo.disconnect);
+ this.events = this.node = this.handle = null;
+ },
+
+ // mouse event processors
+ onMouseDown: function(e){
+ // summary:
+ // event processor for onmousedown/ontouchstart, creates a Mover for the node
+ // e: Event
+ // mouse/touch event
+ if(this.skip && dojo.dnd.isFormElement(e)){ return; }
+ if(this.delay){
+ this.events.push(
+ dojo.connect(this.handle, touch.move, this, "onMouseMove"),
+ dojo.connect(this.handle, touch.release, this, "onMouseUp")
+ );
+ this._lastX = e.pageX;
+ this._lastY = e.pageY;
+ }else{
+ this.onDragDetected(e);
+ }
+ dojo.stopEvent(e);
+ },
+ onMouseMove: function(e){
+ // summary:
+ // event processor for onmousemove/ontouchmove, used only for delayed drags
+ // e: Event
+ // mouse/touch event
+ if(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){
+ this.onMouseUp(e);
+ this.onDragDetected(e);
+ }
+ dojo.stopEvent(e);
+ },
+ onMouseUp: function(e){
+ // summary:
+ // event processor for onmouseup, used only for delayed drags
+ // e: Event
+ // mouse event
+ for(var i = 0; i < 2; ++i){
+ dojo.disconnect(this.events.pop());
+ }
+ dojo.stopEvent(e);
+ },
+ onSelectStart: function(e){
+ // summary:
+ // event processor for onselectevent and ondragevent
+ // e: Event
+ // mouse event
+ if(!this.skip || !dojo.dnd.isFormElement(e)){
+ dojo.stopEvent(e);
+ }
+ },
+
+ // local events
+ onDragDetected: function(/* Event */ e){
+ // summary:
+ // called when the drag is detected;
+ // responsible for creation of the mover
+ new this.mover(this.node, e, this);
+ },
+ onMoveStart: function(/* dojo.dnd.Mover */ mover){
+ // summary:
+ // called before every move operation
+ dojo.publish("/dnd/move/start", [mover]);
+ dojo.addClass(dojo.body(), "dojoMove");
+ dojo.addClass(this.node, "dojoMoveItem");
+ },
+ onMoveStop: function(/* dojo.dnd.Mover */ mover){
+ // summary:
+ // called after every move operation
+ dojo.publish("/dnd/move/stop", [mover]);
+ dojo.removeClass(dojo.body(), "dojoMove");
+ dojo.removeClass(this.node, "dojoMoveItem");
+ },
+ onFirstMove: function(/* dojo.dnd.Mover */ mover, /* Event */ e){
+ // summary:
+ // called during the very first move notification;
+ // can be used to initialize coordinates, can be overwritten.
+
+ // default implementation does nothing
+ },
+ onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop, /* Event */ e){
+ // summary:
+ // called during every move notification;
+ // should actually move the node; can be overwritten.
+ this.onMoving(mover, leftTop);
+ var s = mover.node.style;
+ s.left = leftTop.l + "px";
+ s.top = leftTop.t + "px";
+ this.onMoved(mover, leftTop);
+ },
+ onMoving: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+ // summary:
+ // called before every incremental move; can be overwritten.
+
+ // default implementation does nothing
+ },
+ onMoved: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+ // summary:
+ // called after every incremental move; can be overwritten.
+
+ // default implementation does nothing
+ }
+});
+
+return dojo.dnd.Moveable;
+});
diff --git a/lib/dojo/dnd/Mover.js b/lib/dojo/dnd/Mover.js
index a8c161c80..fecc6d9b8 100644
--- a/lib/dojo/dnd/Mover.js
+++ b/lib/dojo/dnd/Mover.js
@@ -4,128 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.dnd.Mover"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Mover"] = true;
-dojo.provide("dojo.dnd.Mover");
-dojo.require("dojo.dnd.common");
-dojo.require("dojo.dnd.autoscroll");
-
-
-dojo.declare("dojo.dnd.Mover", null, {
- constructor: function(node, e, host){
- // summary:
- // an object which makes a node follow the mouse, or touch-drag on touch devices.
- // Used as a default mover, and as a base class for custom movers.
- // node: Node
- // a node (or node's id) to be moved
- // e: Event
- // a mouse event, which started the move;
- // only pageX and pageY properties are used
- // host: Object?
- // object which implements the functionality of the move,
- // and defines proper events (onMoveStart and onMoveStop)
- this.node = dojo.byId(node);
- var pos = e.touches ? e.touches[0] : e;
- this.marginBox = {l: pos.pageX, t: pos.pageY};
- this.mouseButton = e.button;
- var h = (this.host = host), d = node.ownerDocument;
- this.events = [
- // At the start of a drag, onFirstMove is called, and then the following two
- // connects are disconnected
- dojo.connect(d, "onmousemove", this, "onFirstMove"),
- dojo.connect(d, "ontouchmove", this, "onFirstMove"),
-
- // These are called continually during the drag
- dojo.connect(d, "onmousemove", this, "onMouseMove"),
- dojo.connect(d, "ontouchmove", this, "onMouseMove"),
-
- // And these are called at the end of the drag
- dojo.connect(d, "onmouseup", this, "onMouseUp"),
- dojo.connect(d, "ontouchend", this, "onMouseUp"),
-
- // cancel text selection and text dragging
- dojo.connect(d, "ondragstart", dojo.stopEvent),
- dojo.connect(d.body, "onselectstart", dojo.stopEvent)
- ];
- // notify that the move has started
- if(h && h.onMoveStart){
- h.onMoveStart(this);
- }
- },
- // mouse event processors
- onMouseMove: function(e){
- // summary:
- // event processor for onmousemove/ontouchmove
- // e: Event
- // mouse/touch event
- dojo.dnd.autoScroll(e);
- var m = this.marginBox,
- pos = e.touches ? e.touches[0] : e;
- this.host.onMove(this, {l: m.l + pos.pageX, t: m.t + pos.pageY}, e);
- dojo.stopEvent(e);
- },
- onMouseUp: function(e){
- if(dojo.isWebKit && dojo.isMac && this.mouseButton == 2 ?
- e.button == 0 : this.mouseButton == e.button){ // TODO Should condition be met for touch devices, too?
- this.destroy();
- }
- dojo.stopEvent(e);
- },
- // utilities
- onFirstMove: function(e){
- // summary:
- // makes the node absolute; it is meant to be called only once.
- // relative and absolutely positioned nodes are assumed to use pixel units
- var s = this.node.style, l, t, h = this.host;
- switch(s.position){
- case "relative":
- case "absolute":
- // assume that left and top values are in pixels already
- l = Math.round(parseFloat(s.left)) || 0;
- t = Math.round(parseFloat(s.top)) || 0;
- break;
- default:
- s.position = "absolute"; // enforcing the absolute mode
- var m = dojo.marginBox(this.node);
- // event.pageX/pageY (which we used to generate the initial
- // margin box) includes padding and margin set on the body.
- // However, setting the node's position to absolute and then
- // doing dojo.marginBox on it *doesn't* take that additional
- // space into account - so we need to subtract the combined
- // padding and margin. We use getComputedStyle and
- // _getMarginBox/_getContentBox to avoid the extra lookup of
- // the computed style.
- var b = dojo.doc.body;
- var bs = dojo.getComputedStyle(b);
- var bm = dojo._getMarginBox(b, bs);
- var bc = dojo._getContentBox(b, bs);
- l = m.l - (bc.l - bm.l);
- t = m.t - (bc.t - bm.t);
- break;
- }
- this.marginBox.l = l - this.marginBox.l;
- this.marginBox.t = t - this.marginBox.t;
- if(h && h.onFirstMove){
- h.onFirstMove(this, e);
- }
-
- // Disconnect onmousemove and ontouchmove events that call this function
- dojo.disconnect(this.events.shift());
- dojo.disconnect(this.events.shift());
- },
- destroy: function(){
- // summary:
- // stops the move, deletes all references, so the object can be garbage-collected
- dojo.forEach(this.events, dojo.disconnect);
- // undo global settings
- var h = this.host;
- if(h && h.onMoveStop){
- h.onMoveStop(this);
- }
- // destroy objects
- this.events = this.node = this.host = null;
- }
-});
-
-}
+//>>built
+define("dojo/dnd/Mover",["../main","../Evented","../touch","./common","./autoscroll"],function(_1,_2,_3){_1.declare("dojo.dnd.Mover",[_2],{constructor:function(_4,e,_5){this.node=_1.byId(_4);this.marginBox={l:e.pageX,t:e.pageY};this.mouseButton=e.button;var h=(this.host=_5),d=_4.ownerDocument;this.events=[_1.connect(d,_3.move,this,"onFirstMove"),_1.connect(d,_3.move,this,"onMouseMove"),_1.connect(d,_3.release,this,"onMouseUp"),_1.connect(d,"ondragstart",_1.stopEvent),_1.connect(d.body,"onselectstart",_1.stopEvent)];if(h&&h.onMoveStart){h.onMoveStart(this);}},onMouseMove:function(e){_1.dnd.autoScroll(e);var m=this.marginBox;this.host.onMove(this,{l:m.l+e.pageX,t:m.t+e.pageY},e);_1.stopEvent(e);},onMouseUp:function(e){if(_1.isWebKit&&_1.isMac&&this.mouseButton==2?e.button==0:this.mouseButton==e.button){this.destroy();}_1.stopEvent(e);},onFirstMove:function(e){var s=this.node.style,l,t,h=this.host;switch(s.position){case "relative":case "absolute":l=Math.round(parseFloat(s.left))||0;t=Math.round(parseFloat(s.top))||0;break;default:s.position="absolute";var m=_1.marginBox(this.node);var b=_1.doc.body;var bs=_1.getComputedStyle(b);var bm=_1._getMarginBox(b,bs);var bc=_1._getContentBox(b,bs);l=m.l-(bc.l-bm.l);t=m.t-(bc.t-bm.t);break;}this.marginBox.l=l-this.marginBox.l;this.marginBox.t=t-this.marginBox.t;if(h&&h.onFirstMove){h.onFirstMove(this,e);}_1.disconnect(this.events.shift());},destroy:function(){_1.forEach(this.events,_1.disconnect);var h=this.host;if(h&&h.onMoveStop){h.onMoveStop(this);}this.events=this.node=this.host=null;}});return _1.dnd.Mover;}); \ No newline at end of file
diff --git a/lib/dojo/dnd/Mover.js.uncompressed.js b/lib/dojo/dnd/Mover.js.uncompressed.js
new file mode 100644
index 000000000..2b504c232
--- /dev/null
+++ b/lib/dojo/dnd/Mover.js.uncompressed.js
@@ -0,0 +1,119 @@
+define("dojo/dnd/Mover", ["../main", "../Evented", "../touch", "./common", "./autoscroll"], function(dojo, Evented, touch) {
+ // module:
+ // dojo/dnd/Mover
+ // summary:
+ // TODOC
+
+
+dojo.declare("dojo.dnd.Mover", [Evented], {
+ constructor: function(node, e, host){
+ // summary:
+ // an object which makes a node follow the mouse, or touch-drag on touch devices.
+ // Used as a default mover, and as a base class for custom movers.
+ // node: Node
+ // a node (or node's id) to be moved
+ // e: Event
+ // a mouse event, which started the move;
+ // only pageX and pageY properties are used
+ // host: Object?
+ // object which implements the functionality of the move,
+ // and defines proper events (onMoveStart and onMoveStop)
+ this.node = dojo.byId(node);
+ this.marginBox = {l: e.pageX, t: e.pageY};
+ this.mouseButton = e.button;
+ var h = (this.host = host), d = node.ownerDocument;
+ this.events = [
+ // At the start of a drag, onFirstMove is called, and then the following two
+ // connects are disconnected
+ dojo.connect(d, touch.move, this, "onFirstMove"),
+
+ // These are called continually during the drag
+ dojo.connect(d, touch.move, this, "onMouseMove"),
+
+ // And these are called at the end of the drag
+ dojo.connect(d, touch.release, this, "onMouseUp"),
+
+ // cancel text selection and text dragging
+ dojo.connect(d, "ondragstart", dojo.stopEvent),
+ dojo.connect(d.body, "onselectstart", dojo.stopEvent)
+ ];
+ // notify that the move has started
+ if(h && h.onMoveStart){
+ h.onMoveStart(this);
+ }
+ },
+ // mouse event processors
+ onMouseMove: function(e){
+ // summary:
+ // event processor for onmousemove/ontouchmove
+ // e: Event
+ // mouse/touch event
+ dojo.dnd.autoScroll(e);
+ var m = this.marginBox;
+ this.host.onMove(this, {l: m.l + e.pageX, t: m.t + e.pageY}, e);
+ dojo.stopEvent(e);
+ },
+ onMouseUp: function(e){
+ if(dojo.isWebKit && dojo.isMac && this.mouseButton == 2 ?
+ e.button == 0 : this.mouseButton == e.button){ // TODO Should condition be met for touch devices, too?
+ this.destroy();
+ }
+ dojo.stopEvent(e);
+ },
+ // utilities
+ onFirstMove: function(e){
+ // summary:
+ // makes the node absolute; it is meant to be called only once.
+ // relative and absolutely positioned nodes are assumed to use pixel units
+ var s = this.node.style, l, t, h = this.host;
+ switch(s.position){
+ case "relative":
+ case "absolute":
+ // assume that left and top values are in pixels already
+ l = Math.round(parseFloat(s.left)) || 0;
+ t = Math.round(parseFloat(s.top)) || 0;
+ break;
+ default:
+ s.position = "absolute"; // enforcing the absolute mode
+ var m = dojo.marginBox(this.node);
+ // event.pageX/pageY (which we used to generate the initial
+ // margin box) includes padding and margin set on the body.
+ // However, setting the node's position to absolute and then
+ // doing dojo.marginBox on it *doesn't* take that additional
+ // space into account - so we need to subtract the combined
+ // padding and margin. We use getComputedStyle and
+ // _getMarginBox/_getContentBox to avoid the extra lookup of
+ // the computed style.
+ var b = dojo.doc.body;
+ var bs = dojo.getComputedStyle(b);
+ var bm = dojo._getMarginBox(b, bs);
+ var bc = dojo._getContentBox(b, bs);
+ l = m.l - (bc.l - bm.l);
+ t = m.t - (bc.t - bm.t);
+ break;
+ }
+ this.marginBox.l = l - this.marginBox.l;
+ this.marginBox.t = t - this.marginBox.t;
+ if(h && h.onFirstMove){
+ h.onFirstMove(this, e);
+ }
+
+ // Disconnect onmousemove and ontouchmove events that call this function
+ dojo.disconnect(this.events.shift());
+ },
+ destroy: function(){
+ // summary:
+ // stops the move, deletes all references, so the object can be garbage-collected
+ dojo.forEach(this.events, dojo.disconnect);
+ // undo global settings
+ var h = this.host;
+ if(h && h.onMoveStop){
+ h.onMoveStop(this);
+ }
+ // destroy objects
+ this.events = this.node = this.host = null;
+ }
+});
+
+return dojo.dnd.Mover;
+});
diff --git a/lib/dojo/dnd/Selector.js b/lib/dojo/dnd/Selector.js
index 20569daae..8c1929072 100644
--- a/lib/dojo/dnd/Selector.js
+++ b/lib/dojo/dnd/Selector.js
@@ -4,333 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.dnd.Selector"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Selector"] = true;
-dojo.provide("dojo.dnd.Selector");
-dojo.require("dojo.dnd.common");
-dojo.require("dojo.dnd.Container");
-
-
-/*
- Container item states:
- "" - an item is not selected
- "Selected" - an item is selected
- "Anchor" - an item is selected, and is an anchor for a "shift" selection
-*/
-
-/*=====
-dojo.declare("dojo.dnd.__SelectorArgs", [dojo.dnd.__ContainerArgs], {
- // singular: Boolean
- // allows selection of only one element, if true
- singular: false,
-
- // autoSync: Boolean
- // autosynchronizes the source with its list of DnD nodes,
- autoSync: false
-});
-=====*/
-
-dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
- // summary:
- // a Selector object, which knows how to select its children
-
- /*=====
- // selection: Set<String>
- // The set of id's that are currently selected, such that this.selection[id] == 1
- // if the node w/that id is selected. Can iterate over selected node's id's like:
- // | for(var id in this.selection)
- selection: {},
- =====*/
-
- constructor: function(node, params){
- // summary:
- // constructor of the Selector
- // node: Node||String
- // node or node's id to build the selector on
- // params: dojo.dnd.__SelectorArgs?
- // a dictionary of parameters
- if(!params){ params = {}; }
- this.singular = params.singular;
- this.autoSync = params.autoSync;
- // class-specific variables
- this.selection = {};
- this.anchor = null;
- this.simpleSelection = false;
- // set up events
- this.events.push(
- dojo.connect(this.node, "onmousedown", this, "onMouseDown"),
- dojo.connect(this.node, "onmouseup", this, "onMouseUp"));
- },
-
- // object attributes (for markup)
- singular: false, // is singular property
-
- // methods
- getSelectedNodes: function(){
- // summary:
- // returns a list (an array) of selected nodes
- var t = new dojo.NodeList();
- var e = dojo.dnd._empty;
- for(var i in this.selection){
- if(i in e){ continue; }
- t.push(dojo.byId(i));
- }
- return t; // NodeList
- },
- selectNone: function(){
- // summary:
- // unselects all items
- return this._removeSelection()._removeAnchor(); // self
- },
- selectAll: function(){
- // summary:
- // selects all items
- this.forInItems(function(data, id){
- this._addItemClass(dojo.byId(id), "Selected");
- this.selection[id] = 1;
- }, this);
- return this._removeAnchor(); // self
- },
- deleteSelectedNodes: function(){
- // summary:
- // deletes all selected items
- var e = dojo.dnd._empty;
- for(var i in this.selection){
- if(i in e){ continue; }
- var n = dojo.byId(i);
- this.delItem(i);
- dojo.destroy(n);
- }
- this.anchor = null;
- this.selection = {};
- return this; // self
- },
- forInSelectedItems: function(/*Function*/ f, /*Object?*/ o){
- // summary:
- // iterates over selected items;
- // see `dojo.dnd.Container.forInItems()` for details
- o = o || dojo.global;
- var s = this.selection, e = dojo.dnd._empty;
- for(var i in s){
- if(i in e){ continue; }
- f.call(o, this.getItem(i), i, this);
- }
- },
- sync: function(){
- // summary:
- // sync up the node list with the data map
-
- dojo.dnd.Selector.superclass.sync.call(this);
-
- // fix the anchor
- if(this.anchor){
- if(!this.getItem(this.anchor.id)){
- this.anchor = null;
- }
- }
-
- // fix the selection
- var t = [], e = dojo.dnd._empty;
- for(var i in this.selection){
- if(i in e){ continue; }
- if(!this.getItem(i)){
- t.push(i);
- }
- }
- dojo.forEach(t, function(i){
- delete this.selection[i];
- }, this);
-
- return this; // self
- },
- insertNodes: function(addSelected, data, before, anchor){
- // summary:
- // inserts new data items (see `dojo.dnd.Container.insertNodes()` method for details)
- // addSelected: Boolean
- // all new nodes will be added to selected items, if true, no selection change otherwise
- // data: Array
- // a list of data items, which should be processed by the creator function
- // before: Boolean
- // insert before the anchor, if true, and after the anchor otherwise
- // anchor: Node
- // the anchor node to be used as a point of insertion
- var oldCreator = this._normalizedCreator;
- this._normalizedCreator = function(item, hint){
- var t = oldCreator.call(this, item, hint);
- if(addSelected){
- if(!this.anchor){
- this.anchor = t.node;
- this._removeItemClass(t.node, "Selected");
- this._addItemClass(this.anchor, "Anchor");
- }else if(this.anchor != t.node){
- this._removeItemClass(t.node, "Anchor");
- this._addItemClass(t.node, "Selected");
- }
- this.selection[t.node.id] = 1;
- }else{
- this._removeItemClass(t.node, "Selected");
- this._removeItemClass(t.node, "Anchor");
- }
- return t;
- };
- dojo.dnd.Selector.superclass.insertNodes.call(this, data, before, anchor);
- this._normalizedCreator = oldCreator;
- return this; // self
- },
- destroy: function(){
- // summary:
- // prepares the object to be garbage-collected
- dojo.dnd.Selector.superclass.destroy.call(this);
- this.selection = this.anchor = null;
- },
-
- // markup methods
- markupFactory: function(params, node){
- params._skipStartup = true;
- return new dojo.dnd.Selector(node, params);
- },
-
- // mouse events
- onMouseDown: function(e){
- // summary:
- // event processor for onmousedown
- // e: Event
- // mouse event
- if(this.autoSync){ this.sync(); }
- if(!this.current){ return; }
- if(!this.singular && !dojo.isCopyKey(e) && !e.shiftKey && (this.current.id in this.selection)){
- this.simpleSelection = true;
- if(e.button === dojo.mouseButtons.LEFT){
- // accept the left button and stop the event
- // for IE we don't stop event when multiple buttons are pressed
- dojo.stopEvent(e);
- }
- return;
- }
- if(!this.singular && e.shiftKey){
- if(!dojo.isCopyKey(e)){
- this._removeSelection();
- }
- var c = this.getAllNodes();
- if(c.length){
- if(!this.anchor){
- this.anchor = c[0];
- this._addItemClass(this.anchor, "Anchor");
- }
- this.selection[this.anchor.id] = 1;
- if(this.anchor != this.current){
- var i = 0;
- for(; i < c.length; ++i){
- var node = c[i];
- if(node == this.anchor || node == this.current){ break; }
- }
- for(++i; i < c.length; ++i){
- var node = c[i];
- if(node == this.anchor || node == this.current){ break; }
- this._addItemClass(node, "Selected");
- this.selection[node.id] = 1;
- }
- this._addItemClass(this.current, "Selected");
- this.selection[this.current.id] = 1;
- }
- }
- }else{
- if(this.singular){
- if(this.anchor == this.current){
- if(dojo.isCopyKey(e)){
- this.selectNone();
- }
- }else{
- this.selectNone();
- this.anchor = this.current;
- this._addItemClass(this.anchor, "Anchor");
- this.selection[this.current.id] = 1;
- }
- }else{
- if(dojo.isCopyKey(e)){
- if(this.anchor == this.current){
- delete this.selection[this.anchor.id];
- this._removeAnchor();
- }else{
- if(this.current.id in this.selection){
- this._removeItemClass(this.current, "Selected");
- delete this.selection[this.current.id];
- }else{
- if(this.anchor){
- this._removeItemClass(this.anchor, "Anchor");
- this._addItemClass(this.anchor, "Selected");
- }
- this.anchor = this.current;
- this._addItemClass(this.current, "Anchor");
- this.selection[this.current.id] = 1;
- }
- }
- }else{
- if(!(this.current.id in this.selection)){
- this.selectNone();
- this.anchor = this.current;
- this._addItemClass(this.current, "Anchor");
- this.selection[this.current.id] = 1;
- }
- }
- }
- }
- dojo.stopEvent(e);
- },
- onMouseUp: function(e){
- // summary:
- // event processor for onmouseup
- // e: Event
- // mouse event
- if(!this.simpleSelection){ return; }
- this.simpleSelection = false;
- this.selectNone();
- if(this.current){
- this.anchor = this.current;
- this._addItemClass(this.anchor, "Anchor");
- this.selection[this.current.id] = 1;
- }
- },
- onMouseMove: function(e){
- // summary
- // event processor for onmousemove
- // e: Event
- // mouse event
- this.simpleSelection = false;
- },
-
- // utilities
- onOverEvent: function(){
- // summary:
- // this function is called once, when mouse is over our container
- this.onmousemoveEvent = dojo.connect(this.node, "onmousemove", this, "onMouseMove");
- },
- onOutEvent: function(){
- // summary:
- // this function is called once, when mouse is out of our container
- dojo.disconnect(this.onmousemoveEvent);
- delete this.onmousemoveEvent;
- },
- _removeSelection: function(){
- // summary:
- // unselects all items
- var e = dojo.dnd._empty;
- for(var i in this.selection){
- if(i in e){ continue; }
- var node = dojo.byId(i);
- if(node){ this._removeItemClass(node, "Selected"); }
- }
- this.selection = {};
- return this; // self
- },
- _removeAnchor: function(){
- if(this.anchor){
- this._removeItemClass(this.anchor, "Anchor");
- this.anchor = null;
- }
- return this; // self
- }
-});
-
-}
+//>>built
+define("dojo/dnd/Selector",["../main","./common","./Container"],function(_1){_1.declare("dojo.dnd.Selector",_1.dnd.Container,{constructor:function(_2,_3){if(!_3){_3={};}this.singular=_3.singular;this.autoSync=_3.autoSync;this.selection={};this.anchor=null;this.simpleSelection=false;this.events.push(_1.connect(this.node,"onmousedown",this,"onMouseDown"),_1.connect(this.node,"onmouseup",this,"onMouseUp"));},singular:false,getSelectedNodes:function(){var t=new _1.NodeList();var e=_1.dnd._empty;for(var i in this.selection){if(i in e){continue;}t.push(_1.byId(i));}return t;},selectNone:function(){return this._removeSelection()._removeAnchor();},selectAll:function(){this.forInItems(function(_4,id){this._addItemClass(_1.byId(id),"Selected");this.selection[id]=1;},this);return this._removeAnchor();},deleteSelectedNodes:function(){var e=_1.dnd._empty;for(var i in this.selection){if(i in e){continue;}var n=_1.byId(i);this.delItem(i);_1.destroy(n);}this.anchor=null;this.selection={};return this;},forInSelectedItems:function(f,o){o=o||_1.global;var s=this.selection,e=_1.dnd._empty;for(var i in s){if(i in e){continue;}f.call(o,this.getItem(i),i,this);}},sync:function(){_1.dnd.Selector.superclass.sync.call(this);if(this.anchor){if(!this.getItem(this.anchor.id)){this.anchor=null;}}var t=[],e=_1.dnd._empty;for(var i in this.selection){if(i in e){continue;}if(!this.getItem(i)){t.push(i);}}_1.forEach(t,function(i){delete this.selection[i];},this);return this;},insertNodes:function(_5,_6,_7,_8){var _9=this._normalizedCreator;this._normalizedCreator=function(_a,_b){var t=_9.call(this,_a,_b);if(_5){if(!this.anchor){this.anchor=t.node;this._removeItemClass(t.node,"Selected");this._addItemClass(this.anchor,"Anchor");}else{if(this.anchor!=t.node){this._removeItemClass(t.node,"Anchor");this._addItemClass(t.node,"Selected");}}this.selection[t.node.id]=1;}else{this._removeItemClass(t.node,"Selected");this._removeItemClass(t.node,"Anchor");}return t;};_1.dnd.Selector.superclass.insertNodes.call(this,_6,_7,_8);this._normalizedCreator=_9;return this;},destroy:function(){_1.dnd.Selector.superclass.destroy.call(this);this.selection=this.anchor=null;},onMouseDown:function(e){if(this.autoSync){this.sync();}if(!this.current){return;}if(!this.singular&&!_1.isCopyKey(e)&&!e.shiftKey&&(this.current.id in this.selection)){this.simpleSelection=true;if(e.button===_1.mouseButtons.LEFT){_1.stopEvent(e);}return;}if(!this.singular&&e.shiftKey){if(!_1.isCopyKey(e)){this._removeSelection();}var c=this.getAllNodes();if(c.length){if(!this.anchor){this.anchor=c[0];this._addItemClass(this.anchor,"Anchor");}this.selection[this.anchor.id]=1;if(this.anchor!=this.current){var i=0;for(;i<c.length;++i){var _c=c[i];if(_c==this.anchor||_c==this.current){break;}}for(++i;i<c.length;++i){var _c=c[i];if(_c==this.anchor||_c==this.current){break;}this._addItemClass(_c,"Selected");this.selection[_c.id]=1;}this._addItemClass(this.current,"Selected");this.selection[this.current.id]=1;}}}else{if(this.singular){if(this.anchor==this.current){if(_1.isCopyKey(e)){this.selectNone();}}else{this.selectNone();this.anchor=this.current;this._addItemClass(this.anchor,"Anchor");this.selection[this.current.id]=1;}}else{if(_1.isCopyKey(e)){if(this.anchor==this.current){delete this.selection[this.anchor.id];this._removeAnchor();}else{if(this.current.id in this.selection){this._removeItemClass(this.current,"Selected");delete this.selection[this.current.id];}else{if(this.anchor){this._removeItemClass(this.anchor,"Anchor");this._addItemClass(this.anchor,"Selected");}this.anchor=this.current;this._addItemClass(this.current,"Anchor");this.selection[this.current.id]=1;}}}else{if(!(this.current.id in this.selection)){this.selectNone();this.anchor=this.current;this._addItemClass(this.current,"Anchor");this.selection[this.current.id]=1;}}}}_1.stopEvent(e);},onMouseUp:function(e){if(!this.simpleSelection){return;}this.simpleSelection=false;this.selectNone();if(this.current){this.anchor=this.current;this._addItemClass(this.anchor,"Anchor");this.selection[this.current.id]=1;}},onMouseMove:function(e){this.simpleSelection=false;},onOverEvent:function(){this.onmousemoveEvent=_1.connect(this.node,"onmousemove",this,"onMouseMove");},onOutEvent:function(){_1.disconnect(this.onmousemoveEvent);delete this.onmousemoveEvent;},_removeSelection:function(){var e=_1.dnd._empty;for(var i in this.selection){if(i in e){continue;}var _d=_1.byId(i);if(_d){this._removeItemClass(_d,"Selected");}}this.selection={};return this;},_removeAnchor:function(){if(this.anchor){this._removeItemClass(this.anchor,"Anchor");this.anchor=null;}return this;}});return _1.dnd.Selector;}); \ No newline at end of file
diff --git a/lib/dojo/dnd/Selector.js.uncompressed.js b/lib/dojo/dnd/Selector.js.uncompressed.js
new file mode 100644
index 000000000..4f4c02158
--- /dev/null
+++ b/lib/dojo/dnd/Selector.js.uncompressed.js
@@ -0,0 +1,324 @@
+define("dojo/dnd/Selector", ["../main", "./common", "./Container"], function(dojo) {
+ // module:
+ // dojo/dnd/Selector
+ // summary:
+ // TODOC
+
+
+/*
+ Container item states:
+ "" - an item is not selected
+ "Selected" - an item is selected
+ "Anchor" - an item is selected, and is an anchor for a "shift" selection
+*/
+
+/*=====
+dojo.declare("dojo.dnd.__SelectorArgs", [dojo.dnd.__ContainerArgs], {
+ // singular: Boolean
+ // allows selection of only one element, if true
+ singular: false,
+
+ // autoSync: Boolean
+ // autosynchronizes the source with its list of DnD nodes,
+ autoSync: false
+});
+=====*/
+
+dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
+ // summary:
+ // a Selector object, which knows how to select its children
+
+ /*=====
+ // selection: Set<String>
+ // The set of id's that are currently selected, such that this.selection[id] == 1
+ // if the node w/that id is selected. Can iterate over selected node's id's like:
+ // | for(var id in this.selection)
+ selection: {},
+ =====*/
+
+ constructor: function(node, params){
+ // summary:
+ // constructor of the Selector
+ // node: Node||String
+ // node or node's id to build the selector on
+ // params: dojo.dnd.__SelectorArgs?
+ // a dictionary of parameters
+ if(!params){ params = {}; }
+ this.singular = params.singular;
+ this.autoSync = params.autoSync;
+ // class-specific variables
+ this.selection = {};
+ this.anchor = null;
+ this.simpleSelection = false;
+ // set up events
+ this.events.push(
+ dojo.connect(this.node, "onmousedown", this, "onMouseDown"),
+ dojo.connect(this.node, "onmouseup", this, "onMouseUp"));
+ },
+
+ // object attributes (for markup)
+ singular: false, // is singular property
+
+ // methods
+ getSelectedNodes: function(){
+ // summary:
+ // returns a list (an array) of selected nodes
+ var t = new dojo.NodeList();
+ var e = dojo.dnd._empty;
+ for(var i in this.selection){
+ if(i in e){ continue; }
+ t.push(dojo.byId(i));
+ }
+ return t; // NodeList
+ },
+ selectNone: function(){
+ // summary:
+ // unselects all items
+ return this._removeSelection()._removeAnchor(); // self
+ },
+ selectAll: function(){
+ // summary:
+ // selects all items
+ this.forInItems(function(data, id){
+ this._addItemClass(dojo.byId(id), "Selected");
+ this.selection[id] = 1;
+ }, this);
+ return this._removeAnchor(); // self
+ },
+ deleteSelectedNodes: function(){
+ // summary:
+ // deletes all selected items
+ var e = dojo.dnd._empty;
+ for(var i in this.selection){
+ if(i in e){ continue; }
+ var n = dojo.byId(i);
+ this.delItem(i);
+ dojo.destroy(n);
+ }
+ this.anchor = null;
+ this.selection = {};
+ return this; // self
+ },
+ forInSelectedItems: function(/*Function*/ f, /*Object?*/ o){
+ // summary:
+ // iterates over selected items;
+ // see `dojo.dnd.Container.forInItems()` for details
+ o = o || dojo.global;
+ var s = this.selection, e = dojo.dnd._empty;
+ for(var i in s){
+ if(i in e){ continue; }
+ f.call(o, this.getItem(i), i, this);
+ }
+ },
+ sync: function(){
+ // summary:
+ // sync up the node list with the data map
+
+ dojo.dnd.Selector.superclass.sync.call(this);
+
+ // fix the anchor
+ if(this.anchor){
+ if(!this.getItem(this.anchor.id)){
+ this.anchor = null;
+ }
+ }
+
+ // fix the selection
+ var t = [], e = dojo.dnd._empty;
+ for(var i in this.selection){
+ if(i in e){ continue; }
+ if(!this.getItem(i)){
+ t.push(i);
+ }
+ }
+ dojo.forEach(t, function(i){
+ delete this.selection[i];
+ }, this);
+
+ return this; // self
+ },
+ insertNodes: function(addSelected, data, before, anchor){
+ // summary:
+ // inserts new data items (see `dojo.dnd.Container.insertNodes()` method for details)
+ // addSelected: Boolean
+ // all new nodes will be added to selected items, if true, no selection change otherwise
+ // data: Array
+ // a list of data items, which should be processed by the creator function
+ // before: Boolean
+ // insert before the anchor, if true, and after the anchor otherwise
+ // anchor: Node
+ // the anchor node to be used as a point of insertion
+ var oldCreator = this._normalizedCreator;
+ this._normalizedCreator = function(item, hint){
+ var t = oldCreator.call(this, item, hint);
+ if(addSelected){
+ if(!this.anchor){
+ this.anchor = t.node;
+ this._removeItemClass(t.node, "Selected");
+ this._addItemClass(this.anchor, "Anchor");
+ }else if(this.anchor != t.node){
+ this._removeItemClass(t.node, "Anchor");
+ this._addItemClass(t.node, "Selected");
+ }
+ this.selection[t.node.id] = 1;
+ }else{
+ this._removeItemClass(t.node, "Selected");
+ this._removeItemClass(t.node, "Anchor");
+ }
+ return t;
+ };
+ dojo.dnd.Selector.superclass.insertNodes.call(this, data, before, anchor);
+ this._normalizedCreator = oldCreator;
+ return this; // self
+ },
+ destroy: function(){
+ // summary:
+ // prepares the object to be garbage-collected
+ dojo.dnd.Selector.superclass.destroy.call(this);
+ this.selection = this.anchor = null;
+ },
+
+ // mouse events
+ onMouseDown: function(e){
+ // summary:
+ // event processor for onmousedown
+ // e: Event
+ // mouse event
+ if(this.autoSync){ this.sync(); }
+ if(!this.current){ return; }
+ if(!this.singular && !dojo.isCopyKey(e) && !e.shiftKey && (this.current.id in this.selection)){
+ this.simpleSelection = true;
+ if(e.button === dojo.mouseButtons.LEFT){
+ // accept the left button and stop the event
+ // for IE we don't stop event when multiple buttons are pressed
+ dojo.stopEvent(e);
+ }
+ return;
+ }
+ if(!this.singular && e.shiftKey){
+ if(!dojo.isCopyKey(e)){
+ this._removeSelection();
+ }
+ var c = this.getAllNodes();
+ if(c.length){
+ if(!this.anchor){
+ this.anchor = c[0];
+ this._addItemClass(this.anchor, "Anchor");
+ }
+ this.selection[this.anchor.id] = 1;
+ if(this.anchor != this.current){
+ var i = 0;
+ for(; i < c.length; ++i){
+ var node = c[i];
+ if(node == this.anchor || node == this.current){ break; }
+ }
+ for(++i; i < c.length; ++i){
+ var node = c[i];
+ if(node == this.anchor || node == this.current){ break; }
+ this._addItemClass(node, "Selected");
+ this.selection[node.id] = 1;
+ }
+ this._addItemClass(this.current, "Selected");
+ this.selection[this.current.id] = 1;
+ }
+ }
+ }else{
+ if(this.singular){
+ if(this.anchor == this.current){
+ if(dojo.isCopyKey(e)){
+ this.selectNone();
+ }
+ }else{
+ this.selectNone();
+ this.anchor = this.current;
+ this._addItemClass(this.anchor, "Anchor");
+ this.selection[this.current.id] = 1;
+ }
+ }else{
+ if(dojo.isCopyKey(e)){
+ if(this.anchor == this.current){
+ delete this.selection[this.anchor.id];
+ this._removeAnchor();
+ }else{
+ if(this.current.id in this.selection){
+ this._removeItemClass(this.current, "Selected");
+ delete this.selection[this.current.id];
+ }else{
+ if(this.anchor){
+ this._removeItemClass(this.anchor, "Anchor");
+ this._addItemClass(this.anchor, "Selected");
+ }
+ this.anchor = this.current;
+ this._addItemClass(this.current, "Anchor");
+ this.selection[this.current.id] = 1;
+ }
+ }
+ }else{
+ if(!(this.current.id in this.selection)){
+ this.selectNone();
+ this.anchor = this.current;
+ this._addItemClass(this.current, "Anchor");
+ this.selection[this.current.id] = 1;
+ }
+ }
+ }
+ }
+ dojo.stopEvent(e);
+ },
+ onMouseUp: function(e){
+ // summary:
+ // event processor for onmouseup
+ // e: Event
+ // mouse event
+ if(!this.simpleSelection){ return; }
+ this.simpleSelection = false;
+ this.selectNone();
+ if(this.current){
+ this.anchor = this.current;
+ this._addItemClass(this.anchor, "Anchor");
+ this.selection[this.current.id] = 1;
+ }
+ },
+ onMouseMove: function(e){
+ // summary:
+ // event processor for onmousemove
+ // e: Event
+ // mouse event
+ this.simpleSelection = false;
+ },
+
+ // utilities
+ onOverEvent: function(){
+ // summary:
+ // this function is called once, when mouse is over our container
+ this.onmousemoveEvent = dojo.connect(this.node, "onmousemove", this, "onMouseMove");
+ },
+ onOutEvent: function(){
+ // summary:
+ // this function is called once, when mouse is out of our container
+ dojo.disconnect(this.onmousemoveEvent);
+ delete this.onmousemoveEvent;
+ },
+ _removeSelection: function(){
+ // summary:
+ // unselects all items
+ var e = dojo.dnd._empty;
+ for(var i in this.selection){
+ if(i in e){ continue; }
+ var node = dojo.byId(i);
+ if(node){ this._removeItemClass(node, "Selected"); }
+ }
+ this.selection = {};
+ return this; // self
+ },
+ _removeAnchor: function(){
+ if(this.anchor){
+ this._removeItemClass(this.anchor, "Anchor");
+ this.anchor = null;
+ }
+ return this; // self
+ }
+});
+
+return dojo.dnd.Selector;
+});
diff --git a/lib/dojo/dnd/Source.js b/lib/dojo/dnd/Source.js
index 30a61becd..b61da09bd 100644
--- a/lib/dojo/dnd/Source.js
+++ b/lib/dojo/dnd/Source.js
@@ -4,546 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.dnd.Source"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Source"] = true;
-dojo.provide("dojo.dnd.Source");
-dojo.require("dojo.dnd.Selector");
-dojo.require("dojo.dnd.Manager");
-
-
-/*
- Container property:
- "Horizontal"- if this is the horizontal container
- Source states:
- "" - normal state
- "Moved" - this source is being moved
- "Copied" - this source is being copied
- Target states:
- "" - normal state
- "Disabled" - the target cannot accept an avatar
- Target anchor state:
- "" - item is not selected
- "Before" - insert point is before the anchor
- "After" - insert point is after the anchor
-*/
-
-/*=====
-dojo.dnd.__SourceArgs = function(){
- // summary:
- // a dict of parameters for DnD Source configuration. Note that any
- // property on Source elements may be configured, but this is the
- // short-list
- // isSource: Boolean?
- // can be used as a DnD source. Defaults to true.
- // accept: Array?
- // list of accepted types (text strings) for a target; defaults to
- // ["text"]
- // autoSync: Boolean
- // if true refreshes the node list on every operation; false by default
- // copyOnly: Boolean?
- // copy items, if true, use a state of Ctrl key otherwise,
- // see selfCopy and selfAccept for more details
- // delay: Number
- // the move delay in pixels before detecting a drag; 0 by default
- // horizontal: Boolean?
- // a horizontal container, if true, vertical otherwise or when omitted
- // selfCopy: Boolean?
- // copy items by default when dropping on itself,
- // false by default, works only if copyOnly is true
- // selfAccept: Boolean?
- // accept its own items when copyOnly is true,
- // true by default, works only if copyOnly is true
- // withHandles: Boolean?
- // allows dragging only by handles, false by default
- // generateText: Boolean?
- // generate text node for drag and drop, true by default
- this.isSource = isSource;
- this.accept = accept;
- this.autoSync = autoSync;
- this.copyOnly = copyOnly;
- this.delay = delay;
- this.horizontal = horizontal;
- this.selfCopy = selfCopy;
- this.selfAccept = selfAccept;
- this.withHandles = withHandles;
- this.generateText = true;
-}
-=====*/
-
-dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
- // summary:
- // a Source object, which can be used as a DnD source, or a DnD target
-
- // object attributes (for markup)
- isSource: true,
- horizontal: false,
- copyOnly: false,
- selfCopy: false,
- selfAccept: true,
- skipForm: false,
- withHandles: false,
- autoSync: false,
- delay: 0, // pixels
- accept: ["text"],
- generateText: true,
-
- constructor: function(/*DOMNode|String*/node, /*dojo.dnd.__SourceArgs?*/params){
- // summary:
- // a constructor of the Source
- // node:
- // node or node's id to build the source on
- // params:
- // any property of this class may be configured via the params
- // object which is mixed-in to the `dojo.dnd.Source` instance
- dojo.mixin(this, dojo.mixin({}, params));
- var type = this.accept;
- 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;
- this.targetBox = null;
- this.before = true;
- 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");
- }
- if(this.horizontal){
- dojo.addClass(this.node, "dojoDndHorizontal");
- }
- // 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: Object
- // the source which provides items
- // nodes: Array
- // the list of transferred items
- if(this == source){
- return !this.copyOnly || this.selfAccept;
- }
- for(var i = 0; i < nodes.length; ++i){
- var type = source.getItem(nodes[i].id).type;
- // type instanceof Array
- var flag = false;
- for(var j = 0; j < type.length; ++j){
- if(type[j] in this.accept){
- flag = true;
- break;
- }
- }
- if(!flag){
- return false; // Boolean
- }
- }
- return true; // Boolean
- },
- copyState: function(keyPressed, self){
- // 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" key was pressed
- // self: Boolean?
- // optional flag that means that we are about to drop on itself
-
- if(keyPressed){ return true; }
- if(arguments.length < 2){
- self = this == dojo.dnd.manager().target;
- }
- if(self){
- if(this.copyOnly){
- return this.selfCopy;
- }
- }else{
- return this.copyOnly;
- }
- return false; // Boolean
- },
- destroy: function(){
- // summary:
- // prepares the object to be garbage-collected
- dojo.dnd.Source.superclass.destroy.call(this);
- dojo.forEach(this.topics, dojo.unsubscribe);
- this.targetAnchor = null;
- },
-
- // markup methods
- markupFactory: function(params, node){
- params._skipStartup = true;
- return new dojo.dnd.Source(node, params);
- },
-
- // mouse event processors
- onMouseMove: function(e){
- // summary:
- // event processor for onmousemove
- // e: Event
- // mouse event
- if(this.isDragging && this.targetState == "Disabled"){ return; }
- dojo.dnd.Source.superclass.onMouseMove.call(this, e);
- var m = dojo.dnd.manager();
- if(!this.isDragging){
- if(this.mouseDown && this.isSource &&
- (Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay)){
- var nodes = this.getSelectedNodes();
- if(nodes.length){
- m.startDrag(this, nodes, this.copyState(dojo.isCopyKey(e), true));
- }
- }
- }
- if(this.isDragging){
- // calculate before/after
- var before = false;
- if(this.current){
- if(!this.targetBox || this.targetAnchor != this.current){
- this.targetBox = dojo.position(this.current, true);
- }
- if(this.horizontal){
- before = (e.pageX - this.targetBox.x) < (this.targetBox.w / 2);
- }else{
- before = (e.pageY - this.targetBox.y) < (this.targetBox.h / 2);
- }
- }
- if(this.current != this.targetAnchor || before != this.before){
- this._markTargetAnchor(before);
- m.canDrop(!this.current || m.source != this || !(this.current.id in this.selection));
- }
- }
- },
- onMouseDown: function(e){
- // summary:
- // event processor for onmousedown
- // e: Event
- // mouse event
- if(!this.mouseDown && this._legalMouseDown(e) && (!this.skipForm || !dojo.dnd.isFormElement(e))){
- this.mouseDown = true;
- this._lastX = e.pageX;
- this._lastY = e.pageY;
- dojo.dnd.Source.superclass.onMouseDown.call(this, e);
- }
- },
- onMouseUp: function(e){
- // summary:
- // event processor for onmouseup
- // e: Event
- // mouse event
- if(this.mouseDown){
- this.mouseDown = false;
- dojo.dnd.Source.superclass.onMouseUp.call(this, e);
- }
- },
-
- // topic event processors
- onDndSourceOver: function(source){
- // summary:
- // topic event processor for /dnd/source/over, called when detected a current source
- // source: Object
- // the source which has the mouse over it
- if(this != source){
- this.mouseDown = false;
- if(this.targetAnchor){
- this._unmarkTargetAnchor();
- }
- }else if(this.isDragging){
- var m = dojo.dnd.manager();
- m.canDrop(this.targetState != "Disabled" && (!this.current || m.source != this || !(this.current.id in this.selection)));
- }
- },
- onDndStart: function(source, nodes, copy){
- // summary:
- // topic event processor for /dnd/start, called to initiate the DnD operation
- // source: Object
- // the source which provides items
- // nodes: Array
- // the list of transferred items
- // copy: Boolean
- // copy items, if true, move items otherwise
- if(this.autoSync){ this.sync(); }
- if(this.isSource){
- this._changeState("Source", this == source ? (copy ? "Copied" : "Moved") : "");
- }
- var accepted = this.accept && this.checkAcceptance(source, nodes);
- this._changeState("Target", accepted ? "" : "Disabled");
- if(this == source){
- dojo.dnd.manager().overSource(this);
- }
- this.isDragging = true;
- },
- onDndDrop: function(source, nodes, copy, target){
- // summary:
- // topic event processor for /dnd/drop, called to finish the DnD operation
- // source: Object
- // the source which provides items
- // nodes: Array
- // the list of transferred items
- // copy: Boolean
- // copy items, if true, move items otherwise
- // target: Object
- // the target which accepts items
- if(this == target){
- // this one is for us => move nodes!
- this.onDrop(source, nodes, copy);
- }
- this.onDndCancel();
- },
- onDndCancel: function(){
- // summary:
- // topic event processor for /dnd/cancel, called to cancel the DnD operation
- if(this.targetAnchor){
- this._unmarkTargetAnchor();
- this.targetAnchor = null;
- }
- this.before = true;
- this.isDragging = false;
- this.mouseDown = false;
- this._changeState("Source", "");
- this._changeState("Target", "");
- },
-
- // local events
- onDrop: function(source, nodes, copy){
- // summary:
- // called only on the current target, when drop is performed
- // source: Object
- // the source which provides items
- // nodes: Array
- // the list of transferred items
- // copy: Boolean
- // copy items, if true, move items otherwise
-
- if(this != source){
- this.onDropExternal(source, nodes, copy);
- }else{
- this.onDropInternal(nodes, copy);
- }
- },
- onDropExternal: function(source, nodes, copy){
- // summary:
- // called only on the current target, when drop is performed
- // from an external source
- // source: Object
- // the source which provides items
- // nodes: Array
- // the list of transferred items
- // copy: Boolean
- // copy items, if true, move items otherwise
-
- var oldCreator = this._normalizedCreator;
- // transferring nodes from the source to the target
- if(this.creator){
- // use defined creator
- this._normalizedCreator = function(node, hint){
- return oldCreator.call(this, source.getItem(node.id).data, hint);
- };
- }else{
- // we have no creator defined => move/clone nodes
- if(copy){
- // clone nodes
- this._normalizedCreator = function(node, hint){
- var t = source.getItem(node.id);
- var n = node.cloneNode(true);
- n.id = dojo.dnd.getUniqueId();
- return {node: n, data: t.data, type: t.type};
- };
- }else{
- // move nodes
- this._normalizedCreator = function(node, hint){
- var t = source.getItem(node.id);
- source.delItem(node.id);
- return {node: node, data: t.data, type: t.type};
- };
- }
- }
- this.selectNone();
- if(!copy && !this.creator){
- source.selectNone();
- }
- this.insertNodes(true, nodes, this.before, this.current);
- if(!copy && this.creator){
- source.deleteSelectedNodes();
- }
- this._normalizedCreator = oldCreator;
- },
- onDropInternal: function(nodes, copy){
- // summary:
- // called only on the current target, when drop is performed
- // from the same target/source
- // nodes: Array
- // the list of transferred items
- // copy: Boolean
- // copy items, if true, move items otherwise
-
- var oldCreator = this._normalizedCreator;
- // transferring nodes within the single source
- if(this.current && this.current.id in this.selection){
- // do nothing
- return;
- }
- if(copy){
- if(this.creator){
- // create new copies of data items
- this._normalizedCreator = function(node, hint){
- return oldCreator.call(this, this.getItem(node.id).data, hint);
- };
- }else{
- // clone nodes
- this._normalizedCreator = function(node, hint){
- var t = this.getItem(node.id);
- var n = node.cloneNode(true);
- n.id = dojo.dnd.getUniqueId();
- return {node: n, data: t.data, type: t.type};
- };
- }
- }else{
- // move nodes
- if(!this.current){
- // do nothing
- return;
- }
- this._normalizedCreator = function(node, hint){
- var t = this.getItem(node.id);
- return {node: node, data: t.data, type: t.type};
- };
- }
- this._removeSelection();
- this.insertNodes(true, nodes, this.before, this.current);
- this._normalizedCreator = oldCreator;
- },
- onDraggingOver: function(){
- // summary:
- // called during the active DnD operation, when items
- // are dragged over this target, and it is not disabled
- },
- onDraggingOut: function(){
- // summary:
- // called during the active DnD operation, when items
- // are dragged away from this target, and it is not disabled
- },
-
- // utilities
- onOverEvent: function(){
- // summary:
- // this function is called once, when mouse is over our container
- dojo.dnd.Source.superclass.onOverEvent.call(this);
- dojo.dnd.manager().overSource(this);
- if(this.isDragging && this.targetState != "Disabled"){
- this.onDraggingOver();
- }
- },
- onOutEvent: function(){
- // summary:
- // this function is called once, when mouse is out of our container
- dojo.dnd.Source.superclass.onOutEvent.call(this);
- dojo.dnd.manager().outSource(this);
- if(this.isDragging && this.targetState != "Disabled"){
- this.onDraggingOut();
- }
- },
- _markTargetAnchor: function(before){
- // summary:
- // assigns a class to the current target anchor based on "before" status
- // before: Boolean
- // insert before, if true, after otherwise
- if(this.current == this.targetAnchor && this.before == before){ return; }
- if(this.targetAnchor){
- this._removeItemClass(this.targetAnchor, this.before ? "Before" : "After");
- }
- this.targetAnchor = this.current;
- this.targetBox = null;
- this.before = before;
- if(this.targetAnchor){
- this._addItemClass(this.targetAnchor, this.before ? "Before" : "After");
- }
- },
- _unmarkTargetAnchor: function(){
- // summary:
- // removes a class of the current target anchor based on "before" status
- if(!this.targetAnchor){ return; }
- this._removeItemClass(this.targetAnchor, this.before ? "Before" : "After");
- this.targetAnchor = null;
- this.targetBox = null;
- this.before = true;
- },
- _markDndStatus: function(copy){
- // summary:
- // changes source's state based on "copy" status
- this._changeState("Source", copy ? "Copied" : "Moved");
- },
- _legalMouseDown: function(e){
- // summary:
- // checks if user clicked on "approved" items
- // e: Event
- // mouse event
-
- // accept only the left mouse button
- if(!dojo.mouseButtons.isLeft(e)){ return false; }
-
- if(!this.withHandles){ return true; }
-
- // check for handles
- for(var node = e.target; node && node !== this.node; node = node.parentNode){
- if(dojo.hasClass(node, "dojoDndHandle")){ return true; }
- if(dojo.hasClass(node, "dojoDndItem") || dojo.hasClass(node, "dojoDndIgnore")){ break; }
- }
- return false; // Boolean
- }
-});
-
-dojo.declare("dojo.dnd.Target", dojo.dnd.Source, {
- // summary: a Target object, which can be used as a DnD target
-
- constructor: function(node, params){
- // summary:
- // a constructor of the Target --- see the `dojo.dnd.Source.constructor` for details
- this.isSource = false;
- dojo.removeClass(this.node, "dojoDndSource");
- },
-
- // markup methods
- markupFactory: function(params, node){
- params._skipStartup = true;
- return new dojo.dnd.Target(node, params);
- }
-});
-
-dojo.declare("dojo.dnd.AutoSource", dojo.dnd.Source, {
- // summary:
- // a source that syncs its DnD nodes by default
-
- constructor: function(node, params){
- // summary:
- // constructor of the AutoSource --- see the Source constructor for details
- this.autoSync = true;
- },
-
- // markup methods
- markupFactory: function(params, node){
- params._skipStartup = true;
- return new dojo.dnd.AutoSource(node, params);
- }
-});
-
-}
+//>>built
+define("dojo/dnd/Source",["../main","./Selector","./Manager"],function(_1,_2,_3){if(!_1.isAsync){_1.ready(0,function(){var _4=["dojo/dnd/AutoSource","dojo/dnd/Target"];require(_4);});}return _1.declare("dojo.dnd.Source",_2,{isSource:true,horizontal:false,copyOnly:false,selfCopy:false,selfAccept:true,skipForm:false,withHandles:false,autoSync:false,delay:0,accept:["text"],generateText:true,constructor:function(_5,_6){_1.mixin(this,_1.mixin({},_6));var _7=this.accept;if(_7.length){this.accept={};for(var i=0;i<_7.length;++i){this.accept[_7[i]]=1;}}this.isDragging=false;this.mouseDown=false;this.targetAnchor=null;this.targetBox=null;this.before=true;this._lastX=0;this._lastY=0;this.sourceState="";if(this.isSource){_1.addClass(this.node,"dojoDndSource");}this.targetState="";if(this.accept){_1.addClass(this.node,"dojoDndTarget");}if(this.horizontal){_1.addClass(this.node,"dojoDndHorizontal");}this.topics=[_1.subscribe("/dnd/source/over",this,"onDndSourceOver"),_1.subscribe("/dnd/start",this,"onDndStart"),_1.subscribe("/dnd/drop",this,"onDndDrop"),_1.subscribe("/dnd/cancel",this,"onDndCancel")];},checkAcceptance:function(_8,_9){if(this==_8){return !this.copyOnly||this.selfAccept;}for(var i=0;i<_9.length;++i){var _a=_8.getItem(_9[i].id).type;var _b=false;for(var j=0;j<_a.length;++j){if(_a[j] in this.accept){_b=true;break;}}if(!_b){return false;}}return true;},copyState:function(_c,_d){if(_c){return true;}if(arguments.length<2){_d=this==_3.manager().target;}if(_d){if(this.copyOnly){return this.selfCopy;}}else{return this.copyOnly;}return false;},destroy:function(){_1.dnd.Source.superclass.destroy.call(this);_1.forEach(this.topics,_1.unsubscribe);this.targetAnchor=null;},onMouseMove:function(e){if(this.isDragging&&this.targetState=="Disabled"){return;}_1.dnd.Source.superclass.onMouseMove.call(this,e);var m=_3.manager();if(!this.isDragging){if(this.mouseDown&&this.isSource&&(Math.abs(e.pageX-this._lastX)>this.delay||Math.abs(e.pageY-this._lastY)>this.delay)){var _e=this.getSelectedNodes();if(_e.length){m.startDrag(this,_e,this.copyState(_1.isCopyKey(e),true));}}}if(this.isDragging){var _f=false;if(this.current){if(!this.targetBox||this.targetAnchor!=this.current){this.targetBox=_1.position(this.current,true);}if(this.horizontal){_f=(e.pageX-this.targetBox.x)<(this.targetBox.w/2);}else{_f=(e.pageY-this.targetBox.y)<(this.targetBox.h/2);}}if(this.current!=this.targetAnchor||_f!=this.before){this._markTargetAnchor(_f);m.canDrop(!this.current||m.source!=this||!(this.current.id in this.selection));}}},onMouseDown:function(e){if(!this.mouseDown&&this._legalMouseDown(e)&&(!this.skipForm||!_1.dnd.isFormElement(e))){this.mouseDown=true;this._lastX=e.pageX;this._lastY=e.pageY;_1.dnd.Source.superclass.onMouseDown.call(this,e);}},onMouseUp:function(e){if(this.mouseDown){this.mouseDown=false;_1.dnd.Source.superclass.onMouseUp.call(this,e);}},onDndSourceOver:function(_10){if(this!=_10){this.mouseDown=false;if(this.targetAnchor){this._unmarkTargetAnchor();}}else{if(this.isDragging){var m=_3.manager();m.canDrop(this.targetState!="Disabled"&&(!this.current||m.source!=this||!(this.current.id in this.selection)));}}},onDndStart:function(_11,_12,_13){if(this.autoSync){this.sync();}if(this.isSource){this._changeState("Source",this==_11?(_13?"Copied":"Moved"):"");}var _14=this.accept&&this.checkAcceptance(_11,_12);this._changeState("Target",_14?"":"Disabled");if(this==_11){_3.manager().overSource(this);}this.isDragging=true;},onDndDrop:function(_15,_16,_17,_18){if(this==_18){this.onDrop(_15,_16,_17);}this.onDndCancel();},onDndCancel:function(){if(this.targetAnchor){this._unmarkTargetAnchor();this.targetAnchor=null;}this.before=true;this.isDragging=false;this.mouseDown=false;this._changeState("Source","");this._changeState("Target","");},onDrop:function(_19,_1a,_1b){if(this!=_19){this.onDropExternal(_19,_1a,_1b);}else{this.onDropInternal(_1a,_1b);}},onDropExternal:function(_1c,_1d,_1e){var _1f=this._normalizedCreator;if(this.creator){this._normalizedCreator=function(_20,_21){return _1f.call(this,_1c.getItem(_20.id).data,_21);};}else{if(_1e){this._normalizedCreator=function(_22,_23){var t=_1c.getItem(_22.id);var n=_22.cloneNode(true);n.id=_1.dnd.getUniqueId();return {node:n,data:t.data,type:t.type};};}else{this._normalizedCreator=function(_24,_25){var t=_1c.getItem(_24.id);_1c.delItem(_24.id);return {node:_24,data:t.data,type:t.type};};}}this.selectNone();if(!_1e&&!this.creator){_1c.selectNone();}this.insertNodes(true,_1d,this.before,this.current);if(!_1e&&this.creator){_1c.deleteSelectedNodes();}this._normalizedCreator=_1f;},onDropInternal:function(_26,_27){var _28=this._normalizedCreator;if(this.current&&this.current.id in this.selection){return;}if(_27){if(this.creator){this._normalizedCreator=function(_29,_2a){return _28.call(this,this.getItem(_29.id).data,_2a);};}else{this._normalizedCreator=function(_2b,_2c){var t=this.getItem(_2b.id);var n=_2b.cloneNode(true);n.id=_1.dnd.getUniqueId();return {node:n,data:t.data,type:t.type};};}}else{if(!this.current){return;}this._normalizedCreator=function(_2d,_2e){var t=this.getItem(_2d.id);return {node:_2d,data:t.data,type:t.type};};}this._removeSelection();this.insertNodes(true,_26,this.before,this.current);this._normalizedCreator=_28;},onDraggingOver:function(){},onDraggingOut:function(){},onOverEvent:function(){_1.dnd.Source.superclass.onOverEvent.call(this);_3.manager().overSource(this);if(this.isDragging&&this.targetState!="Disabled"){this.onDraggingOver();}},onOutEvent:function(){_1.dnd.Source.superclass.onOutEvent.call(this);_3.manager().outSource(this);if(this.isDragging&&this.targetState!="Disabled"){this.onDraggingOut();}},_markTargetAnchor:function(_2f){if(this.current==this.targetAnchor&&this.before==_2f){return;}if(this.targetAnchor){this._removeItemClass(this.targetAnchor,this.before?"Before":"After");}this.targetAnchor=this.current;this.targetBox=null;this.before=_2f;if(this.targetAnchor){this._addItemClass(this.targetAnchor,this.before?"Before":"After");}},_unmarkTargetAnchor:function(){if(!this.targetAnchor){return;}this._removeItemClass(this.targetAnchor,this.before?"Before":"After");this.targetAnchor=null;this.targetBox=null;this.before=true;},_markDndStatus:function(_30){this._changeState("Source",_30?"Copied":"Moved");},_legalMouseDown:function(e){if(!_1.mouseButtons.isLeft(e)){return false;}if(!this.withHandles){return true;}for(var _31=e.target;_31&&_31!==this.node;_31=_31.parentNode){if(_1.hasClass(_31,"dojoDndHandle")){return true;}if(_1.hasClass(_31,"dojoDndItem")||_1.hasClass(_31,"dojoDndIgnore")){break;}}return false;}});}); \ No newline at end of file
diff --git a/lib/dojo/dnd/Source.js.uncompressed.js b/lib/dojo/dnd/Source.js.uncompressed.js
new file mode 100644
index 000000000..55eabf04e
--- /dev/null
+++ b/lib/dojo/dnd/Source.js.uncompressed.js
@@ -0,0 +1,513 @@
+define("dojo/dnd/Source", ["../main", "./Selector", "./Manager"], function(dojo, Selector, Manager) {
+ // module:
+ // dojo/dnd/Source
+ // summary:
+ // TODOC
+
+/*=====
+Selector = dojo.dnd.Selector;
+=====*/
+
+/*
+ Container property:
+ "Horizontal"- if this is the horizontal container
+ Source states:
+ "" - normal state
+ "Moved" - this source is being moved
+ "Copied" - this source is being copied
+ Target states:
+ "" - normal state
+ "Disabled" - the target cannot accept an avatar
+ Target anchor state:
+ "" - item is not selected
+ "Before" - insert point is before the anchor
+ "After" - insert point is after the anchor
+*/
+
+/*=====
+dojo.dnd.__SourceArgs = function(){
+ // summary:
+ // a dict of parameters for DnD Source configuration. Note that any
+ // property on Source elements may be configured, but this is the
+ // short-list
+ // isSource: Boolean?
+ // can be used as a DnD source. Defaults to true.
+ // accept: Array?
+ // list of accepted types (text strings) for a target; defaults to
+ // ["text"]
+ // autoSync: Boolean
+ // if true refreshes the node list on every operation; false by default
+ // copyOnly: Boolean?
+ // copy items, if true, use a state of Ctrl key otherwise,
+ // see selfCopy and selfAccept for more details
+ // delay: Number
+ // the move delay in pixels before detecting a drag; 0 by default
+ // horizontal: Boolean?
+ // a horizontal container, if true, vertical otherwise or when omitted
+ // selfCopy: Boolean?
+ // copy items by default when dropping on itself,
+ // false by default, works only if copyOnly is true
+ // selfAccept: Boolean?
+ // accept its own items when copyOnly is true,
+ // true by default, works only if copyOnly is true
+ // withHandles: Boolean?
+ // allows dragging only by handles, false by default
+ // generateText: Boolean?
+ // generate text node for drag and drop, true by default
+ this.isSource = isSource;
+ this.accept = accept;
+ this.autoSync = autoSync;
+ this.copyOnly = copyOnly;
+ this.delay = delay;
+ this.horizontal = horizontal;
+ this.selfCopy = selfCopy;
+ this.selfAccept = selfAccept;
+ this.withHandles = withHandles;
+ this.generateText = true;
+}
+=====*/
+
+// For back-compat, remove in 2.0.
+if(!dojo.isAsync){
+ dojo.ready(0, function(){
+ var requires = ["dojo/dnd/AutoSource", "dojo/dnd/Target"];
+ require(requires); // use indirection so modules not rolled into a build
+ })
+}
+
+return dojo.declare("dojo.dnd.Source", Selector, {
+ // summary:
+ // a Source object, which can be used as a DnD source, or a DnD target
+
+ // object attributes (for markup)
+ isSource: true,
+ horizontal: false,
+ copyOnly: false,
+ selfCopy: false,
+ selfAccept: true,
+ skipForm: false,
+ withHandles: false,
+ autoSync: false,
+ delay: 0, // pixels
+ accept: ["text"],
+ generateText: true,
+
+ constructor: function(/*DOMNode|String*/node, /*dojo.dnd.__SourceArgs?*/params){
+ // summary:
+ // a constructor of the Source
+ // node:
+ // node or node's id to build the source on
+ // params:
+ // any property of this class may be configured via the params
+ // object which is mixed-in to the `dojo.dnd.Source` instance
+ dojo.mixin(this, dojo.mixin({}, params));
+ var type = this.accept;
+ 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;
+ this.targetBox = null;
+ this.before = true;
+ 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");
+ }
+ if(this.horizontal){
+ dojo.addClass(this.node, "dojoDndHorizontal");
+ }
+ // 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: Object
+ // the source which provides items
+ // nodes: Array
+ // the list of transferred items
+ if(this == source){
+ return !this.copyOnly || this.selfAccept;
+ }
+ for(var i = 0; i < nodes.length; ++i){
+ var type = source.getItem(nodes[i].id).type;
+ // type instanceof Array
+ var flag = false;
+ for(var j = 0; j < type.length; ++j){
+ if(type[j] in this.accept){
+ flag = true;
+ break;
+ }
+ }
+ if(!flag){
+ return false; // Boolean
+ }
+ }
+ return true; // Boolean
+ },
+ copyState: function(keyPressed, self){
+ // 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" key was pressed
+ // self: Boolean?
+ // optional flag that means that we are about to drop on itself
+
+ if(keyPressed){ return true; }
+ if(arguments.length < 2){
+ self = this == Manager.manager().target;
+ }
+ if(self){
+ if(this.copyOnly){
+ return this.selfCopy;
+ }
+ }else{
+ return this.copyOnly;
+ }
+ return false; // Boolean
+ },
+ destroy: function(){
+ // summary:
+ // prepares the object to be garbage-collected
+ dojo.dnd.Source.superclass.destroy.call(this);
+ dojo.forEach(this.topics, dojo.unsubscribe);
+ this.targetAnchor = null;
+ },
+
+ // mouse event processors
+ onMouseMove: function(e){
+ // summary:
+ // event processor for onmousemove
+ // e: Event
+ // mouse event
+ if(this.isDragging && this.targetState == "Disabled"){ return; }
+ dojo.dnd.Source.superclass.onMouseMove.call(this, e);
+ var m = Manager.manager();
+ if(!this.isDragging){
+ if(this.mouseDown && this.isSource &&
+ (Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay)){
+ var nodes = this.getSelectedNodes();
+ if(nodes.length){
+ m.startDrag(this, nodes, this.copyState(dojo.isCopyKey(e), true));
+ }
+ }
+ }
+ if(this.isDragging){
+ // calculate before/after
+ var before = false;
+ if(this.current){
+ if(!this.targetBox || this.targetAnchor != this.current){
+ this.targetBox = dojo.position(this.current, true);
+ }
+ if(this.horizontal){
+ before = (e.pageX - this.targetBox.x) < (this.targetBox.w / 2);
+ }else{
+ before = (e.pageY - this.targetBox.y) < (this.targetBox.h / 2);
+ }
+ }
+ if(this.current != this.targetAnchor || before != this.before){
+ this._markTargetAnchor(before);
+ m.canDrop(!this.current || m.source != this || !(this.current.id in this.selection));
+ }
+ }
+ },
+ onMouseDown: function(e){
+ // summary:
+ // event processor for onmousedown
+ // e: Event
+ // mouse event
+ if(!this.mouseDown && this._legalMouseDown(e) && (!this.skipForm || !dojo.dnd.isFormElement(e))){
+ this.mouseDown = true;
+ this._lastX = e.pageX;
+ this._lastY = e.pageY;
+ dojo.dnd.Source.superclass.onMouseDown.call(this, e);
+ }
+ },
+ onMouseUp: function(e){
+ // summary:
+ // event processor for onmouseup
+ // e: Event
+ // mouse event
+ if(this.mouseDown){
+ this.mouseDown = false;
+ dojo.dnd.Source.superclass.onMouseUp.call(this, e);
+ }
+ },
+
+ // topic event processors
+ onDndSourceOver: function(source){
+ // summary:
+ // topic event processor for /dnd/source/over, called when detected a current source
+ // source: Object
+ // the source which has the mouse over it
+ if(this != source){
+ this.mouseDown = false;
+ if(this.targetAnchor){
+ this._unmarkTargetAnchor();
+ }
+ }else if(this.isDragging){
+ var m = Manager.manager();
+ m.canDrop(this.targetState != "Disabled" && (!this.current || m.source != this || !(this.current.id in this.selection)));
+ }
+ },
+ onDndStart: function(source, nodes, copy){
+ // summary:
+ // topic event processor for /dnd/start, called to initiate the DnD operation
+ // source: Object
+ // the source which provides items
+ // nodes: Array
+ // the list of transferred items
+ // copy: Boolean
+ // copy items, if true, move items otherwise
+ if(this.autoSync){ this.sync(); }
+ if(this.isSource){
+ this._changeState("Source", this == source ? (copy ? "Copied" : "Moved") : "");
+ }
+ var accepted = this.accept && this.checkAcceptance(source, nodes);
+ this._changeState("Target", accepted ? "" : "Disabled");
+ if(this == source){
+ Manager.manager().overSource(this);
+ }
+ this.isDragging = true;
+ },
+ onDndDrop: function(source, nodes, copy, target){
+ // summary:
+ // topic event processor for /dnd/drop, called to finish the DnD operation
+ // source: Object
+ // the source which provides items
+ // nodes: Array
+ // the list of transferred items
+ // copy: Boolean
+ // copy items, if true, move items otherwise
+ // target: Object
+ // the target which accepts items
+ if(this == target){
+ // this one is for us => move nodes!
+ this.onDrop(source, nodes, copy);
+ }
+ this.onDndCancel();
+ },
+ onDndCancel: function(){
+ // summary:
+ // topic event processor for /dnd/cancel, called to cancel the DnD operation
+ if(this.targetAnchor){
+ this._unmarkTargetAnchor();
+ this.targetAnchor = null;
+ }
+ this.before = true;
+ this.isDragging = false;
+ this.mouseDown = false;
+ this._changeState("Source", "");
+ this._changeState("Target", "");
+ },
+
+ // local events
+ onDrop: function(source, nodes, copy){
+ // summary:
+ // called only on the current target, when drop is performed
+ // source: Object
+ // the source which provides items
+ // nodes: Array
+ // the list of transferred items
+ // copy: Boolean
+ // copy items, if true, move items otherwise
+
+ if(this != source){
+ this.onDropExternal(source, nodes, copy);
+ }else{
+ this.onDropInternal(nodes, copy);
+ }
+ },
+ onDropExternal: function(source, nodes, copy){
+ // summary:
+ // called only on the current target, when drop is performed
+ // from an external source
+ // source: Object
+ // the source which provides items
+ // nodes: Array
+ // the list of transferred items
+ // copy: Boolean
+ // copy items, if true, move items otherwise
+
+ var oldCreator = this._normalizedCreator;
+ // transferring nodes from the source to the target
+ if(this.creator){
+ // use defined creator
+ this._normalizedCreator = function(node, hint){
+ return oldCreator.call(this, source.getItem(node.id).data, hint);
+ };
+ }else{
+ // we have no creator defined => move/clone nodes
+ if(copy){
+ // clone nodes
+ this._normalizedCreator = function(node, hint){
+ var t = source.getItem(node.id);
+ var n = node.cloneNode(true);
+ n.id = dojo.dnd.getUniqueId();
+ return {node: n, data: t.data, type: t.type};
+ };
+ }else{
+ // move nodes
+ this._normalizedCreator = function(node, hint){
+ var t = source.getItem(node.id);
+ source.delItem(node.id);
+ return {node: node, data: t.data, type: t.type};
+ };
+ }
+ }
+ this.selectNone();
+ if(!copy && !this.creator){
+ source.selectNone();
+ }
+ this.insertNodes(true, nodes, this.before, this.current);
+ if(!copy && this.creator){
+ source.deleteSelectedNodes();
+ }
+ this._normalizedCreator = oldCreator;
+ },
+ onDropInternal: function(nodes, copy){
+ // summary:
+ // called only on the current target, when drop is performed
+ // from the same target/source
+ // nodes: Array
+ // the list of transferred items
+ // copy: Boolean
+ // copy items, if true, move items otherwise
+
+ var oldCreator = this._normalizedCreator;
+ // transferring nodes within the single source
+ if(this.current && this.current.id in this.selection){
+ // do nothing
+ return;
+ }
+ if(copy){
+ if(this.creator){
+ // create new copies of data items
+ this._normalizedCreator = function(node, hint){
+ return oldCreator.call(this, this.getItem(node.id).data, hint);
+ };
+ }else{
+ // clone nodes
+ this._normalizedCreator = function(node, hint){
+ var t = this.getItem(node.id);
+ var n = node.cloneNode(true);
+ n.id = dojo.dnd.getUniqueId();
+ return {node: n, data: t.data, type: t.type};
+ };
+ }
+ }else{
+ // move nodes
+ if(!this.current){
+ // do nothing
+ return;
+ }
+ this._normalizedCreator = function(node, hint){
+ var t = this.getItem(node.id);
+ return {node: node, data: t.data, type: t.type};
+ };
+ }
+ this._removeSelection();
+ this.insertNodes(true, nodes, this.before, this.current);
+ this._normalizedCreator = oldCreator;
+ },
+ onDraggingOver: function(){
+ // summary:
+ // called during the active DnD operation, when items
+ // are dragged over this target, and it is not disabled
+ },
+ onDraggingOut: function(){
+ // summary:
+ // called during the active DnD operation, when items
+ // are dragged away from this target, and it is not disabled
+ },
+
+ // utilities
+ onOverEvent: function(){
+ // summary:
+ // this function is called once, when mouse is over our container
+ dojo.dnd.Source.superclass.onOverEvent.call(this);
+ Manager.manager().overSource(this);
+ if(this.isDragging && this.targetState != "Disabled"){
+ this.onDraggingOver();
+ }
+ },
+ onOutEvent: function(){
+ // summary:
+ // this function is called once, when mouse is out of our container
+ dojo.dnd.Source.superclass.onOutEvent.call(this);
+ Manager.manager().outSource(this);
+ if(this.isDragging && this.targetState != "Disabled"){
+ this.onDraggingOut();
+ }
+ },
+ _markTargetAnchor: function(before){
+ // summary:
+ // assigns a class to the current target anchor based on "before" status
+ // before: Boolean
+ // insert before, if true, after otherwise
+ if(this.current == this.targetAnchor && this.before == before){ return; }
+ if(this.targetAnchor){
+ this._removeItemClass(this.targetAnchor, this.before ? "Before" : "After");
+ }
+ this.targetAnchor = this.current;
+ this.targetBox = null;
+ this.before = before;
+ if(this.targetAnchor){
+ this._addItemClass(this.targetAnchor, this.before ? "Before" : "After");
+ }
+ },
+ _unmarkTargetAnchor: function(){
+ // summary:
+ // removes a class of the current target anchor based on "before" status
+ if(!this.targetAnchor){ return; }
+ this._removeItemClass(this.targetAnchor, this.before ? "Before" : "After");
+ this.targetAnchor = null;
+ this.targetBox = null;
+ this.before = true;
+ },
+ _markDndStatus: function(copy){
+ // summary:
+ // changes source's state based on "copy" status
+ this._changeState("Source", copy ? "Copied" : "Moved");
+ },
+ _legalMouseDown: function(e){
+ // summary:
+ // checks if user clicked on "approved" items
+ // e: Event
+ // mouse event
+
+ // accept only the left mouse button
+ if(!dojo.mouseButtons.isLeft(e)){ return false; }
+
+ if(!this.withHandles){ return true; }
+
+ // check for handles
+ for(var node = e.target; node && node !== this.node; node = node.parentNode){
+ if(dojo.hasClass(node, "dojoDndHandle")){ return true; }
+ if(dojo.hasClass(node, "dojoDndItem") || dojo.hasClass(node, "dojoDndIgnore")){ break; }
+ }
+ return false; // Boolean
+ }
+});
+
+});
diff --git a/lib/dojo/dnd/Target.js b/lib/dojo/dnd/Target.js
new file mode 100644
index 000000000..cd10fbc27
--- /dev/null
+++ b/lib/dojo/dnd/Target.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/dnd/Target",["./Source"],function(_1){return dojo.declare("dojo.dnd.Target",_1,{constructor:function(_2,_3){this.isSource=false;dojo.removeClass(this.node,"dojoDndSource");}});}); \ No newline at end of file
diff --git a/lib/dojo/dnd/Target.js.uncompressed.js b/lib/dojo/dnd/Target.js.uncompressed.js
new file mode 100644
index 000000000..bed2dcc09
--- /dev/null
+++ b/lib/dojo/dnd/Target.js.uncompressed.js
@@ -0,0 +1,13 @@
+define("dojo/dnd/Target", [ "./Source" ], function(Source){
+ /*===== Source = dojo.dnd.Source =====*/
+ return dojo.declare("dojo.dnd.Target", Source, {
+ // summary: a Target object, which can be used as a DnD target
+
+ constructor: function(node, params){
+ // summary:
+ // a constructor of the Target --- see the `dojo.dnd.Source.constructor` for details
+ this.isSource = false;
+ dojo.removeClass(this.node, "dojoDndSource");
+ }
+ });
+});
diff --git a/lib/dojo/dnd/TimedMoveable.js b/lib/dojo/dnd/TimedMoveable.js
index bd8e7d253..049ee5da1 100644
--- a/lib/dojo/dnd/TimedMoveable.js
+++ b/lib/dojo/dnd/TimedMoveable.js
@@ -4,78 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.dnd.TimedMoveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.TimedMoveable"] = true;
-dojo.provide("dojo.dnd.TimedMoveable");
-dojo.require("dojo.dnd.Moveable");
-
-
-/*=====
-dojo.declare("dojo.dnd.__TimedMoveableArgs", [dojo.dnd.__MoveableArgs], {
- // timeout: Number
- // delay move by this number of ms,
- // accumulating position changes during the timeout
- timeout: 0
-});
-=====*/
-
-(function(){
- // precalculate long expressions
- var oldOnMove = dojo.dnd.Moveable.prototype.onMove;
-
- dojo.declare("dojo.dnd.TimedMoveable", dojo.dnd.Moveable, {
- // summary:
- // A specialized version of Moveable to support an FPS throttling.
- // This class puts an upper restriction on FPS, which may reduce
- // the CPU load. The additional parameter "timeout" regulates
- // the delay before actually moving the moveable object.
-
- // object attributes (for markup)
- timeout: 40, // in ms, 40ms corresponds to 25 fps
-
- constructor: function(node, params){
- // summary:
- // an object that makes a node moveable with a timer
- // node: Node||String
- // a node (or node's id) to be moved
- // params: dojo.dnd.__TimedMoveableArgs
- // object with additional parameters.
-
- // sanitize parameters
- if(!params){ params = {}; }
- if(params.timeout && typeof params.timeout == "number" && params.timeout >= 0){
- this.timeout = params.timeout;
- }
- },
-
- // markup methods
- markupFactory: function(params, node){
- return new dojo.dnd.TimedMoveable(node, params);
- },
-
- onMoveStop: function(/* dojo.dnd.Mover */ mover){
- if(mover._timer){
- // stop timer
- clearTimeout(mover._timer)
- // reflect the last received position
- oldOnMove.call(this, mover, mover._leftTop)
- }
- dojo.dnd.Moveable.prototype.onMoveStop.apply(this, arguments);
- },
- onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
- mover._leftTop = leftTop;
- if(!mover._timer){
- var _t = this; // to avoid using dojo.hitch()
- mover._timer = setTimeout(function(){
- // we don't have any pending requests
- mover._timer = null;
- // reflect the last received position
- oldOnMove.call(_t, mover, mover._leftTop);
- }, this.timeout);
- }
- }
- });
-})();
-
-}
+//>>built
+define("dojo/dnd/TimedMoveable",["../main","./Moveable"],function(_1){var _2=_1.dnd.Moveable.prototype.onMove;_1.declare("dojo.dnd.TimedMoveable",_1.dnd.Moveable,{timeout:40,constructor:function(_3,_4){if(!_4){_4={};}if(_4.timeout&&typeof _4.timeout=="number"&&_4.timeout>=0){this.timeout=_4.timeout;}},onMoveStop:function(_5){if(_5._timer){clearTimeout(_5._timer);_2.call(this,_5,_5._leftTop);}_1.dnd.Moveable.prototype.onMoveStop.apply(this,arguments);},onMove:function(_6,_7){_6._leftTop=_7;if(!_6._timer){var _8=this;_6._timer=setTimeout(function(){_6._timer=null;_2.call(_8,_6,_6._leftTop);},this.timeout);}}});return _1.dnd.TimedMoveable;}); \ No newline at end of file
diff --git a/lib/dojo/dnd/TimedMoveable.js.uncompressed.js b/lib/dojo/dnd/TimedMoveable.js.uncompressed.js
new file mode 100644
index 000000000..66bcdd2e3
--- /dev/null
+++ b/lib/dojo/dnd/TimedMoveable.js.uncompressed.js
@@ -0,0 +1,69 @@
+define("dojo/dnd/TimedMoveable", ["../main", "./Moveable"], function(dojo) {
+ // module:
+ // dojo/dnd/TimedMoveable
+ // summary:
+ // TODOC
+
+ /*=====
+ dojo.declare("dojo.dnd.__TimedMoveableArgs", [dojo.dnd.__MoveableArgs], {
+ // timeout: Number
+ // delay move by this number of ms,
+ // accumulating position changes during the timeout
+ timeout: 0
+ });
+ =====*/
+
+ // precalculate long expressions
+ var oldOnMove = dojo.dnd.Moveable.prototype.onMove;
+
+ dojo.declare("dojo.dnd.TimedMoveable", dojo.dnd.Moveable, {
+ // summary:
+ // A specialized version of Moveable to support an FPS throttling.
+ // This class puts an upper restriction on FPS, which may reduce
+ // the CPU load. The additional parameter "timeout" regulates
+ // the delay before actually moving the moveable object.
+
+ // object attributes (for markup)
+ timeout: 40, // in ms, 40ms corresponds to 25 fps
+
+ constructor: function(node, params){
+ // summary:
+ // an object that makes a node moveable with a timer
+ // node: Node||String
+ // a node (or node's id) to be moved
+ // params: dojo.dnd.__TimedMoveableArgs
+ // object with additional parameters.
+
+ // sanitize parameters
+ if(!params){ params = {}; }
+ if(params.timeout && typeof params.timeout == "number" && params.timeout >= 0){
+ this.timeout = params.timeout;
+ }
+ },
+
+ onMoveStop: function(/* dojo.dnd.Mover */ mover){
+ if(mover._timer){
+ // stop timer
+ clearTimeout(mover._timer);
+ // reflect the last received position
+ oldOnMove.call(this, mover, mover._leftTop)
+ }
+ dojo.dnd.Moveable.prototype.onMoveStop.apply(this, arguments);
+ },
+ onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+ mover._leftTop = leftTop;
+ if(!mover._timer){
+ var _t = this; // to avoid using dojo.hitch()
+ mover._timer = setTimeout(function(){
+ // we don't have any pending requests
+ mover._timer = null;
+ // reflect the last received position
+ oldOnMove.call(_t, mover, mover._leftTop);
+ }, this.timeout);
+ }
+ }
+ });
+
+ return dojo.dnd.TimedMoveable;
+
+});
diff --git a/lib/dojo/dnd/autoscroll.js b/lib/dojo/dnd/autoscroll.js
index d2c99cf30..3d3a57b30 100644
--- a/lib/dojo/dnd/autoscroll.js
+++ b/lib/dojo/dnd/autoscroll.js
@@ -4,99 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.dnd.autoscroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.autoscroll"] = true;
-dojo.provide("dojo.dnd.autoscroll");
-dojo.require("dojo.window");
-
-dojo.getObject("dnd", true, dojo);
-
-dojo.dnd.getViewport = dojo.window.getBox;
-
-dojo.dnd.V_TRIGGER_AUTOSCROLL = 32;
-dojo.dnd.H_TRIGGER_AUTOSCROLL = 32;
-
-dojo.dnd.V_AUTOSCROLL_VALUE = 16;
-dojo.dnd.H_AUTOSCROLL_VALUE = 16;
-
-dojo.dnd.autoScroll = function(e){
- // summary:
- // a handler for onmousemove event, which scrolls the window, if
- // necesary
- // e: Event
- // onmousemove event
-
- // FIXME: needs more docs!
- var v = dojo.window.getBox(), dx = 0, dy = 0;
- if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){
- dx = -dojo.dnd.H_AUTOSCROLL_VALUE;
- }else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){
- dx = dojo.dnd.H_AUTOSCROLL_VALUE;
- }
- if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){
- dy = -dojo.dnd.V_AUTOSCROLL_VALUE;
- }else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){
- dy = dojo.dnd.V_AUTOSCROLL_VALUE;
- }
- window.scrollBy(dx, dy);
-};
-
-dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1};
-dojo.dnd._validOverflow = {"auto": 1, "scroll": 1};
-
-dojo.dnd.autoScrollNodes = function(e){
- // summary:
- // a handler for onmousemove event, which scrolls the first avaialble
- // Dom element, it falls back to dojo.dnd.autoScroll()
- // e: Event
- // onmousemove event
-
- // FIXME: needs more docs!
- for(var n = e.target; n;){
- if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){
- var s = dojo.getComputedStyle(n);
- if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){
- var b = dojo._getContentBox(n, s), t = dojo.position(n, true);
- //console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop);
- var w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2),
- h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2),
- rx = e.pageX - t.x, ry = e.pageY - t.y, dx = 0, dy = 0;
- if(dojo.isWebKit || dojo.isOpera){
- // FIXME: this code should not be here, it should be taken into account
- // either by the event fixing code, or the dojo.position()
- // FIXME: this code doesn't work on Opera 9.5 Beta
- rx += dojo.body().scrollLeft;
- ry += dojo.body().scrollTop;
- }
- if(rx > 0 && rx < b.w){
- if(rx < w){
- dx = -w;
- }else if(rx > b.w - w){
- dx = w;
- }
- }
- //console.log("ry =", ry, "b.h =", b.h, "h =", h);
- if(ry > 0 && ry < b.h){
- if(ry < h){
- dy = -h;
- }else if(ry > b.h - h){
- dy = h;
- }
- }
- var oldLeft = n.scrollLeft, oldTop = n.scrollTop;
- n.scrollLeft = n.scrollLeft + dx;
- n.scrollTop = n.scrollTop + dy;
- if(oldLeft != n.scrollLeft || oldTop != n.scrollTop){ return; }
- }
- }
- try{
- n = n.parentNode;
- }catch(x){
- n = null;
- }
- }
- dojo.dnd.autoScroll(e);
-};
-
-}
+//>>built
+define("dojo/dnd/autoscroll",["../main","../window"],function(_1){_1.getObject("dnd",true,_1);_1.dnd.getViewport=_1.window.getBox;_1.dnd.V_TRIGGER_AUTOSCROLL=32;_1.dnd.H_TRIGGER_AUTOSCROLL=32;_1.dnd.V_AUTOSCROLL_VALUE=16;_1.dnd.H_AUTOSCROLL_VALUE=16;_1.dnd.autoScroll=function(e){var v=_1.window.getBox(),dx=0,dy=0;if(e.clientX<_1.dnd.H_TRIGGER_AUTOSCROLL){dx=-_1.dnd.H_AUTOSCROLL_VALUE;}else{if(e.clientX>v.w-_1.dnd.H_TRIGGER_AUTOSCROLL){dx=_1.dnd.H_AUTOSCROLL_VALUE;}}if(e.clientY<_1.dnd.V_TRIGGER_AUTOSCROLL){dy=-_1.dnd.V_AUTOSCROLL_VALUE;}else{if(e.clientY>v.h-_1.dnd.V_TRIGGER_AUTOSCROLL){dy=_1.dnd.V_AUTOSCROLL_VALUE;}}window.scrollBy(dx,dy);};_1.dnd._validNodes={"div":1,"p":1,"td":1};_1.dnd._validOverflow={"auto":1,"scroll":1};_1.dnd.autoScrollNodes=function(e){var b,t,w,h,rx,ry,dx=0,dy=0,_2,_3;for(var n=e.target;n;){if(n.nodeType==1&&(n.tagName.toLowerCase() in _1.dnd._validNodes)){var s=_1.getComputedStyle(n),_4=(s.overflow.toLowerCase() in _1.dnd._validOverflow),_5=(s.overflowX.toLowerCase() in _1.dnd._validOverflow),_6=(s.overflowY.toLowerCase() in _1.dnd._validOverflow);if(_4||_5||_6){b=_1._getContentBox(n,s);t=_1.position(n,true);}if(_4||_5){w=Math.min(_1.dnd.H_TRIGGER_AUTOSCROLL,b.w/2);rx=e.pageX-t.x;if(_1.isWebKit||_1.isOpera){rx+=_1.body().scrollLeft;}dx=0;if(rx>0&&rx<b.w){if(rx<w){dx=-w;}else{if(rx>b.w-w){dx=w;}}_2=n.scrollLeft;n.scrollLeft=n.scrollLeft+dx;}}if(_4||_6){h=Math.min(_1.dnd.V_TRIGGER_AUTOSCROLL,b.h/2);ry=e.pageY-t.y;if(_1.isWebKit||_1.isOpera){ry+=_1.body().scrollTop;}dy=0;if(ry>0&&ry<b.h){if(ry<h){dy=-h;}else{if(ry>b.h-h){dy=h;}}_3=n.scrollTop;n.scrollTop=n.scrollTop+dy;}}if(dx||dy){return;}}try{n=n.parentNode;}catch(x){n=null;}}_1.dnd.autoScroll(e);};return _1.dnd;}); \ No newline at end of file
diff --git a/lib/dojo/dnd/autoscroll.js.uncompressed.js b/lib/dojo/dnd/autoscroll.js.uncompressed.js
new file mode 100644
index 000000000..2fbeca2ec
--- /dev/null
+++ b/lib/dojo/dnd/autoscroll.js.uncompressed.js
@@ -0,0 +1,118 @@
+define("dojo/dnd/autoscroll", ["../main", "../window"], function(dojo) {
+ // module:
+ // dojo/dnd/autoscroll
+ // summary:
+ // TODOC
+
+dojo.getObject("dnd", true, dojo);
+
+dojo.dnd.getViewport = dojo.window.getBox;
+
+dojo.dnd.V_TRIGGER_AUTOSCROLL = 32;
+dojo.dnd.H_TRIGGER_AUTOSCROLL = 32;
+
+dojo.dnd.V_AUTOSCROLL_VALUE = 16;
+dojo.dnd.H_AUTOSCROLL_VALUE = 16;
+
+dojo.dnd.autoScroll = function(e){
+ // summary:
+ // a handler for onmousemove event, which scrolls the window, if
+ // necesary
+ // e: Event
+ // onmousemove event
+
+ // FIXME: needs more docs!
+ var v = dojo.window.getBox(), dx = 0, dy = 0;
+ if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){
+ dx = -dojo.dnd.H_AUTOSCROLL_VALUE;
+ }else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){
+ dx = dojo.dnd.H_AUTOSCROLL_VALUE;
+ }
+ if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){
+ dy = -dojo.dnd.V_AUTOSCROLL_VALUE;
+ }else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){
+ dy = dojo.dnd.V_AUTOSCROLL_VALUE;
+ }
+ window.scrollBy(dx, dy);
+};
+
+dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1};
+dojo.dnd._validOverflow = {"auto": 1, "scroll": 1};
+
+dojo.dnd.autoScrollNodes = function(e){
+ // summary:
+ // a handler for onmousemove event, which scrolls the first avaialble
+ // Dom element, it falls back to dojo.dnd.autoScroll()
+ // e: Event
+ // onmousemove event
+
+ // FIXME: needs more docs!
+
+ var b, t, w, h, rx, ry, dx = 0, dy = 0, oldLeft, oldTop;
+
+ for(var n = e.target; n;){
+ if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){
+ var s = dojo.getComputedStyle(n),
+ overflow = (s.overflow.toLowerCase() in dojo.dnd._validOverflow),
+ overflowX = (s.overflowX.toLowerCase() in dojo.dnd._validOverflow),
+ overflowY = (s.overflowY.toLowerCase() in dojo.dnd._validOverflow);
+ if(overflow || overflowX || overflowY){
+ b = dojo._getContentBox(n, s);
+ t = dojo.position(n, true);
+ }
+ // overflow-x
+ if(overflow || overflowX){
+ w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2);
+ rx = e.pageX - t.x;
+ if(dojo.isWebKit || dojo.isOpera){
+ // FIXME: this code should not be here, it should be taken into account
+ // either by the event fixing code, or the dojo.position()
+ // FIXME: this code doesn't work on Opera 9.5 Beta
+ rx += dojo.body().scrollLeft;
+ }
+ dx = 0;
+ if(rx > 0 && rx < b.w){
+ if(rx < w){
+ dx = -w;
+ }else if(rx > b.w - w){
+ dx = w;
+ }
+ oldLeft = n.scrollLeft;
+ n.scrollLeft = n.scrollLeft + dx;
+ }
+ }
+ // overflow-y
+ if(overflow || overflowY){
+ //console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop);
+ h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2);
+ ry = e.pageY - t.y;
+ if(dojo.isWebKit || dojo.isOpera){
+ // FIXME: this code should not be here, it should be taken into account
+ // either by the event fixing code, or the dojo.position()
+ // FIXME: this code doesn't work on Opera 9.5 Beta
+ ry += dojo.body().scrollTop;
+ }
+ dy = 0;
+ if(ry > 0 && ry < b.h){
+ if(ry < h){
+ dy = -h;
+ }else if(ry > b.h - h){
+ dy = h;
+ }
+ oldTop = n.scrollTop;
+ n.scrollTop = n.scrollTop + dy;
+ }
+ }
+ if(dx || dy){ return; }
+ }
+ try{
+ n = n.parentNode;
+ }catch(x){
+ n = null;
+ }
+ }
+ dojo.dnd.autoScroll(e);
+};
+
+ return dojo.dnd;
+});
diff --git a/lib/dojo/dnd/common.js b/lib/dojo/dnd/common.js
index f69aa5a5a..97434a728 100644
--- a/lib/dojo/dnd/common.js
+++ b/lib/dojo/dnd/common.js
@@ -4,36 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.dnd.common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.common"] = true;
-dojo.provide("dojo.dnd.common");
-
-dojo.getObject("dnd", true, dojo);
-
-dojo.dnd.getCopyKeyState = dojo.isCopyKey;
-
-dojo.dnd._uniqueId = 0;
-dojo.dnd.getUniqueId = function(){
- // summary:
- // returns a unique string for use with any DOM element
- var id;
- do{
- id = dojo._scopeName + "Unique" + (++dojo.dnd._uniqueId);
- }while(dojo.byId(id));
- return id;
-};
-
-dojo.dnd._empty = {};
-
-dojo.dnd.isFormElement = function(/*Event*/ e){
- // summary:
- // returns true if user clicked on a form element
- var t = e.target;
- if(t.nodeType == 3 /*TEXT_NODE*/){
- t = t.parentNode;
- }
- return " button textarea input select option ".indexOf(" " + t.tagName.toLowerCase() + " ") >= 0; // Boolean
-};
-
-}
+//>>built
+define("dojo/dnd/common",["../main"],function(_1){_1.getObject("dnd",true,_1);_1.dnd.getCopyKeyState=_1.isCopyKey;_1.dnd._uniqueId=0;_1.dnd.getUniqueId=function(){var id;do{id=_1._scopeName+"Unique"+(++_1.dnd._uniqueId);}while(_1.byId(id));return id;};_1.dnd._empty={};_1.dnd.isFormElement=function(e){var t=e.target;if(t.nodeType==3){t=t.parentNode;}return " button textarea input select option ".indexOf(" "+t.tagName.toLowerCase()+" ")>=0;};return _1.dnd;}); \ No newline at end of file
diff --git a/lib/dojo/dnd/common.js.uncompressed.js b/lib/dojo/dnd/common.js.uncompressed.js
new file mode 100644
index 000000000..ec56449ae
--- /dev/null
+++ b/lib/dojo/dnd/common.js.uncompressed.js
@@ -0,0 +1,35 @@
+define("dojo/dnd/common", ["../main"], function(dojo) {
+ // module:
+ // dojo/dnd/common
+ // summary:
+ // TODOC
+
+dojo.getObject("dnd", true, dojo);
+
+dojo.dnd.getCopyKeyState = dojo.isCopyKey;
+
+dojo.dnd._uniqueId = 0;
+dojo.dnd.getUniqueId = function(){
+ // summary:
+ // returns a unique string for use with any DOM element
+ var id;
+ do{
+ id = dojo._scopeName + "Unique" + (++dojo.dnd._uniqueId);
+ }while(dojo.byId(id));
+ return id;
+};
+
+dojo.dnd._empty = {};
+
+dojo.dnd.isFormElement = function(/*Event*/ e){
+ // summary:
+ // returns true if user clicked on a form element
+ var t = e.target;
+ if(t.nodeType == 3 /*TEXT_NODE*/){
+ t = t.parentNode;
+ }
+ return " button textarea input select option ".indexOf(" " + t.tagName.toLowerCase() + " ") >= 0; // Boolean
+};
+
+return dojo.dnd;
+});
diff --git a/lib/dojo/dnd/move.js b/lib/dojo/dnd/move.js
index 6a737bd3a..3c8d97ae0 100644
--- a/lib/dojo/dnd/move.js
+++ b/lib/dojo/dnd/move.js
@@ -4,161 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.dnd.move"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.move"] = true;
-dojo.provide("dojo.dnd.move");
-dojo.require("dojo.dnd.Mover");
-dojo.require("dojo.dnd.Moveable");
-
-
-/*=====
-dojo.declare("dojo.dnd.move.__constrainedMoveableArgs", [dojo.dnd.__MoveableArgs], {
- // constraints: Function
- // Calculates a constraint box.
- // It is called in a context of the moveable object.
- constraints: function(){},
-
- // within: Boolean
- // restrict move within boundaries.
- within: false
-});
-=====*/
-
-dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, {
- // object attributes (for markup)
- constraints: function(){},
- within: false,
-
- // markup methods
- markupFactory: function(params, node){
- return new dojo.dnd.move.constrainedMoveable(node, params);
- },
-
- constructor: function(node, params){
- // summary:
- // an object that makes a node moveable
- // node: Node
- // a node (or node's id) to be moved
- // params: dojo.dnd.move.__constrainedMoveableArgs?
- // an optional object with additional parameters;
- // the rest is passed to the base class
- if(!params){ params = {}; }
- this.constraints = params.constraints;
- this.within = params.within;
- },
- onFirstMove: function(/* dojo.dnd.Mover */ mover){
- // summary:
- // called during the very first move notification;
- // can be used to initialize coordinates, can be overwritten.
- var c = this.constraintBox = this.constraints.call(this, mover);
- c.r = c.l + c.w;
- c.b = c.t + c.h;
- if(this.within){
- var mb = dojo._getMarginSize(mover.node);
- c.r -= mb.w;
- c.b -= mb.h;
- }
- },
- onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
- // summary:
- // called during every move notification;
- // should actually move the node; can be overwritten.
- var c = this.constraintBox, s = mover.node.style;
- this.onMoving(mover, leftTop);
- leftTop.l = leftTop.l < c.l ? c.l : c.r < leftTop.l ? c.r : leftTop.l;
- leftTop.t = leftTop.t < c.t ? c.t : c.b < leftTop.t ? c.b : leftTop.t;
- s.left = leftTop.l + "px";
- s.top = leftTop.t + "px";
- this.onMoved(mover, leftTop);
- }
-});
-
-/*=====
-dojo.declare("dojo.dnd.move.__boxConstrainedMoveableArgs", [dojo.dnd.move.__constrainedMoveableArgs], {
- // box: Object
- // a constraint box
- box: {}
-});
-=====*/
-
-dojo.declare("dojo.dnd.move.boxConstrainedMoveable", dojo.dnd.move.constrainedMoveable, {
- // box:
- // object attributes (for markup)
- box: {},
-
- // markup methods
- markupFactory: function(params, node){
- return new dojo.dnd.move.boxConstrainedMoveable(node, params);
- },
-
- constructor: function(node, params){
- // summary:
- // an object, which makes a node moveable
- // node: Node
- // a node (or node's id) to be moved
- // params: dojo.dnd.move.__boxConstrainedMoveableArgs?
- // an optional object with parameters
- var box = params && params.box;
- this.constraints = function(){ return box; };
- }
-});
-
-/*=====
-dojo.declare("dojo.dnd.move.__parentConstrainedMoveableArgs", [dojo.dnd.move.__constrainedMoveableArgs], {
- // area: String
- // A parent's area to restrict the move.
- // Can be "margin", "border", "padding", or "content".
- area: ""
-});
-=====*/
-
-dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constrainedMoveable, {
- // area:
- // object attributes (for markup)
- area: "content",
-
- // markup methods
- markupFactory: function(params, node){
- return new dojo.dnd.move.parentConstrainedMoveable(node, params);
- },
-
- constructor: function(node, params){
- // summary:
- // an object, which makes a node moveable
- // node: Node
- // a node (or node's id) to be moved
- // params: dojo.dnd.move.__parentConstrainedMoveableArgs?
- // an optional object with parameters
- var area = params && params.area;
- this.constraints = function(){
- var n = this.node.parentNode,
- s = dojo.getComputedStyle(n),
- mb = dojo._getMarginBox(n, s);
- if(area == "margin"){
- return mb; // Object
- }
- var t = dojo._getMarginExtents(n, s);
- mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
- if(area == "border"){
- return mb; // Object
- }
- t = dojo._getBorderExtents(n, s);
- mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
- if(area == "padding"){
- return mb; // Object
- }
- t = dojo._getPadExtents(n, s);
- mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
- return mb; // Object
- };
- }
-});
-
-// patching functions one level up for compatibility
-
-dojo.dnd.constrainedMover = dojo.dnd.move.constrainedMover;
-dojo.dnd.boxConstrainedMover = dojo.dnd.move.boxConstrainedMover;
-dojo.dnd.parentConstrainedMover = dojo.dnd.move.parentConstrainedMover;
-
-}
+//>>built
+define("dojo/dnd/move",["../main","./Mover","./Moveable"],function(_1){_1.declare("dojo.dnd.move.constrainedMoveable",_1.dnd.Moveable,{constraints:function(){},within:false,constructor:function(_2,_3){if(!_3){_3={};}this.constraints=_3.constraints;this.within=_3.within;},onFirstMove:function(_4){var c=this.constraintBox=this.constraints.call(this,_4);c.r=c.l+c.w;c.b=c.t+c.h;if(this.within){var mb=_1._getMarginSize(_4.node);c.r-=mb.w;c.b-=mb.h;}},onMove:function(_5,_6){var c=this.constraintBox,s=_5.node.style;this.onMoving(_5,_6);_6.l=_6.l<c.l?c.l:c.r<_6.l?c.r:_6.l;_6.t=_6.t<c.t?c.t:c.b<_6.t?c.b:_6.t;s.left=_6.l+"px";s.top=_6.t+"px";this.onMoved(_5,_6);}});_1.declare("dojo.dnd.move.boxConstrainedMoveable",_1.dnd.move.constrainedMoveable,{box:{},constructor:function(_7,_8){var _9=_8&&_8.box;this.constraints=function(){return _9;};}});_1.declare("dojo.dnd.move.parentConstrainedMoveable",_1.dnd.move.constrainedMoveable,{area:"content",constructor:function(_a,_b){var _c=_b&&_b.area;this.constraints=function(){var n=this.node.parentNode,s=_1.getComputedStyle(n),mb=_1._getMarginBox(n,s);if(_c=="margin"){return mb;}var t=_1._getMarginExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(_c=="border"){return mb;}t=_1._getBorderExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(_c=="padding"){return mb;}t=_1._getPadExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;return mb;};}});_1.dnd.constrainedMover=_1.dnd.move.constrainedMover;_1.dnd.boxConstrainedMover=_1.dnd.move.boxConstrainedMover;_1.dnd.parentConstrainedMover=_1.dnd.move.parentConstrainedMover;return _1.dnd.move;}); \ No newline at end of file
diff --git a/lib/dojo/dnd/move.js.uncompressed.js b/lib/dojo/dnd/move.js.uncompressed.js
new file mode 100644
index 000000000..a03954c3e
--- /dev/null
+++ b/lib/dojo/dnd/move.js.uncompressed.js
@@ -0,0 +1,143 @@
+define("dojo/dnd/move", ["../main", "./Mover", "./Moveable"], function(dojo) {
+ // module:
+ // dojo/dnd/move
+ // summary:
+ // TODOC
+
+
+/*=====
+dojo.declare("dojo.dnd.move.__constrainedMoveableArgs", [dojo.dnd.__MoveableArgs], {
+ // constraints: Function
+ // Calculates a constraint box.
+ // It is called in a context of the moveable object.
+ constraints: function(){},
+
+ // within: Boolean
+ // restrict move within boundaries.
+ within: false
+});
+=====*/
+
+dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, {
+ // object attributes (for markup)
+ constraints: function(){},
+ within: false,
+
+ constructor: function(node, params){
+ // summary:
+ // an object that makes a node moveable
+ // node: Node
+ // a node (or node's id) to be moved
+ // params: dojo.dnd.move.__constrainedMoveableArgs?
+ // an optional object with additional parameters;
+ // the rest is passed to the base class
+ if(!params){ params = {}; }
+ this.constraints = params.constraints;
+ this.within = params.within;
+ },
+ onFirstMove: function(/* dojo.dnd.Mover */ mover){
+ // summary:
+ // called during the very first move notification;
+ // can be used to initialize coordinates, can be overwritten.
+ var c = this.constraintBox = this.constraints.call(this, mover);
+ c.r = c.l + c.w;
+ c.b = c.t + c.h;
+ if(this.within){
+ var mb = dojo._getMarginSize(mover.node);
+ c.r -= mb.w;
+ c.b -= mb.h;
+ }
+ },
+ onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+ // summary:
+ // called during every move notification;
+ // should actually move the node; can be overwritten.
+ var c = this.constraintBox, s = mover.node.style;
+ this.onMoving(mover, leftTop);
+ leftTop.l = leftTop.l < c.l ? c.l : c.r < leftTop.l ? c.r : leftTop.l;
+ leftTop.t = leftTop.t < c.t ? c.t : c.b < leftTop.t ? c.b : leftTop.t;
+ s.left = leftTop.l + "px";
+ s.top = leftTop.t + "px";
+ this.onMoved(mover, leftTop);
+ }
+});
+
+/*=====
+dojo.declare("dojo.dnd.move.__boxConstrainedMoveableArgs", [dojo.dnd.move.__constrainedMoveableArgs], {
+ // box: Object
+ // a constraint box
+ box: {}
+});
+=====*/
+
+dojo.declare("dojo.dnd.move.boxConstrainedMoveable", dojo.dnd.move.constrainedMoveable, {
+ // box:
+ // object attributes (for markup)
+ box: {},
+
+ constructor: function(node, params){
+ // summary:
+ // an object, which makes a node moveable
+ // node: Node
+ // a node (or node's id) to be moved
+ // params: dojo.dnd.move.__boxConstrainedMoveableArgs?
+ // an optional object with parameters
+ var box = params && params.box;
+ this.constraints = function(){ return box; };
+ }
+});
+
+/*=====
+dojo.declare("dojo.dnd.move.__parentConstrainedMoveableArgs", [dojo.dnd.move.__constrainedMoveableArgs], {
+ // area: String
+ // A parent's area to restrict the move.
+ // Can be "margin", "border", "padding", or "content".
+ area: ""
+});
+=====*/
+
+dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constrainedMoveable, {
+ // area:
+ // object attributes (for markup)
+ area: "content",
+
+ constructor: function(node, params){
+ // summary:
+ // an object, which makes a node moveable
+ // node: Node
+ // a node (or node's id) to be moved
+ // params: dojo.dnd.move.__parentConstrainedMoveableArgs?
+ // an optional object with parameters
+ var area = params && params.area;
+ this.constraints = function(){
+ var n = this.node.parentNode,
+ s = dojo.getComputedStyle(n),
+ mb = dojo._getMarginBox(n, s);
+ if(area == "margin"){
+ return mb; // Object
+ }
+ var t = dojo._getMarginExtents(n, s);
+ mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+ if(area == "border"){
+ return mb; // Object
+ }
+ t = dojo._getBorderExtents(n, s);
+ mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+ if(area == "padding"){
+ return mb; // Object
+ }
+ t = dojo._getPadExtents(n, s);
+ mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h;
+ return mb; // Object
+ };
+ }
+});
+
+// patching functions one level up for compatibility
+
+dojo.dnd.constrainedMover = dojo.dnd.move.constrainedMover;
+dojo.dnd.boxConstrainedMover = dojo.dnd.move.boxConstrainedMover;
+dojo.dnd.parentConstrainedMover = dojo.dnd.move.parentConstrainedMover;
+
+return dojo.dnd.move;
+});
diff --git a/lib/dojo/dojo.js b/lib/dojo/dojo.js
index ef2f2fb77..65334627f 100644
--- a/lib/dojo/dojo.js
+++ b/lib/dojo/dojo.js
@@ -11,4 +11,5 @@
http://dojotoolkit.org
*/
-(function(){var _1=null;if((_1||(typeof djConfig!="undefined"&&djConfig.scopeMap))&&(typeof window!="undefined")){var _2="",_3="",_4="",_5={},_6={};_1=_1||djConfig.scopeMap;for(var i=0;i<_1.length;i++){var _7=_1[i];_2+="var "+_7[0]+" = {}; "+_7[1]+" = "+_7[0]+";"+_7[1]+"._scopeName = '"+_7[1]+"';";_3+=(i==0?"":",")+_7[0];_4+=(i==0?"":",")+_7[1];_5[_7[0]]=_7[1];_6[_7[1]]=_7[0];}eval(_2+"dojo._scopeArgs = ["+_4+"];");dojo._scopePrefixArgs=_3;dojo._scopePrefix="(function("+_3+"){";dojo._scopeSuffix="})("+_4+")";dojo._scopeMap=_5;dojo._scopeMapRev=_6;}(function(){if(typeof this["loadFirebugConsole"]=="function"){this["loadFirebugConsole"]();}else{this.console=this.console||{};var cn=["assert","count","debug","dir","dirxml","error","group","groupEnd","info","profile","profileEnd","time","timeEnd","trace","warn","log"];var i=0,tn;while((tn=cn[i++])){if(!console[tn]){(function(){var _8=tn+"";console[_8]=("log" in console)?function(){var a=Array.apply({},arguments);a.unshift(_8+":");console["log"](a.join(" "));}:function(){};console[_8]._fake=true;})();}}}if(typeof dojo=="undefined"){dojo={_scopeName:"dojo",_scopePrefix:"",_scopePrefixArgs:"",_scopeSuffix:"",_scopeMap:{},_scopeMapRev:{}};}var d=dojo;if(typeof dijit=="undefined"){dijit={_scopeName:"dijit"};}if(typeof dojox=="undefined"){dojox={_scopeName:"dojox"};}if(!d._scopeArgs){d._scopeArgs=[dojo,dijit,dojox];}d.global=this;d.config={isDebug:false,debugAtAllCosts:false};var _9=typeof djConfig!="undefined"?djConfig:typeof dojoConfig!="undefined"?dojoConfig:null;if(_9){for(var c in _9){d.config[c]=_9[c];}}dojo.locale=d.config.locale;var _a="$Rev: 24595 $".match(/\d+/);dojo.version={major:1,minor:6,patch:1,flag:"",revision:_a?+_a[0]:NaN,toString:function(){with(d.version){return major+"."+minor+"."+patch+flag+" ("+revision+")";}}};if(typeof OpenAjax!="undefined"){OpenAjax.hub.registerLibrary(dojo._scopeName,"http://dojotoolkit.org",d.version.toString());}var _b,_c,_d={};for(var i in {toString:1}){_b=[];break;}dojo._extraNames=_b=_b||["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];_c=_b.length;dojo._mixin=function(_e,_f){var _10,s,i;for(_10 in _f){s=_f[_10];if(!(_10 in _e)||(_e[_10]!==s&&(!(_10 in _d)||_d[_10]!==s))){_e[_10]=s;}}if(_c&&_f){for(i=0;i<_c;++i){_10=_b[i];s=_f[_10];if(!(_10 in _e)||(_e[_10]!==s&&(!(_10 in _d)||_d[_10]!==s))){_e[_10]=s;}}}return _e;};dojo.mixin=function(obj,_11){if(!obj){obj={};}for(var i=1,l=arguments.length;i<l;i++){d._mixin(obj,arguments[i]);}return obj;};dojo._getProp=function(_12,_13,_14){var obj=_14||d.global;for(var i=0,p;obj&&(p=_12[i]);i++){if(i==0&&d._scopeMap[p]){p=d._scopeMap[p];}obj=(p in obj?obj[p]:(_13?obj[p]={}:undefined));}return obj;};dojo.setObject=function(_15,_16,_17){var _18=_15.split("."),p=_18.pop(),obj=d._getProp(_18,true,_17);return obj&&p?(obj[p]=_16):undefined;};dojo.getObject=function(_19,_1a,_1b){return d._getProp(_19.split("."),_1a,_1b);};dojo.exists=function(_1c,obj){return d.getObject(_1c,false,obj)!==undefined;};dojo["eval"]=function(_1d){return d.global.eval?d.global.eval(_1d):eval(_1d);};d.deprecated=d.experimental=function(){};})();(function(){var d=dojo,_1e;d.mixin(d,{_loadedModules:{},_inFlightCount:0,_hasResource:{},_modulePrefixes:{dojo:{name:"dojo",value:"."},doh:{name:"doh",value:"../util/doh"},tests:{name:"tests",value:"tests"}},_moduleHasPrefix:function(_1f){var mp=d._modulePrefixes;return !!(mp[_1f]&&mp[_1f].value);},_getModulePrefix:function(_20){var mp=d._modulePrefixes;if(d._moduleHasPrefix(_20)){return mp[_20].value;}return _20;},_loadedUrls:[],_postLoad:false,_loaders:[],_unloaders:[],_loadNotifying:false});dojo._loadPath=function(_21,_22,cb){var uri=((_21.charAt(0)=="/"||_21.match(/^\w+:/))?"":d.baseUrl)+_21;try{_1e=_22;return !_22?d._loadUri(uri,cb):d._loadUriAndCheck(uri,_22,cb);}catch(e){console.error(e);return false;}finally{_1e=null;}};dojo._loadUri=function(uri,cb){if(d._loadedUrls[uri]){return true;}d._inFlightCount++;var _23=d._getText(uri,true);if(_23){d._loadedUrls[uri]=true;d._loadedUrls.push(uri);if(cb){_23=/^define\(/.test(_23)?_23:"("+_23+")";}else{_23=d._scopePrefix+_23+d._scopeSuffix;}if(!d.isIE){_23+="\r\n//@ sourceURL="+uri;}var _24=d["eval"](_23);if(cb){cb(_24);}}if(--d._inFlightCount==0&&d._postLoad&&d._loaders.length){setTimeout(function(){if(d._inFlightCount==0){d._callLoaded();}},0);}return !!_23;};dojo._loadUriAndCheck=function(uri,_25,cb){var ok=false;try{ok=d._loadUri(uri,cb);}catch(e){console.error("failed loading "+uri+" with error: "+e);}return !!(ok&&d._loadedModules[_25]);};dojo.loaded=function(){d._loadNotifying=true;d._postLoad=true;var mll=d._loaders;d._loaders=[];for(var x=0;x<mll.length;x++){mll[x]();}d._loadNotifying=false;if(d._postLoad&&d._inFlightCount==0&&mll.length){d._callLoaded();}};dojo.unloaded=function(){var mll=d._unloaders;while(mll.length){(mll.pop())();}};d._onto=function(arr,obj,fn){if(!fn){arr.push(obj);}else{if(fn){var _26=(typeof fn=="string")?obj[fn]:fn;arr.push(function(){_26.call(obj);});}}};dojo.ready=dojo.addOnLoad=function(obj,_27){d._onto(d._loaders,obj,_27);if(d._postLoad&&d._inFlightCount==0&&!d._loadNotifying){d._callLoaded();}};var dca=d.config.addOnLoad;if(dca){d.addOnLoad[(dca instanceof Array?"apply":"call")](d,dca);}dojo._modulesLoaded=function(){if(d._postLoad){return;}if(d._inFlightCount>0){console.warn("files still in flight!");return;}d._callLoaded();};dojo._callLoaded=function(){if(typeof setTimeout=="object"||(d.config.useXDomain&&d.isOpera)){setTimeout(d.isAIR?function(){d.loaded();}:d._scopeName+".loaded();",0);}else{d.loaded();}};dojo._getModuleSymbols=function(_28){var _29=_28.split(".");for(var i=_29.length;i>0;i--){var _2a=_29.slice(0,i).join(".");if(i==1&&!d._moduleHasPrefix(_2a)){_29[0]="../"+_29[0];}else{var _2b=d._getModulePrefix(_2a);if(_2b!=_2a){_29.splice(0,i,_2b);break;}}}return _29;};dojo._global_omit_module_check=false;dojo.loadInit=function(_2c){_2c();};dojo._loadModule=dojo.require=function(_2d,_2e){_2e=d._global_omit_module_check||_2e;var _2f=d._loadedModules[_2d];if(_2f){return _2f;}var _30=d._getModuleSymbols(_2d).join("/")+".js";var _31=!_2e?_2d:null;var ok=d._loadPath(_30,_31);if(!ok&&!_2e){throw new Error("Could not load '"+_2d+"'; last tried '"+_30+"'");}if(!_2e&&!d._isXDomain){_2f=d._loadedModules[_2d];if(!_2f){throw new Error("symbol '"+_2d+"' is not defined after loading '"+_30+"'");}}return _2f;};dojo.provide=function(_32){_32=_32+"";return (d._loadedModules[_32]=d.getObject(_32,true));};dojo.platformRequire=function(_33){var _34=_33.common||[];var _35=_34.concat(_33[d._name]||_33["default"]||[]);for(var x=0;x<_35.length;x++){var _36=_35[x];if(_36.constructor==Array){d._loadModule.apply(d,_36);}else{d._loadModule(_36);}}};dojo.requireIf=function(_37,_38){if(_37===true){var _39=[];for(var i=1;i<arguments.length;i++){_39.push(arguments[i]);}d.require.apply(d,_39);}};dojo.requireAfterIf=d.requireIf;dojo.registerModulePath=function(_3a,_3b){d._modulePrefixes[_3a]={name:_3a,value:_3b};};dojo.requireLocalization=function(_3c,_3d,_3e,_3f){d.require("dojo.i18n");d.i18n._requireLocalization.apply(d.hostenv,arguments);};var ore=new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),ire=new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$");dojo._Url=function(){var n=null,_40=arguments,uri=[_40[0]];for(var i=1;i<_40.length;i++){if(!_40[i]){continue;}var _41=new d._Url(_40[i]+""),_42=new d._Url(uri[0]+"");if(_41.path==""&&!_41.scheme&&!_41.authority&&!_41.query){if(_41.fragment!=n){_42.fragment=_41.fragment;}_41=_42;}else{if(!_41.scheme){_41.scheme=_42.scheme;if(!_41.authority){_41.authority=_42.authority;if(_41.path.charAt(0)!="/"){var _43=_42.path.substring(0,_42.path.lastIndexOf("/")+1)+_41.path;var _44=_43.split("/");for(var j=0;j<_44.length;j++){if(_44[j]=="."){if(j==_44.length-1){_44[j]="";}else{_44.splice(j,1);j--;}}else{if(j>0&&!(j==1&&_44[0]=="")&&_44[j]==".."&&_44[j-1]!=".."){if(j==(_44.length-1)){_44.splice(j,1);_44[j-1]="";}else{_44.splice(j-1,2);j-=2;}}}}_41.path=_44.join("/");}}}}uri=[];if(_41.scheme){uri.push(_41.scheme,":");}if(_41.authority){uri.push("//",_41.authority);}uri.push(_41.path);if(_41.query){uri.push("?",_41.query);}if(_41.fragment){uri.push("#",_41.fragment);}}this.uri=uri.join("");var r=this.uri.match(ore);this.scheme=r[2]||(r[1]?"":n);this.authority=r[4]||(r[3]?"":n);this.path=r[5];this.query=r[7]||(r[6]?"":n);this.fragment=r[9]||(r[8]?"":n);if(this.authority!=n){r=this.authority.match(ire);this.user=r[3]||n;this.password=r[4]||n;this.host=r[6]||r[7];this.port=r[9]||n;}};dojo._Url.prototype.toString=function(){return this.uri;};dojo.moduleUrl=function(_45,url){var loc=d._getModuleSymbols(_45).join("/");if(!loc){return null;}if(loc.lastIndexOf("/")!=loc.length-1){loc+="/";}var _46=loc.indexOf(":");if(loc.charAt(0)!="/"&&(_46==-1||_46>loc.indexOf("/"))){loc=d.baseUrl+loc;}return new d._Url(loc,url);};})();if(typeof window!="undefined"){dojo.isBrowser=true;dojo._name="browser";(function(){var d=dojo;if(document&&document.getElementsByTagName){var _47=document.getElementsByTagName("script");var _48=/dojo(\.xd)?\.js(\W|$)/i;for(var i=0;i<_47.length;i++){var src=_47[i].getAttribute("src");if(!src){continue;}var m=src.match(_48);if(m){if(!d.config.baseUrl){d.config.baseUrl=src.substring(0,m.index);}var cfg=(_47[i].getAttribute("djConfig")||_47[i].getAttribute("data-dojo-config"));if(cfg){var _49=eval("({ "+cfg+" })");for(var x in _49){dojo.config[x]=_49[x];}}break;}}}d.baseUrl=d.config.baseUrl;var n=navigator;var dua=n.userAgent,dav=n.appVersion,tv=parseFloat(dav);if(dua.indexOf("Opera")>=0){d.isOpera=tv;}if(dua.indexOf("AdobeAIR")>=0){d.isAIR=1;}d.isKhtml=(dav.indexOf("Konqueror")>=0)?tv:0;d.isWebKit=parseFloat(dua.split("WebKit/")[1])||undefined;d.isChrome=parseFloat(dua.split("Chrome/")[1])||undefined;d.isMac=dav.indexOf("Macintosh")>=0;var _4a=Math.max(dav.indexOf("WebKit"),dav.indexOf("Safari"),0);if(_4a&&!dojo.isChrome){d.isSafari=parseFloat(dav.split("Version/")[1]);if(!d.isSafari||parseFloat(dav.substr(_4a+7))<=419.3){d.isSafari=2;}}if(dua.indexOf("Gecko")>=0&&!d.isKhtml&&!d.isWebKit){d.isMozilla=d.isMoz=tv;}if(d.isMoz){d.isFF=parseFloat(dua.split("Firefox/")[1]||dua.split("Minefield/")[1])||undefined;}if(document.all&&!d.isOpera){d.isIE=parseFloat(dav.split("MSIE ")[1])||undefined;var _4b=document.documentMode;if(_4b&&_4b!=5&&Math.floor(d.isIE)!=_4b){d.isIE=_4b;}}if(dojo.isIE&&window.location.protocol==="file:"){dojo.config.ieForceActiveXXhr=true;}d.isQuirks=document.compatMode=="BackCompat";d.locale=dojo.config.locale||(d.isIE?n.userLanguage:n.language).toLowerCase();d._XMLHTTP_PROGIDS=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"];d._xhrObj=function(){var _4c,_4d;if(!dojo.isIE||!dojo.config.ieForceActiveXXhr){try{_4c=new XMLHttpRequest();}catch(e){}}if(!_4c){for(var i=0;i<3;++i){var _4e=d._XMLHTTP_PROGIDS[i];try{_4c=new ActiveXObject(_4e);}catch(e){_4d=e;}if(_4c){d._XMLHTTP_PROGIDS=[_4e];break;}}}if(!_4c){throw new Error("XMLHTTP not available: "+_4d);}return _4c;};d._isDocumentOk=function(_4f){var _50=_4f.status||0,lp=location.protocol;return (_50>=200&&_50<300)||_50==304||_50==1223||(!_50&&(lp=="file:"||lp=="chrome:"||lp=="chrome-extension:"||lp=="app:"));};var _51=window.location+"";var _52=document.getElementsByTagName("base");var _53=(_52&&_52.length>0);d._getText=function(uri,_54){var _55=d._xhrObj();if(!_53&&dojo._Url){uri=(new dojo._Url(_51,uri)).toString();}if(d.config.cacheBust){uri+="";uri+=(uri.indexOf("?")==-1?"?":"&")+String(d.config.cacheBust).replace(/\W+/g,"");}_55.open("GET",uri,false);try{_55.send(null);if(!d._isDocumentOk(_55)){var err=Error("Unable to load "+uri+" status:"+_55.status);err.status=_55.status;err.responseText=_55.responseText;throw err;}}catch(e){if(_54){return null;}throw e;}return _55.responseText;};var _56=window;var _57=function(_58,fp){var _59=_56.attachEvent||_56.addEventListener;_58=_56.attachEvent?_58:_58.substring(2);_59(_58,function(){fp.apply(_56,arguments);},false);};d._windowUnloaders=[];d.windowUnloaded=function(){var mll=d._windowUnloaders;while(mll.length){(mll.pop())();}d=null;};var _5a=0;d.addOnWindowUnload=function(obj,_5b){d._onto(d._windowUnloaders,obj,_5b);if(!_5a){_5a=1;_57("onunload",d.windowUnloaded);}};var _5c=0;d.addOnUnload=function(obj,_5d){d._onto(d._unloaders,obj,_5d);if(!_5c){_5c=1;_57("onbeforeunload",dojo.unloaded);}};})();dojo._initFired=false;dojo._loadInit=function(e){if(dojo._scrollIntervalId){clearInterval(dojo._scrollIntervalId);dojo._scrollIntervalId=0;}if(!dojo._initFired){dojo._initFired=true;if(!dojo.config.afterOnLoad&&window.detachEvent){window.detachEvent("onload",dojo._loadInit);}if(dojo._inFlightCount==0){dojo._modulesLoaded();}}};if(!dojo.config.afterOnLoad){if(document.addEventListener){document.addEventListener("DOMContentLoaded",dojo._loadInit,false);window.addEventListener("load",dojo._loadInit,false);}else{if(window.attachEvent){window.attachEvent("onload",dojo._loadInit);if(!dojo.config.skipIeDomLoaded&&self===self.top){dojo._scrollIntervalId=setInterval(function(){try{if(document.body){document.documentElement.doScroll("left");dojo._loadInit();}}catch(e){}},30);}}}}if(dojo.isIE){try{(function(){document.namespaces.add("v","urn:schemas-microsoft-com:vml");var _5e=["*","group","roundrect","oval","shape","rect","imagedata","path","textpath","text"],i=0,l=1,s=document.createStyleSheet();if(dojo.isIE>=8){i=1;l=_5e.length;}for(;i<l;++i){s.addRule("v\\:"+_5e[i],"behavior:url(#default#VML); display:inline-block");}})();}catch(e){}}}(function(){var mp=dojo.config["modulePaths"];if(mp){for(var _5f in mp){dojo.registerModulePath(_5f,mp[_5f]);}}})();if(dojo.config.isDebug){dojo.require("dojo._firebug.firebug");}if(dojo.config.debugAtAllCosts){dojo.require("dojo._base._loader.loader_debug");dojo.require("dojo.i18n");}if(!dojo._hasResource["dojo._base.lang"]){dojo._hasResource["dojo._base.lang"]=true;dojo.provide("dojo._base.lang");(function(){var d=dojo,_60=Object.prototype.toString;dojo.isString=function(it){return (typeof it=="string"||it instanceof String);};dojo.isArray=function(it){return it&&(it instanceof Array||typeof it=="array");};dojo.isFunction=function(it){return _60.call(it)==="[object Function]";};dojo.isObject=function(it){return it!==undefined&&(it===null||typeof it=="object"||d.isArray(it)||d.isFunction(it));};dojo.isArrayLike=function(it){return it&&it!==undefined&&!d.isString(it)&&!d.isFunction(it)&&!(it.tagName&&it.tagName.toLowerCase()=="form")&&(d.isArray(it)||isFinite(it.length));};dojo.isAlien=function(it){return it&&!d.isFunction(it)&&/\{\s*\[native code\]\s*\}/.test(String(it));};dojo.extend=function(_61,_62){for(var i=1,l=arguments.length;i<l;i++){d._mixin(_61.prototype,arguments[i]);}return _61;};dojo._hitchArgs=function(_63,_64){var pre=d._toArray(arguments,2);var _65=d.isString(_64);return function(){var _66=d._toArray(arguments);var f=_65?(_63||d.global)[_64]:_64;return f&&f.apply(_63||this,pre.concat(_66));};};dojo.hitch=function(_67,_68){if(arguments.length>2){return d._hitchArgs.apply(d,arguments);}if(!_68){_68=_67;_67=null;}if(d.isString(_68)){_67=_67||d.global;if(!_67[_68]){throw (["dojo.hitch: scope[\"",_68,"\"] is null (scope=\"",_67,"\")"].join(""));}return function(){return _67[_68].apply(_67,arguments||[]);};}return !_67?_68:function(){return _68.apply(_67,arguments||[]);};};dojo.delegate=dojo._delegate=(function(){function TMP(){};return function(obj,_69){TMP.prototype=obj;var tmp=new TMP();TMP.prototype=null;if(_69){d._mixin(tmp,_69);}return tmp;};})();var _6a=function(obj,_6b,_6c){return (_6c||[]).concat(Array.prototype.slice.call(obj,_6b||0));};var _6d=function(obj,_6e,_6f){var arr=_6f||[];for(var x=_6e||0;x<obj.length;x++){arr.push(obj[x]);}return arr;};dojo._toArray=d.isIE?function(obj){return ((obj.item)?_6d:_6a).apply(this,arguments);}:_6a;dojo.partial=function(_70){var arr=[null];return d.hitch.apply(d,arr.concat(d._toArray(arguments)));};var _71=d._extraNames,_72=_71.length,_73={};dojo.clone=function(o){if(!o||typeof o!="object"||d.isFunction(o)){return o;}if(o.nodeType&&"cloneNode" in o){return o.cloneNode(true);}if(o instanceof Date){return new Date(o.getTime());}if(o instanceof RegExp){return new RegExp(o);}var r,i,l,s,_74;if(d.isArray(o)){r=[];for(i=0,l=o.length;i<l;++i){if(i in o){r.push(d.clone(o[i]));}}}else{r=o.constructor?new o.constructor():{};}for(_74 in o){s=o[_74];if(!(_74 in r)||(r[_74]!==s&&(!(_74 in _73)||_73[_74]!==s))){r[_74]=d.clone(s);}}if(_72){for(i=0;i<_72;++i){_74=_71[i];s=o[_74];if(!(_74 in r)||(r[_74]!==s&&(!(_74 in _73)||_73[_74]!==s))){r[_74]=s;}}}return r;};dojo.trim=String.prototype.trim?function(str){return str.trim();}:function(str){return str.replace(/^\s\s*/,"").replace(/\s\s*$/,"");};var _75=/\{([^\}]+)\}/g;dojo.replace=function(_76,map,_77){return _76.replace(_77||_75,d.isFunction(map)?map:function(_78,k){return d.getObject(k,false,map);});};})();}if(!dojo._hasResource["dojo._base.array"]){dojo._hasResource["dojo._base.array"]=true;dojo.provide("dojo._base.array");(function(){var _79=function(arr,obj,cb){return [(typeof arr=="string")?arr.split(""):arr,obj||dojo.global,(typeof cb=="string")?new Function("item","index","array",cb):cb];};var _7a=function(_7b,arr,_7c,_7d){var _7e=_79(arr,_7d,_7c);arr=_7e[0];for(var i=0,l=arr.length;i<l;++i){var _7f=!!_7e[2].call(_7e[1],arr[i],i,arr);if(_7b^_7f){return _7f;}}return _7b;};dojo.mixin(dojo,{indexOf:function(_80,_81,_82,_83){var _84=1,end=_80.length||0,i=0;if(_83){i=end-1;_84=end=-1;}if(_82!=undefined){i=_82;}if((_83&&i>end)||i<end){for(;i!=end;i+=_84){if(_80[i]==_81){return i;}}}return -1;},lastIndexOf:function(_85,_86,_87){return dojo.indexOf(_85,_86,_87,true);},forEach:function(arr,_88,_89){if(!arr||!arr.length){return;}var _8a=_79(arr,_89,_88);arr=_8a[0];for(var i=0,l=arr.length;i<l;++i){_8a[2].call(_8a[1],arr[i],i,arr);}},every:function(arr,_8b,_8c){return _7a(true,arr,_8b,_8c);},some:function(arr,_8d,_8e){return _7a(false,arr,_8d,_8e);},map:function(arr,_8f,_90){var _91=_79(arr,_90,_8f);arr=_91[0];var _92=(arguments[3]?(new arguments[3]()):[]);for(var i=0,l=arr.length;i<l;++i){_92.push(_91[2].call(_91[1],arr[i],i,arr));}return _92;},filter:function(arr,_93,_94){var _95=_79(arr,_94,_93);arr=_95[0];var _96=[];for(var i=0,l=arr.length;i<l;++i){if(_95[2].call(_95[1],arr[i],i,arr)){_96.push(arr[i]);}}return _96;}});})();}if(!dojo._hasResource["dojo._base.declare"]){dojo._hasResource["dojo._base.declare"]=true;dojo.provide("dojo._base.declare");(function(){var d=dojo,mix=d._mixin,op=Object.prototype,_97=op.toString,_98=new Function,_99=0,_9a="constructor";function err(msg,cls){throw new Error("declare"+(cls?" "+cls:"")+": "+msg);};function _9b(_9c,_9d){var _9e=[],_9f=[{cls:0,refs:[]}],_a0={},_a1=1,l=_9c.length,i=0,j,lin,_a2,top,_a3,rec,_a4,_a5;for(;i<l;++i){_a2=_9c[i];if(!_a2){err("mixin #"+i+" is unknown. Did you use dojo.require to pull it in?",_9d);}else{if(_97.call(_a2)!="[object Function]"){err("mixin #"+i+" is not a callable constructor.",_9d);}}lin=_a2._meta?_a2._meta.bases:[_a2];top=0;for(j=lin.length-1;j>=0;--j){_a3=lin[j].prototype;if(!_a3.hasOwnProperty("declaredClass")){_a3.declaredClass="uniqName_"+(_99++);}_a4=_a3.declaredClass;if(!_a0.hasOwnProperty(_a4)){_a0[_a4]={count:0,refs:[],cls:lin[j]};++_a1;}rec=_a0[_a4];if(top&&top!==rec){rec.refs.push(top);++top.count;}top=rec;}++top.count;_9f[0].refs.push(top);}while(_9f.length){top=_9f.pop();_9e.push(top.cls);--_a1;while(_a5=top.refs,_a5.length==1){top=_a5[0];if(!top||--top.count){top=0;break;}_9e.push(top.cls);--_a1;}if(top){for(i=0,l=_a5.length;i<l;++i){top=_a5[i];if(!--top.count){_9f.push(top);}}}}if(_a1){err("can't build consistent linearization",_9d);}_a2=_9c[0];_9e[0]=_a2?_a2._meta&&_a2===_9e[_9e.length-_a2._meta.bases.length]?_a2._meta.bases.length:1:0;return _9e;};function _a6(_a7,a,f){var _a8,_a9,_aa,_ab,_ac,_ad,_ae,opf,pos,_af=this._inherited=this._inherited||{};if(typeof _a7=="string"){_a8=_a7;_a7=a;a=f;}f=0;_ab=_a7.callee;_a8=_a8||_ab.nom;if(!_a8){err("can't deduce a name to call inherited()",this.declaredClass);}_ac=this.constructor._meta;_aa=_ac.bases;pos=_af.p;if(_a8!=_9a){if(_af.c!==_ab){pos=0;_ad=_aa[0];_ac=_ad._meta;if(_ac.hidden[_a8]!==_ab){_a9=_ac.chains;if(_a9&&typeof _a9[_a8]=="string"){err("calling chained method with inherited: "+_a8,this.declaredClass);}do{_ac=_ad._meta;_ae=_ad.prototype;if(_ac&&(_ae[_a8]===_ab&&_ae.hasOwnProperty(_a8)||_ac.hidden[_a8]===_ab)){break;}}while(_ad=_aa[++pos]);pos=_ad?pos:-1;}}_ad=_aa[++pos];if(_ad){_ae=_ad.prototype;if(_ad._meta&&_ae.hasOwnProperty(_a8)){f=_ae[_a8];}else{opf=op[_a8];do{_ae=_ad.prototype;f=_ae[_a8];if(f&&(_ad._meta?_ae.hasOwnProperty(_a8):f!==opf)){break;}}while(_ad=_aa[++pos]);}}f=_ad&&f||op[_a8];}else{if(_af.c!==_ab){pos=0;_ac=_aa[0]._meta;if(_ac&&_ac.ctor!==_ab){_a9=_ac.chains;if(!_a9||_a9.constructor!=="manual"){err("calling chained constructor with inherited",this.declaredClass);}while(_ad=_aa[++pos]){_ac=_ad._meta;if(_ac&&_ac.ctor===_ab){break;}}pos=_ad?pos:-1;}}while(_ad=_aa[++pos]){_ac=_ad._meta;f=_ac?_ac.ctor:_ad;if(f){break;}}f=_ad&&f;}_af.c=f;_af.p=pos;if(f){return a===true?f:f.apply(this,a||_a7);}};function _b0(_b1,_b2){if(typeof _b1=="string"){return this.inherited(_b1,_b2,true);}return this.inherited(_b1,true);};function _b3(cls){var _b4=this.constructor._meta.bases;for(var i=0,l=_b4.length;i<l;++i){if(_b4[i]===cls){return true;}}return this instanceof cls;};function _b5(_b6,_b7){var _b8,i=0,l=d._extraNames.length;for(_b8 in _b7){if(_b8!=_9a&&_b7.hasOwnProperty(_b8)){_b6[_b8]=_b7[_b8];}}for(;i<l;++i){_b8=d._extraNames[i];if(_b8!=_9a&&_b7.hasOwnProperty(_b8)){_b6[_b8]=_b7[_b8];}}};function _b9(_ba,_bb){var _bc,t,i=0,l=d._extraNames.length;for(_bc in _bb){t=_bb[_bc];if((t!==op[_bc]||!(_bc in op))&&_bc!=_9a){if(_97.call(t)=="[object Function]"){t.nom=_bc;}_ba[_bc]=t;}}for(;i<l;++i){_bc=d._extraNames[i];t=_bb[_bc];if((t!==op[_bc]||!(_bc in op))&&_bc!=_9a){if(_97.call(t)=="[object Function]"){t.nom=_bc;}_ba[_bc]=t;}}return _ba;};function _bd(_be){_b9(this.prototype,_be);return this;};function _bf(_c0,_c1){return function(){var a=arguments,_c2=a,a0=a[0],f,i,m,l=_c0.length,_c3;if(!(this instanceof a.callee)){return _c4(a);}if(_c1&&(a0&&a0.preamble||this.preamble)){_c3=new Array(_c0.length);_c3[0]=a;for(i=0;;){a0=a[0];if(a0){f=a0.preamble;if(f){a=f.apply(this,a)||a;}}f=_c0[i].prototype;f=f.hasOwnProperty("preamble")&&f.preamble;if(f){a=f.apply(this,a)||a;}if(++i==l){break;}_c3[i]=a;}}for(i=l-1;i>=0;--i){f=_c0[i];m=f._meta;f=m?m.ctor:f;if(f){f.apply(this,_c3?_c3[i]:a);}}f=this.postscript;if(f){f.apply(this,_c2);}};};function _c5(_c6,_c7){return function(){var a=arguments,t=a,a0=a[0],f;if(!(this instanceof a.callee)){return _c4(a);}if(_c7){if(a0){f=a0.preamble;if(f){t=f.apply(this,t)||t;}}f=this.preamble;if(f){f.apply(this,t);}}if(_c6){_c6.apply(this,a);}f=this.postscript;if(f){f.apply(this,a);}};};function _c8(_c9){return function(){var a=arguments,i=0,f,m;if(!(this instanceof a.callee)){return _c4(a);}for(;f=_c9[i];++i){m=f._meta;f=m?m.ctor:f;if(f){f.apply(this,a);break;}}f=this.postscript;if(f){f.apply(this,a);}};};function _ca(_cb,_cc,_cd){return function(){var b,m,f,i=0,_ce=1;if(_cd){i=_cc.length-1;_ce=-1;}for(;b=_cc[i];i+=_ce){m=b._meta;f=(m?m.hidden:b.prototype)[_cb];if(f){f.apply(this,arguments);}}};};function _cf(_d0){_98.prototype=_d0.prototype;var t=new _98;_98.prototype=null;return t;};function _c4(_d1){var _d2=_d1.callee,t=_cf(_d2);_d2.apply(t,_d1);return t;};d.declare=function(_d3,_d4,_d5){if(typeof _d3!="string"){_d5=_d4;_d4=_d3;_d3="";}_d5=_d5||{};var _d6,i,t,_d7,_d8,_d9,_da,_db=1,_dc=_d4;if(_97.call(_d4)=="[object Array]"){_d9=_9b(_d4,_d3);t=_d9[0];_db=_d9.length-t;_d4=_d9[_db];}else{_d9=[0];if(_d4){if(_97.call(_d4)=="[object Function]"){t=_d4._meta;_d9=_d9.concat(t?t.bases:_d4);}else{err("base class is not a callable constructor.",_d3);}}else{if(_d4!==null){err("unknown base class. Did you use dojo.require to pull it in?",_d3);}}}if(_d4){for(i=_db-1;;--i){_d6=_cf(_d4);if(!i){break;}t=_d9[i];(t._meta?_b5:mix)(_d6,t.prototype);_d7=new Function;_d7.superclass=_d4;_d7.prototype=_d6;_d4=_d6.constructor=_d7;}}else{_d6={};}_b9(_d6,_d5);t=_d5.constructor;if(t!==op.constructor){t.nom=_9a;_d6.constructor=t;}for(i=_db-1;i;--i){t=_d9[i]._meta;if(t&&t.chains){_da=mix(_da||{},t.chains);}}if(_d6["-chains-"]){_da=mix(_da||{},_d6["-chains-"]);}t=!_da||!_da.hasOwnProperty(_9a);_d9[0]=_d7=(_da&&_da.constructor==="manual")?_c8(_d9):(_d9.length==1?_c5(_d5.constructor,t):_bf(_d9,t));_d7._meta={bases:_d9,hidden:_d5,chains:_da,parents:_dc,ctor:_d5.constructor};_d7.superclass=_d4&&_d4.prototype;_d7.extend=_bd;_d7.prototype=_d6;_d6.constructor=_d7;_d6.getInherited=_b0;_d6.inherited=_a6;_d6.isInstanceOf=_b3;if(_d3){_d6.declaredClass=_d3;d.setObject(_d3,_d7);}if(_da){for(_d8 in _da){if(_d6[_d8]&&typeof _da[_d8]=="string"&&_d8!=_9a){t=_d6[_d8]=_ca(_d8,_d9,_da[_d8]==="after");t.nom=_d8;}}}return _d7;};d.safeMixin=_b9;})();}if(!dojo._hasResource["dojo._base.connect"]){dojo._hasResource["dojo._base.connect"]=true;dojo.provide("dojo._base.connect");dojo._listener={getDispatcher:function(){return function(){var ap=Array.prototype,c=arguments.callee,ls=c._listeners,t=c.target,r=t&&t.apply(this,arguments),i,lls=[].concat(ls);for(i in lls){if(!(i in ap)){lls[i].apply(this,arguments);}}return r;};},add:function(_dd,_de,_df){_dd=_dd||dojo.global;var f=_dd[_de];if(!f||!f._listeners){var d=dojo._listener.getDispatcher();d.target=f;d._listeners=[];f=_dd[_de]=d;}return f._listeners.push(_df);},remove:function(_e0,_e1,_e2){var f=(_e0||dojo.global)[_e1];if(f&&f._listeners&&_e2--){delete f._listeners[_e2];}}};dojo.connect=function(obj,_e3,_e4,_e5,_e6){var a=arguments,_e7=[],i=0;_e7.push(dojo.isString(a[0])?null:a[i++],a[i++]);var a1=a[i+1];_e7.push(dojo.isString(a1)||dojo.isFunction(a1)?a[i++]:null,a[i++]);for(var l=a.length;i<l;i++){_e7.push(a[i]);}return dojo._connect.apply(this,_e7);};dojo._connect=function(obj,_e8,_e9,_ea){var l=dojo._listener,h=l.add(obj,_e8,dojo.hitch(_e9,_ea));return [obj,_e8,h,l];};dojo.disconnect=function(_eb){if(_eb&&_eb[0]!==undefined){dojo._disconnect.apply(this,_eb);delete _eb[0];}};dojo._disconnect=function(obj,_ec,_ed,_ee){_ee.remove(obj,_ec,_ed);};dojo._topics={};dojo.subscribe=function(_ef,_f0,_f1){return [_ef,dojo._listener.add(dojo._topics,_ef,dojo.hitch(_f0,_f1))];};dojo.unsubscribe=function(_f2){if(_f2){dojo._listener.remove(dojo._topics,_f2[0],_f2[1]);}};dojo.publish=function(_f3,_f4){var f=dojo._topics[_f3];if(f){f.apply(this,_f4||[]);}};dojo.connectPublisher=function(_f5,obj,_f6){var pf=function(){dojo.publish(_f5,arguments);};return _f6?dojo.connect(obj,_f6,pf):dojo.connect(obj,pf);};}if(!dojo._hasResource["dojo._base.Deferred"]){dojo._hasResource["dojo._base.Deferred"]=true;dojo.provide("dojo._base.Deferred");(function(){var _f7=function(){};var _f8=Object.freeze||function(){};dojo.Deferred=function(_f9){var _fa,_fb,_fc,_fd,_fe;var _ff=(this.promise={});function _100(_101){if(_fb){throw new Error("This deferred has already been resolved");}_fa=_101;_fb=true;_102();};function _102(){var _103;while(!_103&&_fe){var _104=_fe;_fe=_fe.next;if((_103=(_104.progress==_f7))){_fb=false;}var func=(_fc?_104.error:_104.resolved);if(func){try{var _105=func(_fa);if(_105&&typeof _105.then==="function"){_105.then(dojo.hitch(_104.deferred,"resolve"),dojo.hitch(_104.deferred,"reject"));continue;}var _106=_103&&_105===undefined;if(_103&&!_106){_fc=_105 instanceof Error;}_104.deferred[_106&&_fc?"reject":"resolve"](_106?_fa:_105);}catch(e){_104.deferred.reject(e);}}else{if(_fc){_104.deferred.reject(_fa);}else{_104.deferred.resolve(_fa);}}}};this.resolve=this.callback=function(_107){this.fired=0;this.results=[_107,null];_100(_107);};this.reject=this.errback=function(_108){_fc=true;this.fired=1;_100(_108);this.results=[null,_108];if(!_108||_108.log!==false){(dojo.config.deferredOnError||function(x){console.error(x);})(_108);}};this.progress=function(_109){var _10a=_fe;while(_10a){var _10b=_10a.progress;_10b&&_10b(_109);_10a=_10a.next;}};this.addCallbacks=function(_10c,_10d){this.then(_10c,_10d,_f7);return this;};this.then=_ff.then=function(_10e,_10f,_110){var _111=_110==_f7?this:new dojo.Deferred(_ff.cancel);var _112={resolved:_10e,error:_10f,progress:_110,deferred:_111};if(_fe){_fd=_fd.next=_112;}else{_fe=_fd=_112;}if(_fb){_102();}return _111.promise;};var _113=this;this.cancel=_ff.cancel=function(){if(!_fb){var _114=_f9&&_f9(_113);if(!_fb){if(!(_114 instanceof Error)){_114=new Error(_114);}_114.log=false;_113.reject(_114);}}};_f8(_ff);};dojo.extend(dojo.Deferred,{addCallback:function(_115){return this.addCallbacks(dojo.hitch.apply(dojo,arguments));},addErrback:function(_116){return this.addCallbacks(null,dojo.hitch.apply(dojo,arguments));},addBoth:function(_117){var _118=dojo.hitch.apply(dojo,arguments);return this.addCallbacks(_118,_118);},fired:-1});})();dojo.when=function(_119,_11a,_11b,_11c){if(_119&&typeof _119.then==="function"){return _119.then(_11a,_11b,_11c);}return _11a(_119);};}if(!dojo._hasResource["dojo._base.json"]){dojo._hasResource["dojo._base.json"]=true;dojo.provide("dojo._base.json");dojo.fromJson=function(json){return eval("("+json+")");};dojo._escapeString=function(str){return ("\""+str.replace(/(["\\])/g,"\\$1")+"\"").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");};dojo.toJsonIndentStr="\t";dojo.toJson=function(it,_11d,_11e){if(it===undefined){return "undefined";}var _11f=typeof it;if(_11f=="number"||_11f=="boolean"){return it+"";}if(it===null){return "null";}if(dojo.isString(it)){return dojo._escapeString(it);}var _120=arguments.callee;var _121;_11e=_11e||"";var _122=_11d?_11e+dojo.toJsonIndentStr:"";var tf=it.__json__||it.json;if(dojo.isFunction(tf)){_121=tf.call(it);if(it!==_121){return _120(_121,_11d,_122);}}if(it.nodeType&&it.cloneNode){throw new Error("Can't serialize DOM nodes");}var sep=_11d?" ":"";var _123=_11d?"\n":"";if(dojo.isArray(it)){var res=dojo.map(it,function(obj){var val=_120(obj,_11d,_122);if(typeof val!="string"){val="undefined";}return _123+_122+val;});return "["+res.join(","+sep)+_123+_11e+"]";}if(_11f=="function"){return null;}var _124=[],key;for(key in it){var _125,val;if(typeof key=="number"){_125="\""+key+"\"";}else{if(typeof key=="string"){_125=dojo._escapeString(key);}else{continue;}}val=_120(it[key],_11d,_122);if(typeof val!="string"){continue;}_124.push(_123+_122+_125+":"+sep+val);}return "{"+_124.join(","+sep)+_123+_11e+"}";};}if(!dojo._hasResource["dojo._base.Color"]){dojo._hasResource["dojo._base.Color"]=true;dojo.provide("dojo._base.Color");(function(){var d=dojo;dojo.Color=function(_126){if(_126){this.setColor(_126);}};dojo.Color.named={black:[0,0,0],silver:[192,192,192],gray:[128,128,128],white:[255,255,255],maroon:[128,0,0],red:[255,0,0],purple:[128,0,128],fuchsia:[255,0,255],green:[0,128,0],lime:[0,255,0],olive:[128,128,0],yellow:[255,255,0],navy:[0,0,128],blue:[0,0,255],teal:[0,128,128],aqua:[0,255,255],transparent:d.config.transparentColor||[255,255,255]};dojo.extend(dojo.Color,{r:255,g:255,b:255,a:1,_set:function(r,g,b,a){var t=this;t.r=r;t.g=g;t.b=b;t.a=a;},setColor:function(_127){if(d.isString(_127)){d.colorFromString(_127,this);}else{if(d.isArray(_127)){d.colorFromArray(_127,this);}else{this._set(_127.r,_127.g,_127.b,_127.a);if(!(_127 instanceof d.Color)){this.sanitize();}}}return this;},sanitize:function(){return this;},toRgb:function(){var t=this;return [t.r,t.g,t.b];},toRgba:function(){var t=this;return [t.r,t.g,t.b,t.a];},toHex:function(){var arr=d.map(["r","g","b"],function(x){var s=this[x].toString(16);return s.length<2?"0"+s:s;},this);return "#"+arr.join("");},toCss:function(_128){var t=this,rgb=t.r+", "+t.g+", "+t.b;return (_128?"rgba("+rgb+", "+t.a:"rgb("+rgb)+")";},toString:function(){return this.toCss(true);}});dojo.blendColors=function(_129,end,_12a,obj){var t=obj||new d.Color();d.forEach(["r","g","b","a"],function(x){t[x]=_129[x]+(end[x]-_129[x])*_12a;if(x!="a"){t[x]=Math.round(t[x]);}});return t.sanitize();};dojo.colorFromRgb=function(_12b,obj){var m=_12b.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);return m&&dojo.colorFromArray(m[1].split(/\s*,\s*/),obj);};dojo.colorFromHex=function(_12c,obj){var t=obj||new d.Color(),bits=(_12c.length==4)?4:8,mask=(1<<bits)-1;_12c=Number("0x"+_12c.substr(1));if(isNaN(_12c)){return null;}d.forEach(["b","g","r"],function(x){var c=_12c&mask;_12c>>=bits;t[x]=bits==4?17*c:c;});t.a=1;return t;};dojo.colorFromArray=function(a,obj){var t=obj||new d.Color();t._set(Number(a[0]),Number(a[1]),Number(a[2]),Number(a[3]));if(isNaN(t.a)){t.a=1;}return t.sanitize();};dojo.colorFromString=function(str,obj){var a=d.Color.named[str];return a&&d.colorFromArray(a,obj)||d.colorFromRgb(str,obj)||d.colorFromHex(str,obj);};})();}if(!dojo._hasResource["dojo._base.window"]){dojo._hasResource["dojo._base.window"]=true;dojo.provide("dojo._base.window");dojo.doc=window["document"]||null;dojo.body=function(){return dojo.doc.body||dojo.doc.getElementsByTagName("body")[0];};dojo.setContext=function(_12d,_12e){dojo.global=_12d;dojo.doc=_12e;};dojo.withGlobal=function(_12f,_130,_131,_132){var _133=dojo.global;try{dojo.global=_12f;return dojo.withDoc.call(null,_12f.document,_130,_131,_132);}finally{dojo.global=_133;}};dojo.withDoc=function(_134,_135,_136,_137){var _138=dojo.doc,_139=dojo._bodyLtr,oldQ=dojo.isQuirks;try{dojo.doc=_134;delete dojo._bodyLtr;dojo.isQuirks=dojo.doc.compatMode=="BackCompat";if(_136&&typeof _135=="string"){_135=_136[_135];}return _135.apply(_136,_137||[]);}finally{dojo.doc=_138;delete dojo._bodyLtr;if(_139!==undefined){dojo._bodyLtr=_139;}dojo.isQuirks=oldQ;}};}if(!dojo._hasResource["dojo._base.event"]){dojo._hasResource["dojo._base.event"]=true;dojo.provide("dojo._base.event");(function(){var del=(dojo._event_listener={add:function(node,name,fp){if(!node){return;}name=del._normalizeEventName(name);fp=del._fixCallback(name,fp);if(!dojo.isIE&&(name=="mouseenter"||name=="mouseleave")){var ofp=fp;name=(name=="mouseenter")?"mouseover":"mouseout";fp=function(e){if(!dojo.isDescendant(e.relatedTarget,node)){return ofp.call(this,e);}};}node.addEventListener(name,fp,false);return fp;},remove:function(node,_13a,_13b){if(node){_13a=del._normalizeEventName(_13a);if(!dojo.isIE&&(_13a=="mouseenter"||_13a=="mouseleave")){_13a=(_13a=="mouseenter")?"mouseover":"mouseout";}node.removeEventListener(_13a,_13b,false);}},_normalizeEventName:function(name){return name.slice(0,2)=="on"?name.slice(2):name;},_fixCallback:function(name,fp){return name!="keypress"?fp:function(e){return fp.call(this,del._fixEvent(e,this));};},_fixEvent:function(evt,_13c){switch(evt.type){case "keypress":del._setKeyChar(evt);break;}return evt;},_setKeyChar:function(evt){evt.keyChar=evt.charCode>=32?String.fromCharCode(evt.charCode):"";evt.charOrCode=evt.keyChar||evt.keyCode;},_punctMap:{106:42,111:47,186:59,187:43,188:44,189:45,190:46,191:47,192:96,219:91,220:92,221:93,222:39}});dojo.fixEvent=function(evt,_13d){return del._fixEvent(evt,_13d);};dojo.stopEvent=function(evt){evt.preventDefault();evt.stopPropagation();};var _13e=dojo._listener;dojo._connect=function(obj,_13f,_140,_141,_142){var _143=obj&&(obj.nodeType||obj.attachEvent||obj.addEventListener);var lid=_143?(_142?2:1):0,l=[dojo._listener,del,_13e][lid];var h=l.add(obj,_13f,dojo.hitch(_140,_141));return [obj,_13f,h,lid];};dojo._disconnect=function(obj,_144,_145,_146){([dojo._listener,del,_13e][_146]).remove(obj,_144,_145);};dojo.keys={BACKSPACE:8,TAB:9,CLEAR:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,META:dojo.isSafari?91:224,PAUSE:19,CAPS_LOCK:20,ESCAPE:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT_ARROW:37,UP_ARROW:38,RIGHT_ARROW:39,DOWN_ARROW:40,INSERT:45,DELETE:46,HELP:47,LEFT_WINDOW:91,RIGHT_WINDOW:92,SELECT:93,NUMPAD_0:96,NUMPAD_1:97,NUMPAD_2:98,NUMPAD_3:99,NUMPAD_4:100,NUMPAD_5:101,NUMPAD_6:102,NUMPAD_7:103,NUMPAD_8:104,NUMPAD_9:105,NUMPAD_MULTIPLY:106,NUMPAD_PLUS:107,NUMPAD_ENTER:108,NUMPAD_MINUS:109,NUMPAD_PERIOD:110,NUMPAD_DIVIDE:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,NUM_LOCK:144,SCROLL_LOCK:145,copyKey:dojo.isMac&&!dojo.isAIR?(dojo.isSafari?91:224):17};var _147=dojo.isMac?"metaKey":"ctrlKey";dojo.isCopyKey=function(e){return e[_147];};if(dojo.isIE<9||(dojo.isIE&&dojo.isQuirks)){dojo.mouseButtons={LEFT:1,MIDDLE:4,RIGHT:2,isButton:function(e,_148){return e.button&_148;},isLeft:function(e){return e.button&1;},isMiddle:function(e){return e.button&4;},isRight:function(e){return e.button&2;}};}else{dojo.mouseButtons={LEFT:0,MIDDLE:1,RIGHT:2,isButton:function(e,_149){return e.button==_149;},isLeft:function(e){return e.button==0;},isMiddle:function(e){return e.button==1;},isRight:function(e){return e.button==2;}};}if(dojo.isIE){var _14a=function(e,code){try{return (e.keyCode=code);}catch(e){return 0;}};var iel=dojo._listener;var _14b=(dojo._ieListenersName="_"+dojo._scopeName+"_listeners");if(!dojo.config._allow_leaks){_13e=iel=dojo._ie_listener={handlers:[],add:function(_14c,_14d,_14e){_14c=_14c||dojo.global;var f=_14c[_14d];if(!f||!f[_14b]){var d=dojo._getIeDispatcher();d.target=f&&(ieh.push(f)-1);d[_14b]=[];f=_14c[_14d]=d;}return f[_14b].push(ieh.push(_14e)-1);},remove:function(_14f,_150,_151){var f=(_14f||dojo.global)[_150],l=f&&f[_14b];if(f&&l&&_151--){delete ieh[l[_151]];delete l[_151];}}};var ieh=iel.handlers;}dojo.mixin(del,{add:function(node,_152,fp){if(!node){return;}_152=del._normalizeEventName(_152);if(_152=="onkeypress"){var kd=node.onkeydown;if(!kd||!kd[_14b]||!kd._stealthKeydownHandle){var h=del.add(node,"onkeydown",del._stealthKeyDown);kd=node.onkeydown;kd._stealthKeydownHandle=h;kd._stealthKeydownRefs=1;}else{kd._stealthKeydownRefs++;}}return iel.add(node,_152,del._fixCallback(fp));},remove:function(node,_153,_154){_153=del._normalizeEventName(_153);iel.remove(node,_153,_154);if(_153=="onkeypress"){var kd=node.onkeydown;if(--kd._stealthKeydownRefs<=0){iel.remove(node,"onkeydown",kd._stealthKeydownHandle);delete kd._stealthKeydownHandle;}}},_normalizeEventName:function(_155){return _155.slice(0,2)!="on"?"on"+_155:_155;},_nop:function(){},_fixEvent:function(evt,_156){if(!evt){var w=_156&&(_156.ownerDocument||_156.document||_156).parentWindow||window;evt=w.event;}if(!evt){return (evt);}evt.target=evt.srcElement;evt.currentTarget=(_156||evt.srcElement);evt.layerX=evt.offsetX;evt.layerY=evt.offsetY;var se=evt.srcElement,doc=(se&&se.ownerDocument)||document;var _157=((dojo.isIE<6)||(doc["compatMode"]=="BackCompat"))?doc.body:doc.documentElement;var _158=dojo._getIeDocumentElementOffset();evt.pageX=evt.clientX+dojo._fixIeBiDiScrollLeft(_157.scrollLeft||0)-_158.x;evt.pageY=evt.clientY+(_157.scrollTop||0)-_158.y;if(evt.type=="mouseover"){evt.relatedTarget=evt.fromElement;}if(evt.type=="mouseout"){evt.relatedTarget=evt.toElement;}if(dojo.isIE<9||dojo.isQuirks){evt.stopPropagation=del._stopPropagation;evt.preventDefault=del._preventDefault;}return del._fixKeys(evt);},_fixKeys:function(evt){switch(evt.type){case "keypress":var c=("charCode" in evt?evt.charCode:evt.keyCode);if(c==10){c=0;evt.keyCode=13;}else{if(c==13||c==27){c=0;}else{if(c==3){c=99;}}}evt.charCode=c;del._setKeyChar(evt);break;}return evt;},_stealthKeyDown:function(evt){var kp=evt.currentTarget.onkeypress;if(!kp||!kp[_14b]){return;}var k=evt.keyCode;var _159=(k!=13||(dojo.isIE>=9&&!dojo.isQuirks))&&k!=32&&k!=27&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222);if(_159||evt.ctrlKey){var c=_159?0:k;if(evt.ctrlKey){if(k==3||k==13){return;}else{if(c>95&&c<106){c-=48;}else{if((!evt.shiftKey)&&(c>=65&&c<=90)){c+=32;}else{c=del._punctMap[c]||c;}}}}var faux=del._synthesizeEvent(evt,{type:"keypress",faux:true,charCode:c});kp.call(evt.currentTarget,faux);if(dojo.isIE<9||(dojo.isIE&&dojo.isQuirks)){evt.cancelBubble=faux.cancelBubble;}evt.returnValue=faux.returnValue;_14a(evt,faux.keyCode);}},_stopPropagation:function(){this.cancelBubble=true;},_preventDefault:function(){this.bubbledKeyCode=this.keyCode;if(this.ctrlKey){_14a(this,0);}this.returnValue=false;}});dojo.stopEvent=(dojo.isIE<9||dojo.isQuirks)?function(evt){evt=evt||window.event;del._stopPropagation.call(evt);del._preventDefault.call(evt);}:dojo.stopEvent;}del._synthesizeEvent=function(evt,_15a){var faux=dojo.mixin({},evt,_15a);del._setKeyChar(faux);faux.preventDefault=function(){evt.preventDefault();};faux.stopPropagation=function(){evt.stopPropagation();};return faux;};if(dojo.isOpera){dojo.mixin(del,{_fixEvent:function(evt,_15b){switch(evt.type){case "keypress":var c=evt.which;if(c==3){c=99;}c=c<41&&!evt.shiftKey?0:c;if(evt.ctrlKey&&!evt.shiftKey&&c>=65&&c<=90){c+=32;}return del._synthesizeEvent(evt,{charCode:c});}return evt;}});}if(dojo.isWebKit){del._add=del.add;del._remove=del.remove;dojo.mixin(del,{add:function(node,_15c,fp){if(!node){return;}var _15d=del._add(node,_15c,fp);if(del._normalizeEventName(_15c)=="keypress"){_15d._stealthKeyDownHandle=del._add(node,"keydown",function(evt){var k=evt.keyCode;var _15e=k!=13&&k!=32&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222);if(_15e||evt.ctrlKey){var c=_15e?0:k;if(evt.ctrlKey){if(k==3||k==13){return;}else{if(c>95&&c<106){c-=48;}else{if(!evt.shiftKey&&c>=65&&c<=90){c+=32;}else{c=del._punctMap[c]||c;}}}}var faux=del._synthesizeEvent(evt,{type:"keypress",faux:true,charCode:c});fp.call(evt.currentTarget,faux);}});}return _15d;},remove:function(node,_15f,_160){if(node){if(_160._stealthKeyDownHandle){del._remove(node,"keydown",_160._stealthKeyDownHandle);}del._remove(node,_15f,_160);}},_fixEvent:function(evt,_161){switch(evt.type){case "keypress":if(evt.faux){return evt;}var c=evt.charCode;c=c>=32?c:0;return del._synthesizeEvent(evt,{charCode:c,faux:true});}return evt;}});}})();if(dojo.isIE){dojo._ieDispatcher=function(args,_162){var ap=Array.prototype,h=dojo._ie_listener.handlers,c=args.callee,ls=c[dojo._ieListenersName],t=h[c.target];var r=t&&t.apply(_162,args);var lls=[].concat(ls);for(var i in lls){var f=h[lls[i]];if(!(i in ap)&&f){f.apply(_162,args);}}return r;};dojo._getIeDispatcher=function(){return new Function(dojo._scopeName+"._ieDispatcher(arguments, this)");};dojo._event_listener._fixCallback=function(fp){var f=dojo._event_listener._fixEvent;return function(e){return fp.call(this,f(e,this));};};}}if(!dojo._hasResource["dojo._base.html"]){dojo._hasResource["dojo._base.html"]=true;dojo.provide("dojo._base.html");try{document.execCommand("BackgroundImageCache",false,true);}catch(e){}if(dojo.isIE){dojo.byId=function(id,doc){if(typeof id!="string"){return id;}var _163=doc||dojo.doc,te=_163.getElementById(id);if(te&&(te.attributes.id.value==id||te.id==id)){return te;}else{var eles=_163.all[id];if(!eles||eles.nodeName){eles=[eles];}var i=0;while((te=eles[i++])){if((te.attributes&&te.attributes.id&&te.attributes.id.value==id)||te.id==id){return te;}}}};}else{dojo.byId=function(id,doc){return ((typeof id=="string")?(doc||dojo.doc).getElementById(id):id)||null;};}(function(){var d=dojo;var byId=d.byId;var _164=null,_165;d.addOnWindowUnload(function(){_164=null;});dojo._destroyElement=dojo.destroy=function(node){node=byId(node);try{var doc=node.ownerDocument;if(!_164||_165!=doc){_164=doc.createElement("div");_165=doc;}_164.appendChild(node.parentNode?node.parentNode.removeChild(node):node);_164.innerHTML="";}catch(e){}};dojo.isDescendant=function(node,_166){try{node=byId(node);_166=byId(_166);while(node){if(node==_166){return true;}node=node.parentNode;}}catch(e){}return false;};dojo.setSelectable=function(node,_167){node=byId(node);if(d.isMozilla){node.style.MozUserSelect=_167?"":"none";}else{if(d.isKhtml||d.isWebKit){node.style.KhtmlUserSelect=_167?"auto":"none";}else{if(d.isIE){var v=(node.unselectable=_167?"":"on");d.query("*",node).forEach("item.unselectable = '"+v+"'");}}}};var _168=function(node,ref){var _169=ref.parentNode;if(_169){_169.insertBefore(node,ref);}};var _16a=function(node,ref){var _16b=ref.parentNode;if(_16b){if(_16b.lastChild==ref){_16b.appendChild(node);}else{_16b.insertBefore(node,ref.nextSibling);}}};dojo.place=function(node,_16c,_16d){_16c=byId(_16c);if(typeof node=="string"){node=/^\s*</.test(node)?d._toDom(node,_16c.ownerDocument):byId(node);}if(typeof _16d=="number"){var cn=_16c.childNodes;if(!cn.length||cn.length<=_16d){_16c.appendChild(node);}else{_168(node,cn[_16d<0?0:_16d]);}}else{switch(_16d){case "before":_168(node,_16c);break;case "after":_16a(node,_16c);break;case "replace":_16c.parentNode.replaceChild(node,_16c);break;case "only":d.empty(_16c);_16c.appendChild(node);break;case "first":if(_16c.firstChild){_168(node,_16c.firstChild);break;}default:_16c.appendChild(node);}}return node;};dojo.boxModel="content-box";if(d.isIE){d.boxModel=document.compatMode=="BackCompat"?"border-box":"content-box";}var gcs;if(d.isWebKit){gcs=function(node){var s;if(node.nodeType==1){var dv=node.ownerDocument.defaultView;s=dv.getComputedStyle(node,null);if(!s&&node.style){node.style.display="";s=dv.getComputedStyle(node,null);}}return s||{};};}else{if(d.isIE){gcs=function(node){return node.nodeType==1?node.currentStyle:{};};}else{gcs=function(node){return node.nodeType==1?node.ownerDocument.defaultView.getComputedStyle(node,null):{};};}}dojo.getComputedStyle=gcs;if(!d.isIE){d._toPixelValue=function(_16e,_16f){return parseFloat(_16f)||0;};}else{d._toPixelValue=function(_170,_171){if(!_171){return 0;}if(_171=="medium"){return 4;}if(_171.slice&&_171.slice(-2)=="px"){return parseFloat(_171);}with(_170){var _172=style.left;var _173=runtimeStyle.left;runtimeStyle.left=currentStyle.left;try{style.left=_171;_171=style.pixelLeft;}catch(e){_171=0;}style.left=_172;runtimeStyle.left=_173;}return _171;};}var px=d._toPixelValue;var astr="DXImageTransform.Microsoft.Alpha";var af=function(n,f){try{return n.filters.item(astr);}catch(e){return f?{}:null;}};dojo._getOpacity=d.isIE<9?function(node){try{return af(node).Opacity/100;}catch(e){return 1;}}:function(node){return gcs(node).opacity;};dojo._setOpacity=d.isIE<9?function(node,_174){var ov=_174*100,_175=_174==1;node.style.zoom=_175?"":1;if(!af(node)){if(_175){return _174;}node.style.filter+=" progid:"+astr+"(Opacity="+ov+")";}else{af(node,1).Opacity=ov;}af(node,1).Enabled=!_175;if(node.nodeName.toLowerCase()=="tr"){d.query("> td",node).forEach(function(i){d._setOpacity(i,_174);});}return _174;}:function(node,_176){return node.style.opacity=_176;};var _177={left:true,top:true};var _178=/margin|padding|width|height|max|min|offset/;var _179=function(node,type,_17a){type=type.toLowerCase();if(d.isIE){if(_17a=="auto"){if(type=="height"){return node.offsetHeight;}if(type=="width"){return node.offsetWidth;}}if(type=="fontweight"){switch(_17a){case 700:return "bold";case 400:default:return "normal";}}}if(!(type in _177)){_177[type]=_178.test(type);}return _177[type]?px(node,_17a):_17a;};var _17b=d.isIE?"styleFloat":"cssFloat",_17c={"cssFloat":_17b,"styleFloat":_17b,"float":_17b};dojo.style=function(node,_17d,_17e){var n=byId(node),args=arguments.length,op=(_17d=="opacity");_17d=_17c[_17d]||_17d;if(args==3){return op?d._setOpacity(n,_17e):n.style[_17d]=_17e;}if(args==2&&op){return d._getOpacity(n);}var s=gcs(n);if(args==2&&typeof _17d!="string"){for(var x in _17d){d.style(node,x,_17d[x]);}return s;}return (args==1)?s:_179(n,_17d,s[_17d]||n.style[_17d]);};dojo._getPadExtents=function(n,_17f){var s=_17f||gcs(n),l=px(n,s.paddingLeft),t=px(n,s.paddingTop);return {l:l,t:t,w:l+px(n,s.paddingRight),h:t+px(n,s.paddingBottom)};};dojo._getBorderExtents=function(n,_180){var ne="none",s=_180||gcs(n),bl=(s.borderLeftStyle!=ne?px(n,s.borderLeftWidth):0),bt=(s.borderTopStyle!=ne?px(n,s.borderTopWidth):0);return {l:bl,t:bt,w:bl+(s.borderRightStyle!=ne?px(n,s.borderRightWidth):0),h:bt+(s.borderBottomStyle!=ne?px(n,s.borderBottomWidth):0)};};dojo._getPadBorderExtents=function(n,_181){var s=_181||gcs(n),p=d._getPadExtents(n,s),b=d._getBorderExtents(n,s);return {l:p.l+b.l,t:p.t+b.t,w:p.w+b.w,h:p.h+b.h};};dojo._getMarginExtents=function(n,_182){var s=_182||gcs(n),l=px(n,s.marginLeft),t=px(n,s.marginTop),r=px(n,s.marginRight),b=px(n,s.marginBottom);if(d.isWebKit&&(s.position!="absolute")){r=l;}return {l:l,t:t,w:l+r,h:t+b};};dojo._getMarginBox=function(node,_183){var s=_183||gcs(node),me=d._getMarginExtents(node,s);var l=node.offsetLeft-me.l,t=node.offsetTop-me.t,p=node.parentNode;if(d.isMoz){var sl=parseFloat(s.left),st=parseFloat(s.top);if(!isNaN(sl)&&!isNaN(st)){l=sl,t=st;}else{if(p&&p.style){var pcs=gcs(p);if(pcs.overflow!="visible"){var be=d._getBorderExtents(p,pcs);l+=be.l,t+=be.t;}}}}else{if(d.isOpera||(d.isIE>7&&!d.isQuirks)){if(p){be=d._getBorderExtents(p);l-=be.l;t-=be.t;}}}return {l:l,t:t,w:node.offsetWidth+me.w,h:node.offsetHeight+me.h};};dojo._getMarginSize=function(node,_184){node=byId(node);var me=d._getMarginExtents(node,_184||gcs(node));var size=node.getBoundingClientRect();return {w:(size.right-size.left)+me.w,h:(size.bottom-size.top)+me.h};};dojo._getContentBox=function(node,_185){var s=_185||gcs(node),pe=d._getPadExtents(node,s),be=d._getBorderExtents(node,s),w=node.clientWidth,h;if(!w){w=node.offsetWidth,h=node.offsetHeight;}else{h=node.clientHeight,be.w=be.h=0;}if(d.isOpera){pe.l+=be.l;pe.t+=be.t;}return {l:pe.l,t:pe.t,w:w-pe.w-be.w,h:h-pe.h-be.h};};dojo._getBorderBox=function(node,_186){var s=_186||gcs(node),pe=d._getPadExtents(node,s),cb=d._getContentBox(node,s);return {l:cb.l-pe.l,t:cb.t-pe.t,w:cb.w+pe.w,h:cb.h+pe.h};};dojo._setBox=function(node,l,t,w,h,u){u=u||"px";var s=node.style;if(!isNaN(l)){s.left=l+u;}if(!isNaN(t)){s.top=t+u;}if(w>=0){s.width=w+u;}if(h>=0){s.height=h+u;}};dojo._isButtonTag=function(node){return node.tagName=="BUTTON"||node.tagName=="INPUT"&&(node.getAttribute("type")||"").toUpperCase()=="BUTTON";};dojo._usesBorderBox=function(node){var n=node.tagName;return d.boxModel=="border-box"||n=="TABLE"||d._isButtonTag(node);};dojo._setContentSize=function(node,_187,_188,_189){if(d._usesBorderBox(node)){var pb=d._getPadBorderExtents(node,_189);if(_187>=0){_187+=pb.w;}if(_188>=0){_188+=pb.h;}}d._setBox(node,NaN,NaN,_187,_188);};dojo._setMarginBox=function(node,_18a,_18b,_18c,_18d,_18e){var s=_18e||gcs(node),bb=d._usesBorderBox(node),pb=bb?_18f:d._getPadBorderExtents(node,s);if(d.isWebKit){if(d._isButtonTag(node)){var ns=node.style;if(_18c>=0&&!ns.width){ns.width="4px";}if(_18d>=0&&!ns.height){ns.height="4px";}}}var mb=d._getMarginExtents(node,s);if(_18c>=0){_18c=Math.max(_18c-pb.w-mb.w,0);}if(_18d>=0){_18d=Math.max(_18d-pb.h-mb.h,0);}d._setBox(node,_18a,_18b,_18c,_18d);};var _18f={l:0,t:0,w:0,h:0};dojo.marginBox=function(node,box){var n=byId(node),s=gcs(n),b=box;return !b?d._getMarginBox(n,s):d._setMarginBox(n,b.l,b.t,b.w,b.h,s);};dojo.contentBox=function(node,box){var n=byId(node),s=gcs(n),b=box;return !b?d._getContentBox(n,s):d._setContentSize(n,b.w,b.h,s);};var _190=function(node,prop){if(!(node=(node||0).parentNode)){return 0;}var val,_191=0,_192=d.body();while(node&&node.style){if(gcs(node).position=="fixed"){return 0;}val=node[prop];if(val){_191+=val-0;if(node==_192){break;}}node=node.parentNode;}return _191;};dojo._docScroll=function(){var n=d.global;return "pageXOffset" in n?{x:n.pageXOffset,y:n.pageYOffset}:(n=d.isQuirks?d.doc.body:d.doc.documentElement,{x:d._fixIeBiDiScrollLeft(n.scrollLeft||0),y:n.scrollTop||0});};dojo._isBodyLtr=function(){return "_bodyLtr" in d?d._bodyLtr:d._bodyLtr=(d.body().dir||d.doc.documentElement.dir||"ltr").toLowerCase()=="ltr";};dojo._getIeDocumentElementOffset=function(){var de=d.doc.documentElement;if(d.isIE<8){var r=de.getBoundingClientRect();var l=r.left,t=r.top;if(d.isIE<7){l+=de.clientLeft;t+=de.clientTop;}return {x:l<0?0:l,y:t<0?0:t};}else{return {x:0,y:0};}};dojo._fixIeBiDiScrollLeft=function(_193){var ie=d.isIE;if(ie&&!d._isBodyLtr()){var qk=d.isQuirks,de=qk?d.doc.body:d.doc.documentElement;if(ie==6&&!qk&&d.global.frameElement&&de.scrollHeight>de.clientHeight){_193+=de.clientLeft;}return (ie<8||qk)?(_193+de.clientWidth-de.scrollWidth):-_193;}return _193;};dojo._abs=dojo.position=function(node,_194){node=byId(node);var db=d.body(),dh=db.parentNode,ret=node.getBoundingClientRect();ret={x:ret.left,y:ret.top,w:ret.right-ret.left,h:ret.bottom-ret.top};if(d.isIE){var _195=d._getIeDocumentElementOffset();ret.x-=_195.x+(d.isQuirks?db.clientLeft+db.offsetLeft:0);ret.y-=_195.y+(d.isQuirks?db.clientTop+db.offsetTop:0);}else{if(d.isFF==3){var cs=gcs(dh);ret.x-=px(dh,cs.marginLeft)+px(dh,cs.borderLeftWidth);ret.y-=px(dh,cs.marginTop)+px(dh,cs.borderTopWidth);}}if(_194){var _196=d._docScroll();ret.x+=_196.x;ret.y+=_196.y;}return ret;};dojo.coords=function(node,_197){var n=byId(node),s=gcs(n),mb=d._getMarginBox(n,s);var abs=d.position(n,_197);mb.x=abs.x;mb.y=abs.y;return mb;};var _198={"class":"className","for":"htmlFor",tabindex:"tabIndex",readonly:"readOnly",colspan:"colSpan",frameborder:"frameBorder",rowspan:"rowSpan",valuetype:"valueType"},_199={classname:"class",htmlfor:"for",tabindex:"tabIndex",readonly:"readOnly"},_19a={innerHTML:1,className:1,htmlFor:d.isIE,value:1};var _19b=function(name){return _199[name.toLowerCase()]||name;};var _19c=function(node,name){var attr=node.getAttributeNode&&node.getAttributeNode(name);return attr&&attr.specified;};dojo.hasAttr=function(node,name){var lc=name.toLowerCase();return _19a[_198[lc]||name]||_19c(byId(node),_199[lc]||name);};var _19d={},_19e=0,_19f=dojo._scopeName+"attrid",_1a0={col:1,colgroup:1,table:1,tbody:1,tfoot:1,thead:1,tr:1,title:1};dojo.attr=function(node,name,_1a1){node=byId(node);var args=arguments.length,prop;if(args==2&&typeof name!="string"){for(var x in name){d.attr(node,x,name[x]);}return node;}var lc=name.toLowerCase(),_1a2=_198[lc]||name,_1a3=_19a[_1a2],_1a4=_199[lc]||name;if(args==3){do{if(_1a2=="style"&&typeof _1a1!="string"){d.style(node,_1a1);break;}if(_1a2=="innerHTML"){if(d.isIE&&node.tagName.toLowerCase() in _1a0){d.empty(node);node.appendChild(d._toDom(_1a1,node.ownerDocument));}else{node[_1a2]=_1a1;}break;}if(d.isFunction(_1a1)){var _1a5=d.attr(node,_19f);if(!_1a5){_1a5=_19e++;d.attr(node,_19f,_1a5);}if(!_19d[_1a5]){_19d[_1a5]={};}var h=_19d[_1a5][_1a2];if(h){d.disconnect(h);}else{try{delete node[_1a2];}catch(e){}}_19d[_1a5][_1a2]=d.connect(node,_1a2,_1a1);break;}if(_1a3||typeof _1a1=="boolean"){node[_1a2]=_1a1;break;}node.setAttribute(_1a4,_1a1);}while(false);return node;}_1a1=node[_1a2];if(_1a3&&typeof _1a1!="undefined"){return _1a1;}if(_1a2!="href"&&(typeof _1a1=="boolean"||d.isFunction(_1a1))){return _1a1;}return _19c(node,_1a4)?node.getAttribute(_1a4):null;};dojo.removeAttr=function(node,name){byId(node).removeAttribute(_19b(name));};dojo.getNodeProp=function(node,name){node=byId(node);var lc=name.toLowerCase(),_1a6=_198[lc]||name;if((_1a6 in node)&&_1a6!="href"){return node[_1a6];}var _1a7=_199[lc]||name;return _19c(node,_1a7)?node.getAttribute(_1a7):null;};dojo.create=function(tag,_1a8,_1a9,pos){var doc=d.doc;if(_1a9){_1a9=byId(_1a9);doc=_1a9.ownerDocument;}if(typeof tag=="string"){tag=doc.createElement(tag);}if(_1a8){d.attr(tag,_1a8);}if(_1a9){d.place(tag,_1a9,pos);}return tag;};d.empty=d.isIE?function(node){node=byId(node);for(var c;c=node.lastChild;){d.destroy(c);}}:function(node){byId(node).innerHTML="";};var _1aa={option:["select"],tbody:["table"],thead:["table"],tfoot:["table"],tr:["table","tbody"],td:["table","tbody","tr"],th:["table","thead","tr"],legend:["fieldset"],caption:["table"],colgroup:["table"],col:["table","colgroup"],li:["ul"]},_1ab=/<\s*([\w\:]+)/,_1ac={},_1ad=0,_1ae="__"+d._scopeName+"ToDomId";for(var _1af in _1aa){if(_1aa.hasOwnProperty(_1af)){var tw=_1aa[_1af];tw.pre=_1af=="option"?"<select multiple=\"multiple\">":"<"+tw.join("><")+">";tw.post="</"+tw.reverse().join("></")+">";}}d._toDom=function(frag,doc){doc=doc||d.doc;var _1b0=doc[_1ae];if(!_1b0){doc[_1ae]=_1b0=++_1ad+"";_1ac[_1b0]=doc.createElement("div");}frag+="";var _1b1=frag.match(_1ab),tag=_1b1?_1b1[1].toLowerCase():"",_1b2=_1ac[_1b0],wrap,i,fc,df;if(_1b1&&_1aa[tag]){wrap=_1aa[tag];_1b2.innerHTML=wrap.pre+frag+wrap.post;for(i=wrap.length;i;--i){_1b2=_1b2.firstChild;}}else{_1b2.innerHTML=frag;}if(_1b2.childNodes.length==1){return _1b2.removeChild(_1b2.firstChild);}df=doc.createDocumentFragment();while(fc=_1b2.firstChild){df.appendChild(fc);}return df;};var _1b3="className";dojo.hasClass=function(node,_1b4){return ((" "+byId(node)[_1b3]+" ").indexOf(" "+_1b4+" ")>=0);};var _1b5=/\s+/,a1=[""],_1b6={},_1b7=function(s){if(typeof s=="string"||s instanceof String){if(s.indexOf(" ")<0){a1[0]=s;return a1;}else{return s.split(_1b5);}}return s||"";};dojo.addClass=function(node,_1b8){node=byId(node);_1b8=_1b7(_1b8);var cls=node[_1b3],_1b9;cls=cls?" "+cls+" ":" ";_1b9=cls.length;for(var i=0,len=_1b8.length,c;i<len;++i){c=_1b8[i];if(c&&cls.indexOf(" "+c+" ")<0){cls+=c+" ";}}if(_1b9<cls.length){node[_1b3]=cls.substr(1,cls.length-2);}};dojo.removeClass=function(node,_1ba){node=byId(node);var cls;if(_1ba!==undefined){_1ba=_1b7(_1ba);cls=" "+node[_1b3]+" ";for(var i=0,len=_1ba.length;i<len;++i){cls=cls.replace(" "+_1ba[i]+" "," ");}cls=d.trim(cls);}else{cls="";}if(node[_1b3]!=cls){node[_1b3]=cls;}};dojo.replaceClass=function(node,_1bb,_1bc){node=byId(node);_1b6.className=node.className;dojo.removeClass(_1b6,_1bc);dojo.addClass(_1b6,_1bb);if(node.className!==_1b6.className){node.className=_1b6.className;}};dojo.toggleClass=function(node,_1bd,_1be){if(_1be===undefined){_1be=!d.hasClass(node,_1bd);}d[_1be?"addClass":"removeClass"](node,_1bd);};})();}if(!dojo._hasResource["dojo._base.NodeList"]){dojo._hasResource["dojo._base.NodeList"]=true;dojo.provide("dojo._base.NodeList");(function(){var d=dojo;var ap=Array.prototype,aps=ap.slice,apc=ap.concat;var tnl=function(a,_1bf,_1c0){if(!a.sort){a=aps.call(a,0);}var ctor=_1c0||this._NodeListCtor||d._NodeListCtor;a.constructor=ctor;dojo._mixin(a,ctor.prototype);a._NodeListCtor=ctor;return _1bf?a._stash(_1bf):a;};var _1c1=function(f,a,o){a=[0].concat(aps.call(a,0));o=o||d.global;return function(node){a[0]=node;return f.apply(o,a);};};var _1c2=function(f,o){return function(){this.forEach(_1c1(f,arguments,o));return this;};};var _1c3=function(f,o){return function(){return this.map(_1c1(f,arguments,o));};};var _1c4=function(f,o){return function(){return this.filter(_1c1(f,arguments,o));};};var _1c5=function(f,g,o){return function(){var a=arguments,body=_1c1(f,a,o);if(g.call(o||d.global,a)){return this.map(body);}this.forEach(body);return this;};};var _1c6=function(a){return a.length==1&&(typeof a[0]=="string");};var _1c7=function(node){var p=node.parentNode;if(p){p.removeChild(node);}};dojo.NodeList=function(){return tnl(Array.apply(null,arguments));};d._NodeListCtor=d.NodeList;var nl=d.NodeList,nlp=nl.prototype;nl._wrap=nlp._wrap=tnl;nl._adaptAsMap=_1c3;nl._adaptAsForEach=_1c2;nl._adaptAsFilter=_1c4;nl._adaptWithCondition=_1c5;d.forEach(["slice","splice"],function(name){var f=ap[name];nlp[name]=function(){return this._wrap(f.apply(this,arguments),name=="slice"?this:null);};});d.forEach(["indexOf","lastIndexOf","every","some"],function(name){var f=d[name];nlp[name]=function(){return f.apply(d,[this].concat(aps.call(arguments,0)));};});d.forEach(["attr","style"],function(name){nlp[name]=_1c5(d[name],_1c6);});d.forEach(["connect","addClass","removeClass","replaceClass","toggleClass","empty","removeAttr"],function(name){nlp[name]=_1c2(d[name]);});dojo.extend(dojo.NodeList,{_normalize:function(_1c8,_1c9){var _1ca=_1c8.parse===true?true:false;if(typeof _1c8.template=="string"){var _1cb=_1c8.templateFunc||(dojo.string&&dojo.string.substitute);_1c8=_1cb?_1cb(_1c8.template,_1c8):_1c8;}var type=(typeof _1c8);if(type=="string"||type=="number"){_1c8=dojo._toDom(_1c8,(_1c9&&_1c9.ownerDocument));if(_1c8.nodeType==11){_1c8=dojo._toArray(_1c8.childNodes);}else{_1c8=[_1c8];}}else{if(!dojo.isArrayLike(_1c8)){_1c8=[_1c8];}else{if(!dojo.isArray(_1c8)){_1c8=dojo._toArray(_1c8);}}}if(_1ca){_1c8._runParse=true;}return _1c8;},_cloneNode:function(node){return node.cloneNode(true);},_place:function(ary,_1cc,_1cd,_1ce){if(_1cc.nodeType!=1&&_1cd=="only"){return;}var _1cf=_1cc,_1d0;var _1d1=ary.length;for(var i=_1d1-1;i>=0;i--){var node=(_1ce?this._cloneNode(ary[i]):ary[i]);if(ary._runParse&&dojo.parser&&dojo.parser.parse){if(!_1d0){_1d0=_1cf.ownerDocument.createElement("div");}_1d0.appendChild(node);dojo.parser.parse(_1d0);node=_1d0.firstChild;while(_1d0.firstChild){_1d0.removeChild(_1d0.firstChild);}}if(i==_1d1-1){dojo.place(node,_1cf,_1cd);}else{_1cf.parentNode.insertBefore(node,_1cf);}_1cf=node;}},_stash:function(_1d2){this._parent=_1d2;return this;},end:function(){if(this._parent){return this._parent;}else{return new this._NodeListCtor();}},concat:function(item){var t=d.isArray(this)?this:aps.call(this,0),m=d.map(arguments,function(a){return a&&!d.isArray(a)&&(typeof NodeList!="undefined"&&a.constructor===NodeList||a.constructor===this._NodeListCtor)?aps.call(a,0):a;});return this._wrap(apc.apply(t,m),this);},map:function(func,obj){return this._wrap(d.map(this,func,obj),this);},forEach:function(_1d3,_1d4){d.forEach(this,_1d3,_1d4);return this;},coords:_1c3(d.coords),position:_1c3(d.position),place:function(_1d5,_1d6){var item=d.query(_1d5)[0];return this.forEach(function(node){d.place(node,item,_1d6);});},orphan:function(_1d7){return (_1d7?d._filterQueryResult(this,_1d7):this).forEach(_1c7);},adopt:function(_1d8,_1d9){return d.query(_1d8).place(this[0],_1d9)._stash(this);},query:function(_1da){if(!_1da){return this;}var ret=this.map(function(node){return d.query(_1da,node).filter(function(_1db){return _1db!==undefined;});});return this._wrap(apc.apply([],ret),this);},filter:function(_1dc){var a=arguments,_1dd=this,_1de=0;if(typeof _1dc=="string"){_1dd=d._filterQueryResult(this,a[0]);if(a.length==1){return _1dd._stash(this);}_1de=1;}return this._wrap(d.filter(_1dd,a[_1de],a[_1de+1]),this);},addContent:function(_1df,_1e0){_1df=this._normalize(_1df,this[0]);for(var i=0,node;(node=this[i]);i++){this._place(_1df,node,_1e0,i>0);}return this;},instantiate:function(_1e1,_1e2){var c=d.isFunction(_1e1)?_1e1:d.getObject(_1e1);_1e2=_1e2||{};return this.forEach(function(node){new c(_1e2,node);});},at:function(){var t=new this._NodeListCtor();d.forEach(arguments,function(i){if(i<0){i=this.length+i;}if(this[i]){t.push(this[i]);}},this);return t._stash(this);}});nl.events=["blur","focus","change","click","error","keydown","keypress","keyup","load","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","submit"];d.forEach(nl.events,function(evt){var _1e3="on"+evt;nlp[_1e3]=function(a,b){return this.connect(_1e3,a,b);};});})();}if(!dojo._hasResource["dojo._base.query"]){dojo._hasResource["dojo._base.query"]=true;(function(){var _1e4=function(d){var trim=d.trim;var each=d.forEach;var qlc=(d._NodeListCtor=d.NodeList);var _1e5=function(){return d.doc;};var _1e6=((d.isWebKit||d.isMozilla)&&((_1e5().compatMode)=="BackCompat"));var _1e7=!!_1e5().firstChild["children"]?"children":"childNodes";var _1e8=">~+";var _1e9=false;var _1ea=function(){return true;};var _1eb=function(_1ec){if(_1e8.indexOf(_1ec.slice(-1))>=0){_1ec+=" * ";}else{_1ec+=" ";}var ts=function(s,e){return trim(_1ec.slice(s,e));};var _1ed=[];var _1ee=-1,_1ef=-1,_1f0=-1,_1f1=-1,_1f2=-1,inId=-1,_1f3=-1,lc="",cc="",_1f4;var x=0,ql=_1ec.length,_1f5=null,_1f6=null;var _1f7=function(){if(_1f3>=0){var tv=(_1f3==x)?null:ts(_1f3,x);_1f5[(_1e8.indexOf(tv)<0)?"tag":"oper"]=tv;_1f3=-1;}};var _1f8=function(){if(inId>=0){_1f5.id=ts(inId,x).replace(/\\/g,"");inId=-1;}};var _1f9=function(){if(_1f2>=0){_1f5.classes.push(ts(_1f2+1,x).replace(/\\/g,""));_1f2=-1;}};var _1fa=function(){_1f8();_1f7();_1f9();};var _1fb=function(){_1fa();if(_1f1>=0){_1f5.pseudos.push({name:ts(_1f1+1,x)});}_1f5.loops=(_1f5.pseudos.length||_1f5.attrs.length||_1f5.classes.length);_1f5.oquery=_1f5.query=ts(_1f4,x);_1f5.otag=_1f5.tag=(_1f5["oper"])?null:(_1f5.tag||"*");if(_1f5.tag){_1f5.tag=_1f5.tag.toUpperCase();}if(_1ed.length&&(_1ed[_1ed.length-1].oper)){_1f5.infixOper=_1ed.pop();_1f5.query=_1f5.infixOper.query+" "+_1f5.query;}_1ed.push(_1f5);_1f5=null;};for(;lc=cc,cc=_1ec.charAt(x),x<ql;x++){if(lc=="\\"){continue;}if(!_1f5){_1f4=x;_1f5={query:null,pseudos:[],attrs:[],classes:[],tag:null,oper:null,id:null,getTag:function(){return (_1e9)?this.otag:this.tag;}};_1f3=x;}if(_1ee>=0){if(cc=="]"){if(!_1f6.attr){_1f6.attr=ts(_1ee+1,x);}else{_1f6.matchFor=ts((_1f0||_1ee+1),x);}var cmf=_1f6.matchFor;if(cmf){if((cmf.charAt(0)=="\"")||(cmf.charAt(0)=="'")){_1f6.matchFor=cmf.slice(1,-1);}}_1f5.attrs.push(_1f6);_1f6=null;_1ee=_1f0=-1;}else{if(cc=="="){var _1fc=("|~^$*".indexOf(lc)>=0)?lc:"";_1f6.type=_1fc+cc;_1f6.attr=ts(_1ee+1,x-_1fc.length);_1f0=x+1;}}}else{if(_1ef>=0){if(cc==")"){if(_1f1>=0){_1f6.value=ts(_1ef+1,x);}_1f1=_1ef=-1;}}else{if(cc=="#"){_1fa();inId=x+1;}else{if(cc=="."){_1fa();_1f2=x;}else{if(cc==":"){_1fa();_1f1=x;}else{if(cc=="["){_1fa();_1ee=x;_1f6={};}else{if(cc=="("){if(_1f1>=0){_1f6={name:ts(_1f1+1,x),value:null};_1f5.pseudos.push(_1f6);}_1ef=x;}else{if((cc==" ")&&(lc!=cc)){_1fb();}}}}}}}}}return _1ed;};var _1fd=function(_1fe,_1ff){if(!_1fe){return _1ff;}if(!_1ff){return _1fe;}return function(){return _1fe.apply(window,arguments)&&_1ff.apply(window,arguments);};};var _200=function(i,arr){var r=arr||[];if(i){r.push(i);}return r;};var _201=function(n){return (1==n.nodeType);};var _202="";var _203=function(elem,attr){if(!elem){return _202;}if(attr=="class"){return elem.className||_202;}if(attr=="for"){return elem.htmlFor||_202;}if(attr=="style"){return elem.style.cssText||_202;}return (_1e9?elem.getAttribute(attr):elem.getAttribute(attr,2))||_202;};var _204={"*=":function(attr,_205){return function(elem){return (_203(elem,attr).indexOf(_205)>=0);};},"^=":function(attr,_206){return function(elem){return (_203(elem,attr).indexOf(_206)==0);};},"$=":function(attr,_207){var tval=" "+_207;return function(elem){var ea=" "+_203(elem,attr);return (ea.lastIndexOf(_207)==(ea.length-_207.length));};},"~=":function(attr,_208){var tval=" "+_208+" ";return function(elem){var ea=" "+_203(elem,attr)+" ";return (ea.indexOf(tval)>=0);};},"|=":function(attr,_209){var _20a=" "+_209+"-";return function(elem){var ea=" "+_203(elem,attr);return ((ea==_209)||(ea.indexOf(_20a)==0));};},"=":function(attr,_20b){return function(elem){return (_203(elem,attr)==_20b);};}};var _20c=(typeof _1e5().firstChild.nextElementSibling=="undefined");var _20d=!_20c?"nextElementSibling":"nextSibling";var _20e=!_20c?"previousElementSibling":"previousSibling";var _20f=(_20c?_201:_1ea);var _210=function(node){while(node=node[_20e]){if(_20f(node)){return false;}}return true;};var _211=function(node){while(node=node[_20d]){if(_20f(node)){return false;}}return true;};var _212=function(node){var root=node.parentNode;var i=0,tret=root[_1e7],ci=(node["_i"]||-1),cl=(root["_l"]||-1);if(!tret){return -1;}var l=tret.length;if(cl==l&&ci>=0&&cl>=0){return ci;}root["_l"]=l;ci=-1;for(var te=root["firstElementChild"]||root["firstChild"];te;te=te[_20d]){if(_20f(te)){te["_i"]=++i;if(node===te){ci=i;}}}return ci;};var _213=function(elem){return !((_212(elem))%2);};var _214=function(elem){return ((_212(elem))%2);};var _215={"checked":function(name,_216){return function(elem){return !!("checked" in elem?elem.checked:elem.selected);};},"first-child":function(){return _210;},"last-child":function(){return _211;},"only-child":function(name,_217){return function(node){if(!_210(node)){return false;}if(!_211(node)){return false;}return true;};},"empty":function(name,_218){return function(elem){var cn=elem.childNodes;var cnl=elem.childNodes.length;for(var x=cnl-1;x>=0;x--){var nt=cn[x].nodeType;if((nt===1)||(nt==3)){return false;}}return true;};},"contains":function(name,_219){var cz=_219.charAt(0);if(cz=="\""||cz=="'"){_219=_219.slice(1,-1);}return function(elem){return (elem.innerHTML.indexOf(_219)>=0);};},"not":function(name,_21a){var p=_1eb(_21a)[0];var _21b={el:1};if(p.tag!="*"){_21b.tag=1;}if(!p.classes.length){_21b.classes=1;}var ntf=_21c(p,_21b);return function(elem){return (!ntf(elem));};},"nth-child":function(name,_21d){var pi=parseInt;if(_21d=="odd"){return _214;}else{if(_21d=="even"){return _213;}}if(_21d.indexOf("n")!=-1){var _21e=_21d.split("n",2);var pred=_21e[0]?((_21e[0]=="-")?-1:pi(_21e[0])):1;var idx=_21e[1]?pi(_21e[1]):0;var lb=0,ub=-1;if(pred>0){if(idx<0){idx=(idx%pred)&&(pred+(idx%pred));}else{if(idx>0){if(idx>=pred){lb=idx-idx%pred;}idx=idx%pred;}}}else{if(pred<0){pred*=-1;if(idx>0){ub=idx;idx=idx%pred;}}}if(pred>0){return function(elem){var i=_212(elem);return (i>=lb)&&(ub<0||i<=ub)&&((i%pred)==idx);};}else{_21d=idx;}}var _21f=pi(_21d);return function(elem){return (_212(elem)==_21f);};}};var _220=(d.isIE<9||(dojo.isIE&&dojo.isQuirks))?function(cond){var clc=cond.toLowerCase();if(clc=="class"){cond="className";}return function(elem){return (_1e9?elem.getAttribute(cond):elem[cond]||elem[clc]);};}:function(cond){return function(elem){return (elem&&elem.getAttribute&&elem.hasAttribute(cond));};};var _21c=function(_221,_222){if(!_221){return _1ea;}_222=_222||{};var ff=null;if(!("el" in _222)){ff=_1fd(ff,_201);}if(!("tag" in _222)){if(_221.tag!="*"){ff=_1fd(ff,function(elem){return (elem&&(elem.tagName==_221.getTag()));});}}if(!("classes" in _222)){each(_221.classes,function(_223,idx,arr){var re=new RegExp("(?:^|\\s)"+_223+"(?:\\s|$)");ff=_1fd(ff,function(elem){return re.test(elem.className);});ff.count=idx;});}if(!("pseudos" in _222)){each(_221.pseudos,function(_224){var pn=_224.name;if(_215[pn]){ff=_1fd(ff,_215[pn](pn,_224.value));}});}if(!("attrs" in _222)){each(_221.attrs,function(attr){var _225;var a=attr.attr;if(attr.type&&_204[attr.type]){_225=_204[attr.type](a,attr.matchFor);}else{if(a.length){_225=_220(a);}}if(_225){ff=_1fd(ff,_225);}});}if(!("id" in _222)){if(_221.id){ff=_1fd(ff,function(elem){return (!!elem&&(elem.id==_221.id));});}}if(!ff){if(!("default" in _222)){ff=_1ea;}}return ff;};var _226=function(_227){return function(node,ret,bag){while(node=node[_20d]){if(_20c&&(!_201(node))){continue;}if((!bag||_228(node,bag))&&_227(node)){ret.push(node);}break;}return ret;};};var _229=function(_22a){return function(root,ret,bag){var te=root[_20d];while(te){if(_20f(te)){if(bag&&!_228(te,bag)){break;}if(_22a(te)){ret.push(te);}}te=te[_20d];}return ret;};};var _22b=function(_22c){_22c=_22c||_1ea;return function(root,ret,bag){var te,x=0,tret=root[_1e7];while(te=tret[x++]){if(_20f(te)&&(!bag||_228(te,bag))&&(_22c(te,x))){ret.push(te);}}return ret;};};var _22d=function(node,root){var pn=node.parentNode;while(pn){if(pn==root){break;}pn=pn.parentNode;}return !!pn;};var _22e={};var _22f=function(_230){var _231=_22e[_230.query];if(_231){return _231;}var io=_230.infixOper;var oper=(io?io.oper:"");var _232=_21c(_230,{el:1});var qt=_230.tag;var _233=("*"==qt);var ecs=_1e5()["getElementsByClassName"];if(!oper){if(_230.id){_232=(!_230.loops&&_233)?_1ea:_21c(_230,{el:1,id:1});_231=function(root,arr){var te=d.byId(_230.id,(root.ownerDocument||root));if(!te||!_232(te)){return;}if(9==root.nodeType){return _200(te,arr);}else{if(_22d(te,root)){return _200(te,arr);}}};}else{if(ecs&&/\{\s*\[native code\]\s*\}/.test(String(ecs))&&_230.classes.length&&!_1e6){_232=_21c(_230,{el:1,classes:1,id:1});var _234=_230.classes.join(" ");_231=function(root,arr,bag){var ret=_200(0,arr),te,x=0;var tret=root.getElementsByClassName(_234);while((te=tret[x++])){if(_232(te,root)&&_228(te,bag)){ret.push(te);}}return ret;};}else{if(!_233&&!_230.loops){_231=function(root,arr,bag){var ret=_200(0,arr),te,x=0;var tret=root.getElementsByTagName(_230.getTag());while((te=tret[x++])){if(_228(te,bag)){ret.push(te);}}return ret;};}else{_232=_21c(_230,{el:1,tag:1,id:1});_231=function(root,arr,bag){var ret=_200(0,arr),te,x=0;var tret=root.getElementsByTagName(_230.getTag());while((te=tret[x++])){if(_232(te,root)&&_228(te,bag)){ret.push(te);}}return ret;};}}}}else{var _235={el:1};if(_233){_235.tag=1;}_232=_21c(_230,_235);if("+"==oper){_231=_226(_232);}else{if("~"==oper){_231=_229(_232);}else{if(">"==oper){_231=_22b(_232);}}}}return _22e[_230.query]=_231;};var _236=function(root,_237){var _238=_200(root),qp,x,te,qpl=_237.length,bag,ret;for(var i=0;i<qpl;i++){ret=[];qp=_237[i];x=_238.length-1;if(x>0){bag={};ret.nozip=true;}var gef=_22f(qp);for(var j=0;(te=_238[j]);j++){gef(te,ret,bag);}if(!ret.length){break;}_238=ret;}return ret;};var _239={},_23a={};var _23b=function(_23c){var _23d=_1eb(trim(_23c));if(_23d.length==1){var tef=_22f(_23d[0]);return function(root){var r=tef(root,new qlc());if(r){r.nozip=true;}return r;};}return function(root){return _236(root,_23d);};};var nua=navigator.userAgent;var wk="WebKit/";var _23e=(d.isWebKit&&(nua.indexOf(wk)>0)&&(parseFloat(nua.split(wk)[1])>528));var _23f=d.isIE?"commentStrip":"nozip";var qsa="querySelectorAll";var _240=(!!_1e5()[qsa]&&(!d.isSafari||(d.isSafari>3.1)||_23e));var _241=/n\+\d|([^ ])?([>~+])([^ =])?/g;var _242=function(_243,pre,ch,post){return ch?(pre?pre+" ":"")+ch+(post?" "+post:""):_243;};var _244=function(_245,_246){_245=_245.replace(_241,_242);if(_240){var _247=_23a[_245];if(_247&&!_246){return _247;}}var _248=_239[_245];if(_248){return _248;}var qcz=_245.charAt(0);var _249=(-1==_245.indexOf(" "));if((_245.indexOf("#")>=0)&&(_249)){_246=true;}var _24a=(_240&&(!_246)&&(_1e8.indexOf(qcz)==-1)&&(!d.isIE||(_245.indexOf(":")==-1))&&(!(_1e6&&(_245.indexOf(".")>=0)))&&(_245.indexOf(":contains")==-1)&&(_245.indexOf(":checked")==-1)&&(_245.indexOf("|=")==-1));if(_24a){var tq=(_1e8.indexOf(_245.charAt(_245.length-1))>=0)?(_245+" *"):_245;return _23a[_245]=function(root){try{if(!((9==root.nodeType)||_249)){throw "";}var r=root[qsa](tq);r[_23f]=true;return r;}catch(e){return _244(_245,true)(root);}};}else{var _24b=_245.split(/\s*,\s*/);return _239[_245]=((_24b.length<2)?_23b(_245):function(root){var _24c=0,ret=[],tp;while((tp=_24b[_24c++])){ret=ret.concat(_23b(tp)(root));}return ret;});}};var _24d=0;var _24e=d.isIE?function(node){if(_1e9){return (node.getAttribute("_uid")||node.setAttribute("_uid",++_24d)||_24d);}else{return node.uniqueID;}}:function(node){return (node._uid||(node._uid=++_24d));};var _228=function(node,bag){if(!bag){return 1;}var id=_24e(node);if(!bag[id]){return bag[id]=1;}return 0;};var _24f="_zipIdx";var _250=function(arr){if(arr&&arr.nozip){return (qlc._wrap)?qlc._wrap(arr):arr;}var ret=new qlc();if(!arr||!arr.length){return ret;}if(arr[0]){ret.push(arr[0]);}if(arr.length<2){return ret;}_24d++;if(d.isIE&&_1e9){var _251=_24d+"";arr[0].setAttribute(_24f,_251);for(var x=1,te;te=arr[x];x++){if(arr[x].getAttribute(_24f)!=_251){ret.push(te);}te.setAttribute(_24f,_251);}}else{if(d.isIE&&arr.commentStrip){try{for(var x=1,te;te=arr[x];x++){if(_201(te)){ret.push(te);}}}catch(e){}}else{if(arr[0]){arr[0][_24f]=_24d;}for(var x=1,te;te=arr[x];x++){if(arr[x][_24f]!=_24d){ret.push(te);}te[_24f]=_24d;}}}return ret;};d.query=function(_252,root){qlc=d._NodeListCtor;if(!_252){return new qlc();}if(_252.constructor==qlc){return _252;}if(typeof _252!="string"){return new qlc(_252);}if(typeof root=="string"){root=d.byId(root);if(!root){return new qlc();}}root=root||_1e5();var od=root.ownerDocument||root.documentElement;_1e9=(root.contentType&&root.contentType=="application/xml")||(d.isOpera&&(root.doctype||od.toString()=="[object XMLDocument]"))||(!!od)&&(d.isIE?od.xml:(root.xmlVersion||od.xmlVersion));var r=_244(_252)(root);if(r&&r.nozip&&!qlc._wrap){return r;}return _250(r);};d.query.pseudos=_215;d._filterQueryResult=function(_253,_254,root){var _255=new d._NodeListCtor(),_256=_1eb(_254),_257=(_256.length==1&&!/[^\w#\.]/.test(_254))?_21c(_256[0]):function(node){return dojo.query(_254,root).indexOf(node)!=-1;};for(var x=0,te;te=_253[x];x++){if(_257(te)){_255.push(te);}}return _255;};};var _258=function(){acme={trim:function(str){str=str.replace(/^\s+/,"");for(var i=str.length-1;i>=0;i--){if(/\S/.test(str.charAt(i))){str=str.substring(0,i+1);break;}}return str;},forEach:function(arr,_259,_25a){if(!arr||!arr.length){return;}for(var i=0,l=arr.length;i<l;++i){_259.call(_25a||window,arr[i],i,arr);}},byId:function(id,doc){if(typeof id=="string"){return (doc||document).getElementById(id);}else{return id;}},doc:document,NodeList:Array};var n=navigator;var dua=n.userAgent;var dav=n.appVersion;var tv=parseFloat(dav);acme.isOpera=(dua.indexOf("Opera")>=0)?tv:undefined;acme.isKhtml=(dav.indexOf("Konqueror")>=0)?tv:undefined;acme.isWebKit=parseFloat(dua.split("WebKit/")[1])||undefined;acme.isChrome=parseFloat(dua.split("Chrome/")[1])||undefined;var _25b=Math.max(dav.indexOf("WebKit"),dav.indexOf("Safari"),0);if(_25b&&!acme.isChrome){acme.isSafari=parseFloat(dav.split("Version/")[1]);if(!acme.isSafari||parseFloat(dav.substr(_25b+7))<=419.3){acme.isSafari=2;}}if(document.all&&!acme.isOpera){acme.isIE=parseFloat(dav.split("MSIE ")[1])||undefined;}Array._wrap=function(arr){return arr;};return acme;};if(this["dojo"]){dojo.provide("dojo._base.query");_1e4(this["queryPortability"]||this["acme"]||dojo);}else{_1e4(this["queryPortability"]||this["acme"]||_258());}})();}if(!dojo._hasResource["dojo._base.xhr"]){dojo._hasResource["dojo._base.xhr"]=true;dojo.provide("dojo._base.xhr");(function(){var _25c=dojo,cfg=_25c.config;function _25d(obj,name,_25e){if(_25e===null){return;}var val=obj[name];if(typeof val=="string"){obj[name]=[val,_25e];}else{if(_25c.isArray(val)){val.push(_25e);}else{obj[name]=_25e;}}};dojo.fieldToObject=function(_25f){var ret=null;var item=_25c.byId(_25f);if(item){var _260=item.name;var type=(item.type||"").toLowerCase();if(_260&&type&&!item.disabled){if(type=="radio"||type=="checkbox"){if(item.checked){ret=item.value;}}else{if(item.multiple){ret=[];_25c.query("option",item).forEach(function(opt){if(opt.selected){ret.push(opt.value);}});}else{ret=item.value;}}}}return ret;};dojo.formToObject=function(_261){var ret={};var _262="file|submit|image|reset|button|";_25c.forEach(dojo.byId(_261).elements,function(item){var _263=item.name;var type=(item.type||"").toLowerCase();if(_263&&type&&_262.indexOf(type)==-1&&!item.disabled){_25d(ret,_263,_25c.fieldToObject(item));if(type=="image"){ret[_263+".x"]=ret[_263+".y"]=ret[_263].x=ret[_263].y=0;}}});return ret;};dojo.objectToQuery=function(map){var enc=encodeURIComponent;var _264=[];var _265={};for(var name in map){var _266=map[name];if(_266!=_265[name]){var _267=enc(name)+"=";if(_25c.isArray(_266)){for(var i=0;i<_266.length;i++){_264.push(_267+enc(_266[i]));}}else{_264.push(_267+enc(_266));}}}return _264.join("&");};dojo.formToQuery=function(_268){return _25c.objectToQuery(_25c.formToObject(_268));};dojo.formToJson=function(_269,_26a){return _25c.toJson(_25c.formToObject(_269),_26a);};dojo.queryToObject=function(str){var ret={};var qp=str.split("&");var dec=decodeURIComponent;_25c.forEach(qp,function(item){if(item.length){var _26b=item.split("=");var name=dec(_26b.shift());var val=dec(_26b.join("="));if(typeof ret[name]=="string"){ret[name]=[ret[name]];}if(_25c.isArray(ret[name])){ret[name].push(val);}else{ret[name]=val;}}});return ret;};dojo._blockAsync=false;var _26c=_25c._contentHandlers=dojo.contentHandlers={text:function(xhr){return xhr.responseText;},json:function(xhr){return _25c.fromJson(xhr.responseText||null);},"json-comment-filtered":function(xhr){if(!dojo.config.useCommentedJson){console.warn("Consider using the standard mimetype:application/json."+" json-commenting can introduce security issues. To"+" decrease the chances of hijacking, use the standard the 'json' handler and"+" prefix your json with: {}&&\n"+"Use djConfig.useCommentedJson=true to turn off this message.");}var _26d=xhr.responseText;var _26e=_26d.indexOf("/*");var _26f=_26d.lastIndexOf("*/");if(_26e==-1||_26f==-1){throw new Error("JSON was not comment filtered");}return _25c.fromJson(_26d.substring(_26e+2,_26f));},javascript:function(xhr){return _25c.eval(xhr.responseText);},xml:function(xhr){var _270=xhr.responseXML;if(_25c.isIE&&(!_270||!_270.documentElement)){var ms=function(n){return "MSXML"+n+".DOMDocument";};var dp=["Microsoft.XMLDOM",ms(6),ms(4),ms(3),ms(2)];_25c.some(dp,function(p){try{var dom=new ActiveXObject(p);dom.async=false;dom.loadXML(xhr.responseText);_270=dom;}catch(e){return false;}return true;});}return _270;},"json-comment-optional":function(xhr){if(xhr.responseText&&/^[^{\[]*\/\*/.test(xhr.responseText)){return _26c["json-comment-filtered"](xhr);}else{return _26c["json"](xhr);}}};dojo._ioSetArgs=function(args,_271,_272,_273){var _274={args:args,url:args.url};var _275=null;if(args.form){var form=_25c.byId(args.form);var _276=form.getAttributeNode("action");_274.url=_274.url||(_276?_276.value:null);_275=_25c.formToObject(form);}var _277=[{}];if(_275){_277.push(_275);}if(args.content){_277.push(args.content);}if(args.preventCache){_277.push({"dojo.preventCache":new Date().valueOf()});}_274.query=_25c.objectToQuery(_25c.mixin.apply(null,_277));_274.handleAs=args.handleAs||"text";var d=new _25c.Deferred(_271);d.addCallbacks(_272,function(_278){return _273(_278,d);});var ld=args.load;if(ld&&_25c.isFunction(ld)){d.addCallback(function(_279){return ld.call(args,_279,_274);});}var err=args.error;if(err&&_25c.isFunction(err)){d.addErrback(function(_27a){return err.call(args,_27a,_274);});}var _27b=args.handle;if(_27b&&_25c.isFunction(_27b)){d.addBoth(function(_27c){return _27b.call(args,_27c,_274);});}if(cfg.ioPublish&&_25c.publish&&_274.args.ioPublish!==false){d.addCallbacks(function(res){_25c.publish("/dojo/io/load",[d,res]);return res;},function(res){_25c.publish("/dojo/io/error",[d,res]);return res;});d.addBoth(function(res){_25c.publish("/dojo/io/done",[d,res]);return res;});}d.ioArgs=_274;return d;};var _27d=function(dfd){dfd.canceled=true;var xhr=dfd.ioArgs.xhr;var _27e=typeof xhr.abort;if(_27e=="function"||_27e=="object"||_27e=="unknown"){xhr.abort();}var err=dfd.ioArgs.error;if(!err){err=new Error("xhr cancelled");err.dojoType="cancel";}return err;};var _27f=function(dfd){var ret=_26c[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);return ret===undefined?null:ret;};var _280=function(_281,dfd){if(!dfd.ioArgs.args.failOk){console.error(_281);}return _281;};var _282=null;var _283=[];var _284=0;var _285=function(dfd){if(_284<=0){_284=0;if(cfg.ioPublish&&_25c.publish&&(!dfd||dfd&&dfd.ioArgs.args.ioPublish!==false)){_25c.publish("/dojo/io/stop");}}};var _286=function(){var now=(new Date()).getTime();if(!_25c._blockAsync){for(var i=0,tif;i<_283.length&&(tif=_283[i]);i++){var dfd=tif.dfd;var func=function(){if(!dfd||dfd.canceled||!tif.validCheck(dfd)){_283.splice(i--,1);_284-=1;}else{if(tif.ioCheck(dfd)){_283.splice(i--,1);tif.resHandle(dfd);_284-=1;}else{if(dfd.startTime){if(dfd.startTime+(dfd.ioArgs.args.timeout||0)<now){_283.splice(i--,1);var err=new Error("timeout exceeded");err.dojoType="timeout";dfd.errback(err);dfd.cancel();_284-=1;}}}}};if(dojo.config.debugAtAllCosts){func.call(this);}else{try{func.call(this);}catch(e){dfd.errback(e);}}}}_285(dfd);if(!_283.length){clearInterval(_282);_282=null;return;}};dojo._ioCancelAll=function(){try{_25c.forEach(_283,function(i){try{i.dfd.cancel();}catch(e){}});}catch(e){}};if(_25c.isIE){_25c.addOnWindowUnload(_25c._ioCancelAll);}_25c._ioNotifyStart=function(dfd){if(cfg.ioPublish&&_25c.publish&&dfd.ioArgs.args.ioPublish!==false){if(!_284){_25c.publish("/dojo/io/start");}_284+=1;_25c.publish("/dojo/io/send",[dfd]);}};_25c._ioWatch=function(dfd,_287,_288,_289){var args=dfd.ioArgs.args;if(args.timeout){dfd.startTime=(new Date()).getTime();}_283.push({dfd:dfd,validCheck:_287,ioCheck:_288,resHandle:_289});if(!_282){_282=setInterval(_286,50);}if(args.sync){_286();}};var _28a="application/x-www-form-urlencoded";var _28b=function(dfd){return dfd.ioArgs.xhr.readyState;};var _28c=function(dfd){return 4==dfd.ioArgs.xhr.readyState;};var _28d=function(dfd){var xhr=dfd.ioArgs.xhr;if(_25c._isDocumentOk(xhr)){dfd.callback(dfd);}else{var err=new Error("Unable to load "+dfd.ioArgs.url+" status:"+xhr.status);err.status=xhr.status;err.responseText=xhr.responseText;dfd.errback(err);}};dojo._ioAddQueryToUrl=function(_28e){if(_28e.query.length){_28e.url+=(_28e.url.indexOf("?")==-1?"?":"&")+_28e.query;_28e.query=null;}};dojo.xhr=function(_28f,args,_290){var dfd=_25c._ioSetArgs(args,_27d,_27f,_280);var _291=dfd.ioArgs;var xhr=_291.xhr=_25c._xhrObj(_291.args);if(!xhr){dfd.cancel();return dfd;}if("postData" in args){_291.query=args.postData;}else{if("putData" in args){_291.query=args.putData;}else{if("rawBody" in args){_291.query=args.rawBody;}else{if((arguments.length>2&&!_290)||"POST|PUT".indexOf(_28f.toUpperCase())==-1){_25c._ioAddQueryToUrl(_291);}}}}xhr.open(_28f,_291.url,args.sync!==true,args.user||undefined,args.password||undefined);if(args.headers){for(var hdr in args.headers){if(hdr.toLowerCase()==="content-type"&&!args.contentType){args.contentType=args.headers[hdr];}else{if(args.headers[hdr]){xhr.setRequestHeader(hdr,args.headers[hdr]);}}}}xhr.setRequestHeader("Content-Type",args.contentType||_28a);if(!args.headers||!("X-Requested-With" in args.headers)){xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");}_25c._ioNotifyStart(dfd);if(dojo.config.debugAtAllCosts){xhr.send(_291.query);}else{try{xhr.send(_291.query);}catch(e){_291.error=e;dfd.cancel();}}_25c._ioWatch(dfd,_28b,_28c,_28d);xhr=null;return dfd;};dojo.xhrGet=function(args){return _25c.xhr("GET",args);};dojo.rawXhrPost=dojo.xhrPost=function(args){return _25c.xhr("POST",args,true);};dojo.rawXhrPut=dojo.xhrPut=function(args){return _25c.xhr("PUT",args,true);};dojo.xhrDelete=function(args){return _25c.xhr("DELETE",args);};})();}if(!dojo._hasResource["dojo._base.fx"]){dojo._hasResource["dojo._base.fx"]=true;dojo.provide("dojo._base.fx");(function(){var d=dojo;var _292=d._mixin;dojo._Line=function(_293,end){this.start=_293;this.end=end;};dojo._Line.prototype.getValue=function(n){return ((this.end-this.start)*n)+this.start;};dojo.Animation=function(args){_292(this,args);if(d.isArray(this.curve)){this.curve=new d._Line(this.curve[0],this.curve[1]);}};d._Animation=d.Animation;d.extend(dojo.Animation,{duration:350,repeat:0,rate:20,_percent:0,_startRepeatCount:0,_getStep:function(){var _294=this._percent,_295=this.easing;return _295?_295(_294):_294;},_fire:function(evt,args){var a=args||[];if(this[evt]){if(d.config.debugAtAllCosts){this[evt].apply(this,a);}else{try{this[evt].apply(this,a);}catch(e){console.error("exception in animation handler for:",evt);console.error(e);}}}return this;},play:function(_296,_297){var _298=this;if(_298._delayTimer){_298._clearTimer();}if(_297){_298._stopTimer();_298._active=_298._paused=false;_298._percent=0;}else{if(_298._active&&!_298._paused){return _298;}}_298._fire("beforeBegin",[_298.node]);var de=_296||_298.delay,_299=dojo.hitch(_298,"_play",_297);if(de>0){_298._delayTimer=setTimeout(_299,de);return _298;}_299();return _298;},_play:function(_29a){var _29b=this;if(_29b._delayTimer){_29b._clearTimer();}_29b._startTime=new Date().valueOf();if(_29b._paused){_29b._startTime-=_29b.duration*_29b._percent;}_29b._active=true;_29b._paused=false;var _29c=_29b.curve.getValue(_29b._getStep());if(!_29b._percent){if(!_29b._startRepeatCount){_29b._startRepeatCount=_29b.repeat;}_29b._fire("onBegin",[_29c]);}_29b._fire("onPlay",[_29c]);_29b._cycle();return _29b;},pause:function(){var _29d=this;if(_29d._delayTimer){_29d._clearTimer();}_29d._stopTimer();if(!_29d._active){return _29d;}_29d._paused=true;_29d._fire("onPause",[_29d.curve.getValue(_29d._getStep())]);return _29d;},gotoPercent:function(_29e,_29f){var _2a0=this;_2a0._stopTimer();_2a0._active=_2a0._paused=true;_2a0._percent=_29e;if(_29f){_2a0.play();}return _2a0;},stop:function(_2a1){var _2a2=this;if(_2a2._delayTimer){_2a2._clearTimer();}if(!_2a2._timer){return _2a2;}_2a2._stopTimer();if(_2a1){_2a2._percent=1;}_2a2._fire("onStop",[_2a2.curve.getValue(_2a2._getStep())]);_2a2._active=_2a2._paused=false;return _2a2;},status:function(){if(this._active){return this._paused?"paused":"playing";}return "stopped";},_cycle:function(){var _2a3=this;if(_2a3._active){var curr=new Date().valueOf();var step=(curr-_2a3._startTime)/(_2a3.duration);if(step>=1){step=1;}_2a3._percent=step;if(_2a3.easing){step=_2a3.easing(step);}_2a3._fire("onAnimate",[_2a3.curve.getValue(step)]);if(_2a3._percent<1){_2a3._startTimer();}else{_2a3._active=false;if(_2a3.repeat>0){_2a3.repeat--;_2a3.play(null,true);}else{if(_2a3.repeat==-1){_2a3.play(null,true);}else{if(_2a3._startRepeatCount){_2a3.repeat=_2a3._startRepeatCount;_2a3._startRepeatCount=0;}}}_2a3._percent=0;_2a3._fire("onEnd",[_2a3.node]);!_2a3.repeat&&_2a3._stopTimer();}}return _2a3;},_clearTimer:function(){clearTimeout(this._delayTimer);delete this._delayTimer;}});var ctr=0,_2a4=null,_2a5={run:function(){}};d.extend(d.Animation,{_startTimer:function(){if(!this._timer){this._timer=d.connect(_2a5,"run",this,"_cycle");ctr++;}if(!_2a4){_2a4=setInterval(d.hitch(_2a5,"run"),this.rate);}},_stopTimer:function(){if(this._timer){d.disconnect(this._timer);this._timer=null;ctr--;}if(ctr<=0){clearInterval(_2a4);_2a4=null;ctr=0;}}});var _2a6=d.isIE?function(node){var ns=node.style;if(!ns.width.length&&d.style(node,"width")=="auto"){ns.width="auto";}}:function(){};dojo._fade=function(args){args.node=d.byId(args.node);var _2a7=_292({properties:{}},args),_2a8=(_2a7.properties.opacity={});_2a8.start=!("start" in _2a7)?function(){return +d.style(_2a7.node,"opacity")||0;}:_2a7.start;_2a8.end=_2a7.end;var anim=d.animateProperty(_2a7);d.connect(anim,"beforeBegin",d.partial(_2a6,_2a7.node));return anim;};dojo.fadeIn=function(args){return d._fade(_292({end:1},args));};dojo.fadeOut=function(args){return d._fade(_292({end:0},args));};dojo._defaultEasing=function(n){return 0.5+((Math.sin((n+1.5)*Math.PI))/2);};var _2a9=function(_2aa){this._properties=_2aa;for(var p in _2aa){var prop=_2aa[p];if(prop.start instanceof d.Color){prop.tempColor=new d.Color();}}};_2a9.prototype.getValue=function(r){var ret={};for(var p in this._properties){var prop=this._properties[p],_2ab=prop.start;if(_2ab instanceof d.Color){ret[p]=d.blendColors(_2ab,prop.end,r,prop.tempColor).toCss();}else{if(!d.isArray(_2ab)){ret[p]=((prop.end-_2ab)*r)+_2ab+(p!="opacity"?prop.units||"px":0);}}}return ret;};dojo.animateProperty=function(args){var n=args.node=d.byId(args.node);if(!args.easing){args.easing=d._defaultEasing;}var anim=new d.Animation(args);d.connect(anim,"beforeBegin",anim,function(){var pm={};for(var p in this.properties){if(p=="width"||p=="height"){this.node.display="block";}var prop=this.properties[p];if(d.isFunction(prop)){prop=prop(n);}prop=pm[p]=_292({},(d.isObject(prop)?prop:{end:prop}));if(d.isFunction(prop.start)){prop.start=prop.start(n);}if(d.isFunction(prop.end)){prop.end=prop.end(n);}var _2ac=(p.toLowerCase().indexOf("color")>=0);function _2ad(node,p){var v={height:node.offsetHeight,width:node.offsetWidth}[p];if(v!==undefined){return v;}v=d.style(node,p);return (p=="opacity")?+v:(_2ac?v:parseFloat(v));};if(!("end" in prop)){prop.end=_2ad(n,p);}else{if(!("start" in prop)){prop.start=_2ad(n,p);}}if(_2ac){prop.start=new d.Color(prop.start);prop.end=new d.Color(prop.end);}else{prop.start=(p=="opacity")?+prop.start:parseFloat(prop.start);}}this.curve=new _2a9(pm);});d.connect(anim,"onAnimate",d.hitch(d,"style",anim.node));return anim;};dojo.anim=function(node,_2ae,_2af,_2b0,_2b1,_2b2){return d.animateProperty({node:node,duration:_2af||d.Animation.prototype.duration,properties:_2ae,easing:_2b0,onEnd:_2b1}).play(_2b2||0);};})();}if(!dojo._hasResource["dojo._base.browser"]){dojo._hasResource["dojo._base.browser"]=true;dojo.provide("dojo._base.browser");dojo.forEach(dojo.config.require,function(i){dojo["require"](i);});}if(!dojo._hasResource["dojo._base"]){dojo._hasResource["dojo._base"]=true;dojo.provide("dojo._base");}if(dojo.isBrowser&&(document.readyState==="complete"||dojo.config.afterOnLoad)){window.setTimeout(dojo._loadInit,100);}})();
+//>>built
+(function(_1,_2){var _3=function(){},_4=function(it){for(var p in it){return 0;}return 1;},_5={}.toString,_6=function(it){return _5.call(it)=="[object Function]";},_7=function(it){return _5.call(it)=="[object String]";},_8=function(it){return _5.call(it)=="[object Array]";},_9=function(_a,_b){if(_a){for(var i=0;i<_a.length;){_b(_a[i++]);}}},_c=function(_d,_e){for(var p in _e){_d[p]=_e[p];}return _d;},_f=function(_10,_11){return _c(new Error(_10),{src:"dojoLoader",info:_11});},_12=1,uid=function(){return "_"+_12++;},req=function(_13,_14,_15){return _16(_13,_14,_15,0,req);},_17=this,doc=_17.document,_18=doc&&doc.createElement("DiV"),has=req.has=function(_19){return _6(_1a[_19])?(_1a[_19]=_1a[_19](_17,doc,_18)):_1a[_19];},_1a=has.cache=_2.hasCache;has.add=function(_1b,_1c,now,_1d){(_1a[_1b]===undefined||_1d)&&(_1a[_1b]=_1c);return now&&has(_1b);};false&&has.add("host-node",_1.has&&"host-node" in _1.has?_1.has["host-node"]:(typeof process=="object"&&process.versions&&process.versions.node&&process.versions.v8));if(0){require("./_base/configNode.js").config(_2);_2.loaderPatch.nodeRequire=require;}false&&has.add("host-rhino",_1.has&&"host-rhino" in _1.has?_1.has["host-rhino"]:(typeof load=="function"&&(typeof Packages=="function"||typeof Packages=="object")));if(0){for(var _1e=_1.baseUrl||".",arg,_1f=this.arguments,i=0;i<_1f.length;){arg=(_1f[i++]+"").split("=");if(arg[0]=="baseUrl"){_1e=arg[1];break;}}load(_1e+"/_base/configRhino.js");rhinoDojoConfig(_2,_1e,_1f);}for(var p in _1.has){has.add(p,_1.has[p],0,1);}var _20=1,_21=2,_22=3,_23=4,_24=5;if(0){_20="requested";_21="arrived";_22="not-a-module";_23="executing";_24="executed";}var _25=0,_26="sync",xd="xd",_27=[],_28=0,_29=_3,_2a=_3,_2b;if(1){req.isXdUrl=_3;req.initSyncLoader=function(_2c,_2d,_2e){if(!_28){_28=_2c;_29=_2d;_2a=_2e;}return {sync:_26,xd:xd,arrived:_21,nonmodule:_22,executing:_23,executed:_24,syncExecStack:_27,modules:_2f,execQ:_30,getModule:_31,injectModule:_32,setArrived:_33,signal:_34,finishExec:_35,execModule:_36,dojoRequirePlugin:_28,getLegacyMode:function(){return _25;},holdIdle:function(){_76++;},releaseIdle:function(){_37();}};};if(1){var _38=location.protocol,_39=location.host,_3a=!_39;req.isXdUrl=function(url){if(_3a||/^\./.test(url)){return false;}if(/^\/\//.test(url)){return true;}var _3b=url.match(/^([^\/\:]+\:)\/\/([^\/]+)/);return _3b&&(_3b[1]!=_38||_3b[2]!=_39);};true||has.add("dojo-xhr-factory",1);has.add("dojo-force-activex-xhr",1&&!doc.addEventListener&&window.location.protocol=="file:");has.add("native-xhr",typeof XMLHttpRequest!="undefined");if(has("native-xhr")&&!has("dojo-force-activex-xhr")){_2b=function(){return new XMLHttpRequest();};}else{for(var _3c=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],_3d,i=0;i<3;){try{_3d=_3c[i++];if(new ActiveXObject(_3d)){break;}}catch(e){}}_2b=function(){return new ActiveXObject(_3d);};}req.getXhr=_2b;has.add("dojo-gettext-api",1);req.getText=function(url,_3e,_3f){var xhr=_2b();xhr.open("GET",_40(url),false);xhr.send(null);if(xhr.status==200||(!location.host&&!xhr.status)){if(_3f){_3f(xhr.responseText,_3e);}}else{throw _f("xhrFailed",xhr.status);}return xhr.responseText;};}}else{req.async=1;}var _41=new Function("return eval(arguments[0]);");req.eval=function(_42,_43){return _41(_42+"\r\n////@ sourceURL="+_43);};var _44={},_45="error",_34=req.signal=function(_46,_47){var _48=_44[_46];_9(_48&&_48.slice(0),function(_49){_49.apply(null,_8(_47)?_47:[_47]);});},on=req.on=function(_4a,_4b){var _4c=_44[_4a]||(_44[_4a]=[]);_4c.push(_4b);return {remove:function(){for(var i=0;i<_4c.length;i++){if(_4c[i]===_4b){_4c.splice(i,1);return;}}}};};var _4d=[],_4e={},_4f=[],_50={},_51={},_52=[],_2f={},_53="",_54={},_55={},_56={};if(1){var _57=function(_58){var p,_59,_5a,now;for(p in _55){_59=_55[p];_5a=p.match(/^url\:(.+)/);if(_5a){_54[_5b(_5a[1],_58)]=_59;}else{if(p=="*now"){now=_59;}else{if(p!="*noref"){_54[_5c(p,_58).mid]=_59;}}}}if(now){now(_5d(_58));}_55={};},_5e=function(map,_5f,_60){_5f.splice(0,_5f.length);var p,i,_61,_62=0;for(p in map){_5f.push([p,map[p]]);if(map[p]==_60){_62=p;}}_5f.sort(function(lhs,rhs){return rhs[0].length-lhs[0].length;});for(i=0;i<_5f.length;){_61=_5f[i++];_61[2]=new RegExp("^"+_61[0].replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(c){return "\\"+c;})+"(/|$)");_61[3]=_61[0].length+1;}return _62;},_63=function(_64,_65){var _66=_64.name;if(!_66){_66=_64;_64={name:_66};}_64=_c({main:"main",mapProg:[]},_64);_64.location=(_65||"")+(_64.location?_64.location:_66);_64.reverseName=_5e(_64.packageMap,_64.mapProg,_66);if(!_64.main.indexOf("./")){_64.main=_64.main.substring(2);}_c(_4e,_64.paths);_50[_66]=_64;_51[_66]=_66;},_67=function(_68,_69){for(var p in _68){if(p=="waitSeconds"){req.waitms=(_68[p]||0)*1000;}if(p=="cacheBust"){_53=_68[p]?(_7(_68[p])?_68[p]:(new Date()).getTime()+""):"";}if(p=="baseUrl"||p=="combo"){req[p]=_68[p];}if(1&&p=="async"){var _6a=_68[p];req.legacyMode=_25=(_7(_6a)&&/sync|legacyAsync/.test(_6a)?_6a:(!_6a?"sync":false));req.async=!_25;}if(_68[p]!==_1a){req.rawConfig[p]=_68[p];p!="has"&&has.add("config-"+p,_68[p],0,_69);}}if(!req.baseUrl){req.baseUrl="./";}if(!/\/$/.test(req.baseUrl)){req.baseUrl+="/";}for(p in _68.has){has.add(p,_68.has[p],0,_69);}_9(_68.packages,_63);for(_1e in _68.packagePaths){_9(_68.packagePaths[_1e],function(_6b){_63(_6b,_1e+"/");});}_5e(_c(_4e,_68.paths),_4f);_9(_68.aliases,function(_6c){if(_7(_6c[0])){_6c[0]=new RegExp("^"+_6c[0].replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(c){return "\\"+c;})+"$");}_4d.push(_6c);});_5e(_c(_51,_68.packageMap),_52);if(_68.cache){_57();_55=_68.cache;if(_68.cache["*noref"]){_57();}}_34("config",[_68,req.rawConfig]);};if(has("dojo-cdn")||1){for(var _6d,src,_6e,_6f=doc.getElementsByTagName("script"),i=0;i<_6f.length&&!_6e;i++){if((src=_6f[i].getAttribute("src"))&&(_6e=src.match(/(.*)\/?dojo\.js(\W|$)/i))){_1.baseUrl=_6d=_1.baseUrl||_2.baseUrl||_6e[1];src=(_6f[i].getAttribute("data-dojo-config")||_6f[i].getAttribute("djConfig"));if(src){_56=req.eval("({ "+src+" })","data-dojo-config");}if(0){var _70=_6f[i].getAttribute("data-main");if(_70){_56.deps=_56.deps||[_70];}}}}}if(0){try{if(window.parent!=window&&window.parent.require){var doh=window.parent.require("doh");doh&&_c(_56,doh.testConfig);}}catch(e){}}req.rawConfig={};_67(_2,1);_67(_1,1);_67(_56,1);if(has("dojo-cdn")){_50.dojo.location=_6d;_50.dijit.location=_6d+"../dijit/";_50.dojox.location=_6d+"../dojox/";}}else{_4e=_2.paths;_4f=_2.pathsMapProg;_50=_2.packs;_4d=_2.aliases;_51=_2.packageMap;_52=_2.packageMapProg;_2f=_2.modules;_54=_2.cache;_53=_2.cacheBust;req.rawConfig=_2;}if(0){req.combo=req.combo||{add:_3};var _71=0,_72=[],_73=null;}var _74=function(_75){_76++;_9(_75.deps,_32);if(0&&_71&&!_73){_73=setTimeout(function(){_71=0;_73=null;req.combo.done(function(_77,url){var _78=function(){_79(0,_77);_7a();};_72.push(_77);_7b=_77;req.injectUrl(url,_78,_77);_7b=0;},req);},0);}_37();},_16=function(a1,a2,a3,_7c,_7d){var _7e,_7f;if(_7(a1)){_7e=_31(a1,_7c,true);if(_7e&&_7e.executed){return _7e.result;}throw _f("undefinedModule",a1);}if(!_8(a1)){_67(a1);a1=a2;a2=a3;}if(_8(a1)){if(!a1.length){a2&&a2();}else{_7f="require*"+uid();for(var mid,_80=[],i=0;i<a1.length;){mid=a1[i++];if(mid in {exports:1,module:1}){throw _f("illegalModuleId",mid);}_80.push(_31(mid,_7c));}_7e=_c(_81("",_7f,0,""),{injected:_21,deps:_80,def:a2||_3,require:_7c?_7c.require:req});_2f[_7e.mid]=_7e;_74(_7e);var _82=_76&&req.async;_76++;_36(_7e,_82);_37();if(!_7e.executed){_30.push(_7e);}_7a();}}return _7d;},_5d=function(_83){if(!_83){return req;}var _84=_83.require;if(!_84){_84=function(a1,a2,a3){return _16(a1,a2,a3,_83,_84);};_83.require=_c(_84,req);_84.module=_83;_84.toUrl=function(_85){return _5b(_85,_83);};_84.toAbsMid=function(mid){return _b4(mid,_83);};if(0){_84.undef=function(mid){req.undef(mid,_83);};}if(1){_84.syncLoadNls=function(mid){var _86=_5c(mid,_83),_87=_2f[_86.mid];if(!_87||!_87.executed){_88=_54[_86.mid]||_54[_86.cacheId];if(_88){_89(_88);_87=_2f[_86.mid];}}return _87&&_87.executed&&_87.result;};}}return _84;},_30=[],_8a=[],_8b={},_8c=function(_8d){_8d.injected=_20;_8b[_8d.mid]=1;if(_8d.url){_8b[_8d.url]=_8d.pack||1;}},_33=function(_8e){_8e.injected=_21;delete _8b[_8e.mid];if(_8e.url){delete _8b[_8e.url];}if(_4(_8b)){_8f();1&&_25==xd&&(_25=_26);}},_90=req.idle=function(){return !_8a.length&&_4(_8b)&&!_30.length&&!_76;},_91=function(_92,map){for(var i=0;i<map.length;i++){if(map[i][2].test(_92)){return map[i];}}return 0;},_93=function(_94){var _95=[],_96,_97;_94=_94.replace(/\\/g,"/").split("/");while(_94.length){_96=_94.shift();if(_96==".."&&_95.length&&_97!=".."){_95.pop();_97=_95[_95.length-1];}else{if(_96!="."){_95.push(_97=_96);}}}return _95.join("/");},_81=function(pid,mid,_98,url,_99){if(1){var xd=req.isXdUrl(url);return {pid:pid,mid:mid,pack:_98,url:url,executed:0,def:0,isXd:xd,isAmd:!!(xd||(_50[pid]&&_50[pid].isAmd)),cacheId:_99};}else{return {pid:pid,mid:mid,pack:_98,url:url,executed:0,def:0,cacheId:_99};}},_9a=function(mid,_9b,_9c,_9d,_9e,_9f,_a0,_a1){var pid,_a2,_a3,_a4,_a5,_a6,url,_a7,_a8,_a9,_aa=0;_a9=mid;_a8=/^\./.test(mid);if(/(^\/)|(\:)|(\.js$)/.test(mid)||(_a8&&!_9b)){return _81(0,mid,0,mid);}else{mid=_93(_a8?(_9b.mid+"/../"+mid):mid);if(/^\./.test(mid)){throw _f("irrationalPath",mid);}_a4=_9b&&_9b.pack&&_9b.pack.mapProg;_a5=(_a4&&_91(mid,_a4))||_91(mid,_9f);if(_a5){pid=_a5[1];mid=mid.substring(_a5[3]);_a2=_9c[pid];if(!mid){mid=_a2.main;}_a3=mid;_aa=_a2.reverseName+"/"+mid;mid=pid+"/"+mid;}else{pid="";}var _ab=0,_ac=0;_9(_4d,function(_ad){var _ae=mid.match(_ad[0]);if(_ae&&_ae.length>_ab){_ac=_6(_ad[1])?mid.replace(_ad[0],_ad[1]):_ad[1];}});if(_ac){return _9a(_ac,0,_9c,_9d,_9e,_9f,_a0,_a1);}_a7=_9d[mid];if(_a7){return _a1?_81(_a7.pid,_a7.mid,_a7.pack,_a7.url,_aa):_9d[mid];}}_a5=_91(mid,_a0);if(_a5){url=_a5[1]+mid.substring(_a5[3]-1);}else{if(pid){url=_a2.location+"/"+_a3;}else{if(has("config-tlmSiblingOfDojo")){url="../"+mid;}else{url=mid;}}}if(!(/(^\/)|(\:)/.test(url))){url=_9e+url;}url+=".js";return _81(pid,mid,_a2,_93(url),_aa);},_5c=function(mid,_af){return _9a(mid,_af,_50,_2f,req.baseUrl,_52,_4f);},_b0=function(_b1,_b2,_b3){return _b1.normalize?_b1.normalize(_b2,function(mid){return _b4(mid,_b3);}):_b4(_b2,_b3);},_b5=0,_31=function(mid,_b6,_b7){var _b8,_b9,_ba,_bb;_b8=mid.match(/^(.+?)\!(.*)$/);if(_b8){_b9=_31(_b8[1],_b6,_b7);if(1&&_25==_26&&!_b9.executed){_32(_b9);if(_b9.injected===_21&&!_b9.executed){_76++;_36(_b9);_37();}if(_b9.executed){_bc(_b9);}else{_30.unshift(_b9);}}if(_b9.executed===_24&&!_b9.load){_bc(_b9);}if(_b9.load){_ba=_b0(_b9,_b8[2],_b6);mid=(_b9.mid+"!"+(_b9.dynamic?++_b5+"!":"")+_ba);}else{_ba=_b8[2];mid=_b9.mid+"!"+(++_b5)+"!waitingForPlugin";}_bb={plugin:_b9,mid:mid,req:_5d(_b6),prid:_ba};}else{_bb=_5c(mid,_b6);}return _2f[_bb.mid]||(!_b7&&(_2f[_bb.mid]=_bb));},_b4=req.toAbsMid=function(mid,_bd){return _5c(mid,_bd).mid;},_5b=req.toUrl=function(_be,_bf){var _c0=_5c(_be+"/x",_bf),url=_c0.url;return _40(_c0.pid===0?_be:url.substring(0,url.length-5));},_c1={injected:_21,executed:_24,def:_22,result:_22},_c2=function(mid){return _2f[mid]=_c({mid:mid},_c1);},_c3=_c2("require"),_c4=_c2("exports"),_c5=_c2("module"),_c6=function(_c7,_c8){req.trace("loader-run-factory",[_c7.mid]);var _c9=_c7.def,_ca;1&&_27.unshift(_c7);if(has("config-dojo-loader-catches")){try{_ca=_6(_c9)?_c9.apply(null,_c8):_c9;}catch(e){_34(_45,_c7.result=_f("factoryThrew",[_c7,e]));}}else{_ca=_6(_c9)?_c9.apply(null,_c8):_c9;}_c7.result=_ca===undefined&&_c7.cjs?_c7.cjs.exports:_ca;1&&_27.shift(_c7);},_cb={},_cc=0,_bc=function(_cd){var _ce=_cd.result;_cd.dynamic=_ce.dynamic;_cd.normalize=_ce.normalize;_cd.load=_ce.load;return _cd;},_cf=function(_d0){var map={};_9(_d0.loadQ,function(_d1){var _d2=_d1.mid,_d3=_b0(_d0,_d1.prid,_d1.req.module),mid=_d0.dynamic?_d1.mid.replace(/waitingForPlugin$/,_d3):(_d0.mid+"!"+_d3),_d4=_c(_c({},_d1),{mid:mid,prid:_d3,injected:0});if(!_2f[mid]){_e5(_2f[mid]=_d4);}map[_d1.mid]=_2f[mid];_33(_d1);delete _2f[_d1.mid];});_d0.loadQ=0;var _d5=function(_d6){for(var _d7,_d8=_d6.deps||[],i=0;i<_d8.length;i++){_d7=map[_d8[i].mid];if(_d7){_d8[i]=_d7;}}};for(var p in _2f){_d5(_2f[p]);}_9(_30,_d5);},_35=function(_d9){req.trace("loader-finish-exec",[_d9.mid]);_d9.executed=_24;_d9.defOrder=_cc++;1&&_9(_d9.provides,function(cb){cb();});if(_d9.loadQ){_bc(_d9);_cf(_d9);}for(i=0;i<_30.length;){if(_30[i]===_d9){_30.splice(i,1);}else{i++;}}},_da=[],_36=function(_db,_dc){if(_db.executed===_23){req.trace("loader-circular-dependency",[_da.concat(mid).join("->")]);return (!_db.def||_dc)?_cb:(_db.cjs&&_db.cjs.exports);}if(!_db.executed){if(!_db.def){return _cb;}var mid=_db.mid,_dd=_db.deps||[],arg,_de,_df=[],i=0;if(0){_da.push(mid);req.trace("loader-exec-module",["exec",_da.length,mid]);}_db.executed=_23;while(i<_dd.length){arg=_dd[i++];_de=((arg===_c3)?_5d(_db):((arg===_c4)?_db.cjs.exports:((arg===_c5)?_db.cjs:_36(arg,_dc))));if(_de===_cb){_db.executed=0;req.trace("loader-exec-module",["abort",mid]);0&&_da.pop();return _cb;}_df.push(_de);}_c6(_db,_df);_35(_db);}0&&_da.pop();return _db.result;},_76=0,_7a=function(){if(_76){return;}_76++;_29();for(var _e0,_e1,i=0;i<_30.length;){_e0=_cc;_e1=_30[i];_36(_e1);if(_e0!=_cc){_29();i=0;}else{i++;}}_37();},_37=function(){_76--;if(_90()){_34("idle",[]);}};if(0){req.undef=function(_e2,_e3){var _e4=_31(_e2,_e3);_33(_e4);delete _2f[_e4.mid];};}if(1){if(has("dojo-loader-eval-hint-url")===undefined){has.add("dojo-loader-eval-hint-url",1);}var _40=function(url){url+="";return url+(_53?((/\?/.test(url)?"&":"?")+_53):"");},_e5=function(_e6){var _e7=_e6.plugin;if(_e7.executed===_24&&!_e7.load){_bc(_e7);}var _e8=function(def){_e6.result=def;_33(_e6);_35(_e6);_7a();};if(_e7.load){_e7.load(_e6.prid,_e6.req,_e8);}else{if(_e7.loadQ){_e7.loadQ.push(_e6);}else{_e7.loadQ=[_e6];_30.unshift(_e7);_32(_e7);}}},_88=0,_7b=0,_e9=0,_89=function(_ea,_eb){_e9=1;if(has("config-dojo-loader-catches")){try{if(_ea===_88){_88.call(null);}else{req.eval(_ea,has("dojo-loader-eval-hint-url")?_eb.url:_eb.mid);}}catch(e){_34(_45,_f("evalModuleThrew",_eb));}}else{if(_ea===_88){_88.call(null);}else{req.eval(_ea,has("dojo-loader-eval-hint-url")?_eb.url:_eb.mid);}}_e9=0;},_32=function(_ec){var mid=_ec.mid,url=_ec.url;if(_ec.executed||_ec.injected||_8b[mid]||(_ec.url&&((_ec.pack&&_8b[_ec.url]===_ec.pack)||_8b[_ec.url]==1))){return;}_8c(_ec);if(0){var _ed=0;if(_ec.plugin&&_ec.plugin.isCombo){req.combo.add(_ec.plugin.mid,_ec.prid,0,req);_ed=1;}else{if(!_ec.plugin){_ed=req.combo.add(0,_ec.mid,_ec.url,req);}}if(_ed){_71=1;return;}}if(_ec.plugin){_e5(_ec);return;}var _ee=function(){_79(_ec);if(_ec.injected!==_21){_33(_ec);_c(_ec,_c1);}if(1&&_25){!_27.length&&_7a();}else{_7a();}};_88=_54[mid]||_54[_ec.cacheId];if(_88){req.trace("loader-inject",["cache",_ec.mid,url]);_89(_88,_ec);_ee();return;}if(1&&_25){if(_ec.isXd){_25==_26&&(_25=xd);}else{if(_ec.isAmd&&_25!=_26){}else{var _ef=function(_f0){if(_25==_26){_27.unshift(_ec);_89(_f0,_ec);_27.shift();_79(_ec);if(!_ec.cjs){_33(_ec);_35(_ec);}if(_ec.finish){var _f1=mid+"*finish",_f2=_ec.finish;delete _ec.finish;def(_f1,["dojo",("dojo/require!"+_f2.join(",")).replace(/\./g,"/")],function(_f3){_9(_f2,function(mid){_f3.require(mid);});});_30.unshift(_31(_f1));}_ee();}else{_f0=_2a(_ec,_f0);if(_f0){_89(_f0,_ec);_ee();}else{_7b=_ec;req.injectUrl(_40(url),_ee,_ec);_7b=0;}}};req.trace("loader-inject",["xhr",_ec.mid,url,_25!=_26]);if(has("config-dojo-loader-catches")){try{req.getText(url,_25!=_26,_ef);}catch(e){_34(_45,_f("xhrInjectFailed",[_ec,e]));}}else{req.getText(url,_25!=_26,_ef);}return;}}}req.trace("loader-inject",["script",_ec.mid,url]);_7b=_ec;req.injectUrl(_40(url),_ee,_ec);_7b=0;},_f4=function(_f5,_f6,def){req.trace("loader-define-module",[_f5.mid,_f6]);if(0&&_f5.plugin&&_f5.plugin.isCombo){_f5.result=_6(def)?def():def;_33(_f5);_35(_f5);return _f5;}var mid=_f5.mid;if(_f5.injected===_21){_34(_45,_f("multipleDefine",_f5));return _f5;}_c(_f5,{deps:_f6,def:def,cjs:{id:_f5.mid,uri:_f5.url,exports:(_f5.result={}),setExports:function(_f7){_f5.cjs.exports=_f7;}}});for(var i=0;i<_f6.length;i++){_f6[i]=_31(_f6[i],_f5);}if(1&&_25&&!_8b[mid]){_74(_f5);_30.push(_f5);_7a();}_33(_f5);if(!_6(def)&&!_f6.length){_f5.result=def;_35(_f5);}return _f5;},_79=function(_f8,_f9){var _fa=[],_fb,_fc;while(_8a.length){_fc=_8a.shift();_f9&&(_fc[0]=_f9.shift());_fb=(_fc[0]&&_31(_fc[0]))||_f8;_fa.push([_fb,_fc[1],_fc[2]]);}_57(_f8);_9(_fa,function(_fd){_74(_f4.apply(null,_fd));});};}var _fe=0,_8f=_3,_ff=_3;if(1){_8f=function(){_fe&&clearTimeout(_fe);_fe=0;},_ff=function(){_8f();req.waitms&&(_fe=setTimeout(function(){_8f();_34(_45,_f("timeout",_8b));},req.waitms));};}if(1){has.add("ie-event-behavior",doc.attachEvent&&(typeof opera==="undefined"||opera.toString()!="[object Opera]"));}if(1&&(1||1)){var _100=function(node,_101,_102,_103){if(!has("ie-event-behavior")){node.addEventListener(_101,_103,false);return function(){node.removeEventListener(_101,_103,false);};}else{node.attachEvent(_102,_103);return function(){node.detachEvent(_102,_103);};}},_104=_100(window,"load","onload",function(){req.pageLoaded=1;doc.readyState!="complete"&&(doc.readyState="complete");_104();});if(1){var _105=doc.getElementsByTagName("script")[0],_106=_105.parentNode;req.injectUrl=function(url,_107,_108){_ff();var node=_108.node=doc.createElement("script"),_109=function(e){e=e||window.event;var node=e.target||e.srcElement;if(e.type==="load"||/complete|loaded/.test(node.readyState)){_10a();_107&&_107();}},_10a=_100(node,"load","onreadystatechange",_109);node.type="text/javascript";node.charset="utf-8";node.src=url;_106.insertBefore(node,_105);return node;};}}if(1){req.log=function(){try{for(var i=0;i<arguments.length;i++){}}catch(e){}};}else{req.log=_3;}if(0){var _10b=req.trace=function(_10c,args){if(_10b.on&&_10b.group[_10c]){_34("trace",[_10c,args]);for(var arg,dump=[],text="trace:"+_10c+(args.length?(":"+args[0]):""),i=1;i<args.length;){arg=args[i++];if(_7(arg)){text+=", "+arg;}else{dump.push(arg);}}req.log(text);dump.length&&dump.push(".");req.log.apply(req,dump);}};_c(_10b,{on:1,group:{},set:function(_10d,_10e){if(_7(_10d)){_10b.group[_10d]=_10e;}else{_c(_10b.group,_10d);}}});_10b.set(_c(_c(_c({},_2.trace),_1.trace),_56.trace));on("config",function(_10f){_10f.trace&&_10b.set(_10f.trace);});}else{req.trace=_3;}var def=function(mid,_110,_111){var _112=arguments.length,args=0,_113=["require","exports","module"];if(0){if(_112==1&&_6(mid)){_110=[];mid.toString().replace(/(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg,"").replace(/require\(["']([\w\!\-_\.\/]+)["']\)/g,function(_114,dep){_110.push(dep);});args=[0,_113.concat(_110),mid];}}if(!args){args=_112==1?[0,_113,mid]:(_112==2?(_8(mid)?[0,mid,_110]:(_6(_110)?[mid,_113,_110]:[mid,[],_110])):[mid,_110,_111]);}req.trace("loader-define",args.slice(0,2));var _115=args[0]&&_31(args[0]),_116;if(_115&&!_8b[_115.mid]){_74(_f4(_115,args[1],args[2]));}else{if(!has("ie-event-behavior")||!1||_e9){_8a.push(args);}else{_115=_115||_7b;if(!_115){for(mid in _8b){_116=_2f[mid];if(_116&&_116.node&&_116.node.readyState==="interactive"){_115=_116;break;}}if(0&&!_115){for(var i=0;i<_72.length;i++){_115=_72[i];if(_115.node&&_115.node.readyState==="interactive"){break;}_115=0;}}}if(0&&_8(_115)){_74(_f4(_31(_115.shift()),args[1],args[2]));if(!_115.length){_72.splice(i,1);}}else{if(_115){_57(_115);_74(_f4(_115,args[1],args[2]));}else{_34(_45,_f("ieDefineFailed",args[0]));}}_7a();}}};def.amd={vendor:"dojotoolkit.org"};if(0){req.def=def;}_c(_c(req,_2.loaderPatch),_1.loaderPatch);on(_45,function(arg){try{console.error(arg);if(arg instanceof Error){for(var p in arg){}}}catch(e){}});_c(req,{uid:uid,cache:_54,packs:_50});if(0){_c(req,{paths:_4e,aliases:_4d,packageMap:_51,modules:_2f,legacyMode:_25,execQ:_30,defQ:_8a,waiting:_8b,pathsMapProg:_4f,packageMapProg:_52,listenerQueues:_44,computeMapProg:_5e,runMapProg:_91,compactPath:_93,getModuleInfo:_9a});}if(_17.define){if(1){_34(_45,_f("defineAlreadyDefined",0));}}else{_17.define=def;_17.require=req;}if(0&&req.combo&&req.combo.plugins){var _117=req.combo.plugins,_118;for(_118 in _117){_c(_c(_31(_118),_117[_118]),{isCombo:1,executed:"executed",load:1});}}if(1){var _119=_56.deps||_1.deps||_2.deps,_11a=_56.callback||_1.callback||_2.callback;req.boot=(_119||_11a)?[_119||[],_11a]:0;}if(!1){!req.async&&req(["dojo"]);req.boot&&req.apply(null,req.boot);}})(this.dojoConfig||this.djConfig||this.require||{},{async:0,hasCache:{"config-selectorEngine":"acme","config-tlmSiblingOfDojo":1,"dojo-built":1,"dojo-loader":1,dom:1,"host-browser":1},packages:[{location:"../dijit",name:"dijit"},{location:".",name:"dojo"}]});require({cache:{"dojo/_base/fx":function(){define(["./kernel","./lang","../Evented","./Color","./connect","./sniff","../dom","../dom-style"],function(dojo,lang,_11b,_11c,_11d,has,dom,_11e){var _11f=lang.mixin;dojo._Line=function(_120,end){this.start=_120;this.end=end;};dojo._Line.prototype.getValue=function(n){return ((this.end-this.start)*n)+this.start;};dojo.Animation=function(args){_11f(this,args);if(lang.isArray(this.curve)){this.curve=new dojo._Line(this.curve[0],this.curve[1]);}};dojo.Animation.prototype=new _11b();dojo._Animation=dojo.Animation;lang.extend(dojo.Animation,{duration:350,repeat:0,rate:20,_percent:0,_startRepeatCount:0,_getStep:function(){var _121=this._percent,_122=this.easing;return _122?_122(_121):_121;},_fire:function(evt,args){var a=args||[];if(this[evt]){if(dojo.config.debugAtAllCosts){this[evt].apply(this,a);}else{try{this[evt].apply(this,a);}catch(e){console.error("exception in animation handler for:",evt);console.error(e);}}}return this;},play:function(_123,_124){var _125=this;if(_125._delayTimer){_125._clearTimer();}if(_124){_125._stopTimer();_125._active=_125._paused=false;_125._percent=0;}else{if(_125._active&&!_125._paused){return _125;}}_125._fire("beforeBegin",[_125.node]);var de=_123||_125.delay,_126=lang.hitch(_125,"_play",_124);if(de>0){_125._delayTimer=setTimeout(_126,de);return _125;}_126();return _125;},_play:function(_127){var _128=this;if(_128._delayTimer){_128._clearTimer();}_128._startTime=new Date().valueOf();if(_128._paused){_128._startTime-=_128.duration*_128._percent;}_128._active=true;_128._paused=false;var _129=_128.curve.getValue(_128._getStep());if(!_128._percent){if(!_128._startRepeatCount){_128._startRepeatCount=_128.repeat;}_128._fire("onBegin",[_129]);}_128._fire("onPlay",[_129]);_128._cycle();return _128;},pause:function(){var _12a=this;if(_12a._delayTimer){_12a._clearTimer();}_12a._stopTimer();if(!_12a._active){return _12a;}_12a._paused=true;_12a._fire("onPause",[_12a.curve.getValue(_12a._getStep())]);return _12a;},gotoPercent:function(_12b,_12c){var _12d=this;_12d._stopTimer();_12d._active=_12d._paused=true;_12d._percent=_12b;if(_12c){_12d.play();}return _12d;},stop:function(_12e){var _12f=this;if(_12f._delayTimer){_12f._clearTimer();}if(!_12f._timer){return _12f;}_12f._stopTimer();if(_12e){_12f._percent=1;}_12f._fire("onStop",[_12f.curve.getValue(_12f._getStep())]);_12f._active=_12f._paused=false;return _12f;},status:function(){if(this._active){return this._paused?"paused":"playing";}return "stopped";},_cycle:function(){var _130=this;if(_130._active){var curr=new Date().valueOf();var step=(curr-_130._startTime)/(_130.duration);if(step>=1){step=1;}_130._percent=step;if(_130.easing){step=_130.easing(step);}_130._fire("onAnimate",[_130.curve.getValue(step)]);if(_130._percent<1){_130._startTimer();}else{_130._active=false;if(_130.repeat>0){_130.repeat--;_130.play(null,true);}else{if(_130.repeat==-1){_130.play(null,true);}else{if(_130._startRepeatCount){_130.repeat=_130._startRepeatCount;_130._startRepeatCount=0;}}}_130._percent=0;_130._fire("onEnd",[_130.node]);!_130.repeat&&_130._stopTimer();}}return _130;},_clearTimer:function(){clearTimeout(this._delayTimer);delete this._delayTimer;}});var ctr=0,_131=null,_132={run:function(){}};lang.extend(dojo.Animation,{_startTimer:function(){if(!this._timer){this._timer=_11d.connect(_132,"run",this,"_cycle");ctr++;}if(!_131){_131=setInterval(lang.hitch(_132,"run"),this.rate);}},_stopTimer:function(){if(this._timer){_11d.disconnect(this._timer);this._timer=null;ctr--;}if(ctr<=0){clearInterval(_131);_131=null;ctr=0;}}});var _133=has("ie")?function(node){var ns=node.style;if(!ns.width.length&&_11e.get(node,"width")=="auto"){ns.width="auto";}}:function(){};dojo._fade=function(args){args.node=dom.byId(args.node);var _134=_11f({properties:{}},args),_135=(_134.properties.opacity={});_135.start=!("start" in _134)?function(){return +_11e.get(_134.node,"opacity")||0;}:_134.start;_135.end=_134.end;var anim=dojo.animateProperty(_134);_11d.connect(anim,"beforeBegin",lang.partial(_133,_134.node));return anim;};dojo.fadeIn=function(args){return dojo._fade(_11f({end:1},args));};dojo.fadeOut=function(args){return dojo._fade(_11f({end:0},args));};dojo._defaultEasing=function(n){return 0.5+((Math.sin((n+1.5)*Math.PI))/2);};var _136=function(_137){this._properties=_137;for(var p in _137){var prop=_137[p];if(prop.start instanceof _11c){prop.tempColor=new _11c();}}};_136.prototype.getValue=function(r){var ret={};for(var p in this._properties){var prop=this._properties[p],_138=prop.start;if(_138 instanceof _11c){ret[p]=_11c.blendColors(_138,prop.end,r,prop.tempColor).toCss();}else{if(!lang.isArray(_138)){ret[p]=((prop.end-_138)*r)+_138+(p!="opacity"?prop.units||"px":0);}}}return ret;};dojo.animateProperty=function(args){var n=args.node=dom.byId(args.node);if(!args.easing){args.easing=dojo._defaultEasing;}var anim=new dojo.Animation(args);_11d.connect(anim,"beforeBegin",anim,function(){var pm={};for(var p in this.properties){if(p=="width"||p=="height"){this.node.display="block";}var prop=this.properties[p];if(lang.isFunction(prop)){prop=prop(n);}prop=pm[p]=_11f({},(lang.isObject(prop)?prop:{end:prop}));if(lang.isFunction(prop.start)){prop.start=prop.start(n);}if(lang.isFunction(prop.end)){prop.end=prop.end(n);}var _139=(p.toLowerCase().indexOf("color")>=0);function _13a(node,p){var v={height:node.offsetHeight,width:node.offsetWidth}[p];if(v!==undefined){return v;}v=_11e.get(node,p);return (p=="opacity")?+v:(_139?v:parseFloat(v));};if(!("end" in prop)){prop.end=_13a(n,p);}else{if(!("start" in prop)){prop.start=_13a(n,p);}}if(_139){prop.start=new _11c(prop.start);prop.end=new _11c(prop.end);}else{prop.start=(p=="opacity")?+prop.start:parseFloat(prop.start);}}this.curve=new _136(pm);});_11d.connect(anim,"onAnimate",lang.hitch(_11e,"set",anim.node));return anim;};dojo.anim=function(node,_13b,_13c,_13d,_13e,_13f){return dojo.animateProperty({node:node,duration:_13c||dojo.Animation.prototype.duration,properties:_13b,easing:_13d,onEnd:_13e}).play(_13f||0);};return {_Line:dojo._Line,Animation:dojo.Animation,_fade:dojo._fade,fadeIn:dojo.fadeIn,fadeOut:dojo.fadeOut,_defaultEasing:dojo._defaultEasing,animateProperty:dojo.animateProperty,anim:dojo.anim};});},"dojo/dom-form":function(){define("dojo/dom-form",["./_base/lang","./dom","./io-query","./json"],function(lang,dom,ioq,json){function _140(obj,name,_141){if(_141===null){return;}var val=obj[name];if(typeof val=="string"){obj[name]=[val,_141];}else{if(lang.isArray(val)){val.push(_141);}else{obj[name]=_141;}}};var _142="file|submit|image|reset|button";var form={fieldToObject:function fieldToObject(_143){var ret=null;_143=dom.byId(_143);if(_143){var _144=_143.name,type=(_143.type||"").toLowerCase();if(_144&&type&&!_143.disabled){if(type=="radio"||type=="checkbox"){if(_143.checked){ret=_143.value;}}else{if(_143.multiple){ret=[];var _145=[_143.firstChild];while(_145.length){for(var node=_145.pop();node;node=node.nextSibling){if(node.nodeType==1&&node.tagName.toLowerCase()=="option"){if(node.selected){ret.push(node.value);}}else{if(node.nextSibling){_145.push(node.nextSibling);}if(node.firstChild){_145.push(node.firstChild);}break;}}}}else{ret=_143.value;}}}}return ret;},toObject:function formToObject(_146){var ret={},_147=dom.byId(_146).elements;for(var i=0,l=_147.length;i<l;++i){var item=_147[i],_148=item.name,type=(item.type||"").toLowerCase();if(_148&&type&&_142.indexOf(type)<0&&!item.disabled){_140(ret,_148,form.fieldToObject(item));if(type=="image"){ret[_148+".x"]=ret[_148+".y"]=ret[_148].x=ret[_148].y=0;}}}return ret;},toQuery:function formToQuery(_149){return ioq.objectToQuery(form.toObject(_149));},toJson:function formToJson(_14a,_14b){return json.stringify(form.toObject(_14a),null,_14b?4:0);}};return form;});},"dojo/_base/html":function(){define(["./kernel","../dom","../dom-style","../dom-attr","../dom-prop","../dom-class","../dom-construct","../dom-geometry"],function(dojo,dom,_14c,attr,prop,cls,ctr,geom){dojo.byId=dom.byId;dojo.isDescendant=dom.isDescendant;dojo.setSelectable=dom.setSelectable;dojo.getAttr=attr.get;dojo.setAttr=attr.set;dojo.hasAttr=attr.has;dojo.removeAttr=attr.remove;dojo.getNodeProp=attr.getNodeProp;dojo.attr=function(node,name,_14d){if(arguments.length==2){return attr[typeof name=="string"?"get":"set"](node,name);}return attr.set(node,name,_14d);};dojo.hasClass=cls.contains;dojo.addClass=cls.add;dojo.removeClass=cls.remove;dojo.toggleClass=cls.toggle;dojo.replaceClass=cls.replace;dojo._toDom=dojo.toDom=ctr.toDom;dojo.place=ctr.place;dojo.create=ctr.create;dojo.empty=function(node){ctr.empty(node);};dojo._destroyElement=dojo.destroy=function(node){ctr.destroy(node);};dojo._getPadExtents=dojo.getPadExtents=geom.getPadExtents;dojo._getBorderExtents=dojo.getBorderExtents=geom.getBorderExtents;dojo._getPadBorderExtents=dojo.getPadBorderExtents=geom.getPadBorderExtents;dojo._getMarginExtents=dojo.getMarginExtents=geom.getMarginExtents;dojo._getMarginSize=dojo.getMarginSize=geom.getMarginSize;dojo._getMarginBox=dojo.getMarginBox=geom.getMarginBox;dojo.setMarginBox=geom.setMarginBox;dojo._getContentBox=dojo.getContentBox=geom.getContentBox;dojo.setContentSize=geom.setContentSize;dojo._isBodyLtr=dojo.isBodyLtr=geom.isBodyLtr;dojo._docScroll=dojo.docScroll=geom.docScroll;dojo._getIeDocumentElementOffset=dojo.getIeDocumentElementOffset=geom.getIeDocumentElementOffset;dojo._fixIeBiDiScrollLeft=dojo.fixIeBiDiScrollLeft=geom.fixIeBiDiScrollLeft;dojo.position=geom.position;dojo.marginBox=function marginBox(node,box){return box?geom.setMarginBox(node,box):geom.getMarginBox(node);};dojo.contentBox=function contentBox(node,box){return box?geom.setContentSize(node,box):geom.getContentBox(node);};dojo.coords=function(node,_14e){dojo.deprecated("dojo.coords()","Use dojo.position() or dojo.marginBox().");node=dom.byId(node);var s=_14c.getComputedStyle(node),mb=geom.getMarginBox(node,s);var abs=geom.position(node,_14e);mb.x=abs.x;mb.y=abs.y;return mb;};dojo.getProp=prop.get;dojo.setProp=prop.set;dojo.prop=function(node,name,_14f){if(arguments.length==2){return prop[typeof name=="string"?"get":"set"](node,name);}return prop.set(node,name,_14f);};dojo.getStyle=_14c.get;dojo.setStyle=_14c.set;dojo.getComputedStyle=_14c.getComputedStyle;dojo.__toPixelValue=dojo.toPixelValue=_14c.toPixelValue;dojo.style=function(node,name,_150){switch(arguments.length){case 1:return _14c.get(node);case 2:return _14c[typeof name=="string"?"get":"set"](node,name);}return _14c.set(node,name,_150);};return dojo;});},"dojo/_base/kernel":function(){define(["../has","./config","require","module"],function(has,_151,_152,_153){var i,p,_154={},_155={},dojo={config:_151,global:this,dijit:_154,dojox:_155};var _156={dojo:["dojo",dojo],dijit:["dijit",_154],dojox:["dojox",_155]},_157=(_152.packs&&_152.packs[_153.id.match(/[^\/]+/)[0]].packageMap)||{},item;for(p in _157){if(_156[p]){_156[p][0]=_157[p];}else{_156[p]=[_157[p],{}];}}for(p in _156){item=_156[p];item[1]._scopeName=item[0];if(!_151.noGlobals){this[item[0]]=item[1];}}dojo.scopeMap=_156;dojo.baseUrl=dojo.config.baseUrl=_152.baseUrl;dojo.isAsync=!1||_152.async;dojo.locale=_151.locale;var rev="$Rev: 28982 $".match(/\d+/);dojo.version={major:1,minor:7,patch:3,flag:"",revision:rev?+rev[0]:NaN,toString:function(){var v=dojo.version;return v.major+"."+v.minor+"."+v.patch+v.flag+" ("+v.revision+")";}};true||has.add("extend-dojo",1);dojo.eval=function(_158){};(Function("d","d.eval = function(){return d.global.eval ? d.global.eval(arguments[0]) : eval(arguments[0]);}"))(dojo);if(0){dojo.exit=function(_159){quit(_159);};}else{dojo.exit=function(){};}true||has.add("dojo-guarantee-console",1);if(1){typeof console!="undefined"||(console={});var cn=["assert","count","debug","dir","dirxml","error","group","groupEnd","info","profile","profileEnd","time","timeEnd","trace","warn","log"];var tn;i=0;while((tn=cn[i++])){if(!console[tn]){(function(){var tcn=tn+"";console[tcn]=("log" in console)?function(){var a=Array.apply({},arguments);a.unshift(tcn+":");console["log"](a.join(" "));}:function(){};console[tcn]._fake=true;})();}}}has.add("dojo-debug-messages",!!_151.isDebug);if(has("dojo-debug-messages")){dojo.deprecated=function(_15a,_15b,_15c){var _15d="DEPRECATED: "+_15a;if(_15b){_15d+=" "+_15b;}if(_15c){_15d+=" -- will be removed in version: "+_15c;}console.warn(_15d);};dojo.experimental=function(_15e,_15f){var _160="EXPERIMENTAL: "+_15e+" -- APIs subject to change without notice.";if(_15f){_160+=" "+_15f;}console.warn(_160);};}else{dojo.deprecated=dojo.experimental=function(){};}true||has.add("dojo-modulePaths",1);if(1){if(_151.modulePaths){dojo.deprecated("dojo.modulePaths","use paths configuration");var _161={};for(p in _151.modulePaths){_161[p.replace(/\./g,"/")]=_151.modulePaths[p];}_152({paths:_161});}}true||has.add("dojo-moduleUrl",1);if(1){dojo.moduleUrl=function(_162,url){dojo.deprecated("dojo.moduleUrl()","use require.toUrl","2.0");var _163=null;if(_162){_163=_152.toUrl(_162.replace(/\./g,"/")+(url?("/"+url):"")+"/*.*").replace(/\/\*\.\*/,"")+(url?"":"/");}return _163;};}dojo._hasResource={};return dojo;});},"dojo/io-query":function(){define(["./_base/lang"],function(lang){var _164={};function _165(map){var enc=encodeURIComponent,_166=[];for(var name in map){var _167=map[name];if(_167!=_164[name]){var _168=enc(name)+"=";if(lang.isArray(_167)){for(var i=0,l=_167.length;i<l;++i){_166.push(_168+enc(_167[i]));}}else{_166.push(_168+enc(_167));}}}return _166.join("&");};function _169(str){var dec=decodeURIComponent,qp=str.split("&"),ret={},name,val;for(var i=0,l=qp.length,item;i<l;++i){item=qp[i];if(item.length){var s=item.indexOf("=");if(s<0){name=dec(item);val="";}else{name=dec(item.slice(0,s));val=dec(item.slice(s+1));}if(typeof ret[name]=="string"){ret[name]=[ret[name]];}if(lang.isArray(ret[name])){ret[name].push(val);}else{ret[name]=val;}}}return ret;};return {objectToQuery:_165,queryToObject:_169};});},"dojo/_base/Deferred":function(){define("dojo/_base/Deferred",["./kernel","./lang"],function(dojo,lang){var _16a=function(){};var _16b=Object.freeze||function(){};dojo.Deferred=function(_16c){var _16d,_16e,_16f,head,_170;var _171=(this.promise={});function _172(_173){if(_16e){throw new Error("This deferred has already been resolved");}_16d=_173;_16e=true;_174();};function _174(){var _175;while(!_175&&_170){var _176=_170;_170=_170.next;if((_175=(_176.progress==_16a))){_16e=false;}var func=(_16f?_176.error:_176.resolved);if(func){try{var _177=func(_16d);if(_177&&typeof _177.then==="function"){_177.then(lang.hitch(_176.deferred,"resolve"),lang.hitch(_176.deferred,"reject"),lang.hitch(_176.deferred,"progress"));continue;}var _178=_175&&_177===undefined;if(_175&&!_178){_16f=_177 instanceof Error;}_176.deferred[_178&&_16f?"reject":"resolve"](_178?_16d:_177);}catch(e){_176.deferred.reject(e);}}else{if(_16f){_176.deferred.reject(_16d);}else{_176.deferred.resolve(_16d);}}}};this.resolve=this.callback=function(_179){this.fired=0;this.results=[_179,null];_172(_179);};this.reject=this.errback=function(_17a){_16f=true;this.fired=1;_172(_17a);this.results=[null,_17a];if(!_17a||_17a.log!==false){(dojo.config.deferredOnError||function(x){console.error(x);})(_17a);}};this.progress=function(_17b){var _17c=_170;while(_17c){var _17d=_17c.progress;_17d&&_17d(_17b);_17c=_17c.next;}};this.addCallbacks=function(_17e,_17f){this.then(_17e,_17f,_16a);return this;};_171.then=this.then=function(_180,_181,_182){var _183=_182==_16a?this:new dojo.Deferred(_171.cancel);var _184={resolved:_180,error:_181,progress:_182,deferred:_183};if(_170){head=head.next=_184;}else{_170=head=_184;}if(_16e){_174();}return _183.promise;};var _185=this;_171.cancel=this.cancel=function(){if(!_16e){var _186=_16c&&_16c(_185);if(!_16e){if(!(_186 instanceof Error)){_186=new Error(_186);}_186.log=false;_185.reject(_186);}}};_16b(_171);};lang.extend(dojo.Deferred,{addCallback:function(_187){return this.addCallbacks(lang.hitch.apply(dojo,arguments));},addErrback:function(_188){return this.addCallbacks(null,lang.hitch.apply(dojo,arguments));},addBoth:function(_189){var _18a=lang.hitch.apply(dojo,arguments);return this.addCallbacks(_18a,_18a);},fired:-1});dojo.Deferred.when=dojo.when=function(_18b,_18c,_18d,_18e){if(_18b&&typeof _18b.then==="function"){return _18b.then(_18c,_18d,_18e);}return _18c?_18c(_18b):_18b;};return dojo.Deferred;});},"dojo/NodeList-dom":function(){define(["./_base/kernel","./query","./_base/array","./_base/lang","./dom-class","./dom-construct","./dom-geometry","./dom-attr","./dom-style"],function(dojo,_18f,_190,lang,_191,_192,_193,_194,_195){var _196=function(a){return a.length==1&&(typeof a[0]=="string");};var _197=function(node){var p=node.parentNode;if(p){p.removeChild(node);}};var _198=_18f.NodeList,awc=_198._adaptWithCondition,aafe=_198._adaptAsForEach,aam=_198._adaptAsMap;function _199(_19a){return function(node,name,_19b){if(arguments.length==2){return _19a[typeof name=="string"?"get":"set"](node,name);}return _19a.set(node,name,_19b);};};lang.extend(_198,{_normalize:function(_19c,_19d){var _19e=_19c.parse===true;if(typeof _19c.template=="string"){var _19f=_19c.templateFunc||(dojo.string&&dojo.string.substitute);_19c=_19f?_19f(_19c.template,_19c):_19c;}var type=(typeof _19c);if(type=="string"||type=="number"){_19c=_192.toDom(_19c,(_19d&&_19d.ownerDocument));if(_19c.nodeType==11){_19c=lang._toArray(_19c.childNodes);}else{_19c=[_19c];}}else{if(!lang.isArrayLike(_19c)){_19c=[_19c];}else{if(!lang.isArray(_19c)){_19c=lang._toArray(_19c);}}}if(_19e){_19c._runParse=true;}return _19c;},_cloneNode:function(node){return node.cloneNode(true);},_place:function(ary,_1a0,_1a1,_1a2){if(_1a0.nodeType!=1&&_1a1=="only"){return;}var _1a3=_1a0,_1a4;var _1a5=ary.length;for(var i=_1a5-1;i>=0;i--){var node=(_1a2?this._cloneNode(ary[i]):ary[i]);if(ary._runParse&&dojo.parser&&dojo.parser.parse){if(!_1a4){_1a4=_1a3.ownerDocument.createElement("div");}_1a4.appendChild(node);dojo.parser.parse(_1a4);node=_1a4.firstChild;while(_1a4.firstChild){_1a4.removeChild(_1a4.firstChild);}}if(i==_1a5-1){_192.place(node,_1a3,_1a1);}else{_1a3.parentNode.insertBefore(node,_1a3);}_1a3=node;}},attr:awc(_199(_194),_196),style:awc(_199(_195),_196),addClass:aafe(_191.add),removeClass:aafe(_191.remove),replaceClass:aafe(_191.replace),toggleClass:aafe(_191.toggle),empty:aafe(_192.empty),removeAttr:aafe(_194.remove),position:aam(_193.position),marginBox:aam(_193.getMarginBox),place:function(_1a6,_1a7){var item=_18f(_1a6)[0];return this.forEach(function(node){_192.place(node,item,_1a7);});},orphan:function(_1a8){return (_1a8?_18f._filterResult(this,_1a8):this).forEach(_197);},adopt:function(_1a9,_1aa){return _18f(_1a9).place(this[0],_1aa)._stash(this);},query:function(_1ab){if(!_1ab){return this;}var ret=new _198;this.map(function(node){_18f(_1ab,node).forEach(function(_1ac){if(_1ac!==undefined){ret.push(_1ac);}});});return ret._stash(this);},filter:function(_1ad){var a=arguments,_1ae=this,_1af=0;if(typeof _1ad=="string"){_1ae=_18f._filterResult(this,a[0]);if(a.length==1){return _1ae._stash(this);}_1af=1;}return this._wrap(_190.filter(_1ae,a[_1af],a[_1af+1]),this);},addContent:function(_1b0,_1b1){_1b0=this._normalize(_1b0,this[0]);for(var i=0,node;(node=this[i]);i++){this._place(_1b0,node,_1b1,i>0);}return this;}});return _198;});},"dojo/query":function(){define(["./_base/kernel","./has","./dom","./on","./_base/array","./_base/lang","./selector/_loader","./selector/_loader!default"],function(dojo,has,dom,on,_1b2,lang,_1b3,_1b4){"use strict";has.add("array-extensible",function(){return lang.delegate([],{length:1}).length==1&&!has("bug-for-in-skips-shadowed");});var ap=Array.prototype,aps=ap.slice,apc=ap.concat,_1b5=_1b2.forEach;var tnl=function(a,_1b6,_1b7){var _1b8=new (_1b7||this._NodeListCtor||nl)(a);return _1b6?_1b8._stash(_1b6):_1b8;};var _1b9=function(f,a,o){a=[0].concat(aps.call(a,0));o=o||dojo.global;return function(node){a[0]=node;return f.apply(o,a);};};var _1ba=function(f,o){return function(){this.forEach(_1b9(f,arguments,o));return this;};};var _1bb=function(f,o){return function(){return this.map(_1b9(f,arguments,o));};};var _1bc=function(f,o){return function(){return this.filter(_1b9(f,arguments,o));};};var _1bd=function(f,g,o){return function(){var a=arguments,body=_1b9(f,a,o);if(g.call(o||dojo.global,a)){return this.map(body);}this.forEach(body);return this;};};var _1be=function(_1bf){var _1c0=this instanceof nl&&has("array-extensible");if(typeof _1bf=="number"){_1bf=Array(_1bf);}var _1c1=(_1bf&&"length" in _1bf)?_1bf:arguments;if(_1c0||!_1c1.sort){var _1c2=_1c0?this:[],l=_1c2.length=_1c1.length;for(var i=0;i<l;i++){_1c2[i]=_1c1[i];}if(_1c0){return _1c2;}_1c1=_1c2;}lang._mixin(_1c1,nlp);_1c1._NodeListCtor=function(_1c3){return nl(_1c3);};return _1c1;};var nl=_1be,nlp=nl.prototype=has("array-extensible")?[]:{};nl._wrap=nlp._wrap=tnl;nl._adaptAsMap=_1bb;nl._adaptAsForEach=_1ba;nl._adaptAsFilter=_1bc;nl._adaptWithCondition=_1bd;_1b5(["slice","splice"],function(name){var f=ap[name];nlp[name]=function(){return this._wrap(f.apply(this,arguments),name=="slice"?this:null);};});_1b5(["indexOf","lastIndexOf","every","some"],function(name){var f=_1b2[name];nlp[name]=function(){return f.apply(dojo,[this].concat(aps.call(arguments,0)));};});lang.extend(_1be,{constructor:nl,_NodeListCtor:nl,toString:function(){return this.join(",");},_stash:function(_1c4){this._parent=_1c4;return this;},on:function(_1c5,_1c6){var _1c7=this.map(function(node){return on(node,_1c5,_1c6);});_1c7.remove=function(){for(var i=0;i<_1c7.length;i++){_1c7[i].remove();}};return _1c7;},end:function(){if(this._parent){return this._parent;}else{return new this._NodeListCtor(0);}},concat:function(item){var t=lang.isArray(this)?this:aps.call(this,0),m=_1b2.map(arguments,function(a){return a&&!lang.isArray(a)&&(typeof _1be!="undefined"&&a.constructor===_1be||a.constructor===this._NodeListCtor)?aps.call(a,0):a;});return this._wrap(apc.apply(t,m),this);},map:function(func,obj){return this._wrap(_1b2.map(this,func,obj),this);},forEach:function(_1c8,_1c9){_1b5(this,_1c8,_1c9);return this;},filter:function(_1ca){var a=arguments,_1cb=this,_1cc=0;if(typeof _1ca=="string"){_1cb=_1cd._filterResult(this,a[0]);if(a.length==1){return _1cb._stash(this);}_1cc=1;}return this._wrap(_1b2.filter(_1cb,a[_1cc],a[_1cc+1]),this);},instantiate:function(_1ce,_1cf){var c=lang.isFunction(_1ce)?_1ce:lang.getObject(_1ce);_1cf=_1cf||{};return this.forEach(function(node){new c(_1cf,node);});},at:function(){var t=new this._NodeListCtor(0);_1b5(arguments,function(i){if(i<0){i=this.length+i;}if(this[i]){t.push(this[i]);}},this);return t._stash(this);}});function _1d0(_1d1,_1d2){var _1d3=function(_1d4,root){if(typeof root=="string"){root=dom.byId(root);if(!root){return new _1d2([]);}}var _1d5=typeof _1d4=="string"?_1d1(_1d4,root):_1d4.orphan?_1d4:[_1d4];if(_1d5.orphan){return _1d5;}return new _1d2(_1d5);};_1d3.matches=_1d1.match||function(node,_1d6,root){return _1d3.filter([node],_1d6,root).length>0;};_1d3.filter=_1d1.filter||function(_1d7,_1d8,root){return _1d3(_1d8,root).filter(function(node){return _1b2.indexOf(_1d7,node)>-1;});};if(typeof _1d1!="function"){var _1d9=_1d1.search;_1d1=function(_1da,root){return _1d9(root||document,_1da);};}return _1d3;};var _1cd=_1d0(_1b4,_1be);dojo.query=_1d0(_1b4,function(_1db){return _1be(_1db);});_1cd.load=function(id,_1dc,_1dd,_1de){_1b3.load(id,_1dc,function(_1df){_1dd(_1d0(_1df,_1be));});};dojo._filterQueryResult=_1cd._filterResult=function(_1e0,_1e1,root){return new _1be(_1cd.filter(_1e0,_1e1,root));};dojo.NodeList=_1cd.NodeList=_1be;return _1cd;});},"dojo/has":function(){define(["require"],function(_1e2){var has=_1e2.has||function(){};if(!1){var _1e3=typeof window!="undefined"&&typeof location!="undefined"&&typeof document!="undefined"&&window.location==location&&window.document==document,_1e4=this,doc=_1e3&&document,_1e5=doc&&doc.createElement("DiV"),_1e6={};has=function(name){return typeof _1e6[name]=="function"?(_1e6[name]=_1e6[name](_1e4,doc,_1e5)):_1e6[name];};has.cache=_1e6;has.add=function(name,test,now,_1e7){(typeof _1e6[name]=="undefined"||_1e7)&&(_1e6[name]=test);return now&&has(name);};true||has.add("host-browser",_1e3);true||has.add("dom",_1e3);true||has.add("dojo-dom-ready-api",1);true||has.add("dojo-sniff",1);}if(1){var _1e8=navigator.userAgent;has.add("dom-addeventlistener",!!document.addEventListener);has.add("touch","ontouchstart" in document);has.add("device-width",screen.availWidth||innerWidth);has.add("agent-ios",!!_1e8.match(/iPhone|iP[ao]d/));has.add("agent-android",_1e8.indexOf("android")>1);}has.clearElement=function(_1e9){_1e9.innerHTML="";return _1e9;};has.normalize=function(id,_1ea){var _1eb=id.match(/[\?:]|[^:\?]*/g),i=0,get=function(skip){var term=_1eb[i++];if(term==":"){return 0;}else{if(_1eb[i++]=="?"){if(!skip&&has(term)){return get();}else{get(true);return get(skip);}}return term||0;}};id=get();return id&&_1ea(id);};has.load=function(id,_1ec,_1ed){if(id){_1ec([id],_1ed);}else{_1ed();}};return has;});},"dojo/_base/loader":function(){define(["./kernel","../has","require","module","./json","./lang","./array"],function(dojo,has,_1ee,_1ef,json,lang,_1f0){if(!1){console.error("cannot load the Dojo v1.x loader with a foreign loader");return 0;}var _1f1=function(id){return {src:_1ef.id,id:id};},_1f2=function(name){return name.replace(/\./g,"/");},_1f3=/\/\/>>built/,_1f4=[],_1f5=[],_1f6=function(mid,_1f7,_1f8){_1f4.push(_1f8);_1f0.forEach(mid.split(","),function(mid){var _1f9=_1fa(mid,_1f7.module);_1f5.push(_1f9);_1fb(_1f9);});_1fc();},_1fd,_1fe=function(m){_1fd[m.mid]=1;for(var t,_1ff,deps=m.deps||[],i=0;i<deps.length;i++){_1ff=deps[i];if(!(t=_1fd[_1ff.mid])){if(t===0||!_1fe(_1ff)){_1fd[m.mid]=0;return false;}}}return true;},_1fc=function(){var _200,mid;_1fd={};for(mid in _201){_200=_201[mid];if(_200.executed||_200.noReqPluginCheck){_1fd[mid]=1;}else{if(_200.noReqPluginCheck!==0){_200.noReqPluginCheck=/loadInit\!/.test(mid)||/require\!/.test(mid)?1:0;}if(_200.noReqPluginCheck){_1fd[mid]=1;}else{if(_200.injected!==_202){_1fd[mid]=0;}}}}for(var t,i=0,end=_1f5.length;i<end;i++){_200=_1f5[i];if(!(t=_1fd[_200.mid])){if(t===0||!_1fe(_200)){return;}}}_203.holdIdle();var _204=_1f4;_1f4=[];_1f0.forEach(_204,function(cb){cb(1);});_203.releaseIdle();},_205=function(mid,_206,_207){_206([mid],function(_208){_206(_208.names,function(){for(var _209="",args=[],i=0;i<arguments.length;i++){_209+="var "+_208.names[i]+"= arguments["+i+"]; ";args.push(arguments[i]);}eval(_209);var _20a=_206.module,deps=[],hold={},_20b=[],p,_20c={provide:function(_20d){_20d=_1f2(_20d);var _20e=_1fa(_20d,_20a);if(_20e!==_20a){_232(_20e);}},require:function(_20f,_210){_20f=_1f2(_20f);_210&&(_1fa(_20f,_20a).result=_22d);_20b.push(_20f);},requireLocalization:function(_211,_212,_213){deps.length||(deps=["dojo/i18n"]);_213=(_213||dojo.locale).toLowerCase();_211=_1f2(_211)+"/nls/"+(/root/i.test(_213)?"":_213+"/")+_1f2(_212);if(_1fa(_211,_20a).isXd){deps.push("dojo/i18n!"+_211);}},loadInit:function(f){f();}};try{for(p in _20c){hold[p]=dojo[p];dojo[p]=_20c[p];}_208.def.apply(null,args);}catch(e){_233("error",[_1f1("failedDojoLoadInit"),e]);}finally{for(p in _20c){dojo[p]=hold[p];}}_20b.length&&deps.push("dojo/require!"+_20b.join(","));_1f4.push(_207);_1f0.forEach(_20b,function(mid){var _214=_1fa(mid,_206.module);_1f5.push(_214);_1fb(_214);});_1fc();});});},_215=function(text,_216,_217){var _218=/\(|\)/g,_219=1,_21a;_218.lastIndex=_216;while((_21a=_218.exec(text))){if(_21a[0]==")"){_219-=1;}else{_219+=1;}if(_219==0){break;}}if(_219!=0){throw "unmatched paren around character "+_218.lastIndex+" in: "+text;}return [dojo.trim(text.substring(_217,_218.lastIndex))+";\n",_218.lastIndex];},_21b=/(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg,_21c=/(^|\s)dojo\.(loadInit|require|provide|requireLocalization|requireIf|requireAfterIf|platformRequire)\s*\(/mg,_21d=/(^|\s)(require|define)\s*\(/m,_21e=function(text,_21f){var _220,_221,_222,_223,_224=[],_225=[],_226=[];_21f=_21f||text.replace(_21b,function(_227){_21c.lastIndex=_21d.lastIndex=0;return (_21c.test(_227)||_21d.test(_227))?"":_227;});while((_220=_21c.exec(_21f))){_221=_21c.lastIndex;_222=_221-_220[0].length;_223=_215(_21f,_221,_222);if(_220[2]=="loadInit"){_224.push(_223[0]);}else{_225.push(_223[0]);}_21c.lastIndex=_223[1];}_226=_224.concat(_225);if(_226.length||!_21d.test(_21f)){return [text.replace(/(^|\s)dojo\.loadInit\s*\(/g,"\n0 && dojo.loadInit("),_226.join(""),_226];}else{return 0;}},_228=function(_229,text){var _22a,id,_22b=[],_22c=[];if(_1f3.test(text)||!(_22a=_21e(text))){return 0;}id=_229.mid+"-*loadInit";for(var p in _1fa("dojo",_229).result.scopeMap){_22b.push(p);_22c.push("\""+p+"\"");}return "// xdomain rewrite of "+_229.path+"\n"+"define('"+id+"',{\n"+"\tnames:"+dojo.toJson(_22b)+",\n"+"\tdef:function("+_22b.join(",")+"){"+_22a[1]+"}"+"});\n\n"+"define("+dojo.toJson(_22b.concat(["dojo/loadInit!"+id]))+", function("+_22b.join(",")+"){\n"+_22a[0]+"});";},_203=_1ee.initSyncLoader(_1f6,_1fc,_228),sync=_203.sync,xd=_203.xd,_202=_203.arrived,_22d=_203.nonmodule,_22e=_203.executing,_22f=_203.executed,_230=_203.syncExecStack,_201=_203.modules,_231=_203.execQ,_1fa=_203.getModule,_1fb=_203.injectModule,_232=_203.setArrived,_233=_203.signal,_234=_203.finishExec,_235=_203.execModule,_236=_203.getLegacyMode;dojo.provide=function(mid){var _237=_230[0],_238=lang.mixin(_1fa(_1f2(mid),_1ee.module),{executed:_22e,result:lang.getObject(mid,true)});_232(_238);if(_237){(_237.provides||(_237.provides=[])).push(function(){_238.result=lang.getObject(mid);delete _238.provides;_238.executed!==_22f&&_234(_238);});}return _238.result;};has.add("config-publishRequireResult",1,0,0);dojo.require=function(_239,_23a){function _23b(mid,_23c){var _23d=_1fa(_1f2(mid),_1ee.module);if(_230.length&&_230[0].finish){_230[0].finish.push(mid);return undefined;}if(_23d.executed){return _23d.result;}_23c&&(_23d.result=_22d);var _23e=_236();_1fb(_23d);_23e=_236();if(_23d.executed!==_22f&&_23d.injected===_202){_203.holdIdle();_235(_23d);_203.releaseIdle();}if(_23d.executed){return _23d.result;}if(_23e==sync){if(_23d.cjs){_231.unshift(_23d);}else{_230.length&&(_230[0].finish=[mid]);}}else{_231.push(_23d);}return undefined;};var _23f=_23b(_239,_23a);if(has("config-publishRequireResult")&&!lang.exists(_239)&&_23f!==undefined){lang.setObject(_239,_23f);}return _23f;};dojo.loadInit=function(f){f();};dojo.registerModulePath=function(_240,_241){var _242={};_242[_240.replace(/\./g,"/")]=_241;_1ee({paths:_242});};dojo.platformRequire=function(_243){var _244=(_243.common||[]).concat(_243[dojo._name]||_243["default"]||[]),temp;while(_244.length){if(lang.isArray(temp=_244.shift())){dojo.require.apply(dojo,temp);}else{dojo.require(temp);}}};dojo.requireIf=dojo.requireAfterIf=function(_245,_246,_247){if(_245){dojo.require(_246,_247);}};dojo.requireLocalization=function(_248,_249,_24a){_1ee(["../i18n"],function(i18n){i18n.getLocalization(_248,_249,_24a);});};return {extractLegacyApiApplications:_21e,require:_203.dojoRequirePlugin,loadInit:_205};});},"dojo/json":function(){define(["./has"],function(has){"use strict";var _24b=typeof JSON!="undefined";has.add("json-parse",_24b);has.add("json-stringify",_24b&&JSON.stringify({a:0},function(k,v){return v||1;})=="{\"a\":1}");if(has("json-stringify")){return JSON;}else{var _24c=function(str){return ("\""+str.replace(/(["\\])/g,"\\$1")+"\"").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");};return {parse:has("json-parse")?JSON.parse:function(str,_24d){if(_24d&&!/^([\s\[\{]*(?:"(?:\\.|[^"])+"|-?\d[\d\.]*(?:[Ee][+-]?\d+)?|null|true|false|)[\s\]\}]*(?:,|:|$))+$/.test(str)){throw new SyntaxError("Invalid characters in JSON");}return eval("("+str+")");},stringify:function(_24e,_24f,_250){var _251;if(typeof _24f=="string"){_250=_24f;_24f=null;}function _252(it,_253,key){if(_24f){it=_24f(key,it);}var val,_254=typeof it;if(_254=="number"){return isFinite(it)?it+"":"null";}if(_254=="boolean"){return it+"";}if(it===null){return "null";}if(typeof it=="string"){return _24c(it);}if(_254=="function"||_254=="undefined"){return _251;}if(typeof it.toJSON=="function"){return _252(it.toJSON(key),_253,key);}if(it instanceof Date){return "\"{FullYear}-{Month+}-{Date}T{Hours}:{Minutes}:{Seconds}Z\"".replace(/\{(\w+)(\+)?\}/g,function(t,prop,plus){var num=it["getUTC"+prop]()+(plus?1:0);return num<10?"0"+num:num;});}if(it.valueOf()!==it){return _252(it.valueOf(),_253,key);}var _255=_250?(_253+_250):"";var sep=_250?" ":"";var _256=_250?"\n":"";if(it instanceof Array){var itl=it.length,res=[];for(key=0;key<itl;key++){var obj=it[key];val=_252(obj,_255,key);if(typeof val!="string"){val="null";}res.push(_256+_255+val);}return "["+res.join(",")+_256+_253+"]";}var _257=[];for(key in it){var _258;if(typeof key=="number"){_258="\""+key+"\"";}else{if(typeof key=="string"){_258=_24c(key);}else{continue;}}val=_252(it[key],_255,key);if(typeof val!="string"){continue;}_257.push(_256+_255+_258+":"+sep+val);}return "{"+_257.join(",")+_256+_253+"}";};return _252(_24e,"","");}};}});},"dojo/_base/declare":function(){define(["./kernel","../has","./lang"],function(dojo,has,lang){var mix=lang.mixin,op=Object.prototype,opts=op.toString,xtor=new Function,_259=0,_25a="constructor";function err(msg,cls){throw new Error("declare"+(cls?" "+cls:"")+": "+msg);};function _25b(_25c,_25d){var _25e=[],_25f=[{cls:0,refs:[]}],_260={},_261=1,l=_25c.length,i=0,j,lin,base,top,_262,rec,name,refs;for(;i<l;++i){base=_25c[i];if(!base){err("mixin #"+i+" is unknown. Did you use dojo.require to pull it in?",_25d);}else{if(opts.call(base)!="[object Function]"){err("mixin #"+i+" is not a callable constructor.",_25d);}}lin=base._meta?base._meta.bases:[base];top=0;for(j=lin.length-1;j>=0;--j){_262=lin[j].prototype;if(!_262.hasOwnProperty("declaredClass")){_262.declaredClass="uniqName_"+(_259++);}name=_262.declaredClass;if(!_260.hasOwnProperty(name)){_260[name]={count:0,refs:[],cls:lin[j]};++_261;}rec=_260[name];if(top&&top!==rec){rec.refs.push(top);++top.count;}top=rec;}++top.count;_25f[0].refs.push(top);}while(_25f.length){top=_25f.pop();_25e.push(top.cls);--_261;while(refs=top.refs,refs.length==1){top=refs[0];if(!top||--top.count){top=0;break;}_25e.push(top.cls);--_261;}if(top){for(i=0,l=refs.length;i<l;++i){top=refs[i];if(!--top.count){_25f.push(top);}}}}if(_261){err("can't build consistent linearization",_25d);}base=_25c[0];_25e[0]=base?base._meta&&base===_25e[_25e.length-base._meta.bases.length]?base._meta.bases.length:1:0;return _25e;};function _263(args,a,f){var name,_264,_265,_266,meta,base,_267,opf,pos,_268=this._inherited=this._inherited||{};if(typeof args=="string"){name=args;args=a;a=f;}f=0;_266=args.callee;name=name||_266.nom;if(!name){err("can't deduce a name to call inherited()",this.declaredClass);}meta=this.constructor._meta;_265=meta.bases;pos=_268.p;if(name!=_25a){if(_268.c!==_266){pos=0;base=_265[0];meta=base._meta;if(meta.hidden[name]!==_266){_264=meta.chains;if(_264&&typeof _264[name]=="string"){err("calling chained method with inherited: "+name,this.declaredClass);}do{meta=base._meta;_267=base.prototype;if(meta&&(_267[name]===_266&&_267.hasOwnProperty(name)||meta.hidden[name]===_266)){break;}}while(base=_265[++pos]);pos=base?pos:-1;}}base=_265[++pos];if(base){_267=base.prototype;if(base._meta&&_267.hasOwnProperty(name)){f=_267[name];}else{opf=op[name];do{_267=base.prototype;f=_267[name];if(f&&(base._meta?_267.hasOwnProperty(name):f!==opf)){break;}}while(base=_265[++pos]);}}f=base&&f||op[name];}else{if(_268.c!==_266){pos=0;meta=_265[0]._meta;if(meta&&meta.ctor!==_266){_264=meta.chains;if(!_264||_264.constructor!=="manual"){err("calling chained constructor with inherited",this.declaredClass);}while(base=_265[++pos]){meta=base._meta;if(meta&&meta.ctor===_266){break;}}pos=base?pos:-1;}}while(base=_265[++pos]){meta=base._meta;f=meta?meta.ctor:base;if(f){break;}}f=base&&f;}_268.c=f;_268.p=pos;if(f){return a===true?f:f.apply(this,a||args);}};function _269(name,args){if(typeof name=="string"){return this.__inherited(name,args,true);}return this.__inherited(name,true);};function _26a(args,a1,a2){var f=this.getInherited(args,a1);if(f){return f.apply(this,a2||a1||args);}};var _26b=dojo.config.isDebug?_26a:_263;function _26c(cls){var _26d=this.constructor._meta.bases;for(var i=0,l=_26d.length;i<l;++i){if(_26d[i]===cls){return true;}}return this instanceof cls;};function _26e(_26f,_270){for(var name in _270){if(name!=_25a&&_270.hasOwnProperty(name)){_26f[name]=_270[name];}}if(has("bug-for-in-skips-shadowed")){for(var _271=lang._extraNames,i=_271.length;i;){name=_271[--i];if(name!=_25a&&_270.hasOwnProperty(name)){_26f[name]=_270[name];}}}};function _272(_273,_274){var name,t;for(name in _274){t=_274[name];if((t!==op[name]||!(name in op))&&name!=_25a){if(opts.call(t)=="[object Function]"){t.nom=name;}_273[name]=t;}}if(has("bug-for-in-skips-shadowed")){for(var _275=lang._extraNames,i=_275.length;i;){name=_275[--i];t=_274[name];if((t!==op[name]||!(name in op))&&name!=_25a){if(opts.call(t)=="[object Function]"){t.nom=name;}_273[name]=t;}}}return _273;};function _276(_277){_278.safeMixin(this.prototype,_277);return this;};function _279(_27a,_27b){return function(){var a=arguments,args=a,a0=a[0],f,i,m,l=_27a.length,_27c;if(!(this instanceof a.callee)){return _27d(a);}if(_27b&&(a0&&a0.preamble||this.preamble)){_27c=new Array(_27a.length);_27c[0]=a;for(i=0;;){a0=a[0];if(a0){f=a0.preamble;if(f){a=f.apply(this,a)||a;}}f=_27a[i].prototype;f=f.hasOwnProperty("preamble")&&f.preamble;if(f){a=f.apply(this,a)||a;}if(++i==l){break;}_27c[i]=a;}}for(i=l-1;i>=0;--i){f=_27a[i];m=f._meta;f=m?m.ctor:f;if(f){f.apply(this,_27c?_27c[i]:a);}}f=this.postscript;if(f){f.apply(this,args);}};};function _27e(ctor,_27f){return function(){var a=arguments,t=a,a0=a[0],f;if(!(this instanceof a.callee)){return _27d(a);}if(_27f){if(a0){f=a0.preamble;if(f){t=f.apply(this,t)||t;}}f=this.preamble;if(f){f.apply(this,t);}}if(ctor){ctor.apply(this,a);}f=this.postscript;if(f){f.apply(this,a);}};};function _280(_281){return function(){var a=arguments,i=0,f,m;if(!(this instanceof a.callee)){return _27d(a);}for(;f=_281[i];++i){m=f._meta;f=m?m.ctor:f;if(f){f.apply(this,a);break;}}f=this.postscript;if(f){f.apply(this,a);}};};function _282(name,_283,_284){return function(){var b,m,f,i=0,step=1;if(_284){i=_283.length-1;step=-1;}for(;b=_283[i];i+=step){m=b._meta;f=(m?m.hidden:b.prototype)[name];if(f){f.apply(this,arguments);}}};};function _285(ctor){xtor.prototype=ctor.prototype;var t=new xtor;xtor.prototype=null;return t;};function _27d(args){var ctor=args.callee,t=_285(ctor);ctor.apply(t,args);return t;};function _278(_286,_287,_288){if(typeof _286!="string"){_288=_287;_287=_286;_286="";}_288=_288||{};var _289,i,t,ctor,name,_28a,_28b,_28c=1,_28d=_287;if(opts.call(_287)=="[object Array]"){_28a=_25b(_287,_286);t=_28a[0];_28c=_28a.length-t;_287=_28a[_28c];}else{_28a=[0];if(_287){if(opts.call(_287)=="[object Function]"){t=_287._meta;_28a=_28a.concat(t?t.bases:_287);}else{err("base class is not a callable constructor.",_286);}}else{if(_287!==null){err("unknown base class. Did you use dojo.require to pull it in?",_286);}}}if(_287){for(i=_28c-1;;--i){_289=_285(_287);if(!i){break;}t=_28a[i];(t._meta?_26e:mix)(_289,t.prototype);ctor=new Function;ctor.superclass=_287;ctor.prototype=_289;_287=_289.constructor=ctor;}}else{_289={};}_278.safeMixin(_289,_288);t=_288.constructor;if(t!==op.constructor){t.nom=_25a;_289.constructor=t;}for(i=_28c-1;i;--i){t=_28a[i]._meta;if(t&&t.chains){_28b=mix(_28b||{},t.chains);}}if(_289["-chains-"]){_28b=mix(_28b||{},_289["-chains-"]);}t=!_28b||!_28b.hasOwnProperty(_25a);_28a[0]=ctor=(_28b&&_28b.constructor==="manual")?_280(_28a):(_28a.length==1?_27e(_288.constructor,t):_279(_28a,t));ctor._meta={bases:_28a,hidden:_288,chains:_28b,parents:_28d,ctor:_288.constructor};ctor.superclass=_287&&_287.prototype;ctor.extend=_276;ctor.prototype=_289;_289.constructor=ctor;_289.getInherited=_269;_289.isInstanceOf=_26c;_289.inherited=_26b;_289.__inherited=_263;if(_286){_289.declaredClass=_286;lang.setObject(_286,ctor);}if(_28b){for(name in _28b){if(_289[name]&&typeof _28b[name]=="string"&&name!=_25a){t=_289[name]=_282(name,_28a,_28b[name]==="after");t.nom=name;}}}return ctor;};dojo.safeMixin=_278.safeMixin=_272;dojo.declare=_278;return _278;});},"dojo/dom":function(){define(["./_base/sniff","./_base/lang","./_base/window"],function(has,lang,win){try{document.execCommand("BackgroundImageCache",false,true);}catch(e){}var dom={};if(has("ie")){dom.byId=function(id,doc){if(typeof id!="string"){return id;}var _28e=doc||win.doc,te=id&&_28e.getElementById(id);if(te&&(te.attributes.id.value==id||te.id==id)){return te;}else{var eles=_28e.all[id];if(!eles||eles.nodeName){eles=[eles];}var i=0;while((te=eles[i++])){if((te.attributes&&te.attributes.id&&te.attributes.id.value==id)||te.id==id){return te;}}}};}else{dom.byId=function(id,doc){return ((typeof id=="string")?(doc||win.doc).getElementById(id):id)||null;};}dom.isDescendant=function(node,_28f){try{node=dom.byId(node);_28f=dom.byId(_28f);while(node){if(node==_28f){return true;}node=node.parentNode;}}catch(e){}return false;};dom.setSelectable=function(node,_290){node=dom.byId(node);if(has("mozilla")){node.style.MozUserSelect=_290?"":"none";}else{if(has("khtml")||has("webkit")){node.style.KhtmlUserSelect=_290?"auto":"none";}else{if(has("ie")){var v=(node.unselectable=_290?"":"on"),cs=node.getElementsByTagName("*"),i=0,l=cs.length;for(;i<l;++i){cs.item(i).unselectable=v;}}}}};return dom;});},"dojo/_base/browser":function(){if(require.has){require.has.add("config-selectorEngine","acme");}define("dojo/_base/browser",["../ready","./kernel","./connect","./unload","./window","./event","./html","./NodeList","../query","./xhr","./fx"],function(dojo){return dojo;});},"dojo/dom-style":function(){define(["./_base/sniff","./dom"],function(has,dom){var _291,_292={};if(has("webkit")){_291=function(node){var s;if(node.nodeType==1){var dv=node.ownerDocument.defaultView;s=dv.getComputedStyle(node,null);if(!s&&node.style){node.style.display="";s=dv.getComputedStyle(node,null);}}return s||{};};}else{if(has("ie")&&(has("ie")<9||has("quirks"))){_291=function(node){return node.nodeType==1?node.currentStyle:{};};}else{_291=function(node){return node.nodeType==1?node.ownerDocument.defaultView.getComputedStyle(node,null):{};};}}_292.getComputedStyle=_291;var _293;if(!has("ie")){_293=function(_294,_295){return parseFloat(_295)||0;};}else{_293=function(_296,_297){if(!_297){return 0;}if(_297=="medium"){return 4;}if(_297.slice&&_297.slice(-2)=="px"){return parseFloat(_297);}var s=_296.style,rs=_296.runtimeStyle,cs=_296.currentStyle,_298=s.left,_299=rs.left;rs.left=cs.left;try{s.left=_297;_297=s.pixelLeft;}catch(e){_297=0;}s.left=_298;rs.left=_299;return _297;};}_292.toPixelValue=_293;var astr="DXImageTransform.Microsoft.Alpha";var af=function(n,f){try{return n.filters.item(astr);}catch(e){return f?{}:null;}};var _29a=has("ie")<9||(has("ie")&&has("quirks"))?function(node){try{return af(node).Opacity/100;}catch(e){return 1;}}:function(node){return _291(node).opacity;};var _29b=has("ie")<9||(has("ie")&&has("quirks"))?function(node,_29c){var ov=_29c*100,_29d=_29c==1;node.style.zoom=_29d?"":1;if(!af(node)){if(_29d){return _29c;}node.style.filter+=" progid:"+astr+"(Opacity="+ov+")";}else{af(node,1).Opacity=ov;}af(node,1).Enabled=!_29d;if(node.tagName.toLowerCase()=="tr"){for(var td=node.firstChild;td;td=td.nextSibling){if(td.tagName.toLowerCase()=="td"){_29b(td,_29c);}}}return _29c;}:function(node,_29e){return node.style.opacity=_29e;};var _29f={left:true,top:true};var _2a0=/margin|padding|width|height|max|min|offset/;function _2a1(node,type,_2a2){type=type.toLowerCase();if(has("ie")){if(_2a2=="auto"){if(type=="height"){return node.offsetHeight;}if(type=="width"){return node.offsetWidth;}}if(type=="fontweight"){switch(_2a2){case 700:return "bold";case 400:default:return "normal";}}}if(!(type in _29f)){_29f[type]=_2a0.test(type);}return _29f[type]?_293(node,_2a2):_2a2;};var _2a3=has("ie")?"styleFloat":"cssFloat",_2a4={"cssFloat":_2a3,"styleFloat":_2a3,"float":_2a3};_292.get=function getStyle(node,name){var n=dom.byId(node),l=arguments.length,op=(name=="opacity");if(l==2&&op){return _29a(n);}name=_2a4[name]||name;var s=_292.getComputedStyle(n);return (l==1)?s:_2a1(n,name,s[name]||n.style[name]);};_292.set=function setStyle(node,name,_2a5){var n=dom.byId(node),l=arguments.length,op=(name=="opacity");name=_2a4[name]||name;if(l==3){return op?_29b(n,_2a5):n.style[name]=_2a5;}for(var x in name){_292.set(node,x,name[x]);}return _292.getComputedStyle(n);};return _292;});},"dojo/dom-geometry":function(){define(["./_base/sniff","./_base/window","./dom","./dom-style"],function(has,win,dom,_2a6){var geom={};geom.boxModel="content-box";if(has("ie")){geom.boxModel=document.compatMode=="BackCompat"?"border-box":"content-box";}geom.getPadExtents=function getPadExtents(node,_2a7){node=dom.byId(node);var s=_2a7||_2a6.getComputedStyle(node),px=_2a6.toPixelValue,l=px(node,s.paddingLeft),t=px(node,s.paddingTop),r=px(node,s.paddingRight),b=px(node,s.paddingBottom);return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};var none="none";geom.getBorderExtents=function getBorderExtents(node,_2a8){node=dom.byId(node);var px=_2a6.toPixelValue,s=_2a8||_2a6.getComputedStyle(node),l=s.borderLeftStyle!=none?px(node,s.borderLeftWidth):0,t=s.borderTopStyle!=none?px(node,s.borderTopWidth):0,r=s.borderRightStyle!=none?px(node,s.borderRightWidth):0,b=s.borderBottomStyle!=none?px(node,s.borderBottomWidth):0;return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};geom.getPadBorderExtents=function getPadBorderExtents(node,_2a9){node=dom.byId(node);var s=_2a9||_2a6.getComputedStyle(node),p=geom.getPadExtents(node,s),b=geom.getBorderExtents(node,s);return {l:p.l+b.l,t:p.t+b.t,r:p.r+b.r,b:p.b+b.b,w:p.w+b.w,h:p.h+b.h};};geom.getMarginExtents=function getMarginExtents(node,_2aa){node=dom.byId(node);var s=_2aa||_2a6.getComputedStyle(node),px=_2a6.toPixelValue,l=px(node,s.marginLeft),t=px(node,s.marginTop),r=px(node,s.marginRight),b=px(node,s.marginBottom);if(has("webkit")&&(s.position!="absolute")){r=l;}return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};geom.getMarginBox=function getMarginBox(node,_2ab){node=dom.byId(node);var s=_2ab||_2a6.getComputedStyle(node),me=geom.getMarginExtents(node,s),l=node.offsetLeft-me.l,t=node.offsetTop-me.t,p=node.parentNode,px=_2a6.toPixelValue,pcs;if(has("mozilla")){var sl=parseFloat(s.left),st=parseFloat(s.top);if(!isNaN(sl)&&!isNaN(st)){l=sl,t=st;}else{if(p&&p.style){pcs=_2a6.getComputedStyle(p);if(pcs.overflow!="visible"){l+=pcs.borderLeftStyle!=none?px(node,pcs.borderLeftWidth):0;t+=pcs.borderTopStyle!=none?px(node,pcs.borderTopWidth):0;}}}}else{if(has("opera")||(has("ie")==8&&!has("quirks"))){if(p){pcs=_2a6.getComputedStyle(p);l-=pcs.borderLeftStyle!=none?px(node,pcs.borderLeftWidth):0;t-=pcs.borderTopStyle!=none?px(node,pcs.borderTopWidth):0;}}}return {l:l,t:t,w:node.offsetWidth+me.w,h:node.offsetHeight+me.h};};geom.getContentBox=function getContentBox(node,_2ac){node=dom.byId(node);var s=_2ac||_2a6.getComputedStyle(node),w=node.clientWidth,h,pe=geom.getPadExtents(node,s),be=geom.getBorderExtents(node,s);if(!w){w=node.offsetWidth;h=node.offsetHeight;}else{h=node.clientHeight;be.w=be.h=0;}if(has("opera")){pe.l+=be.l;pe.t+=be.t;}return {l:pe.l,t:pe.t,w:w-pe.w-be.w,h:h-pe.h-be.h};};function _2ad(node,l,t,w,h,u){u=u||"px";var s=node.style;if(!isNaN(l)){s.left=l+u;}if(!isNaN(t)){s.top=t+u;}if(w>=0){s.width=w+u;}if(h>=0){s.height=h+u;}};function _2ae(node){return node.tagName.toLowerCase()=="button"||node.tagName.toLowerCase()=="input"&&(node.getAttribute("type")||"").toLowerCase()=="button";};function _2af(node){return geom.boxModel=="border-box"||node.tagName.toLowerCase()=="table"||_2ae(node);};geom.setContentSize=function setContentSize(node,box,_2b0){node=dom.byId(node);var w=box.w,h=box.h;if(_2af(node)){var pb=geom.getPadBorderExtents(node,_2b0);if(w>=0){w+=pb.w;}if(h>=0){h+=pb.h;}}_2ad(node,NaN,NaN,w,h);};var _2b1={l:0,t:0,w:0,h:0};geom.setMarginBox=function setMarginBox(node,box,_2b2){node=dom.byId(node);var s=_2b2||_2a6.getComputedStyle(node),w=box.w,h=box.h,pb=_2af(node)?_2b1:geom.getPadBorderExtents(node,s),mb=geom.getMarginExtents(node,s);if(has("webkit")){if(_2ae(node)){var ns=node.style;if(w>=0&&!ns.width){ns.width="4px";}if(h>=0&&!ns.height){ns.height="4px";}}}if(w>=0){w=Math.max(w-pb.w-mb.w,0);}if(h>=0){h=Math.max(h-pb.h-mb.h,0);}_2ad(node,box.l,box.t,w,h);};geom.isBodyLtr=function isBodyLtr(){return (win.body().dir||win.doc.documentElement.dir||"ltr").toLowerCase()=="ltr";};geom.docScroll=function docScroll(){var node=win.doc.parentWindow||win.doc.defaultView;return "pageXOffset" in node?{x:node.pageXOffset,y:node.pageYOffset}:(node=has("quirks")?win.body():win.doc.documentElement,{x:geom.fixIeBiDiScrollLeft(node.scrollLeft||0),y:node.scrollTop||0});};geom.getIeDocumentElementOffset=function getIeDocumentElementOffset(){var de=win.doc.documentElement;if(has("ie")<8){var r=de.getBoundingClientRect(),l=r.left,t=r.top;if(has("ie")<7){l+=de.clientLeft;t+=de.clientTop;}return {x:l<0?0:l,y:t<0?0:t};}else{return {x:0,y:0};}};geom.fixIeBiDiScrollLeft=function fixIeBiDiScrollLeft(_2b3){var ie=has("ie");if(ie&&!geom.isBodyLtr()){var qk=has("quirks"),de=qk?win.body():win.doc.documentElement;if(ie==6&&!qk&&win.global.frameElement&&de.scrollHeight>de.clientHeight){_2b3+=de.clientLeft;}return (ie<8||qk)?(_2b3+de.clientWidth-de.scrollWidth):-_2b3;}return _2b3;};geom.position=function(node,_2b4){node=dom.byId(node);var db=win.body(),dh=db.parentNode,ret=node.getBoundingClientRect();ret={x:ret.left,y:ret.top,w:ret.right-ret.left,h:ret.bottom-ret.top};if(has("ie")){var _2b5=geom.getIeDocumentElementOffset();ret.x-=_2b5.x+(has("quirks")?db.clientLeft+db.offsetLeft:0);ret.y-=_2b5.y+(has("quirks")?db.clientTop+db.offsetTop:0);}else{if(has("ff")==3){var cs=_2a6.getComputedStyle(dh),px=_2a6.toPixelValue;ret.x-=px(dh,cs.marginLeft)+px(dh,cs.borderLeftWidth);ret.y-=px(dh,cs.marginTop)+px(dh,cs.borderTopWidth);}}if(_2b4){var _2b6=geom.docScroll();ret.x+=_2b6.x;ret.y+=_2b6.y;}return ret;};geom.getMarginSize=function getMarginSize(node,_2b7){node=dom.byId(node);var me=geom.getMarginExtents(node,_2b7||_2a6.getComputedStyle(node));var size=node.getBoundingClientRect();return {w:(size.right-size.left)+me.w,h:(size.bottom-size.top)+me.h};};geom.normalizeEvent=function(_2b8){if(!("layerX" in _2b8)){_2b8.layerX=_2b8.offsetX;_2b8.layerY=_2b8.offsetY;}if(!has("dom-addeventlistener")){var se=_2b8.target;var doc=(se&&se.ownerDocument)||document;var _2b9=has("quirks")?doc.body:doc.documentElement;var _2ba=geom.getIeDocumentElementOffset();_2b8.pageX=_2b8.clientX+geom.fixIeBiDiScrollLeft(_2b9.scrollLeft||0)-_2ba.x;_2b8.pageY=_2b8.clientY+(_2b9.scrollTop||0)-_2ba.y;}};return geom;});},"dojo/dom-prop":function(){define("dojo/dom-prop",["exports","./_base/kernel","./_base/sniff","./_base/lang","./dom","./dom-style","./dom-construct","./_base/connect"],function(_2bb,dojo,has,lang,dom,_2bc,ctr,conn){var _2bd={},_2be=0,_2bf=dojo._scopeName+"attrid";var _2c0={col:1,colgroup:1,table:1,tbody:1,tfoot:1,thead:1,tr:1,title:1};_2bb.names={"class":"className","for":"htmlFor",tabindex:"tabIndex",readonly:"readOnly",colspan:"colSpan",frameborder:"frameBorder",rowspan:"rowSpan",valuetype:"valueType"};_2bb.get=function getProp(node,name){node=dom.byId(node);var lc=name.toLowerCase(),_2c1=_2bb.names[lc]||name;return node[_2c1];};_2bb.set=function setProp(node,name,_2c2){node=dom.byId(node);var l=arguments.length;if(l==2&&typeof name!="string"){for(var x in name){_2bb.set(node,x,name[x]);}return node;}var lc=name.toLowerCase(),_2c3=_2bb.names[lc]||name;if(_2c3=="style"&&typeof _2c2!="string"){_2bc.style(node,_2c2);return node;}if(_2c3=="innerHTML"){if(has("ie")&&node.tagName.toLowerCase() in _2c0){ctr.empty(node);node.appendChild(ctr.toDom(_2c2,node.ownerDocument));}else{node[_2c3]=_2c2;}return node;}if(lang.isFunction(_2c2)){var _2c4=node[_2bf];if(!_2c4){_2c4=_2be++;node[_2bf]=_2c4;}if(!_2bd[_2c4]){_2bd[_2c4]={};}var h=_2bd[_2c4][_2c3];if(h){conn.disconnect(h);}else{try{delete node[_2c3];}catch(e){}}if(_2c2){_2bd[_2c4][_2c3]=conn.connect(node,_2c3,_2c2);}else{node[_2c3]=null;}return node;}node[_2c3]=_2c2;return node;};});},"dojo/dom-attr":function(){define(["exports","./_base/sniff","./_base/lang","./dom","./dom-style","./dom-prop"],function(_2c5,has,lang,dom,_2c6,prop){var _2c7={innerHTML:1,className:1,htmlFor:has("ie"),value:1},_2c8={classname:"class",htmlfor:"for",tabindex:"tabIndex",readonly:"readOnly"};function _2c9(node,name){var attr=node.getAttributeNode&&node.getAttributeNode(name);return attr&&attr.specified;};_2c5.has=function hasAttr(node,name){var lc=name.toLowerCase();return _2c7[prop.names[lc]||name]||_2c9(dom.byId(node),_2c8[lc]||name);};_2c5.get=function getAttr(node,name){node=dom.byId(node);var lc=name.toLowerCase(),_2ca=prop.names[lc]||name,_2cb=_2c7[_2ca];value=node[_2ca];if(_2cb&&typeof value!="undefined"){return value;}if(_2ca!="href"&&(typeof value=="boolean"||lang.isFunction(value))){return value;}var _2cc=_2c8[lc]||name;return _2c9(node,_2cc)?node.getAttribute(_2cc):null;};_2c5.set=function setAttr(node,name,_2cd){node=dom.byId(node);if(arguments.length==2){for(var x in name){_2c5.set(node,x,name[x]);}return node;}var lc=name.toLowerCase(),_2ce=prop.names[lc]||name,_2cf=_2c7[_2ce];if(_2ce=="style"&&typeof _2cd!="string"){_2c6.set(node,_2cd);return node;}if(_2cf||typeof _2cd=="boolean"||lang.isFunction(_2cd)){return prop.set(node,name,_2cd);}node.setAttribute(_2c8[lc]||name,_2cd);return node;};_2c5.remove=function removeAttr(node,name){dom.byId(node).removeAttribute(_2c8[name.toLowerCase()]||name);};_2c5.getNodeProp=function getNodeProp(node,name){node=dom.byId(node);var lc=name.toLowerCase(),_2d0=prop.names[lc]||name;if((_2d0 in node)&&_2d0!="href"){return node[_2d0];}var _2d1=_2c8[lc]||name;return _2c9(node,_2d1)?node.getAttribute(_2d1):null;};});},"dojo/dom-construct":function(){define("dojo/dom-construct",["exports","./_base/kernel","./_base/sniff","./_base/window","./dom","./dom-attr","./on"],function(_2d2,dojo,has,win,dom,attr,on){var _2d3={option:["select"],tbody:["table"],thead:["table"],tfoot:["table"],tr:["table","tbody"],td:["table","tbody","tr"],th:["table","thead","tr"],legend:["fieldset"],caption:["table"],colgroup:["table"],col:["table","colgroup"],li:["ul"]},_2d4=/<\s*([\w\:]+)/,_2d5={},_2d6=0,_2d7="__"+dojo._scopeName+"ToDomId";for(var _2d8 in _2d3){if(_2d3.hasOwnProperty(_2d8)){var tw=_2d3[_2d8];tw.pre=_2d8=="option"?"<select multiple=\"multiple\">":"<"+tw.join("><")+">";tw.post="</"+tw.reverse().join("></")+">";}}function _2d9(node,ref){var _2da=ref.parentNode;if(_2da){_2da.insertBefore(node,ref);}};function _2db(node,ref){var _2dc=ref.parentNode;if(_2dc){if(_2dc.lastChild==ref){_2dc.appendChild(node);}else{_2dc.insertBefore(node,ref.nextSibling);}}};var _2dd=null,_2de;on(window,"unload",function(){_2dd=null;});_2d2.toDom=function toDom(frag,doc){doc=doc||win.doc;var _2df=doc[_2d7];if(!_2df){doc[_2d7]=_2df=++_2d6+"";_2d5[_2df]=doc.createElement("div");}frag+="";var _2e0=frag.match(_2d4),tag=_2e0?_2e0[1].toLowerCase():"",_2e1=_2d5[_2df],wrap,i,fc,df;if(_2e0&&_2d3[tag]){wrap=_2d3[tag];_2e1.innerHTML=wrap.pre+frag+wrap.post;for(i=wrap.length;i;--i){_2e1=_2e1.firstChild;}}else{_2e1.innerHTML=frag;}if(_2e1.childNodes.length==1){return _2e1.removeChild(_2e1.firstChild);}df=doc.createDocumentFragment();while(fc=_2e1.firstChild){df.appendChild(fc);}return df;};_2d2.place=function place(node,_2e2,_2e3){_2e2=dom.byId(_2e2);if(typeof node=="string"){node=/^\s*</.test(node)?_2d2.toDom(node,_2e2.ownerDocument):dom.byId(node);}if(typeof _2e3=="number"){var cn=_2e2.childNodes;if(!cn.length||cn.length<=_2e3){_2e2.appendChild(node);}else{_2d9(node,cn[_2e3<0?0:_2e3]);}}else{switch(_2e3){case "before":_2d9(node,_2e2);break;case "after":_2db(node,_2e2);break;case "replace":_2e2.parentNode.replaceChild(node,_2e2);break;case "only":_2d2.empty(_2e2);_2e2.appendChild(node);break;case "first":if(_2e2.firstChild){_2d9(node,_2e2.firstChild);break;}default:_2e2.appendChild(node);}}return node;};_2d2.create=function create(tag,_2e4,_2e5,pos){var doc=win.doc;if(_2e5){_2e5=dom.byId(_2e5);doc=_2e5.ownerDocument;}if(typeof tag=="string"){tag=doc.createElement(tag);}if(_2e4){attr.set(tag,_2e4);}if(_2e5){_2d2.place(tag,_2e5,pos);}return tag;};_2d2.empty=has("ie")?function(node){node=dom.byId(node);for(var c;c=node.lastChild;){_2d2.destroy(c);}}:function(node){dom.byId(node).innerHTML="";};_2d2.destroy=function destroy(node){node=dom.byId(node);try{var doc=node.ownerDocument;if(!_2dd||_2de!=doc){_2dd=doc.createElement("div");_2de=doc;}_2dd.appendChild(node.parentNode?node.parentNode.removeChild(node):node);_2dd.innerHTML="";}catch(e){}};});},"dojo/keys":function(){define("dojo/keys",["./_base/kernel","./_base/sniff"],function(dojo,has){return dojo.keys={BACKSPACE:8,TAB:9,CLEAR:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,META:has("safari")?91:224,PAUSE:19,CAPS_LOCK:20,ESCAPE:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT_ARROW:37,UP_ARROW:38,RIGHT_ARROW:39,DOWN_ARROW:40,INSERT:45,DELETE:46,HELP:47,LEFT_WINDOW:91,RIGHT_WINDOW:92,SELECT:93,NUMPAD_0:96,NUMPAD_1:97,NUMPAD_2:98,NUMPAD_3:99,NUMPAD_4:100,NUMPAD_5:101,NUMPAD_6:102,NUMPAD_7:103,NUMPAD_8:104,NUMPAD_9:105,NUMPAD_MULTIPLY:106,NUMPAD_PLUS:107,NUMPAD_ENTER:108,NUMPAD_MINUS:109,NUMPAD_PERIOD:110,NUMPAD_DIVIDE:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,NUM_LOCK:144,SCROLL_LOCK:145,UP_DPAD:175,DOWN_DPAD:176,LEFT_DPAD:177,RIGHT_DPAD:178,copyKey:has("mac")&&!has("air")?(has("safari")?91:224):17};});},"dojo/domReady":function(){define(["./has"],function(has){var _2e6=this,doc=document,_2e7={"loaded":1,"complete":1},_2e8=typeof doc.readyState!="string",_2e9=!!_2e7[doc.readyState];if(_2e8){doc.readyState="loading";}if(!_2e9){var _2ea=[],_2eb=[],_2ec=function(evt){evt=evt||_2e6.event;if(_2e9||(evt.type=="readystatechange"&&!_2e7[doc.readyState])){return;}_2e9=1;if(_2e8){doc.readyState="complete";}while(_2ea.length){(_2ea.shift())();}},on=function(node,_2ed){node.addEventListener(_2ed,_2ec,false);_2ea.push(function(){node.removeEventListener(_2ed,_2ec,false);});};if(!has("dom-addeventlistener")){on=function(node,_2ee){_2ee="on"+_2ee;node.attachEvent(_2ee,_2ec);_2ea.push(function(){node.detachEvent(_2ee,_2ec);});};var div=doc.createElement("div");try{if(div.doScroll&&_2e6.frameElement===null){_2eb.push(function(){try{div.doScroll("left");return 1;}catch(e){}});}}catch(e){}}on(doc,"DOMContentLoaded");on(_2e6,"load");if("onreadystatechange" in doc){on(doc,"readystatechange");}else{if(!_2e8){_2eb.push(function(){return _2e7[doc.readyState];});}}if(_2eb.length){var _2ef=function(){if(_2e9){return;}var i=_2eb.length;while(i--){if(_2eb[i]()){_2ec("poller");return;}}setTimeout(_2ef,30);};_2ef();}}function _2f0(_2f1){if(_2e9){_2f1(1);}else{_2ea.push(_2f1);}};_2f0.load=function(id,req,load){_2f0(load);};return _2f0;});},"dojo/_base/lang":function(){define(["./kernel","../has","./sniff"],function(dojo,has){has.add("bug-for-in-skips-shadowed",function(){for(var i in {toString:1}){return 0;}return 1;});var _2f2=has("bug-for-in-skips-shadowed")?"hasOwnProperty.valueOf.isPrototypeOf.propertyIsEnumerable.toLocaleString.toString.constructor".split("."):[],_2f3=_2f2.length,_2f4=function(dest,_2f5,_2f6){var name,s,i,_2f7={};for(name in _2f5){s=_2f5[name];if(!(name in dest)||(dest[name]!==s&&(!(name in _2f7)||_2f7[name]!==s))){dest[name]=_2f6?_2f6(s):s;}}if(has("bug-for-in-skips-shadowed")){if(_2f5){for(i=0;i<_2f3;++i){name=_2f2[i];s=_2f5[name];if(!(name in dest)||(dest[name]!==s&&(!(name in _2f7)||_2f7[name]!==s))){dest[name]=_2f6?_2f6(s):s;}}}}return dest;},_2f8=function(dest,_2f9){if(!dest){dest={};}for(var i=1,l=arguments.length;i<l;i++){lang._mixin(dest,arguments[i]);}return dest;},_2fa=function(_2fb,_2fc,_2fd){var p,i=0,_2fe=dojo.global;if(!_2fd){if(!_2fb.length){return _2fe;}else{p=_2fb[i++];try{_2fd=dojo.scopeMap[p]&&dojo.scopeMap[p][1];}catch(e){}_2fd=_2fd||(p in _2fe?_2fe[p]:(_2fc?_2fe[p]={}:undefined));}}while(_2fd&&(p=_2fb[i++])){_2fd=(p in _2fd?_2fd[p]:(_2fc?_2fd[p]={}:undefined));}return _2fd;},_2ff=function(name,_300,_301){var _302=name.split("."),p=_302.pop(),obj=_2fa(_302,true,_301);return obj&&p?(obj[p]=_300):undefined;},_303=function(name,_304,_305){return _2fa(name.split("."),_304,_305);},_306=function(name,obj){return lang.getObject(name,false,obj)!==undefined;},opts=Object.prototype.toString,_307=function(it){return (typeof it=="string"||it instanceof String);},_308=function(it){return it&&(it instanceof Array||typeof it=="array");},_309=function(it){return opts.call(it)==="[object Function]";},_30a=function(it){return it!==undefined&&(it===null||typeof it=="object"||lang.isArray(it)||lang.isFunction(it));},_30b=function(it){return it&&it!==undefined&&!lang.isString(it)&&!lang.isFunction(it)&&!(it.tagName&&it.tagName.toLowerCase()=="form")&&(lang.isArray(it)||isFinite(it.length));},_30c=function(it){return it&&!lang.isFunction(it)&&/\{\s*\[native code\]\s*\}/.test(String(it));},_30d=function(_30e,_30f){for(var i=1,l=arguments.length;i<l;i++){lang._mixin(_30e.prototype,arguments[i]);}return _30e;},_310=function(_311,_312){var pre=_313(arguments,2);var _314=lang.isString(_312);return function(){var args=_313(arguments);var f=_314?(_311||dojo.global)[_312]:_312;return f&&f.apply(_311||this,pre.concat(args));};},_315=function(_316,_317){if(arguments.length>2){return lang._hitchArgs.apply(dojo,arguments);}if(!_317){_317=_316;_316=null;}if(lang.isString(_317)){_316=_316||dojo.global;if(!_316[_317]){throw (["dojo.hitch: scope[\"",_317,"\"] is null (scope=\"",_316,"\")"].join(""));}return function(){return _316[_317].apply(_316,arguments||[]);};}return !_316?_317:function(){return _317.apply(_316,arguments||[]);};},_318=(function(){function TMP(){};return function(obj,_319){TMP.prototype=obj;var tmp=new TMP();TMP.prototype=null;if(_319){lang._mixin(tmp,_319);}return tmp;};})(),_31a=function(obj,_31b,_31c){return (_31c||[]).concat(Array.prototype.slice.call(obj,_31b||0));},_313=has("ie")?(function(){function slow(obj,_31d,_31e){var arr=_31e||[];for(var x=_31d||0;x<obj.length;x++){arr.push(obj[x]);}return arr;};return function(obj){return ((obj.item)?slow:_31a).apply(this,arguments);};})():_31a,_31f=function(_320){var arr=[null];return lang.hitch.apply(dojo,arr.concat(lang._toArray(arguments)));},_321=function(src){if(!src||typeof src!="object"||lang.isFunction(src)){return src;}if(src.nodeType&&"cloneNode" in src){return src.cloneNode(true);}if(src instanceof Date){return new Date(src.getTime());}if(src instanceof RegExp){return new RegExp(src);}var r,i,l;if(lang.isArray(src)){r=[];for(i=0,l=src.length;i<l;++i){if(i in src){r.push(_321(src[i]));}}}else{r=src.constructor?new src.constructor():{};}return lang._mixin(r,src,_321);},trim=String.prototype.trim?function(str){return str.trim();}:function(str){return str.replace(/^\s\s*/,"").replace(/\s\s*$/,"");},_322=/\{([^\}]+)\}/g,_323=function(tmpl,map,_324){return tmpl.replace(_324||_322,lang.isFunction(map)?map:function(_325,k){return _303(k,false,map);});},lang={_extraNames:_2f2,_mixin:_2f4,mixin:_2f8,setObject:_2ff,getObject:_303,exists:_306,isString:_307,isArray:_308,isFunction:_309,isObject:_30a,isArrayLike:_30b,isAlien:_30c,extend:_30d,_hitchArgs:_310,hitch:_315,delegate:_318,_toArray:_313,partial:_31f,clone:_321,trim:trim,replace:_323};1&&_2f8(dojo,lang);return lang;});},"dojo/Evented":function(){define(["./aspect","./on"],function(_326,on){"use strict";var _327=_326.after;function _328(){};_328.prototype={on:function(type,_329){return on.parse(this,type,_329,function(_32a,type){return _327(_32a,"on"+type,_329,true);});},emit:function(type,_32b){var args=[this];args.push.apply(args,arguments);return on.emit.apply(on,args);}};return _328;});},"dojo/mouse":function(){define(["./_base/kernel","./on","./has","./dom","./_base/window"],function(dojo,on,has,dom,win){has.add("dom-quirks",win.doc&&win.doc.compatMode=="BackCompat");has.add("events-mouseenter",win.doc&&"onmouseenter" in win.doc.createElement("div"));var _32c;if(has("dom-quirks")||!has("dom-addeventlistener")){_32c={LEFT:1,MIDDLE:4,RIGHT:2,isButton:function(e,_32d){return e.button&_32d;},isLeft:function(e){return e.button&1;},isMiddle:function(e){return e.button&4;},isRight:function(e){return e.button&2;}};}else{_32c={LEFT:0,MIDDLE:1,RIGHT:2,isButton:function(e,_32e){return e.button==_32e;},isLeft:function(e){return e.button==0;},isMiddle:function(e){return e.button==1;},isRight:function(e){return e.button==2;}};}dojo.mouseButtons=_32c;function _32f(type,_330){var _331=function(node,_332){return on(node,type,function(evt){if(!dom.isDescendant(evt.relatedTarget,_330?evt.target:node)){return _332.call(this,evt);}});};if(!_330){_331.bubble=_32f(type,true);}return _331;};return {enter:_32f("mouseover"),leave:_32f("mouseout"),isLeft:_32c.isLeft,isMiddle:_32c.isMiddle,isRight:_32c.isRight};});},"dojo/topic":function(){define(["./Evented"],function(_333){var hub=new _333;return {publish:function(_334,_335){return hub.emit.apply(hub,arguments);},subscribe:function(_336,_337){return hub.on.apply(hub,arguments);}};});},"dojo/_base/xhr":function(){define(["./kernel","./sniff","require","../io-query","../dom","../dom-form","./Deferred","./json","./lang","./array","../on"],function(dojo,has,_338,ioq,dom,_339,_33a,json,lang,_33b,on){has.add("native-xhr",function(){return typeof XMLHttpRequest!=="undefined";});if(1&&_338.getXhr){dojo._xhrObj=_338.getXhr;}else{if(has("native-xhr")){dojo._xhrObj=function(){try{return new XMLHttpRequest();}catch(e){throw new Error("XMLHTTP not available: "+e);}};}else{for(var _33c=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],_33d,i=0;i<3;){try{_33d=_33c[i++];if(new ActiveXObject(_33d)){break;}}catch(e){}}dojo._xhrObj=function(){return new ActiveXObject(_33d);};}}var cfg=dojo.config;dojo.objectToQuery=ioq.objectToQuery;dojo.queryToObject=ioq.queryToObject;dojo.fieldToObject=_339.fieldToObject;dojo.formToObject=_339.toObject;dojo.formToQuery=_339.toQuery;dojo.formToJson=_339.toJson;dojo._blockAsync=false;var _33e=dojo._contentHandlers=dojo.contentHandlers={"text":function(xhr){return xhr.responseText;},"json":function(xhr){return json.fromJson(xhr.responseText||null);},"json-comment-filtered":function(xhr){if(!dojo.config.useCommentedJson){console.warn("Consider using the standard mimetype:application/json."+" json-commenting can introduce security issues. To"+" decrease the chances of hijacking, use the standard the 'json' handler and"+" prefix your json with: {}&&\n"+"Use djConfig.useCommentedJson=true to turn off this message.");}var _33f=xhr.responseText;var _340=_33f.indexOf("/*");var _341=_33f.lastIndexOf("*/");if(_340==-1||_341==-1){throw new Error("JSON was not comment filtered");}return json.fromJson(_33f.substring(_340+2,_341));},"javascript":function(xhr){return dojo.eval(xhr.responseText);},"xml":function(xhr){var _342=xhr.responseXML;if(has("ie")){if((!_342||!_342.documentElement)){var ms=function(n){return "MSXML"+n+".DOMDocument";};var dp=["Microsoft.XMLDOM",ms(6),ms(4),ms(3),ms(2)];_33b.some(dp,function(p){try{var dom=new ActiveXObject(p);dom.async=false;dom.loadXML(xhr.responseText);_342=dom;}catch(e){return false;}return true;});}}return _342;},"json-comment-optional":function(xhr){if(xhr.responseText&&/^[^{\[]*\/\*/.test(xhr.responseText)){return _33e["json-comment-filtered"](xhr);}else{return _33e["json"](xhr);}}};dojo._ioSetArgs=function(args,_343,_344,_345){var _346={args:args,url:args.url};var _347=null;if(args.form){var form=dom.byId(args.form);var _348=form.getAttributeNode("action");_346.url=_346.url||(_348?_348.value:null);_347=_339.toObject(form);}var _349=[{}];if(_347){_349.push(_347);}if(args.content){_349.push(args.content);}if(args.preventCache){_349.push({"dojo.preventCache":new Date().valueOf()});}_346.query=ioq.objectToQuery(lang.mixin.apply(null,_349));_346.handleAs=args.handleAs||"text";var d=new _33a(_343);d.addCallbacks(_344,function(_34a){return _345(_34a,d);});var ld=args.load;if(ld&&lang.isFunction(ld)){d.addCallback(function(_34b){return ld.call(args,_34b,_346);});}var err=args.error;if(err&&lang.isFunction(err)){d.addErrback(function(_34c){return err.call(args,_34c,_346);});}var _34d=args.handle;if(_34d&&lang.isFunction(_34d)){d.addBoth(function(_34e){return _34d.call(args,_34e,_346);});}if(cfg.ioPublish&&dojo.publish&&_346.args.ioPublish!==false){d.addCallbacks(function(res){dojo.publish("/dojo/io/load",[d,res]);return res;},function(res){dojo.publish("/dojo/io/error",[d,res]);return res;});d.addBoth(function(res){dojo.publish("/dojo/io/done",[d,res]);return res;});}d.ioArgs=_346;return d;};var _34f=function(dfd){dfd.canceled=true;var xhr=dfd.ioArgs.xhr;var _350=typeof xhr.abort;if(_350=="function"||_350=="object"||_350=="unknown"){xhr.abort();}var err=dfd.ioArgs.error;if(!err){err=new Error("xhr cancelled");err.dojoType="cancel";}return err;};var _351=function(dfd){var ret=_33e[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);return ret===undefined?null:ret;};var _352=function(_353,dfd){if(!dfd.ioArgs.args.failOk){console.error(_353);}return _353;};var _354=null;var _355=[];var _356=0;var _357=function(dfd){if(_356<=0){_356=0;if(cfg.ioPublish&&dojo.publish&&(!dfd||dfd&&dfd.ioArgs.args.ioPublish!==false)){dojo.publish("/dojo/io/stop");}}};var _358=function(){var now=(new Date()).getTime();if(!dojo._blockAsync){for(var i=0,tif;i<_355.length&&(tif=_355[i]);i++){var dfd=tif.dfd;var func=function(){if(!dfd||dfd.canceled||!tif.validCheck(dfd)){_355.splice(i--,1);_356-=1;}else{if(tif.ioCheck(dfd)){_355.splice(i--,1);tif.resHandle(dfd);_356-=1;}else{if(dfd.startTime){if(dfd.startTime+(dfd.ioArgs.args.timeout||0)<now){_355.splice(i--,1);var err=new Error("timeout exceeded");err.dojoType="timeout";dfd.errback(err);dfd.cancel();_356-=1;}}}}};if(dojo.config.debugAtAllCosts){func.call(this);}else{try{func.call(this);}catch(e){dfd.errback(e);}}}}_357(dfd);if(!_355.length){clearInterval(_354);_354=null;}};dojo._ioCancelAll=function(){try{_33b.forEach(_355,function(i){try{i.dfd.cancel();}catch(e){}});}catch(e){}};if(has("ie")){on(window,"unload",dojo._ioCancelAll);}dojo._ioNotifyStart=function(dfd){if(cfg.ioPublish&&dojo.publish&&dfd.ioArgs.args.ioPublish!==false){if(!_356){dojo.publish("/dojo/io/start");}_356+=1;dojo.publish("/dojo/io/send",[dfd]);}};dojo._ioWatch=function(dfd,_359,_35a,_35b){var args=dfd.ioArgs.args;if(args.timeout){dfd.startTime=(new Date()).getTime();}_355.push({dfd:dfd,validCheck:_359,ioCheck:_35a,resHandle:_35b});if(!_354){_354=setInterval(_358,50);}if(args.sync){_358();}};var _35c="application/x-www-form-urlencoded";var _35d=function(dfd){return dfd.ioArgs.xhr.readyState;};var _35e=function(dfd){return 4==dfd.ioArgs.xhr.readyState;};var _35f=function(dfd){var xhr=dfd.ioArgs.xhr;if(dojo._isDocumentOk(xhr)){dfd.callback(dfd);}else{var err=new Error("Unable to load "+dfd.ioArgs.url+" status:"+xhr.status);err.status=xhr.status;err.responseText=xhr.responseText;err.xhr=xhr;dfd.errback(err);}};dojo._ioAddQueryToUrl=function(_360){if(_360.query.length){_360.url+=(_360.url.indexOf("?")==-1?"?":"&")+_360.query;_360.query=null;}};dojo.xhr=function(_361,args,_362){var dfd=dojo._ioSetArgs(args,_34f,_351,_352);var _363=dfd.ioArgs;var xhr=_363.xhr=dojo._xhrObj(_363.args);if(!xhr){dfd.cancel();return dfd;}if("postData" in args){_363.query=args.postData;}else{if("putData" in args){_363.query=args.putData;}else{if("rawBody" in args){_363.query=args.rawBody;}else{if((arguments.length>2&&!_362)||"POST|PUT".indexOf(_361.toUpperCase())==-1){dojo._ioAddQueryToUrl(_363);}}}}xhr.open(_361,_363.url,args.sync!==true,args.user||undefined,args.password||undefined);if(args.headers){for(var hdr in args.headers){if(hdr.toLowerCase()==="content-type"&&!args.contentType){args.contentType=args.headers[hdr];}else{if(args.headers[hdr]){xhr.setRequestHeader(hdr,args.headers[hdr]);}}}}if(args.contentType!==false){xhr.setRequestHeader("Content-Type",args.contentType||_35c);}if(!args.headers||!("X-Requested-With" in args.headers)){xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");}dojo._ioNotifyStart(dfd);if(dojo.config.debugAtAllCosts){xhr.send(_363.query);}else{try{xhr.send(_363.query);}catch(e){_363.error=e;dfd.cancel();}}dojo._ioWatch(dfd,_35d,_35e,_35f);xhr=null;return dfd;};dojo.xhrGet=function(args){return dojo.xhr("GET",args);};dojo.rawXhrPost=dojo.xhrPost=function(args){return dojo.xhr("POST",args,true);};dojo.rawXhrPut=dojo.xhrPut=function(args){return dojo.xhr("PUT",args,true);};dojo.xhrDelete=function(args){return dojo.xhr("DELETE",args);};dojo._isDocumentOk=function(http){var stat=http.status||0;stat=(stat>=200&&stat<300)||stat==304||stat==1223||!stat;return stat;};dojo._getText=function(url){var _364;dojo.xhrGet({url:url,sync:true,load:function(text){_364=text;}});return _364;};lang.mixin(dojo.xhr,{_xhrObj:dojo._xhrObj,fieldToObject:_339.fieldToObject,formToObject:_339.toObject,objectToQuery:ioq.objectToQuery,formToQuery:_339.toQuery,formToJson:_339.toJson,queryToObject:ioq.queryToObject,contentHandlers:_33e,_ioSetArgs:dojo._ioSetArgs,_ioCancelAll:dojo._ioCancelAll,_ioNotifyStart:dojo._ioNotifyStart,_ioWatch:dojo._ioWatch,_ioAddQueryToUrl:dojo._ioAddQueryToUrl,_isDocumentOk:dojo._isDocumentOk,_getText:dojo._getText,get:dojo.xhrGet,post:dojo.xhrPost,put:dojo.xhrPut,del:dojo.xhrDelete});return dojo.xhr;});},"dojo/_base/unload":function(){define(["./kernel","./connect"],function(dojo,_365){var win=window;dojo.addOnWindowUnload=function(obj,_366){if(!dojo.windowUnloaded){_365.connect(win,"unload",(dojo.windowUnloaded=function(){}));}_365.connect(win,"unload",obj,_366);};dojo.addOnUnload=function(obj,_367){_365.connect(win,"beforeunload",obj,_367);};return {addOnWindowUnload:dojo.addOnWindowUnload,addOnUnload:dojo.addOnUnload};});},"dojo/_base/NodeList":function(){define(["./kernel","../query","./array","./html","../NodeList-dom"],function(dojo,_368,_369){var _36a=_368.NodeList;var nlp=_36a.prototype;nlp.connect=_36a._adaptAsForEach(function(){return dojo.connect.apply(this,arguments);});nlp.coords=_36a._adaptAsMap(dojo.coords);_36a.events=["blur","focus","change","click","error","keydown","keypress","keyup","load","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","submit"];_369.forEach(_36a.events,function(evt){var _36b="on"+evt;nlp[_36b]=function(a,b){return this.connect(_36b,a,b);};});dojo.NodeList=_36a;return dojo.NodeList;});},"dojo/_base/Color":function(){define(["./kernel","./lang","./array","./config"],function(dojo,lang,_36c,_36d){var _36e=dojo.Color=function(_36f){if(_36f){this.setColor(_36f);}};_36e.named={"black":[0,0,0],"silver":[192,192,192],"gray":[128,128,128],"white":[255,255,255],"maroon":[128,0,0],"red":[255,0,0],"purple":[128,0,128],"fuchsia":[255,0,255],"green":[0,128,0],"lime":[0,255,0],"olive":[128,128,0],"yellow":[255,255,0],"navy":[0,0,128],"blue":[0,0,255],"teal":[0,128,128],"aqua":[0,255,255],"transparent":_36d.transparentColor||[0,0,0,0]};lang.extend(_36e,{r:255,g:255,b:255,a:1,_set:function(r,g,b,a){var t=this;t.r=r;t.g=g;t.b=b;t.a=a;},setColor:function(_370){if(lang.isString(_370)){_36e.fromString(_370,this);}else{if(lang.isArray(_370)){_36e.fromArray(_370,this);}else{this._set(_370.r,_370.g,_370.b,_370.a);if(!(_370 instanceof _36e)){this.sanitize();}}}return this;},sanitize:function(){return this;},toRgb:function(){var t=this;return [t.r,t.g,t.b];},toRgba:function(){var t=this;return [t.r,t.g,t.b,t.a];},toHex:function(){var arr=_36c.map(["r","g","b"],function(x){var s=this[x].toString(16);return s.length<2?"0"+s:s;},this);return "#"+arr.join("");},toCss:function(_371){var t=this,rgb=t.r+", "+t.g+", "+t.b;return (_371?"rgba("+rgb+", "+t.a:"rgb("+rgb)+")";},toString:function(){return this.toCss(true);}});_36e.blendColors=dojo.blendColors=function(_372,end,_373,obj){var t=obj||new _36e();_36c.forEach(["r","g","b","a"],function(x){t[x]=_372[x]+(end[x]-_372[x])*_373;if(x!="a"){t[x]=Math.round(t[x]);}});return t.sanitize();};_36e.fromRgb=dojo.colorFromRgb=function(_374,obj){var m=_374.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);return m&&_36e.fromArray(m[1].split(/\s*,\s*/),obj);};_36e.fromHex=dojo.colorFromHex=function(_375,obj){var t=obj||new _36e(),bits=(_375.length==4)?4:8,mask=(1<<bits)-1;_375=Number("0x"+_375.substr(1));if(isNaN(_375)){return null;}_36c.forEach(["b","g","r"],function(x){var c=_375&mask;_375>>=bits;t[x]=bits==4?17*c:c;});t.a=1;return t;};_36e.fromArray=dojo.colorFromArray=function(a,obj){var t=obj||new _36e();t._set(Number(a[0]),Number(a[1]),Number(a[2]),Number(a[3]));if(isNaN(t.a)){t.a=1;}return t.sanitize();};_36e.fromString=dojo.colorFromString=function(str,obj){var a=_36e.named[str];return a&&_36e.fromArray(a,obj)||_36e.fromRgb(str,obj)||_36e.fromHex(str,obj);};return _36e;});},"dojo/selector/_loader":function(){define(["../has","require"],function(has,_376){"use strict";var _377=document.createElement("div");has.add("dom-qsa2.1",!!_377.querySelectorAll);has.add("dom-qsa3",function(){try{_377.innerHTML="<p class='TEST'></p>";return _377.querySelectorAll(".TEST:empty").length==1;}catch(e){}});var _378;var acme="./acme",lite="./lite";return {load:function(id,_379,_37a,_37b){var req=_376;id=id=="default"?has("config-selectorEngine")||"css3":id;id=id=="css2"||id=="lite"?lite:id=="css2.1"?has("dom-qsa2.1")?lite:acme:id=="css3"?has("dom-qsa3")?lite:acme:id=="acme"?acme:(req=_379)&&id;if(id.charAt(id.length-1)=="?"){id=id.substring(0,id.length-1);var _37c=true;}if(_37c&&(has("dom-compliant-qsa")||_378)){return _37a(_378);}req([id],function(_37d){if(id!="./lite"){_378=_37d;}_37a(_37d);});}};});},"dojo/on":function(){define(["./has!dom-addeventlistener?:./aspect","./_base/kernel","./has"],function(_37e,dojo,has){"use strict";if(1){var _37f=window.ScriptEngineMajorVersion;has.add("jscript",_37f&&(_37f()+ScriptEngineMinorVersion()/10));has.add("event-orientationchange",has("touch")&&!has("android"));}var on=function(_380,type,_381,_382){if(_380.on){return _380.on(type,_381);}return on.parse(_380,type,_381,_383,_382,this);};on.pausable=function(_384,type,_385,_386){var _387;var _388=on(_384,type,function(){if(!_387){return _385.apply(this,arguments);}},_386);_388.pause=function(){_387=true;};_388.resume=function(){_387=false;};return _388;};on.once=function(_389,type,_38a,_38b){var _38c=on(_389,type,function(){_38c.remove();return _38a.apply(this,arguments);});return _38c;};on.parse=function(_38d,type,_38e,_38f,_390,_391){if(type.call){return type.call(_391,_38d,_38e);}if(type.indexOf(",")>-1){var _392=type.split(/\s*,\s*/);var _393=[];var i=0;var _394;while(_394=_392[i++]){_393.push(_38f(_38d,_394,_38e,_390,_391));}_393.remove=function(){for(var i=0;i<_393.length;i++){_393[i].remove();}};return _393;}return _38f(_38d,type,_38e,_390,_391);};var _395=/^touch/;function _383(_396,type,_397,_398,_399){var _39a=type.match(/(.*):(.*)/);if(_39a){type=_39a[2];_39a=_39a[1];return on.selector(_39a,type).call(_399,_396,_397);}if(has("touch")){if(_395.test(type)){_397=_39b(_397);}if(!has("event-orientationchange")&&(type=="orientationchange")){type="resize";_396=window;_397=_39b(_397);}}if(_396.addEventListener){var _39c=type in _39d;_396.addEventListener(_39c?_39d[type]:type,_397,_39c);return {remove:function(){_396.removeEventListener(type,_397,_39c);}};}type="on"+type;if(_39e&&_396.attachEvent){return _39e(_396,type,_397);}throw new Error("Target must be an event emitter");};on.selector=function(_39f,_3a0,_3a1){return function(_3a2,_3a3){var _3a4=this;var _3a5=_3a0.bubble;if(_3a5){_3a0=_3a5;}else{if(_3a1!==false){_3a1=true;}}return on(_3a2,_3a0,function(_3a6){var _3a7=_3a6.target;_3a4=_3a4&&_3a4.matches?_3a4:dojo.query;while(!_3a4.matches(_3a7,_39f,_3a2)){if(_3a7==_3a2||!_3a1||!(_3a7=_3a7.parentNode)){return;}}return _3a3.call(_3a7,_3a6);});};};function _3a8(){this.cancelable=false;};function _3a9(){this.bubbles=false;};var _3aa=[].slice,_3ab=on.emit=function(_3ac,type,_3ad){var args=_3aa.call(arguments,2);var _3ae="on"+type;if("parentNode" in _3ac){var _3af=args[0]={};for(var i in _3ad){_3af[i]=_3ad[i];}_3af.preventDefault=_3a8;_3af.stopPropagation=_3a9;_3af.target=_3ac;_3af.type=type;_3ad=_3af;}do{_3ac[_3ae]&&_3ac[_3ae].apply(_3ac,args);}while(_3ad&&_3ad.bubbles&&(_3ac=_3ac.parentNode));return _3ad&&_3ad.cancelable&&_3ad;};var _39d={};if(has("dom-addeventlistener")){_39d={focusin:"focus",focusout:"blur"};if(has("opera")){_39d.keydown="keypress";}on.emit=function(_3b0,type,_3b1){if(_3b0.dispatchEvent&&document.createEvent){var _3b2=document.createEvent("HTMLEvents");_3b2.initEvent(type,!!_3b1.bubbles,!!_3b1.cancelable);for(var i in _3b1){var _3b3=_3b1[i];if(!(i in _3b2)){_3b2[i]=_3b1[i];}}return _3b0.dispatchEvent(_3b2)&&_3b2;}return _3ab.apply(on,arguments);};}else{on._fixEvent=function(evt,_3b4){if(!evt){var w=_3b4&&(_3b4.ownerDocument||_3b4.document||_3b4).parentWindow||window;evt=w.event;}if(!evt){return (evt);}if(!evt.target){evt.target=evt.srcElement;evt.currentTarget=(_3b4||evt.srcElement);if(evt.type=="mouseover"){evt.relatedTarget=evt.fromElement;}if(evt.type=="mouseout"){evt.relatedTarget=evt.toElement;}if(!evt.stopPropagation){evt.stopPropagation=_3b5;evt.preventDefault=_3b6;}switch(evt.type){case "keypress":var c=("charCode" in evt?evt.charCode:evt.keyCode);if(c==10){c=0;evt.keyCode=13;}else{if(c==13||c==27){c=0;}else{if(c==3){c=99;}}}evt.charCode=c;_3b7(evt);break;}}return evt;};var _3b8=function(_3b9){this.handle=_3b9;};_3b8.prototype.remove=function(){delete _dojoIEListeners_[this.handle];};var _3ba=function(_3bb){return function(evt){evt=on._fixEvent(evt,this);return _3bb.call(this,evt);};};var _39e=function(_3bc,type,_3bd){_3bd=_3ba(_3bd);if(((_3bc.ownerDocument?_3bc.ownerDocument.parentWindow:_3bc.parentWindow||_3bc.window||window)!=top||has("jscript")<5.8)&&!has("config-_allow_leaks")){if(typeof _dojoIEListeners_=="undefined"){_dojoIEListeners_=[];}var _3be=_3bc[type];if(!_3be||!_3be.listeners){var _3bf=_3be;_3bc[type]=_3be=Function("event","var callee = arguments.callee; for(var i = 0; i<callee.listeners.length; i++){var listener = _dojoIEListeners_[callee.listeners[i]]; if(listener){listener.call(this,event);}}");_3be.listeners=[];_3be.global=this;if(_3bf){_3be.listeners.push(_dojoIEListeners_.push(_3bf)-1);}}var _3c0;_3be.listeners.push(_3c0=(_3be.global._dojoIEListeners_.push(_3bd)-1));return new _3b8(_3c0);}return _37e.after(_3bc,type,_3bd,true);};var _3b7=function(evt){evt.keyChar=evt.charCode?String.fromCharCode(evt.charCode):"";evt.charOrCode=evt.keyChar||evt.keyCode;};var _3b5=function(){this.cancelBubble=true;};var _3b6=on._preventDefault=function(){this.bubbledKeyCode=this.keyCode;if(this.ctrlKey){try{this.keyCode=0;}catch(e){}}this.returnValue=false;};}if(has("touch")){var _3c1=function(){};var _3c2=window.orientation;var _39b=function(_3c3){return function(_3c4){var _3c5=_3c4.corrected;if(!_3c5){var type=_3c4.type;try{delete _3c4.type;}catch(e){}if(_3c4.type){_3c1.prototype=_3c4;var _3c5=new _3c1;_3c5.preventDefault=function(){_3c4.preventDefault();};_3c5.stopPropagation=function(){_3c4.stopPropagation();};}else{_3c5=_3c4;_3c5.type=type;}_3c4.corrected=_3c5;if(type=="resize"){if(_3c2==window.orientation){return null;}_3c2=window.orientation;_3c5.type="orientationchange";return _3c3.call(this,_3c5);}if(!("rotation" in _3c5)){_3c5.rotation=0;_3c5.scale=1;}var _3c6=_3c5.changedTouches[0];for(var i in _3c6){delete _3c5[i];_3c5[i]=_3c6[i];}}return _3c3.call(this,_3c5);};};}return on;});},"dojo/_base/sniff":function(){define(["./kernel","../has"],function(dojo,has){if(!1){return has;}dojo.isBrowser=true,dojo._name="browser";var _3c7=has.add,n=navigator,dua=n.userAgent,dav=n.appVersion,tv=parseFloat(dav),_3c8,_3c9,_3ca,_3cb,_3cc,_3cd,_3ce,_3cf,_3d0,isIE,isFF,_3d1,_3d2,_3d3,_3d4;if(dua.indexOf("AdobeAIR")>=0){_3c9=1;}_3ca=(dav.indexOf("Konqueror")>=0)?tv:0;_3cb=parseFloat(dua.split("WebKit/")[1])||undefined;_3cc=parseFloat(dua.split("Chrome/")[1])||undefined;_3cd=dav.indexOf("Macintosh")>=0;_3d2=/iPhone|iPod|iPad/.test(dua);_3d3=parseFloat(dua.split("Android ")[1])||undefined;_3d4=typeof opera!="undefined"&&opera.wiiremote;var _3d5=Math.max(dav.indexOf("WebKit"),dav.indexOf("Safari"),0);if(_3d5&&!_3cc){_3ce=parseFloat(dav.split("Version/")[1]);if(!_3ce||parseFloat(dav.substr(_3d5+7))<=419.3){_3ce=2;}}if(!has("dojo-webkit")){if(dua.indexOf("Opera")>=0){_3c8=tv;if(_3c8>=9.8){_3c8=parseFloat(dua.split("Version/")[1])||tv;}}if(dua.indexOf("Gecko")>=0&&!_3ca&&!_3cb){_3cf=_3d0=tv;}if(_3d0){isFF=parseFloat(dua.split("Firefox/")[1]||dua.split("Minefield/")[1])||undefined;}if(document.all&&!_3c8){isIE=parseFloat(dav.split("MSIE ")[1])||undefined;var mode=document.documentMode;if(mode&&mode!=5&&Math.floor(isIE)!=mode){isIE=mode;}}}_3d1=document.compatMode=="BackCompat";_3c7("opera",dojo.isOpera=_3c8);_3c7("air",dojo.isAIR=_3c9);_3c7("khtml",dojo.isKhtml=_3ca);_3c7("webkit",dojo.isWebKit=_3cb);_3c7("chrome",dojo.isChrome=_3cc);_3c7("mac",dojo.isMac=_3cd);_3c7("safari",dojo.isSafari=_3ce);_3c7("mozilla",dojo.isMozilla=dojo.isMoz=_3cf);_3c7("ie",dojo.isIE=isIE);_3c7("ff",dojo.isFF=isFF);_3c7("quirks",dojo.isQuirks=_3d1);_3c7("ios",dojo.isIos=_3d2);_3c7("android",dojo.isAndroid=_3d3);dojo.locale=dojo.locale||(isIE?n.userLanguage:n.language).toLowerCase();return has;});},"dojo/_base/array":function(){define("dojo/_base/array",["./kernel","../has","./lang"],function(dojo,has,lang){var _3d6={},u,_3d7;function _3d8(){_3d6={};};function _3d9(fn){return _3d6[fn]=new Function("item","index","array",fn);};function _3da(some){var _3db=!some;return function(a,fn,o){var i=0,l=a&&a.length||0,_3dc;if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_3d6[fn]||_3d9(fn);}if(o){for(;i<l;++i){_3dc=!fn.call(o,a[i],i,a);if(some^_3dc){return !_3dc;}}}else{for(;i<l;++i){_3dc=!fn(a[i],i,a);if(some^_3dc){return !_3dc;}}}return _3db;};};function _3dd(up){var _3de=1,_3df=0,_3e0=0;if(!up){_3de=_3df=_3e0=-1;}return function(a,x,from,last){if(last&&_3de>0){return _3d7.lastIndexOf(a,x,from);}var l=a&&a.length||0,end=up?l+_3e0:_3df,i;if(from===u){i=up?_3df:l+_3e0;}else{if(from<0){i=l+from;if(i<0){i=_3df;}}else{i=from>=l?l+_3e0:from;}}if(l&&typeof a=="string"){a=a.split("");}for(;i!=end;i+=_3de){if(a[i]==x){return i;}}return -1;};};function _3e1(a,fn,o){var i=0,l=a&&a.length||0;if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_3d6[fn]||_3d9(fn);}if(o){for(;i<l;++i){fn.call(o,a[i],i,a);}}else{for(;i<l;++i){fn(a[i],i,a);}}};function map(a,fn,o,Ctr){var i=0,l=a&&a.length||0,out=new (Ctr||Array)(l);if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_3d6[fn]||_3d9(fn);}if(o){for(;i<l;++i){out[i]=fn.call(o,a[i],i,a);}}else{for(;i<l;++i){out[i]=fn(a[i],i,a);}}return out;};function _3e2(a,fn,o){var i=0,l=a&&a.length||0,out=[],_3e3;if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_3d6[fn]||_3d9(fn);}if(o){for(;i<l;++i){_3e3=a[i];if(fn.call(o,_3e3,i,a)){out.push(_3e3);}}}else{for(;i<l;++i){_3e3=a[i];if(fn(_3e3,i,a)){out.push(_3e3);}}}return out;};_3d7={every:_3da(false),some:_3da(true),indexOf:_3dd(true),lastIndexOf:_3dd(false),forEach:_3e1,map:map,filter:_3e2,clearCache:_3d8};1&&lang.mixin(dojo,_3d7);return _3d7;});},"dojo/_base/json":function(){define(["./kernel","../json"],function(dojo,json){dojo.fromJson=function(js){return eval("("+js+")");};dojo._escapeString=json.stringify;dojo.toJsonIndentStr="\t";dojo.toJson=function(it,_3e4){return json.stringify(it,function(key,_3e5){if(_3e5){var tf=_3e5.__json__||_3e5.json;if(typeof tf=="function"){return tf.call(_3e5);}}return _3e5;},_3e4&&dojo.toJsonIndentStr);};return dojo;});},"dojo/dom-class":function(){define(["./_base/lang","./_base/array","./dom"],function(lang,_3e6,dom){var _3e7="className";var cls,_3e8=/\s+/,a1=[""];function _3e9(s){if(typeof s=="string"||s instanceof String){if(s&&!_3e8.test(s)){a1[0]=s;return a1;}var a=s.split(_3e8);if(a.length&&!a[0]){a.shift();}if(a.length&&!a[a.length-1]){a.pop();}return a;}if(!s){return [];}return _3e6.filter(s,function(x){return x;});};var _3ea={};cls={contains:function containsClass(node,_3eb){return ((" "+dom.byId(node)[_3e7]+" ").indexOf(" "+_3eb+" ")>=0);},add:function addClass(node,_3ec){node=dom.byId(node);_3ec=_3e9(_3ec);var cls=node[_3e7],_3ed;cls=cls?" "+cls+" ":" ";_3ed=cls.length;for(var i=0,len=_3ec.length,c;i<len;++i){c=_3ec[i];if(c&&cls.indexOf(" "+c+" ")<0){cls+=c+" ";}}if(_3ed<cls.length){node[_3e7]=cls.substr(1,cls.length-2);}},remove:function removeClass(node,_3ee){node=dom.byId(node);var cls;if(_3ee!==undefined){_3ee=_3e9(_3ee);cls=" "+node[_3e7]+" ";for(var i=0,len=_3ee.length;i<len;++i){cls=cls.replace(" "+_3ee[i]+" "," ");}cls=lang.trim(cls);}else{cls="";}if(node[_3e7]!=cls){node[_3e7]=cls;}},replace:function replaceClass(node,_3ef,_3f0){node=dom.byId(node);_3ea[_3e7]=node[_3e7];cls.remove(_3ea,_3f0);cls.add(_3ea,_3ef);if(node[_3e7]!==_3ea[_3e7]){node[_3e7]=_3ea[_3e7];}},toggle:function toggleClass(node,_3f1,_3f2){node=dom.byId(node);if(_3f2===undefined){_3f1=_3e9(_3f1);for(var i=0,len=_3f1.length,c;i<len;++i){c=_3f1[i];cls[cls.contains(node,c)?"remove":"add"](node,c);}}else{cls[_3f2?"add":"remove"](node,_3f1);}return _3f2;}};return cls;});},"dojo/_base/window":function(){define(["./kernel","../has","./sniff"],function(dojo,has){dojo.doc=this["document"]||null;dojo.body=function(){return dojo.doc.body||dojo.doc.getElementsByTagName("body")[0];};dojo.setContext=function(_3f3,_3f4){dojo.global=ret.global=_3f3;dojo.doc=ret.doc=_3f4;};dojo.withGlobal=function(_3f5,_3f6,_3f7,_3f8){var _3f9=dojo.global;try{dojo.global=ret.global=_3f5;return dojo.withDoc.call(null,_3f5.document,_3f6,_3f7,_3f8);}finally{dojo.global=ret.global=_3f9;}};dojo.withDoc=function(_3fa,_3fb,_3fc,_3fd){var _3fe=dojo.doc,oldQ=dojo.isQuirks,_3ff=dojo.isIE,isIE,mode,pwin;try{dojo.doc=ret.doc=_3fa;dojo.isQuirks=has.add("quirks",dojo.doc.compatMode=="BackCompat",true,true);if(has("ie")){if((pwin=_3fa.parentWindow)&&pwin.navigator){isIE=parseFloat(pwin.navigator.appVersion.split("MSIE ")[1])||undefined;mode=_3fa.documentMode;if(mode&&mode!=5&&Math.floor(isIE)!=mode){isIE=mode;}dojo.isIE=has.add("ie",isIE,true,true);}}if(_3fc&&typeof _3fb=="string"){_3fb=_3fc[_3fb];}return _3fb.apply(_3fc,_3fd||[]);}finally{dojo.doc=ret.doc=_3fe;dojo.isQuirks=has.add("quirks",oldQ,true,true);dojo.isIE=has.add("ie",_3ff,true,true);}};var ret={global:dojo.global,doc:dojo.doc,body:dojo.body,setContext:dojo.setContext,withGlobal:dojo.withGlobal,withDoc:dojo.withDoc};return ret;});},"dojo/_base/config":function(){define(["../has","require"],function(has,_400){var _401={};if(1){var src=_400.rawConfig,p;for(p in src){_401[p]=src[p];}}else{var _402=function(_403,_404,_405){for(p in _403){p!="has"&&has.add(_404+p,_403[p],0,_405);}};_401=1?_400.rawConfig:this.dojoConfig||this.djConfig||{};_402(_401,"config",1);_402(_401.has,"",1);}return _401;});},"dojo/_base/event":function(){define(["./kernel","../on","../has","../dom-geometry"],function(dojo,on,has,dom){if(on._fixEvent){var _406=on._fixEvent;on._fixEvent=function(evt,se){evt=_406(evt,se);if(evt){dom.normalizeEvent(evt);}return evt;};}dojo.fixEvent=function(evt,_407){if(on._fixEvent){return on._fixEvent(evt,_407);}return evt;};dojo.stopEvent=function(evt){if(has("dom-addeventlistener")||(evt&&evt.preventDefault)){evt.preventDefault();evt.stopPropagation();}else{evt=evt||window.event;evt.cancelBubble=true;on._preventDefault.call(evt);}};return {fix:dojo.fixEvent,stop:dojo.stopEvent};});},"dojo/main":function(){define(["./_base/kernel","./has","require","./_base/sniff","./_base/lang","./_base/array","./ready","./_base/declare","./_base/connect","./_base/Deferred","./_base/json","./_base/Color","./has!dojo-firebug?./_firebug/firebug","./_base/browser","./_base/loader"],function(dojo,has,_408,_409,lang,_40a,_40b){if(dojo.config.isDebug){_408(["./_firebug/firebug"]);}true||has.add("dojo-config-require",1);if(1){var deps=dojo.config.require;if(deps){deps=_40a.map(lang.isArray(deps)?deps:[deps],function(item){return item.replace(/\./g,"/");});if(dojo.isAsync){_408(deps);}else{_40b(1,function(){_408(deps);});}}}return dojo;});},"dojo/ready":function(){define(["./_base/kernel","./has","require","./domReady","./_base/lang"],function(dojo,has,_40c,_40d,lang){var _40e=0,_40f,_410=[],_411=0,_412=function(){_40e=1;dojo._postLoad=dojo.config.afterOnLoad=true;if(_410.length){_40f(_413);}},_413=function(){if(_40e&&!_411&&_410.length){_411=1;var f=_410.shift();try{f();}finally{_411=0;}_411=0;if(_410.length){_40f(_413);}}};if(1){_40c.on("idle",_413);_40f=function(){if(_40c.idle()){_413();}};}else{_40f=function(){_40c.ready(_413);};}var _414=dojo.ready=dojo.addOnLoad=function(_415,_416,_417){var _418=lang._toArray(arguments);if(typeof _415!="number"){_417=_416;_416=_415;_415=1000;}else{_418.shift();}_417=_417?lang.hitch.apply(dojo,_418):function(){_416();};_417.priority=_415;for(var i=0;i<_410.length&&_415>=_410[i].priority;i++){}_410.splice(i,0,_417);_40f();};true||has.add("dojo-config-addOnLoad",1);if(1){var dca=dojo.config.addOnLoad;if(dca){_414[(lang.isArray(dca)?"apply":"call")](dojo,dca);}}if(1&&dojo.config.parseOnLoad&&!dojo.isAsync){_414(99,function(){if(!dojo.parser){dojo.deprecated("Add explicit require(['dojo/parser']);","","2.0");_40c(["dojo/parser"]);}});}if(1){_40d(_412);}else{_412();}return _414;});},"dojo/aspect":function(){define([],function(){"use strict";var _419=0;function _41a(_41b,type,_41c,_41d){var _41e=_41b[type];var _41f=type=="around";var _420;if(_41f){var _421=_41c(function(){return _41e.advice(this,arguments);});_420={remove:function(){_420.cancelled=true;},advice:function(_422,args){return _420.cancelled?_41e.advice(_422,args):_421.apply(_422,args);}};}else{_420={remove:function(){var _423=_420.previous;var next=_420.next;if(!next&&!_423){delete _41b[type];}else{if(_423){_423.next=next;}else{_41b[type]=next;}if(next){next.previous=_423;}}},id:_419++,advice:_41c,receiveArguments:_41d};}if(_41e&&!_41f){if(type=="after"){var next=_41e;while(next){_41e=next;next=next.next;}_41e.next=_420;_420.previous=_41e;}else{if(type=="before"){_41b[type]=_420;_420.next=_41e;_41e.previous=_420;}}}else{_41b[type]=_420;}return _420;};function _424(type){return function(_425,_426,_427,_428){var _429=_425[_426],_42a;if(!_429||_429.target!=_425){_425[_426]=_42a=function(){var _42b=_419;var args=arguments;var _42c=_42a.before;while(_42c){args=_42c.advice.apply(this,args)||args;_42c=_42c.next;}if(_42a.around){var _42d=_42a.around.advice(this,args);}var _42e=_42a.after;while(_42e&&_42e.id<_42b){_42d=_42e.receiveArguments?_42e.advice.apply(this,args)||_42d:_42e.advice.call(this,_42d);_42e=_42e.next;}return _42d;};if(_429){_42a.around={advice:function(_42f,args){return _429.apply(_42f,args);}};}_42a.target=_425;}var _430=_41a((_42a||_429),type,_427,_428);_427=null;return _430;};};return {before:_424("before"),around:_424("around"),after:_424("after")};});},"dojo/_base/connect":function(){define(["./kernel","../on","../topic","../aspect","./event","../mouse","./sniff","./lang","../keys"],function(_431,on,hub,_432,_433,_434,has,lang){has.add("events-keypress-typed",function(){var _435={charCode:0};try{_435=document.createEvent("KeyboardEvent");(_435.initKeyboardEvent||_435.initKeyEvent).call(_435,"keypress",true,true,null,false,false,false,false,9,3);}catch(e){}return _435.charCode==0&&!has("opera");});function _436(obj,_437,_438,_439,_43a){_439=lang.hitch(_438,_439);if(!obj||!(obj.addEventListener||obj.attachEvent)){return _432.after(obj||_431.global,_437,_439,true);}if(typeof _437=="string"&&_437.substring(0,2)=="on"){_437=_437.substring(2);}if(!obj){obj=_431.global;}if(!_43a){switch(_437){case "keypress":_437=_43b;break;case "mouseenter":_437=_434.enter;break;case "mouseleave":_437=_434.leave;break;}}return on(obj,_437,_439,_43a);};var _43c={106:42,111:47,186:59,187:43,188:44,189:45,190:46,191:47,192:96,219:91,220:92,221:93,222:39,229:113};var _43d=has("mac")?"metaKey":"ctrlKey";var _43e=function(evt,_43f){var faux=lang.mixin({},evt,_43f);_440(faux);faux.preventDefault=function(){evt.preventDefault();};faux.stopPropagation=function(){evt.stopPropagation();};return faux;};function _440(evt){evt.keyChar=evt.charCode?String.fromCharCode(evt.charCode):"";evt.charOrCode=evt.keyChar||evt.keyCode;};var _43b;if(has("events-keypress-typed")){var _441=function(e,code){try{return (e.keyCode=code);}catch(e){return 0;}};_43b=function(_442,_443){var _444=on(_442,"keydown",function(evt){var k=evt.keyCode;var _445=(k!=13||(has("ie")>=9&&!has("quirks")))&&k!=32&&(k!=27||!has("ie"))&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222)&&k!=229;if(_445||evt.ctrlKey){var c=_445?0:k;if(evt.ctrlKey){if(k==3||k==13){return _443.call(evt.currentTarget,evt);}else{if(c>95&&c<106){c-=48;}else{if((!evt.shiftKey)&&(c>=65&&c<=90)){c+=32;}else{c=_43c[c]||c;}}}}var faux=_43e(evt,{type:"keypress",faux:true,charCode:c});_443.call(evt.currentTarget,faux);if(has("ie")){_441(evt,faux.keyCode);}}});var _446=on(_442,"keypress",function(evt){var c=evt.charCode;c=c>=32?c:0;evt=_43e(evt,{charCode:c,faux:true});return _443.call(this,evt);});return {remove:function(){_444.remove();_446.remove();}};};}else{if(has("opera")){_43b=function(_447,_448){return on(_447,"keypress",function(evt){var c=evt.which;if(c==3){c=99;}c=c<32&&!evt.shiftKey?0:c;if(evt.ctrlKey&&!evt.shiftKey&&c>=65&&c<=90){c+=32;}return _448.call(this,_43e(evt,{charCode:c}));});};}else{_43b=function(_449,_44a){return on(_449,"keypress",function(evt){_440(evt);return _44a.call(this,evt);});};}}var _44b={_keypress:_43b,connect:function(obj,_44c,_44d,_44e,_44f){var a=arguments,args=[],i=0;args.push(typeof a[0]=="string"?null:a[i++],a[i++]);var a1=a[i+1];args.push(typeof a1=="string"||typeof a1=="function"?a[i++]:null,a[i++]);for(var l=a.length;i<l;i++){args.push(a[i]);}return _436.apply(this,args);},disconnect:function(_450){if(_450){_450.remove();}},subscribe:function(_451,_452,_453){return hub.subscribe(_451,lang.hitch(_452,_453));},publish:function(_454,args){return hub.publish.apply(hub,[_454].concat(args));},connectPublisher:function(_455,obj,_456){var pf=function(){_44b.publish(_455,arguments);};return _456?_44b.connect(obj,_456,pf):_44b.connect(obj,pf);},isCopyKey:function(e){return e[_43d];}};_44b.unsubscribe=_44b.disconnect;1&&lang.mixin(_431,_44b);return _44b;});}}});(function(){var _457=this.require;_457({cache:{}});!_457.async&&_457(["dojo"]);_457.boot&&_457.apply(null,_457.boot);})(); \ No newline at end of file
diff --git a/lib/dojo/dojo.js.uncompressed.js b/lib/dojo/dojo.js.uncompressed.js
index af7051aaf..69b3d2e5e 100644
--- a/lib/dojo/dojo.js.uncompressed.js
+++ b/lib/dojo/dojo.js.uncompressed.js
@@ -11,2479 +11,6071 @@
http://dojotoolkit.org
*/
-;(function(){
+(function(
+ userConfig,
+ defaultConfig
+){
+ // summary:
+ // This is the "source loader" and is the entry point for Dojo during development. You may also load Dojo with
+ // any AMD-compliant loader via the package main module dojo/main.
+ // description:
+ // This is the "source loader" for Dojo. It provides an AMD-compliant loader that can be configured
+ // to operate in either synchronous or asynchronous modes. After the loader is defined, dojo is loaded
+ // IAW the package main module dojo/main. In the event you wish to use a foreign loader, you may load dojo as a package
+ // via the package main module dojo/main and this loader is not required; see dojo/package.json for details.
+ //
+ // In order to keep compatibility with the v1.x line, this loader includes additional machinery that enables
+ // the dojo.provide, dojo.require et al API. This machinery is loaded by default, but may be dynamically removed
+ // via the has.js API and statically removed via the build system.
+ //
+ // This loader includes sniffing machinery to determine the environment; the following environments are supported:
+ //
+ // * browser
+ // * node.js
+ // * rhino
+ //
+ // This is the so-called "source loader". As such, it includes many optional features that may be discadred by
+ // building a customized verion with the build system.
- /*
- dojo, dijit, and dojox must always be the first three, and in that order.
- djConfig.scopeMap = [
- ["dojo", "fojo"],
- ["dijit", "fijit"],
- ["dojox", "fojox"]
-
- ]
- */
+ // Design and Implementation Notes
+ //
+ // This is a dojo-specific adaption of bdLoad, donated to the dojo foundation by Altoviso LLC.
+ //
+ // This function defines an AMD-compliant (http://wiki.commonjs.org/wiki/Modules/AsynchronousDefinition)
+ // loader that can be configured to operate in either synchronous or asynchronous modes.
+ //
+ // Since this machinery implements a loader, it does not have the luxury of using a load system and/or
+ // leveraging a utility library. This results in an unpleasantly long file; here is a road map of the contents:
+ //
+ // 1. Small library for use implementing the loader.
+ // 2. Define the has.js API; this is used throughout the loader to bracket features.
+ // 3. Define the node.js and rhino sniffs and sniff.
+ // 4. Define the loader's data.
+ // 5. Define the configuration machinery.
+ // 6. Define the script element sniffing machinery and sniff for configuration data.
+ // 7. Configure the loader IAW the provided user, default, and sniffing data.
+ // 8. Define the global require function.
+ // 9. Define the module resolution machinery.
+ // 10. Define the module and plugin module definition machinery
+ // 11. Define the script injection machinery.
+ // 12. Define the window load detection.
+ // 13. Define the logging API.
+ // 14. Define the tracing API.
+ // 16. Define the AMD define function.
+ // 17. Define the dojo v1.x provide/require machinery--so called "legacy" modes.
+ // 18. Publish global variables.
+ //
+ // Language and Acronyms and Idioms
+ //
+ // moduleId: a CJS module identifier, (used for public APIs)
+ // mid: moduleId (used internally)
+ // packageId: a package identifier (used for public APIs)
+ // pid: packageId (used internally); the implied system or default package has pid===""
+ // pack: package is used internally to reference a package object (since javascript has reserved words including "package")
+ // prid: plugin resource identifier
+ // The integer constant 1 is used in place of true and 0 in place of false.
+
+ // define a minimal library to help build the loader
+ var noop = function(){
+ },
+
+ isEmpty = function(it){
+ for(var p in it){
+ return 0;
+ }
+ return 1;
+ },
- /**Build will replace this comment with a scoped djConfig **/
+ toString = {}.toString,
- //The null below can be relaced by a build-time value used instead of djConfig.scopeMap.
- var sMap = null;
+ isFunction = function(it){
+ return toString.call(it) == "[object Function]";
+ },
- //See if new scopes need to be defined.
- if((sMap || (typeof djConfig != "undefined" && djConfig.scopeMap)) && (typeof window != "undefined")){
- var scopeDef = "", scopePrefix = "", scopeSuffix = "", scopeMap = {}, scopeMapRev = {};
- sMap = sMap || djConfig.scopeMap;
- for(var i = 0; i < sMap.length; i++){
- //Make local variables, then global variables that use the locals.
- var newScope = sMap[i];
- scopeDef += "var " + newScope[0] + " = {}; " + newScope[1] + " = " + newScope[0] + ";" + newScope[1] + "._scopeName = '" + newScope[1] + "';";
- scopePrefix += (i == 0 ? "" : ",") + newScope[0];
- scopeSuffix += (i == 0 ? "" : ",") + newScope[1];
- scopeMap[newScope[0]] = newScope[1];
- scopeMapRev[newScope[1]] = newScope[0];
- }
+ isString = function(it){
+ return toString.call(it) == "[object String]";
+ },
+
+ isArray = function(it){
+ return toString.call(it) == "[object Array]";
+ },
+
+ forEach = function(vector, callback){
+ if(vector){
+ for(var i = 0; i < vector.length;){
+ callback(vector[i++]);
+ }
+ }
+ },
+
+ mix = function(dest, src){
+ for(var p in src){
+ dest[p] = src[p];
+ }
+ return dest;
+ },
+
+ makeError = function(error, info){
+ return mix(new Error(error), {src:"dojoLoader", info:info});
+ },
- eval(scopeDef + "dojo._scopeArgs = [" + scopeSuffix + "];");
+ uidSeed = 1,
- dojo._scopePrefixArgs = scopePrefix;
- dojo._scopePrefix = "(function(" + scopePrefix + "){";
- dojo._scopeSuffix = "})(" + scopeSuffix + ")";
- dojo._scopeMap = scopeMap;
- dojo._scopeMapRev = scopeMapRev;
+ uid = function(){
+ // Returns a unique indentifier (within the lifetime of the document) of the form /_d+/.
+ return "_" + uidSeed++;
+ },
+
+ // FIXME: how to doc window.require() api
+
+ // this will be the global require function; define it immediately so we can start hanging things off of it
+ req = function(
+ config, //(object, optional) hash of configuration properties
+ dependencies, //(array of commonjs.moduleId, optional) list of modules to be loaded before applying callback
+ callback //(function, optional) lamda expression to apply to module values implied by dependencies
+ ){
+ return contextRequire(config, dependencies, callback, 0, req);
+ },
+
+ // the loader uses the has.js API to control feature inclusion/exclusion; define then use throughout
+ global = this,
+
+ doc = global.document,
+
+ element = doc && doc.createElement("DiV"),
+
+ has = req.has = function(name){
+ return isFunction(hasCache[name]) ? (hasCache[name] = hasCache[name](global, doc, element)) : hasCache[name];
+ },
+
+ hasCache = has.cache = defaultConfig.hasCache;
+
+ has.add = function(name, test, now, force){
+ (hasCache[name]===undefined || force) && (hasCache[name] = test);
+ return now && has(name);
+ };
+
+ false && has.add("host-node", userConfig.has && "host-node" in userConfig.has ?
+ userConfig.has["host-node"] :
+ (typeof process == "object" && process.versions && process.versions.node && process.versions.v8));
+ if(0){
+ // fixup the default config for node.js environment
+ require("./_base/configNode.js").config(defaultConfig);
+ // remember node's require (with respect to baseUrl==dojo's root)
+ defaultConfig.loaderPatch.nodeRequire = require;
}
-/*=====
-// note:
-// 'djConfig' does not exist under 'dojo.*' so that it can be set before the
-// 'dojo' variable exists.
-// note:
-// Setting any of these variables *after* the library has loaded does
-// nothing at all.
+ false && has.add("host-rhino", userConfig.has && "host-rhino" in userConfig.has ?
+ userConfig.has["host-rhino"] :
+ (typeof load == "function" && (typeof Packages == "function" || typeof Packages == "object")));
+ if(0){
+ // owing to rhino's lame feature that hides the source of the script, give the user a way to specify the baseUrl...
+ for(var baseUrl = userConfig.baseUrl || ".", arg, rhinoArgs = this.arguments, i = 0; i < rhinoArgs.length;){
+ arg = (rhinoArgs[i++] + "").split("=");
+ if(arg[0] == "baseUrl"){
+ baseUrl = arg[1];
+ break;
+ }
+ }
+ load(baseUrl + "/_base/configRhino.js");
+ rhinoDojoConfig(defaultConfig, baseUrl, rhinoArgs);
+ }
+
+ // userConfig has tests override defaultConfig has tests; do this after the environment detection because
+ // the environment detection usually sets some has feature values in the hasCache.
+ for(var p in userConfig.has){
+ has.add(p, userConfig.has[p], 0, 1);
+ }
-djConfig = {
- // summary:
- // Application code can set the global 'djConfig' prior to loading
- // the library to override certain global settings for how dojo works.
//
- // isDebug: Boolean
- // Defaults to `false`. If set to `true`, ensures that Dojo provides
- // extended debugging feedback via Firebug. If Firebug is not available
- // on your platform, setting `isDebug` to `true` will force Dojo to
- // pull in (and display) the version of Firebug Lite which is
- // integrated into the Dojo distribution, thereby always providing a
- // debugging/logging console when `isDebug` is enabled. Note that
- // Firebug's `console.*` methods are ALWAYS defined by Dojo. If
- // `isDebug` is false and you are on a platform without Firebug, these
- // methods will be defined as no-ops.
- isDebug: false,
- // debugAtAllCosts: Boolean
- // Defaults to `false`. If set to `true`, this triggers an alternate
- // mode of the package system in which dependencies are detected and
- // only then are resources evaluated in dependency order via
- // `<script>` tag inclusion. This may double-request resources and
- // cause problems with scripts which expect `dojo.require()` to
- // preform synchronously. `debugAtAllCosts` can be an invaluable
- // debugging aid, but when using it, ensure that all code which
- // depends on Dojo modules is wrapped in `dojo.addOnLoad()` handlers.
- // Due to the somewhat unpredictable side-effects of using
- // `debugAtAllCosts`, it is strongly recommended that you enable this
- // flag as a last resort. `debugAtAllCosts` has no effect when loading
- // resources across domains. For usage information, see the
- // [Dojo Book](http://dojotoolkit.org/book/book-dojo/part-4-meta-dojo-making-your-dojo-code-run-faster-and-better/debugging-facilities/deb)
- debugAtAllCosts: false,
- // locale: String
- // The locale to assume for loading localized resources in this page,
- // specified according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).
- // Must be specified entirely in lowercase, e.g. `en-us` and `zh-cn`.
- // See the documentation for `dojo.i18n` and `dojo.requireLocalization`
- // for details on loading localized resources. If no locale is specified,
- // Dojo assumes the locale of the user agent, according to `navigator.userLanguage`
- // or `navigator.language` properties.
- locale: undefined,
- // extraLocale: Array
- // No default value. Specifies additional locales whose
- // resources should also be loaded alongside the default locale when
- // calls to `dojo.requireLocalization()` are processed.
- extraLocale: undefined,
- // baseUrl: String
- // The directory in which `dojo.js` is located. Under normal
- // conditions, Dojo auto-detects the correct location from which it
- // was loaded. You may need to manually configure `baseUrl` in cases
- // where you have renamed `dojo.js` or in which `<base>` tags confuse
- // some browsers (e.g. IE 6). The variable `dojo.baseUrl` is assigned
- // either the value of `djConfig.baseUrl` if one is provided or the
- // auto-detected root if not. Other modules are located relative to
- // this path. The path should end in a slash.
- baseUrl: undefined,
- // modulePaths: Object
- // A map of module names to paths relative to `dojo.baseUrl`. The
- // key/value pairs correspond directly to the arguments which
- // `dojo.registerModulePath` accepts. Specifiying
- // `djConfig.modulePaths = { "foo": "../../bar" }` is the equivalent
- // of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple
- // modules may be configured via `djConfig.modulePaths`.
- modulePaths: {},
- // afterOnLoad: Boolean
- // Indicates Dojo was added to the page after the page load. In this case
- // Dojo will not wait for the page DOMContentLoad/load events and fire
- // its dojo.addOnLoad callbacks after making sure all outstanding
- // dojo.required modules have loaded. Only works with a built dojo.js,
- // it does not work the dojo.js directly from source control.
- afterOnLoad: false,
- // addOnLoad: Function or Array
- // Adds a callback via dojo.addOnLoad. Useful when Dojo is added after
- // the page loads and djConfig.afterOnLoad is true. Supports the same
- // arguments as dojo.addOnLoad. When using a function reference, use
- // `djConfig.addOnLoad = function(){};`. For object with function name use
- // `djConfig.addOnLoad = [myObject, "functionName"];` and for object with
- // function reference use
- // `djConfig.addOnLoad = [myObject, function(){}];`
- addOnLoad: null,
- // require: Array
- // An array of module names to be loaded immediately after dojo.js has been included
- // in a page.
- require: [],
- // defaultDuration: Array
- // Default duration, in milliseconds, for wipe and fade animations within dijits.
- // Assigned to dijit.defaultDuration.
- defaultDuration: 200,
- // dojoBlankHtmlUrl: String
- // Used by some modules to configure an empty iframe. Used by dojo.io.iframe and
- // dojo.back, and dijit popup support in IE where an iframe is needed to make sure native
- // controls do not bleed through the popups. Normally this configuration variable
- // does not need to be set, except when using cross-domain/CDN Dojo builds.
- // Save dojo/resources/blank.html to your domain and set `djConfig.dojoBlankHtmlUrl`
- // to the path on your domain your copy of blank.html.
- dojoBlankHtmlUrl: undefined,
- // ioPublish: Boolean?
- // Set this to true to enable publishing of topics for the different phases of
- // IO operations. Publishing is done via dojo.publish. See dojo.__IoPublish for a list
- // of topics that are published.
- ioPublish: false,
- // useCustomLogger: Anything?
- // If set to a value that evaluates to true such as a string or array and
- // isDebug is true and Firebug is not available or running, then it bypasses
- // the creation of Firebug Lite allowing you to define your own console object.
- useCustomLogger: undefined,
- // transparentColor: Array
- // Array containing the r, g, b components used as transparent color in dojo.Color;
- // if undefined, [255,255,255] (white) will be used.
- transparentColor: undefined,
- // skipIeDomLoaded: Boolean
- // For IE only, skip the DOMContentLoaded hack used. Sometimes it can cause an Operation
- // Aborted error if the rest of the page triggers script defers before the DOM is ready.
- // If this is config value is set to true, then dojo.addOnLoad callbacks will not be
- // triggered until the page load event, which is after images and iframes load. If you
- // want to trigger the callbacks sooner, you can put a script block in the bottom of
- // your HTML that calls dojo._loadInit();. If you are using multiversion support, change
- // "dojo." to the appropriate scope name for dojo.
- skipIeDomLoaded: false
-}
-=====*/
+ // define the loader data
+ //
-(function(){
- // firebug stubs
+ // the loader will use these like symbols if the loader has the traceApi; otherwise
+ // define magic numbers so that modules can be provided as part of defaultConfig
+ var requested = 1,
+ arrived = 2,
+ nonmodule = 3,
+ executing = 4,
+ executed = 5;
+
+ if(0){
+ // these make debugging nice; but using strings for symbols is a gross rookie error; don't do it for production code
+ requested = "requested";
+ arrived = "arrived";
+ nonmodule = "not-a-module";
+ executing = "executing";
+ executed = "executed";
+ }
- if(typeof this["loadFirebugConsole"] == "function"){
- // for Firebug 1.2
- this["loadFirebugConsole"]();
- }else{
- this.console = this.console || {};
+ var legacyMode = 0,
+ sync = "sync",
+ xd = "xd",
+ syncExecStack = [],
+ dojoRequirePlugin = 0,
+ checkDojoRequirePlugin = noop,
+ transformToAmd = noop,
+ getXhr;
+ if(1){
+ req.isXdUrl = noop;
+
+ req.initSyncLoader = function(dojoRequirePlugin_, checkDojoRequirePlugin_, transformToAmd_){
+ if(!dojoRequirePlugin){
+ dojoRequirePlugin = dojoRequirePlugin_;
+ checkDojoRequirePlugin = checkDojoRequirePlugin_;
+ transformToAmd = transformToAmd_;
+ }
+ return {
+ sync:sync,
+ xd:xd,
+ arrived:arrived,
+ nonmodule:nonmodule,
+ executing:executing,
+ executed:executed,
+ syncExecStack:syncExecStack,
+ modules:modules,
+ execQ:execQ,
+ getModule:getModule,
+ injectModule:injectModule,
+ setArrived:setArrived,
+ signal:signal,
+ finishExec:finishExec,
+ execModule:execModule,
+ dojoRequirePlugin:dojoRequirePlugin,
+ getLegacyMode:function(){return legacyMode;},
+ holdIdle:function(){checkCompleteGuard++;},
+ releaseIdle:function(){checkIdle();}
+ };
+ };
- // Be careful to leave 'log' always at the end
- var cn = [
- "assert", "count", "debug", "dir", "dirxml", "error", "group",
- "groupEnd", "info", "profile", "profileEnd", "time", "timeEnd",
- "trace", "warn", "log"
- ];
- var i = 0, tn;
- while((tn=cn[i++])){
- if(!console[tn]){
- (function(){
- var tcn = tn+"";
- console[tcn] = ('log' in console) ? function(){
- var a = Array.apply({}, arguments);
- a.unshift(tcn+":");
- console["log"](a.join(" "));
- } : function(){}
- console[tcn]._fake = true;
- })();
+ if(1){
+ // in legacy sync mode, the loader needs a minimal XHR library to load dojo/_base/loader and dojo/_base/xhr
+
+ var locationProtocol = location.protocol,
+ locationHost = location.host,
+ fileProtocol = !locationHost;
+ req.isXdUrl = function(url){
+ if(fileProtocol || /^\./.test(url)){
+ // begins with a dot is always relative to page URL; therefore not xdomain
+ return false;
+ }
+ if(/^\/\//.test(url)){
+ // for v1.6- backcompat, url starting with // indicates xdomain
+ return true;
+ }
+ // get protocol and host
+ var match = url.match(/^([^\/\:]+\:)\/\/([^\/]+)/);
+ return match && (match[1] != locationProtocol || match[2] != locationHost);
+ };
+
+ // note: to get the file:// protocol to work in FF, you must set security.fileuri.strict_origin_policy to false in about:config
+ true || has.add("dojo-xhr-factory", 1);
+ has.add("dojo-force-activex-xhr", 1 && !doc.addEventListener && window.location.protocol == "file:");
+ has.add("native-xhr", typeof XMLHttpRequest != "undefined");
+ if(has("native-xhr") && !has("dojo-force-activex-xhr")){
+ getXhr = function(){
+ return new XMLHttpRequest();
+ };
+ }else{
+ // if in the browser an old IE; find an xhr
+ for(var XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'], progid, i = 0; i < 3;){
+ try{
+ progid = XMLHTTP_PROGIDS[i++];
+ if(new ActiveXObject(progid)){
+ // this progid works; therefore, use it from now on
+ break;
+ }
+ }catch(e){
+ // squelch; we're just trying to find a good ActiveX progid
+ // if they all fail, then progid ends up as the last attempt and that will signal the error
+ // the first time the client actually tries to exec an xhr
+ }
+ }
+ getXhr = function(){
+ return new ActiveXObject(progid);
+ };
}
+ req.getXhr = getXhr;
+
+ has.add("dojo-gettext-api", 1);
+ req.getText = function(url, async, onLoad){
+ var xhr = getXhr();
+ xhr.open('GET', fixupUrl(url), false);
+ xhr.send(null);
+ if(xhr.status == 200 || (!location.host && !xhr.status)){
+ if(onLoad){
+ onLoad(xhr.responseText, async);
+ }
+ }else{
+ throw makeError("xhrFailed", xhr.status);
+ }
+ return xhr.responseText;
+ };
}
+ }else{
+ req.async = 1;
}
- //TODOC: HOW TO DOC THIS?
- // dojo is the root variable of (almost all) our public symbols -- make sure it is defined.
- if(typeof dojo == "undefined"){
- dojo = {
- _scopeName: "dojo",
- _scopePrefix: "",
- _scopePrefixArgs: "",
- _scopeSuffix: "",
- _scopeMap: {},
- _scopeMapRev: {}
+ //
+ // loader eval
+ //
+ var eval_ =
+ // use the function constructor so our eval is scoped close to (but not in) in the global space with minimal pollution
+ new Function('return eval(arguments[0]);');
+
+ req.eval =
+ function(text, hint){
+ return eval_(text + "\r\n////@ sourceURL=" + hint);
};
- }
- var d = dojo;
+ //
+ // loader micro events API
+ //
+ var listenerQueues = {},
+ error = "error",
+ signal = req.signal = function(type, args){
+ var queue = listenerQueues[type];
+ // notice we run a copy of the queue; this allows listeners to add/remove
+ // other listeners without affecting this particular signal
+ forEach(queue && queue.slice(0), function(listener){
+ listener.apply(null, isArray(args) ? args : [args]);
+ });
+ },
+ on = req.on = function(type, listener){
+ // notice a queue is not created until a client actually connects
+ var queue = listenerQueues[type] || (listenerQueues[type] = []);
+ queue.push(listener);
+ return {
+ remove:function(){
+ for(var i = 0; i<queue.length; i++){
+ if(queue[i]===listener){
+ queue.splice(i, 1);
+ return;
+ }
+ }
+ }
+ };
+ };
- //Need placeholders for dijit and dojox for scoping code.
- if(typeof dijit == "undefined"){
- dijit = {_scopeName: "dijit"};
- }
- if(typeof dojox == "undefined"){
- dojox = {_scopeName: "dojox"};
+ // configuration machinery; with an optimized/built defaultConfig, all configuration machinery can be discarded
+ // lexical variables hold key loader data structures to help with minification; these may be completely,
+ // one-time initialized by defaultConfig for optimized/built versions
+ var
+ aliases
+ // a vector of pairs of [regexs or string, replacement] => (alias, actual)
+ = [],
+
+ paths
+ // CommonJS paths
+ = {},
+
+ pathsMapProg
+ // list of (from-path, to-path, regex, length) derived from paths;
+ // a "program" to apply paths; see computeMapProg
+ = [],
+
+ packs
+ // a map from packageId to package configuration object; see fixupPackageInfo
+ = {},
+
+ packageMap
+ // map from package name to local-installed package name
+ = {},
+
+ packageMapProg
+ // list of (from-package, to-package, regex, length) derived from packageMap;
+ // a "program" to apply paths; see computeMapProg
+ = [],
+
+ modules
+ // A hash:(mid) --> (module-object) the module namespace
+ //
+ // pid: the package identifier to which the module belongs (e.g., "dojo"); "" indicates the system or default package
+ // mid: the fully-resolved (i.e., mappings have been applied) module identifier without the package identifier (e.g., "dojo/io/script")
+ // url: the URL from which the module was retrieved
+ // pack: the package object of the package to which the module belongs
+ // executed: 0 => not executed; executing => in the process of tranversing deps and running factory; executed => factory has been executed
+ // deps: the dependency vector for this module (vector of modules objects)
+ // def: the factory for this module
+ // result: the result of the running the factory for this module
+ // injected: (requested | arrived | nonmodule) the status of the module; nonmodule means the resource did not call define
+ // load: plugin load function; applicable only for plugins
+ //
+ // Modules go through several phases in creation:
+ //
+ // 1. Requested: some other module's definition or a require application contained the requested module in
+ // its dependency vector or executing code explicitly demands a module via req.require.
+ //
+ // 2. Injected: a script element has been appended to the insert-point element demanding the resource implied by the URL
+ //
+ // 3. Loaded: the resource injected in [2] has been evalated.
+ //
+ // 4. Defined: the resource contained a define statement that advised the loader about the module. Notice that some
+ // resources may just contain a bundle of code and never formally define a module via define
+ //
+ // 5. Evaluated: the module was defined via define and the loader has evaluated the factory and computed a result.
+ = {},
+
+ cacheBust
+ // query string to append to module URLs to bust browser cache
+ = "",
+
+ cache
+ // hash:(mid)-->(function)
+ //
+ // Gives the contents of a cached resource; function should cause the same actions as if the given mid was downloaded
+ // and evaluated by the host environment
+ = {},
+
+ pendingCacheInsert
+ // hash:(mid)-->(function)
+ //
+ // Gives a set of cache modules pending entry into cache. When cached modules are published to the loader, they are
+ // entered into pendingCacheInsert; modules are then pressed into cache upon (1) AMD define or (2) upon receiving another
+ // independent set of cached modules. (1) is the usual case, and this case allows normalizing mids given in the pending
+ // cache for the local configuration, possibly relocating modules.
+ = {},
+
+ dojoSniffConfig
+ // map of configuration variables
+ // give the data-dojo-config as sniffed from the document (if any)
+ = {};
+
+ if(1){
+ var consumePendingCacheInsert = function(referenceModule){
+ var p, item, match, now;
+ for(p in pendingCacheInsert){
+ item = pendingCacheInsert[p];
+ match = p.match(/^url\:(.+)/);
+ if(match){
+ cache[toUrl(match[1], referenceModule)] = item;
+ }else if(p=="*now"){
+ now = item;
+ }else if(p!="*noref"){
+ cache[getModuleInfo(p, referenceModule).mid] = item;
+ }
+ }
+ if(now){
+ now(createRequire(referenceModule));
+ }
+ pendingCacheInsert = {};
+ },
+
+ computeMapProg = function(map, dest, packName){
+ // This routine takes a map target-prefix(string)-->replacement(string) into a vector
+ // of quads (target-prefix, replacement, regex-for-target-prefix, length-of-target-prefix)
+ //
+ // The loader contains processes that map one string prefix to another. These
+ // are encountered when applying the requirejs paths configuration and when mapping
+ // package names. We can make the mapping and any replacement easier and faster by
+ // replacing the map with a vector of quads and then using this structure in the simple machine runMapProg.
+ dest.splice(0, dest.length);
+ var p, i, item, reverseName = 0;
+ for(p in map){
+ dest.push([p, map[p]]);
+ if(map[p]==packName){
+ reverseName = p;
+ }
+ }
+ dest.sort(function(lhs, rhs){
+ return rhs[0].length - lhs[0].length;
+ });
+ for(i = 0; i < dest.length;){
+ item = dest[i++];
+ item[2] = new RegExp("^" + item[0].replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, function(c){ return "\\" + c; }) + "(\/|$)");
+ item[3] = item[0].length + 1;
+ }
+ return reverseName;
+ },
+
+ fixupPackageInfo = function(packageInfo, baseUrl){
+ // calculate the precise (name, baseUrl, main, mappings) for a package
+ var name = packageInfo.name;
+ if(!name){
+ // packageInfo must be a string that gives the name
+ name = packageInfo;
+ packageInfo = {name:name};
+ }
+ packageInfo = mix({main:"main", mapProg:[]}, packageInfo);
+ packageInfo.location = (baseUrl || "") + (packageInfo.location ? packageInfo.location : name);
+ packageInfo.reverseName = computeMapProg(packageInfo.packageMap, packageInfo.mapProg, name);
+
+ if(!packageInfo.main.indexOf("./")){
+ packageInfo.main = packageInfo.main.substring(2);
+ }
+
+ // allow paths to be specified in the package info
+ // TODO: this is not supported; remove
+ mix(paths, packageInfo.paths);
+
+ // now that we've got a fully-resolved package object, push it into the configuration
+ packs[name] = packageInfo;
+ packageMap[name] = name;
+ },
+
+ config = function(config, booting){
+ for(var p in config){
+ if(p=="waitSeconds"){
+ req.waitms = (config[p] || 0) * 1000;
+ }
+ if(p=="cacheBust"){
+ cacheBust = config[p] ? (isString(config[p]) ? config[p] : (new Date()).getTime() + "") : "";
+ }
+ if(p=="baseUrl" || p=="combo"){
+ req[p] = config[p];
+ }
+ if(1 && p=="async"){
+ // falsy or "sync" => legacy sync loader
+ // "xd" => sync but loading xdomain tree and therefore loading asynchronously (not configurable, set automatically by the loader)
+ // "legacyAsync" => permanently in "xd" by choice
+ // "debugAtAllCosts" => trying to load everything via script injection (not implemented)
+ // otherwise, must be truthy => AMD
+ // legacyMode: sync | legacyAsync | xd | false
+ var mode = config[p];
+ req.legacyMode = legacyMode = (isString(mode) && /sync|legacyAsync/.test(mode) ? mode : (!mode ? "sync" : false));
+ req.async = !legacyMode;
+ }
+ if(config[p]!==hasCache){
+ // accumulate raw config info for client apps which can use this to pass their own config
+ req.rawConfig[p] = config[p];
+ p!="has" && has.add("config-"+p, config[p], 0, booting);
+ }
+ }
+
+ // make sure baseUrl exists
+ if(!req.baseUrl){
+ req.baseUrl = "./";
+ }
+ // make sure baseUrl ends with a slash
+ if(!/\/$/.test(req.baseUrl)){
+ req.baseUrl += "/";
+ }
+
+ // now do the special work for has, packages, packagePaths, paths, aliases, and cache
+
+ for(p in config.has){
+ has.add(p, config.has[p], 0, booting);
+ }
+
+ // for each package found in any packages config item, augment the packs map owned by the loader
+ forEach(config.packages, fixupPackageInfo);
+
+ // for each packagePath found in any packagePaths config item, augment the packs map owned by the loader
+ for(baseUrl in config.packagePaths){
+ forEach(config.packagePaths[baseUrl], function(packageInfo){
+ fixupPackageInfo(packageInfo, baseUrl + "/");
+ });
+ }
+
+ // push in any paths and recompute the internal pathmap
+ // warning: this cann't be done until the package config is processed since packages may include path info
+ computeMapProg(mix(paths, config.paths), pathsMapProg);
+
+ // aliases
+ forEach(config.aliases, function(pair){
+ if(isString(pair[0])){
+ pair[0] = new RegExp("^" + pair[0].replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, function(c){return "\\" + c;}) + "$");
+ }
+ aliases.push(pair);
+ });
+
+ // mix any packageMap config item and recompute the internal packageMapProg
+ computeMapProg(mix(packageMap, config.packageMap), packageMapProg);
+
+ // push in any new cache values
+ if(config.cache){
+ consumePendingCacheInsert();
+ pendingCacheInsert = config.cache;
+ if(config.cache["*noref"]){
+ consumePendingCacheInsert();
+ }
+ }
+
+ signal("config", [config, req.rawConfig]);
+ };
+
+ //
+ // execute the various sniffs
+ //
+
+ if(has("dojo-cdn") || 1){
+ for(var dojoDir, src, match, scripts = doc.getElementsByTagName("script"), i = 0; i < scripts.length && !match; i++){
+ if((src = scripts[i].getAttribute("src")) && (match = src.match(/(.*)\/?dojo\.js(\W|$)/i))){
+ // if baseUrl wasn't explicitly set, set it here to the dojo directory; this is the 1.6- behavior
+ userConfig.baseUrl = dojoDir = userConfig.baseUrl || defaultConfig.baseUrl || match[1];
+
+ // see if there's a dojo configuration stuffed into the node
+ src = (scripts[i].getAttribute("data-dojo-config") || scripts[i].getAttribute("djConfig"));
+ if(src){
+ dojoSniffConfig = req.eval("({ " + src + " })", "data-dojo-config");
+ }
+ if(0){
+ var dataMain = scripts[i].getAttribute("data-main");
+ if(dataMain){
+ dojoSniffConfig.deps = dojoSniffConfig.deps || [dataMain];
+ }
+ }
+ }
+ }
+ }
+
+ if(0){
+ // pass down doh.testConfig from parent as if it were a data-dojo-config
+ try{
+ if(window.parent != window && window.parent.require){
+ var doh = window.parent.require("doh");
+ doh && mix(dojoSniffConfig, doh.testConfig);
+ }
+ }catch(e){}
+ }
+
+ // configure the loader; let the user override defaults
+ req.rawConfig = {};
+ config(defaultConfig, 1);
+ config(userConfig, 1);
+ config(dojoSniffConfig, 1);
+
+ if(has("dojo-cdn")){
+ packs.dojo.location = dojoDir;
+ packs.dijit.location = dojoDir + "../dijit/";
+ packs.dojox.location = dojoDir + "../dojox/";
+ }
+
+ }else{
+ // no config API, assume defaultConfig has everything the loader needs...for the entire lifetime of the application
+ paths = defaultConfig.paths;
+ pathsMapProg = defaultConfig.pathsMapProg;
+ packs = defaultConfig.packs;
+ aliases = defaultConfig.aliases;
+ packageMap = defaultConfig.packageMap;
+ packageMapProg = defaultConfig.packageMapProg;
+ modules = defaultConfig.modules;
+ cache = defaultConfig.cache;
+ cacheBust = defaultConfig.cacheBust;
+
+ // remember the default config for other processes (e.g., dojo/config)
+ req.rawConfig = defaultConfig;
}
- if(!d._scopeArgs){
- d._scopeArgs = [dojo, dijit, dojox];
+
+ if(0){
+ req.combo = req.combo || {add:noop};
+ var comboPending = 0,
+ combosPending = [],
+ comboPendingTimer = null;
}
-/*=====
-dojo.global = {
- // summary:
- // Alias for the global scope
- // (e.g. the window object in a browser).
- // description:
- // Refer to 'dojo.global' rather than referring to window to ensure your
- // code runs correctly in contexts other than web browsers (e.g. Rhino on a server).
-}
-=====*/
- d.global = this;
- d.config =/*===== djConfig = =====*/{
- isDebug: false,
- debugAtAllCosts: false
- };
+ // build the loader machinery iaw configuration, including has feature tests
+ var injectDependencies = function(module){
+ // checkComplete!=0 holds the idle signal; we're not idle if we're injecting dependencies
+ checkCompleteGuard++;
+ forEach(module.deps, injectModule);
+ if(0 && comboPending && !comboPendingTimer){
+ comboPendingTimer = setTimeout(function() {
+ comboPending = 0;
+ comboPendingTimer = null;
+ req.combo.done(function(mids, url) {
+ var onLoadCallback= function(){
+ // defQ is a vector of module definitions 1-to-1, onto mids
+ runDefQ(0, mids);
+ checkComplete();
+ };
+ combosPending.push(mids);
+ injectingModule = mids;
+ req.injectUrl(url, onLoadCallback, mids);
+ injectingModule = 0;
+ }, req);
+ }, 0);
+ }
+ checkIdle();
+ },
- // FIXME: 2.0, drop djConfig support. Use dojoConfig exclusively for global config.
- var cfg = typeof djConfig != "undefined" ? djConfig :
- typeof dojoConfig != "undefined" ? dojoConfig : null;
-
- if(cfg){
- for(var c in cfg){
- d.config[c] = cfg[c];
+ contextRequire = function(a1, a2, a3, referenceModule, contextRequire){
+ var module, syntheticMid;
+ if(isString(a1)){
+ // signature is (moduleId)
+ module = getModule(a1, referenceModule, true);
+ if(module && module.executed){
+ return module.result;
+ }
+ throw makeError("undefinedModule", a1);
+ }
+ if(!isArray(a1)){
+ // a1 is a configuration
+ config(a1);
+
+ // juggle args; (a2, a3) may be (dependencies, callback)
+ a1 = a2;
+ a2 = a3;
+ }
+ if(isArray(a1)){
+ // signature is (requestList [,callback])
+ if(!a1.length){
+ a2 && a2();
+ }else{
+ syntheticMid = "require*" + uid();
+
+ // resolve the request list with respect to the reference module
+ for(var mid, deps = [], i = 0; i < a1.length;){
+ mid = a1[i++];
+ if(mid in {exports:1, module:1}){
+ throw makeError("illegalModuleId", mid);
+ }
+ deps.push(getModule(mid, referenceModule));
+ }
+
+ // construct a synthetic module to control execution of the requestList, and, optionally, callback
+ module = mix(makeModuleInfo("", syntheticMid, 0, ""), {
+ injected: arrived,
+ deps: deps,
+ def: a2 || noop,
+ require: referenceModule ? referenceModule.require : req
+ });
+ modules[module.mid] = module;
+
+ // checkComplete!=0 holds the idle signal; we're not idle if we're injecting dependencies
+ injectDependencies(module);
+
+ // try to immediately execute
+ // if already traversing a factory tree, then strict causes circular dependency to abort the execution; maybe
+ // it's possible to execute this require later after the current traversal completes and avoid the circular dependency.
+ // ...but *always* insist on immediate in synch mode
+ var strict = checkCompleteGuard && req.async;
+ checkCompleteGuard++;
+ execModule(module, strict);
+ checkIdle();
+ if(!module.executed){
+ // some deps weren't on board or circular dependency detected and strict; therefore, push into the execQ
+ execQ.push(module);
+ }
+ checkComplete();
+ }
+ }
+ return contextRequire;
+ },
+
+ createRequire = function(module){
+ if(!module){
+ return req;
+ }
+ var result = module.require;
+ if(!result){
+ result = function(a1, a2, a3){
+ return contextRequire(a1, a2, a3, module, result);
+ };
+ module.require = mix(result, req);
+ result.module = module;
+ result.toUrl = function(name){
+ return toUrl(name, module);
+ };
+ result.toAbsMid = function(mid){
+ return toAbsMid(mid, module);
+ };
+ if(0){
+ result.undef = function(mid){
+ req.undef(mid, module);
+ };
+ }
+ if(1){
+ result.syncLoadNls = function(mid){
+ var nlsModuleInfo = getModuleInfo(mid, module),
+ nlsModule = modules[nlsModuleInfo.mid];
+ if(!nlsModule || !nlsModule.executed){
+ cached = cache[nlsModuleInfo.mid] || cache[nlsModuleInfo.cacheId];
+ if(cached){
+ evalModuleText(cached);
+ nlsModule = modules[nlsModuleInfo.mid];
+ }
+ }
+ return nlsModule && nlsModule.executed && nlsModule.result;
+ };
+ }
+
+ }
+ return result;
+ },
+
+ execQ =
+ // The list of modules that need to be evaluated.
+ [],
+
+ defQ =
+ // The queue of define arguments sent to loader.
+ [],
+
+ waiting =
+ // The set of modules upon which the loader is waiting for definition to arrive
+ {},
+
+ setRequested = function(module){
+ module.injected = requested;
+ waiting[module.mid] = 1;
+ if(module.url){
+ waiting[module.url] = module.pack || 1;
+ }
+ },
+
+ setArrived = function(module){
+ module.injected = arrived;
+ delete waiting[module.mid];
+ if(module.url){
+ delete waiting[module.url];
+ }
+ if(isEmpty(waiting)){
+ clearTimer();
+ 1 && legacyMode==xd && (legacyMode = sync);
+ }
+ },
+
+ execComplete = req.idle =
+ // says the loader has completed (or not) its work
+ function(){
+ return !defQ.length && isEmpty(waiting) && !execQ.length && !checkCompleteGuard;
+ },
+
+ runMapProg = function(targetMid, map){
+ // search for targetMid in map; return the map item if found; falsy otherwise
+ for(var i = 0; i < map.length; i++){
+ if(map[i][2].test(targetMid)){
+ return map[i];
+ }
+ }
+ return 0;
+ },
+
+ compactPath = function(path){
+ var result = [],
+ segment, lastSegment;
+ path = path.replace(/\\/g, '/').split('/');
+ while(path.length){
+ segment = path.shift();
+ if(segment==".." && result.length && lastSegment!=".."){
+ result.pop();
+ lastSegment = result[result.length - 1];
+ }else if(segment!="."){
+ result.push(lastSegment= segment);
+ } // else ignore "."
+ }
+ return result.join("/");
+ },
+
+ makeModuleInfo = function(pid, mid, pack, url, cacheId){
+ if(1){
+ var xd= req.isXdUrl(url);
+ return {pid:pid, mid:mid, pack:pack, url:url, executed:0, def:0, isXd:xd, isAmd:!!(xd || (packs[pid] && packs[pid].isAmd)), cacheId:cacheId};
+ }else{
+ return {pid:pid, mid:mid, pack:pack, url:url, executed:0, def:0, cacheId:cacheId};
+ }
+ },
+
+ getModuleInfo_ = function(mid, referenceModule, packs, modules, baseUrl, packageMapProg, pathsMapProg, alwaysCreate){
+ // arguments are passed instead of using lexical variables so that this function my be used independent of the loader (e.g., the builder)
+ // alwaysCreate is useful in this case so that getModuleInfo never returns references to real modules owned by the loader
+ var pid, pack, midInPackage, mapProg, mapItem, path, url, result, isRelative, requestedMid, cacheId=0;
+ requestedMid = mid;
+ isRelative = /^\./.test(mid);
+ if(/(^\/)|(\:)|(\.js$)/.test(mid) || (isRelative && !referenceModule)){
+ // absolute path or protocol of .js filetype, or relative path but no reference module and therefore relative to page
+ // whatever it is, it's not a module but just a URL of some sort
+ return makeModuleInfo(0, mid, 0, mid);
+ }else{
+ // relative module ids are relative to the referenceModule; get rid of any dots
+ mid = compactPath(isRelative ? (referenceModule.mid + "/../" + mid) : mid);
+ if(/^\./.test(mid)){
+ throw makeError("irrationalPath", mid);
+ }
+ // find the package indicated by the mid, if any
+ mapProg = referenceModule && referenceModule.pack && referenceModule.pack.mapProg;
+ mapItem = (mapProg && runMapProg(mid, mapProg)) || runMapProg(mid, packageMapProg);
+ if(mapItem){
+ // mid specified a module that's a member of a package; figure out the package id and module id
+ // notice we expect pack.main to be valid with no pre or post slash
+ pid = mapItem[1];
+ mid = mid.substring(mapItem[3]);
+ pack = packs[pid];
+ if(!mid){
+ mid= pack.main;
+ }
+ midInPackage = mid;
+ cacheId = pack.reverseName + "/" + mid;
+ mid = pid + "/" + mid;
+ }else{
+ pid = "";
+ }
+
+ // search aliases
+ var candidateLength = 0,
+ candidate = 0;
+ forEach(aliases, function(pair){
+ var match = mid.match(pair[0]);
+ if(match && match.length>candidateLength){
+ candidate = isFunction(pair[1]) ? mid.replace(pair[0], pair[1]) : pair[1];
+ }
+ });
+ if(candidate){
+ return getModuleInfo_(candidate, 0, packs, modules, baseUrl, packageMapProg, pathsMapProg, alwaysCreate);
+ }
+
+ result = modules[mid];
+ if(result){
+ return alwaysCreate ? makeModuleInfo(result.pid, result.mid, result.pack, result.url, cacheId) : modules[mid];
+ }
+ }
+ // get here iff the sought-after module does not yet exist; therefore, we need to compute the URL given the
+ // fully resolved (i.e., all relative indicators and package mapping resolved) module id
+
+ mapItem = runMapProg(mid, pathsMapProg);
+ if(mapItem){
+ url = mapItem[1] + mid.substring(mapItem[3] - 1);
+ }else if(pid){
+ url = pack.location + "/" + midInPackage;
+ }else if(has("config-tlmSiblingOfDojo")){
+ url = "../" + mid;
+ }else{
+ url = mid;
+ }
+ // if result is not absolute, add baseUrl
+ if(!(/(^\/)|(\:)/.test(url))){
+ url = baseUrl + url;
+ }
+ url += ".js";
+ return makeModuleInfo(pid, mid, pack, compactPath(url), cacheId);
+ },
+
+ getModuleInfo = function(mid, referenceModule){
+ return getModuleInfo_(mid, referenceModule, packs, modules, req.baseUrl, packageMapProg, pathsMapProg);
+ },
+
+ resolvePluginResourceId = function(plugin, prid, referenceModule){
+ return plugin.normalize ? plugin.normalize(prid, function(mid){return toAbsMid(mid, referenceModule);}) : toAbsMid(prid, referenceModule);
+ },
+
+ dynamicPluginUidGenerator = 0,
+
+ getModule = function(mid, referenceModule, immediate){
+ // compute and optionally construct (if necessary) the module implied by the mid with respect to referenceModule
+ var match, plugin, prid, result;
+ match = mid.match(/^(.+?)\!(.*)$/);
+ if(match){
+ // name was <plugin-module>!<plugin-resource-id>
+ plugin = getModule(match[1], referenceModule, immediate);
+
+ if(1 && legacyMode == sync && !plugin.executed){
+ injectModule(plugin);
+ if(plugin.injected===arrived && !plugin.executed){
+ checkCompleteGuard++;
+ execModule(plugin);
+ checkIdle();
+ }
+ if(plugin.executed){
+ promoteModuleToPlugin(plugin);
+ }else{
+ // we are in xdomain mode for some reason
+ execQ.unshift(plugin);
+ }
+ }
+
+
+
+ if(plugin.executed === executed && !plugin.load){
+ // executed the module not knowing it was a plugin
+ promoteModuleToPlugin(plugin);
+ }
+
+ // if the plugin has not been loaded, then can't resolve the prid and must assume this plugin is dynamic until we find out otherwise
+ if(plugin.load){
+ prid = resolvePluginResourceId(plugin, match[2], referenceModule);
+ mid = (plugin.mid + "!" + (plugin.dynamic ? ++dynamicPluginUidGenerator + "!" : "") + prid);
+ }else{
+ prid = match[2];
+ mid = plugin.mid + "!" + (++dynamicPluginUidGenerator) + "!waitingForPlugin";
+ }
+ result = {plugin:plugin, mid:mid, req:createRequire(referenceModule), prid:prid};
+ }else{
+ result = getModuleInfo(mid, referenceModule);
+ }
+ return modules[result.mid] || (!immediate && (modules[result.mid] = result));
+ },
+
+ toAbsMid = req.toAbsMid = function(mid, referenceModule){
+ return getModuleInfo(mid, referenceModule).mid;
+ },
+
+ toUrl = req.toUrl = function(name, referenceModule){
+ var moduleInfo = getModuleInfo(name+"/x", referenceModule),
+ url = moduleInfo.url;
+ return fixupUrl(moduleInfo.pid===0 ?
+ // if pid===0, then name had a protocol or absolute path; either way, toUrl is the identify function in such cases
+ name :
+ // "/x.js" since getModuleInfo automatically appends ".js" and we appended "/x" to make name look likde a module id
+ url.substring(0, url.length-5)
+ );
+ },
+
+ nonModuleProps = {
+ injected: arrived,
+ executed: executed,
+ def: nonmodule,
+ result: nonmodule
+ },
+
+ makeCjs = function(mid){
+ return modules[mid] = mix({mid:mid}, nonModuleProps);
+ },
+
+ cjsRequireModule = makeCjs("require"),
+ cjsExportsModule = makeCjs("exports"),
+ cjsModuleModule = makeCjs("module"),
+
+ runFactory = function(module, args){
+ req.trace("loader-run-factory", [module.mid]);
+ var factory = module.def,
+ result;
+ 1 && syncExecStack.unshift(module);
+ if(has("config-dojo-loader-catches")){
+ try{
+ result= isFunction(factory) ? factory.apply(null, args) : factory;
+ }catch(e){
+ signal(error, module.result = makeError("factoryThrew", [module, e]));
+ }
+ }else{
+ result= isFunction(factory) ? factory.apply(null, args) : factory;
+ }
+ module.result = result===undefined && module.cjs ? module.cjs.exports : result;
+ 1 && syncExecStack.shift(module);
+ },
+
+ abortExec = {},
+
+ defOrder = 0,
+
+ promoteModuleToPlugin = function(pluginModule){
+ var plugin = pluginModule.result;
+ pluginModule.dynamic = plugin.dynamic;
+ pluginModule.normalize = plugin.normalize;
+ pluginModule.load = plugin.load;
+ return pluginModule;
+ },
+
+ resolvePluginLoadQ = function(plugin){
+ // plugins is a newly executed module that has a loadQ waiting to run
+
+ // step 1: traverse the loadQ and fixup the mid and prid; remember the map from original mid to new mid
+ // recall the original mid was created before the plugin was on board and therefore it was impossible to
+ // compute the final mid; accordingly, prid may or may not change, but the mid will definitely change
+ var map = {};
+ forEach(plugin.loadQ, function(pseudoPluginResource){
+ // manufacture and insert the real module in modules
+ var pseudoMid = pseudoPluginResource.mid,
+ prid = resolvePluginResourceId(plugin, pseudoPluginResource.prid, pseudoPluginResource.req.module),
+ mid = plugin.dynamic ? pseudoPluginResource.mid.replace(/waitingForPlugin$/, prid) : (plugin.mid + "!" + prid),
+ pluginResource = mix(mix({}, pseudoPluginResource), {mid:mid, prid:prid, injected:0});
+ if(!modules[mid]){
+ // create a new (the real) plugin resource and inject it normally now that the plugin is on board
+ injectPlugin(modules[mid] = pluginResource);
+ } // else this was a duplicate request for the same (plugin, rid) for a nondynamic plugin
+
+ // pluginResource is really just a placeholder with the wrong mid (because we couldn't calculate it until the plugin was on board)
+ // mark is as arrived and delete it from modules; the real module was requested above
+ map[pseudoPluginResource.mid] = modules[mid];
+ setArrived(pseudoPluginResource);
+ delete modules[pseudoPluginResource.mid];
+ });
+ plugin.loadQ = 0;
+
+ // step2: replace all references to any placeholder modules with real modules
+ var substituteModules = function(module){
+ for(var replacement, deps = module.deps || [], i = 0; i<deps.length; i++){
+ replacement = map[deps[i].mid];
+ if(replacement){
+ deps[i] = replacement;
+ }
+ }
+ };
+ for(var p in modules){
+ substituteModules(modules[p]);
+ }
+ forEach(execQ, substituteModules);
+ },
+
+ finishExec = function(module){
+ req.trace("loader-finish-exec", [module.mid]);
+ module.executed = executed;
+ module.defOrder = defOrder++;
+ 1 && forEach(module.provides, function(cb){ cb(); });
+ if(module.loadQ){
+ // the module was a plugin
+ promoteModuleToPlugin(module);
+ resolvePluginLoadQ(module);
+ }
+ // remove all occurences of this module from the execQ
+ for(i = 0; i < execQ.length;){
+ if(execQ[i] === module){
+ execQ.splice(i, 1);
+ }else{
+ i++;
+ }
+ }
+ },
+
+ circleTrace = [],
+
+ execModule = function(module, strict){
+ // run the dependency vector, then run the factory for module
+ if(module.executed === executing){
+ req.trace("loader-circular-dependency", [circleTrace.concat(mid).join("->")]);
+ return (!module.def || strict) ? abortExec : (module.cjs && module.cjs.exports);
+ }
+ // at this point the module is either not executed or fully executed
+
+
+ if(!module.executed){
+ if(!module.def){
+ return abortExec;
+ }
+ var mid = module.mid,
+ deps = module.deps || [],
+ arg, argResult,
+ args = [],
+ i = 0;
+
+ if(0){
+ circleTrace.push(mid);
+ req.trace("loader-exec-module", ["exec", circleTrace.length, mid]);
+ }
+
+ // for circular dependencies, assume the first module encountered was executed OK
+ // modules that circularly depend on a module that has not run its factory will get
+ // the premade cjs.exports===module.result. They can take a reference to this object and/or
+ // add properties to it. When the module finally runs its factory, the factory can
+ // read/write/replace this object. Notice that so long as the object isn't replaced, any
+ // reference taken earlier while walking the deps list is still valid.
+ module.executed = executing;
+ while(i < deps.length){
+ arg = deps[i++];
+ argResult = ((arg === cjsRequireModule) ? createRequire(module) :
+ ((arg === cjsExportsModule) ? module.cjs.exports :
+ ((arg === cjsModuleModule) ? module.cjs :
+ execModule(arg, strict))));
+ if(argResult === abortExec){
+ module.executed = 0;
+ req.trace("loader-exec-module", ["abort", mid]);
+ 0 && circleTrace.pop();
+ return abortExec;
+ }
+ args.push(argResult);
+ }
+ runFactory(module, args);
+ finishExec(module);
+ }
+ // at this point the module is guaranteed fully executed
+
+ 0 && circleTrace.pop();
+ return module.result;
+ },
+
+
+ checkCompleteGuard = 0,
+
+ checkComplete = function(){
+ // keep going through the execQ as long as at least one factory is executed
+ // plugins, recursion, cached modules all make for many execution path possibilities
+ if(checkCompleteGuard){
+ return;
+ }
+ checkCompleteGuard++;
+ checkDojoRequirePlugin();
+ for(var currentDefOrder, module, i = 0; i < execQ.length;){
+ currentDefOrder = defOrder;
+ module = execQ[i];
+ execModule(module);
+ if(currentDefOrder!=defOrder){
+ // defOrder was bumped one or more times indicating something was executed (note, this indicates
+ // the execQ was modified, maybe a lot (for example a later module causes an earlier module to execute)
+ checkDojoRequirePlugin();
+ i = 0;
+ }else{
+ // nothing happened; check the next module in the exec queue
+ i++;
+ }
+ }
+ checkIdle();
+ },
+
+ checkIdle = function(){
+ checkCompleteGuard--;
+ if(execComplete()){
+ signal("idle", []);
+ }
+ };
+
+
+ if(0){
+ req.undef = function(moduleId, referenceModule){
+ // In order to reload a module, it must be undefined (this routine) and then re-requested.
+ // This is useful for testing frameworks (at least).
+ var module = getModule(moduleId, referenceModule);
+ setArrived(module);
+ delete modules[module.mid];
+ };
+ }
+
+ if(1){
+ if(has("dojo-loader-eval-hint-url")===undefined){
+ has.add("dojo-loader-eval-hint-url", 1);
}
+
+ var fixupUrl= function(url){
+ url += ""; // make sure url is a Javascript string (some paths may be a Java string)
+ return url + (cacheBust ? ((/\?/.test(url) ? "&" : "?") + cacheBust) : "");
+ },
+
+ injectPlugin = function(
+ module
+ ){
+ // injects the plugin module given by module; may have to inject the plugin itself
+ var plugin = module.plugin;
+
+ if(plugin.executed === executed && !plugin.load){
+ // executed the module not knowing it was a plugin
+ promoteModuleToPlugin(plugin);
+ }
+
+ var onLoad = function(def){
+ module.result = def;
+ setArrived(module);
+ finishExec(module);
+ checkComplete();
+ };
+
+ if(plugin.load){
+ plugin.load(module.prid, module.req, onLoad);
+ }else if(plugin.loadQ){
+ plugin.loadQ.push(module);
+ }else{
+ // the unshift instead of push is important: we don't want plugins to execute as
+ // dependencies of some other module because this may cause circles when the plugin
+ // loadQ is run; also, generally, we want plugins to run early since they may load
+ // several other modules and therefore can potentially unblock many modules
+ plugin.loadQ = [module];
+ execQ.unshift(plugin);
+ injectModule(plugin);
+ }
+ },
+
+ // for IE, injecting a module may result in a recursive execution if the module is in the cache
+
+ cached = 0,
+
+ injectingModule = 0,
+
+ injectingCachedModule = 0,
+
+ evalModuleText = function(text, module){
+ // see def() for the injectingCachedModule bracket; it simply causes a short, safe curcuit
+ injectingCachedModule = 1;
+ if(has("config-dojo-loader-catches")){
+ try{
+ if(text===cached){
+ cached.call(null);
+ }else{
+ req.eval(text, has("dojo-loader-eval-hint-url") ? module.url : module.mid);
+ }
+ }catch(e){
+ signal(error, makeError("evalModuleThrew", module));
+ }
+ }else{
+ if(text===cached){
+ cached.call(null);
+ }else{
+ req.eval(text, has("dojo-loader-eval-hint-url") ? module.url : module.mid);
+ }
+ }
+ injectingCachedModule = 0;
+ },
+
+ injectModule = function(module){
+ // Inject the module. In the browser environment, this means appending a script element into
+ // the document; in other environments, it means loading a file.
+ //
+ // If in synchronous mode, then get the module synchronously if it's not xdomainLoading.
+
+ var mid = module.mid,
+ url = module.url;
+ if(module.executed || module.injected || waiting[mid] || (module.url && ((module.pack && waiting[module.url]===module.pack) || waiting[module.url]==1))){
+ return;
+ }
+ setRequested(module);
+
+ if(0){
+ var viaCombo = 0;
+ if(module.plugin && module.plugin.isCombo){
+ // a combo plugin; therefore, must be handled by combo service
+ // the prid should have already been converted to a URL (if required by the plugin) during
+ // the normalze process; in any event, there is no way for the loader to know how to
+ // to the conversion; therefore the third argument is zero
+ req.combo.add(module.plugin.mid, module.prid, 0, req);
+ viaCombo = 1;
+ }else if(!module.plugin){
+ viaCombo = req.combo.add(0, module.mid, module.url, req);
+ }
+ if(viaCombo){
+ comboPending= 1;
+ return;
+ }
+ }
+
+ if(module.plugin){
+ injectPlugin(module);
+ return;
+ } // else a normal module (not a plugin)
+
+
+ var onLoadCallback = function(){
+ runDefQ(module);
+ if(module.injected !== arrived){
+ // the script that contained the module arrived and has been executed yet
+ // nothing was added to the defQ (so it wasn't an AMD module) and the module
+ // wasn't marked as arrived by dojo.provide (so it wasn't a v1.6- module);
+ // therefore, it must not have been a module; adjust state accordingly
+ setArrived(module);
+ mix(module, nonModuleProps);
+ }
+
+ if(1 && legacyMode){
+ // must call checkComplete even in for sync loader because we may be in xdomainLoading mode;
+ // but, if xd loading, then don't call checkComplete until out of the current sync traversal
+ // in order to preserve order of execution of the dojo.required modules
+ !syncExecStack.length && checkComplete();
+ }else{
+ checkComplete();
+ }
+ };
+ cached = cache[mid] || cache[module.cacheId];
+ if(cached){
+ req.trace("loader-inject", ["cache", module.mid, url]);
+ evalModuleText(cached, module);
+ onLoadCallback();
+ return;
+ }
+ if(1 && legacyMode){
+ if(module.isXd){
+ // switch to async mode temporarily; if current legacyMode!=sync, then is must be one of {legacyAsync, xd, false}
+ legacyMode==sync && (legacyMode = xd);
+ // fall through and load via script injection
+ }else if(module.isAmd && legacyMode!=sync){
+ // fall through and load via script injection
+ }else{
+ // mode may be sync, xd/legacyAsync, or async; module may be AMD or legacy; but module is always located on the same domain
+ var xhrCallback = function(text){
+ if(legacyMode==sync){
+ // the top of syncExecStack gives the current synchronously executing module; the loader needs
+ // to know this if it has to switch to async loading in the middle of evaluating a legacy module
+ // this happens when a modules dojo.require's a module that must be loaded async because it's xdomain
+ // (using unshift/shift because there is no back() methods for Javascript arrays)
+ syncExecStack.unshift(module);
+ evalModuleText(text, module);
+ syncExecStack.shift();
+
+ // maybe the module was an AMD module
+ runDefQ(module);
+
+ // legacy modules never get to defineModule() => cjs and injected never set; also evaluation implies executing
+ if(!module.cjs){
+ setArrived(module);
+ finishExec(module);
+ }
+
+ if(module.finish){
+ // while synchronously evaluating this module, dojo.require was applied referencing a module
+ // that had to be loaded async; therefore, the loader stopped answering all dojo.require
+ // requests so they could be answered completely in the correct sequence; module.finish gives
+ // the list of dojo.requires that must be re-applied once all target modules are available;
+ // make a synthetic module to execute the dojo.require's in the correct order
+
+ // compute a guarnateed-unique mid for the synthetic finish module; remember the finish vector; remove it from the reference module
+ // TODO: can we just leave the module.finish...what's it hurting?
+ var finishMid = mid + "*finish",
+ finish = module.finish;
+ delete module.finish;
+
+ def(finishMid, ["dojo", ("dojo/require!" + finish.join(",")).replace(/\./g, "/")], function(dojo){
+ forEach(finish, function(mid){ dojo.require(mid); });
+ });
+ // unshift, not push, which causes the current traversal to be reattempted from the top
+ execQ.unshift(getModule(finishMid));
+ }
+ onLoadCallback();
+ }else{
+ text = transformToAmd(module, text);
+ if(text){
+ evalModuleText(text, module);
+ onLoadCallback();
+ }else{
+ // if transformToAmd returned falsy, then the module was already AMD and it can be script-injected
+ // do so to improve debugability(even though it means another download...which probably won't happen with a good browser cache)
+ injectingModule = module;
+ req.injectUrl(fixupUrl(url), onLoadCallback, module);
+ injectingModule = 0;
+ }
+ }
+ };
+
+ req.trace("loader-inject", ["xhr", module.mid, url, legacyMode!=sync]);
+ if(has("config-dojo-loader-catches")){
+ try{
+ req.getText(url, legacyMode!=sync, xhrCallback);
+ }catch(e){
+ signal(error, makeError("xhrInjectFailed", [module, e]));
+ }
+ }else{
+ req.getText(url, legacyMode!=sync, xhrCallback);
+ }
+ return;
+ }
+ } // else async mode or fell through in xdomain loading mode; either way, load by script injection
+ req.trace("loader-inject", ["script", module.mid, url]);
+ injectingModule = module;
+ req.injectUrl(fixupUrl(url), onLoadCallback, module);
+ injectingModule = 0;
+ },
+
+ defineModule = function(module, deps, def){
+ req.trace("loader-define-module", [module.mid, deps]);
+
+ if(0 && module.plugin && module.plugin.isCombo){
+ // the module is a plugin resource loaded by the combo service
+ // note: check for module.plugin should be enough since normal plugin resources should
+ // not follow this path; module.plugin.isCombo is future-proofing belt and suspenders
+ module.result = isFunction(def) ? def() : def;
+ setArrived(module);
+ finishExec(module);
+ return module;
+ };
+
+ var mid = module.mid;
+ if(module.injected === arrived){
+ signal(error, makeError("multipleDefine", module));
+ return module;
+ }
+ mix(module, {
+ deps: deps,
+ def: def,
+ cjs: {
+ id: module.mid,
+ uri: module.url,
+ exports: (module.result = {}),
+ setExports: function(exports){
+ module.cjs.exports = exports;
+ }
+ }
+ });
+
+ // resolve deps with respect to this module
+ for(var i = 0; i < deps.length; i++){
+ deps[i] = getModule(deps[i], module);
+ }
+
+ if(1 && legacyMode && !waiting[mid]){
+ // the module showed up without being asked for; it was probably in a <script> element
+ injectDependencies(module);
+ execQ.push(module);
+ checkComplete();
+ }
+ setArrived(module);
+
+ if(!isFunction(def) && !deps.length){
+ module.result = def;
+ finishExec(module);
+ }
+
+ return module;
+ },
+
+ runDefQ = function(referenceModule, mids){
+ // defQ is an array of [id, dependencies, factory]
+ // mids (if any) is a vector of mids given by a combo service
+ var definedModules = [],
+ module, args;
+ while(defQ.length){
+ args = defQ.shift();
+ mids && (args[0]= mids.shift());
+ // explicit define indicates possible multiple modules in a single file; delay injecting dependencies until defQ fully
+ // processed since modules earlier in the queue depend on already-arrived modules that are later in the queue
+ // TODO: what if no args[0] and no referenceModule
+ module = (args[0] && getModule(args[0])) || referenceModule;
+ definedModules.push([module, args[1], args[2]]);
+ }
+ consumePendingCacheInsert(referenceModule);
+ forEach(definedModules, function(args){
+ injectDependencies(defineModule.apply(null, args));
+ });
+ };
}
-/*=====
- // Override locale setting, if specified
- dojo.locale = {
- // summary: the locale as defined by Dojo (read-only)
- };
-=====*/
- dojo.locale = d.config.locale;
+ var timerId = 0,
+ clearTimer = noop,
+ startTimer = noop;
+ if(1){
+ // Timer machinery that monitors how long the loader is waiting and signals an error when the timer runs out.
+ clearTimer = function(){
+ timerId && clearTimeout(timerId);
+ timerId = 0;
+ },
- var rev = "$Rev: 24595 $".match(/\d+/);
+ startTimer = function(){
+ clearTimer();
+ req.waitms && (timerId = setTimeout(function(){
+ clearTimer();
+ signal(error, makeError("timeout", waiting));
+ }, req.waitms));
+ };
+ }
-/*=====
- dojo.version = function(){
- // summary:
- // Version number of the Dojo Toolkit
- // major: Integer
- // Major version. If total version is "1.2.0beta1", will be 1
- // minor: Integer
- // Minor version. If total version is "1.2.0beta1", will be 2
- // patch: Integer
- // Patch version. If total version is "1.2.0beta1", will be 0
- // flag: String
- // Descriptor flag. If total version is "1.2.0beta1", will be "beta1"
- // revision: Number
- // The SVN rev from which dojo was pulled
- this.major = 0;
- this.minor = 0;
- this.patch = 0;
- this.flag = "";
- this.revision = 0;
+ if(1){
+ has.add("ie-event-behavior", doc.attachEvent && (typeof opera === "undefined" || opera.toString() != "[object Opera]"));
}
-=====*/
- dojo.version = {
- major: 1, minor: 6, patch: 1, flag: "",
- revision: rev ? +rev[0] : NaN,
- toString: function(){
- with(d.version){
- return major + "." + minor + "." + patch + flag + " (" + revision + ")"; // String
- }
+
+ if(1 && (1 || 1)){
+ var domOn = function(node, eventName, ieEventName, handler){
+ // Add an event listener to a DOM node using the API appropriate for the current browser;
+ // return a function that will disconnect the listener.
+ if(!has("ie-event-behavior")){
+ node.addEventListener(eventName, handler, false);
+ return function(){
+ node.removeEventListener(eventName, handler, false);
+ };
+ }else{
+ node.attachEvent(ieEventName, handler);
+ return function(){
+ node.detachEvent(ieEventName, handler);
+ };
+ }
+ },
+ windowOnLoadListener = domOn(window, "load", "onload", function(){
+ req.pageLoaded = 1;
+ doc.readyState!="complete" && (doc.readyState = "complete");
+ windowOnLoadListener();
+ });
+
+ if(1){
+ // if the loader is on the page, there must be at least one script element
+ // getting its parent and then doing insertBefore solves the "Operation Aborted"
+ // error in IE from appending to a node that isn't properly closed; see
+ // dojo/tests/_base/loader/requirejs/simple-badbase.html for an example
+ var sibling = doc.getElementsByTagName("script")[0],
+ insertPoint= sibling.parentNode;
+ req.injectUrl = function(url, callback, owner){
+ // insert a script element to the insert-point element with src=url;
+ // apply callback upon detecting the script has loaded.
+
+ startTimer();
+ var node = owner.node = doc.createElement("script"),
+ onLoad = function(e){
+ e = e || window.event;
+ var node = e.target || e.srcElement;
+ if(e.type === "load" || /complete|loaded/.test(node.readyState)){
+ disconnector();
+ callback && callback();
+ }
+ },
+ disconnector = domOn(node, "load", "onreadystatechange", onLoad);
+ node.type = "text/javascript";
+ node.charset = "utf-8";
+ node.src = url;
+ insertPoint.insertBefore(node, sibling);
+ return node;
+ };
}
}
- // Register with the OpenAjax hub
- if(typeof OpenAjax != "undefined"){
- OpenAjax.hub.registerLibrary(dojo._scopeName, "http://dojotoolkit.org", d.version.toString());
+ if(1){
+ req.log = function(){
+ try{
+ for(var i = 0; i < arguments.length; i++){
+ console.log(arguments[i]);
+ }
+ }catch(e){}
+ };
+ }else{
+ req.log = noop;
}
-
- var extraNames, extraLen, empty = {};
- for(var i in {toString: 1}){ extraNames = []; break; }
- dojo._extraNames = extraNames = extraNames || ["hasOwnProperty", "valueOf", "isPrototypeOf",
- "propertyIsEnumerable", "toLocaleString", "toString", "constructor"];
- extraLen = extraNames.length;
- dojo._mixin = function(/*Object*/ target, /*Object*/ source){
- // summary:
- // Adds all properties and methods of source to target. This addition
- // is "prototype extension safe", so that instances of objects
- // will not pass along prototype defaults.
- var name, s, i;
- for(name in source){
- // the "tobj" condition avoid copying properties in "source"
- // inherited from Object.prototype. For example, if target has a custom
- // toString() method, don't overwrite it with the toString() method
- // that source inherited from Object.prototype
- s = source[name];
- if(!(name in target) || (target[name] !== s && (!(name in empty) || empty[name] !== s))){
- target[name] = s;
- }
- }
- // IE doesn't recognize some custom functions in for..in
- if(extraLen && source){
- for(i = 0; i < extraLen; ++i){
- name = extraNames[i];
- s = source[name];
- if(!(name in target) || (target[name] !== s && (!(name in empty) || empty[name] !== s))){
- target[name] = s;
+ if(0){
+ var trace = req.trace = function(
+ group, // the trace group to which this application belongs
+ args // the contents of the trace
+ ){
+ ///
+ // Tracing interface by group.
+ //
+ // Sends the contents of args to the console iff (req.trace.on && req.trace[group])
+
+ if(trace.on && trace.group[group]){
+ signal("trace", [group, args]);
+ for(var arg, dump = [], text= "trace:" + group + (args.length ? (":" + args[0]) : ""), i= 1; i<args.length;){
+ arg = args[i++];
+ if(isString(arg)){
+ text += ", " + arg;
+ }else{
+ dump.push(arg);
+ }
}
+ req.log(text);
+ dump.length && dump.push(".");
+ req.log.apply(req, dump);
}
- }
- return target; // Object
+ };
+ mix(trace, {
+ on:1,
+ group:{},
+ set:function(group, value){
+ if(isString(group)){
+ trace.group[group]= value;
+ }else{
+ mix(trace.group, group);
+ }
+ }
+ });
+ trace.set(mix(mix(mix({}, defaultConfig.trace), userConfig.trace), dojoSniffConfig.trace));
+ on("config", function(config){
+ config.trace && trace.set(config.trace);
+ });
+ }else{
+ req.trace = noop;
}
- dojo.mixin = function(/*Object*/obj, /*Object...*/props){
- // summary:
- // Adds all properties and methods of props to obj and returns the
- // (now modified) obj.
- // description:
- // `dojo.mixin` can mix multiple source objects into a
- // destination object which is then returned. Unlike regular
- // `for...in` iteration, `dojo.mixin` is also smart about avoiding
- // extensions which other toolkits may unwisely add to the root
- // object prototype
- // obj:
- // The object to mix properties into. Also the return value.
- // props:
- // One or more objects whose values are successively copied into
- // obj. If more than one of these objects contain the same value,
- // the one specified last in the function call will "win".
- // example:
- // make a shallow copy of an object
- // | var copy = dojo.mixin({}, source);
- // example:
- // many class constructors often take an object which specifies
- // values to be configured on the object. In this case, it is
- // often simplest to call `dojo.mixin` on the `this` object:
- // | dojo.declare("acme.Base", null, {
- // | constructor: function(properties){
- // | // property configuration:
- // | dojo.mixin(this, properties);
- // |
- // | console.log(this.quip);
- // | // ...
- // | },
- // | quip: "I wasn't born yesterday, you know - I've seen movies.",
- // | // ...
- // | });
- // |
- // | // create an instance of the class and configure it
- // | var b = new acme.Base({quip: "That's what it does!" });
- // example:
- // copy in properties from multiple objects
- // | var flattened = dojo.mixin(
- // | {
- // | name: "Frylock",
- // | braces: true
- // | },
- // | {
- // | name: "Carl Brutanananadilewski"
- // | }
- // | );
- // |
- // | // will print "Carl Brutanananadilewski"
- // | console.log(flattened.name);
- // | // will print "true"
- // | console.log(flattened.braces);
- if(!obj){ obj = {}; }
- for(var i=1, l=arguments.length; i<l; i++){
- d._mixin(obj, arguments[i]);
+ var def = function(
+ mid, //(commonjs.moduleId, optional) list of modules to be loaded before running factory
+ dependencies, //(array of commonjs.moduleId, optional)
+ factory //(any)
+ ){
+ ///
+ // Advises the loader of a module factory. //Implements http://wiki.commonjs.org/wiki/Modules/AsynchronousDefinition.
+ ///
+ //note
+ // CommonJS factory scan courtesy of http://requirejs.org
+
+ var arity = arguments.length,
+ args = 0,
+ defaultDeps = ["require", "exports", "module"];
+
+ if(0){
+ if(arity == 1 && isFunction(mid)){
+ dependencies = [];
+ mid.toString()
+ .replace(/(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg, "")
+ .replace(/require\(["']([\w\!\-_\.\/]+)["']\)/g, function (match, dep){
+ dependencies.push(dep);
+ });
+ args = [0, defaultDeps.concat(dependencies), mid];
+ }
+ }
+ if(!args){
+ args = arity == 1 ? [0, defaultDeps, mid] :
+ (arity == 2 ? (isArray(mid) ? [0, mid, dependencies] : (isFunction(dependencies) ? [mid, defaultDeps, dependencies] : [mid, [], dependencies])) :
+ [mid, dependencies, factory]);
+ }
+ req.trace("loader-define", args.slice(0, 2));
+ var targetModule = args[0] && getModule(args[0]),
+ module;
+ if(targetModule && !waiting[targetModule.mid]){
+ // given a mid that hasn't been requested; therefore, defined through means other than injecting
+ // consequent to a require() or define() application; examples include defining modules on-the-fly
+ // due to some code path or including a module in a script element. In any case,
+ // there is no callback waiting to finish processing and nothing to trigger the defQ and the
+ // dependencies are never requested; therefore, do it here.
+ injectDependencies(defineModule(targetModule, args[1], args[2]));
+ }else if(!has("ie-event-behavior") || !1 || injectingCachedModule){
+ // not IE path: anonymous module and therefore must have been injected; therefore, onLoad will fire immediately
+ // after script finishes being evaluated and the defQ can be run from that callback to detect the module id
+ defQ.push(args);
+ }else{
+ // IE path: possibly anonymous module and therefore injected; therefore, cannot depend on 1-to-1,
+ // in-order exec of onLoad with script eval (since it's IE) and must manually detect here
+ targetModule = targetModule || injectingModule;
+ if(!targetModule){
+ for(mid in waiting){
+ module = modules[mid];
+ if(module && module.node && module.node.readyState === 'interactive'){
+ targetModule = module;
+ break;
+ }
+ }
+ if(0 && !targetModule){
+ for(var i = 0; i<combosPending.length; i++){
+ targetModule = combosPending[i];
+ if(targetModule.node && targetModule.node.readyState === 'interactive'){
+ break;
+ }
+ targetModule= 0;
+ }
+ }
+ }
+ if(0 && isArray(targetModule)){
+ injectDependencies(defineModule(getModule(targetModule.shift()), args[1], args[2]));
+ if(!targetModule.length){
+ combosPending.splice(i, 1);
+ }
+ }else if(targetModule){
+ consumePendingCacheInsert(targetModule);
+ injectDependencies(defineModule(targetModule, args[1], args[2]));
+ }else{
+ signal(error, makeError("ieDefineFailed", args[0]));
+ }
+ checkComplete();
}
- return obj; // Object
+ };
+ def.amd = {
+ vendor:"dojotoolkit.org"
+ };
+
+ if(0){
+ req.def = def;
}
- dojo._getProp = function(/*Array*/parts, /*Boolean*/create, /*Object*/context){
- var obj=context || d.global;
- for(var i=0, p; obj && (p=parts[i]); i++){
- if(i == 0 && d._scopeMap[p]){
- p = d._scopeMap[p];
+ // allow config to override default implemention of named functions; this is useful for
+ // non-browser environments, e.g., overriding injectUrl, getText, log, etc. in node.js, Rhino, etc.
+ // also useful for testing and monkey patching loader
+ mix(mix(req, defaultConfig.loaderPatch), userConfig.loaderPatch);
+
+ // now that req is fully initialized and won't change, we can hook it up to the error signal
+ on(error, function(arg){
+ try{
+ console.error(arg);
+ if(arg instanceof Error){
+ for(var p in arg){
+ console.log(p + ":", arg[p]);
+ }
+ console.log(".");
}
- obj = (p in obj ? obj[p] : (create ? obj[p]={} : undefined));
+ }catch(e){}
+ });
+
+ // always publish these
+ mix(req, {
+ uid:uid,
+ cache:cache,
+ packs:packs
+ });
+
+
+ if(0){
+ mix(req, {
+ // these may be interesting to look at when debugging
+ paths:paths,
+ aliases:aliases,
+ packageMap:packageMap,
+ modules:modules,
+ legacyMode:legacyMode,
+ execQ:execQ,
+ defQ:defQ,
+ waiting:waiting,
+
+ // these are used for testing
+ // TODO: move testing infrastructure to a different has feature
+ pathsMapProg:pathsMapProg,
+ packageMapProg:packageMapProg,
+ listenerQueues:listenerQueues,
+
+ // these are used by the builder (at least)
+ computeMapProg:computeMapProg,
+ runMapProg:runMapProg,
+ compactPath:compactPath,
+ getModuleInfo:getModuleInfo_
+ });
+ }
+
+ // the loader can be defined exactly once; look for global define which is the symbol AMD loaders are
+ // *required* to define (as opposed to require, which is optional)
+ if(global.define){
+ if(1){
+ signal(error, makeError("defineAlreadyDefined", 0));
}
- return obj; // mixed
+ }else{
+ global.define = def;
+ global.require = req;
}
- dojo.setObject = function(/*String*/name, /*Object*/value, /*Object?*/context){
- // summary:
- // Set a property from a dot-separated string, such as "A.B.C"
- // description:
- // Useful for longer api chains where you have to test each object in
- // the chain, or when you have an object reference in string format.
- // Objects are created as needed along `path`. Returns the passed
- // value if setting is successful or `undefined` if not.
- // name:
- // Path to a property, in the form "A.B.C".
- // context:
- // Optional. Object to use as root of path. Defaults to
- // `dojo.global`.
- // example:
- // set the value of `foo.bar.baz`, regardless of whether
- // intermediate objects already exist:
- // | dojo.setObject("foo.bar.baz", value);
- // example:
- // without `dojo.setObject`, we often see code like this:
- // | // ensure that intermediate objects are available
- // | if(!obj["parent"]){ obj.parent = {}; }
- // | if(!obj.parent["child"]){ obj.parent.child= {}; }
- // | // now we can safely set the property
- // | obj.parent.child.prop = "some value";
- // wheras with `dojo.setObject`, we can shorten that to:
- // | dojo.setObject("parent.child.prop", "some value", obj);
- var parts=name.split("."), p=parts.pop(), obj=d._getProp(parts, true, context);
- return obj && p ? (obj[p]=value) : undefined; // Object
- }
-
- dojo.getObject = function(/*String*/name, /*Boolean?*/create, /*Object?*/context){
- // summary:
- // Get a property from a dot-separated string, such as "A.B.C"
- // description:
- // Useful for longer api chains where you have to test each object in
- // the chain, or when you have an object reference in string format.
- // name:
- // Path to an property, in the form "A.B.C".
- // create:
- // Optional. Defaults to `false`. If `true`, Objects will be
- // created at any point along the 'path' that is undefined.
- // context:
- // Optional. Object to use as root of path. Defaults to
- // 'dojo.global'. Null may be passed.
- return d._getProp(name.split("."), create, context); // Object
- }
-
- dojo.exists = function(/*String*/name, /*Object?*/obj){
- // summary:
- // determine if an object supports a given method
- // description:
- // useful for longer api chains where you have to test each object in
- // the chain. Useful for object and method detection.
- // name:
- // Path to an object, in the form "A.B.C".
- // obj:
- // Object to use as root of path. Defaults to
- // 'dojo.global'. Null may be passed.
- // example:
- // | // define an object
- // | var foo = {
- // | bar: { }
- // | };
- // |
- // | // search the global scope
- // | dojo.exists("foo.bar"); // true
- // | dojo.exists("foo.bar.baz"); // false
- // |
- // | // search from a particular scope
- // | dojo.exists("bar", foo); // true
- // | dojo.exists("bar.baz", foo); // false
- return d.getObject(name, false, obj) !== undefined; // Boolean
+ if(0 && req.combo && req.combo.plugins){
+ var plugins = req.combo.plugins,
+ pluginName;
+ for(pluginName in plugins){
+ mix(mix(getModule(pluginName), plugins[pluginName]), {isCombo:1, executed:"executed", load:1});
+ }
+ }
+
+ if(1){
+ var bootDeps = dojoSniffConfig.deps || userConfig.deps || defaultConfig.deps,
+ bootCallback = dojoSniffConfig.callback || userConfig.callback || defaultConfig.callback;
+ req.boot = (bootDeps || bootCallback) ? [bootDeps || [], bootCallback] : 0;
+ }
+ if(!1){
+ !req.async && req(["dojo"]);
+ req.boot && req.apply(null, req.boot);
}
+})
+(this.dojoConfig || this.djConfig || this.require || {}, {
+ async:0,
+ hasCache:{
+ 'config-selectorEngine':"acme",
+ 'config-tlmSiblingOfDojo':1,
+ 'dojo-built':1,
+ 'dojo-loader':1,
+ dom:1,
+ 'host-browser':1
+ },
+ packages:[
+ {
+ location:"../dijit",
+ name:"dijit"
+ },
+ {
+ location:".",
+ name:"dojo"
+ }
+ ]
+});require({cache:{
+'dojo/_base/fx':function(){
+define(["./kernel", "./lang", "../Evented", "./Color", "./connect", "./sniff", "../dom", "../dom-style"], function(dojo, lang, Evented, Color, connect, has, dom, style){
+ // module:
+ // dojo/_base/fx
+ // summary:
+ // This module defines the base dojo.fx implementation.
+ // notes:
+ // Animation loosely package based on Dan Pupius' work, contributed under CLA; see
+ // http://pupius.co.uk/js/Toolkit.Drawing.js
+
+ var _mixin = lang.mixin;
- dojo["eval"] = function(/*String*/ scriptFragment){
+ dojo._Line = function(/*int*/ start, /*int*/ end){
// summary:
- // A legacy method created for use exclusively by internal Dojo methods. Do not use
- // this method directly, the behavior of this eval will differ from the normal
- // browser eval.
+ // dojo._Line is the object used to generate values from a start value
+ // to an end value
+ // start: int
+ // Beginning value for range
+ // end: int
+ // Ending value for range
+ this.start = start;
+ this.end = end;
+ };
+
+ dojo._Line.prototype.getValue = function(/*float*/ n){
+ // summary: Returns the point on the line
+ // n: a floating point number greater than 0 and less than 1
+ return ((this.end - this.start) * n) + this.start; // Decimal
+ };
+
+ dojo.Animation = function(args){
+ // summary:
+ // A generic animation class that fires callbacks into its handlers
+ // object at various states.
// description:
- // Placed in a separate function to minimize size of trapped
- // exceptions. Calling eval() directly from some other scope may
- // complicate tracebacks on some platforms.
- // returns:
- // The result of the evaluation. Often `undefined`
- return d.global.eval ? d.global.eval(scriptFragment) : eval(scriptFragment); // Object
- }
+ // A generic animation class that fires callbacks into its handlers
+ // object at various states. Nearly all dojo animation functions
+ // return an instance of this method, usually without calling the
+ // .play() method beforehand. Therefore, you will likely need to
+ // call .play() on instances of `dojo.Animation` when one is
+ // returned.
+ // args: Object
+ // The 'magic argument', mixing all the properties into this
+ // animation instance.
- /*=====
- dojo.deprecated = function(behaviour, extra, removal){
- // summary:
- // Log a debug message to indicate that a behavior has been
- // deprecated.
- // behaviour: String
- // The API or behavior being deprecated. Usually in the form
- // of "myApp.someFunction()".
- // extra: String?
- // Text to append to the message. Often provides advice on a
- // new function or facility to achieve the same goal during
- // the deprecation period.
- // removal: String?
- // Text to indicate when in the future the behavior will be
- // removed. Usually a version number.
- // example:
- // | dojo.deprecated("myApp.getTemp()", "use myApp.getLocaleTemp() instead", "1.0");
+ _mixin(this, args);
+ if(lang.isArray(this.curve)){
+ this.curve = new dojo._Line(this.curve[0], this.curve[1]);
}
- dojo.experimental = function(moduleName, extra){
- // summary: Marks code as experimental.
- // description:
- // This can be used to mark a function, file, or module as
- // experimental. Experimental code is not ready to be used, and the
- // APIs are subject to change without notice. Experimental code may be
- // completed deleted without going through the normal deprecation
- // process.
- // moduleName: String
- // The name of a module, or the name of a module file or a specific
- // function
- // extra: String?
- // some additional message for the user
- // example:
- // | dojo.experimental("dojo.data.Result");
- // example:
- // | dojo.experimental("dojo.weather.toKelvin()", "PENDING approval from NOAA");
- }
+ };
+ dojo.Animation.prototype = new Evented();
+ // Alias to drop come 2.0:
+ dojo._Animation = dojo.Animation;
+
+ lang.extend(dojo.Animation, {
+ // duration: Integer
+ // The time in milliseonds the animation will take to run
+ duration: 350,
+
+ /*=====
+ // curve: dojo._Line|Array
+ // A two element array of start and end values, or a `dojo._Line` instance to be
+ // used in the Animation.
+ curve: null,
+
+ // easing: Function?
+ // A Function to adjust the acceleration (or deceleration) of the progress
+ // across a dojo._Line
+ easing: null,
=====*/
- //Real functions declared in dojo._firebug.firebug.
- d.deprecated = d.experimental = function(){};
+ // repeat: Integer?
+ // The number of times to loop the animation
+ repeat: 0,
-})();
-// vim:ai:ts=4:noet
+ // rate: Integer?
+ // the time in milliseconds to wait before advancing to next frame
+ // (used as a fps timer: 1000/rate = fps)
+ rate: 20 /* 50 fps */,
-/*
- * loader.js - A bootstrap module. Runs before the hostenv_*.js file. Contains
- * all of the package loading methods.
- */
-(function(){
- var d = dojo, currentModule;
+ /*=====
+ // delay: Integer?
+ // The time in milliseconds to wait before starting animation after it
+ // has been .play()'ed
+ delay: null,
+
+ // beforeBegin: Event?
+ // Synthetic event fired before a dojo.Animation begins playing (synchronous)
+ beforeBegin: null,
+
+ // onBegin: Event?
+ // Synthetic event fired as a dojo.Animation begins playing (useful?)
+ onBegin: null,
+
+ // onAnimate: Event?
+ // Synthetic event fired at each interval of a `dojo.Animation`
+ onAnimate: null,
+
+ // onEnd: Event?
+ // Synthetic event fired after the final frame of a `dojo.Animation`
+ onEnd: null,
+
+ // onPlay: Event?
+ // Synthetic event fired any time a `dojo.Animation` is play()'ed
+ onPlay: null,
+
+ // onPause: Event?
+ // Synthetic event fired when a `dojo.Animation` is paused
+ onPause: null,
+
+ // onStop: Event
+ // Synthetic event fires when a `dojo.Animation` is stopped
+ onStop: null,
+
+ =====*/
+
+ _percent: 0,
+ _startRepeatCount: 0,
+
+ _getStep: function(){
+ var _p = this._percent,
+ _e = this.easing
+ ;
+ return _e ? _e(_p) : _p;
+ },
+ _fire: function(/*Event*/ evt, /*Array?*/ args){
+ // summary:
+ // Convenience function. Fire event "evt" and pass it the
+ // arguments specified in "args".
+ // description:
+ // Convenience function. Fire event "evt" and pass it the
+ // arguments specified in "args".
+ // Fires the callback in the scope of the `dojo.Animation`
+ // instance.
+ // evt:
+ // The event to fire.
+ // args:
+ // The arguments to pass to the event.
+ var a = args||[];
+ if(this[evt]){
+ if(dojo.config.debugAtAllCosts){
+ this[evt].apply(this, a);
+ }else{
+ try{
+ this[evt].apply(this, a);
+ }catch(e){
+ // squelch and log because we shouldn't allow exceptions in
+ // synthetic event handlers to cause the internal timer to run
+ // amuck, potentially pegging the CPU. I'm not a fan of this
+ // squelch, but hopefully logging will make it clear what's
+ // going on
+ console.error("exception in animation handler for:", evt);
+ console.error(e);
+ }
+ }
+ }
+ return this; // dojo.Animation
+ },
+
+ play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
+ // summary:
+ // Start the animation.
+ // delay:
+ // How many milliseconds to delay before starting.
+ // gotoStart:
+ // If true, starts the animation from the beginning; otherwise,
+ // starts it from its current position.
+ // returns: dojo.Animation
+ // The instance to allow chaining.
+
+ var _t = this;
+ if(_t._delayTimer){ _t._clearTimer(); }
+ if(gotoStart){
+ _t._stopTimer();
+ _t._active = _t._paused = false;
+ _t._percent = 0;
+ }else if(_t._active && !_t._paused){
+ return _t;
+ }
+
+ _t._fire("beforeBegin", [_t.node]);
- d.mixin(d, {
- _loadedModules: {},
- _inFlightCount: 0,
- _hasResource: {},
+ var de = delay || _t.delay,
+ _p = lang.hitch(_t, "_play", gotoStart);
- _modulePrefixes: {
- dojo: { name: "dojo", value: "." },
- // dojox: { name: "dojox", value: "../dojox" },
- // dijit: { name: "dijit", value: "../dijit" },
- doh: { name: "doh", value: "../util/doh" },
- tests: { name: "tests", value: "tests" }
+ if(de > 0){
+ _t._delayTimer = setTimeout(_p, de);
+ return _t;
+ }
+ _p();
+ return _t; // dojo.Animation
},
- _moduleHasPrefix: function(/*String*/module){
- // summary: checks to see if module has been established
- var mp = d._modulePrefixes;
- return !!(mp[module] && mp[module].value); // Boolean
+ _play: function(gotoStart){
+ var _t = this;
+ if(_t._delayTimer){ _t._clearTimer(); }
+ _t._startTime = new Date().valueOf();
+ if(_t._paused){
+ _t._startTime -= _t.duration * _t._percent;
+ }
+
+ _t._active = true;
+ _t._paused = false;
+ var value = _t.curve.getValue(_t._getStep());
+ if(!_t._percent){
+ if(!_t._startRepeatCount){
+ _t._startRepeatCount = _t.repeat;
+ }
+ _t._fire("onBegin", [value]);
+ }
+
+ _t._fire("onPlay", [value]);
+
+ _t._cycle();
+ return _t; // dojo.Animation
+ },
+
+ pause: function(){
+ // summary: Pauses a running animation.
+ var _t = this;
+ if(_t._delayTimer){ _t._clearTimer(); }
+ _t._stopTimer();
+ if(!_t._active){ return _t; /*dojo.Animation*/ }
+ _t._paused = true;
+ _t._fire("onPause", [_t.curve.getValue(_t._getStep())]);
+ return _t; // dojo.Animation
+ },
+
+ gotoPercent: function(/*Decimal*/ percent, /*Boolean?*/ andPlay){
+ // summary:
+ // Sets the progress of the animation.
+ // percent:
+ // A percentage in decimal notation (between and including 0.0 and 1.0).
+ // andPlay:
+ // If true, play the animation after setting the progress.
+ var _t = this;
+ _t._stopTimer();
+ _t._active = _t._paused = true;
+ _t._percent = percent;
+ if(andPlay){ _t.play(); }
+ return _t; // dojo.Animation
+ },
+
+ stop: function(/*boolean?*/ gotoEnd){
+ // summary: Stops a running animation.
+ // gotoEnd: If true, the animation will end.
+ var _t = this;
+ if(_t._delayTimer){ _t._clearTimer(); }
+ if(!_t._timer){ return _t; /* dojo.Animation */ }
+ _t._stopTimer();
+ if(gotoEnd){
+ _t._percent = 1;
+ }
+ _t._fire("onStop", [_t.curve.getValue(_t._getStep())]);
+ _t._active = _t._paused = false;
+ return _t; // dojo.Animation
},
- _getModulePrefix: function(/*String*/module){
- // summary: gets the prefix associated with module
- var mp = d._modulePrefixes;
- if(d._moduleHasPrefix(module)){
- return mp[module].value; // String
+ status: function(){
+ // summary:
+ // Returns a string token representation of the status of
+ // the animation, one of: "paused", "playing", "stopped"
+ if(this._active){
+ return this._paused ? "paused" : "playing"; // String
}
- return module; // String
+ return "stopped"; // String
},
- _loadedUrls: [],
+ _cycle: function(){
+ var _t = this;
+ if(_t._active){
+ var curr = new Date().valueOf();
+ var step = (curr - _t._startTime) / (_t.duration);
- //WARNING:
- // This variable is referenced by packages outside of bootstrap:
- // FloatingPane.js and undo/browser.js
- _postLoad: false,
+ if(step >= 1){
+ step = 1;
+ }
+ _t._percent = step;
+
+ // Perform easing
+ if(_t.easing){
+ step = _t.easing(step);
+ }
+
+ _t._fire("onAnimate", [_t.curve.getValue(step)]);
+
+ if(_t._percent < 1){
+ _t._startTimer();
+ }else{
+ _t._active = false;
+
+ if(_t.repeat > 0){
+ _t.repeat--;
+ _t.play(null, true);
+ }else if(_t.repeat == -1){
+ _t.play(null, true);
+ }else{
+ if(_t._startRepeatCount){
+ _t.repeat = _t._startRepeatCount;
+ _t._startRepeatCount = 0;
+ }
+ }
+ _t._percent = 0;
+ _t._fire("onEnd", [_t.node]);
+ !_t.repeat && _t._stopTimer();
+ }
+ }
+ return _t; // dojo.Animation
+ },
+
+ _clearTimer: function(){
+ // summary: Clear the play delay timer
+ clearTimeout(this._delayTimer);
+ delete this._delayTimer;
+ }
- //Egad! Lots of test files push on this directly instead of using dojo.addOnLoad.
- _loaders: [],
- _unloaders: [],
- _loadNotifying: false
});
+ // the local timer, stubbed into all Animation instances
+ var ctr = 0,
+ timer = null,
+ runner = {
+ run: function(){}
+ };
- dojo._loadPath = function(/*String*/relpath, /*String?*/module, /*Function?*/cb){
- // summary:
- // Load a Javascript module given a relative path
- //
- // description:
- // Loads and interprets the script located at relpath, which is
- // relative to the script root directory. If the script is found but
- // its interpretation causes a runtime exception, that exception is
- // not caught by us, so the caller will see it. We return a true
- // value if and only if the script is found.
- //
- // relpath:
- // A relative path to a script (no leading '/', and typically ending
- // in '.js').
- // module:
- // A module whose existance to check for after loading a path. Can be
- // used to determine success or failure of the load.
- // cb:
- // a callback function to pass the result of evaluating the script
-
- var uri = ((relpath.charAt(0) == '/' || relpath.match(/^\w+:/)) ? "" : d.baseUrl) + relpath;
- try{
- currentModule = module;
- return !module ? d._loadUri(uri, cb) : d._loadUriAndCheck(uri, module, cb); // Boolean
- }catch(e){
- console.error(e);
- return false; // Boolean
- }finally{
- currentModule = null;
+ lang.extend(dojo.Animation, {
+
+ _startTimer: function(){
+ if(!this._timer){
+ this._timer = connect.connect(runner, "run", this, "_cycle");
+ ctr++;
+ }
+ if(!timer){
+ timer = setInterval(lang.hitch(runner, "run"), this.rate);
+ }
+ },
+
+ _stopTimer: function(){
+ if(this._timer){
+ connect.disconnect(this._timer);
+ this._timer = null;
+ ctr--;
+ }
+ if(ctr <= 0){
+ clearInterval(timer);
+ timer = null;
+ ctr = 0;
+ }
}
- }
- dojo._loadUri = function(/*String*/uri, /*Function?*/cb){
+ });
+
+ var _makeFadeable =
+ has("ie") ? function(node){
+ // only set the zoom if the "tickle" value would be the same as the
+ // default
+ var ns = node.style;
+ // don't set the width to auto if it didn't already cascade that way.
+ // We don't want to f anyones designs
+ if(!ns.width.length && style.get(node, "width") == "auto"){
+ ns.width = "auto";
+ }
+ } :
+ function(){};
+
+ dojo._fade = function(/*Object*/ args){
// summary:
- // Loads JavaScript from a URI
- // description:
- // Reads the contents of the URI, and evaluates the contents. This is
- // used to load modules as well as resource bundles. Returns true if
- // it succeeded. Returns false if the URI reading failed. Throws if
- // the evaluation throws.
- // uri: a uri which points at the script to be loaded
- // cb:
- // a callback function to process the result of evaluating the script
- // as an expression, typically used by the resource bundle loader to
- // load JSON-style resources
-
- if(d._loadedUrls[uri]){
- return true; // Boolean
- }
- d._inFlightCount++; // block addOnLoad calls that arrive while we're busy downloading
- var contents = d._getText(uri, true);
- if(contents){ // not 404, et al
- d._loadedUrls[uri] = true;
- d._loadedUrls.push(uri);
- if(cb){
- //conditional to support script-inject i18n bundle format
- contents = /^define\(/.test(contents) ? contents : '('+contents+')';
- }else{
- //Only do the scoping if no callback. If a callback is specified,
- //it is most likely the i18n bundle stuff.
- contents = d._scopePrefix + contents + d._scopeSuffix;
- }
- if(!d.isIE){ contents += "\r\n//@ sourceURL=" + uri; } // debugging assist for Firebug
- var value = d["eval"](contents);
- if(cb){ cb(value); }
- }
- // Check to see if we need to call _callLoaded() due to an addOnLoad() that arrived while we were busy downloading
- if(--d._inFlightCount == 0 && d._postLoad && d._loaders.length){
- // We shouldn't be allowed to get here but Firefox allows an event
- // (mouse, keybd, async xhrGet) to interrupt a synchronous xhrGet.
- // If the current script block contains multiple require() statements, then after each
- // require() returns, inFlightCount == 0, but we want to hold the _callLoaded() until
- // all require()s are done since the out-of-sequence addOnLoad() presumably needs them all.
- // setTimeout allows the next require() to start (if needed), and then we check this again.
- setTimeout(function(){
- // If inFlightCount > 0, then multiple require()s are running sequentially and
- // the next require() started after setTimeout() was executed but before we got here.
- if(d._inFlightCount == 0){
- d._callLoaded();
- }
- }, 0);
- }
- return !!contents; // Boolean: contents? true : false
- }
-
- // FIXME: probably need to add logging to this method
- dojo._loadUriAndCheck = function(/*String*/uri, /*String*/moduleName, /*Function?*/cb){
- // summary: calls loadUri then findModule and returns true if both succeed
- var ok = false;
- try{
- ok = d._loadUri(uri, cb);
- }catch(e){
- console.error("failed loading " + uri + " with error: " + e);
- }
- return !!(ok && d._loadedModules[moduleName]); // Boolean
- }
+ // Returns an animation that will fade the node defined by
+ // args.node from the start to end values passed (args.start
+ // args.end) (end is mandatory, start is optional)
- dojo.loaded = function(){
- // summary:
- // signal fired when initial environment and package loading is
- // complete. You should use dojo.addOnLoad() instead of doing a
- // direct dojo.connect() to this method in order to handle
- // initialization tasks that require the environment to be
- // initialized. In a browser host, declarative widgets will
- // be constructed when this function finishes runing.
- d._loadNotifying = true;
- d._postLoad = true;
- var mll = d._loaders;
+ args.node = dom.byId(args.node);
+ var fArgs = _mixin({ properties: {} }, args),
+ props = (fArgs.properties.opacity = {});
- //Clear listeners so new ones can be added
- //For other xdomain package loads after the initial load.
- d._loaders = [];
+ props.start = !("start" in fArgs) ?
+ function(){
+ return +style.get(fArgs.node, "opacity")||0;
+ } : fArgs.start;
+ props.end = fArgs.end;
- for(var x = 0; x < mll.length; x++){
- mll[x]();
- }
+ var anim = dojo.animateProperty(fArgs);
+ connect.connect(anim, "beforeBegin", lang.partial(_makeFadeable, fArgs.node));
- d._loadNotifying = false;
-
- //Make sure nothing else got added to the onload queue
- //after this first run. If something did, and we are not waiting for any
- //more inflight resources, run again.
- if(d._postLoad && d._inFlightCount == 0 && mll.length){
- d._callLoaded();
- }
+ return anim; // dojo.Animation
+ };
+
+ /*=====
+ dojo.__FadeArgs = function(node, duration, easing){
+ // node: DOMNode|String
+ // The node referenced in the animation
+ // duration: Integer?
+ // Duration of the animation in milliseconds.
+ // easing: Function?
+ // An easing function.
+ this.node = node;
+ this.duration = duration;
+ this.easing = easing;
}
+ =====*/
- dojo.unloaded = function(){
+ dojo.fadeIn = function(/*dojo.__FadeArgs*/ args){
+ // summary:
+ // Returns an animation that will fade node defined in 'args' from
+ // its current opacity to fully opaque.
+ return dojo._fade(_mixin({ end: 1 }, args)); // dojo.Animation
+ };
+
+ dojo.fadeOut = function(/*dojo.__FadeArgs*/ args){
// summary:
- // signal fired by impending environment destruction. You should use
- // dojo.addOnUnload() instead of doing a direct dojo.connect() to this
- // method to perform page/application cleanup methods. See
- // dojo.addOnUnload for more info.
- var mll = d._unloaders;
- while(mll.length){
- (mll.pop())();
+ // Returns an animation that will fade node defined in 'args'
+ // from its current opacity to fully transparent.
+ return dojo._fade(_mixin({ end: 0 }, args)); // dojo.Animation
+ };
+
+ dojo._defaultEasing = function(/*Decimal?*/ n){
+ // summary: The default easing function for dojo.Animation(s)
+ return 0.5 + ((Math.sin((n + 1.5) * Math.PI)) / 2); // Decimal
+ };
+
+ var PropLine = function(properties){
+ // PropLine is an internal class which is used to model the values of
+ // an a group of CSS properties across an animation lifecycle. In
+ // particular, the "getValue" function handles getting interpolated
+ // values between start and end for a particular CSS value.
+ this._properties = properties;
+ for(var p in properties){
+ var prop = properties[p];
+ if(prop.start instanceof Color){
+ // create a reusable temp color object to keep intermediate results
+ prop.tempColor = new Color();
+ }
}
- }
+ };
- d._onto = function(arr, obj, fn){
- if(!fn){
- arr.push(obj);
- }else if(fn){
- var func = (typeof fn == "string") ? obj[fn] : fn;
- arr.push(function(){ func.call(obj); });
+ PropLine.prototype.getValue = function(r){
+ var ret = {};
+ for(var p in this._properties){
+ var prop = this._properties[p],
+ start = prop.start;
+ if(start instanceof Color){
+ ret[p] = Color.blendColors(start, prop.end, r, prop.tempColor).toCss();
+ }else if(!lang.isArray(start)){
+ ret[p] = ((prop.end - start) * r) + start + (p != "opacity" ? prop.units || "px" : 0);
+ }
}
- }
+ return ret;
+ };
- dojo.ready = dojo.addOnLoad = function(/*Object*/obj, /*String|Function?*/functionName){
+ /*=====
+ dojo.declare("dojo.__AnimArgs", [dojo.__FadeArgs], {
+ // Properties: Object?
+ // A hash map of style properties to Objects describing the transition,
+ // such as the properties of dojo._Line with an additional 'units' property
+ properties: {}
+
+ //TODOC: add event callbacks
+ });
+ =====*/
+
+ dojo.animateProperty = function(/*dojo.__AnimArgs*/ args){
// summary:
- // Registers a function to be triggered after the DOM and dojo.require() calls
- // have finished loading.
+ // Returns an animation that will transition the properties of
+ // node defined in `args` depending how they are defined in
+ // `args.properties`
//
// description:
- // Registers a function to be triggered after the DOM has finished
- // loading and `dojo.require` modules have loaded. Widgets declared in markup
- // have been instantiated if `djConfig.parseOnLoad` is true when this fires.
+ // `dojo.animateProperty` is the foundation of most `dojo.fx`
+ // animations. It takes an object of "properties" corresponding to
+ // style properties, and animates them in parallel over a set
+ // duration.
//
- // Images and CSS files may or may not have finished downloading when
- // the specified function is called. (Note that widgets' CSS and HTML
- // code is guaranteed to be downloaded before said widgets are
- // instantiated, though including css resouces BEFORE any script elements
- // is highly recommended).
+ // example:
+ // A simple animation that changes the width of the specified node.
+ // | dojo.animateProperty({
+ // | node: "nodeId",
+ // | properties: { width: 400 },
+ // | }).play();
+ // Dojo figures out the start value for the width and converts the
+ // integer specified for the width to the more expressive but
+ // verbose form `{ width: { end: '400', units: 'px' } }` which you
+ // can also specify directly. Defaults to 'px' if ommitted.
//
// example:
- // Register an anonymous function to run when everything is ready
- // | dojo.addOnLoad(function(){ doStuff(); });
+ // Animate width, height, and padding over 2 seconds... the
+ // pedantic way:
+ // | dojo.animateProperty({ node: node, duration:2000,
+ // | properties: {
+ // | width: { start: '200', end: '400', units:"px" },
+ // | height: { start:'200', end: '400', units:"px" },
+ // | paddingTop: { start:'5', end:'50', units:"px" }
+ // | }
+ // | }).play();
+ // Note 'paddingTop' is used over 'padding-top'. Multi-name CSS properties
+ // are written using "mixed case", as the hyphen is illegal as an object key.
//
// example:
- // Register a function to run when everything is ready by pointer:
- // | var init = function(){ doStuff(); }
- // | dojo.addOnLoad(init);
+ // Plug in a different easing function and register a callback for
+ // when the animation ends. Easing functions accept values between
+ // zero and one and return a value on that basis. In this case, an
+ // exponential-in curve.
+ // | dojo.animateProperty({
+ // | node: "nodeId",
+ // | // dojo figures out the start value
+ // | properties: { width: { end: 400 } },
+ // | easing: function(n){
+ // | return (n==0) ? 0 : Math.pow(2, 10 * (n - 1));
+ // | },
+ // | onEnd: function(node){
+ // | // called when the animation finishes. The animation
+ // | // target is passed to this function
+ // | }
+ // | }).play(500); // delay playing half a second
+ //
+ // example:
+ // Like all `dojo.Animation`s, animateProperty returns a handle to the
+ // Animation instance, which fires the events common to Dojo FX. Use `dojo.connect`
+ // to access these events outside of the Animation definiton:
+ // | var anim = dojo.animateProperty({
+ // | node:"someId",
+ // | properties:{
+ // | width:400, height:500
+ // | }
+ // | });
+ // | dojo.connect(anim,"onEnd", function(){
+ // | console.log("animation ended");
+ // | });
+ // | // play the animation now:
+ // | anim.play();
//
// example:
- // Register a function to run scoped to `object`, either by name or anonymously:
- // | dojo.addOnLoad(object, "functionName");
- // | dojo.addOnLoad(object, function(){ doStuff(); });
+ // Each property can be a function whose return value is substituted along.
+ // Additionally, each measurement (eg: start, end) can be a function. The node
+ // reference is passed direcly to callbacks.
+ // | dojo.animateProperty({
+ // | node:"mine",
+ // | properties:{
+ // | height:function(node){
+ // | // shrink this node by 50%
+ // | return dojo.position(node).h / 2
+ // | },
+ // | width:{
+ // | start:function(node){ return 100; },
+ // | end:function(node){ return 200; }
+ // | }
+ // | }
+ // | }).play();
+ //
- d._onto(d._loaders, obj, functionName);
+ var n = args.node = dom.byId(args.node);
+ if(!args.easing){ args.easing = dojo._defaultEasing; }
- //Added for xdomain loading. dojo.addOnLoad is used to
- //indicate callbacks after doing some dojo.require() statements.
- //In the xdomain case, if all the requires are loaded (after initial
- //page load), then immediately call any listeners.
- if(d._postLoad && d._inFlightCount == 0 && !d._loadNotifying){
- d._callLoaded();
- }
- }
+ var anim = new dojo.Animation(args);
+ connect.connect(anim, "beforeBegin", anim, function(){
+ var pm = {};
+ for(var p in this.properties){
+ // Make shallow copy of properties into pm because we overwrite
+ // some values below. In particular if start/end are functions
+ // we don't want to overwrite them or the functions won't be
+ // called if the animation is reused.
+ if(p == "width" || p == "height"){
+ this.node.display = "block";
+ }
+ var prop = this.properties[p];
+ if(lang.isFunction(prop)){
+ prop = prop(n);
+ }
+ prop = pm[p] = _mixin({}, (lang.isObject(prop) ? prop: { end: prop }));
- //Support calling dojo.addOnLoad via djConfig.addOnLoad. Support all the
- //call permutations of dojo.addOnLoad. Mainly useful when dojo is added
- //to the page after the page has loaded.
- var dca = d.config.addOnLoad;
- if(dca){
- d.addOnLoad[(dca instanceof Array ? "apply" : "call")](d, dca);
- }
+ if(lang.isFunction(prop.start)){
+ prop.start = prop.start(n);
+ }
+ if(lang.isFunction(prop.end)){
+ prop.end = prop.end(n);
+ }
+ var isColor = (p.toLowerCase().indexOf("color") >= 0);
+ function getStyle(node, p){
+ // dojo.style(node, "height") can return "auto" or "" on IE; this is more reliable:
+ var v = { height: node.offsetHeight, width: node.offsetWidth }[p];
+ if(v !== undefined){ return v; }
+ v = style.get(node, p);
+ return (p == "opacity") ? +v : (isColor ? v : parseFloat(v));
+ }
+ if(!("end" in prop)){
+ prop.end = getStyle(n, p);
+ }else if(!("start" in prop)){
+ prop.start = getStyle(n, p);
+ }
- dojo._modulesLoaded = function(){
- if(d._postLoad){ return; }
- if(d._inFlightCount > 0){
- console.warn("files still in flight!");
- return;
- }
- d._callLoaded();
- }
+ if(isColor){
+ prop.start = new Color(prop.start);
+ prop.end = new Color(prop.end);
+ }else{
+ prop.start = (p == "opacity") ? +prop.start : parseFloat(prop.start);
+ }
+ }
+ this.curve = new PropLine(pm);
+ });
+ connect.connect(anim, "onAnimate", lang.hitch(style, "set", anim.node));
+ return anim; // dojo.Animation
+ };
- dojo._callLoaded = function(){
+ dojo.anim = function( /*DOMNode|String*/ node,
+ /*Object*/ properties,
+ /*Integer?*/ duration,
+ /*Function?*/ easing,
+ /*Function?*/ onEnd,
+ /*Integer?*/ delay){
+ // summary:
+ // A simpler interface to `dojo.animateProperty()`, also returns
+ // an instance of `dojo.Animation` but begins the animation
+ // immediately, unlike nearly every other Dojo animation API.
+ // description:
+ // `dojo.anim` is a simpler (but somewhat less powerful) version
+ // of `dojo.animateProperty`. It uses defaults for many basic properties
+ // and allows for positional parameters to be used in place of the
+ // packed "property bag" which is used for other Dojo animation
+ // methods.
+ //
+ // The `dojo.Animation` object returned from `dojo.anim` will be
+ // already playing when it is returned from this function, so
+ // calling play() on it again is (usually) a no-op.
+ // node:
+ // a DOM node or the id of a node to animate CSS properties on
+ // duration:
+ // The number of milliseconds over which the animation
+ // should run. Defaults to the global animation default duration
+ // (350ms).
+ // easing:
+ // An easing function over which to calculate acceleration
+ // and deceleration of the animation through its duration.
+ // A default easing algorithm is provided, but you may
+ // plug in any you wish. A large selection of easing algorithms
+ // are available in `dojo.fx.easing`.
+ // onEnd:
+ // A function to be called when the animation finishes
+ // running.
+ // delay:
+ // The number of milliseconds to delay beginning the
+ // animation by. The default is 0.
+ // example:
+ // Fade out a node
+ // | dojo.anim("id", { opacity: 0 });
+ // example:
+ // Fade out a node over a full second
+ // | dojo.anim("id", { opacity: 0 }, 1000);
+ return dojo.animateProperty({ // dojo.Animation
+ node: node,
+ duration: duration || dojo.Animation.prototype.duration,
+ properties: properties,
+ easing: easing,
+ onEnd: onEnd
+ }).play(delay || 0);
+ };
- // The "object" check is for IE, and the other opera check fixes an
- // issue in Opera where it could not find the body element in some
- // widget test cases. For 0.9, maybe route all browsers through the
- // setTimeout (need protection still for non-browser environments
- // though). This might also help the issue with FF 2.0 and freezing
- // issues where we try to do sync xhr while background css images are
- // being loaded (trac #2572)? Consider for 0.9.
- if(typeof setTimeout == "object" || (d.config.useXDomain && d.isOpera)){
- setTimeout(
- d.isAIR ? function(){ d.loaded(); } : d._scopeName + ".loaded();",
- 0);
- }else{
- d.loaded();
- }
- }
+ return {
+ _Line: dojo._Line,
+ Animation: dojo.Animation,
+ _fade: dojo._fade,
+ fadeIn: dojo.fadeIn,
+ fadeOut: dojo.fadeOut,
+ _defaultEasing: dojo._defaultEasing,
+ animateProperty: dojo.animateProperty,
+ anim: dojo.anim
+ };
+});
- dojo._getModuleSymbols = function(/*String*/modulename){
+},
+'dojo/dom-form':function(){
+define("dojo/dom-form", ["./_base/lang", "./dom", "./io-query", "./json"], function(lang, dom, ioq, json){
+ // module:
+ // dojo/dom-form
+ // summary:
+ // This module defines form-processing functions.
+
+ /*=====
+ dojo.fieldToObject = function(inputNode){
// summary:
- // Converts a module name in dotted JS notation to an array
- // representing the path in the source tree
- var syms = modulename.split(".");
- for(var i = syms.length; i>0; i--){
- var parentModule = syms.slice(0, i).join(".");
- if(i == 1 && !d._moduleHasPrefix(parentModule)){
- // Support default module directory (sibling of dojo) for top-level modules
- syms[0] = "../" + syms[0];
- }else{
- var parentModulePath = d._getModulePrefix(parentModule);
- if(parentModulePath != parentModule){
- syms.splice(0, i, parentModulePath);
- break;
+ // Serialize a form field to a JavaScript object.
+ // description:
+ // Returns the value encoded in a form field as
+ // as a string or an array of strings. Disabled form elements
+ // and unchecked radio and checkboxes are skipped. Multi-select
+ // elements are returned as an array of string values.
+ // inputNode: DOMNode|String
+ // returns: Object
+ };
+ =====*/
+
+ /*=====
+ dojo.formToObject = function(formNode){
+ // summary:
+ // Serialize a form node to a JavaScript object.
+ // description:
+ // Returns the values encoded in an HTML form as
+ // string properties in an object which it then returns. Disabled form
+ // elements, buttons, and other non-value form elements are skipped.
+ // Multi-select elements are returned as an array of string values.
+ // formNode: DOMNode|String
+ // returns: Object
+ //
+ // example:
+ // This form:
+ // | <form id="test_form">
+ // | <input type="text" name="blah" value="blah">
+ // | <input type="text" name="no_value" value="blah" disabled>
+ // | <input type="button" name="no_value2" value="blah">
+ // | <select type="select" multiple name="multi" size="5">
+ // | <option value="blah">blah</option>
+ // | <option value="thud" selected>thud</option>
+ // | <option value="thonk" selected>thonk</option>
+ // | </select>
+ // | </form>
+ //
+ // yields this object structure as the result of a call to
+ // formToObject():
+ //
+ // | {
+ // | blah: "blah",
+ // | multi: [
+ // | "thud",
+ // | "thonk"
+ // | ]
+ // | };
+ };
+ =====*/
+
+ /*=====
+ dojo.formToQuery = function(formNode){
+ // summary:
+ // Returns a URL-encoded string representing the form passed as either a
+ // node or string ID identifying the form to serialize
+ // formNode: DOMNode|String
+ // returns: String
+ };
+ =====*/
+
+ /*=====
+ dojo.formToJson = function(formNode, prettyPrint){
+ // summary:
+ // Create a serialized JSON string from a form node or string
+ // ID identifying the form to serialize
+ // formNode: DOMNode|String
+ // prettyPrint: Boolean?
+ // returns: String
+ };
+ =====*/
+
+ function setValue(/*Object*/obj, /*String*/name, /*String*/value){
+ // summary:
+ // For the named property in object, set the value. If a value
+ // already exists and it is a string, convert the value to be an
+ // array of values.
+
+ // Skip it if there is no value
+ if(value === null){
+ return;
+ }
+
+ var val = obj[name];
+ if(typeof val == "string"){ // inline'd type check
+ obj[name] = [val, value];
+ }else if(lang.isArray(val)){
+ val.push(value);
+ }else{
+ obj[name] = value;
+ }
+ }
+
+ var exclude = "file|submit|image|reset|button";
+
+ var form = {
+ fieldToObject: function fieldToObject(/*DOMNode|String*/ inputNode){
+ var ret = null;
+ inputNode = dom.byId(inputNode);
+ if(inputNode){
+ var _in = inputNode.name, type = (inputNode.type || "").toLowerCase();
+ if(_in && type && !inputNode.disabled){
+ if(type == "radio" || type == "checkbox"){
+ if(inputNode.checked){
+ ret = inputNode.value;
+ }
+ }else if(inputNode.multiple){
+ ret = [];
+ var nodes = [inputNode.firstChild];
+ while(nodes.length){
+ for(var node = nodes.pop(); node; node = node.nextSibling){
+ if(node.nodeType == 1 && node.tagName.toLowerCase() == "option"){
+ if(node.selected){
+ ret.push(node.value);
+ }
+ }else{
+ if(node.nextSibling){
+ nodes.push(node.nextSibling);
+ }
+ if(node.firstChild){
+ nodes.push(node.firstChild);
+ }
+ break;
+ }
+ }
+ }
+ }else{
+ ret = inputNode.value;
+ }
+ }
+ }
+ return ret; // Object
+ },
+
+ toObject: function formToObject(/*DOMNode|String*/ formNode){
+ var ret = {}, elems = dom.byId(formNode).elements;
+ for(var i = 0, l = elems.length; i < l; ++i){
+ var item = elems[i], _in = item.name, type = (item.type || "").toLowerCase();
+ if(_in && type && exclude.indexOf(type) < 0 && !item.disabled){
+ setValue(ret, _in, form.fieldToObject(item));
+ if(type == "image"){
+ ret[_in + ".x"] = ret[_in + ".y"] = ret[_in].x = ret[_in].y = 0;
+ }
}
}
+ return ret; // Object
+ },
+
+ toQuery: function formToQuery(/*DOMNode|String*/ formNode){
+ return ioq.objectToQuery(form.toObject(formNode)); // String
+ },
+
+ toJson: function formToJson(/*DOMNode|String*/ formNode, /*Boolean?*/prettyPrint){
+ return json.stringify(form.toObject(formNode), null, prettyPrint ? 4 : 0); // String
}
- return syms; // Array
- }
+ };
- dojo._global_omit_module_check = false;
+ return form;
+});
- dojo.loadInit = function(/*Function*/init){
- // summary:
- // Executes a function that needs to be executed for the loader's dojo.requireIf
- // resolutions to work. This is needed mostly for the xdomain loader case where
- // a function needs to be executed to set up the possible values for a dojo.requireIf
- // call.
- // init:
- // a function reference. Executed immediately.
- // description: This function is mainly a marker for the xdomain loader to know parts of
- // code that needs be executed outside the function wrappper that is placed around modules.
- // The init function could be executed more than once, and it should make no assumptions
- // on what is loaded, or what modules are available. Only the functionality in Dojo Base
- // is allowed to be used. Avoid using this method. For a valid use case,
- // see the source for dojox.gfx.
- init();
- }
-
- dojo._loadModule = dojo.require = function(/*String*/moduleName, /*Boolean?*/omitModuleCheck){
- // summary:
- // loads a Javascript module from the appropriate URI
+},
+'dojo/_base/html':function(){
+define(["./kernel", "../dom", "../dom-style", "../dom-attr", "../dom-prop", "../dom-class", "../dom-construct", "../dom-geometry"], function(dojo, dom, style, attr, prop, cls, ctr, geom){
+ // module:
+ // dojo/dom
+ // summary:
+ // This module is a stub for the core dojo DOM API.
+
+ // mix-in dom
+ dojo.byId = dom.byId;
+ dojo.isDescendant = dom.isDescendant;
+ dojo.setSelectable = dom.setSelectable;
+
+ // mix-in dom-attr
+ dojo.getAttr = attr.get;
+ dojo.setAttr = attr.set;
+ dojo.hasAttr = attr.has;
+ dojo.removeAttr = attr.remove;
+ dojo.getNodeProp = attr.getNodeProp;
+
+ dojo.attr = function(node, name, value){
+ // summary:
+ // Gets or sets an attribute on an HTML element.
+ // description:
+ // Handles normalized getting and setting of attributes on DOM
+ // Nodes. If 2 arguments are passed, and a the second argument is a
+ // string, acts as a getter.
//
- // moduleName: String
- // module name to load, using periods for separators,
- // e.g. "dojo.date.locale". Module paths are de-referenced by dojo's
- // internal mapping of locations to names and are disambiguated by
- // longest prefix. See `dojo.registerModulePath()` for details on
- // registering new modules.
+ // If a third argument is passed, or if the second argument is a
+ // map of attributes, acts as a setter.
//
- // omitModuleCheck: Boolean?
- // if `true`, omitModuleCheck skips the step of ensuring that the
- // loaded file actually defines the symbol it is referenced by.
- // For example if it called as `dojo.require("a.b.c")` and the
- // file located at `a/b/c.js` does not define an object `a.b.c`,
- // and exception will be throws whereas no exception is raised
- // when called as `dojo.require("a.b.c", true)`
+ // When passing functions as values, note that they will not be
+ // directly assigned to slots on the node, but rather the default
+ // behavior will be removed and the new behavior will be added
+ // using `dojo.connect()`, meaning that event handler properties
+ // will be normalized and that some caveats with regards to
+ // non-standard behaviors for onsubmit apply. Namely that you
+ // should cancel form submission using `dojo.stopEvent()` on the
+ // passed event object instead of returning a boolean value from
+ // the handler itself.
+ // node: DOMNode|String
+ // id or reference to the element to get or set the attribute on
+ // name: String|Object
+ // the name of the attribute to get or set.
+ // value: String?
+ // The value to set for the attribute
+ // returns:
+ // when used as a getter, the value of the requested attribute
+ // or null if that attribute does not have a specified or
+ // default value;
//
- // description:
- // Modules are loaded via dojo.require by using one of two loaders: the normal loader
- // and the xdomain loader. The xdomain loader is used when dojo was built with a
- // custom build that specified loader=xdomain and the module lives on a modulePath
- // that is a whole URL, with protocol and a domain. The versions of Dojo that are on
- // the Google and AOL CDNs use the xdomain loader.
+ // when used as a setter, the DOM node
//
- // If the module is loaded via the xdomain loader, it is an asynchronous load, since
- // the module is added via a dynamically created script tag. This
- // means that dojo.require() can return before the module has loaded. However, this
- // should only happen in the case where you do dojo.require calls in the top-level
- // HTML page, or if you purposely avoid the loader checking for dojo.require
- // dependencies in your module by using a syntax like dojo["require"] to load the module.
+ // example:
+ // | // get the current value of the "foo" attribute on a node
+ // | dojo.attr(dojo.byId("nodeId"), "foo");
+ // | // or we can just pass the id:
+ // | dojo.attr("nodeId", "foo");
//
- // Sometimes it is useful to not have the loader detect the dojo.require calls in the
- // module so that you can dynamically load the modules as a result of an action on the
- // page, instead of right at module load time.
+ // example:
+ // | // use attr() to set the tab index
+ // | dojo.attr("nodeId", "tabIndex", 3);
+ // |
//
- // Also, for script blocks in an HTML page, the loader does not pre-process them, so
- // it does not know to download the modules before the dojo.require calls occur.
+ // example:
+ // Set multiple values at once, including event handlers:
+ // | dojo.attr("formId", {
+ // | "foo": "bar",
+ // | "tabIndex": -1,
+ // | "method": "POST",
+ // | "onsubmit": function(e){
+ // | // stop submitting the form. Note that the IE behavior
+ // | // of returning true or false will have no effect here
+ // | // since our handler is connect()ed to the built-in
+ // | // onsubmit behavior and so we need to use
+ // | // dojo.stopEvent() to ensure that the submission
+ // | // doesn't proceed.
+ // | dojo.stopEvent(e);
+ // |
+ // | // submit the form with Ajax
+ // | dojo.xhrPost({ form: "formId" });
+ // | }
+ // | });
//
- // So, in those two cases, when you want on-the-fly module loading or for script blocks
- // in the HTML page, special care must be taken if the dojo.required code is loaded
- // asynchronously. To make sure you can execute code that depends on the dojo.required
- // modules, be sure to add the code that depends on the modules in a dojo.addOnLoad()
- // callback. dojo.addOnLoad waits for all outstanding modules to finish loading before
- // executing.
+ // example:
+ // Style is s special case: Only set with an object hash of styles
+ // | dojo.attr("someNode",{
+ // | id:"bar",
+ // | style:{
+ // | width:"200px", height:"100px", color:"#000"
+ // | }
+ // | });
//
- // This type of syntax works with both xdomain and normal loaders, so it is good
- // practice to always use this idiom for on-the-fly code loading and in HTML script
- // blocks. If at some point you change loaders and where the code is loaded from,
- // it will all still work.
+ // example:
+ // Again, only set style as an object hash of styles:
+ // | var obj = { color:"#fff", backgroundColor:"#000" };
+ // | dojo.attr("someNode", "style", obj);
+ // |
+ // | // though shorter to use `dojo.style()` in this case:
+ // | dojo.style("someNode", obj);
+
+ if(arguments.length == 2){
+ return attr[typeof name == "string" ? "get" : "set"](node, name);
+ }
+ return attr.set(node, name, value);
+ };
+
+ // mix-in dom-class
+ dojo.hasClass = cls.contains;
+ dojo.addClass = cls.add;
+ dojo.removeClass = cls.remove;
+ dojo.toggleClass = cls.toggle;
+ dojo.replaceClass = cls.replace;
+
+ // mix-in dom-construct
+ dojo._toDom = dojo.toDom = ctr.toDom;
+ dojo.place = ctr.place;
+ dojo.create = ctr.create;
+ dojo.empty = function(node){ ctr.empty(node); };
+ dojo._destroyElement = dojo.destroy = function(node){ ctr.destroy(node); };
+
+ // mix-in dom-geometry
+ dojo._getPadExtents = dojo.getPadExtents = geom.getPadExtents;
+ dojo._getBorderExtents = dojo.getBorderExtents = geom.getBorderExtents;
+ dojo._getPadBorderExtents = dojo.getPadBorderExtents = geom.getPadBorderExtents;
+ dojo._getMarginExtents = dojo.getMarginExtents = geom.getMarginExtents;
+ dojo._getMarginSize = dojo.getMarginSize = geom.getMarginSize;
+ dojo._getMarginBox = dojo.getMarginBox = geom.getMarginBox;
+ dojo.setMarginBox = geom.setMarginBox;
+ dojo._getContentBox = dojo.getContentBox = geom.getContentBox;
+ dojo.setContentSize = geom.setContentSize;
+ dojo._isBodyLtr = dojo.isBodyLtr = geom.isBodyLtr;
+ dojo._docScroll = dojo.docScroll = geom.docScroll;
+ dojo._getIeDocumentElementOffset = dojo.getIeDocumentElementOffset = geom.getIeDocumentElementOffset;
+ dojo._fixIeBiDiScrollLeft = dojo.fixIeBiDiScrollLeft = geom.fixIeBiDiScrollLeft;
+ dojo.position = geom.position;
+
+ dojo.marginBox = function marginBox(/*DomNode|String*/node, /*Object?*/box){
+ // summary:
+ // Getter/setter for the margin-box of node.
+ // description:
+ // Getter/setter for the margin-box of node.
+ // Returns an object in the expected format of box (regardless
+ // if box is passed). The object might look like:
+ // `{ l: 50, t: 200, w: 300: h: 150 }`
+ // for a node offset from its parent 50px to the left, 200px from
+ // the top with a margin width of 300px and a margin-height of
+ // 150px.
+ // node:
+ // id or reference to DOM Node to get/set box for
+ // box:
+ // If passed, denotes that dojo.marginBox() should
+ // update/set the margin box for node. Box is an object in the
+ // above format. All properties are optional if passed.
+ // example:
+ // Retrieve the margin box of a passed node
+ // | var box = dojo.marginBox("someNodeId");
+ // | console.dir(box);
//
- // More on how dojo.require
- // `dojo.require("A.B")` first checks to see if symbol A.B is
- // defined. If it is, it is simply returned (nothing to do).
+ // example:
+ // Set a node's margin box to the size of another node
+ // | var box = dojo.marginBox("someNodeId");
+ // | dojo.marginBox("someOtherNode", box);
+ return box ? geom.setMarginBox(node, box) : geom.getMarginBox(node); // Object
+ };
+
+ dojo.contentBox = function contentBox(/*DomNode|String*/node, /*Object?*/box){
+ // summary:
+ // Getter/setter for the content-box of node.
+ // description:
+ // Returns an object in the expected format of box (regardless if box is passed).
+ // The object might look like:
+ // `{ l: 50, t: 200, w: 300: h: 150 }`
+ // for a node offset from its parent 50px to the left, 200px from
+ // the top with a content width of 300px and a content-height of
+ // 150px. Note that the content box may have a much larger border
+ // or margin box, depending on the box model currently in use and
+ // CSS values set/inherited for node.
+ // While the getter will return top and left values, the
+ // setter only accepts setting the width and height.
+ // node:
+ // id or reference to DOM Node to get/set box for
+ // box:
+ // If passed, denotes that dojo.contentBox() should
+ // update/set the content box for node. Box is an object in the
+ // above format, but only w (width) and h (height) are supported.
+ // All properties are optional if passed.
+ return box ? geom.setContentSize(node, box) : geom.getContentBox(node); // Object
+ };
+
+ dojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){
+ // summary:
+ // Deprecated: Use position() for border-box x/y/w/h
+ // or marginBox() for margin-box w/h/l/t.
+ // Returns an object representing a node's size and position.
//
- // If it is not defined, it will look for `A/B.js` in the script root
- // directory.
+ // description:
+ // Returns an object that measures margin-box (w)idth/(h)eight
+ // and absolute position x/y of the border-box. Also returned
+ // is computed (l)eft and (t)op values in pixels from the
+ // node's offsetParent as returned from marginBox().
+ // Return value will be in the form:
+ //| { l: 50, t: 200, w: 300: h: 150, x: 100, y: 300 }
+ // Does not act as a setter. If includeScroll is passed, the x and
+ // y params are affected as one would expect in dojo.position().
+ dojo.deprecated("dojo.coords()", "Use dojo.position() or dojo.marginBox().");
+ node = dom.byId(node);
+ var s = style.getComputedStyle(node), mb = geom.getMarginBox(node, s);
+ var abs = geom.position(node, includeScroll);
+ mb.x = abs.x;
+ mb.y = abs.y;
+ return mb; // Object
+ };
+
+ // mix-in dom-prop
+ dojo.getProp = prop.get;
+ dojo.setProp = prop.set;
+
+ dojo.prop = function(/*DomNode|String*/node, /*String|Object*/name, /*String?*/value){
+ // summary:
+ // Gets or sets a property on an HTML element.
+ // description:
+ // Handles normalized getting and setting of properties on DOM
+ // Nodes. If 2 arguments are passed, and a the second argument is a
+ // string, acts as a getter.
//
- // `dojo.require` throws an exception if it cannot find a file
- // to load, or if the symbol `A.B` is not defined after loading.
+ // If a third argument is passed, or if the second argument is a
+ // map of attributes, acts as a setter.
//
- // It returns the object `A.B`, but note the caveats above about on-the-fly loading and
- // HTML script blocks when the xdomain loader is loading a module.
+ // When passing functions as values, note that they will not be
+ // directly assigned to slots on the node, but rather the default
+ // behavior will be removed and the new behavior will be added
+ // using `dojo.connect()`, meaning that event handler properties
+ // will be normalized and that some caveats with regards to
+ // non-standard behaviors for onsubmit apply. Namely that you
+ // should cancel form submission using `dojo.stopEvent()` on the
+ // passed event object instead of returning a boolean value from
+ // the handler itself.
+ // node:
+ // id or reference to the element to get or set the property on
+ // name:
+ // the name of the property to get or set.
+ // value:
+ // The value to set for the property
+ // returns:
+ // when used as a getter, the value of the requested property
+ // or null if that attribute does not have a specified or
+ // default value;
//
- // `dojo.require()` does nothing about importing symbols into
- // the current namespace. It is presumed that the caller will
- // take care of that.
+ // when used as a setter, the DOM node
//
- // example:
- // To use dojo.require in conjunction with dojo.ready:
+ // example:
+ // | // get the current value of the "foo" property on a node
+ // | dojo.prop(dojo.byId("nodeId"), "foo");
+ // | // or we can just pass the id:
+ // | dojo.prop("nodeId", "foo");
//
- // | dojo.require("foo");
- // | dojo.require("bar");
- // | dojo.addOnLoad(function(){
- // | //you can now safely do something with foo and bar
- // | });
+ // example:
+ // | // use prop() to set the tab index
+ // | dojo.prop("nodeId", "tabIndex", 3);
+ // |
//
- // example:
- // For example, to import all symbols into a local block, you might write:
+ // example:
+ // Set multiple values at once, including event handlers:
+ // | dojo.prop("formId", {
+ // | "foo": "bar",
+ // | "tabIndex": -1,
+ // | "method": "POST",
+ // | "onsubmit": function(e){
+ // | // stop submitting the form. Note that the IE behavior
+ // | // of returning true or false will have no effect here
+ // | // since our handler is connect()ed to the built-in
+ // | // onsubmit behavior and so we need to use
+ // | // dojo.stopEvent() to ensure that the submission
+ // | // doesn't proceed.
+ // | dojo.stopEvent(e);
+ // |
+ // | // submit the form with Ajax
+ // | dojo.xhrPost({ form: "formId" });
+ // | }
+ // | });
//
- // | with (dojo.require("A.B")) {
- // | ...
- // | }
+ // example:
+ // Style is s special case: Only set with an object hash of styles
+ // | dojo.prop("someNode",{
+ // | id:"bar",
+ // | style:{
+ // | width:"200px", height:"100px", color:"#000"
+ // | }
+ // | });
//
- // And to import just the leaf symbol to a local variable:
+ // example:
+ // Again, only set style as an object hash of styles:
+ // | var obj = { color:"#fff", backgroundColor:"#000" };
+ // | dojo.prop("someNode", "style", obj);
+ // |
+ // | // though shorter to use `dojo.style()` in this case:
+ // | dojo.style("someNode", obj);
+
+ if(arguments.length == 2){
+ return prop[typeof name == "string" ? "get" : "set"](node, name);
+ }
+ // setter
+ return prop.set(node, name, value);
+ };
+
+ // mix-in dom-style
+ dojo.getStyle = style.get;
+ dojo.setStyle = style.set;
+ dojo.getComputedStyle = style.getComputedStyle;
+ dojo.__toPixelValue = dojo.toPixelValue = style.toPixelValue;
+
+ dojo.style = function(node, name, value){
+ // summary:
+ // Accesses styles on a node. If 2 arguments are
+ // passed, acts as a getter. If 3 arguments are passed, acts
+ // as a setter.
+ // description:
+ // Getting the style value uses the computed style for the node, so the value
+ // will be a calculated value, not just the immediate node.style value.
+ // Also when getting values, use specific style names,
+ // like "borderBottomWidth" instead of "border" since compound values like
+ // "border" are not necessarily reflected as expected.
+ // If you want to get node dimensions, use `dojo.marginBox()`,
+ // `dojo.contentBox()` or `dojo.position()`.
+ // node: DOMNode|String
+ // id or reference to node to get/set style for
+ // name: String?|Object?
+ // the style property to set in DOM-accessor format
+ // ("borderWidth", not "border-width") or an object with key/value
+ // pairs suitable for setting each property.
+ // value: String?
+ // If passed, sets value on the node for style, handling
+ // cross-browser concerns. When setting a pixel value,
+ // be sure to include "px" in the value. For instance, top: "200px".
+ // Otherwise, in some cases, some browsers will not apply the style.
+ // returns:
+ // when used as a getter, return the computed style of the node if passing in an ID or node,
+ // or return the normalized, computed value for the property when passing in a node and a style property
+ // example:
+ // Passing only an ID or node returns the computed style object of
+ // the node:
+ // | dojo.style("thinger");
+ // example:
+ // Passing a node and a style property returns the current
+ // normalized, computed value for that property:
+ // | dojo.style("thinger", "opacity"); // 1 by default
//
- // | var B = dojo.require("A.B");
- // | ...
+ // example:
+ // Passing a node, a style property, and a value changes the
+ // current display of the node and returns the new computed value
+ // | dojo.style("thinger", "opacity", 0.5); // == 0.5
//
- // returns:
- // the required namespace object
- omitModuleCheck = d._global_omit_module_check || omitModuleCheck;
+ // example:
+ // Passing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node:
+ // | dojo.style("thinger", {
+ // | "opacity": 0.5,
+ // | "border": "3px solid black",
+ // | "height": "300px"
+ // | });
+ //
+ // example:
+ // When the CSS style property is hyphenated, the JavaScript property is camelCased.
+ // font-size becomes fontSize, and so on.
+ // | dojo.style("thinger",{
+ // | fontSize:"14pt",
+ // | letterSpacing:"1.2em"
+ // | });
+ //
+ // example:
+ // dojo.NodeList implements .style() using the same syntax, omitting the "node" parameter, calling
+ // dojo.style() on every element of the list. See: `dojo.query()` and `dojo.NodeList()`
+ // | dojo.query(".someClassName").style("visibility","hidden");
+ // | // or
+ // | dojo.query("#baz > div").style({
+ // | opacity:0.75,
+ // | fontSize:"13pt"
+ // | });
- //Check if it is already loaded.
- var module = d._loadedModules[moduleName];
- if(module){
- return module;
+ switch(arguments.length){
+ case 1:
+ return style.get(node);
+ case 2:
+ return style[typeof name == "string" ? "get" : "set"](node, name);
}
+ // setter
+ return style.set(node, name, value);
+ };
- // convert periods to slashes
- var relpath = d._getModuleSymbols(moduleName).join("/") + '.js';
- var modArg = !omitModuleCheck ? moduleName : null;
- var ok = d._loadPath(relpath, modArg);
- if(!ok && !omitModuleCheck){
- throw new Error("Could not load '" + moduleName + "'; last tried '" + relpath + "'");
- }
+ return dojo;
+});
- // check that the symbol was defined
- // Don't bother if we're doing xdomain (asynchronous) loading.
- if(!omitModuleCheck && !d._isXDomain){
- // pass in false so we can give better error
- module = d._loadedModules[moduleName];
- if(!module){
- throw new Error("symbol '" + moduleName + "' is not defined after loading '" + relpath + "'");
- }
+},
+'dojo/_base/kernel':function(){
+define(["../has", "./config", "require", "module"], function(has, config, require, module){
+ // module:
+ // dojo/_base/kernel
+ // summary:
+ // This module is the foundational module of the dojo boot sequence; it defines the dojo object.
+ var
+ // loop variables for this module
+ i, p,
+
+ // create dojo, dijit, and dojox
+ // FIXME: in 2.0 remove dijit, dojox being created by dojo
+ dijit = {},
+ dojox = {},
+ dojo = {
+ // notice dojo takes ownership of the value of the config module
+ config:config,
+ global:this,
+ dijit:dijit,
+ dojox:dojox
+ };
+
+
+ // Configure the scope map. For a 100% AMD application, the scope map is not needed other than to provide
+ // a _scopeName property for the dojo, dijit, and dojox root object so those packages can create
+ // unique names in the global space.
+ //
+ // Built, legacy modules use the scope map to allow those modules to be expressed as if dojo, dijit, and dojox,
+ // where global when in fact they are either global under different names or not global at all. In v1.6-, the
+ // config variable "scopeMap" was used to map names as used within a module to global names. This has been
+ // subsumed by the dojo packageMap configuration variable which relocates packages to different names. See
+ // http://livedocs.dojotoolkit.org/developer/design/loader#legacy-cross-domain-mode for details.
+ //
+ // The following computations contort the packageMap for this dojo instance into a scopeMap.
+ var scopeMap =
+ // a map from a name used in a legacy module to the (global variable name, object addressed by that name)
+ // always map dojo, dijit, and dojox
+ {
+ dojo:["dojo", dojo],
+ dijit:["dijit", dijit],
+ dojox:["dojox", dojox]
+ },
+
+ packageMap =
+ // the package map for this dojo instance; note, a foreign loader or no pacakgeMap results in the above default config
+ (require.packs && require.packs[module.id.match(/[^\/]+/)[0]].packageMap) || {},
+
+ item;
+
+ // process all mapped top-level names for this instance of dojo
+ for(p in packageMap){
+ if(scopeMap[p]){
+ // mapped dojo, dijit, or dojox
+ scopeMap[p][0] = packageMap[p];
+ }else{
+ // some other top-level name
+ scopeMap[p] = [packageMap[p], {}];
}
+ }
- return module;
+ // publish those names to _scopeName and, optionally, the global namespace
+ for(p in scopeMap){
+ item = scopeMap[p];
+ item[1]._scopeName = item[0];
+ if(!config.noGlobals){
+ this[item[0]] = item[1];
+ }
}
+ dojo.scopeMap = scopeMap;
+
+ // FIXME: dojo.baseUrl and dojo.config.baseUrl should be deprecated
+ dojo.baseUrl = dojo.config.baseUrl = require.baseUrl;
+ dojo.isAsync = !1 || require.async;
+ dojo.locale = config.locale;
+
+ /*=====
+ dojo.version = function(){
+ // summary:
+ // Version number of the Dojo Toolkit
+ // major: Integer
+ // Major version. If total version is "1.2.0beta1", will be 1
+ // minor: Integer
+ // Minor version. If total version is "1.2.0beta1", will be 2
+ // patch: Integer
+ // Patch version. If total version is "1.2.0beta1", will be 0
+ // flag: String
+ // Descriptor flag. If total version is "1.2.0beta1", will be "beta1"
+ // revision: Number
+ // The SVN rev from which dojo was pulled
+ this.major = 0;
+ this.minor = 0;
+ this.patch = 0;
+ this.flag = "";
+ this.revision = 0;
+ }
+ =====*/
+ var rev = "$Rev: 28982 $".match(/\d+/);
+ dojo.version = {
+ major: 1, minor: 7, patch: 3, flag: "",
+ revision: rev ? +rev[0] : NaN,
+ toString: function(){
+ var v = dojo.version;
+ return v.major + "." + v.minor + "." + v.patch + v.flag + " (" + v.revision + ")"; // String
+ }
+ };
+
+
+ // If 1 is truthy, then as a dojo module is defined it should push it's definitions
+ // into the dojo object, and conversely. In 2.0, it will likely be unusual to augment another object
+ // as a result of defining a module. This has feature gives a way to force 2.0 behavior as the code
+ // is migrated. Absent specific advice otherwise, set extend-dojo to truthy.
+ true || has.add("extend-dojo", 1);
- dojo.provide = function(/*String*/ resourceName){
+
+ dojo.eval = function(scriptText){
// summary:
- // Register a resource with the package system. Works in conjunction with `dojo.require`
- //
+ // A legacy method created for use exclusively by internal Dojo methods. Do not use this method
+ // directly unless you understand its possibly-different implications on the platforms your are targeting.
// description:
- // Each javascript source file is called a resource. When a
- // resource is loaded by the browser, `dojo.provide()` registers
- // that it has been loaded.
- //
- // Each javascript source file must have at least one
- // `dojo.provide()` call at the top of the file, corresponding to
- // the file name. For example, `js/dojo/foo.js` must have
- // `dojo.provide("dojo.foo");` before any calls to
- // `dojo.require()` are made.
- //
- // For backwards compatibility reasons, in addition to registering
- // the resource, `dojo.provide()` also ensures that the javascript
- // object for the module exists. For example,
- // `dojo.provide("dojox.data.FlickrStore")`, in addition to
- // registering that `FlickrStore.js` is a resource for the
- // `dojox.data` module, will ensure that the `dojox.data`
- // javascript object exists, so that calls like
- // `dojo.data.foo = function(){ ... }` don't fail.
- //
- // In the case of a build where multiple javascript source files
- // are combined into one bigger file (similar to a .lib or .jar
- // file), that file may contain multiple dojo.provide() calls, to
- // note that it includes multiple resources.
- //
- // resourceName: String
- // A dot-sperated string identifying a resource.
+ // Makes an attempt to evaluate scriptText in the global scope. The function works correctly for browsers
+ // that support indirect eval.
//
- // example:
- // Safely create a `my` object, and make dojo.require("my.CustomModule") work
- // | dojo.provide("my.CustomModule");
+ // As usual, IE does not. On IE, the only way to implement global eval is to
+ // use execScript. Unfortunately, execScript does not return a value and breaks some current usages of dojo.eval.
+ // This implementation uses the technique of executing eval in the scope of a function that is a single scope
+ // frame below the global scope; thereby coming close to the global scope. Note carefully that
+ //
+ // dojo.eval("var pi = 3.14;");
+ //
+ // will define global pi in non-IE environments, but define pi only in a temporary local scope for IE. If you want
+ // to define a global variable using dojo.eval, write something like
+ //
+ // dojo.eval("window.pi = 3.14;")
+ // scriptText:
+ // The text to evaluation.
+ // returns:
+ // The result of the evaluation. Often `undefined`
+ };
+
+ (Function("d", "d.eval = function(){return d.global.eval ? d.global.eval(arguments[0]) : eval(arguments[0]);}"))(dojo);
+
- //Make sure we have a string.
- resourceName = resourceName + "";
- return (d._loadedModules[resourceName] = d.getObject(resourceName, true)); // Object
+ if(0){
+ dojo.exit = function(exitcode){
+ quit(exitcode);
+ };
+ } else{
+ dojo.exit = function(){
+ };
}
- //Start of old bootstrap2:
+ true || has.add("dojo-guarantee-console",
+ // ensure that console.log, console.warn, etc. are defined
+ 1
+ );
+ if(1){
+ typeof console != "undefined" || (console = {});
+ // Be careful to leave 'log' always at the end
+ var cn = [
+ "assert", "count", "debug", "dir", "dirxml", "error", "group",
+ "groupEnd", "info", "profile", "profileEnd", "time", "timeEnd",
+ "trace", "warn", "log"
+ ];
+ var tn;
+ i = 0;
+ while((tn = cn[i++])){
+ if(!console[tn]){
+ (function(){
+ var tcn = tn + "";
+ console[tcn] = ('log' in console) ? function(){
+ var a = Array.apply({}, arguments);
+ a.unshift(tcn + ":");
+ console["log"](a.join(" "));
+ } : function(){};
+ console[tcn]._fake = true;
+ })();
+ }
+ }
+ }
- dojo.platformRequire = function(/*Object*/modMap){
- // summary:
- // require one or more modules based on which host environment
- // Dojo is currently operating in
- // description:
- // This method takes a "map" of arrays which one can use to
- // optionally load dojo modules. The map is indexed by the
- // possible dojo.name_ values, with two additional values:
- // "default" and "common". The items in the "default" array will
- // be loaded if none of the other items have been choosen based on
- // dojo.name_, set by your host environment. The items in the
- // "common" array will *always* be loaded, regardless of which
- // list is chosen.
- // example:
- // | dojo.platformRequire({
- // | browser: [
- // | "foo.sample", // simple module
- // | "foo.test",
- // | ["foo.bar.baz", true] // skip object check in _loadModule (dojo.require)
- // | ],
- // | default: [ "foo.sample._base" ],
- // | common: [ "important.module.common" ]
- // | });
+ has.add("dojo-debug-messages",
+ // include dojo.deprecated/dojo.experimental implementations
+ !!config.isDebug
+ );
+ if(has("dojo-debug-messages")){
+ dojo.deprecated = function(/*String*/ behaviour, /*String?*/ extra, /*String?*/ removal){
+ // summary:
+ // Log a debug message to indicate that a behavior has been
+ // deprecated.
+ // behaviour: String
+ // The API or behavior being deprecated. Usually in the form
+ // of "myApp.someFunction()".
+ // extra: String?
+ // Text to append to the message. Often provides advice on a
+ // new function or facility to achieve the same goal during
+ // the deprecation period.
+ // removal: String?
+ // Text to indicate when in the future the behavior will be
+ // removed. Usually a version number.
+ // example:
+ // | dojo.deprecated("myApp.getTemp()", "use myApp.getLocaleTemp() instead", "1.0");
- var common = modMap.common || [];
- var result = common.concat(modMap[d._name] || modMap["default"] || []);
+ var message = "DEPRECATED: " + behaviour;
+ if(extra){ message += " " + extra; }
+ if(removal){ message += " -- will be removed in version: " + removal; }
+ console.warn(message);
+ };
- for(var x=0; x<result.length; x++){
- var curr = result[x];
- if(curr.constructor == Array){
- d._loadModule.apply(d, curr);
- }else{
- d._loadModule(curr);
+ dojo.experimental = function(/* String */ moduleName, /* String? */ extra){
+ // summary: Marks code as experimental.
+ // description:
+ // This can be used to mark a function, file, or module as
+ // experimental. Experimental code is not ready to be used, and the
+ // APIs are subject to change without notice. Experimental code may be
+ // completed deleted without going through the normal deprecation
+ // process.
+ // moduleName: String
+ // The name of a module, or the name of a module file or a specific
+ // function
+ // extra: String?
+ // some additional message for the user
+ // example:
+ // | dojo.experimental("dojo.data.Result");
+ // example:
+ // | dojo.experimental("dojo.weather.toKelvin()", "PENDING approval from NOAA");
+
+ var message = "EXPERIMENTAL: " + moduleName + " -- APIs subject to change without notice.";
+ if(extra){ message += " " + extra; }
+ console.warn(message);
+ };
+ }else{
+ dojo.deprecated = dojo.experimental = function(){};
+ }
+
+ true || has.add("dojo-modulePaths",
+ // consume dojo.modulePaths processing
+ 1
+ );
+ if(1){
+ // notice that modulePaths won't be applied to any require's before the dojo/_base/kernel factory is run;
+ // this is the v1.6- behavior.
+ if(config.modulePaths){
+ dojo.deprecated("dojo.modulePaths", "use paths configuration");
+ var paths = {};
+ for(p in config.modulePaths){
+ paths[p.replace(/\./g, "/")] = config.modulePaths[p];
}
+ require({paths:paths});
}
}
- dojo.requireIf = function(/*Boolean*/ condition, /*String*/ resourceName){
- // summary:
- // If the condition is true then call `dojo.require()` for the specified
- // resource
- //
- // example:
- // | dojo.requireIf(dojo.isBrowser, "my.special.Module");
-
- if(condition === true){
- // FIXME: why do we support chained require()'s here? does the build system?
- var args = [];
- for(var i = 1; i < arguments.length; i++){
- args.push(arguments[i]);
+ true || has.add("dojo-moduleUrl",
+ // include dojo.moduleUrl
+ 1
+ );
+ if(1){
+ dojo.moduleUrl = function(/*String*/module, /*String?*/url){
+ // summary:
+ // Returns a URL relative to a module.
+ // example:
+ // | var pngPath = dojo.moduleUrl("acme","images/small.png");
+ // | console.dir(pngPath); // list the object properties
+ // | // create an image and set it's source to pngPath's value:
+ // | var img = document.createElement("img");
+ // | img.src = pngPath;
+ // | // add our image to the document
+ // | dojo.body().appendChild(img);
+ // example:
+ // you may de-reference as far as you like down the package
+ // hierarchy. This is sometimes handy to avoid lenghty relative
+ // urls or for building portable sub-packages. In this example,
+ // the `acme.widget` and `acme.util` directories may be located
+ // under different roots (see `dojo.registerModulePath`) but the
+ // the modules which reference them can be unaware of their
+ // relative locations on the filesystem:
+ // | // somewhere in a configuration block
+ // | dojo.registerModulePath("acme.widget", "../../acme/widget");
+ // | dojo.registerModulePath("acme.util", "../../util");
+ // |
+ // | // ...
+ // |
+ // | // code in a module using acme resources
+ // | var tmpltPath = dojo.moduleUrl("acme.widget","templates/template.html");
+ // | var dataPath = dojo.moduleUrl("acme.util","resources/data.json");
+
+ dojo.deprecated("dojo.moduleUrl()", "use require.toUrl", "2.0");
+
+ // require.toUrl requires a filetype; therefore, just append the suffix "/*.*" to guarantee a filetype, then
+ // remove the suffix from the result. This way clients can request a url w/out a filetype. This should be
+ // rare, but it maintains backcompat for the v1.x line (note: dojo.moduleUrl will be removed in v2.0).
+ // Notice * is an illegal filename so it won't conflict with any real path map that may exist the paths config.
+ var result = null;
+ if(module){
+ result = require.toUrl(module.replace(/\./g, "/") + (url ? ("/" + url) : "") + "/*.*").replace(/\/\*\.\*/, "") + (url ? "" : "/");
}
- d.require.apply(d, args);
- }
+ return result;
+ };
}
- dojo.requireAfterIf = d.requireIf;
+ dojo._hasResource = {}; // for backward compatibility with layers built with 1.6 tooling
- dojo.registerModulePath = function(/*String*/module, /*String*/prefix){
- // summary:
- // Maps a module name to a path
- // description:
- // An unregistered module is given the default path of ../[module],
- // relative to Dojo root. For example, module acme is mapped to
- // ../acme. If you want to use a different module name, use
- // dojo.registerModulePath.
- // example:
- // If your dojo.js is located at this location in the web root:
- // | /myapp/js/dojo/dojo/dojo.js
- // and your modules are located at:
- // | /myapp/js/foo/bar.js
- // | /myapp/js/foo/baz.js
- // | /myapp/js/foo/thud/xyzzy.js
- // Your application can tell Dojo to locate the "foo" namespace by calling:
- // | dojo.registerModulePath("foo", "../../foo");
- // At which point you can then use dojo.require() to load the
- // modules (assuming they provide() the same things which are
- // required). The full code might be:
- // | <script type="text/javascript"
- // | src="/myapp/js/dojo/dojo/dojo.js"></script>
- // | <script type="text/javascript">
- // | dojo.registerModulePath("foo", "../../foo");
- // | dojo.require("foo.bar");
- // | dojo.require("foo.baz");
- // | dojo.require("foo.thud.xyzzy");
- // | </script>
- d._modulePrefixes[module] = { name: module, value: prefix };
- };
-
- dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){
+ return dojo;
+});
+
+},
+'dojo/io-query':function(){
+define(["./_base/lang"], function(lang){
+ // module:
+ // dojo/io-query
+ // summary:
+ // This module defines query string processing functions.
+
+ var backstop = {};
+
+ function objectToQuery(/*Object*/ map){
+ // summary:
+ // takes a name/value mapping object and returns a string representing
+ // a URL-encoded version of that object.
+ // example:
+ // this object:
+ //
+ // | {
+ // | blah: "blah",
+ // | multi: [
+ // | "thud",
+ // | "thonk"
+ // | ]
+ // | };
+ //
+ // yields the following query string:
+ //
+ // | "blah=blah&multi=thud&multi=thonk"
+
+ // FIXME: need to implement encodeAscii!!
+ var enc = encodeURIComponent, pairs = [];
+ for(var name in map){
+ var value = map[name];
+ if(value != backstop[name]){
+ var assign = enc(name) + "=";
+ if(lang.isArray(value)){
+ for(var i = 0, l = value.length; i < l; ++i){
+ pairs.push(assign + enc(value[i]));
+ }
+ }else{
+ pairs.push(assign + enc(value));
+ }
+ }
+ }
+ return pairs.join("&"); // String
+ }
+
+ function queryToObject(/*String*/ str){
+ // summary:
+ // Create an object representing a de-serialized query section of a
+ // URL. Query keys with multiple values are returned in an array.
+ //
+ // example:
+ // This string:
+ //
+ // | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&"
+ //
+ // results in this object structure:
+ //
+ // | {
+ // | foo: [ "bar", "baz" ],
+ // | thinger: " spaces =blah",
+ // | zonk: "blarg"
+ // | }
+ //
+ // Note that spaces and other urlencoded entities are correctly
+ // handled.
+
+ // FIXME: should we grab the URL string if we're not passed one?
+ var dec = decodeURIComponent, qp = str.split("&"), ret = {}, name, val;
+ for(var i = 0, l = qp.length, item; i < l; ++i){
+ item = qp[i];
+ if(item.length){
+ var s = item.indexOf("=");
+ if(s < 0){
+ name = dec(item);
+ val = "";
+ }else{
+ name = dec(item.slice(0, s));
+ val = dec(item.slice(s + 1));
+ }
+ if(typeof ret[name] == "string"){ // inline'd type check
+ ret[name] = [ret[name]];
+ }
+
+ if(lang.isArray(ret[name])){
+ ret[name].push(val);
+ }else{
+ ret[name] = val;
+ }
+ }
+ }
+ return ret; // Object
+ }
+
+ return {
+ objectToQuery: objectToQuery,
+ queryToObject: queryToObject
+ };
+});
+},
+'dojo/_base/Deferred':function(){
+define("dojo/_base/Deferred", ["./kernel", "./lang"], function(dojo, lang){
+ // module:
+ // dojo/_base/Deferred
+ // summary:
+ // This module defines dojo.Deferred.
+
+ var mutator = function(){};
+ var freeze = Object.freeze || function(){};
+ // A deferred provides an API for creating and resolving a promise.
+ dojo.Deferred = function(/*Function?*/ canceller){
// summary:
- // Declares translated resources and loads them if necessary, in the
- // same style as dojo.require. Contents of the resource bundle are
- // typically strings, but may be any name/value pair, represented in
- // JSON format. See also `dojo.i18n.getLocalization`.
- //
+ // Deferreds provide a generic means for encapsulating an asynchronous
+ // operation and notifying users of the completion and result of the operation.
// description:
- // Load translated resource bundles provided underneath the "nls"
- // directory within a package. Translated resources may be located in
- // different packages throughout the source tree.
- //
- // Each directory is named for a locale as specified by RFC 3066,
- // (http://www.ietf.org/rfc/rfc3066.txt), normalized in lowercase.
- // Note that the two bundles in the example do not define all the
- // same variants. For a given locale, bundles will be loaded for
- // that locale and all more general locales above it, including a
- // fallback at the root directory. For example, a declaration for
- // the "de-at" locale will first load `nls/de-at/bundleone.js`,
- // then `nls/de/bundleone.js` and finally `nls/bundleone.js`. The
- // data will be flattened into a single Object so that lookups
- // will follow this cascading pattern. An optional build step can
- // preload the bundles to avoid data redundancy and the multiple
- // network hits normally required to load these resources.
- //
- // moduleName:
- // name of the package containing the "nls" directory in which the
- // bundle is found
- //
- // bundleName:
- // bundle name, i.e. the filename without the '.js' suffix. Using "nls" as a
- // a bundle name is not supported, since "nls" is the name of the folder
- // that holds bundles. Using "nls" as the bundle name will cause problems
- // with the custom build.
- //
- // locale:
- // the locale to load (optional) By default, the browser's user
- // locale as defined by dojo.locale
- //
- // availableFlatLocales:
- // A comma-separated list of the available, flattened locales for this
- // bundle. This argument should only be set by the build process.
+ // The dojo.Deferred API is based on the concept of promises that provide a
+ // generic interface into the eventual completion of an asynchronous action.
+ // The motivation for promises fundamentally is about creating a
+ // separation of concerns that allows one to achieve the same type of
+ // call patterns and logical data flow in asynchronous code as can be
+ // achieved in synchronous code. Promises allows one
+ // to be able to call a function purely with arguments needed for
+ // execution, without conflating the call with concerns of whether it is
+ // sync or async. One shouldn't need to alter a call's arguments if the
+ // implementation switches from sync to async (or vice versa). By having
+ // async functions return promises, the concerns of making the call are
+ // separated from the concerns of asynchronous interaction (which are
+ // handled by the promise).
+ //
+ // The dojo.Deferred is a type of promise that provides methods for fulfilling the
+ // promise with a successful result or an error. The most important method for
+ // working with Dojo's promises is the then() method, which follows the
+ // CommonJS proposed promise API. An example of using a Dojo promise:
+ //
+ // | var resultingPromise = someAsyncOperation.then(function(result){
+ // | ... handle result ...
+ // | },
+ // | function(error){
+ // | ... handle error ...
+ // | });
//
- // example:
- // A particular widget may define one or more resource bundles,
- // structured in a program as follows, where moduleName is
- // mycode.mywidget and bundleNames available include bundleone and
- // bundletwo:
- // | ...
- // | mycode/
- // | mywidget/
- // | nls/
- // | bundleone.js (the fallback translation, English in this example)
- // | bundletwo.js (also a fallback translation)
- // | de/
- // | bundleone.js
- // | bundletwo.js
- // | de-at/
- // | bundleone.js
- // | en/
- // | (empty; use the fallback translation)
- // | en-us/
- // | bundleone.js
- // | en-gb/
- // | bundleone.js
- // | es/
- // | bundleone.js
- // | bundletwo.js
- // | ...etc
- // | ...
- //
-
- d.require("dojo.i18n");
- d.i18n._requireLocalization.apply(d.hostenv, arguments);
- };
-
-
- var ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),
- ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$");
-
- dojo._Url = function(/*dojo._Url|String...*/){
- // summary:
- // Constructor to create an object representing a URL.
- // It is marked as private, since we might consider removing
- // or simplifying it.
- // description:
- // Each argument is evaluated in order relative to the next until
- // a canonical uri is produced. To get an absolute Uri relative to
- // the current document use:
- // new dojo._Url(document.baseURI, url)
-
- var n = null,
- _a = arguments,
- uri = [_a[0]];
- // resolve uri components relative to each other
- for(var i = 1; i<_a.length; i++){
- if(!_a[i]){ continue; }
-
- // Safari doesn't support this.constructor so we have to be explicit
- // FIXME: Tracked (and fixed) in Webkit bug 3537.
- // http://bugs.webkit.org/show_bug.cgi?id=3537
- var relobj = new d._Url(_a[i]+""),
- uriobj = new d._Url(uri[0]+"");
-
- if(
- relobj.path == "" &&
- !relobj.scheme &&
- !relobj.authority &&
- !relobj.query
- ){
- if(relobj.fragment != n){
- uriobj.fragment = relobj.fragment;
- }
- relobj = uriobj;
- }else if(!relobj.scheme){
- relobj.scheme = uriobj.scheme;
-
- if(!relobj.authority){
- relobj.authority = uriobj.authority;
-
- if(relobj.path.charAt(0) != "/"){
- var path = uriobj.path.substring(0,
- uriobj.path.lastIndexOf("/") + 1) + relobj.path;
-
- var segs = path.split("/");
- for(var j = 0; j < segs.length; j++){
- if(segs[j] == "."){
- // flatten "./" references
- if(j == segs.length - 1){
- segs[j] = "";
- }else{
- segs.splice(j, 1);
- j--;
- }
- }else if(j > 0 && !(j == 1 && segs[0] == "") &&
- segs[j] == ".." && segs[j-1] != ".."){
- // flatten "../" references
- if(j == (segs.length - 1)){
- segs.splice(j, 1);
- segs[j - 1] = "";
- }else{
- segs.splice(j - 1, 2);
- j -= 2;
- }
- }
+ // The .then() call returns a new promise that represents the result of the
+ // execution of the callback. The callbacks will never affect the original promises value.
+ //
+ // The dojo.Deferred instances also provide the following functions for backwards compatibility:
+ //
+ // * addCallback(handler)
+ // * addErrback(handler)
+ // * callback(result)
+ // * errback(result)
+ //
+ // Callbacks are allowed to return promises themselves, so
+ // you can build complicated sequences of events with ease.
+ //
+ // The creator of the Deferred may specify a canceller. The canceller
+ // is a function that will be called if Deferred.cancel is called
+ // before the Deferred fires. You can use this to implement clean
+ // aborting of an XMLHttpRequest, etc. Note that cancel will fire the
+ // deferred with a CancelledError (unless your canceller returns
+ // another kind of error), so the errbacks should be prepared to
+ // handle that error for cancellable Deferreds.
+ // example:
+ // | var deferred = new dojo.Deferred();
+ // | setTimeout(function(){ deferred.callback({success: true}); }, 1000);
+ // | return deferred;
+ // example:
+ // Deferred objects are often used when making code asynchronous. It
+ // may be easiest to write functions in a synchronous manner and then
+ // split code using a deferred to trigger a response to a long-lived
+ // operation. For example, instead of register a callback function to
+ // denote when a rendering operation completes, the function can
+ // simply return a deferred:
+ //
+ // | // callback style:
+ // | function renderLotsOfData(data, callback){
+ // | var success = false
+ // | try{
+ // | for(var x in data){
+ // | renderDataitem(data[x]);
+ // | }
+ // | success = true;
+ // | }catch(e){ }
+ // | if(callback){
+ // | callback(success);
+ // | }
+ // | }
+ //
+ // | // using callback style
+ // | renderLotsOfData(someDataObj, function(success){
+ // | // handles success or failure
+ // | if(!success){
+ // | promptUserToRecover();
+ // | }
+ // | });
+ // | // NOTE: no way to add another callback here!!
+ // example:
+ // Using a Deferred doesn't simplify the sending code any, but it
+ // provides a standard interface for callers and senders alike,
+ // providing both with a simple way to service multiple callbacks for
+ // an operation and freeing both sides from worrying about details
+ // such as "did this get called already?". With Deferreds, new
+ // callbacks can be added at any time.
+ //
+ // | // Deferred style:
+ // | function renderLotsOfData(data){
+ // | var d = new dojo.Deferred();
+ // | try{
+ // | for(var x in data){
+ // | renderDataitem(data[x]);
+ // | }
+ // | d.callback(true);
+ // | }catch(e){
+ // | d.errback(new Error("rendering failed"));
+ // | }
+ // | return d;
+ // | }
+ //
+ // | // using Deferred style
+ // | renderLotsOfData(someDataObj).then(null, function(){
+ // | promptUserToRecover();
+ // | });
+ // | // NOTE: addErrback and addCallback both return the Deferred
+ // | // again, so we could chain adding callbacks or save the
+ // | // deferred for later should we need to be notified again.
+ // example:
+ // In this example, renderLotsOfData is synchronous and so both
+ // versions are pretty artificial. Putting the data display on a
+ // timeout helps show why Deferreds rock:
+ //
+ // | // Deferred style and async func
+ // | function renderLotsOfData(data){
+ // | var d = new dojo.Deferred();
+ // | setTimeout(function(){
+ // | try{
+ // | for(var x in data){
+ // | renderDataitem(data[x]);
+ // | }
+ // | d.callback(true);
+ // | }catch(e){
+ // | d.errback(new Error("rendering failed"));
+ // | }
+ // | }, 100);
+ // | return d;
+ // | }
+ //
+ // | // using Deferred style
+ // | renderLotsOfData(someDataObj).then(null, function(){
+ // | promptUserToRecover();
+ // | });
+ //
+ // Note that the caller doesn't have to change his code at all to
+ // handle the asynchronous case.
+
+ var result, finished, isError, head, nextListener;
+ var promise = (this.promise = {});
+
+ function complete(value){
+ if(finished){
+ throw new Error("This deferred has already been resolved");
+ }
+ result = value;
+ finished = true;
+ notify();
+ }
+ function notify(){
+ var mutated;
+ while(!mutated && nextListener){
+ var listener = nextListener;
+ nextListener = nextListener.next;
+ if((mutated = (listener.progress == mutator))){ // assignment and check
+ finished = false;
+ }
+ var func = (isError ? listener.error : listener.resolved);
+ if(func){
+ try{
+ var newResult = func(result);
+ if (newResult && typeof newResult.then === "function"){
+ newResult.then(lang.hitch(listener.deferred, "resolve"), lang.hitch(listener.deferred, "reject"), lang.hitch(listener.deferred, "progress"));
+ continue;
+ }
+ var unchanged = mutated && newResult === undefined;
+ if(mutated && !unchanged){
+ isError = newResult instanceof Error;
}
- relobj.path = segs.join("/");
+ listener.deferred[unchanged && isError ? "reject" : "resolve"](unchanged ? result : newResult);
+ }catch(e){
+ listener.deferred.reject(e);
+ }
+ }else{
+ if(isError){
+ listener.deferred.reject(result);
+ }else{
+ listener.deferred.resolve(result);
}
}
}
+ }
+ // calling resolve will resolve the promise
+ this.resolve = this.callback = function(value){
+ // summary:
+ // Fulfills the Deferred instance successfully with the provide value
+ this.fired = 0;
+ this.results = [value, null];
+ complete(value);
+ };
+
- uri = [];
- if(relobj.scheme){
- uri.push(relobj.scheme, ":");
+ // calling error will indicate that the promise failed
+ this.reject = this.errback = function(error){
+ // summary:
+ // Fulfills the Deferred instance as an error with the provided error
+ isError = true;
+ this.fired = 1;
+ complete(error);
+ this.results = [null, error];
+ if(!error || error.log !== false){
+ (dojo.config.deferredOnError || function(x){ console.error(x); })(error);
+ }
+ };
+ // call progress to provide updates on the progress on the completion of the promise
+ this.progress = function(update){
+ // summary:
+ // Send progress events to all listeners
+ var listener = nextListener;
+ while(listener){
+ var progress = listener.progress;
+ progress && progress(update);
+ listener = listener.next;
+ }
+ };
+ this.addCallbacks = function(callback, errback){
+ // summary:
+ // Adds callback and error callback for this deferred instance.
+ // callback: Function?
+ // The callback attached to this deferred object.
+ // errback: Function?
+ // The error callback attached to this deferred object.
+ // returns:
+ // Returns this deferred object.
+ this.then(callback, errback, mutator);
+ return this; // dojo.Deferred
+ };
+ // provide the implementation of the promise
+ promise.then = this.then = function(/*Function?*/resolvedCallback, /*Function?*/errorCallback, /*Function?*/progressCallback){
+ // summary:
+ // Adds a fulfilledHandler, errorHandler, and progressHandler to be called for
+ // completion of a promise. The fulfilledHandler is called when the promise
+ // is fulfilled. The errorHandler is called when a promise fails. The
+ // progressHandler is called for progress events. All arguments are optional
+ // and non-function values are ignored. The progressHandler is not only an
+ // optional argument, but progress events are purely optional. Promise
+ // providers are not required to ever create progress events.
+ //
+ // This function will return a new promise that is fulfilled when the given
+ // fulfilledHandler or errorHandler callback is finished. This allows promise
+ // operations to be chained together. The value returned from the callback
+ // handler is the fulfillment value for the returned promise. If the callback
+ // throws an error, the returned promise will be moved to failed state.
+ //
+ // returns:
+ // Returns a new promise that represents the result of the
+ // execution of the callback. The callbacks will never affect the original promises value.
+ // example:
+ // An example of using a CommonJS compliant promise:
+ // | asyncComputeTheAnswerToEverything().
+ // | then(addTwo).
+ // | then(printResult, onError);
+ // | >44
+ //
+ var returnDeferred = progressCallback == mutator ? this : new dojo.Deferred(promise.cancel);
+ var listener = {
+ resolved: resolvedCallback,
+ error: errorCallback,
+ progress: progressCallback,
+ deferred: returnDeferred
+ };
+ if(nextListener){
+ head = head.next = listener;
}
- if(relobj.authority){
- uri.push("//", relobj.authority);
+ else{
+ nextListener = head = listener;
}
- uri.push(relobj.path);
- if(relobj.query){
- uri.push("?", relobj.query);
+ if(finished){
+ notify();
}
- if(relobj.fragment){
- uri.push("#", relobj.fragment);
+ return returnDeferred.promise; // Promise
+ };
+ var deferred = this;
+ promise.cancel = this.cancel = function (){
+ // summary:
+ // Cancels the asynchronous operation
+ if(!finished){
+ var error = canceller && canceller(deferred);
+ if(!finished){
+ if (!(error instanceof Error)){
+ error = new Error(error);
+ }
+ error.log = false;
+ deferred.reject(error);
+ }
}
- }
-
- this.uri = uri.join("");
+ };
+ freeze(promise);
+ };
+ lang.extend(dojo.Deferred, {
+ addCallback: function (/*Function*/ callback){
+ // summary:
+ // Adds successful callback for this deferred instance.
+ // returns:
+ // Returns this deferred object.
+ return this.addCallbacks(lang.hitch.apply(dojo, arguments)); // dojo.Deferred
+ },
- // break the uri into its main components
- var r = this.uri.match(ore);
+ addErrback: function (/*Function*/ errback){
+ // summary:
+ // Adds error callback for this deferred instance.
+ // returns:
+ // Returns this deferred object.
+ return this.addCallbacks(null, lang.hitch.apply(dojo, arguments)); // dojo.Deferred
+ },
- this.scheme = r[2] || (r[1] ? "" : n);
- this.authority = r[4] || (r[3] ? "" : n);
- this.path = r[5]; // can never be undefined
- this.query = r[7] || (r[6] ? "" : n);
- this.fragment = r[9] || (r[8] ? "" : n);
+ addBoth: function (/*Function*/ callback){
+ // summary:
+ // Add handler as both successful callback and error callback for this deferred instance.
+ // returns:
+ // Returns this deferred object.
+ var enclosed = lang.hitch.apply(dojo, arguments);
+ return this.addCallbacks(enclosed, enclosed); // dojo.Deferred
+ },
+ fired: -1
+ });
- if(this.authority != n){
- // server based naming authority
- r = this.authority.match(ire);
+ dojo.Deferred.when = dojo.when = function(promiseOrValue, /*Function?*/ callback, /*Function?*/ errback, /*Function?*/ progressHandler){
+ // summary:
+ // This provides normalization between normal synchronous values and
+ // asynchronous promises, so you can interact with them in a common way
+ // returns:
+ // Returns a new promise that represents the result of the execution of callback
+ // when parameter "promiseOrValue" is promise.
+ // Returns the execution result of callback when parameter "promiseOrValue" is value.
+ // example:
+ // | function printFirstAndLast(items){
+ // | dojo.when(findFirst(items), console.log);
+ // | dojo.when(findLast(items), console.log);
+ // | }
+ // | function findFirst(items){
+ // | return dojo.when(items, function(items){
+ // | return items[0];
+ // | });
+ // | }
+ // | function findLast(items){
+ // | return dojo.when(items, function(items){
+ // | return items[items.length - 1];
+ // | });
+ // | }
+ // And now all three of his functions can be used sync or async.
+ // | printFirstAndLast([1,2,3,4]) will work just as well as
+ // | printFirstAndLast(dojo.xhrGet(...));
- this.user = r[3] || n;
- this.password = r[4] || n;
- this.host = r[6] || r[7]; // ipv6 || ipv4
- this.port = r[9] || n;
+ if(promiseOrValue && typeof promiseOrValue.then === "function"){
+ return promiseOrValue.then(callback, errback, progressHandler);
}
- }
+ return callback ? callback(promiseOrValue) : promiseOrValue; // Promise
+ };
- dojo._Url.prototype.toString = function(){ return this.uri; };
+ return dojo.Deferred;
+});
- dojo.moduleUrl = function(/*String*/module, /*dojo._Url||String*/url){
- // summary:
- // Returns a `dojo._Url` object relative to a module.
- // example:
- // | var pngPath = dojo.moduleUrl("acme","images/small.png");
- // | console.dir(pngPath); // list the object properties
- // | // create an image and set it's source to pngPath's value:
- // | var img = document.createElement("img");
- // | // NOTE: we assign the string representation of the url object
- // | img.src = pngPath.toString();
- // | // add our image to the document
- // | dojo.body().appendChild(img);
- // example:
- // you may de-reference as far as you like down the package
- // hierarchy. This is sometimes handy to avoid lenghty relative
- // urls or for building portable sub-packages. In this example,
- // the `acme.widget` and `acme.util` directories may be located
- // under different roots (see `dojo.registerModulePath`) but the
- // the modules which reference them can be unaware of their
- // relative locations on the filesystem:
- // | // somewhere in a configuration block
- // | dojo.registerModulePath("acme.widget", "../../acme/widget");
- // | dojo.registerModulePath("acme.util", "../../util");
- // |
- // | // ...
- // |
- // | // code in a module using acme resources
- // | var tmpltPath = dojo.moduleUrl("acme.widget","templates/template.html");
- // | var dataPath = dojo.moduleUrl("acme.util","resources/data.json");
+},
+'dojo/NodeList-dom':function(){
+define(["./_base/kernel", "./query", "./_base/array", "./_base/lang", "./dom-class", "./dom-construct", "./dom-geometry", "./dom-attr", "./dom-style"], function(dojo, query, array, lang, domCls, domCtr, domGeom, domAttr, domStyle){
+ /*===== var NodeList = dojo.NodeList; =====*/
+ var magicGuard = function(a){
+ // summary:
+ // the guard function for dojo.attr() and dojo.style()
+ return a.length == 1 && (typeof a[0] == "string"); // inline'd type check
+ };
- var loc = d._getModuleSymbols(module).join('/');
- if(!loc){ return null; }
- if(loc.lastIndexOf("/") != loc.length-1){
- loc += "/";
- }
-
- //If the path is an absolute path (starts with a / or is on another
- //domain/xdomain) then don't add the baseUrl.
- var colonIndex = loc.indexOf(":");
- if(loc.charAt(0) != "/" && (colonIndex == -1 || colonIndex > loc.indexOf("/"))){
- loc = d.baseUrl + loc;
+ var orphan = function(node){
+ // summary:
+ // function to orphan nodes
+ var p = node.parentNode;
+ if(p){
+ p.removeChild(node);
}
-
- return new d._Url(loc, url); // dojo._Url
};
+ // FIXME: should we move orphan() to dojo.html?
+ var NodeList = query.NodeList,
+ awc = NodeList._adaptWithCondition,
+ aafe = NodeList._adaptAsForEach,
+ aam = NodeList._adaptAsMap;
+ function getSet(module){
+ return function(node, name, value){
+ if(arguments.length == 2){
+ return module[typeof name == "string" ? "get" : "set"](node, name);
+ }
+ // setter
+ return module.set(node, name, value);
+ };
+ }
-})();
+ lang.extend(NodeList, {
+ _normalize: function(/*String||Element||Object||NodeList*/content, /*DOMNode?*/refNode){
+ // summary:
+ // normalizes data to an array of items to insert.
+ // description:
+ // If content is an object, it can have special properties "template" and
+ // "parse". If "template" is defined, then the template value is run through
+ // dojo.string.substitute (if dojo.string.substitute has been dojo.required elsewhere),
+ // or if templateFunc is a function on the content, that function will be used to
+ // transform the template into a final string to be used for for passing to dojo._toDom.
+ // If content.parse is true, then it is remembered for later, for when the content
+ // nodes are inserted into the DOM. At that point, the nodes will be parsed for widgets
+ // (if dojo.parser has been dojo.required elsewhere).
-/*=====
-dojo.isBrowser = {
- // example:
- // | if(dojo.isBrowser){ ... }
-};
+ //Wanted to just use a DocumentFragment, but for the array/NodeList
+ //case that meant using cloneNode, but we may not want that.
+ //Cloning should only happen if the node operations span
+ //multiple refNodes. Also, need a real array, not a NodeList from the
+ //DOM since the node movements could change those NodeLists.
-dojo.isFF = {
- // example:
- // | if(dojo.isFF > 1){ ... }
-};
+ var parse = content.parse === true;
-dojo.isIE = {
- // example:
- // | if(dojo.isIE > 6){
- // | // we are IE7
- // | }
-};
+ //Do we have an object that needs to be run through a template?
+ if(typeof content.template == "string"){
+ var templateFunc = content.templateFunc || (dojo.string && dojo.string.substitute);
+ content = templateFunc ? templateFunc(content.template, content) : content;
+ }
-dojo.isSafari = {
- // example:
- // | if(dojo.isSafari){ ... }
- // example:
- // Detect iPhone:
- // | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){
- // | // we are iPhone. Note, iPod touch reports "iPod" above and fails this test.
- // | }
-};
+ var type = (typeof content);
+ if(type == "string" || type == "number"){
+ content = domCtr.toDom(content, (refNode && refNode.ownerDocument));
+ if(content.nodeType == 11){
+ //DocumentFragment. It cannot handle cloneNode calls, so pull out the children.
+ content = lang._toArray(content.childNodes);
+ }else{
+ content = [content];
+ }
+ }else if(!lang.isArrayLike(content)){
+ content = [content];
+ }else if(!lang.isArray(content)){
+ //To get to this point, content is array-like, but
+ //not an array, which likely means a DOM NodeList. Convert it now.
+ content = lang._toArray(content);
+ }
-dojo = {
- // isBrowser: Boolean
- // True if the client is a web-browser
- isBrowser: true,
- // isFF: Number | undefined
- // Version as a Number if client is FireFox. undefined otherwise. Corresponds to
- // major detected FireFox version (1.5, 2, 3, etc.)
- isFF: 2,
- // isIE: Number | undefined
- // Version as a Number if client is MSIE(PC). undefined otherwise. Corresponds to
- // major detected IE version (6, 7, 8, etc.)
- isIE: 6,
- // isKhtml: Number | undefined
- // Version as a Number if client is a KHTML browser. undefined otherwise. Corresponds to major
- // detected version.
- isKhtml: 0,
- // isWebKit: Number | undefined
- // Version as a Number if client is a WebKit-derived browser (Konqueror,
- // Safari, Chrome, etc.). undefined otherwise.
- isWebKit: 0,
- // isMozilla: Number | undefined
- // Version as a Number if client is a Mozilla-based browser (Firefox,
- // SeaMonkey). undefined otherwise. Corresponds to major detected version.
- isMozilla: 0,
- // isOpera: Number | undefined
- // Version as a Number if client is Opera. undefined otherwise. Corresponds to
- // major detected version.
- isOpera: 0,
- // isSafari: Number | undefined
- // Version as a Number if client is Safari or iPhone. undefined otherwise.
- isSafari: 0,
- // isChrome: Number | undefined
- // Version as a Number if client is Chrome browser. undefined otherwise.
- isChrome: 0
- // isMac: Boolean
- // True if the client runs on Mac
-}
-=====*/
-if(typeof window != 'undefined'){
- dojo.isBrowser = true;
- dojo._name = "browser";
+ //Pass around the parse info
+ if(parse){
+ content._runParse = true;
+ }
+ return content; //Array
+ },
+
+ _cloneNode: function(/*DOMNode*/ node){
+ // summary:
+ // private utility to clone a node. Not very interesting in the vanilla
+ // dojo.NodeList case, but delegates could do interesting things like
+ // clone event handlers if that is derivable from the node.
+ return node.cloneNode(true);
+ },
+
+ _place: function(/*Array*/ary, /*DOMNode*/refNode, /*String*/position, /*Boolean*/useClone){
+ // summary:
+ // private utility to handle placing an array of nodes relative to another node.
+ // description:
+ // Allows for cloning the nodes in the array, and for
+ // optionally parsing widgets, if ary._runParse is true.
+ //Avoid a disallowed operation if trying to do an innerHTML on a non-element node.
+ if(refNode.nodeType != 1 && position == "only"){
+ return;
+ }
+ var rNode = refNode, tempNode;
- // attempt to figure out the path to dojo if it isn't set in the config
- (function(){
- var d = dojo;
-
- // this is a scope protection closure. We set browser versions and grab
- // the URL we were loaded from here.
-
- // grab the node we were loaded from
- if(document && document.getElementsByTagName){
- var scripts = document.getElementsByTagName("script");
- var rePkg = /dojo(\.xd)?\.js(\W|$)/i;
- for(var i = 0; i < scripts.length; i++){
- var src = scripts[i].getAttribute("src");
- if(!src){ continue; }
- var m = src.match(rePkg);
- if(m){
- // find out where we came from
- if(!d.config.baseUrl){
- d.config.baseUrl = src.substring(0, m.index);
+ //Always cycle backwards in case the array is really a
+ //DOM NodeList and the DOM operations take it out of the live collection.
+ var length = ary.length;
+ for(var i = length - 1; i >= 0; i--){
+ var node = (useClone ? this._cloneNode(ary[i]) : ary[i]);
+
+ //If need widget parsing, use a temp node, instead of waiting after inserting into
+ //real DOM because we need to start widget parsing at one node up from current node,
+ //which could cause some already parsed widgets to be parsed again.
+ if(ary._runParse && dojo.parser && dojo.parser.parse){
+ if(!tempNode){
+ tempNode = rNode.ownerDocument.createElement("div");
}
- // and find out if we need to modify our behavior
- var cfg = (scripts[i].getAttribute("djConfig") || scripts[i].getAttribute("data-dojo-config"));
- if(cfg){
- var cfgo = eval("({ "+cfg+" })");
- for(var x in cfgo){
- dojo.config[x] = cfgo[x];
- }
+ tempNode.appendChild(node);
+ dojo.parser.parse(tempNode);
+ node = tempNode.firstChild;
+ while(tempNode.firstChild){
+ tempNode.removeChild(tempNode.firstChild);
}
- break; // "first Dojo wins"
}
- }
- }
- d.baseUrl = d.config.baseUrl;
- // fill in the rendering support information in dojo.render.*
- var n = navigator;
- var dua = n.userAgent,
- dav = n.appVersion,
- tv = parseFloat(dav);
+ if(i == length - 1){
+ domCtr.place(node, rNode, position);
+ }else{
+ rNode.parentNode.insertBefore(node, rNode);
+ }
+ rNode = node;
+ }
+ },
- if(dua.indexOf("Opera") >= 0){ d.isOpera = tv; }
- if(dua.indexOf("AdobeAIR") >= 0){ d.isAIR = 1; }
- d.isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : 0;
- d.isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined;
- d.isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined;
- d.isMac = dav.indexOf("Macintosh") >= 0;
+ /*=====
+ position: function(){
+ // summary:
+ // Returns border-box objects (x/y/w/h) of all elements in a node list
+ // as an Array (*not* a NodeList). Acts like `dojo.position`, though
+ // assumes the node passed is each node in this list.
- // safari detection derived from:
- // http://developer.apple.com/internet/safari/faq.html#anchor2
- // http://developer.apple.com/internet/safari/uamatrix.html
- var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);
- if(index && !dojo.isChrome){
- // try to grab the explicit Safari version first. If we don't get
- // one, look for less than 419.3 as the indication that we're on something
- // "Safari 2-ish".
- d.isSafari = parseFloat(dav.split("Version/")[1]);
- if(!d.isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){
- d.isSafari = 2;
- }
- }
+ return dojo.map(this, dojo.position); // Array
+ },
- if(dua.indexOf("Gecko") >= 0 && !d.isKhtml && !d.isWebKit){ d.isMozilla = d.isMoz = tv; }
- if(d.isMoz){
- //We really need to get away from this. Consider a sane isGecko approach for the future.
- d.isFF = parseFloat(dua.split("Firefox/")[1] || dua.split("Minefield/")[1]) || undefined;
- }
- if(document.all && !d.isOpera){
- d.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined;
- //In cases where the page has an HTTP header or META tag with
- //X-UA-Compatible, then it is in emulation mode.
- //Make sure isIE reflects the desired version.
- //document.documentMode of 5 means quirks mode.
- //Only switch the value if documentMode's major version
- //is different from isIE's major version.
- var mode = document.documentMode;
- if(mode && mode != 5 && Math.floor(d.isIE) != mode){
- d.isIE = mode;
- }
- }
+ attr: function(property, value){
+ // summary:
+ // gets or sets the DOM attribute for every element in the
+ // NodeList. See also `dojo.attr`
+ // property: String
+ // the attribute to get/set
+ // value: String?
+ // optional. The value to set the property to
+ // returns:
+ // if no value is passed, the result is an array of attribute values
+ // If a value is passed, the return is this NodeList
+ // example:
+ // Make all nodes with a particular class focusable:
+ // | dojo.query(".focusable").attr("tabIndex", -1);
+ // example:
+ // Disable a group of buttons:
+ // | dojo.query("button.group").attr("disabled", true);
+ // example:
+ // innerHTML can be assigned or retrieved as well:
+ // | // get the innerHTML (as an array) for each list item
+ // | var ih = dojo.query("li.replaceable").attr("innerHTML");
+ return; // dojo.NodeList
+ return; // Array
+ },
- //Workaround to get local file loads of dojo to work on IE 7
- //by forcing to not use native xhr.
- if(dojo.isIE && window.location.protocol === "file:"){
- dojo.config.ieForceActiveXXhr=true;
- }
-
- d.isQuirks = document.compatMode == "BackCompat";
+ style: function(property, value){
+ // summary:
+ // gets or sets the CSS property for every element in the NodeList
+ // property: String
+ // the CSS property to get/set, in JavaScript notation
+ // ("lineHieght" instead of "line-height")
+ // value: String?
+ // optional. The value to set the property to
+ // returns:
+ // if no value is passed, the result is an array of strings.
+ // If a value is passed, the return is this NodeList
+ return; // dojo.NodeList
+ return; // Array
+ },
- // TODO: is the HTML LANG attribute relevant?
- d.locale = dojo.config.locale || (d.isIE ? n.userLanguage : n.language).toLowerCase();
+ addClass: function(className){
+ // summary:
+ // adds the specified class to every node in the list
+ // className: String|Array
+ // A String class name to add, or several space-separated class names,
+ // or an array of class names.
+ return; // dojo.NodeList
+ },
- // These are in order of decreasing likelihood; this will change in time.
- d._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
-
- d._xhrObj = function(){
+ removeClass: function(className){
// summary:
- // does the work of portably generating a new XMLHTTPRequest object.
- var http, last_e;
- if(!dojo.isIE || !dojo.config.ieForceActiveXXhr){
- try{ http = new XMLHttpRequest(); }catch(e){}
- }
- if(!http){
- for(var i=0; i<3; ++i){
- var progid = d._XMLHTTP_PROGIDS[i];
- try{
- http = new ActiveXObject(progid);
- }catch(e){
- last_e = e;
- }
+ // removes the specified class from every node in the list
+ // className: String|Array?
+ // An optional String class name to remove, or several space-separated
+ // class names, or an array of class names. If omitted, all class names
+ // will be deleted.
+ // returns:
+ // dojo.NodeList, this list
+ return; // dojo.NodeList
+ },
- if(http){
- d._XMLHTTP_PROGIDS = [progid]; // so faster next time
- break;
- }
- }
- }
-
- if(!http){
- throw new Error("XMLHTTP not available: "+last_e);
- }
+ toggleClass: function(className, condition){
+ // summary:
+ // Adds a class to node if not present, or removes if present.
+ // Pass a boolean condition if you want to explicitly add or remove.
+ // condition: Boolean?
+ // If passed, true means to add the class, false means to remove.
+ // className: String
+ // the CSS class to add
+ return; // dojo.NodeList
+ },
- return http; // XMLHTTPRequest instance
- }
+ empty: function(){
+ // summary:
+ // clears all content from each node in the list. Effectively
+ // equivalent to removing all child nodes from every item in
+ // the list.
+ return this.forEach("item.innerHTML='';"); // dojo.NodeList
+ // FIXME: should we be checking for and/or disposing of widgets below these nodes?
+ },
+ =====*/
- d._isDocumentOk = function(http){
- var stat = http.status || 0,
- lp = location.protocol;
- return (stat >= 200 && stat < 300) || // Boolean
- stat == 304 || // allow any 2XX response code
- stat == 1223 || // get it out of the cache
- // Internet Explorer mangled the status code
- // Internet Explorer mangled the status code OR we're Titanium/browser chrome/chrome extension requesting a local file
- (!stat && (lp == "file:" || lp == "chrome:" || lp == "chrome-extension:" || lp == "app:"));
- }
+ // useful html methods
+ attr: awc(getSet(domAttr), magicGuard),
+ style: awc(getSet(domStyle), magicGuard),
- //See if base tag is in use.
- //This is to fix http://trac.dojotoolkit.org/ticket/3973,
- //but really, we need to find out how to get rid of the dojo._Url reference
- //below and still have DOH work with the dojo.i18n test following some other
- //test that uses the test frame to load a document (trac #2757).
- //Opera still has problems, but perhaps a larger issue of base tag support
- //with XHR requests (hasBase is true, but the request is still made to document
- //path, not base path).
- var owloc = window.location+"";
- var base = document.getElementsByTagName("base");
- var hasBase = (base && base.length > 0);
+ addClass: aafe(domCls.add),
+ removeClass: aafe(domCls.remove),
+ replaceClass: aafe(domCls.replace),
+ toggleClass: aafe(domCls.toggle),
- d._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){
- // summary: Read the contents of the specified uri and return those contents.
- // uri:
- // A relative or absolute uri. If absolute, it still must be in
- // the same "domain" as we are.
- // fail_ok:
- // Default false. If fail_ok and loading fails, return null
- // instead of throwing.
- // returns: The response text. null is returned when there is a
- // failure and failure is okay (an exception otherwise)
+ empty: aafe(domCtr.empty),
+ removeAttr: aafe(domAttr.remove),
- // NOTE: must be declared before scope switches ie. this._xhrObj()
- var http = d._xhrObj();
+ position: aam(domGeom.position),
+ marginBox: aam(domGeom.getMarginBox),
- if(!hasBase && dojo._Url){
- uri = (new dojo._Url(owloc, uri)).toString();
- }
+ // FIXME: connectPublisher()? connectRunOnce()?
- if(d.config.cacheBust){
- //Make sure we have a string before string methods are used on uri
- uri += "";
- uri += (uri.indexOf("?") == -1 ? "?" : "&") + String(d.config.cacheBust).replace(/\W+/g,"");
- }
+ /*
+ destroy: function(){
+ // summary:
+ // destroys every item in the list.
+ this.forEach(d.destroy);
+ // FIXME: should we be checking for and/or disposing of widgets below these nodes?
+ },
+ */
- http.open('GET', uri, false);
- try{
- http.send(null);
- if(!d._isDocumentOk(http)){
- var err = Error("Unable to load "+uri+" status:"+ http.status);
- err.status = http.status;
- err.responseText = http.responseText;
- throw err;
- }
- }catch(e){
- if(fail_ok){ return null; } // null
- // rethrow the exception
- throw e;
- }
- return http.responseText; // String
- }
-
+ place: function(/*String||Node*/ queryOrNode, /*String*/ position){
+ // summary:
+ // places elements of this node list relative to the first element matched
+ // by queryOrNode. Returns the original NodeList. See: `dojo.place`
+ // queryOrNode:
+ // may be a string representing any valid CSS3 selector or a DOM node.
+ // In the selector case, only the first matching element will be used
+ // for relative positioning.
+ // position:
+ // can be one of:
+ // | "last" (default)
+ // | "first"
+ // | "before"
+ // | "after"
+ // | "only"
+ // | "replace"
+ // or an offset in the childNodes property
+ var item = query(queryOrNode)[0];
+ return this.forEach(function(node){ domCtr.place(node, item, position); }); // dojo.NodeList
+ },
- var _w = window;
- var _handleNodeEvent = function(/*String*/evtName, /*Function*/fp){
+ orphan: function(/*String?*/ filter){
// summary:
- // non-destructively adds the specified function to the node's
- // evtName handler.
- // evtName: should be in the form "onclick" for "onclick" handlers.
- // Make sure you pass in the "on" part.
- var _a = _w.attachEvent || _w.addEventListener;
- evtName = _w.attachEvent ? evtName : evtName.substring(2);
- _a(evtName, function(){
- fp.apply(_w, arguments);
- }, false);
- };
+ // removes elements in this list that match the filter
+ // from their parents and returns them as a new NodeList.
+ // filter:
+ // CSS selector like ".foo" or "div > span"
+ // returns:
+ // `dojo.NodeList` containing the orphaned elements
+ return (filter ? query._filterResult(this, filter) : this).forEach(orphan); // dojo.NodeList
+ },
+ adopt: function(/*String||Array||DomNode*/ queryOrListOrNode, /*String?*/ position){
+ // summary:
+ // places any/all elements in queryOrListOrNode at a
+ // position relative to the first element in this list.
+ // Returns a dojo.NodeList of the adopted elements.
+ // queryOrListOrNode:
+ // a DOM node or a query string or a query result.
+ // Represents the nodes to be adopted relative to the
+ // first element of this NodeList.
+ // position:
+ // can be one of:
+ // | "last" (default)
+ // | "first"
+ // | "before"
+ // | "after"
+ // | "only"
+ // | "replace"
+ // or an offset in the childNodes property
+ return query(queryOrListOrNode).place(this[0], position)._stash(this); // dojo.NodeList
+ },
- d._windowUnloaders = [];
-
- d.windowUnloaded = function(){
+ // FIXME: do we need this?
+ query: function(/*String*/ queryStr){
// summary:
- // signal fired by impending window destruction. You may use
- // dojo.addOnWindowUnload() to register a listener for this
- // event. NOTE: if you wish to dojo.connect() to this method
- // to perform page/application cleanup, be aware that this
- // event WILL NOT fire if no handler has been registered with
- // dojo.addOnWindowUnload. This behavior started in Dojo 1.3.
- // Previous versions always triggered dojo.windowUnloaded. See
- // dojo.addOnWindowUnload for more info.
- var mll = d._windowUnloaders;
- while(mll.length){
- (mll.pop())();
- }
- d = null;
- };
+ // Returns a new list whose members match the passed query,
+ // assuming elements of the current NodeList as the root for
+ // each search.
+ // example:
+ // assume a DOM created by this markup:
+ // | <div id="foo">
+ // | <p>
+ // | bacon is tasty, <span>dontcha think?</span>
+ // | </p>
+ // | </div>
+ // | <div id="bar">
+ // | <p>great comedians may not be funny <span>in person</span></p>
+ // | </div>
+ // If we are presented with the following definition for a NodeList:
+ // | var l = new dojo.NodeList(dojo.byId("foo"), dojo.byId("bar"));
+ // it's possible to find all span elements under paragraphs
+ // contained by these elements with this sub-query:
+ // | var spans = l.query("p span");
+
+ // FIXME: probably slow
+ if(!queryStr){ return this; }
+ var ret = new NodeList;
+ this.map(function(node){
+ // FIXME: why would we ever get undefined here?
+ query(queryStr, node).forEach(function(subNode){
+ if(subNode !== undefined){
+ ret.push(subNode);
+ }
+ });
+ });
+ return ret._stash(this); // dojo.NodeList
+ },
- var _onWindowUnloadAttached = 0;
- d.addOnWindowUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
+ filter: function(/*String|Function*/ filter){
// summary:
- // registers a function to be triggered when window.onunload
- // fires.
- // description:
- // The first time that addOnWindowUnload is called Dojo
- // will register a page listener to trigger your unload
- // handler with. Note that registering these handlers may
- // destory "fastback" page caching in browsers that support
- // it. Be careful trying to modify the DOM or access
- // JavaScript properties during this phase of page unloading:
- // they may not always be available. Consider
- // dojo.addOnUnload() if you need to modify the DOM or do
- // heavy JavaScript work since it fires at the eqivalent of
- // the page's "onbeforeunload" event.
+ // "masks" the built-in javascript filter() method (supported
+ // in Dojo via `dojo.filter`) to support passing a simple
+ // string filter in addition to supporting filtering function
+ // objects.
+ // filter:
+ // If a string, a CSS rule like ".thinger" or "div > span".
// example:
- // | dojo.addOnWindowUnload(functionPointer)
- // | dojo.addOnWindowUnload(object, "functionName");
- // | dojo.addOnWindowUnload(object, function(){ /* ... */});
+ // "regular" JS filter syntax as exposed in dojo.filter:
+ // | dojo.query("*").filter(function(item){
+ // | // highlight every paragraph
+ // | return (item.nodeName == "p");
+ // | }).style("backgroundColor", "yellow");
+ // example:
+ // the same filtering using a CSS selector
+ // | dojo.query("*").filter("p").styles("backgroundColor", "yellow");
- d._onto(d._windowUnloaders, obj, functionName);
- if(!_onWindowUnloadAttached){
- _onWindowUnloadAttached = 1;
- _handleNodeEvent("onunload", d.windowUnloaded);
+ var a = arguments, items = this, start = 0;
+ if(typeof filter == "string"){ // inline'd type check
+ items = query._filterResult(this, a[0]);
+ if(a.length == 1){
+ // if we only got a string query, pass back the filtered results
+ return items._stash(this); // dojo.NodeList
+ }
+ // if we got a callback, run it over the filtered items
+ start = 1;
}
- };
+ return this._wrap(array.filter(items, a[start], a[start + 1]), this); // dojo.NodeList
+ },
- var _onUnloadAttached = 0;
- d.addOnUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
+ /*
+ // FIXME: should this be "copyTo" and include parenting info?
+ clone: function(){
// summary:
- // registers a function to be triggered when the page unloads.
- // description:
- // The first time that addOnUnload is called Dojo will
- // register a page listener to trigger your unload handler
- // with.
- //
- // In a browser enviroment, the functions will be triggered
- // during the window.onbeforeunload event. Be careful of doing
- // too much work in an unload handler. onbeforeunload can be
- // triggered if a link to download a file is clicked, or if
- // the link is a javascript: link. In these cases, the
- // onbeforeunload event fires, but the document is not
- // actually destroyed. So be careful about doing destructive
- // operations in a dojo.addOnUnload callback.
- //
- // Further note that calling dojo.addOnUnload will prevent
- // browsers from using a "fast back" cache to make page
- // loading via back button instantaneous.
- // example:
- // | dojo.addOnUnload(functionPointer)
- // | dojo.addOnUnload(object, "functionName")
- // | dojo.addOnUnload(object, function(){ /* ... */});
+ // creates node clones of each element of this list
+ // and returns a new list containing the clones
+ },
+ */
- d._onto(d._unloaders, obj, functionName);
- if(!_onUnloadAttached){
- _onUnloadAttached = 1;
- _handleNodeEvent("onbeforeunload", dojo.unloaded);
+ addContent: function(/*String||DomNode||Object||dojo.NodeList*/ content, /*String||Integer?*/ position){
+ // summary:
+ // add a node, NodeList or some HTML as a string to every item in the
+ // list. Returns the original list.
+ // description:
+ // a copy of the HTML content is added to each item in the
+ // list, with an optional position argument. If no position
+ // argument is provided, the content is appended to the end of
+ // each item.
+ // content:
+ // DOM node, HTML in string format, a NodeList or an Object. If a DOM node or
+ // NodeList, the content will be cloned if the current NodeList has more than one
+ // element. Only the DOM nodes are cloned, no event handlers. If it is an Object,
+ // it should be an object with at "template" String property that has the HTML string
+ // to insert. If dojo.string has already been dojo.required, then dojo.string.substitute
+ // will be used on the "template" to generate the final HTML string. Other allowed
+ // properties on the object are: "parse" if the HTML
+ // string should be parsed for widgets (dojo.require("dojo.parser") to get that
+ // option to work), and "templateFunc" if a template function besides dojo.string.substitute
+ // should be used to transform the "template".
+ // position:
+ // can be one of:
+ // | "last"||"end" (default)
+ // | "first||"start"
+ // | "before"
+ // | "after"
+ // | "replace" (replaces nodes in this NodeList with new content)
+ // | "only" (removes other children of the nodes so new content is the only child)
+ // or an offset in the childNodes property
+ // example:
+ // appends content to the end if the position is omitted
+ // | dojo.query("h3 > p").addContent("hey there!");
+ // example:
+ // add something to the front of each element that has a
+ // "thinger" property:
+ // | dojo.query("[thinger]").addContent("...", "first");
+ // example:
+ // adds a header before each element of the list
+ // | dojo.query(".note").addContent("<h4>NOTE:</h4>", "before");
+ // example:
+ // add a clone of a DOM node to the end of every element in
+ // the list, removing it from its existing parent.
+ // | dojo.query(".note").addContent(dojo.byId("foo"));
+ // example:
+ // Append nodes from a templatized string.
+ // dojo.require("dojo.string");
+ // dojo.query(".note").addContent({
+ // template: '<b>${id}: </b><span>${name}</span>',
+ // id: "user332",
+ // name: "Mr. Anderson"
+ // });
+ // example:
+ // Append nodes from a templatized string that also has widgets parsed.
+ // dojo.require("dojo.string");
+ // dojo.require("dojo.parser");
+ // var notes = dojo.query(".note").addContent({
+ // template: '<button dojoType="dijit.form.Button">${text}</button>',
+ // parse: true,
+ // text: "Send"
+ // });
+ content = this._normalize(content, this[0]);
+ for(var i = 0, node; (node = this[i]); i++){
+ this._place(content, node, position, i > 0);
}
+ return this; //dojo.NodeList
+ }
+ });
+
+ /*===== return dojo.NodeList; =====*/
+ return NodeList;
+});
+
+},
+'dojo/query':function(){
+define(["./_base/kernel", "./has", "./dom", "./on", "./_base/array", "./_base/lang", "./selector/_loader", "./selector/_loader!default"],
+ function(dojo, has, dom, on, array, lang, loader, defaultEngine){
+"use strict";
+
+ has.add("array-extensible", function(){
+ // test to see if we can extend an array (not supported in old IE)
+ return lang.delegate([], {length: 1}).length == 1 && !has("bug-for-in-skips-shadowed");
+ });
+
+ var ap = Array.prototype, aps = ap.slice, apc = ap.concat, forEach = array.forEach;
+
+ var tnl = function(/*Array*/ a, /*dojo.NodeList?*/ parent, /*Function?*/ NodeListCtor){
+ // summary:
+ // decorate an array to make it look like a `dojo.NodeList`.
+ // a:
+ // Array of nodes to decorate.
+ // parent:
+ // An optional parent NodeList that generated the current
+ // list of nodes. Used to call _stash() so the parent NodeList
+ // can be accessed via end() later.
+ // NodeListCtor:
+ // An optional constructor function to use for any
+ // new NodeList calls. This allows a certain chain of
+ // NodeList calls to use a different object than dojo.NodeList.
+ var nodeList = new (NodeListCtor || this._NodeListCtor || nl)(a);
+ return parent ? nodeList._stash(parent) : nodeList;
+ };
+
+ var loopBody = function(f, a, o){
+ a = [0].concat(aps.call(a, 0));
+ o = o || dojo.global;
+ return function(node){
+ a[0] = node;
+ return f.apply(o, a);
};
+ };
- })();
+ // adapters
- //START DOMContentLoaded
- dojo._initFired = false;
- dojo._loadInit = function(e){
- if(dojo._scrollIntervalId){
- clearInterval(dojo._scrollIntervalId);
- dojo._scrollIntervalId = 0;
- }
+ var adaptAsForEach = function(f, o){
+ // summary:
+ // adapts a single node function to be used in the forEach-type
+ // actions. The initial object is returned from the specialized
+ // function.
+ // f: Function
+ // a function to adapt
+ // o: Object?
+ // an optional context for f
+ return function(){
+ this.forEach(loopBody(f, arguments, o));
+ return this; // Object
+ };
+ };
- if(!dojo._initFired){
- dojo._initFired = true;
+ var adaptAsMap = function(f, o){
+ // summary:
+ // adapts a single node function to be used in the map-type
+ // actions. The return is a new array of values, as via `dojo.map`
+ // f: Function
+ // a function to adapt
+ // o: Object?
+ // an optional context for f
+ return function(){
+ return this.map(loopBody(f, arguments, o));
+ };
+ };
- //Help out IE to avoid memory leak.
- if(!dojo.config.afterOnLoad && window.detachEvent){
- window.detachEvent("onload", dojo._loadInit);
- }
+ var adaptAsFilter = function(f, o){
+ // summary:
+ // adapts a single node function to be used in the filter-type actions
+ // f: Function
+ // a function to adapt
+ // o: Object?
+ // an optional context for f
+ return function(){
+ return this.filter(loopBody(f, arguments, o));
+ };
+ };
- if(dojo._inFlightCount == 0){
- dojo._modulesLoaded();
+ var adaptWithCondition = function(f, g, o){
+ // summary:
+ // adapts a single node function to be used in the map-type
+ // actions, behaves like forEach() or map() depending on arguments
+ // f: Function
+ // a function to adapt
+ // g: Function
+ // a condition function, if true runs as map(), otherwise runs as forEach()
+ // o: Object?
+ // an optional context for f and g
+ return function(){
+ var a = arguments, body = loopBody(f, a, o);
+ if(g.call(o || dojo.global, a)){
+ return this.map(body); // self
}
- }
- }
+ this.forEach(body);
+ return this; // self
+ };
+ };
- if(!dojo.config.afterOnLoad){
- if(document.addEventListener){
- //Standards. Hooray! Assumption here that if standards based,
- //it knows about DOMContentLoaded. It is OK if it does not, the fall through
- //to window onload should be good enough.
- document.addEventListener("DOMContentLoaded", dojo._loadInit, false);
- window.addEventListener("load", dojo._loadInit, false);
- }else if(window.attachEvent){
- window.attachEvent("onload", dojo._loadInit);
+ var NodeList = function(array){
+ // summary:
+ // dojo.NodeList is an of Array-like object which adds syntactic
+ // sugar for chaining, common iteration operations, animation, and
+ // node manipulation. NodeLists are most often returned as the
+ // result of dojo.query() calls.
+ // description:
+ // dojo.NodeList instances provide many utilities that reflect
+ // core Dojo APIs for Array iteration and manipulation, DOM
+ // manipulation, and event handling. Instead of needing to dig up
+ // functions in the dojo.* namespace, NodeLists generally make the
+ // full power of Dojo available for DOM manipulation tasks in a
+ // simple, chainable way.
+ // example:
+ // create a node list from a node
+ // | new dojo.NodeList(dojo.byId("foo"));
+ // example:
+ // get a NodeList from a CSS query and iterate on it
+ // | var l = dojo.query(".thinger");
+ // | l.forEach(function(node, index, nodeList){
+ // | console.log(index, node.innerHTML);
+ // | });
+ // example:
+ // use native and Dojo-provided array methods to manipulate a
+ // NodeList without needing to use dojo.* functions explicitly:
+ // | var l = dojo.query(".thinger");
+ // | // since NodeLists are real arrays, they have a length
+ // | // property that is both readable and writable and
+ // | // push/pop/shift/unshift methods
+ // | console.log(l.length);
+ // | l.push(dojo.create("span"));
+ // |
+ // | // dojo's normalized array methods work too:
+ // | console.log( l.indexOf(dojo.byId("foo")) );
+ // | // ...including the special "function as string" shorthand
+ // | console.log( l.every("item.nodeType == 1") );
+ // |
+ // | // NodeLists can be [..] indexed, or you can use the at()
+ // | // function to get specific items wrapped in a new NodeList:
+ // | var node = l[3]; // the 4th element
+ // | var newList = l.at(1, 3); // the 2nd and 4th elements
+ // example:
+ // the style functions you expect are all there too:
+ // | // style() as a getter...
+ // | var borders = dojo.query(".thinger").style("border");
+ // | // ...and as a setter:
+ // | dojo.query(".thinger").style("border", "1px solid black");
+ // | // class manipulation
+ // | dojo.query("li:nth-child(even)").addClass("even");
+ // | // even getting the coordinates of all the items
+ // | var coords = dojo.query(".thinger").coords();
+ // example:
+ // DOM manipulation functions from the dojo.* namespace area also
+ // available:
+ // | // remove all of the elements in the list from their
+ // | // parents (akin to "deleting" them from the document)
+ // | dojo.query(".thinger").orphan();
+ // | // place all elements in the list at the front of #foo
+ // | dojo.query(".thinger").place("foo", "first");
+ // example:
+ // Event handling couldn't be easier. `dojo.connect` is mapped in,
+ // and shortcut handlers are provided for most DOM events:
+ // | // like dojo.connect(), but with implicit scope
+ // | dojo.query("li").connect("onclick", console, "log");
+ // |
+ // | // many common event handlers are already available directly:
+ // | dojo.query("li").onclick(console, "log");
+ // | var toggleHovered = dojo.hitch(dojo, "toggleClass", "hovered");
+ // | dojo.query("p")
+ // | .onmouseenter(toggleHovered)
+ // | .onmouseleave(toggleHovered);
+ // example:
+ // chainability is a key advantage of NodeLists:
+ // | dojo.query(".thinger")
+ // | .onclick(function(e){ /* ... */ })
+ // | .at(1, 3, 8) // get a subset
+ // | .style("padding", "5px")
+ // | .forEach(console.log);
+ var isNew = this instanceof nl && has("array-extensible");
+ if(typeof array == "number"){
+ array = Array(array);
+ }
+ var nodeArray = (array && "length" in array) ? array : arguments;
+ if(isNew || !nodeArray.sort){
+ // make sure it's a real array before we pass it on to be wrapped
+ var target = isNew ? this : [],
+ l = target.length = nodeArray.length;
+ for(var i = 0; i < l; i++){
+ target[i] = nodeArray[i];
+ }
+ if(isNew){
+ // called with new operator, this means we are going to use this instance and push
+ // the nodes on to it. This is usually much faster since the NodeList properties
+ // don't need to be copied (unless the list of nodes is extremely large).
+ return target;
+ }
+ nodeArray = target;
+ }
+ // called without new operator, use a real array and copy prototype properties,
+ // this is slower and exists for back-compat. Should be removed in 2.0.
+ lang._mixin(nodeArray, nlp);
+ nodeArray._NodeListCtor = function(array){
+ // call without new operator to preserve back-compat behavior
+ return nl(array);
+ };
+ return nodeArray;
+ };
+
+ var nl = NodeList, nlp = nl.prototype =
+ has("array-extensible") ? [] : {};// extend an array if it is extensible
- //DOMContentLoaded approximation. Diego Perini found this MSDN article
- //that indicates doScroll is available after DOM ready, so do a setTimeout
- //to check when it is available.
- //http://msdn.microsoft.com/en-us/library/ms531426.aspx
- if(!dojo.config.skipIeDomLoaded && self === self.top){
- dojo._scrollIntervalId = setInterval(function (){
- try{
- //When dojo is loaded into an iframe in an IE HTML Application
- //(HTA), such as in a selenium test, javascript in the iframe
- //can't see anything outside of it, so self===self.top is true,
- //but the iframe is not the top window and doScroll will be
- //available before document.body is set. Test document.body
- //before trying the doScroll trick
- if(document.body){
- document.documentElement.doScroll("left");
- dojo._loadInit();
- }
- }catch (e){}
- }, 30);
- }
- }
- }
+ // expose adapters and the wrapper as private functions
- if(dojo.isIE){
- try{
- (function(){
- document.namespaces.add("v", "urn:schemas-microsoft-com:vml");
- var vmlElems = ["*", "group", "roundrect", "oval", "shape", "rect", "imagedata", "path", "textpath", "text"],
- i = 0, l = 1, s = document.createStyleSheet();
- if(dojo.isIE >= 8){
- i = 1;
- l = vmlElems.length;
- }
- for(; i < l; ++i){
- s.addRule("v\\:" + vmlElems[i], "behavior:url(#default#VML); display:inline-block");
- }
- })();
- }catch(e){}
- }
- //END DOMContentLoaded
+ nl._wrap = nlp._wrap = tnl;
+ nl._adaptAsMap = adaptAsMap;
+ nl._adaptAsForEach = adaptAsForEach;
+ nl._adaptAsFilter = adaptAsFilter;
+ nl._adaptWithCondition = adaptWithCondition;
+ // mass assignment
- /*
- OpenAjax.subscribe("OpenAjax", "onload", function(){
- if(dojo._inFlightCount == 0){
- dojo._modulesLoaded();
- }
+ // add array redirectors
+ forEach(["slice", "splice"], function(name){
+ var f = ap[name];
+ //Use a copy of the this array via this.slice() to allow .end() to work right in the splice case.
+ // CANNOT apply ._stash()/end() to splice since it currently modifies
+ // the existing this array -- it would break backward compatibility if we copy the array before
+ // the splice so that we can use .end(). So only doing the stash option to this._wrap for slice.
+ nlp[name] = function(){ return this._wrap(f.apply(this, arguments), name == "slice" ? this : null); };
});
+ // concat should be here but some browsers with native NodeList have problems with it
- OpenAjax.subscribe("OpenAjax", "onunload", function(){
- dojo.unloaded();
+ // add array.js redirectors
+ forEach(["indexOf", "lastIndexOf", "every", "some"], function(name){
+ var f = array[name];
+ nlp[name] = function(){ return f.apply(dojo, [this].concat(aps.call(arguments, 0))); };
});
- */
-} //if (typeof window != 'undefined')
-//Register any module paths set up in djConfig. Need to do this
-//in the hostenvs since hostenv_browser can read djConfig from a
-//script tag's attribute.
-(function(){
- var mp = dojo.config["modulePaths"];
- if(mp){
- for(var param in mp){
- dojo.registerModulePath(param, mp[param]);
- }
- }
-})();
+ /*===== var NodeList = dojo.NodeList; =====*/
+ lang.extend(NodeList, {
+ // copy the constructors
+ constructor: nl,
+ _NodeListCtor: nl,
+ toString: function(){
+ // Array.prototype.toString can't be applied to objects, so we use join
+ return this.join(",");
+ },
+ _stash: function(parent){
+ // summary:
+ // private function to hold to a parent NodeList. end() to return the parent NodeList.
+ //
+ // example:
+ // How to make a `dojo.NodeList` method that only returns the third node in
+ // the dojo.NodeList but allows access to the original NodeList by using this._stash:
+ // | dojo.extend(dojo.NodeList, {
+ // | third: function(){
+ // | var newNodeList = dojo.NodeList(this[2]);
+ // | return newNodeList._stash(this);
+ // | }
+ // | });
+ // | // then see how _stash applies a sub-list, to be .end()'ed out of
+ // | dojo.query(".foo")
+ // | .third()
+ // | .addClass("thirdFoo")
+ // | .end()
+ // | // access to the orig .foo list
+ // | .removeClass("foo")
+ // |
+ //
+ this._parent = parent;
+ return this; //dojo.NodeList
+ },
-//Load debug code if necessary.
-if(dojo.config.isDebug){
- dojo.require("dojo._firebug.firebug");
-}
+ on: function(eventName, listener){
+ // summary:
+ // Listen for events on the nodes in the NodeList. Basic usage is:
+ // | query(".my-class").on("click", listener);
+ // This supports event delegation by using selectors as the first argument with the event names as
+ // pseudo selectors. For example:
+ // | dojo.query("#my-list").on("li:click", listener);
+ // This will listen for click events within <li> elements that are inside the #my-list element.
+ // Because on supports CSS selector syntax, we can use comma-delimited events as well:
+ // | dojo.query("#my-list").on("li button:mouseover, li:click", listener);
+ var handles = this.map(function(node){
+ return on(node, eventName, listener); // TODO: apply to the NodeList so the same selector engine is used for matches
+ });
+ handles.remove = function(){
+ for(var i = 0; i < handles.length; i++){
+ handles[i].remove();
+ }
+ };
+ return handles;
+ },
-if(dojo.config.debugAtAllCosts){
- // this breaks the new AMD based module loader. The XDomain won't be necessary
- // anyway if you switch to the asynchronous loader
- //dojo.config.useXDomain = true;
- //dojo.require("dojo._base._loader.loader_xd");
- dojo.require("dojo._base._loader.loader_debug");
- dojo.require("dojo.i18n");
-}
+ end: function(){
+ // summary:
+ // Ends use of the current `dojo.NodeList` by returning the previous dojo.NodeList
+ // that generated the current dojo.NodeList.
+ // description:
+ // Returns the `dojo.NodeList` that generated the current `dojo.NodeList`. If there
+ // is no parent dojo.NodeList, an empty dojo.NodeList is returned.
+ // example:
+ // | dojo.query("a")
+ // | .filter(".disabled")
+ // | // operate on the anchors that only have a disabled class
+ // | .style("color", "grey")
+ // | .end()
+ // | // jump back to the list of anchors
+ // | .style(...)
+ //
+ if(this._parent){
+ return this._parent;
+ }else{
+ //Just return empty list.
+ return new this._NodeListCtor(0);
+ }
+ },
+ // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Methods
-if(!dojo._hasResource["dojo._base.lang"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.lang"] = true;
-dojo.provide("dojo._base.lang");
+ // FIXME: handle return values for #3244
+ // http://trac.dojotoolkit.org/ticket/3244
+ // FIXME:
+ // need to wrap or implement:
+ // join (perhaps w/ innerHTML/outerHTML overload for toString() of items?)
+ // reduce
+ // reduceRight
-(function(){
- var d = dojo, opts = Object.prototype.toString;
+ /*=====
+ slice: function(begin, end){
+ // summary:
+ // Returns a new NodeList, maintaining this one in place
+ // description:
+ // This method behaves exactly like the Array.slice method
+ // with the caveat that it returns a dojo.NodeList and not a
+ // raw Array. For more details, see Mozilla's (slice
+ // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:slice]
+ // begin: Integer
+ // Can be a positive or negative integer, with positive
+ // integers noting the offset to begin at, and negative
+ // integers denoting an offset from the end (i.e., to the left
+ // of the end)
+ // end: Integer?
+ // Optional parameter to describe what position relative to
+ // the NodeList's zero index to end the slice at. Like begin,
+ // can be positive or negative.
+ return this._wrap(a.slice.apply(this, arguments));
+ },
- // Crockford (ish) functions
+ splice: function(index, howmany, item){
+ // summary:
+ // Returns a new NodeList, manipulating this NodeList based on
+ // the arguments passed, potentially splicing in new elements
+ // at an offset, optionally deleting elements
+ // description:
+ // This method behaves exactly like the Array.splice method
+ // with the caveat that it returns a dojo.NodeList and not a
+ // raw Array. For more details, see Mozilla's (splice
+ // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:splice]
+ // For backwards compatibility, calling .end() on the spliced NodeList
+ // does not return the original NodeList -- splice alters the NodeList in place.
+ // index: Integer
+ // begin can be a positive or negative integer, with positive
+ // integers noting the offset to begin at, and negative
+ // integers denoting an offset from the end (i.e., to the left
+ // of the end)
+ // howmany: Integer?
+ // Optional parameter to describe what position relative to
+ // the NodeList's zero index to end the slice at. Like begin,
+ // can be positive or negative.
+ // item: Object...?
+ // Any number of optional parameters may be passed in to be
+ // spliced into the NodeList
+ // returns:
+ // dojo.NodeList
+ return this._wrap(a.splice.apply(this, arguments));
+ },
- dojo.isString = function(/*anything*/ it){
- // summary:
- // Return true if it is a String
- return (typeof it == "string" || it instanceof String); // Boolean
- };
+ indexOf: function(value, fromIndex){
+ // summary:
+ // see dojo.indexOf(). The primary difference is that the acted-on
+ // array is implicitly this NodeList
+ // value: Object:
+ // The value to search for.
+ // fromIndex: Integer?:
+ // The location to start searching from. Optional. Defaults to 0.
+ // description:
+ // For more details on the behavior of indexOf, see Mozilla's
+ // (indexOf
+ // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf]
+ // returns:
+ // Positive Integer or 0 for a match, -1 of not found.
+ return d.indexOf(this, value, fromIndex); // Integer
+ },
- dojo.isArray = function(/*anything*/ it){
- // summary:
- // Return true if it is an Array.
- // Does not work on Arrays created in other windows.
- return it && (it instanceof Array || typeof it == "array"); // Boolean
- };
+ lastIndexOf: function(value, fromIndex){
+ // summary:
+ // see dojo.lastIndexOf(). The primary difference is that the
+ // acted-on array is implicitly this NodeList
+ // description:
+ // For more details on the behavior of lastIndexOf, see
+ // Mozilla's (lastIndexOf
+ // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:lastIndexOf]
+ // value: Object
+ // The value to search for.
+ // fromIndex: Integer?
+ // The location to start searching from. Optional. Defaults to 0.
+ // returns:
+ // Positive Integer or 0 for a match, -1 of not found.
+ return d.lastIndexOf(this, value, fromIndex); // Integer
+ },
- dojo.isFunction = function(/*anything*/ it){
- // summary:
- // Return true if it is a Function
- return opts.call(it) === "[object Function]";
- };
+ every: function(callback, thisObject){
+ // summary:
+ // see `dojo.every()` and the (Array.every
+ // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every].
+ // Takes the same structure of arguments and returns as
+ // dojo.every() with the caveat that the passed array is
+ // implicitly this NodeList
+ // callback: Function: the callback
+ // thisObject: Object?: the context
+ return d.every(this, callback, thisObject); // Boolean
+ },
- dojo.isObject = function(/*anything*/ it){
- // summary:
- // Returns true if it is a JavaScript object (or an Array, a Function
- // or null)
- return it !== undefined &&
- (it === null || typeof it == "object" || d.isArray(it) || d.isFunction(it)); // Boolean
- };
+ some: function(callback, thisObject){
+ // summary:
+ // Takes the same structure of arguments and returns as
+ // `dojo.some()` with the caveat that the passed array is
+ // implicitly this NodeList. See `dojo.some()` and Mozilla's
+ // (Array.some
+ // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some].
+ // callback: Function: the callback
+ // thisObject: Object?: the context
+ return d.some(this, callback, thisObject); // Boolean
+ },
+ =====*/
- dojo.isArrayLike = function(/*anything*/ it){
- // summary:
- // similar to dojo.isArray() but more permissive
- // description:
- // Doesn't strongly test for "arrayness". Instead, settles for "isn't
- // a string or number and has a length property". Arguments objects
- // and DOM collections will return true when passed to
- // dojo.isArrayLike(), but will return false when passed to
- // dojo.isArray().
- // returns:
- // If it walks like a duck and quacks like a duck, return `true`
- return it && it !== undefined && // Boolean
- // keep out built-in constructors (Number, String, ...) which have length
- // properties
- !d.isString(it) && !d.isFunction(it) &&
- !(it.tagName && it.tagName.toLowerCase() == 'form') &&
- (d.isArray(it) || isFinite(it.length));
- };
+ concat: function(item){
+ // summary:
+ // Returns a new NodeList comprised of items in this NodeList
+ // as well as items passed in as parameters
+ // description:
+ // This method behaves exactly like the Array.concat method
+ // with the caveat that it returns a `dojo.NodeList` and not a
+ // raw Array. For more details, see the (Array.concat
+ // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:concat]
+ // item: Object?
+ // Any number of optional parameters may be passed in to be
+ // spliced into the NodeList
+ // returns:
+ // dojo.NodeList
- dojo.isAlien = function(/*anything*/ it){
- // summary:
- // Returns true if it is a built-in function or some other kind of
- // oddball that *should* report as a function but doesn't
- return it && !d.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean
- };
+ //return this._wrap(apc.apply(this, arguments));
+ // the line above won't work for the native NodeList :-(
- dojo.extend = function(/*Object*/ constructor, /*Object...*/ props){
- // summary:
- // Adds all properties and methods of props to constructor's
- // prototype, making them available to all instances created with
- // constructor.
- for(var i=1, l=arguments.length; i<l; i++){
- d._mixin(constructor.prototype, arguments[i]);
+ // implementation notes:
+ // 1) Native NodeList is not an array, and cannot be used directly
+ // in concat() --- the latter doesn't recognize it as an array, and
+ // does not inline it, but append as a single entity.
+ // 2) On some browsers (e.g., Safari) the "constructor" property is
+ // read-only and cannot be changed. So we have to test for both
+ // native NodeList and dojo.NodeList in this property to recognize
+ // the node list.
+
+ var t = lang.isArray(this) ? this : aps.call(this, 0),
+ m = array.map(arguments, function(a){
+ return a && !lang.isArray(a) &&
+ (typeof NodeList != "undefined" && a.constructor === NodeList || a.constructor === this._NodeListCtor) ?
+ aps.call(a, 0) : a;
+ });
+ return this._wrap(apc.apply(t, m), this); // dojo.NodeList
+ },
+
+ map: function(/*Function*/ func, /*Function?*/ obj){
+ // summary:
+ // see dojo.map(). The primary difference is that the acted-on
+ // array is implicitly this NodeList and the return is a
+ // dojo.NodeList (a subclass of Array)
+ ///return d.map(this, func, obj, d.NodeList); // dojo.NodeList
+ return this._wrap(array.map(this, func, obj), this); // dojo.NodeList
+ },
+
+ forEach: function(callback, thisObj){
+ // summary:
+ // see `dojo.forEach()`. The primary difference is that the acted-on
+ // array is implicitly this NodeList. If you want the option to break out
+ // of the forEach loop, use every() or some() instead.
+ forEach(this, callback, thisObj);
+ // non-standard return to allow easier chaining
+ return this; // dojo.NodeList
+ },
+ filter: function(/*String|Function*/ filter){
+ // summary:
+ // "masks" the built-in javascript filter() method (supported
+ // in Dojo via `dojo.filter`) to support passing a simple
+ // string filter in addition to supporting filtering function
+ // objects.
+ // filter:
+ // If a string, a CSS rule like ".thinger" or "div > span".
+ // example:
+ // "regular" JS filter syntax as exposed in dojo.filter:
+ // | dojo.query("*").filter(function(item){
+ // | // highlight every paragraph
+ // | return (item.nodeName == "p");
+ // | }).style("backgroundColor", "yellow");
+ // example:
+ // the same filtering using a CSS selector
+ // | dojo.query("*").filter("p").styles("backgroundColor", "yellow");
+
+ var a = arguments, items = this, start = 0;
+ if(typeof filter == "string"){ // inline'd type check
+ items = query._filterResult(this, a[0]);
+ if(a.length == 1){
+ // if we only got a string query, pass back the filtered results
+ return items._stash(this); // dojo.NodeList
+ }
+ // if we got a callback, run it over the filtered items
+ start = 1;
+ }
+ return this._wrap(array.filter(items, a[start], a[start + 1]), this); // dojo.NodeList
+ },
+ instantiate: function(/*String|Object*/ declaredClass, /*Object?*/ properties){
+ // summary:
+ // Create a new instance of a specified class, using the
+ // specified properties and each node in the nodeList as a
+ // srcNodeRef.
+ // example:
+ // Grabs all buttons in the page and converts them to diji.form.Buttons.
+ // | var buttons = dojo.query("button").instantiate("dijit.form.Button", {showLabel: true});
+ var c = lang.isFunction(declaredClass) ? declaredClass : lang.getObject(declaredClass);
+ properties = properties || {};
+ return this.forEach(function(node){
+ new c(properties, node);
+ }); // dojo.NodeList
+ },
+ at: function(/*===== index =====*/){
+ // summary:
+ // Returns a new NodeList comprised of items in this NodeList
+ // at the given index or indices.
+ //
+ // index: Integer...
+ // One or more 0-based indices of items in the current
+ // NodeList. A negative index will start at the end of the
+ // list and go backwards.
+ //
+ // example:
+ // Shorten the list to the first, second, and third elements
+ // | dojo.query("a").at(0, 1, 2).forEach(fn);
+ //
+ // example:
+ // Retrieve the first and last elements of a unordered list:
+ // | dojo.query("ul > li").at(0, -1).forEach(cb);
+ //
+ // example:
+ // Do something for the first element only, but end() out back to
+ // the original list and continue chaining:
+ // | dojo.query("a").at(0).onclick(fn).end().forEach(function(n){
+ // | console.log(n); // all anchors on the page.
+ // | })
+ //
+ // returns:
+ // dojo.NodeList
+ var t = new this._NodeListCtor(0);
+ forEach(arguments, function(i){
+ if(i < 0){ i = this.length + i; }
+ if(this[i]){ t.push(this[i]); }
+ }, this);
+ return t._stash(this); // dojo.NodeList
}
- return constructor; // Object
- };
+ });
- dojo._hitchArgs = function(scope, method /*,...*/){
- var pre = d._toArray(arguments, 2);
- var named = d.isString(method);
- return function(){
- // arrayify arguments
- var args = d._toArray(arguments);
- // locate our method
- var f = named ? (scope||d.global)[method] : method;
- // invoke with collected args
- return f && f.apply(scope || this, pre.concat(args)); // mixed
- }; // Function
- };
- dojo.hitch = function(/*Object*/scope, /*Function|String*/method /*,...*/){
+/*=====
+dojo.query = function(selector, context){
+ // summary:
+ // This modules provides DOM querying functionality. The module export is a function
+ // that can be used to query for DOM nodes by CSS selector and returns a dojo.NodeList
+ // representing the matching nodes.
+ //
+ // selector: String
+ // A CSS selector to search for.
+ // context: String|DomNode?
+ // An optional context to limit the searching scope. Only nodes under `context` will be
+ // scanned.
+ //
+ // example:
+ // add an onclick handler to every submit button in the document
+ // which causes the form to be sent via Ajax instead:
+ // | define(["dojo/query"], function(query){
+ // | query("input[type='submit']").on("click", function(e){
+ // | dojo.stopEvent(e); // prevent sending the form
+ // | var btn = e.target;
+ // | dojo.xhrPost({
+ // | form: btn.form,
+ // | load: function(data){
+ // | // replace the form with the response
+ // | var div = dojo.doc.createElement("div");
+ // | dojo.place(div, btn.form, "after");
+ // | div.innerHTML = data;
+ // | dojo.style(btn.form, "display", "none");
+ // | }
+ // | });
+ // | });
+ //
+ // description:
+ // dojo/query is responsible for loading the appropriate query engine and wrapping
+ // its results with a `dojo.NodeList`. You can use dojo/query with a specific selector engine
+ // by using it as a plugin. For example, if you installed the sizzle package, you could
+ // use it as the selector engine with:
+ // | define("dojo/query!sizzle", function(query){
+ // | query("div")...
+ //
+ // The id after the ! can be a module id of the selector engine or one of the following values:
+ // | + acme: This is the default engine used by Dojo base, and will ensure that the full
+ // | Acme engine is always loaded.
+ // |
+ // | + css2: If the browser has a native selector engine, this will be used, otherwise a
+ // | very minimal lightweight selector engine will be loaded that can do simple CSS2 selectors
+ // | (by #id, .class, tag, and [name=value] attributes, with standard child or descendant (>)
+ // | operators) and nothing more.
+ // |
+ // | + css2.1: If the browser has a native selector engine, this will be used, otherwise the
+ // | full Acme engine will be loaded.
+ // |
+ // | + css3: If the browser has a native selector engine with support for CSS3 pseudo
+ // | selectors (most modern browsers except IE8), this will be used, otherwise the
+ // | full Acme engine will be loaded.
+ // |
+ // | + Or the module id of a selector engine can be used to explicitly choose the selector engine
+ //
+ // For example, if you are using CSS3 pseudo selectors in module, you can specify that
+ // you will need support them with:
+ // | define("dojo/query!css3", function(query){
+ // | query('#t > h3:nth-child(odd)')...
+ //
+ // You can also choose the selector engine/load configuration by setting the <FIXME:what is the configuration setting?>.
+ // For example:
+ // | <script data-dojo-config="query-selector:'css3'" src="dojo.js"></script>
+ //
+ return new dojo.NodeList(); // dojo.NodeList
+};
+=====*/
+
+function queryForEngine(engine, NodeList){
+ var query = function(/*String*/ query, /*String|DOMNode?*/ root){
// summary:
- // Returns a function that will only ever execute in the a given scope.
- // This allows for easy use of object member functions
- // in callbacks and other places in which the "this" keyword may
- // otherwise not reference the expected scope.
- // Any number of default positional arguments may be passed as parameters
- // beyond "method".
- // Each of these values will be used to "placehold" (similar to curry)
- // for the hitched function.
- // scope:
- // The scope to use when method executes. If method is a string,
- // scope is also the object containing method.
- // method:
- // A function to be hitched to scope, or the name of the method in
- // scope to be hitched.
- // example:
- // | dojo.hitch(foo, "bar")();
- // runs foo.bar() in the scope of foo
- // example:
- // | dojo.hitch(foo, myFunction);
- // returns a function that runs myFunction in the scope of foo
- // example:
- // Expansion on the default positional arguments passed along from
- // hitch. Passed args are mixed first, additional args after.
- // | var foo = { bar: function(a, b, c){ console.log(a, b, c); } };
- // | var fn = dojo.hitch(foo, "bar", 1, 2);
- // | fn(3); // logs "1, 2, 3"
- // example:
- // | var foo = { bar: 2 };
- // | dojo.hitch(foo, function(){ this.bar = 10; })();
- // execute an anonymous function in scope of foo
-
- if(arguments.length > 2){
- return d._hitchArgs.apply(d, arguments); // Function
- }
- if(!method){
- method = scope;
- scope = null;
+ // Returns nodes which match the given CSS selector, searching the
+ // entire document by default but optionally taking a node to scope
+ // the search by. Returns an instance of dojo.NodeList.
+ if(typeof root == "string"){
+ root = dom.byId(root);
+ if(!root){
+ return new NodeList([]);
+ }
}
- if(d.isString(method)){
- scope = scope || d.global;
- if(!scope[method]){ throw(['dojo.hitch: scope["', method, '"] is null (scope="', scope, '")'].join('')); }
- return function(){ return scope[method].apply(scope, arguments || []); }; // Function
+ var results = typeof query == "string" ? engine(query, root) : query.orphan ? query : [query];
+ if(results.orphan){
+ // already wrapped
+ return results;
}
- return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function
+ return new NodeList(results);
};
-
- /*=====
- dojo.delegate = function(obj, props){
- // summary:
- // Returns a new object which "looks" to obj for properties which it
- // does not have a value for. Optionally takes a bag of properties to
- // seed the returned object with initially.
- // description:
- // This is a small implementaton of the Boodman/Crockford delegation
- // pattern in JavaScript. An intermediate object constructor mediates
- // the prototype chain for the returned object, using it to delegate
- // down to obj for property lookup when object-local lookup fails.
- // This can be thought of similarly to ES4's "wrap", save that it does
- // not act on types but rather on pure objects.
- // obj:
- // The object to delegate to for properties not found directly on the
- // return object or in props.
- // props:
- // an object containing properties to assign to the returned object
- // returns:
- // an Object of anonymous type
- // example:
- // | var foo = { bar: "baz" };
- // | var thinger = dojo.delegate(foo, { thud: "xyzzy"});
- // | thinger.bar == "baz"; // delegated to foo
- // | foo.thud == undefined; // by definition
- // | thinger.thud == "xyzzy"; // mixed in from props
- // | foo.bar = "thonk";
- // | thinger.bar == "thonk"; // still delegated to foo's bar
+ query.matches = engine.match || function(node, selector, root){
+ // summary:
+ // Test to see if a node matches a selector
+ return query.filter([node], selector, root).length > 0;
+ };
+ // the engine provides a filtering function, use it to for matching
+ query.filter = engine.filter || function(nodes, selector, root){
+ // summary:
+ // Filters an array of nodes. Note that this does not guarantee to return a dojo.NodeList, just an array.
+ return query(selector, root).filter(function(node){
+ return array.indexOf(nodes, node) > -1;
+ });
+ };
+ if(typeof engine != "function"){
+ var search = engine.search;
+ engine = function(selector, root){
+ // Slick does it backwards (or everyone else does it backwards, probably the latter)
+ return search(root || document, selector);
+ };
}
- =====*/
+ return query;
+}
+var query = queryForEngine(defaultEngine, NodeList);
+// the query that is returned from this module is slightly different than dojo.query,
+// because dojo.query has to maintain backwards compatibility with returning a
+// true array which has performance problems. The query returned from the module
+// does not use true arrays, but rather inherits from Array, making it much faster to
+// instantiate.
+dojo.query = queryForEngine(defaultEngine, function(array){
+ // call it without the new operator to invoke the back-compat behavior that returns a true array
+ return NodeList(array);
+});
+
+query.load = /*===== dojo.query.load= ======*/ function(id, parentRequire, loaded, config){
+ // summary: can be used as AMD plugin to conditionally load new query engine
+ // example:
+ // | define(["dojo/query!custom"], function(qsa){
+ // | // loaded selector/custom.js as engine
+ // | qsa("#foobar").forEach(...);
+ // | });
+ loader.load(id, parentRequire, function(engine){
+ loaded(queryForEngine(engine, NodeList));
+ });
+};
- dojo.delegate = dojo._delegate = (function(){
- // boodman/crockford delegation w/ cornford optimization
- function TMP(){}
- return function(obj, props){
- TMP.prototype = obj;
- var tmp = new TMP();
- TMP.prototype = null;
- if(props){
- d._mixin(tmp, props);
- }
- return tmp; // Object
+dojo._filterQueryResult = query._filterResult = function(nodes, selector, root){
+ return new NodeList(query.filter(nodes, selector, root));
+};
+dojo.NodeList = query.NodeList = NodeList;
+return query;
+});
+
+},
+'dojo/has':function(){
+define(["require"], function(require) {
+ // module:
+ // dojo/has
+ // summary:
+ // Defines the has.js API and several feature tests used by dojo.
+ // description:
+ // This module defines the has API as described by the project has.js with the following additional features:
+ //
+ // * the has test cache is exposed at has.cache.
+ // * the method has.add includes a forth parameter that controls whether or not existing tests are replaced
+ // * the loader's has cache may be optionally copied into this module's has cahce.
+ //
+ // This module adopted from https://github.com/phiggins42/has.js; thanks has.js team!
+
+ // try to pull the has implementation from the loader; both the dojo loader and bdLoad provide one
+ // WARNING: if a foreign loader defines require.has to be something other than the has.js API, then this implementation fail
+ var has = require.has || function(){};
+ if(!1){
+ // notice the condition is written so that if 1 is transformed to 1 during a build
+ // the conditional will be (!1 && typeof has=="function") which is statically false and the closure
+ // compiler will discard the block.
+ var
+ isBrowser =
+ // the most fundamental decision: are we in the browser?
+ typeof window != "undefined" &&
+ typeof location != "undefined" &&
+ typeof document != "undefined" &&
+ window.location == location && window.document == document,
+
+ // has API variables
+ global = this,
+ doc = isBrowser && document,
+ element = doc && doc.createElement("DiV"),
+ cache = {};
+
+ has = /*===== dojo.has= =====*/ function(name){
+ // summary:
+ // Return the current value of the named feature.
+ //
+ // name: String|Integer
+ // The name (if a string) or identifier (if an integer) of the feature to test.
+ //
+ // description:
+ // Returns the value of the feature named by name. The feature must have been
+ // previously added to the cache by has.add.
+
+ return typeof cache[name] == "function" ? (cache[name] = cache[name](global, doc, element)) : cache[name]; // Boolean
};
- })();
- /*=====
- dojo._toArray = function(obj, offset, startWith){
- // summary:
- // Converts an array-like object (i.e. arguments, DOMCollection) to an
- // array. Returns a new Array with the elements of obj.
- // obj: Object
- // the object to "arrayify". We expect the object to have, at a
- // minimum, a length property which corresponds to integer-indexed
- // properties.
- // offset: Number?
- // the location in obj to start iterating from. Defaults to 0.
- // Optional.
- // startWith: Array?
- // An array to pack with the properties of obj. If provided,
- // properties in obj are appended at the end of startWith and
- // startWith is the returned array.
+ has.cache = cache;
+
+ has.add = /*====== dojo.has.add= ======*/ function(name, test, now, force){
+ // summary:
+ // Register a new feature test for some named feature.
+ //
+ // name: String|Integer
+ // The name (if a string) or identifier (if an integer) of the feature to test.
+ //
+ // test: Function
+ // A test function to register. If a function, queued for testing until actually
+ // needed. The test function should return a boolean indicating
+ // the presence of a feature or bug.
+ //
+ // now: Boolean?
+ // Optional. Omit if `test` is not a function. Provides a way to immediately
+ // run the test and cache the result.
+ //
+ // force: Boolean?
+ // Optional. If the test already exists and force is truthy, then the existing
+ // test will be replaced; otherwise, add does not replace an existing test (that
+ // is, by default, the first test advice wins).
+ //
+ // example:
+ // A redundant test, testFn with immediate execution:
+ // | has.add("javascript", function(){ return true; }, true);
+ //
+ // example:
+ // Again with the redundantness. You can do this in your tests, but we should
+ // not be doing this in any internal has.js tests
+ // | has.add("javascript", true);
+ //
+ // example:
+ // Three things are passed to the testFunction. `global`, `document`, and a generic element
+ // from which to work your test should the need arise.
+ // | has.add("bug-byid", function(g, d, el){
+ // | // g == global, typically window, yadda yadda
+ // | // d == document object
+ // | // el == the generic element. a `has` element.
+ // | return false; // fake test, byid-when-form-has-name-matching-an-id is slightly longer
+ // | });
+
+ (typeof cache[name]=="undefined" || force) && (cache[name]= test);
+ return now && has(name);
+ };
+
+ // since we're operating under a loader that doesn't provide a has API, we must explicitly initialize
+ // has as it would have otherwise been initialized by the dojo loader; use has.add to the builder
+ // can optimize these away iff desired
+ true || has.add("host-browser", isBrowser);
+ true || has.add("dom", isBrowser);
+ true || has.add("dojo-dom-ready-api", 1);
+ true || has.add("dojo-sniff", 1);
}
- =====*/
- var efficient = function(obj, offset, startWith){
- return (startWith||[]).concat(Array.prototype.slice.call(obj, offset||0));
- };
+ if(1){
+ var agent = navigator.userAgent;
+ // Common application level tests
+ has.add("dom-addeventlistener", !!document.addEventListener);
+ has.add("touch", "ontouchstart" in document);
+ // I don't know if any of these tests are really correct, just a rough guess
+ has.add("device-width", screen.availWidth || innerWidth);
+ has.add("agent-ios", !!agent.match(/iPhone|iP[ao]d/));
+ has.add("agent-android", agent.indexOf("android") > 1);
+ }
- var slow = function(obj, offset, startWith){
- var arr = startWith||[];
- for(var x = offset || 0; x < obj.length; x++){
- arr.push(obj[x]);
- }
- return arr;
+ has.clearElement = /*===== dojo.has.clearElement= ======*/ function(element) {
+ // summary:
+ // Deletes the contents of the element passed to test functions.
+ element.innerHTML= "";
+ return element;
};
-
- dojo._toArray =
- d.isIE ? function(obj){
- return ((obj.item) ? slow : efficient).apply(this, arguments);
- } :
- efficient;
- dojo.partial = function(/*Function|String*/method /*, ...*/){
- // summary:
- // similar to hitch() except that the scope object is left to be
- // whatever the execution context eventually becomes.
- // description:
- // Calling dojo.partial is the functional equivalent of calling:
- // | dojo.hitch(null, funcName, ...);
- var arr = [ null ];
- return d.hitch.apply(d, arr.concat(d._toArray(arguments))); // Function
+ has.normalize = /*===== dojo.has.normalize= ======*/ function(id, toAbsMid){
+ // summary:
+ // Resolves id into a module id based on possibly-nested tenary expression that branches on has feature test value(s).
+ //
+ // toAbsMid: Function
+ // Resolves a relative module id into an absolute module id
+ var
+ tokens = id.match(/[\?:]|[^:\?]*/g), i = 0,
+ get = function(skip){
+ var term = tokens[i++];
+ if(term == ":"){
+ // empty string module name, resolves to 0
+ return 0;
+ }else{
+ // postfixed with a ? means it is a feature to branch on, the term is the name of the feature
+ if(tokens[i++] == "?"){
+ if(!skip && has(term)){
+ // matched the feature, get the first value from the options
+ return get();
+ }else{
+ // did not match, get the second value, passing over the first
+ get(true);
+ return get(skip);
+ }
+ }
+ // a module
+ return term || 0;
+ }
+ };
+ id = get();
+ return id && toAbsMid(id);
};
- var extraNames = d._extraNames, extraLen = extraNames.length, empty = {};
-
- dojo.clone = function(/*anything*/ o){
+ has.load = /*===== dojo.has.load= ======*/ function(id, parentRequire, loaded){
// summary:
- // Clones objects (including DOM nodes) and all children.
- // Warning: do not clone cyclic structures.
- if(!o || typeof o != "object" || d.isFunction(o)){
- // null, undefined, any non-object, or function
- return o; // anything
- }
- if(o.nodeType && "cloneNode" in o){
- // DOM Node
- return o.cloneNode(true); // Node
- }
- if(o instanceof Date){
- // Date
- return new Date(o.getTime()); // Date
- }
- if(o instanceof RegExp){
- // RegExp
- return new RegExp(o); // RegExp
- }
- var r, i, l, s, name;
- if(d.isArray(o)){
- // array
- r = [];
- for(i = 0, l = o.length; i < l; ++i){
- if(i in o){
- r.push(d.clone(o[i]));
- }
- }
-// we don't clone functions for performance reasons
-// }else if(d.isFunction(o)){
-// // function
-// r = function(){ return o.apply(this, arguments); };
+ // Conditional loading of AMD modules based on a has feature test value.
+ //
+ // id: String
+ // Gives the resolved module id to load.
+ //
+ // parentRequire: Function
+ // The loader require function with respect to the module that contained the plugin resource in it's
+ // dependency list.
+ //
+ // loaded: Function
+ // Callback to loader that consumes result of plugin demand.
+
+ if(id){
+ parentRequire([id], loaded);
}else{
- // generic objects
- r = o.constructor ? new o.constructor() : {};
- }
- for(name in o){
- // the "tobj" condition avoid copying properties in "source"
- // inherited from Object.prototype. For example, if target has a custom
- // toString() method, don't overwrite it with the toString() method
- // that source inherited from Object.prototype
- s = o[name];
- if(!(name in r) || (r[name] !== s && (!(name in empty) || empty[name] !== s))){
- r[name] = d.clone(s);
- }
- }
- // IE doesn't recognize some custom functions in for..in
- if(extraLen){
- for(i = 0; i < extraLen; ++i){
- name = extraNames[i];
- s = o[name];
- if(!(name in r) || (r[name] !== s && (!(name in empty) || empty[name] !== s))){
- r[name] = s; // functions only, we don't clone them
- }
- }
+ loaded();
}
- return r; // Object
};
- /*=====
- dojo.trim = function(str){
- // summary:
- // Trims whitespace from both sides of the string
- // str: String
- // String to be trimmed
- // returns: String
- // Returns the trimmed string
- // description:
- // This version of trim() was selected for inclusion into the base due
- // to its compact size and relatively good performance
- // (see [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript)
- // Uses String.prototype.trim instead, if available.
- // The fastest but longest version of this function is located at
- // dojo.string.trim()
- return ""; // String
- }
- =====*/
+ return has;
+});
- dojo.trim = String.prototype.trim ?
- function(str){ return str.trim(); } :
- function(str){ return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); };
+},
+'dojo/_base/loader':function(){
+define(["./kernel", "../has", "require", "module", "./json", "./lang", "./array"], function(dojo, has, require, thisModule, json, lang, array) {
+ // module:
+ // dojo/_base/lader
+ // summary:
+ // This module defines the v1.x synchronous loader API.
- /*=====
- dojo.replace = function(tmpl, map, pattern){
- // summary:
- // Performs parameterized substitutions on a string. Throws an
- // exception if any parameter is unmatched.
- // tmpl: String
- // String to be used as a template.
- // map: Object|Function
- // If an object, it is used as a dictionary to look up substitutions.
- // If a function, it is called for every substitution with following
- // parameters: a whole match, a name, an offset, and the whole template
- // string (see https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace
- // for more details).
- // pattern: RegEx?
- // Optional regular expression objects that overrides the default pattern.
- // Must be global and match one item. The default is: /\{([^\}]+)\}/g,
- // which matches patterns like that: "{xxx}", where "xxx" is any sequence
- // of characters, which doesn't include "}".
- // returns: String
- // Returns the substituted string.
- // example:
- // | // uses a dictionary for substitutions:
- // | dojo.replace("Hello, {name.first} {name.last} AKA {nick}!",
- // | {
- // | nick: "Bob",
- // | name: {
- // | first: "Robert",
- // | middle: "X",
- // | last: "Cringely"
- // | }
- // | });
- // | // returns: Hello, Robert Cringely AKA Bob!
- // example:
- // | // uses an array for substitutions:
- // | dojo.replace("Hello, {0} {2}!",
- // | ["Robert", "X", "Cringely"]);
- // | // returns: Hello, Robert Cringely!
- // example:
- // | // uses a function for substitutions:
- // | function sum(a){
- // | var t = 0;
- // | dojo.forEach(a, function(x){ t += x; });
- // | return t;
- // | }
- // | dojo.replace(
- // | "{count} payments averaging {avg} USD per payment.",
- // | dojo.hitch(
- // | { payments: [11, 16, 12] },
- // | function(_, key){
- // | switch(key){
- // | case "count": return this.payments.length;
- // | case "min": return Math.min.apply(Math, this.payments);
- // | case "max": return Math.max.apply(Math, this.payments);
- // | case "sum": return sum(this.payments);
- // | case "avg": return sum(this.payments) / this.payments.length;
- // | }
- // | }
- // | )
- // | );
- // | // prints: 3 payments averaging 13 USD per payment.
- // example:
- // | // uses an alternative PHP-like pattern for substitutions:
- // | dojo.replace("Hello, ${0} ${2}!",
- // | ["Robert", "X", "Cringely"], /\$\{([^\}]+)\}/g);
- // | // returns: Hello, Robert Cringely!
- return ""; // String
- }
- =====*/
+ // signal the loader in sync mode...
+ //>>pure-amd
- var _pattern = /\{([^\}]+)\}/g;
- dojo.replace = function(tmpl, map, pattern){
- return tmpl.replace(pattern || _pattern, d.isFunction(map) ?
- map : function(_, k){ return d.getObject(k, false, map); });
- };
-})();
+ if (!1){
+ console.error("cannot load the Dojo v1.x loader with a foreign loader");
+ return 0;
+ }
-}
+ var makeErrorToken = function(id){
+ return {src:thisModule.id, id:id};
+ },
-if(!dojo._hasResource["dojo._base.array"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.array"] = true;
-dojo.provide("dojo._base.array");
+ slashName = function(name){
+ return name.replace(/\./g, "/");
+ },
+ buildDetectRe = /\/\/>>built/,
+ dojoRequireCallbacks = [],
+ dojoRequireModuleStack = [],
-(function(){
- var _getParts = function(arr, obj, cb){
- return [
- (typeof arr == "string") ? arr.split("") : arr,
- obj || dojo.global,
- // FIXME: cache the anonymous functions we create here?
- (typeof cb == "string") ? new Function("item", "index", "array", cb) : cb
- ];
- };
+ dojoRequirePlugin = function(mid, require, loaded){
+ dojoRequireCallbacks.push(loaded);
+ array.forEach(mid.split(","), function(mid){
+ var module = getModule(mid, require.module);
+ dojoRequireModuleStack.push(module);
+ injectModule(module);
+ });
+ checkDojoRequirePlugin();
+ },
- var everyOrSome = function(/*Boolean*/every, /*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
- var _p = _getParts(arr, thisObject, callback); arr = _p[0];
- for(var i=0,l=arr.length; i<l; ++i){
- var result = !!_p[2].call(_p[1], arr[i], i, arr);
- if(every ^ result){
- return result; // Boolean
+ // checkDojoRequirePlugin inspects all of the modules demanded by a dojo/require!<module-list> dependency
+ // to see if they have arrived. The loader does not release *any* of these modules to be instantiated
+ // until *all* of these modules are on board, thereby preventing the evaluation of a module with dojo.require's
+ // that reference modules that are not available.
+ //
+ // The algorithm works by traversing the dependency graphs (remember, there can be cycles so they are not trees)
+ // of each module in the dojoRequireModuleStack array (which contains the list of modules demanded by dojo/require!).
+ // The moment a single module is discovered that is missing, the algorithm gives up and indicates that not all
+ // modules are on board. dojo/loadInit! and dojo/require! are ignored because there dependencies are inserted
+ // directly in dojoRequireModuleStack. For example, if "your/module" module depends on "dojo/require!my/module", then
+ // *both* "dojo/require!my/module" and "my/module" will be in dojoRequireModuleStack. Obviously, if "my/module"
+ // is on board, then "dojo/require!my/module" is also satisfied, so the algorithm doesn't check for "dojo/require!my/module".
+ //
+ // Note: inserting a dojo/require!<some-module-list> dependency in the dojoRequireModuleStack achieves nothing
+ // with the current algorithm; however, having such modules present makes it possible to optimize the algorithm
+ //
+ // Note: prior versions of this algorithm had an optimization that signaled loaded on dojo/require! dependencies
+ // individually (rather than waiting for them all to be resolved). The implementation proved problematic with cycles
+ // and plugins. However, it is possible to reattach that strategy in the future.
+
+ // a set from module-id to {undefined | 1 | 0}, where...
+ // undefined => the module has not been inspected
+ // 0 => the module or at least one of its dependencies has not arrived
+ // 1 => the module is a loadInit! or require! plugin resource, or is currently being traversed (therefore, assume
+ // OK until proven otherwise), or has been completely traversed and all dependencies have arrived
+ touched,
+
+ traverse = function(m){
+ touched[m.mid] = 1;
+ for(var t, module, deps = m.deps || [], i= 0; i<deps.length; i++){
+ module = deps[i];
+ if(!(t = touched[module.mid])){
+ if(t===0 || !traverse(module)){
+ touched[m.mid] = 0;
+ return false;
+ }
+ }
}
- }
- return every; // Boolean
- };
-
- dojo.mixin(dojo, {
- indexOf: function( /*Array*/ array,
- /*Object*/ value,
- /*Integer?*/ fromIndex,
- /*Boolean?*/ findLast){
- // summary:
- // locates the first index of the provided value in the
- // passed array. If the value is not found, -1 is returned.
- // description:
- // This method corresponds to the JavaScript 1.6 Array.indexOf method, with one difference: when
- // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript
- // 1.6's indexOf skips the holes in the sparse array.
- // For details on this method, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf
+ return true;
+ },
- var step = 1, end = array.length || 0, i = 0;
- if(findLast){
- i = end - 1;
- step = end = -1;
+ checkDojoRequirePlugin = function(){
+ // initialize the touched hash with easy-to-compute values that help short circuit recursive algorithm;
+ // recall loadInit/require plugin modules are dependencies of modules in dojoRequireModuleStack...
+ // which would cause a circular dependency chain that would never be resolved if checked here
+ // notice all dependencies of any particular loadInit/require plugin module will already
+ // be checked since those are pushed into dojoRequireModuleStack explicitly by the
+ // plugin...so if a particular loadInitPlugin module's dependencies are not really
+ // on board, that *will* be detected elsewhere in the traversal.
+ var module, mid;
+ touched = {};
+ for(mid in modules){
+ module = modules[mid];
+ // this could be improved by remembering the result of the regex tests
+ if(module.executed || module.noReqPluginCheck){
+ touched[mid] = 1;
+ }else{
+ if(module.noReqPluginCheck!==0){
+ // tag the module as either a loadInit or require plugin or not for future reference
+ module.noReqPluginCheck = /loadInit\!/.test(mid) || /require\!/.test(mid) ? 1 : 0;
+ }
+ if(module.noReqPluginCheck){
+ touched[mid] = 1;
+ }else if(module.injected!==arrived){
+ // not executed, has not arrived, and is not a loadInit or require plugin resource
+ touched[mid] = 0;
+ }// else, leave undefined and we'll traverse the dependencies
+ }
}
- if(fromIndex != undefined){ i = fromIndex; }
- if((findLast && i > end) || i < end){
- for(; i != end; i += step){
- if(array[i] == value){ return i; }
+
+ for(var t, i = 0, end = dojoRequireModuleStack.length; i<end; i++){
+ module = dojoRequireModuleStack[i];
+ if(!(t = touched[module.mid])){
+ if(t===0 || !traverse(module)){
+ return;
+ }
}
}
- return -1; // Number
+ loaderVars.holdIdle();
+ var oldCallbacks = dojoRequireCallbacks;
+ dojoRequireCallbacks = [];
+ array.forEach(oldCallbacks, function(cb){cb(1);});
+ loaderVars.releaseIdle();
},
- lastIndexOf: function(/*Array*/array, /*Object*/value, /*Integer?*/fromIndex){
- // summary:
- // locates the last index of the provided value in the passed
- // array. If the value is not found, -1 is returned.
- // description:
- // This method corresponds to the JavaScript 1.6 Array.lastIndexOf method, with one difference: when
- // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript
- // 1.6's lastIndexOf skips the holes in the sparse array.
- // For details on this method, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/lastIndexOf
- return dojo.indexOf(array, value, fromIndex, true); // Number
- },
+ dojoLoadInitPlugin = function(mid, require, loaded){
+ // mid names a module that defines a "dojo load init" bundle, an object with two properties:
+ //
+ // * names: a vector of module ids that give top-level names to define in the lexical scope of def
+ // * def: a function that contains some some legacy loader API applications
+ //
+ // The point of def is to possibly cause some modules to be loaded (but not executed) by dojo/require! where the module
+ // ids are possibly-determined at runtime. For example, here is dojox.gfx from v1.6 expressed as an AMD module using the dojo/loadInit
+ // and dojo/require plugins.
+ //
+ // // dojox/gfx:
+ //
+ // define("*loadInit_12, {
+ // names:["dojo", "dijit", "dojox"],
+ // def: function(){
+ // dojo.loadInit(function(){
+ // var gfx = lang.getObject("dojox.gfx", true);
+ //
+ // //
+ // // code required to set gfx properties ommitted...
+ // //
+ //
+ // // now use the calculations to include the runtime-dependent module
+ // dojo.require("dojox.gfx." + gfx.renderer);
+ // });
+ // }
+ // });
+ //
+ // define(["dojo", "dojo/loadInit!" + id].concat("dojo/require!dojox/gfx/matric,dojox/gfx/_base"), function(dojo){
+ // // when this AMD factory function is executed, the following modules are guaranteed downloaded but not executed:
+ // // "dojox.gfx." + gfx.renderer
+ // // dojox.gfx.matrix
+ // // dojox.gfx._base
+ // dojo.provide("dojo.gfx");
+ // dojo.require("dojox.gfx.matrix");
+ // dojo.require("dojox.gfx._base");
+ // dojo.require("dojox.gfx." + gfx.renderer);
+ // return lang.getObject("dojo.gfx");
+ // });
+ // })();
+ //
+ // The idea is to run the legacy loader API with global variables shadowed, which allows these variables to
+ // be relocated. For example, dojox and dojo could be relocated to different names by giving a packageMap and the code above will
+ // execute properly (because the plugin below resolves the load init bundle.names module with respect to the module that demanded
+ // the plugin resource).
+ //
+ // Note that the relocation is specified in the runtime configuration; relocated names need not be set at build-time.
+ //
+ // Warning: this is not the best way to express dojox.gfx as and AMD module. In fact, the module has been properly converted in
+ // v1.7. However, this technique allows the builder to convert legacy modules into AMD modules and guarantee the codepath is the
+ // same in the converted AMD module.
+ require([mid], function(bundle){
+ // notice how names is resolved with respect to the module that demanded the plugin resource
+ require(bundle.names, function(){
+ // bring the bundle names into scope
+ for(var scopeText = "", args= [], i = 0; i<arguments.length; i++){
+ scopeText+= "var " + bundle.names[i] + "= arguments[" + i + "]; ";
+ args.push(arguments[i]);
+ }
+ eval(scopeText);
+
+ var callingModule = require.module,
+ deps = [],
+ hold = {},
+ requireList = [],
+ p,
+ syncLoaderApi = {
+ provide:function(moduleName){
+ // mark modules that arrive consequent to multiple provides in this module as arrived since they can't be injected
+ moduleName = slashName(moduleName);
+ var providedModule = getModule(moduleName, callingModule);
+ if(providedModule!==callingModule){
+ setArrived(providedModule);
+ }
+ },
+ require:function(moduleName, omitModuleCheck){
+ moduleName = slashName(moduleName);
+ omitModuleCheck && (getModule(moduleName, callingModule).result = nonmodule);
+ requireList.push(moduleName);
+ },
+ requireLocalization:function(moduleName, bundleName, locale){
+ // since we're going to need dojo/i8n, add it to deps if not already there
+ deps.length || (deps = ["dojo/i18n"]);
+
+ // figure out if the bundle is xdomain; if so, add it to the depsSet
+ locale = (locale || dojo.locale).toLowerCase();
+ moduleName = slashName(moduleName) + "/nls/" + (/root/i.test(locale) ? "" : locale + "/") + slashName(bundleName);
+ if(getModule(moduleName, callingModule).isXd){
+ deps.push("dojo/i18n!" + moduleName);
+ }// else the bundle will be loaded synchronously when the module is evaluated
+ },
+ loadInit:function(f){
+ f();
+ }
+ };
- forEach: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
- // summary:
- // for every item in arr, callback is invoked. Return values are ignored.
- // If you want to break out of the loop, consider using dojo.every() or dojo.some().
- // forEach does not allow breaking out of the loop over the items in arr.
- // arr:
- // the array to iterate over. If a string, operates on individual characters.
- // callback:
- // a function is invoked with three arguments: item, index, and array
- // thisObject:
- // may be used to scope the call to callback
- // description:
- // This function corresponds to the JavaScript 1.6 Array.forEach() method, with one difference: when
- // run over sparse arrays, this implemenation passes the "holes" in the sparse array to
- // the callback function with a value of undefined. JavaScript 1.6's forEach skips the holes in the sparse array.
- // For more details, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach
- // example:
- // | // log out all members of the array:
- // | dojo.forEach(
- // | [ "thinger", "blah", "howdy", 10 ],
- // | function(item){
- // | console.log(item);
- // | }
- // | );
- // example:
- // | // log out the members and their indexes
- // | dojo.forEach(
- // | [ "thinger", "blah", "howdy", 10 ],
- // | function(item, idx, arr){
- // | console.log(item, "at index:", idx);
- // | }
- // | );
- // example:
- // | // use a scoped object member as the callback
- // |
- // | var obj = {
- // | prefix: "logged via obj.callback:",
- // | callback: function(item){
- // | console.log(this.prefix, item);
- // | }
- // | };
- // |
- // | // specifying the scope function executes the callback in that scope
- // | dojo.forEach(
- // | [ "thinger", "blah", "howdy", 10 ],
- // | obj.callback,
- // | obj
- // | );
- // |
- // | // alternately, we can accomplish the same thing with dojo.hitch()
- // | dojo.forEach(
- // | [ "thinger", "blah", "howdy", 10 ],
- // | dojo.hitch(obj, "callback")
- // | );
+ // hijack the correct dojo and apply bundle.def
+ try{
+ for(p in syncLoaderApi){
+ hold[p] = dojo[p];
+ dojo[p] = syncLoaderApi[p];
+ }
+ bundle.def.apply(null, args);
+ }catch(e){
+ signal("error", [makeErrorToken("failedDojoLoadInit"), e]);
+ }finally{
+ for(p in syncLoaderApi){
+ dojo[p] = hold[p];
+ }
+ }
- // match the behavior of the built-in forEach WRT empty arrs
- if(!arr || !arr.length){ return; }
+ // requireList is the list of modules that need to be downloaded but not executed before the callingModule can be executed
+ requireList.length && deps.push("dojo/require!" + requireList.join(","));
- // FIXME: there are several ways of handilng thisObject. Is
- // dojo.global always the default context?
- var _p = _getParts(arr, thisObject, callback); arr = _p[0];
- for(var i=0,l=arr.length; i<l; ++i){
- _p[2].call(_p[1], arr[i], i, arr);
- }
+ dojoRequireCallbacks.push(loaded);
+ array.forEach(requireList, function(mid){
+ var module = getModule(mid, require.module);
+ dojoRequireModuleStack.push(module);
+ injectModule(module);
+ });
+ checkDojoRequirePlugin();
+ });
+ });
},
- every: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
- // summary:
- // Determines whether or not every item in arr satisfies the
- // condition implemented by callback.
- // arr:
- // the array to iterate on. If a string, operates on individual characters.
- // callback:
- // a function is invoked with three arguments: item, index,
- // and array and returns true if the condition is met.
- // thisObject:
- // may be used to scope the call to callback
- // description:
- // This function corresponds to the JavaScript 1.6 Array.every() method, with one difference: when
- // run over sparse arrays, this implemenation passes the "holes" in the sparse array to
- // the callback function with a value of undefined. JavaScript 1.6's every skips the holes in the sparse array.
- // For more details, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/every
- // example:
- // | // returns false
- // | dojo.every([1, 2, 3, 4], function(item){ return item>1; });
- // example:
- // | // returns true
- // | dojo.every([1, 2, 3, 4], function(item){ return item>0; });
- return everyOrSome(true, arr, callback, thisObject); // Boolean
+ extractApplication = function(
+ text, // the text to search
+ startSearch, // the position in text to start looking for the closing paren
+ startApplication // the position in text where the function application expression starts
+ ){
+ // find end of the call by finding the matching end paren
+ // Warning: as usual, this will fail in the presense of unmatched right parans contained in strings, regexs, or unremoved comments
+ var parenRe = /\(|\)/g,
+ matchCount = 1,
+ match;
+ parenRe.lastIndex = startSearch;
+ while((match = parenRe.exec(text))){
+ if(match[0] == ")"){
+ matchCount -= 1;
+ }else{
+ matchCount += 1;
+ }
+ if(matchCount == 0){
+ break;
+ }
+ }
+
+ if(matchCount != 0){
+ throw "unmatched paren around character " + parenRe.lastIndex + " in: " + text;
+ }
+
+ //Put the master matching string in the results.
+ return [dojo.trim(text.substring(startApplication, parenRe.lastIndex))+";\n", parenRe.lastIndex];
},
- some: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
- // summary:
- // Determines whether or not any item in arr satisfies the
- // condition implemented by callback.
- // arr:
- // the array to iterate over. If a string, operates on individual characters.
- // callback:
- // a function is invoked with three arguments: item, index,
- // and array and returns true if the condition is met.
- // thisObject:
- // may be used to scope the call to callback
- // description:
- // This function corresponds to the JavaScript 1.6 Array.some() method, with one difference: when
- // run over sparse arrays, this implemenation passes the "holes" in the sparse array to
- // the callback function with a value of undefined. JavaScript 1.6's some skips the holes in the sparse array.
- // For more details, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/some
- // example:
- // | // is true
- // | dojo.some([1, 2, 3, 4], function(item){ return item>1; });
- // example:
- // | // is false
- // | dojo.some([1, 2, 3, 4], function(item){ return item<1; });
- return everyOrSome(false, arr, callback, thisObject); // Boolean
+ // the following regex is taken from 1.6. It is a very poor technique to remove comments and
+ // will fail in some cases; for example, consider the code...
+ //
+ // var message = "Category-1 */* Category-2";
+ //
+ // The regex that follows will see a /* comment and trash the code accordingly. In fact, there are all
+ // kinds of cases like this with strings and regexs that will cause this design to fail miserably.
+ //
+ // Alternative regex designs exist that will result in less-likely failures, but will still fail in many cases.
+ // The only solution guaranteed 100% correct is to parse the code and that seems overkill for this
+ // backcompat/unbuilt-xdomain layer. In the end, since it's been this way for a while, we won't change it.
+ // See the opening paragraphs of Chapter 7 or ECME-262 which describes the lexical abiguity further.
+ removeCommentRe = /(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg,
+
+ syncLoaderApiRe = /(^|\s)dojo\.(loadInit|require|provide|requireLocalization|requireIf|requireAfterIf|platformRequire)\s*\(/mg,
+
+ amdLoaderApiRe = /(^|\s)(require|define)\s*\(/m,
+
+ extractLegacyApiApplications = function(text, noCommentText){
+ // scan the noCommentText for any legacy loader API applications. Copy such applications into result (this is
+ // used by the builder). Move dojo.loadInit applications to loadInitApplications string. Copy all other applications
+ // to otherApplications string. If no applications were found, return 0, signalling an AMD module. Otherwise, return
+ // loadInitApplications + otherApplications. Fixup text by replacing
+ //
+ // dojo.loadInit(// etc...
+ //
+ // with
+ //
+ // \n 0 && dojo.loadInit(// etc...
+ //
+ // Which results in the dojo.loadInit from *not* being applied. This design goes a long way towards protecting the
+ // code from an over-agressive removeCommentRe. However...
+ //
+ // WARNING: the removeCommentRe will cause an error if a detected comment removes all or part of a legacy-loader application
+ // that is not in a comment.
+
+ var match, startSearch, startApplication, application,
+ loadInitApplications = [],
+ otherApplications = [],
+ allApplications = [];
+
+ // noCommentText may be provided by a build app with comments extracted by a better method than regex (hopefully)
+ noCommentText = noCommentText || text.replace(removeCommentRe, function(match){
+ // remove iff the detected comment has text that looks like a sync loader API application; this helps by
+ // removing as little as possible, minimizing the changes the janky regex will kill the module
+ syncLoaderApiRe.lastIndex = amdLoaderApiRe.lastIndex = 0;
+ return (syncLoaderApiRe.test(match) || amdLoaderApiRe.test(match)) ? "" : match;
+ });
+
+ // find and extract all dojo.loadInit applications
+ while((match = syncLoaderApiRe.exec(noCommentText))){
+ startSearch = syncLoaderApiRe.lastIndex;
+ startApplication = startSearch - match[0].length;
+ application = extractApplication(noCommentText, startSearch, startApplication);
+ if(match[2]=="loadInit"){
+ loadInitApplications.push(application[0]);
+ }else{
+ otherApplications.push(application[0]);
+ }
+ syncLoaderApiRe.lastIndex = application[1];
+ }
+ allApplications = loadInitApplications.concat(otherApplications);
+ if(allApplications.length || !amdLoaderApiRe.test(noCommentText)){
+ // either there were some legacy loader API applications or there were no AMD API applications
+ return [text.replace(/(^|\s)dojo\.loadInit\s*\(/g, "\n0 && dojo.loadInit("), allApplications.join(""), allApplications];
+ }else{
+ // legacy loader API *was not* detected and AMD API *was* detected; therefore, assume it's an AMD module
+ return 0;
+ }
},
- map: function(/*Array|String*/arr, /*Function|String*/callback, /*Function?*/thisObject){
- // summary:
- // applies callback to each element of arr and returns
- // an Array with the results
- // arr:
- // the array to iterate on. If a string, operates on
- // individual characters.
- // callback:
- // a function is invoked with three arguments, (item, index,
- // array), and returns a value
- // thisObject:
- // may be used to scope the call to callback
- // description:
- // This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when
- // run over sparse arrays, this implemenation passes the "holes" in the sparse array to
- // the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array.
- // For more details, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
- // example:
- // | // returns [2, 3, 4, 5]
- // | dojo.map([1, 2, 3, 4], function(item){ return item+1 });
+ transformToAmd = function(module, text){
+ // This is roughly the equivalent of dojo._xdCreateResource in 1.6-; however, it expresses a v1.6- dojo
+ // module in terms of AMD define instead of creating the dojo proprietary xdomain module expression.
+ // The module could have originated from several sources:
+ //
+ // * amd require() a module, e.g., require(["my/module"])
+ // * amd require() a nonmodule, e.g., require(["my/resource.js"')
+ // * amd define() deps vector (always a module)
+ // * dojo.require() a module, e.g. dojo.require("my.module")
+ // * dojo.require() a nonmodule, e.g., dojo.require("my.module", true)
+ // * dojo.requireIf/requireAfterIf/platformRequire a module
+ //
+ // The module is scanned for legacy loader API applications; if none are found, then assume the module is an
+ // AMD module and return 0. Otherwise, a synthetic dojo/loadInit plugin resource is created and the module text
+ // is rewritten as an AMD module with the single dependency of this synthetic resource. When the dojo/loadInit
+ // plugin loaded the synthetic resource, it will cause all dojo.loadInit's to be executed, find all dojo.require's
+ // (either directly consequent to dojo.require or indirectly consequent to dojo.require[After]If or
+ // dojo.platformRequire, and finally cause loading of all dojo.required modules with the dojo/require plugin. Thus,
+ // when the dojo/loadInit plugin reports it has been loaded, all modules required by the given module are guaranteed
+ // loaded (but not executed). This then allows the module to execute it's code path without interupts, thereby
+ // following the synchronous code path.
+
+ var extractResult, id, names = [], namesAsStrings = [];
+ if(buildDetectRe.test(text) || !(extractResult = extractLegacyApiApplications(text))){
+ // buildDetectRe.test(text) => a built module, always AMD
+ // extractResult==0 => no sync API
+ return 0;
+ }
+
+ // manufacture a synthetic module id that can never be a real mdule id (just like require does)
+ id = module.mid + "-*loadInit";
- var _p = _getParts(arr, thisObject, callback); arr = _p[0];
- var outArr = (arguments[3] ? (new arguments[3]()) : []);
- for(var i=0,l=arr.length; i<l; ++i){
- outArr.push(_p[2].call(_p[1], arr[i], i, arr));
+ // construct the dojo/loadInit names vector which causes any relocated names to be defined as lexical variables under their not-relocated name
+ // the dojo/loadInit plugin assumes the first name in names is "dojo"
+
+ for(var p in getModule("dojo", module).result.scopeMap){
+ names.push(p);
+ namesAsStrings.push('"' + p + '"');
}
- return outArr; // Array
+
+ // rewrite the module as a synthetic dojo/loadInit plugin resource + the module expressed as an AMD module that depends on this synthetic resource
+ return "// xdomain rewrite of " + module.path + "\n" +
+ "define('" + id + "',{\n" +
+ "\tnames:" + dojo.toJson(names) + ",\n" +
+ "\tdef:function(" + names.join(",") + "){" + extractResult[1] + "}" +
+ "});\n\n" +
+ "define(" + dojo.toJson(names.concat(["dojo/loadInit!"+id])) + ", function(" + names.join(",") + "){\n" + extractResult[0] + "});";
},
- filter: function(/*Array*/arr, /*Function|String*/callback, /*Object?*/thisObject){
- // summary:
- // Returns a new Array with those items from arr that match the
- // condition implemented by callback.
- // arr:
- // the array to iterate over.
- // callback:
- // a function that is invoked with three arguments (item,
- // index, array). The return of this function is expected to
- // be a boolean which determines whether the passed-in item
- // will be included in the returned array.
- // thisObject:
- // may be used to scope the call to callback
- // description:
- // This function corresponds to the JavaScript 1.6 Array.filter() method, with one difference: when
- // run over sparse arrays, this implemenation passes the "holes" in the sparse array to
- // the callback function with a value of undefined. JavaScript 1.6's filter skips the holes in the sparse array.
- // For more details, see:
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
- // example:
- // | // returns [2, 3, 4]
- // | dojo.filter([1, 2, 3, 4], function(item){ return item>1; });
+ loaderVars = require.initSyncLoader(dojoRequirePlugin, checkDojoRequirePlugin, transformToAmd),
+
+ sync =
+ loaderVars.sync,
- var _p = _getParts(arr, thisObject, callback); arr = _p[0];
- var outArr = [];
- for(var i=0,l=arr.length; i<l; ++i){
- if(_p[2].call(_p[1], arr[i], i, arr)){
- outArr.push(arr[i]);
+ xd =
+ loaderVars.xd,
+
+ arrived =
+ loaderVars.arrived,
+
+ nonmodule =
+ loaderVars.nonmodule,
+
+ executing =
+ loaderVars.executing,
+
+ executed =
+ loaderVars.executed,
+
+ syncExecStack =
+ loaderVars.syncExecStack,
+
+ modules =
+ loaderVars.modules,
+
+ execQ =
+ loaderVars.execQ,
+
+ getModule =
+ loaderVars.getModule,
+
+ injectModule =
+ loaderVars.injectModule,
+
+ setArrived =
+ loaderVars.setArrived,
+
+ signal =
+ loaderVars.signal,
+
+ finishExec =
+ loaderVars.finishExec,
+
+ execModule =
+ loaderVars.execModule,
+
+ getLegacyMode =
+ loaderVars.getLegacyMode;
+
+ dojo.provide = function(mid){
+ var executingModule = syncExecStack[0],
+ module = lang.mixin(getModule(slashName(mid), require.module), {
+ executed:executing,
+ result:lang.getObject(mid, true)
+ });
+ setArrived(module);
+ if(executingModule){
+ (executingModule.provides || (executingModule.provides = [])).push(function(){
+ module.result = lang.getObject(mid);
+ delete module.provides;
+ module.executed!==executed && finishExec(module);
+ });
+ }// else dojo.provide called not consequent to loading; therefore, give up trying to publish module value to loader namespace
+ return module.result;
+ };
+
+ has.add("config-publishRequireResult", 1, 0, 0);
+
+ dojo.require = function(moduleName, omitModuleCheck) {
+ // summary:
+ // loads a Javascript module from the appropriate URI
+ //
+ // moduleName: String
+ // module name to load, using periods for separators,
+ // e.g. "dojo.date.locale". Module paths are de-referenced by dojo's
+ // internal mapping of locations to names and are disambiguated by
+ // longest prefix. See `dojo.registerModulePath()` for details on
+ // registering new modules.
+ //
+ // omitModuleCheck: Boolean?
+ // if `true`, omitModuleCheck skips the step of ensuring that the
+ // loaded file actually defines the symbol it is referenced by.
+ // For example if it called as `dojo.require("a.b.c")` and the
+ // file located at `a/b/c.js` does not define an object `a.b.c`,
+ // and exception will be throws whereas no exception is raised
+ // when called as `dojo.require("a.b.c", true)`
+ //
+ // description:
+ // Modules are loaded via dojo.require by using one of two loaders: the normal loader
+ // and the xdomain loader. The xdomain loader is used when dojo was built with a
+ // custom build that specified loader=xdomain and the module lives on a modulePath
+ // that is a whole URL, with protocol and a domain. The versions of Dojo that are on
+ // the Google and AOL CDNs use the xdomain loader.
+ //
+ // If the module is loaded via the xdomain loader, it is an asynchronous load, since
+ // the module is added via a dynamically created script tag. This
+ // means that dojo.require() can return before the module has loaded. However, this
+ // should only happen in the case where you do dojo.require calls in the top-level
+ // HTML page, or if you purposely avoid the loader checking for dojo.require
+ // dependencies in your module by using a syntax like dojo["require"] to load the module.
+ //
+ // Sometimes it is useful to not have the loader detect the dojo.require calls in the
+ // module so that you can dynamically load the modules as a result of an action on the
+ // page, instead of right at module load time.
+ //
+ // Also, for script blocks in an HTML page, the loader does not pre-process them, so
+ // it does not know to download the modules before the dojo.require calls occur.
+ //
+ // So, in those two cases, when you want on-the-fly module loading or for script blocks
+ // in the HTML page, special care must be taken if the dojo.required code is loaded
+ // asynchronously. To make sure you can execute code that depends on the dojo.required
+ // modules, be sure to add the code that depends on the modules in a dojo.addOnLoad()
+ // callback. dojo.addOnLoad waits for all outstanding modules to finish loading before
+ // executing.
+ //
+ // This type of syntax works with both xdomain and normal loaders, so it is good
+ // practice to always use this idiom for on-the-fly code loading and in HTML script
+ // blocks. If at some point you change loaders and where the code is loaded from,
+ // it will all still work.
+ //
+ // More on how dojo.require
+ // `dojo.require("A.B")` first checks to see if symbol A.B is
+ // defined. If it is, it is simply returned (nothing to do).
+ //
+ // If it is not defined, it will look for `A/B.js` in the script root
+ // directory.
+ //
+ // `dojo.require` throws an exception if it cannot find a file
+ // to load, or if the symbol `A.B` is not defined after loading.
+ //
+ // It returns the object `A.B`, but note the caveats above about on-the-fly loading and
+ // HTML script blocks when the xdomain loader is loading a module.
+ //
+ // `dojo.require()` does nothing about importing symbols into
+ // the current namespace. It is presumed that the caller will
+ // take care of that.
+ //
+ // example:
+ // To use dojo.require in conjunction with dojo.ready:
+ //
+ // | dojo.require("foo");
+ // | dojo.require("bar");
+ // | dojo.addOnLoad(function(){
+ // | //you can now safely do something with foo and bar
+ // | });
+ //
+ // example:
+ // For example, to import all symbols into a local block, you might write:
+ //
+ // | with (dojo.require("A.B")) {
+ // | ...
+ // | }
+ //
+ // And to import just the leaf symbol to a local variable:
+ //
+ // | var B = dojo.require("A.B");
+ // | ...
+ //
+ // returns:
+ // the required namespace object
+ function doRequire(mid, omitModuleCheck){
+ var module = getModule(slashName(mid), require.module);
+ if(syncExecStack.length && syncExecStack[0].finish){
+ // switched to async loading in the middle of evaluating a legacy module; stop
+ // applying dojo.require so the remaining dojo.requires are applied in order
+ syncExecStack[0].finish.push(mid);
+ return undefined;
+ }
+
+ // recall module.executed has values {0, executing, executed}; therefore, truthy indicates executing or executed
+ if(module.executed){
+ return module.result;
+ }
+ omitModuleCheck && (module.result = nonmodule);
+
+ var currentMode = getLegacyMode();
+
+ // recall, in sync mode to inject is to *eval* the module text
+ // if the module is a legacy module, this is the same as executing
+ // but if the module is an AMD module, this means defining, not executing
+ injectModule(module);
+ // the inject may have changed the mode
+ currentMode = getLegacyMode();
+
+ // in sync mode to dojo.require is to execute
+ if(module.executed!==executed && module.injected===arrived){
+ // the module was already here before injectModule was called probably finishing up a xdomain
+ // load, but maybe a module given to the loader directly rather than having the loader retrieve it
+ loaderVars.holdIdle();
+ execModule(module);
+ loaderVars.releaseIdle();
+ }
+ if(module.executed){
+ return module.result;
+ }
+
+ if(currentMode==sync){
+ // the only way to get here is in sync mode and dojo.required a module that
+ // * was loaded async in the injectModule application a few lines up
+ // * was an AMD module that had deps that are being loaded async and therefore couldn't execute
+ if(module.cjs){
+ // the module was an AMD module; unshift, not push, which causes the current traversal to be reattempted from the top
+ execQ.unshift(module);
+ }else{
+ // the module was a legacy module
+ syncExecStack.length && (syncExecStack[0].finish= [mid]);
}
+ }else{
+ // the loader wasn't in sync mode on entry; probably async mode; therefore, no expectation of getting
+ // the module value synchronously; make sure it gets executed though
+ execQ.push(module);
}
- return outArr; // Array
+ return undefined;
}
- });
-})();
-/*
-*/
-}
+ var result = doRequire(moduleName, omitModuleCheck);
+ if(has("config-publishRequireResult") && !lang.exists(moduleName) && result!==undefined){
+ lang.setObject(moduleName, result);
+ }
+ return result;
+ };
+
+ dojo.loadInit = function(f) {
+ f();
+ };
+
+ dojo.registerModulePath = function(/*String*/moduleName, /*String*/prefix){
+ // summary:
+ // Maps a module name to a path
+ // description:
+ // An unregistered module is given the default path of ../[module],
+ // relative to Dojo root. For example, module acme is mapped to
+ // ../acme. If you want to use a different module name, use
+ // dojo.registerModulePath.
+ // example:
+ // If your dojo.js is located at this location in the web root:
+ // | /myapp/js/dojo/dojo/dojo.js
+ // and your modules are located at:
+ // | /myapp/js/foo/bar.js
+ // | /myapp/js/foo/baz.js
+ // | /myapp/js/foo/thud/xyzzy.js
+ // Your application can tell Dojo to locate the "foo" namespace by calling:
+ // | dojo.registerModulePath("foo", "../../foo");
+ // At which point you can then use dojo.require() to load the
+ // modules (assuming they provide() the same things which are
+ // required). The full code might be:
+ // | <script type="text/javascript"
+ // | src="/myapp/js/dojo/dojo/dojo.js"></script>
+ // | <script type="text/javascript">
+ // | dojo.registerModulePath("foo", "../../foo");
+ // | dojo.require("foo.bar");
+ // | dojo.require("foo.baz");
+ // | dojo.require("foo.thud.xyzzy");
+ // | </script>
-if(!dojo._hasResource["dojo._base.declare"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.declare"] = true;
-dojo.provide("dojo._base.declare");
+ var paths = {};
+ paths[moduleName.replace(/\./g, "/")] = prefix;
+ require({paths:paths});
+ };
+ dojo.platformRequire = function(/*Object*/modMap){
+ // summary:
+ // require one or more modules based on which host environment
+ // Dojo is currently operating in
+ // description:
+ // This method takes a "map" of arrays which one can use to
+ // optionally load dojo modules. The map is indexed by the
+ // possible dojo.name_ values, with two additional values:
+ // "default" and "common". The items in the "default" array will
+ // be loaded if none of the other items have been choosen based on
+ // dojo.name_, set by your host environment. The items in the
+ // "common" array will *always* be loaded, regardless of which
+ // list is chosen.
+ // example:
+ // | dojo.platformRequire({
+ // | browser: [
+ // | "foo.sample", // simple module
+ // | "foo.test",
+ // | ["foo.bar.baz", true] // skip object check in _loadModule (dojo.require)
+ // | ],
+ // | default: [ "foo.sample._base" ],
+ // | common: [ "important.module.common" ]
+ // | });
+ var result = (modMap.common || []).concat(modMap[dojo._name] || modMap["default"] || []),
+ temp;
+ while(result.length){
+ if(lang.isArray(temp = result.shift())){
+ dojo.require.apply(dojo, temp);
+ }else{
+ dojo.require(temp);
+ }
+ }
+ };
+ dojo.requireIf = dojo.requireAfterIf = function(/*Boolean*/ condition, /*String*/ moduleName, /*Boolean?*/omitModuleCheck){
+ // summary:
+ // If the condition is true then call `dojo.require()` for the specified
+ // resource
+ //
+ // example:
+ // | dojo.requireIf(dojo.isBrowser, "my.special.Module");
-(function(){
- var d = dojo, mix = d._mixin, op = Object.prototype, opts = op.toString,
+ if(condition){
+ dojo.require(moduleName, omitModuleCheck);
+ }
+ };
+
+ dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale){
+ require(["../i18n"], function(i18n){
+ i18n.getLocalization(moduleName, bundleName, locale);
+ });
+ };
+
+ return {
+ extractLegacyApiApplications:extractLegacyApiApplications,
+ require:loaderVars.dojoRequirePlugin,
+ loadInit:dojoLoadInitPlugin
+ };
+});
+
+},
+'dojo/json':function(){
+define(["./has"], function(has){
+ "use strict";
+ var hasJSON = typeof JSON != "undefined";
+ has.add("json-parse", hasJSON); // all the parsers work fine
+ // Firefox 3.5/Gecko 1.9 fails to use replacer in stringify properly https://bugzilla.mozilla.org/show_bug.cgi?id=509184
+ has.add("json-stringify", hasJSON && JSON.stringify({a:0}, function(k,v){return v||1;}) == '{"a":1}');
+ if(has("json-stringify")){
+ return JSON;
+ }
+ else{
+ var escapeString = function(/*String*/str){
+ //summary:
+ // Adds escape sequences for non-visual characters, double quote and
+ // backslash and surrounds with double quotes to form a valid string
+ // literal.
+ return ('"' + str.replace(/(["\\])/g, '\\$1') + '"').
+ replace(/[\f]/g, "\\f").replace(/[\b]/g, "\\b").replace(/[\n]/g, "\\n").
+ replace(/[\t]/g, "\\t").replace(/[\r]/g, "\\r"); // string
+ };
+ return {
+ parse: has("json-parse") ? JSON.parse : function(str, strict){
+ // summary:
+ // Parses a [JSON](http://json.org) string to return a JavaScript object.
+ // description:
+ // This function follows [native JSON API](https://developer.mozilla.org/en/JSON)
+ // Throws for invalid JSON strings. This delegates to eval() if native JSON
+ // support is not available. By default this will evaluate any valid JS expression.
+ // With the strict parameter set to true, the parser will ensure that only
+ // valid JSON strings are parsed (otherwise throwing an error). Without the strict
+ // parameter, the content passed to this method must come
+ // from a trusted source.
+ // str:
+ // a string literal of a JSON item, for instance:
+ // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'`
+ // strict:
+ // When set to true, this will ensure that only valid, secure JSON is ever parsed.
+ // Make sure this is set to true for untrusted content. Note that on browsers/engines
+ // without native JSON support, setting this to true will run slower.
+ if(strict && !/^([\s\[\{]*(?:"(?:\\.|[^"])+"|-?\d[\d\.]*(?:[Ee][+-]?\d+)?|null|true|false|)[\s\]\}]*(?:,|:|$))+$/.test(str)){
+ throw new SyntaxError("Invalid characters in JSON");
+ }
+ return eval('(' + str + ')');
+ },
+ stringify: function(value, replacer, spacer){
+ // summary:
+ // Returns a [JSON](http://json.org) serialization of an object.
+ // description:
+ // Returns a [JSON](http://json.org) serialization of an object.
+ // This function follows [native JSON API](https://developer.mozilla.org/en/JSON)
+ // Note that this doesn't check for infinite recursion, so don't do that!
+ // value:
+ // A value to be serialized.
+ // replacer:
+ // A replacer function that is called for each value and can return a replacement
+ // spacer:
+ // A spacer string to be used for pretty printing of JSON
+ //
+ // example:
+ // simple serialization of a trivial object
+ // | define(["dojo/json"], function(JSON){
+ // | var jsonStr = JSON.stringify({ howdy: "stranger!", isStrange: true });
+ // | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr);
+ var undef;
+ if(typeof replacer == "string"){
+ spacer = replacer;
+ replacer = null;
+ }
+ function stringify(it, indent, key){
+ if(replacer){
+ it = replacer(key, it);
+ }
+ var val, objtype = typeof it;
+ if(objtype == "number"){
+ return isFinite(it) ? it + "" : "null";
+ }
+ if(objtype == "boolean"){
+ return it + "";
+ }
+ if(it === null){
+ return "null";
+ }
+ if(typeof it == "string"){
+ return escapeString(it);
+ }
+ if(objtype == "function" || objtype == "undefined"){
+ return undef; // undefined
+ }
+ // short-circuit for objects that support "json" serialization
+ // if they return "self" then just pass-through...
+ if(typeof it.toJSON == "function"){
+ return stringify(it.toJSON(key), indent, key);
+ }
+ if(it instanceof Date){
+ return '"{FullYear}-{Month+}-{Date}T{Hours}:{Minutes}:{Seconds}Z"'.replace(/\{(\w+)(\+)?\}/g, function(t, prop, plus){
+ var num = it["getUTC" + prop]() + (plus ? 1 : 0);
+ return num < 10 ? "0" + num : num;
+ });
+ }
+ if(it.valueOf() !== it){
+ // primitive wrapper, try again unwrapped:
+ return stringify(it.valueOf(), indent, key);
+ }
+ var nextIndent= spacer ? (indent + spacer) : "";
+ /* we used to test for DOM nodes and throw, but FF serializes them as {}, so cross-browser consistency is probably not efficiently attainable */
+
+ var sep = spacer ? " " : "";
+ var newLine = spacer ? "\n" : "";
+
+ // array
+ if(it instanceof Array){
+ var itl = it.length, res = [];
+ for(key = 0; key < itl; key++){
+ var obj = it[key];
+ val = stringify(obj, nextIndent, key);
+ if(typeof val != "string"){
+ val = "null";
+ }
+ res.push(newLine + nextIndent + val);
+ }
+ return "[" + res.join(",") + newLine + indent + "]";
+ }
+ // generic object code path
+ var output = [];
+ for(key in it){
+ var keyStr;
+ if(typeof key == "number"){
+ keyStr = '"' + key + '"';
+ }else if(typeof key == "string"){
+ keyStr = escapeString(key);
+ }else{
+ // skip non-string or number keys
+ continue;
+ }
+ val = stringify(it[key], nextIndent, key);
+ if(typeof val != "string"){
+ // skip non-serializable values
+ continue;
+ }
+ // At this point, the most non-IE browsers don't get in this branch
+ // (they have native JSON), so push is definitely the way to
+ output.push(newLine + nextIndent + keyStr + ":" + sep + val);
+ }
+ return "{" + output.join(",") + newLine + indent + "}"; // String
+ }
+ return stringify(value, "", "");
+ }
+ };
+ }
+});
+
+},
+'dojo/_base/declare':function(){
+define(["./kernel", "../has", "./lang"], function(dojo, has, lang){
+ // module:
+ // dojo/_base/declare
+ // summary:
+ // This module defines dojo.declare.
+
+ var mix = lang.mixin, op = Object.prototype, opts = op.toString,
xtor = new Function, counter = 0, cname = "constructor";
function err(msg, cls){ throw new Error("declare" + (cls ? " " + cls : "") + ": " + msg); }
@@ -2669,16 +6261,24 @@ dojo.provide("dojo._base.declare");
if(f){
return a === true ? f : f.apply(this, a || args);
}
- // intentionally if a super method was not found
+ // intentionally no return if a super method was not found
}
function getInherited(name, args){
if(typeof name == "string"){
- return this.inherited(name, args, true);
+ return this.__inherited(name, args, true);
}
- return this.inherited(name, true);
+ return this.__inherited(name, true);
+ }
+
+ function inherited__debug(args, a1, a2){
+ var f = this.getInherited(args, a1);
+ if(f){ return f.apply(this, a2 || a1 || args); }
+ // intentionally no return if a super method was not found
}
+ var inheritedImpl = dojo.config.isDebug ? inherited__debug : inherited;
+
// emulation of "instanceof"
function isInstanceOf(cls){
var bases = this.constructor._meta.bases;
@@ -2691,25 +6291,25 @@ dojo.provide("dojo._base.declare");
}
function mixOwn(target, source){
- var name, i = 0, l = d._extraNames.length;
// add props adding metadata for incoming functions skipping a constructor
- for(name in source){
+ for(var name in source){
if(name != cname && source.hasOwnProperty(name)){
target[name] = source[name];
}
}
- // process unenumerable methods on IE
- for(; i < l; ++i){
- name = d._extraNames[i];
- if(name != cname && source.hasOwnProperty(name)){
- target[name] = source[name];
+ if(has("bug-for-in-skips-shadowed")){
+ for(var extraNames= lang._extraNames, i= extraNames.length; i;){
+ name = extraNames[--i];
+ if(name != cname && source.hasOwnProperty(name)){
+ target[name] = source[name];
+ }
}
}
}
// implementation of safe mixin function
function safeMixin(target, source){
- var name, t, i = 0, l = d._extraNames.length;
+ var name, t;
// add props adding metadata for incoming functions skipping a constructor
for(name in source){
t = source[name];
@@ -2721,23 +6321,24 @@ dojo.provide("dojo._base.declare");
target[name] = t;
}
}
- // process unenumerable methods on IE
- for(; i < l; ++i){
- name = d._extraNames[i];
- t = source[name];
- if((t !== op[name] || !(name in op)) && name != cname){
- if(opts.call(t) == "[object Function]"){
- // non-trivial function method => attach its name
- t.nom = name;
+ if(has("bug-for-in-skips-shadowed")){
+ for(var extraNames= lang._extraNames, i= extraNames.length; i;){
+ name = extraNames[--i];
+ t = source[name];
+ if((t !== op[name] || !(name in op)) && name != cname){
+ if(opts.call(t) == "[object Function]"){
+ // non-trivial function method => attach its name
+ t.nom = name;
+ }
+ target[name] = t;
}
- target[name] = t;
}
}
return target;
}
function extend(source){
- safeMixin(this.prototype, source);
+ declare.safeMixin(this.prototype, source);
return this;
}
@@ -2920,7 +6521,7 @@ dojo.provide("dojo._base.declare");
return t;
}
- d.declare = function(className, superclass, props){
+ function declare(className, superclass, props){
// crack parameters
if(typeof className != "string"){
props = superclass;
@@ -2971,7 +6572,7 @@ dojo.provide("dojo._base.declare");
proto = {};
}
// add all properties
- safeMixin(proto, props);
+ declare.safeMixin(proto, props);
// add constructor
t = props.constructor;
if(t !== op.constructor){
@@ -3005,13 +6606,14 @@ dojo.provide("dojo._base.declare");
// add "standard" methods to the prototype
proto.getInherited = getInherited;
- proto.inherited = inherited;
proto.isInstanceOf = isInstanceOf;
+ proto.inherited = inheritedImpl;
+ proto.__inherited = inherited;
// add name if specified
if(className){
proto.declaredClass = className;
- d.setObject(className, ctor);
+ lang.setObject(className, ctor);
}
// build chains and add them to the prototype
@@ -3027,9 +6629,7 @@ dojo.provide("dojo._base.declare");
// no need to chain "invisible" functions
return ctor; // Function
- };
-
- d.safeMixin = safeMixin;
+ }
/*=====
dojo.declare = function(className, superclass, props){
@@ -3261,7 +6861,7 @@ dojo.provide("dojo._base.declare");
// source: Object
// Source object for new properties.
// description:
- // This function is used to mix in properties like dojo._mixin does,
+ // This function is used to mix in properties like lang.mixin does,
// but it skips a constructor property and decorates functions like
// dojo.declare does.
//
@@ -3513,1921 +7113,141 @@ dojo.provide("dojo._base.declare");
// | });
};
=====*/
-})();
-
-}
-
-if(!dojo._hasResource["dojo._base.connect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.connect"] = true;
-dojo.provide("dojo._base.connect");
-
-
-
-// this file courtesy of the TurboAjax Group, licensed under a Dojo CLA
-
-// low-level delegation machinery
-dojo._listener = {
- // create a dispatcher function
- getDispatcher: function(){
- // following comments pulled out-of-line to prevent cloning them
- // in the returned function.
- // - indices (i) that are really in the array of listeners (ls) will
- // not be in Array.prototype. This is the 'sparse array' trick
- // that keeps us safe from libs that take liberties with built-in
- // objects
- // - listener is invoked with current scope (this)
- return function(){
- var ap = Array.prototype, c = arguments.callee, ls = c._listeners, t = c.target,
- // return value comes from original target function
- r = t && t.apply(this, arguments),
- // make local copy of listener array so it is immutable during processing
- i, lls = [].concat(ls)
- ;
-
- // invoke listeners after target function
- for(i in lls){
- if(!(i in ap)){
- lls[i].apply(this, arguments);
- }
- }
- // return value comes from original target function
- return r;
- };
- },
- // add a listener to an object
- add: function(/*Object*/ source, /*String*/ method, /*Function*/ listener){
- // Whenever 'method' is invoked, 'listener' will have the same scope.
- // Trying to supporting a context object for the listener led to
- // complexity.
- // Non trivial to provide 'once' functionality here
- // because listener could be the result of a dojo.hitch call,
- // in which case two references to the same hitch target would not
- // be equivalent.
- source = source || dojo.global;
- // The source method is either null, a dispatcher, or some other function
- var f = source[method];
- // Ensure a dispatcher
- if(!f || !f._listeners){
- var d = dojo._listener.getDispatcher();
- // original target function is special
- d.target = f;
- // dispatcher holds a list of listeners
- d._listeners = [];
- // redirect source to dispatcher
- f = source[method] = d;
- }
- // The contract is that a handle is returned that can
- // identify this listener for disconnect.
- //
- // The type of the handle is private. Here is it implemented as Integer.
- // DOM event code has this same contract but handle is Function
- // in non-IE browsers.
- //
- // We could have separate lists of before and after listeners.
- return f._listeners.push(listener); /*Handle*/
- },
- // remove a listener from an object
- remove: function(/*Object*/ source, /*String*/ method, /*Handle*/ handle){
- var f = (source || dojo.global)[method];
- // remember that handle is the index+1 (0 is not a valid handle)
- if(f && f._listeners && handle--){
- delete f._listeners[handle];
- }
- }
-};
-
-// Multiple delegation for arbitrary methods.
-
-// This unit knows nothing about DOM, but we include DOM aware documentation
-// and dontFix argument here to help the autodocs. Actual DOM aware code is in
-// event.js.
-
-dojo.connect = function(/*Object|null*/ obj,
- /*String*/ event,
- /*Object|null*/ context,
- /*String|Function*/ method,
- /*Boolean?*/ dontFix){
- // summary:
- // `dojo.connect` is the core event handling and delegation method in
- // Dojo. It allows one function to "listen in" on the execution of
- // any other, triggering the second whenever the first is called. Many
- // listeners may be attached to a function, and source functions may
- // be either regular function calls or DOM events.
- //
- // description:
- // Connects listeners to actions, so that after event fires, a
- // listener is called with the same arguments passed to the original
- // function.
- //
- // Since `dojo.connect` allows the source of events to be either a
- // "regular" JavaScript function or a DOM event, it provides a uniform
- // interface for listening to all the types of events that an
- // application is likely to deal with though a single, unified
- // interface. DOM programmers may want to think of it as
- // "addEventListener for everything and anything".
- //
- // When setting up a connection, the `event` parameter must be a
- // string that is the name of the method/event to be listened for. If
- // `obj` is null, `dojo.global` is assumed, meaning that connections
- // to global methods are supported but also that you may inadvertently
- // connect to a global by passing an incorrect object name or invalid
- // reference.
- //
- // `dojo.connect` generally is forgiving. If you pass the name of a
- // function or method that does not yet exist on `obj`, connect will
- // not fail, but will instead set up a stub method. Similarly, null
- // arguments may simply be omitted such that fewer than 4 arguments
- // may be required to set up a connection See the examples for details.
- //
- // The return value is a handle that is needed to
- // remove this connection with `dojo.disconnect`.
- //
- // obj:
- // The source object for the event function.
- // Defaults to `dojo.global` if null.
- // If obj is a DOM node, the connection is delegated
- // to the DOM event manager (unless dontFix is true).
- //
- // event:
- // String name of the event function in obj.
- // I.e. identifies a property `obj[event]`.
- //
- // context:
- // The object that method will receive as "this".
- //
- // If context is null and method is a function, then method
- // inherits the context of event.
- //
- // If method is a string then context must be the source
- // object object for method (context[method]). If context is null,
- // dojo.global is used.
- //
- // method:
- // A function reference, or name of a function in context.
- // The function identified by method fires after event does.
- // method receives the same arguments as the event.
- // See context argument comments for information on method's scope.
- //
- // dontFix:
- // If obj is a DOM node, set dontFix to true to prevent delegation
- // of this connection to the DOM event manager.
- //
- // example:
- // When obj.onchange(), do ui.update():
- // | dojo.connect(obj, "onchange", ui, "update");
- // | dojo.connect(obj, "onchange", ui, ui.update); // same
- //
- // example:
- // Using return value for disconnect:
- // | var link = dojo.connect(obj, "onchange", ui, "update");
- // | ...
- // | dojo.disconnect(link);
- //
- // example:
- // When onglobalevent executes, watcher.handler is invoked:
- // | dojo.connect(null, "onglobalevent", watcher, "handler");
- //
- // example:
- // When ob.onCustomEvent executes, customEventHandler is invoked:
- // | dojo.connect(ob, "onCustomEvent", null, "customEventHandler");
- // | dojo.connect(ob, "onCustomEvent", "customEventHandler"); // same
- //
- // example:
- // When ob.onCustomEvent executes, customEventHandler is invoked
- // with the same scope (this):
- // | dojo.connect(ob, "onCustomEvent", null, customEventHandler);
- // | dojo.connect(ob, "onCustomEvent", customEventHandler); // same
- //
- // example:
- // When globalEvent executes, globalHandler is invoked
- // with the same scope (this):
- // | dojo.connect(null, "globalEvent", null, globalHandler);
- // | dojo.connect("globalEvent", globalHandler); // same
-
- // normalize arguments
- var a=arguments, args=[], i=0;
- // if a[0] is a String, obj was omitted
- args.push(dojo.isString(a[0]) ? null : a[i++], a[i++]);
- // if the arg-after-next is a String or Function, context was NOT omitted
- var a1 = a[i+1];
- args.push(dojo.isString(a1)||dojo.isFunction(a1) ? a[i++] : null, a[i++]);
- // absorb any additional arguments
- for(var l=a.length; i<l; i++){ args.push(a[i]); }
- // do the actual work
- return dojo._connect.apply(this, args); /*Handle*/
-}
-
-// used by non-browser hostenvs. always overriden by event.js
-dojo._connect = function(obj, event, context, method){
- var l=dojo._listener, h=l.add(obj, event, dojo.hitch(context, method));
- return [obj, event, h, l]; // Handle
-};
-
-dojo.disconnect = function(/*Handle*/ handle){
- // summary:
- // Remove a link created by dojo.connect.
- // description:
- // Removes the connection between event and the method referenced by handle.
- // handle:
- // the return value of the dojo.connect call that created the connection.
- if(handle && handle[0] !== undefined){
- dojo._disconnect.apply(this, handle);
- // let's not keep this reference
- delete handle[0];
- }
-};
-
-dojo._disconnect = function(obj, event, handle, listener){
- listener.remove(obj, event, handle);
-};
-
-// topic publish/subscribe
-
-dojo._topics = {};
-
-dojo.subscribe = function(/*String*/ topic, /*Object|null*/ context, /*String|Function*/ method){
- // summary:
- // Attach a listener to a named topic. The listener function is invoked whenever the
- // named topic is published (see: dojo.publish).
- // Returns a handle which is needed to unsubscribe this listener.
- // context:
- // Scope in which method will be invoked, or null for default scope.
- // method:
- // The name of a function in context, or a function reference. This is the function that
- // is invoked when topic is published.
- // example:
- // | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); });
- // | dojo.publish("alerts", [ "read this", "hello world" ]);
-
- // support for 2 argument invocation (omitting context) depends on hitch
- return [topic, dojo._listener.add(dojo._topics, topic, dojo.hitch(context, method))]; /*Handle*/
-};
-
-dojo.unsubscribe = function(/*Handle*/ handle){
- // summary:
- // Remove a topic listener.
- // handle:
- // The handle returned from a call to subscribe.
- // example:
- // | var alerter = dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
- // | ...
- // | dojo.unsubscribe(alerter);
- if(handle){
- dojo._listener.remove(dojo._topics, handle[0], handle[1]);
- }
-};
-
-dojo.publish = function(/*String*/ topic, /*Array*/ args){
- // summary:
- // Invoke all listener method subscribed to topic.
- // topic:
- // The name of the topic to publish.
- // args:
- // An array of arguments. The arguments will be applied
- // to each topic subscriber (as first class parameters, via apply).
- // example:
- // | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
- // | dojo.publish("alerts", [ "read this", "hello world" ]);
-
- // Note that args is an array, which is more efficient vs variable length
- // argument list. Ideally, var args would be implemented via Array
- // throughout the APIs.
- var f = dojo._topics[topic];
- if(f){
- f.apply(this, args||[]);
- }
-};
-
-dojo.connectPublisher = function( /*String*/ topic,
- /*Object|null*/ obj,
- /*String*/ event){
- // summary:
- // Ensure that every time obj.event() is called, a message is published
- // on the topic. Returns a handle which can be passed to
- // dojo.disconnect() to disable subsequent automatic publication on
- // the topic.
- // topic:
- // The name of the topic to publish.
- // obj:
- // The source object for the event function. Defaults to dojo.global
- // if null.
- // event:
- // The name of the event function in obj.
- // I.e. identifies a property obj[event].
- // example:
- // | dojo.connectPublisher("/ajax/start", dojo, "xhrGet");
- var pf = function(){ dojo.publish(topic, arguments); }
- return event ? dojo.connect(obj, event, pf) : dojo.connect(obj, pf); //Handle
-};
-
-}
-
-if(!dojo._hasResource["dojo._base.Deferred"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.Deferred"] = true;
-dojo.provide("dojo._base.Deferred");
+ dojo.safeMixin = declare.safeMixin = safeMixin;
+ dojo.declare = declare;
+ return declare;
+});
-(function(){
- var mutator = function(){};
- var freeze = Object.freeze || function(){};
- // A deferred provides an API for creating and resolving a promise.
- dojo.Deferred = function(/*Function?*/canceller){
+},
+'dojo/dom':function(){
+define(["./_base/sniff", "./_base/lang", "./_base/window"],
+ function(has, lang, win){
+ // module:
+ // dojo/dom
// summary:
- // Deferreds provide a generic means for encapsulating an asynchronous
- // operation and notifying users of the completion and result of the operation.
- // description:
- // The dojo.Deferred API is based on the concept of promises that provide a
- // generic interface into the eventual completion of an asynchronous action.
- // The motivation for promises fundamentally is about creating a
- // separation of concerns that allows one to achieve the same type of
- // call patterns and logical data flow in asynchronous code as can be
- // achieved in synchronous code. Promises allows one
- // to be able to call a function purely with arguments needed for
- // execution, without conflating the call with concerns of whether it is
- // sync or async. One shouldn't need to alter a call's arguments if the
- // implementation switches from sync to async (or vice versa). By having
- // async functions return promises, the concerns of making the call are
- // separated from the concerns of asynchronous interaction (which are
- // handled by the promise).
- //
- // The dojo.Deferred is a type of promise that provides methods for fulfilling the
- // promise with a successful result or an error. The most important method for
- // working with Dojo's promises is the then() method, which follows the
- // CommonJS proposed promise API. An example of using a Dojo promise:
- //
- // | var resultingPromise = someAsyncOperation.then(function(result){
- // | ... handle result ...
- // | },
- // | function(error){
- // | ... handle error ...
- // | });
- //
- // The .then() call returns a new promise that represents the result of the
- // execution of the callback. The callbacks will never affect the original promises value.
- //
- // The dojo.Deferred instances also provide the following functions for backwards compatibility:
- //
- // * addCallback(handler)
- // * addErrback(handler)
- // * callback(result)
- // * errback(result)
- //
- // Callbacks are allowed to return promises themselves, so
- // you can build complicated sequences of events with ease.
- //
- // The creator of the Deferred may specify a canceller. The canceller
- // is a function that will be called if Deferred.cancel is called
- // before the Deferred fires. You can use this to implement clean
- // aborting of an XMLHttpRequest, etc. Note that cancel will fire the
- // deferred with a CancelledError (unless your canceller returns
- // another kind of error), so the errbacks should be prepared to
- // handle that error for cancellable Deferreds.
- // example:
- // | var deferred = new dojo.Deferred();
- // | setTimeout(function(){ deferred.callback({success: true}); }, 1000);
- // | return deferred;
- // example:
- // Deferred objects are often used when making code asynchronous. It
- // may be easiest to write functions in a synchronous manner and then
- // split code using a deferred to trigger a response to a long-lived
- // operation. For example, instead of register a callback function to
- // denote when a rendering operation completes, the function can
- // simply return a deferred:
- //
- // | // callback style:
- // | function renderLotsOfData(data, callback){
- // | var success = false
- // | try{
- // | for(var x in data){
- // | renderDataitem(data[x]);
- // | }
- // | success = true;
- // | }catch(e){ }
- // | if(callback){
- // | callback(success);
- // | }
- // | }
- //
- // | // using callback style
- // | renderLotsOfData(someDataObj, function(success){
- // | // handles success or failure
- // | if(!success){
- // | promptUserToRecover();
- // | }
- // | });
- // | // NOTE: no way to add another callback here!!
- // example:
- // Using a Deferred doesn't simplify the sending code any, but it
- // provides a standard interface for callers and senders alike,
- // providing both with a simple way to service multiple callbacks for
- // an operation and freeing both sides from worrying about details
- // such as "did this get called already?". With Deferreds, new
- // callbacks can be added at any time.
- //
- // | // Deferred style:
- // | function renderLotsOfData(data){
- // | var d = new dojo.Deferred();
- // | try{
- // | for(var x in data){
- // | renderDataitem(data[x]);
- // | }
- // | d.callback(true);
- // | }catch(e){
- // | d.errback(new Error("rendering failed"));
- // | }
- // | return d;
- // | }
- //
- // | // using Deferred style
- // | renderLotsOfData(someDataObj).then(null, function(){
- // | promptUserToRecover();
- // | });
- // | // NOTE: addErrback and addCallback both return the Deferred
- // | // again, so we could chain adding callbacks or save the
- // | // deferred for later should we need to be notified again.
- // example:
- // In this example, renderLotsOfData is synchronous and so both
- // versions are pretty artificial. Putting the data display on a
- // timeout helps show why Deferreds rock:
- //
- // | // Deferred style and async func
- // | function renderLotsOfData(data){
- // | var d = new dojo.Deferred();
- // | setTimeout(function(){
- // | try{
- // | for(var x in data){
- // | renderDataitem(data[x]);
- // | }
- // | d.callback(true);
- // | }catch(e){
- // | d.errback(new Error("rendering failed"));
- // | }
- // | }, 100);
- // | return d;
- // | }
- //
- // | // using Deferred style
- // | renderLotsOfData(someDataObj).then(null, function(){
- // | promptUserToRecover();
- // | });
- //
- // Note that the caller doesn't have to change his code at all to
- // handle the asynchronous case.
- var result, finished, isError, head, nextListener;
- var promise = (this.promise = {});
-
- function complete(value){
- if(finished){
- throw new Error("This deferred has already been resolved");
- }
- result = value;
- finished = true;
- notify();
- }
- function notify(){
- var mutated;
- while(!mutated && nextListener){
- var listener = nextListener;
- nextListener = nextListener.next;
- if((mutated = (listener.progress == mutator))){ // assignment and check
- finished = false;
- }
- var func = (isError ? listener.error : listener.resolved);
- if (func) {
- try {
- var newResult = func(result);
- if (newResult && typeof newResult.then === "function") {
- newResult.then(dojo.hitch(listener.deferred, "resolve"), dojo.hitch(listener.deferred, "reject"));
- continue;
- }
- var unchanged = mutated && newResult === undefined;
- if(mutated && !unchanged){
- isError = newResult instanceof Error;
- }
- listener.deferred[unchanged && isError ? "reject" : "resolve"](unchanged ? result : newResult);
- }
- catch (e) {
- listener.deferred.reject(e);
- }
- }else {
- if(isError){
- listener.deferred.reject(result);
- }else{
- listener.deferred.resolve(result);
- }
- }
- }
- }
- // calling resolve will resolve the promise
- this.resolve = this.callback = function(value){
- // summary:
- // Fulfills the Deferred instance successfully with the provide value
- this.fired = 0;
- this.results = [value, null];
- complete(value);
- };
-
-
- // calling error will indicate that the promise failed
- this.reject = this.errback = function(error){
- // summary:
- // Fulfills the Deferred instance as an error with the provided error
- isError = true;
- this.fired = 1;
- complete(error);
- this.results = [null, error];
- if(!error || error.log !== false){
- (dojo.config.deferredOnError || function(x){ console.error(x); })(error);
- }
- };
- // call progress to provide updates on the progress on the completion of the promise
- this.progress = function(update){
- // summary
- // Send progress events to all listeners
- var listener = nextListener;
- while(listener){
- var progress = listener.progress;
- progress && progress(update);
- listener = listener.next;
- }
- };
- this.addCallbacks = function(/*Function?*/callback, /*Function?*/errback){
- this.then(callback, errback, mutator);
- return this;
- };
- // provide the implementation of the promise
- this.then = promise.then = function(/*Function?*/resolvedCallback, /*Function?*/errorCallback, /*Function?*/progressCallback){
- // summary:
- // Adds a fulfilledHandler, errorHandler, and progressHandler to be called for
- // completion of a promise. The fulfilledHandler is called when the promise
- // is fulfilled. The errorHandler is called when a promise fails. The
- // progressHandler is called for progress events. All arguments are optional
- // and non-function values are ignored. The progressHandler is not only an
- // optional argument, but progress events are purely optional. Promise
- // providers are not required to ever create progress events.
- //
- // This function will return a new promise that is fulfilled when the given
- // fulfilledHandler or errorHandler callback is finished. This allows promise
- // operations to be chained together. The value returned from the callback
- // handler is the fulfillment value for the returned promise. If the callback
- // throws an error, the returned promise will be moved to failed state.
- //
- // example:
- // An example of using a CommonJS compliant promise:
- // | asyncComputeTheAnswerToEverything().
- // | then(addTwo).
- // | then(printResult, onError);
- // | >44
- //
- var returnDeferred = progressCallback == mutator ? this : new dojo.Deferred(promise.cancel);
- var listener = {
- resolved: resolvedCallback,
- error: errorCallback,
- progress: progressCallback,
- deferred: returnDeferred
- };
- if(nextListener){
- head = head.next = listener;
- }
- else{
- nextListener = head = listener;
- }
- if(finished){
- notify();
- }
- return returnDeferred.promise;
- };
- var deferred = this;
- this.cancel = promise.cancel = function () {
- // summary:
- // Cancels the asynchronous operation
- if(!finished){
- var error = canceller && canceller(deferred);
- if(!finished){
- if (!(error instanceof Error)) {
- error = new Error(error);
- }
- error.log = false;
- deferred.reject(error);
- }
- }
- };
- freeze(promise);
- };
- dojo.extend(dojo.Deferred, {
- addCallback: function (/*Function*/callback) {
- return this.addCallbacks(dojo.hitch.apply(dojo, arguments));
- },
-
- addErrback: function (/*Function*/errback) {
- return this.addCallbacks(null, dojo.hitch.apply(dojo, arguments));
- },
-
- addBoth: function (/*Function*/callback) {
- var enclosed = dojo.hitch.apply(dojo, arguments);
- return this.addCallbacks(enclosed, enclosed);
- },
- fired: -1
- });
-})();
-dojo.when = function(promiseOrValue, /*Function?*/callback, /*Function?*/errback, /*Function?*/progressHandler){
- // summary:
- // This provides normalization between normal synchronous values and
- // asynchronous promises, so you can interact with them in a common way
- // example:
- // | function printFirstAndList(items){
- // | dojo.when(findFirst(items), console.log);
- // | dojo.when(findLast(items), console.log);
- // | }
- // | function findFirst(items){
- // | return dojo.when(items, function(items){
- // | return items[0];
- // | });
- // | }
- // | function findLast(items){
- // | return dojo.when(items, function(items){
- // | return items[items.length];
- // | });
- // | }
- // And now all three of his functions can be used sync or async.
- // | printFirstAndLast([1,2,3,4]) will work just as well as
- // | printFirstAndLast(dojo.xhrGet(...));
-
- if(promiseOrValue && typeof promiseOrValue.then === "function"){
- return promiseOrValue.then(callback, errback, progressHandler);
- }
- return callback(promiseOrValue);
-};
+ // This module defines the core dojo DOM API.
-}
-
-if(!dojo._hasResource["dojo._base.json"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.json"] = true;
-dojo.provide("dojo._base.json");
+ // FIXME: need to add unit tests for all the semi-public methods
-
-dojo.fromJson = function(/*String*/ json){
- // summary:
- // Parses a [JSON](http://json.org) string to return a JavaScript object.
- // description:
- // Throws for invalid JSON strings, but it does not use a strict JSON parser. It
- // delegates to eval(). The content passed to this method must therefore come
- // from a trusted source.
- // json:
- // a string literal of a JSON item, for instance:
- // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'`
-
- return eval("(" + json + ")"); // Object
-};
-
-dojo._escapeString = function(/*String*/str){
- //summary:
- // Adds escape sequences for non-visual characters, double quote and
- // backslash and surrounds with double quotes to form a valid string
- // literal.
- return ('"' + str.replace(/(["\\])/g, '\\$1') + '"').
- replace(/[\f]/g, "\\f").replace(/[\b]/g, "\\b").replace(/[\n]/g, "\\n").
- replace(/[\t]/g, "\\t").replace(/[\r]/g, "\\r"); // string
-};
-
-dojo.toJsonIndentStr = "\t";
-dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _indentStr){
- // summary:
- // Returns a [JSON](http://json.org) serialization of an object.
- // description:
- // Returns a [JSON](http://json.org) serialization of an object.
- // Note that this doesn't check for infinite recursion, so don't do that!
- // it:
- // an object to be serialized. Objects may define their own
- // serialization via a special "__json__" or "json" function
- // property. If a specialized serializer has been defined, it will
- // be used as a fallback.
- // prettyPrint:
- // if true, we indent objects and arrays to make the output prettier.
- // The variable `dojo.toJsonIndentStr` is used as the indent string --
- // to use something other than the default (tab), change that variable
- // before calling dojo.toJson().
- // _indentStr:
- // private variable for recursive calls when pretty printing, do not use.
- // example:
- // simple serialization of a trivial object
- // | var jsonStr = dojo.toJson({ howdy: "stranger!", isStrange: true });
- // | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr);
- // example:
- // a custom serializer for an objects of a particular class:
- // | dojo.declare("Furby", null, {
- // | furbies: "are strange",
- // | furbyCount: 10,
- // | __json__: function(){
- // | },
- // | });
-
- if(it === undefined){
- return "undefined";
- }
- var objtype = typeof it;
- if(objtype == "number" || objtype == "boolean"){
- return it + "";
- }
- if(it === null){
- return "null";
- }
- if(dojo.isString(it)){
- return dojo._escapeString(it);
- }
- // recurse
- var recurse = arguments.callee;
- // short-circuit for objects that support "json" serialization
- // if they return "self" then just pass-through...
- var newObj;
- _indentStr = _indentStr || "";
- var nextIndent = prettyPrint ? _indentStr + dojo.toJsonIndentStr : "";
- var tf = it.__json__||it.json;
- if(dojo.isFunction(tf)){
- newObj = tf.call(it);
- if(it !== newObj){
- return recurse(newObj, prettyPrint, nextIndent);
- }
- }
- if(it.nodeType && it.cloneNode){ // isNode
- // we can't seriailize DOM nodes as regular objects because they have cycles
- // DOM nodes could be serialized with something like outerHTML, but
- // that can be provided by users in the form of .json or .__json__ function.
- throw new Error("Can't serialize DOM nodes");
- }
-
- var sep = prettyPrint ? " " : "";
- var newLine = prettyPrint ? "\n" : "";
-
- // array
- if(dojo.isArray(it)){
- var res = dojo.map(it, function(obj){
- var val = recurse(obj, prettyPrint, nextIndent);
- if(typeof val != "string"){
- val = "undefined";
- }
- return newLine + nextIndent + val;
- });
- return "[" + res.join("," + sep) + newLine + _indentStr + "]";
- }
- /*
- // look in the registry
- try {
- window.o = it;
- newObj = dojo.json.jsonRegistry.match(it);
- return recurse(newObj, prettyPrint, nextIndent);
+ try{
+ document.execCommand("BackgroundImageCache", false, true);
}catch(e){
- // console.log(e);
- }
- // it's a function with no adapter, skip it
- */
- if(objtype == "function"){
- return null; // null
- }
- // generic object code path
- var output = [], key;
- for(key in it){
- var keyStr, val;
- if(typeof key == "number"){
- keyStr = '"' + key + '"';
- }else if(typeof key == "string"){
- keyStr = dojo._escapeString(key);
- }else{
- // skip non-string or number keys
- continue;
- }
- val = recurse(it[key], prettyPrint, nextIndent);
- if(typeof val != "string"){
- // skip non-serializable values
- continue;
- }
- // FIXME: use += on Moz!!
- // MOW NOTE: using += is a pain because you have to account for the dangling comma...
- output.push(newLine + nextIndent + keyStr + ":" + sep + val);
+ // sane browsers don't have cache "issues"
}
- return "{" + output.join("," + sep) + newLine + _indentStr + "}"; // String
-};
-
-}
-
-if(!dojo._hasResource["dojo._base.Color"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.Color"] = true;
-dojo.provide("dojo._base.Color");
-
-
-
-
-(function(){
-
- var d = dojo;
+
+ // =============================
+ // DOM Functions
+ // =============================
- dojo.Color = function(/*Array|String|Object*/ color){
+ /*=====
+ dojo.byId = function(id, doc){
// summary:
- // Takes a named string, hex string, array of rgb or rgba values,
- // an object with r, g, b, and a properties, or another `dojo.Color` object
- // and creates a new Color instance to work from.
+ // Returns DOM node with matching `id` attribute or `null`
+ // if not found. If `id` is a DomNode, this function is a no-op.
//
- // example:
- // Work with a Color instance:
- // | var c = new dojo.Color();
- // | c.setColor([0,0,0]); // black
- // | var hex = c.toHex(); // #000000
+ // id: String|DOMNode
+ // A string to match an HTML id attribute or a reference to a DOM Node
//
- // example:
- // Work with a node's color:
- // | var color = dojo.style("someNode", "backgroundColor");
- // | var n = new dojo.Color(color);
- // | // adjust the color some
- // | n.r *= .5;
- // | console.log(n.toString()); // rgb(128, 255, 255);
- if(color){ this.setColor(color); }
- };
-
- // FIXME:
- // there's got to be a more space-efficient way to encode or discover
- // these!! Use hex?
- dojo.Color.named = {
- black: [0,0,0],
- silver: [192,192,192],
- gray: [128,128,128],
- white: [255,255,255],
- maroon: [128,0,0],
- red: [255,0,0],
- purple: [128,0,128],
- fuchsia: [255,0,255],
- green: [0,128,0],
- lime: [0,255,0],
- olive: [128,128,0],
- yellow: [255,255,0],
- navy: [0,0,128],
- blue: [0,0,255],
- teal: [0,128,128],
- aqua: [0,255,255],
- transparent: d.config.transparentColor || [255,255,255]
- };
-
- dojo.extend(dojo.Color, {
- r: 255, g: 255, b: 255, a: 1,
- _set: function(r, g, b, a){
- var t = this; t.r = r; t.g = g; t.b = b; t.a = a;
- },
- setColor: function(/*Array|String|Object*/ color){
- // summary:
- // Takes a named string, hex string, array of rgb or rgba values,
- // an object with r, g, b, and a properties, or another `dojo.Color` object
- // and sets this color instance to that value.
- //
- // example:
- // | var c = new dojo.Color(); // no color
- // | c.setColor("#ededed"); // greyish
- if(d.isString(color)){
- d.colorFromString(color, this);
- }else if(d.isArray(color)){
- d.colorFromArray(color, this);
- }else{
- this._set(color.r, color.g, color.b, color.a);
- if(!(color instanceof d.Color)){ this.sanitize(); }
- }
- return this; // dojo.Color
- },
- sanitize: function(){
- // summary:
- // Ensures the object has correct attributes
- // description:
- // the default implementation does nothing, include dojo.colors to
- // augment it with real checks
- return this; // dojo.Color
- },
- toRgb: function(){
- // summary:
- // Returns 3 component array of rgb values
- // example:
- // | var c = new dojo.Color("#000000");
- // | console.log(c.toRgb()); // [0,0,0]
- var t = this;
- return [t.r, t.g, t.b]; // Array
- },
- toRgba: function(){
- // summary:
- // Returns a 4 component array of rgba values from the color
- // represented by this object.
- var t = this;
- return [t.r, t.g, t.b, t.a]; // Array
- },
- toHex: function(){
- // summary:
- // Returns a CSS color string in hexadecimal representation
- // example:
- // | console.log(new dojo.Color([0,0,0]).toHex()); // #000000
- var arr = d.map(["r", "g", "b"], function(x){
- var s = this[x].toString(16);
- return s.length < 2 ? "0" + s : s;
- }, this);
- return "#" + arr.join(""); // String
- },
- toCss: function(/*Boolean?*/ includeAlpha){
- // summary:
- // Returns a css color string in rgb(a) representation
- // example:
- // | var c = new dojo.Color("#FFF").toCss();
- // | console.log(c); // rgb('255','255','255')
- var t = this, rgb = t.r + ", " + t.g + ", " + t.b;
- return (includeAlpha ? "rgba(" + rgb + ", " + t.a : "rgb(" + rgb) + ")"; // String
- },
- toString: function(){
- // summary:
- // Returns a visual representation of the color
- return this.toCss(true); // String
- }
- });
-
- dojo.blendColors = function(
- /*dojo.Color*/ start,
- /*dojo.Color*/ end,
- /*Number*/ weight,
- /*dojo.Color?*/ obj
- ){
- // summary:
- // Blend colors end and start with weight from 0 to 1, 0.5 being a 50/50 blend,
- // can reuse a previously allocated dojo.Color object for the result
- var t = obj || new d.Color();
- d.forEach(["r", "g", "b", "a"], function(x){
- t[x] = start[x] + (end[x] - start[x]) * weight;
- if(x != "a"){ t[x] = Math.round(t[x]); }
- });
- return t.sanitize(); // dojo.Color
- };
-
- dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){
- // summary:
- // Returns a `dojo.Color` instance from a string of the form
- // "rgb(...)" or "rgba(...)". Optionally accepts a `dojo.Color`
- // object to update with the parsed value and return instead of
- // creating a new object.
- // returns:
- // A dojo.Color object. If obj is passed, it will be the return value.
- var m = color.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);
- return m && dojo.colorFromArray(m[1].split(/\s*,\s*/), obj); // dojo.Color
- };
-
- dojo.colorFromHex = function(/*String*/ color, /*dojo.Color?*/ obj){
- // summary:
- // Converts a hex string with a '#' prefix to a color object.
- // Supports 12-bit #rgb shorthand. Optionally accepts a
- // `dojo.Color` object to update with the parsed value.
+ // doc: Document?
+ // Document to work in. Defaults to the current value of
+ // dojo.doc. Can be used to retrieve
+ // node references from other documents.
//
- // returns:
- // A dojo.Color object. If obj is passed, it will be the return value.
+ // example:
+ // Look up a node by ID:
+ // | var n = dojo.byId("foo");
//
// example:
- // | var thing = dojo.colorFromHex("#ededed"); // grey, longhand
+ // Check if a node exists, and use it.
+ // | var n = dojo.byId("bar");
+ // | if(n){ doStuff() ... }
//
// example:
- // | var thing = dojo.colorFromHex("#000"); // black, shorthand
- var t = obj || new d.Color(),
- bits = (color.length == 4) ? 4 : 8,
- mask = (1 << bits) - 1;
- color = Number("0x" + color.substr(1));
- if(isNaN(color)){
- return null; // dojo.Color
- }
- d.forEach(["b", "g", "r"], function(x){
- var c = color & mask;
- color >>= bits;
- t[x] = bits == 4 ? 17 * c : c;
- });
- t.a = 1;
- return t; // dojo.Color
- };
+ // Allow string or DomNode references to be passed to a custom function:
+ // | var foo = function(nodeOrId){
+ // | nodeOrId = dojo.byId(nodeOrId);
+ // | // ... more stuff
+ // | }
+ =====*/
- dojo.colorFromArray = function(/*Array*/ a, /*dojo.Color?*/ obj){
+ /*=====
+ dojo.isDescendant = function(node, ancestor){
// summary:
- // Builds a `dojo.Color` from a 3 or 4 element array, mapping each
- // element in sequence to the rgb(a) values of the color.
+ // Returns true if node is a descendant of ancestor
+ // node: DOMNode|String
+ // string id or node reference to test
+ // ancestor: DOMNode|String
+ // string id or node reference of potential parent to test against
+ //
// example:
- // | var myColor = dojo.colorFromArray([237,237,237,0.5]); // grey, 50% alpha
- // returns:
- // A dojo.Color object. If obj is passed, it will be the return value.
- var t = obj || new d.Color();
- t._set(Number(a[0]), Number(a[1]), Number(a[2]), Number(a[3]));
- if(isNaN(t.a)){ t.a = 1; }
- return t.sanitize(); // dojo.Color
- };
-
- dojo.colorFromString = function(/*String*/ str, /*dojo.Color?*/ obj){
- // summary:
- // Parses `str` for a color value. Accepts hex, rgb, and rgba
- // style color values.
- // description:
- // Acceptable input values for str may include arrays of any form
- // accepted by dojo.colorFromArray, hex strings such as "#aaaaaa", or
- // rgb or rgba strings such as "rgb(133, 200, 16)" or "rgba(10, 10,
- // 10, 50)"
- // returns:
- // A dojo.Color object. If obj is passed, it will be the return value.
- var a = d.Color.named[str];
- return a && d.colorFromArray(a, obj) || d.colorFromRgb(str, obj) || d.colorFromHex(str, obj);
- };
-})();
-
-}
-
-if(!dojo._hasResource["dojo._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.window"] = true;
-dojo.provide("dojo._base.window");
-
-
-/*=====
-dojo.doc = {
- // summary:
- // Alias for the current document. 'dojo.doc' can be modified
- // for temporary context shifting. Also see dojo.withDoc().
- // description:
- // Refer to dojo.doc rather
- // than referring to 'window.document' to ensure your code runs
- // correctly in managed contexts.
- // example:
- // | n.appendChild(dojo.doc.createElement('div'));
-}
-=====*/
-dojo.doc = window["document"] || null;
-
-dojo.body = function(){
- // summary:
- // Return the body element of the document
- // return the body object associated with dojo.doc
- // example:
- // | dojo.body().appendChild(dojo.doc.createElement('div'));
-
- // Note: document.body is not defined for a strict xhtml document
- // Would like to memoize this, but dojo.doc can change vi dojo.withDoc().
- return dojo.doc.body || dojo.doc.getElementsByTagName("body")[0]; // Node
-};
-
-dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocument){
- // summary:
- // changes the behavior of many core Dojo functions that deal with
- // namespace and DOM lookup, changing them to work in a new global
- // context (e.g., an iframe). The varibles dojo.global and dojo.doc
- // are modified as a result of calling this function and the result of
- // `dojo.body()` likewise differs.
- dojo.global = globalObject;
- dojo.doc = globalDocument;
-};
-
-dojo.withGlobal = function( /*Object*/globalObject,
- /*Function*/callback,
- /*Object?*/thisObject,
- /*Array?*/cbArguments){
- // summary:
- // Invoke callback with globalObject as dojo.global and
- // globalObject.document as dojo.doc.
- // description:
- // Invoke callback with globalObject as dojo.global and
- // globalObject.document as dojo.doc. If provided, globalObject
- // will be executed in the context of object thisObject
- // When callback() returns or throws an error, the dojo.global
- // and dojo.doc will be restored to its previous state.
-
- var oldGlob = dojo.global;
- try{
- dojo.global = globalObject;
- return dojo.withDoc.call(null, globalObject.document, callback, thisObject, cbArguments);
- }finally{
- dojo.global = oldGlob;
- }
-};
-
-dojo.withDoc = function( /*DocumentElement*/documentObject,
- /*Function*/callback,
- /*Object?*/thisObject,
- /*Array?*/cbArguments){
- // summary:
- // Invoke callback with documentObject as dojo.doc.
- // description:
- // Invoke callback with documentObject as dojo.doc. If provided,
- // callback will be executed in the context of object thisObject
- // When callback() returns or throws an error, the dojo.doc will
- // be restored to its previous state.
-
- var oldDoc = dojo.doc,
- oldLtr = dojo._bodyLtr,
- oldQ = dojo.isQuirks;
-
- try{
- dojo.doc = documentObject;
- delete dojo._bodyLtr; // uncache
- dojo.isQuirks = dojo.doc.compatMode == "BackCompat"; // no need to check for QuirksMode which was Opera 7 only
-
- if(thisObject && typeof callback == "string"){
- callback = thisObject[callback];
- }
-
- return callback.apply(thisObject, cbArguments || []);
- }finally{
- dojo.doc = oldDoc;
- delete dojo._bodyLtr; // in case it was undefined originally, and set to true/false by the alternate document
- if(oldLtr !== undefined){ dojo._bodyLtr = oldLtr; }
- dojo.isQuirks = oldQ;
- }
-};
-
-}
-
-if(!dojo._hasResource["dojo._base.event"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.event"] = true;
-dojo.provide("dojo._base.event");
-
-
-
-// this file courtesy of the TurboAjax Group, licensed under a Dojo CLA
-
-(function(){
- // DOM event listener machinery
- var del = (dojo._event_listener = {
- add: function(/*DOMNode*/ node, /*String*/ name, /*Function*/ fp){
- if(!node){return;}
- name = del._normalizeEventName(name);
- fp = del._fixCallback(name, fp);
- if(
- !dojo.isIE &&
- (name == "mouseenter" || name == "mouseleave")
- ){
- var ofp = fp;
- name = (name == "mouseenter") ? "mouseover" : "mouseout";
- fp = function(e){
- if(!dojo.isDescendant(e.relatedTarget, node)){
- // e.type = oname; // FIXME: doesn't take? SJM: event.type is generally immutable.
- return ofp.call(this, e);
- }
- }
- }
- node.addEventListener(name, fp, false);
- return fp; /*Handle*/
- },
- remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
- // summary:
- // clobbers the listener from the node
- // node:
- // DOM node to attach the event to
- // event:
- // the name of the handler to remove the function from
- // handle:
- // the handle returned from add
- if(node){
- event = del._normalizeEventName(event);
- if(!dojo.isIE && (event == "mouseenter" || event == "mouseleave")){
- event = (event == "mouseenter") ? "mouseover" : "mouseout";
- }
-
- node.removeEventListener(event, handle, false);
- }
- },
- _normalizeEventName: function(/*String*/ name){
- // Generally, name should be lower case, unless it is special
- // somehow (e.g. a Mozilla DOM event).
- // Remove 'on'.
- return name.slice(0,2) =="on" ? name.slice(2) : name;
- },
- _fixCallback: function(/*String*/ name, fp){
- // By default, we only invoke _fixEvent for 'keypress'
- // If code is added to _fixEvent for other events, we have
- // to revisit this optimization.
- // This also applies to _fixEvent overrides for Safari and Opera
- // below.
- return name != "keypress" ? fp : function(e){ return fp.call(this, del._fixEvent(e, this)); };
- },
- _fixEvent: function(evt, sender){
- // _fixCallback only attaches us to keypress.
- // Switch on evt.type anyway because we might
- // be called directly from dojo.fixEvent.
- switch(evt.type){
- case "keypress":
- del._setKeyChar(evt);
- break;
- }
- return evt;
- },
- _setKeyChar: function(evt){
- evt.keyChar = evt.charCode >= 32 ? String.fromCharCode(evt.charCode) : '';
- evt.charOrCode = evt.keyChar || evt.keyCode;
- },
- // For IE and Safari: some ctrl-key combinations (mostly w/punctuation) do not emit a char code in IE
- // we map those virtual key codes to ascii here
- // not valid for all (non-US) keyboards, so maybe we shouldn't bother
- _punctMap: {
- 106:42,
- 111:47,
- 186:59,
- 187:43,
- 188:44,
- 189:45,
- 190:46,
- 191:47,
- 192:96,
- 219:91,
- 220:92,
- 221:93,
- 222:39
- }
- });
-
- // DOM events
-
- dojo.fixEvent = function(/*Event*/ evt, /*DOMNode*/ sender){
- // summary:
- // normalizes properties on the event object including event
- // bubbling methods, keystroke normalization, and x/y positions
- // evt: Event
- // native event object
- // sender: DOMNode
- // node to treat as "currentTarget"
- return del._fixEvent(evt, sender);
+ // Test is node id="bar" is a descendant of node id="foo"
+ // | if(dojo.isDescendant("bar", "foo")){ ... }
};
+ =====*/
- dojo.stopEvent = function(/*Event*/ evt){
- // summary:
- // prevents propagation and clobbers the default action of the
- // passed event
- // evt: Event
- // The event object. If omitted, window.event is used on IE.
- evt.preventDefault();
- evt.stopPropagation();
- // NOTE: below, this method is overridden for IE
- };
+ // TODO: do we need this function in the base?
- // the default listener to use on dontFix nodes, overriden for IE
- var node_listener = dojo._listener;
-
- // Unify connect and event listeners
- dojo._connect = function(obj, event, context, method, dontFix){
- // FIXME: need a more strict test
- var isNode = obj && (obj.nodeType||obj.attachEvent||obj.addEventListener);
- // choose one of three listener options: raw (connect.js), DOM event on a Node, custom event on a Node
- // we need the third option to provide leak prevention on broken browsers (IE)
- var lid = isNode ? (dontFix ? 2 : 1) : 0, l = [dojo._listener, del, node_listener][lid];
- // create a listener
- var h = l.add(obj, event, dojo.hitch(context, method));
- // formerly, the disconnect package contained "l" directly, but if client code
- // leaks the disconnect package (by connecting it to a node), referencing "l"
- // compounds the problem.
- // instead we return a listener id, which requires custom _disconnect below.
- // return disconnect package
- return [ obj, event, h, lid ];
- };
-
- dojo._disconnect = function(obj, event, handle, listener){
- ([dojo._listener, del, node_listener][listener]).remove(obj, event, handle);
- };
-
- // Constants
-
- // Public: client code should test
- // keyCode against these named constants, as the
- // actual codes can vary by browser.
- dojo.keys = {
- // summary:
- // Definitions for common key values
- BACKSPACE: 8,
- TAB: 9,
- CLEAR: 12,
- ENTER: 13,
- SHIFT: 16,
- CTRL: 17,
- ALT: 18,
- META: dojo.isSafari ? 91 : 224, // the apple key on macs
- PAUSE: 19,
- CAPS_LOCK: 20,
- ESCAPE: 27,
- SPACE: 32,
- PAGE_UP: 33,
- PAGE_DOWN: 34,
- END: 35,
- HOME: 36,
- LEFT_ARROW: 37,
- UP_ARROW: 38,
- RIGHT_ARROW: 39,
- DOWN_ARROW: 40,
- INSERT: 45,
- DELETE: 46,
- HELP: 47,
- LEFT_WINDOW: 91,
- RIGHT_WINDOW: 92,
- SELECT: 93,
- NUMPAD_0: 96,
- NUMPAD_1: 97,
- NUMPAD_2: 98,
- NUMPAD_3: 99,
- NUMPAD_4: 100,
- NUMPAD_5: 101,
- NUMPAD_6: 102,
- NUMPAD_7: 103,
- NUMPAD_8: 104,
- NUMPAD_9: 105,
- NUMPAD_MULTIPLY: 106,
- NUMPAD_PLUS: 107,
- NUMPAD_ENTER: 108,
- NUMPAD_MINUS: 109,
- NUMPAD_PERIOD: 110,
- NUMPAD_DIVIDE: 111,
- F1: 112,
- F2: 113,
- F3: 114,
- F4: 115,
- F5: 116,
- F6: 117,
- F7: 118,
- F8: 119,
- F9: 120,
- F10: 121,
- F11: 122,
- F12: 123,
- F13: 124,
- F14: 125,
- F15: 126,
- NUM_LOCK: 144,
- SCROLL_LOCK: 145,
- // virtual key mapping
- copyKey: dojo.isMac && !dojo.isAIR ? (dojo.isSafari ? 91 : 224 ) : 17
- };
-
- var evtCopyKey = dojo.isMac ? "metaKey" : "ctrlKey";
-
- dojo.isCopyKey = function(e){
+ /*=====
+ dojo.setSelectable = function(node, selectable){
// summary:
- // Checks an event for the copy key (meta on Mac, and ctrl anywhere else)
- // e: Event
- // Event object to examine
- return e[evtCopyKey]; // Boolean
- };
-
- // Public: decoding mouse buttons from events
-
-/*=====
- dojo.mouseButtons = {
- // LEFT: Number
- // Numeric value of the left mouse button for the platform.
- LEFT: 0,
- // MIDDLE: Number
- // Numeric value of the middle mouse button for the platform.
- MIDDLE: 1,
- // RIGHT: Number
- // Numeric value of the right mouse button for the platform.
- RIGHT: 2,
-
- isButton: function(e, button){
- // summary:
- // Checks an event object for a pressed button
- // e: Event
- // Event object to examine
- // button: Number
- // The button value (example: dojo.mouseButton.LEFT)
- return e.button == button; // Boolean
- },
- isLeft: function(e){
- // summary:
- // Checks an event object for the pressed left button
- // e: Event
- // Event object to examine
- return e.button == 0; // Boolean
- },
- isMiddle: function(e){
- // summary:
- // Checks an event object for the pressed middle button
- // e: Event
- // Event object to examine
- return e.button == 1; // Boolean
- },
- isRight: function(e){
- // summary:
- // Checks an event object for the pressed right button
- // e: Event
- // Event object to examine
- return e.button == 2; // Boolean
- }
+ // Enable or disable selection on a node
+ // node: DOMNode|String
+ // id or reference to node
+ // selectable: Boolean
+ // state to put the node in. false indicates unselectable, true
+ // allows selection.
+ // example:
+ // Make the node id="bar" unselectable
+ // | dojo.setSelectable("bar");
+ // example:
+ // Make the node id="bar" selectable
+ // | dojo.setSelectable("bar", true);
};
-=====*/
+ =====*/
- if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){
- dojo.mouseButtons = {
- LEFT: 1,
- MIDDLE: 4,
- RIGHT: 2,
- // helper functions
- isButton: function(e, button){ return e.button & button; },
- isLeft: function(e){ return e.button & 1; },
- isMiddle: function(e){ return e.button & 4; },
- isRight: function(e){ return e.button & 2; }
- };
- }else{
- dojo.mouseButtons = {
- LEFT: 0,
- MIDDLE: 1,
- RIGHT: 2,
- // helper functions
- isButton: function(e, button){ return e.button == button; },
- isLeft: function(e){ return e.button == 0; },
- isMiddle: function(e){ return e.button == 1; },
- isRight: function(e){ return e.button == 2; }
- };
- }
-
- // IE event normalization
- if(dojo.isIE){
- var _trySetKeyCode = function(e, code){
- try{
- // squelch errors when keyCode is read-only
- // (e.g. if keyCode is ctrl or shift)
- return (e.keyCode = code);
- }catch(e){
- return 0;
- }
- };
+ var dom = {}; // the result object
- // by default, use the standard listener
- var iel = dojo._listener;
- var listenersName = (dojo._ieListenersName = "_" + dojo._scopeName + "_listeners");
- // dispatcher tracking property
- if(!dojo.config._allow_leaks){
- // custom listener that handles leak protection for DOM events
- node_listener = iel = dojo._ie_listener = {
- // support handler indirection: event handler functions are
- // referenced here. Event dispatchers hold only indices.
- handlers: [],
- // add a listener to an object
- add: function(/*Object*/ source, /*String*/ method, /*Function*/ listener){
- source = source || dojo.global;
- var f = source[method];
- if(!f||!f[listenersName]){
- var d = dojo._getIeDispatcher();
- // original target function is special
- d.target = f && (ieh.push(f) - 1);
- // dispatcher holds a list of indices into handlers table
- d[listenersName] = [];
- // redirect source to dispatcher
- f = source[method] = d;
- }
- return f[listenersName].push(ieh.push(listener) - 1) ; /*Handle*/
- },
- // remove a listener from an object
- remove: function(/*Object*/ source, /*String*/ method, /*Handle*/ handle){
- var f = (source||dojo.global)[method], l = f && f[listenersName];
- if(f && l && handle--){
- delete ieh[l[handle]];
- delete l[handle];
- }
- }
- };
- // alias used above
- var ieh = iel.handlers;
- }
-
- dojo.mixin(del, {
- add: function(/*DOMNode*/ node, /*String*/ event, /*Function*/ fp){
- if(!node){return;} // undefined
- event = del._normalizeEventName(event);
- if(event=="onkeypress"){
- // we need to listen to onkeydown to synthesize
- // keypress events that otherwise won't fire
- // on IE
- var kd = node.onkeydown;
- if(!kd || !kd[listenersName] || !kd._stealthKeydownHandle){
- var h = del.add(node, "onkeydown", del._stealthKeyDown);
- kd = node.onkeydown;
- kd._stealthKeydownHandle = h;
- kd._stealthKeydownRefs = 1;
- }else{
- kd._stealthKeydownRefs++;
- }
- }
- return iel.add(node, event, del._fixCallback(fp));
- },
- remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
- event = del._normalizeEventName(event);
- iel.remove(node, event, handle);
- if(event=="onkeypress"){
- var kd = node.onkeydown;
- if(--kd._stealthKeydownRefs <= 0){
- iel.remove(node, "onkeydown", kd._stealthKeydownHandle);
- delete kd._stealthKeydownHandle;
- }
- }
- },
- _normalizeEventName: function(/*String*/ eventName){
- // Generally, eventName should be lower case, unless it is
- // special somehow (e.g. a Mozilla event)
- // ensure 'on'
- return eventName.slice(0,2) != "on" ? "on" + eventName : eventName;
- },
- _nop: function(){},
- _fixEvent: function(/*Event*/ evt, /*DOMNode*/ sender){
- // summary:
- // normalizes properties on the event object including event
- // bubbling methods, keystroke normalization, and x/y positions
- // evt:
- // native event object
- // sender:
- // node to treat as "currentTarget"
- if(!evt){
- var w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window;
- evt = w.event;
- }
- if(!evt){return(evt);}
- evt.target = evt.srcElement;
- evt.currentTarget = (sender || evt.srcElement);
- evt.layerX = evt.offsetX;
- evt.layerY = evt.offsetY;
- // FIXME: scroll position query is duped from dojo.html to
- // avoid dependency on that entire module. Now that HTML is in
- // Base, we should convert back to something similar there.
- var se = evt.srcElement, doc = (se && se.ownerDocument) || document;
- // DO NOT replace the following to use dojo.body(), in IE, document.documentElement should be used
- // here rather than document.body
- var docBody = ((dojo.isIE < 6) || (doc["compatMode"] == "BackCompat")) ? doc.body : doc.documentElement;
- var offset = dojo._getIeDocumentElementOffset();
- evt.pageX = evt.clientX + dojo._fixIeBiDiScrollLeft(docBody.scrollLeft || 0) - offset.x;
- evt.pageY = evt.clientY + (docBody.scrollTop || 0) - offset.y;
- if(evt.type == "mouseover"){
- evt.relatedTarget = evt.fromElement;
- }
- if(evt.type == "mouseout"){
- evt.relatedTarget = evt.toElement;
- }
- if (dojo.isIE < 9 || dojo.isQuirks) {
- evt.stopPropagation = del._stopPropagation;
- evt.preventDefault = del._preventDefault;
- }
- return del._fixKeys(evt);
- },
- _fixKeys: function(evt){
- switch(evt.type){
- case "keypress":
- var c = ("charCode" in evt ? evt.charCode : evt.keyCode);
- if (c==10){
- // CTRL-ENTER is CTRL-ASCII(10) on IE, but CTRL-ENTER on Mozilla
- c=0;
- evt.keyCode = 13;
- }else if(c==13||c==27){
- c=0; // Mozilla considers ENTER and ESC non-printable
- }else if(c==3){
- c=99; // Mozilla maps CTRL-BREAK to CTRL-c
- }
- // Mozilla sets keyCode to 0 when there is a charCode
- // but that stops the event on IE.
- evt.charCode = c;
- del._setKeyChar(evt);
- break;
- }
- return evt;
- },
- _stealthKeyDown: function(evt){
- // IE doesn't fire keypress for most non-printable characters.
- // other browsers do, we simulate it here.
- var kp = evt.currentTarget.onkeypress;
- // only works if kp exists and is a dispatcher
- if(!kp || !kp[listenersName]){ return; }
- // munge key/charCode
- var k=evt.keyCode;
- // These are Windows Virtual Key Codes
- // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp
- var unprintable = (k!=13 || (dojo.isIE >= 9 && !dojo.isQuirks)) && k!=32 && k!=27 && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222);
-
- // synthesize keypress for most unprintables and CTRL-keys
- if(unprintable||evt.ctrlKey){
- var c = unprintable ? 0 : k;
- if(evt.ctrlKey){
- if(k==3 || k==13){
- return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively
- }else if(c>95 && c<106){
- c -= 48; // map CTRL-[numpad 0-9] to ASCII
- }else if((!evt.shiftKey)&&(c>=65&&c<=90)){
- c += 32; // map CTRL-[A-Z] to lowercase
- }else{
- c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII
- }
- }
- // simulate a keypress event
- var faux = del._synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c});
- kp.call(evt.currentTarget, faux);
- if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){
- evt.cancelBubble = faux.cancelBubble;
- }
- evt.returnValue = faux.returnValue;
- _trySetKeyCode(evt, faux.keyCode);
- }
- },
- // Called in Event scope
- _stopPropagation: function(){
- this.cancelBubble = true;
- },
- _preventDefault: function(){
- // Setting keyCode to 0 is the only way to prevent certain keypresses (namely
- // ctrl-combinations that correspond to menu accelerator keys).
- // Otoh, it prevents upstream listeners from getting this information
- // Try to split the difference here by clobbering keyCode only for ctrl
- // combinations. If you still need to access the key upstream, bubbledKeyCode is
- // provided as a workaround.
- this.bubbledKeyCode = this.keyCode;
- if(this.ctrlKey){_trySetKeyCode(this, 0);}
- this.returnValue = false;
- }
- });
-
- // override stopEvent for IE
- dojo.stopEvent = (dojo.isIE < 9 || dojo.isQuirks) ? function(evt){
- evt = evt || window.event;
- del._stopPropagation.call(evt);
- del._preventDefault.call(evt);
- } : dojo.stopEvent;
- }
-
- del._synthesizeEvent = function(evt, props){
- var faux = dojo.mixin({}, evt, props);
- del._setKeyChar(faux);
- // FIXME: would prefer to use dojo.hitch: dojo.hitch(evt, evt.preventDefault);
- // but it throws an error when preventDefault is invoked on Safari
- // does Event.preventDefault not support "apply" on Safari?
- faux.preventDefault = function(){ evt.preventDefault(); };
- faux.stopPropagation = function(){ evt.stopPropagation(); };
- return faux;
- };
-
- // Opera event normalization
- if(dojo.isOpera){
- dojo.mixin(del, {
- _fixEvent: function(evt, sender){
- switch(evt.type){
- case "keypress":
- var c = evt.which;
- if(c==3){
- c=99; // Mozilla maps CTRL-BREAK to CTRL-c
- }
- // can't trap some keys at all, like INSERT and DELETE
- // there is no differentiating info between DELETE and ".", or INSERT and "-"
- c = c<41 && !evt.shiftKey ? 0 : c;
- if(evt.ctrlKey && !evt.shiftKey && c>=65 && c<=90){
- // lowercase CTRL-[A-Z] keys
- c += 32;
- }
- return del._synthesizeEvent(evt, { charCode: c });
- }
- return evt;
+ if(has("ie")){
+ dom.byId = function(id, doc){
+ if(typeof id != "string"){
+ return id;
}
- });
- }
-
- // Webkit event normalization
- if(dojo.isWebKit){
- del._add = del.add;
- del._remove = del.remove;
-
- dojo.mixin(del, {
- add: function(/*DOMNode*/ node, /*String*/ event, /*Function*/ fp){
- if(!node){return;} // undefined
- var handle = del._add(node, event, fp);
- if(del._normalizeEventName(event) == "keypress"){
- // we need to listen to onkeydown to synthesize
- // keypress events that otherwise won't fire
- // in Safari 3.1+: https://lists.webkit.org/pipermail/webkit-dev/2007-December/002992.html
- handle._stealthKeyDownHandle = del._add(node, "keydown", function(evt){
- //A variation on the IE _stealthKeydown function
- //Synthesize an onkeypress event, but only for unprintable characters.
- var k=evt.keyCode;
- // These are Windows Virtual Key Codes
- // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp
- var unprintable = k!=13 && k!=32 && (k<48 || k>90) && (k<96 || k>111) && (k<186 || k>192) && (k<219 || k>222);
- // synthesize keypress for most unprintables and CTRL-keys
- if(unprintable || evt.ctrlKey){
- var c = unprintable ? 0 : k;
- if(evt.ctrlKey){
- if(k==3 || k==13){
- return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively
- }else if(c>95 && c<106){
- c -= 48; // map CTRL-[numpad 0-9] to ASCII
- }else if(!evt.shiftKey && c>=65 && c<=90){
- c += 32; // map CTRL-[A-Z] to lowercase
- }else{
- c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII
- }
- }
- // simulate a keypress event
- var faux = del._synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c});
- fp.call(evt.currentTarget, faux);
- }
- });
+ var _d = doc || win.doc, te = id && _d.getElementById(id);
+ // attributes.id.value is better than just id in case the
+ // user has a name=id inside a form
+ if(te && (te.attributes.id.value == id || te.id == id)){
+ return te;
+ }else{
+ var eles = _d.all[id];
+ if(!eles || eles.nodeName){
+ eles = [eles];
}
- return handle; /*Handle*/
- },
-
- remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
- if(node){
- if(handle._stealthKeyDownHandle){
- del._remove(node, "keydown", handle._stealthKeyDownHandle);
+ // if more than 1, choose first with the correct id
+ var i = 0;
+ while((te = eles[i++])){
+ if((te.attributes && te.attributes.id && te.attributes.id.value == id) || te.id == id){
+ return te;
}
- del._remove(node, event, handle);
- }
- },
- _fixEvent: function(evt, sender){
- switch(evt.type){
- case "keypress":
- if(evt.faux){ return evt; }
- var c = evt.charCode;
- c = c>=32 ? c : 0;
- return del._synthesizeEvent(evt, {charCode: c, faux: true});
}
- return evt;
}
- });
- }
- })();
-
-if(dojo.isIE){
- // keep this out of the closure
- // closing over 'iel' or 'ieh' b0rks leak prevention
- // ls[i] is an index into the master handler array
- dojo._ieDispatcher = function(args, sender){
- var ap = Array.prototype,
- h = dojo._ie_listener.handlers,
- c = args.callee,
- ls = c[dojo._ieListenersName],
- t = h[c.target];
- // return value comes from original target function
- var r = t && t.apply(sender, args);
- // make local copy of listener array so it's immutable during processing
- var lls = [].concat(ls);
- // invoke listeners after target function
- for(var i in lls){
- var f = h[lls[i]];
- if(!(i in ap) && f){
- f.apply(sender, args);
- }
- }
- return r;
- };
- dojo._getIeDispatcher = function(){
- // ensure the returned function closes over nothing ("new Function" apparently doesn't close)
- return new Function(dojo._scopeName + "._ieDispatcher(arguments, this)"); // function
- };
- // keep this out of the closure to reduce RAM allocation
- dojo._event_listener._fixCallback = function(fp){
- var f = dojo._event_listener._fixEvent;
- return function(e){ return fp.call(this, f(e, this)); };
- };
-}
-
-}
-
-if(!dojo._hasResource["dojo._base.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.html"] = true;
-dojo.provide("dojo._base.html");
-
-
-
-// FIXME: need to add unit tests for all the semi-public methods
-
-try{
- document.execCommand("BackgroundImageCache", false, true);
-}catch(e){
- // sane browsers don't have cache "issues"
-}
-
-// =============================
-// DOM Functions
-// =============================
-
-/*=====
-dojo.byId = function(id, doc){
- // summary:
- // Returns DOM node with matching `id` attribute or `null`
- // if not found. If `id` is a DomNode, this function is a no-op.
- //
- // id: String|DOMNode
- // A string to match an HTML id attribute or a reference to a DOM Node
- //
- // doc: Document?
- // Document to work in. Defaults to the current value of
- // dojo.doc. Can be used to retrieve
- // node references from other documents.
- //
- // example:
- // Look up a node by ID:
- // | var n = dojo.byId("foo");
- //
- // example:
- // Check if a node exists, and use it.
- // | var n = dojo.byId("bar");
- // | if(n){ doStuff() ... }
- //
- // example:
- // Allow string or DomNode references to be passed to a custom function:
- // | var foo = function(nodeOrId){
- // | nodeOrId = dojo.byId(nodeOrId);
- // | // ... more stuff
- // | }
-=====*/
-
-if(dojo.isIE){
- dojo.byId = function(id, doc){
- if(typeof id != "string"){
- return id;
- }
- var _d = doc || dojo.doc, te = _d.getElementById(id);
- // attributes.id.value is better than just id in case the
- // user has a name=id inside a form
- if(te && (te.attributes.id.value == id || te.id == id)){
- return te;
- }else{
- var eles = _d.all[id];
- if(!eles || eles.nodeName){
- eles = [eles];
- }
- // if more than 1, choose first with the correct id
- var i=0;
- while((te=eles[i++])){
- if((te.attributes && te.attributes.id && te.attributes.id.value == id)
- || te.id == id){
- return te;
- }
- }
- }
- };
-}else{
- dojo.byId = function(id, doc){
- // inline'd type check.
- // be sure to return null per documentation, to match IE branch.
- return ((typeof id == "string") ? (doc || dojo.doc).getElementById(id) : id) || null; // DomNode
- };
-}
-/*=====
-};
-=====*/
-
-(function(){
- var d = dojo;
- var byId = d.byId;
-
- var _destroyContainer = null,
- _destroyDoc;
- d.addOnWindowUnload(function(){
- _destroyContainer = null; //prevent IE leak
- });
-
-/*=====
- dojo._destroyElement = function(node){
- // summary:
- // Existing alias for `dojo.destroy`. Deprecated, will be removed
- // in 2.0
- }
-=====*/
- dojo._destroyElement = dojo.destroy = function(/*String|DomNode*/node){
- // summary:
- // Removes a node from its parent, clobbering it and all of its
- // children.
- //
- // description:
- // Removes a node from its parent, clobbering it and all of its
- // children. Function only works with DomNodes, and returns nothing.
- //
- // node:
- // A String ID or DomNode reference of the element to be destroyed
- //
- // example:
- // Destroy a node byId:
- // | dojo.destroy("someId");
- //
- // example:
- // Destroy all nodes in a list by reference:
- // | dojo.query(".someNode").forEach(dojo.destroy);
-
- node = byId(node);
- try{
- var doc = node.ownerDocument;
- // cannot use _destroyContainer.ownerDocument since this can throw an exception on IE
- if(!_destroyContainer || _destroyDoc != doc){
- _destroyContainer = doc.createElement("div");
- _destroyDoc = doc;
- }
- _destroyContainer.appendChild(node.parentNode ? node.parentNode.removeChild(node) : node);
- // NOTE: see http://trac.dojotoolkit.org/ticket/2931. This may be a bug and not a feature
- _destroyContainer.innerHTML = "";
- }catch(e){
- /* squelch */
+ };
+ }else{
+ dom.byId = function(id, doc){
+ // inline'd type check.
+ // be sure to return null per documentation, to match IE branch.
+ return ((typeof id == "string") ? (doc || win.doc).getElementById(id) : id) || null; // DOMNode
+ };
}
+ /*=====
};
+ =====*/
- dojo.isDescendant = function(/*DomNode|String*/node, /*DomNode|String*/ancestor){
- // summary:
- // Returns true if node is a descendant of ancestor
- // node: string id or node reference to test
- // ancestor: string id or node reference of potential parent to test against
- //
- // example:
- // Test is node id="bar" is a descendant of node id="foo"
- // | if(dojo.isDescendant("bar", "foo")){ ... }
+ dom.isDescendant = function(/*DOMNode|String*/node, /*DOMNode|String*/ancestor){
try{
- node = byId(node);
- ancestor = byId(ancestor);
+ node = dom.byId(node);
+ ancestor = dom.byId(ancestor);
while(node){
if(node == ancestor){
return true; // Boolean
@@ -5438,159 +7258,59 @@ if(dojo.isIE){
return false; // Boolean
};
- dojo.setSelectable = function(/*DomNode|String*/node, /*Boolean*/selectable){
- // summary:
- // Enable or disable selection on a node
- // node:
- // id or reference to node
- // selectable:
- // state to put the node in. false indicates unselectable, true
- // allows selection.
- // example:
- // Make the node id="bar" unselectable
- // | dojo.setSelectable("bar");
- // example:
- // Make the node id="bar" selectable
- // | dojo.setSelectable("bar", true);
- node = byId(node);
- if(d.isMozilla){
+ // TODO: do we need this function in the base?
+
+ dom.setSelectable = function(/*DOMNode|String*/node, /*Boolean*/selectable){
+ node = dom.byId(node);
+ if(has("mozilla")){
node.style.MozUserSelect = selectable ? "" : "none";
- }else if(d.isKhtml || d.isWebKit){
+ }else if(has("khtml") || has("webkit")){
node.style.KhtmlUserSelect = selectable ? "auto" : "none";
- }else if(d.isIE){
- var v = (node.unselectable = selectable ? "" : "on");
- d.query("*", node).forEach("item.unselectable = '"+v+"'");
- }
- //FIXME: else? Opera?
- };
-
- var _insertBefore = function(/*DomNode*/node, /*DomNode*/ref){
- var parent = ref.parentNode;
- if(parent){
- parent.insertBefore(node, ref);
- }
- };
-
- var _insertAfter = function(/*DomNode*/node, /*DomNode*/ref){
- // summary:
- // Try to insert node after ref
- var parent = ref.parentNode;
- if(parent){
- if(parent.lastChild == ref){
- parent.appendChild(node);
- }else{
- parent.insertBefore(node, ref.nextSibling);
- }
- }
- };
-
- dojo.place = function(node, refNode, position){
- // summary:
- // Attempt to insert node into the DOM, choosing from various positioning options.
- // Returns the first argument resolved to a DOM node.
- //
- // node: String|DomNode
- // id or node reference, or HTML fragment starting with "<" to place relative to refNode
- //
- // refNode: String|DomNode
- // id or node reference to use as basis for placement
- //
- // position: String|Number?
- // string noting the position of node relative to refNode or a
- // number indicating the location in the childNodes collection of refNode.
- // Accepted string values are:
- // | * before
- // | * after
- // | * replace
- // | * only
- // | * first
- // | * last
- // "first" and "last" indicate positions as children of refNode, "replace" replaces refNode,
- // "only" replaces all children. position defaults to "last" if not specified
- //
- // returns: DomNode
- // Returned values is the first argument resolved to a DOM node.
- //
- // .place() is also a method of `dojo.NodeList`, allowing `dojo.query` node lookups.
- //
- // example:
- // Place a node by string id as the last child of another node by string id:
- // | dojo.place("someNode", "anotherNode");
- //
- // example:
- // Place a node by string id before another node by string id
- // | dojo.place("someNode", "anotherNode", "before");
- //
- // example:
- // Create a Node, and place it in the body element (last child):
- // | dojo.place("<div></div>", dojo.body());
- //
- // example:
- // Put a new LI as the first child of a list by id:
- // | dojo.place("<li></li>", "someUl", "first");
-
- refNode = byId(refNode);
- if(typeof node == "string"){ // inline'd type check
- node = /^\s*</.test(node) ? d._toDom(node, refNode.ownerDocument) : byId(node);
- }
- if(typeof position == "number"){ // inline'd type check
- var cn = refNode.childNodes;
- if(!cn.length || cn.length <= position){
- refNode.appendChild(node);
- }else{
- _insertBefore(node, cn[position < 0 ? 0 : position]);
- }
- }else{
- switch(position){
- case "before":
- _insertBefore(node, refNode);
- break;
- case "after":
- _insertAfter(node, refNode);
- break;
- case "replace":
- refNode.parentNode.replaceChild(node, refNode);
- break;
- case "only":
- d.empty(refNode);
- refNode.appendChild(node);
- break;
- case "first":
- if(refNode.firstChild){
- _insertBefore(node, refNode.firstChild);
- break;
- }
- // else fallthrough...
- default: // aka: last
- refNode.appendChild(node);
+ }else if(has("ie")){
+ var v = (node.unselectable = selectable ? "" : "on"),
+ cs = node.getElementsByTagName("*"), i = 0, l = cs.length;
+ for(; i < l; ++i){
+ cs.item(i).unselectable = v;
}
}
- return node; // DomNode
+ //FIXME: else? Opera?
};
- // Box functions will assume this model.
- // On IE/Opera, BORDER_BOX will be set if the primary document is in quirks mode.
- // Can be set to change behavior of box setters.
-
- // can be either:
- // "border-box"
- // "content-box" (default)
- dojo.boxModel = "content-box";
+ return dom;
+});
- // We punt per-node box mode testing completely.
- // If anybody cares, we can provide an additional (optional) unit
- // that overrides existing code to include per-node box sensitivity.
-
- // Opera documentation claims that Opera 9 uses border-box in BackCompat mode.
- // but experiments (Opera 9.10.8679 on Windows Vista) indicate that it actually continues to use content-box.
- // IIRC, earlier versions of Opera did in fact use border-box.
- // Opera guys, this is really confusing. Opera being broken in quirks mode is not our fault.
+},
+'dojo/_base/browser':function(){
+if(require.has){
+ require.has.add("config-selectorEngine", "acme");
+}
+define("dojo/_base/browser", [
+ "../ready",
+ "./kernel",
+ "./connect", // until we decide if connect is going back into non-browser environments
+ "./unload",
+ "./window",
+ "./event",
+ "./html",
+ "./NodeList",
+ "../query",
+ "./xhr",
+ "./fx"], function(dojo) {
+ // module:
+ // dojo/_base/browser
+ // summary:
+ // This module causes the browser-only base modules to be loaded.
+ return dojo;
+});
+
+},
+'dojo/dom-style':function(){
+define(["./_base/sniff", "./dom"], function(has, dom){
+ // module:
+ // dojo/dom-style
+ // summary:
+ // This module defines the core dojo DOM style API.
- if(d.isIE /*|| dojo.isOpera*/){
- // client code may have to adjust if compatMode varies across iframes
- d.boxModel = document.compatMode == "BackCompat" ? "border-box" : "content-box";
- }
-
// =============================
// Style Functions
// =============================
@@ -5604,12 +7324,12 @@ if(dojo.isIE){
// This way, calling code can access computedStyle once, and then pass the reference to
// multiple API functions.
-/*=====
+ /*=====
dojo.getComputedStyle = function(node){
- // summary:
+ // summary:
// Returns a "computed style" object.
//
- // description:
+ // description:
// Gets a "computed style" object which can be used to gather
// information about the current state of the rendered node.
//
@@ -5623,28 +7343,121 @@ if(dojo.isIE){
// Use the dojo.style() method for more consistent (pixelized)
// return values.
//
- // node: DOMNode
+ // node: DOMNode
// A reference to a DOM node. Does NOT support taking an
// ID string for speed reasons.
- // example:
+ // example:
// | dojo.getComputedStyle(dojo.byId('foo')).borderWidth;
//
- // example:
- // Reusing the returned object, avoiding multiple lookups:
+ // example:
+ // Reusing the returned object, avoiding multiple lookups:
// | var cs = dojo.getComputedStyle(dojo.byId("someNode"));
// | var w = cs.width, h = cs.height;
return; // CSS2Properties
}
-=====*/
+ =====*/
+
+ /*=====
+ dojo.toPixelValue = function(node, value){
+ // summary:
+ // converts style value to pixels on IE or return a numeric value.
+ // node: DOMNode
+ // value: String
+ // returns: Number
+ };
+ =====*/
+
+ /*=====
+ dojo._toPixelValue = function(node, value){
+ // summary:
+ // Existing alias for `dojo._toPixelValue`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getStyle = function(node, name){
+ // summary:
+ // Accesses styles on a node.
+ // description:
+ // Getting the style value uses the computed style for the node, so the value
+ // will be a calculated value, not just the immediate node.style value.
+ // Also when getting values, use specific style names,
+ // like "borderBottomWidth" instead of "border" since compound values like
+ // "border" are not necessarily reflected as expected.
+ // If you want to get node dimensions, use `dojo.marginBox()`,
+ // `dojo.contentBox()` or `dojo.position()`.
+ // node: DOMNode|String
+ // id or reference to node to get style for
+ // name: String?
+ // the style property to get
+ // example:
+ // Passing only an ID or node returns the computed style object of
+ // the node:
+ // | dojo.getStyle("thinger");
+ // example:
+ // Passing a node and a style property returns the current
+ // normalized, computed value for that property:
+ // | dojo.getStyle("thinger", "opacity"); // 1 by default
+ };
+ =====*/
+
+ /*=====
+ dojo.setStyle = function(node, name, value){
+ // summary:
+ // Sets styles on a node.
+ // node: DOMNode|String
+ // id or reference to node to set style for
+ // name: String|Object
+ // the style property to set in DOM-accessor format
+ // ("borderWidth", not "border-width") or an object with key/value
+ // pairs suitable for setting each property.
+ // value: String?
+ // If passed, sets value on the node for style, handling
+ // cross-browser concerns. When setting a pixel value,
+ // be sure to include "px" in the value. For instance, top: "200px".
+ // Otherwise, in some cases, some browsers will not apply the style.
+ //
+ // example:
+ // Passing a node, a style property, and a value changes the
+ // current display of the node and returns the new computed value
+ // | dojo.setStyle("thinger", "opacity", 0.5); // == 0.5
+ //
+ // example:
+ // Passing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node:
+ // | dojo.setStyle("thinger", {
+ // | "opacity": 0.5,
+ // | "border": "3px solid black",
+ // | "height": "300px"
+ // | });
+ //
+ // example:
+ // When the CSS style property is hyphenated, the JavaScript property is camelCased.
+ // font-size becomes fontSize, and so on.
+ // | dojo.setStyle("thinger",{
+ // | fontSize:"14pt",
+ // | letterSpacing:"1.2em"
+ // | });
+ //
+ // example:
+ // dojo.NodeList implements .style() using the same syntax, omitting the "node" parameter, calling
+ // dojo.style() on every element of the list. See: `dojo.query()` and `dojo.NodeList()`
+ // | dojo.query(".someClassName").style("visibility","hidden");
+ // | // or
+ // | dojo.query("#baz > div").style({
+ // | opacity:0.75,
+ // | fontSize:"13pt"
+ // | });
+ };
+ =====*/
// Although we normally eschew argument validation at this
// level, here we test argument 'node' for (duck)type,
// by testing nodeType, ecause 'document' is the 'parentNode' of 'body'
// it is frequently sent to this function even
// though it is not Element.
- var gcs;
- if(d.isWebKit){
- gcs = function(/*DomNode*/node){
+ var getComputedStyle, style = {};
+ if(has("webkit")){
+ getComputedStyle = function(/*DomNode*/node){
var s;
if(node.nodeType == 1){
var dv = node.ownerDocument.defaultView;
@@ -5656,68 +7469,55 @@ if(dojo.isIE){
}
return s || {};
};
- }else if(d.isIE){
- gcs = function(node){
+ }else if(has("ie") && (has("ie") < 9 || has("quirks"))){
+ getComputedStyle = function(node){
// IE (as of 7) doesn't expose Element like sane browsers
return node.nodeType == 1 /* ELEMENT_NODE*/ ? node.currentStyle : {};
};
}else{
- gcs = function(node){
+ getComputedStyle = function(node){
return node.nodeType == 1 ?
node.ownerDocument.defaultView.getComputedStyle(node, null) : {};
};
}
- dojo.getComputedStyle = gcs;
+ style.getComputedStyle = getComputedStyle;
- if(!d.isIE){
- d._toPixelValue = function(element, value){
+ var toPixel;
+ if(!has("ie")){
+ toPixel = function(element, value){
// style values can be floats, client code may want
// to round for integer pixels.
return parseFloat(value) || 0;
};
}else{
- d._toPixelValue = function(element, avalue){
+ toPixel = function(element, avalue){
if(!avalue){ return 0; }
// on IE7, medium is usually 4 pixels
if(avalue == "medium"){ return 4; }
// style values can be floats, client code may
// want to round this value for integer pixels.
if(avalue.slice && avalue.slice(-2) == 'px'){ return parseFloat(avalue); }
- with(element){
- var sLeft = style.left;
- var rsLeft = runtimeStyle.left;
- runtimeStyle.left = currentStyle.left;
- try{
- // 'avalue' may be incompatible with style.left, which can cause IE to throw
- // this has been observed for border widths using "thin", "medium", "thick" constants
- // those particular constants could be trapped by a lookup
- // but perhaps there are more
- style.left = avalue;
- avalue = style.pixelLeft;
- }catch(e){
- avalue = 0;
- }
- style.left = sLeft;
- runtimeStyle.left = rsLeft;
+ var s = element.style, rs = element.runtimeStyle, cs = element.currentStyle,
+ sLeft = s.left, rsLeft = rs.left;
+ rs.left = cs.left;
+ try{
+ // 'avalue' may be incompatible with style.left, which can cause IE to throw
+ // this has been observed for border widths using "thin", "medium", "thick" constants
+ // those particular constants could be trapped by a lookup
+ // but perhaps there are more
+ s.left = avalue;
+ avalue = s.pixelLeft;
+ }catch(e){
+ avalue = 0;
}
+ s.left = sLeft;
+ rs.left = rsLeft;
return avalue;
- };
+ }
}
- var px = d._toPixelValue;
+ style.toPixelValue = toPixel;
// FIXME: there opacity quirks on FF that we haven't ported over. Hrm.
- /*=====
- dojo._getOpacity = function(node){
- // summary:
- // Returns the current opacity of the passed node as a
- // floating-point value between 0 and 1.
- // node: DomNode
- // a reference to a DOM node. Does NOT support taking an
- // ID string for speed reasons.
- // returns: Number between 0 and 1
- return; // Number
- }
- =====*/
var astr = "DXImageTransform.Microsoft.Alpha";
var af = function(n, f){
@@ -5728,8 +7528,8 @@ if(dojo.isIE){
}
};
- dojo._getOpacity =
- d.isIE < 9 ? function(node){
+ var _getOpacity =
+ has("ie") < 9 || (has("ie") && has("quirks")) ? function(node){
try{
return af(node).Opacity / 100; // Number
}catch(e){
@@ -5737,26 +7537,11 @@ if(dojo.isIE){
}
} :
function(node){
- return gcs(node).opacity;
+ return getComputedStyle(node).opacity;
};
- /*=====
- dojo._setOpacity = function(node, opacity){
- // summary:
- // set the opacity of the passed node portably. Returns the
- // new opacity of the node.
- // node: DOMNode
- // a reference to a DOM node. Does NOT support taking an
- // ID string for performance reasons.
- // opacity: Number
- // A Number between 0 and 1. 0 specifies transparent.
- // returns: Number between 0 and 1
- return; // Number
- }
- =====*/
-
- dojo._setOpacity =
- d.isIE < 9 ? function(/*DomNode*/node, /*Number*/opacity){
+ var _setOpacity =
+ has("ie") < 9 || (has("ie") && has("quirks")) ? function(/*DomNode*/node, /*Number*/opacity){
var ov = opacity * 100, opaque = opacity == 1;
node.style.zoom = opaque ? "" : 1;
@@ -5773,10 +7558,12 @@ if(dojo.isIE){
//but still update the opacity value so we can get a correct reading if it is read later.
af(node, 1).Enabled = !opaque;
- if(node.nodeName.toLowerCase() == "tr"){
- d.query("> td", node).forEach(function(i){
- d._setOpacity(i, opacity);
- });
+ if(node.tagName.toLowerCase() == "tr"){
+ for(var td = node.firstChild; td; td = td.nextSibling){
+ if(td.tagName.toLowerCase() == "td"){
+ _setOpacity(td, opacity);
+ }
+ }
}
return opacity;
} :
@@ -5787,10 +7574,11 @@ if(dojo.isIE){
var _pixelNamesCache = {
left: true, top: true
};
- var _pixelRegExp = /margin|padding|width|height|max|min|offset/; // |border
- var _toStyleValue = function(node, type, value){
- type = type.toLowerCase(); // FIXME: should we really be doing string case conversion here? Should we cache it? Need to profile!
- if(d.isIE){
+ var _pixelRegExp = /margin|padding|width|height|max|min|offset/; // |border
+ function _toStyleValue(node, type, value){
+ //TODO: should we really be doing string case conversion here? Should we cache it? Need to profile!
+ type = type.toLowerCase();
+ if(has("ie")){
if(value == "auto"){
if(type == "height"){ return node.offsetHeight; }
if(type == "width"){ return node.offsetWidth; }
@@ -5806,179 +7594,180 @@ if(dojo.isIE){
if(!(type in _pixelNamesCache)){
_pixelNamesCache[type] = _pixelRegExp.test(type);
}
- return _pixelNamesCache[type] ? px(node, value) : value;
- };
+ return _pixelNamesCache[type] ? toPixel(node, value) : value;
+ }
- var _floatStyle = d.isIE ? "styleFloat" : "cssFloat",
- _floatAliases = { "cssFloat": _floatStyle, "styleFloat": _floatStyle, "float": _floatStyle }
- ;
+ var _floatStyle = has("ie") ? "styleFloat" : "cssFloat",
+ _floatAliases = {"cssFloat": _floatStyle, "styleFloat": _floatStyle, "float": _floatStyle};
// public API
- dojo.style = function( /*DomNode|String*/ node,
- /*String?|Object?*/ style,
- /*String?*/ value){
- // summary:
- // Accesses styles on a node. If 2 arguments are
- // passed, acts as a getter. If 3 arguments are passed, acts
- // as a setter.
- // description:
- // Getting the style value uses the computed style for the node, so the value
- // will be a calculated value, not just the immediate node.style value.
- // Also when getting values, use specific style names,
- // like "borderBottomWidth" instead of "border" since compound values like
- // "border" are not necessarily reflected as expected.
- // If you want to get node dimensions, use `dojo.marginBox()`,
- // `dojo.contentBox()` or `dojo.position()`.
- // node:
- // id or reference to node to get/set style for
- // style:
- // the style property to set in DOM-accessor format
- // ("borderWidth", not "border-width") or an object with key/value
- // pairs suitable for setting each property.
- // value:
- // If passed, sets value on the node for style, handling
- // cross-browser concerns. When setting a pixel value,
- // be sure to include "px" in the value. For instance, top: "200px".
- // Otherwise, in some cases, some browsers will not apply the style.
- // example:
- // Passing only an ID or node returns the computed style object of
- // the node:
- // | dojo.style("thinger");
- // example:
- // Passing a node and a style property returns the current
- // normalized, computed value for that property:
- // | dojo.style("thinger", "opacity"); // 1 by default
- //
- // example:
- // Passing a node, a style property, and a value changes the
- // current display of the node and returns the new computed value
- // | dojo.style("thinger", "opacity", 0.5); // == 0.5
- //
- // example:
- // Passing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node:
- // | dojo.style("thinger", {
- // | "opacity": 0.5,
- // | "border": "3px solid black",
- // | "height": "300px"
- // | });
- //
- // example:
- // When the CSS style property is hyphenated, the JavaScript property is camelCased.
- // font-size becomes fontSize, and so on.
- // | dojo.style("thinger",{
- // | fontSize:"14pt",
- // | letterSpacing:"1.2em"
- // | });
- //
- // example:
- // dojo.NodeList implements .style() using the same syntax, omitting the "node" parameter, calling
- // dojo.style() on every element of the list. See: `dojo.query()` and `dojo.NodeList()`
- // | dojo.query(".someClassName").style("visibility","hidden");
- // | // or
- // | dojo.query("#baz > div").style({
- // | opacity:0.75,
- // | fontSize:"13pt"
- // | });
-
- var n = byId(node), args = arguments.length, op = (style == "opacity");
- style = _floatAliases[style] || style;
- if(args == 3){
- return op ? d._setOpacity(n, value) : n.style[style] = value; /*Number*/
+ style.get = function getStyle(/*DOMNode|String*/ node, /*String?*/ name){
+ var n = dom.byId(node), l = arguments.length, op = (name == "opacity");
+ if(l == 2 && op){
+ return _getOpacity(n);
}
- if(args == 2 && op){
- return d._getOpacity(n);
+ name = _floatAliases[name] || name;
+ var s = style.getComputedStyle(n);
+ return (l == 1) ? s : _toStyleValue(n, name, s[name] || n.style[name]); /* CSS2Properties||String||Number */
+ };
+
+ style.set = function setStyle(/*DOMNode|String*/ node, /*String|Object*/ name, /*String?*/ value){
+ var n = dom.byId(node), l = arguments.length, op = (name == "opacity");
+ name = _floatAliases[name] || name;
+ if(l == 3){
+ return op ? _setOpacity(n, value) : n.style[name] = value; // Number
}
- var s = gcs(n);
- if(args == 2 && typeof style != "string"){ // inline'd type check
- for(var x in style){
- d.style(node, x, style[x]);
- }
- return s;
+ for(var x in name){
+ style.set(node, x, name[x]);
}
- return (args == 1) ? s : _toStyleValue(n, style, s[style] || n.style[style]); /* CSS2Properties||String||Number */
+ return style.getComputedStyle(n);
};
+ return style;
+});
+
+},
+'dojo/dom-geometry':function(){
+define(["./_base/sniff", "./_base/window","./dom", "./dom-style"],
+ function(has, win, dom, style){
+ // module:
+ // dojo/dom-geometry
+ // summary:
+ // This module defines the core dojo DOM geometry API.
+
+ var geom = {}; // the result object
+
+ // Box functions will assume this model.
+ // On IE/Opera, BORDER_BOX will be set if the primary document is in quirks mode.
+ // Can be set to change behavior of box setters.
+
+ // can be either:
+ // "border-box"
+ // "content-box" (default)
+ geom.boxModel = "content-box";
+
+ // We punt per-node box mode testing completely.
+ // If anybody cares, we can provide an additional (optional) unit
+ // that overrides existing code to include per-node box sensitivity.
+
+ // Opera documentation claims that Opera 9 uses border-box in BackCompat mode.
+ // but experiments (Opera 9.10.8679 on Windows Vista) indicate that it actually continues to use content-box.
+ // IIRC, earlier versions of Opera did in fact use border-box.
+ // Opera guys, this is really confusing. Opera being broken in quirks mode is not our fault.
+
+ if(has("ie") /*|| has("opera")*/){
+ // client code may have to adjust if compatMode varies across iframes
+ geom.boxModel = document.compatMode == "BackCompat" ? "border-box" : "content-box";
+ }
+
// =============================
// Box Functions
// =============================
- dojo._getPadExtents = function(/*DomNode*/n, /*Object*/computedStyle){
- // summary:
- // Returns object with special values specifically useful for node
- // fitting.
- // description:
+ /*=====
+ dojo.getPadExtents = function(node, computedStyle){
+ // summary:
+ // Returns object with special values specifically useful for node
+ // fitting.
+ // description:
// Returns an object with `w`, `h`, `l`, `t` properties:
- // | l/t = left/top padding (respectively)
+ // | l/t/r/b = left/top/right/bottom padding (respectively)
// | w = the total of the left and right padding
// | h = the total of the top and bottom padding
// If 'node' has position, l/t forms the origin for child nodes.
// The w/h are used for calculating boxes.
// Normally application code will not need to invoke this
// directly, and will use the ...box... functions instead.
- var
- s = computedStyle||gcs(n),
- l = px(n, s.paddingLeft),
- t = px(n, s.paddingTop);
- return {
- l: l,
- t: t,
- w: l+px(n, s.paddingRight),
- h: t+px(n, s.paddingBottom)
- };
+ // node: DOMNode
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+
+
};
+ =====*/
- dojo._getBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){
- // summary:
+ /*=====
+ dojo._getPadExtents = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getPadExtents`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getBorderExtents = function(node, computedStyle){
+ // summary:
// returns an object with properties useful for noting the border
// dimensions.
- // description:
- // * l/t = the sum of left/top border (respectively)
+ // description:
+ // * l/t/r/b = the sum of left/top/right/bottom border (respectively)
// * w = the sum of the left and right border
// * h = the sum of the top and bottom border
//
// The w/h are used for calculating boxes.
// Normally application code will not need to invoke this
// directly, and will use the ...box... functions instead.
- var
- ne = "none",
- s = computedStyle||gcs(n),
- bl = (s.borderLeftStyle != ne ? px(n, s.borderLeftWidth) : 0),
- bt = (s.borderTopStyle != ne ? px(n, s.borderTopWidth) : 0);
- return {
- l: bl,
- t: bt,
- w: bl + (s.borderRightStyle!=ne ? px(n, s.borderRightWidth) : 0),
- h: bt + (s.borderBottomStyle!=ne ? px(n, s.borderBottomWidth) : 0)
- };
+ // node: DOMNode
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+
+
};
+ =====*/
- dojo._getPadBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){
- // summary:
+ /*=====
+ dojo._getBorderExtents = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getBorderExtents`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getPadBorderExtents = function(node, computedStyle){
+ // summary:
// Returns object with properties useful for box fitting with
// regards to padding.
// description:
- // * l/t = the sum of left/top padding and left/top border (respectively)
+ // * l/t/r/b = the sum of left/top/right/bottom padding and left/top/right/bottom border (respectively)
// * w = the sum of the left and right padding and border
// * h = the sum of the top and bottom padding and border
//
// The w/h are used for calculating boxes.
// Normally application code will not need to invoke this
// directly, and will use the ...box... functions instead.
- var
- s = computedStyle||gcs(n),
- p = d._getPadExtents(n, s),
- b = d._getBorderExtents(n, s);
- return {
- l: p.l + b.l,
- t: p.t + b.t,
- w: p.w + b.w,
- h: p.h + b.h
- };
+ // node: DOMNode
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+
+
};
+ =====*/
- dojo._getMarginExtents = function(n, computedStyle){
- // summary:
+ /*=====
+ dojo._getPadBorderExtents = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getPadBorderExtents`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getMarginExtents = function(node, computedStyle){
+ // summary:
// returns object with properties useful for box fitting with
// regards to box margins (i.e., the outer-box).
//
@@ -5989,13 +7778,270 @@ if(dojo.isIE){
// The w/h are used for calculating boxes.
// Normally application code will not need to invoke this
// directly, and will use the ...box... functions instead.
- var
- s = computedStyle||gcs(n),
- l = px(n, s.marginLeft),
- t = px(n, s.marginTop),
- r = px(n, s.marginRight),
- b = px(n, s.marginBottom);
- if(d.isWebKit && (s.position != "absolute")){
+ // node: DOMNode
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+ };
+ =====*/
+
+ /*=====
+ dojo._getMarginExtents = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getMarginExtents`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getMarginSize = function(node, computedStyle){
+ // summary:
+ // returns an object that encodes the width and height of
+ // the node's margin box
+ // node: DOMNode|String
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+ };
+ =====*/
+
+ /*=====
+ dojo._getMarginSize = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getMarginSize`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getMarginBox = function(node, computedStyle){
+ // summary:
+ // returns an object that encodes the width, height, left and top
+ // positions of the node's margin box.
+ // node: DOMNode
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+ };
+ =====*/
+
+ /*=====
+ dojo._getMarginBox = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getMarginBox`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.setMarginBox = function(node, box, computedStyle){
+ // summary:
+ // sets the size of the node's margin box and placement
+ // (left/top), irrespective of box model. Think of it as a
+ // passthrough to setBox that handles box-model vagaries for
+ // you.
+ // node: DOMNode
+ // box: Object
+ // hash with optional "l", "t", "w", and "h" properties for "left", "right", "width", and "height"
+ // respectively. All specified properties should have numeric values in whole pixels.
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+ };
+ =====*/
+
+ /*=====
+ dojo.getContentBox = function(node, computedStyle){
+ // summary:
+ // Returns an object that encodes the width, height, left and top
+ // positions of the node's content box, irrespective of the
+ // current box model.
+ // node: DOMNode
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+ };
+ =====*/
+
+ /*=====
+ dojo._getContentBox = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getContentBox`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.setContentSize = function(node, box, computedStyle){
+ // summary:
+ // Sets the size of the node's contents, irrespective of margins,
+ // padding, or borders.
+ // node: DOMNode
+ // box: Object
+ // hash with optional "w", and "h" properties for "width", and "height"
+ // respectively. All specified properties should have numeric values in whole pixels.
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+ };
+ =====*/
+
+ /*=====
+ dojo.isBodyLtr = function(){
+ // summary:
+ // Returns true if the current language is left-to-right, and false otherwise.
+ // returns: Boolean
+ };
+ =====*/
+
+ /*=====
+ dojo._isBodyLtr = function(){
+ // summary:
+ // Existing alias for `dojo.isBodyLtr`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.docScroll = function(){
+ // summary:
+ // Returns an object with {node, x, y} with corresponding offsets.
+ // returns: Object
+ };
+ =====*/
+
+ /*=====
+ dojo._docScroll = function(){
+ // summary:
+ // Existing alias for `dojo.docScroll`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getIeDocumentElementOffset = function(){
+ // summary:
+ // returns the offset in x and y from the document body to the
+ // visual edge of the page for IE
+ // description:
+ // The following values in IE contain an offset:
+ // | event.clientX
+ // | event.clientY
+ // | node.getBoundingClientRect().left
+ // | node.getBoundingClientRect().top
+ // But other position related values do not contain this offset,
+ // such as node.offsetLeft, node.offsetTop, node.style.left and
+ // node.style.top. The offset is always (2, 2) in LTR direction.
+ // When the body is in RTL direction, the offset counts the width
+ // of left scroll bar's width. This function computes the actual
+ // offset.
+ };
+ =====*/
+
+ /*=====
+ dojo._getIeDocumentElementOffset = function(){
+ // summary:
+ // Existing alias for `dojo.getIeDocumentElementOffset`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.fixIeBiDiScrollLeft = function(scrollLeft){
+ // summary:
+ // In RTL direction, scrollLeft should be a negative value, but IE
+ // returns a positive one. All codes using documentElement.scrollLeft
+ // must call this function to fix this error, otherwise the position
+ // will offset to right when there is a horizontal scrollbar.
+ // scrollLeft: NUmber
+ // returns: Number
+ };
+ =====*/
+
+ /*=====
+ dojo._fixIeBiDiScrollLeft = function(scrollLeft){
+ // summary:
+ // Existing alias for `dojo.fixIeBiDiScrollLeft`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.position = function(node, includeScroll){
+ // summary:
+ // Gets the position and size of the passed element relative to
+ // the viewport (if includeScroll==false), or relative to the
+ // document root (if includeScroll==true).
+ //
+ // description:
+ // Returns an object of the form:
+ // { x: 100, y: 300, w: 20, h: 15 }
+ // If includeScroll==true, the x and y values will include any
+ // document offsets that may affect the position relative to the
+ // viewport.
+ // Uses the border-box model (inclusive of border and padding but
+ // not margin). Does not act as a setter.
+ // node: DOMNode|String
+ // includeScroll: Boolean?
+ // returns: Object
+ };
+ =====*/
+
+ geom.getPadExtents = function getPadExtents(/*DomNode*/node, /*Object*/computedStyle){
+ node = dom.byId(node);
+ var s = computedStyle || style.getComputedStyle(node), px = style.toPixelValue,
+ l = px(node, s.paddingLeft), t = px(node, s.paddingTop), r = px(node, s.paddingRight), b = px(node, s.paddingBottom);
+ return {l: l, t: t, r: r, b: b, w: l + r, h: t + b};
+ };
+
+ var none = "none";
+
+ geom.getBorderExtents = function getBorderExtents(/*DomNode*/node, /*Object*/computedStyle){
+ node = dom.byId(node);
+ var px = style.toPixelValue, s = computedStyle || style.getComputedStyle(node),
+ l = s.borderLeftStyle != none ? px(node, s.borderLeftWidth) : 0,
+ t = s.borderTopStyle != none ? px(node, s.borderTopWidth) : 0,
+ r = s.borderRightStyle != none ? px(node, s.borderRightWidth) : 0,
+ b = s.borderBottomStyle != none ? px(node, s.borderBottomWidth) : 0;
+ return {l: l, t: t, r: r, b: b, w: l + r, h: t + b};
+ };
+
+ geom.getPadBorderExtents = function getPadBorderExtents(/*DomNode*/node, /*Object*/computedStyle){
+ node = dom.byId(node);
+ var s = computedStyle || style.getComputedStyle(node),
+ p = geom.getPadExtents(node, s),
+ b = geom.getBorderExtents(node, s);
+ return {
+ l: p.l + b.l,
+ t: p.t + b.t,
+ r: p.r + b.r,
+ b: p.b + b.b,
+ w: p.w + b.w,
+ h: p.h + b.h
+ };
+ };
+
+ geom.getMarginExtents = function getMarginExtents(node, computedStyle){
+ node = dom.byId(node);
+ var s = computedStyle || style.getComputedStyle(node), px = style.toPixelValue,
+ l = px(node, s.marginLeft), t = px(node, s.marginTop), r = px(node, s.marginRight), b = px(node, s.marginBottom);
+ if(has("webkit") && (s.position != "absolute")){
// FIXME: Safari's version of the computed right margin
// is the space between our right edge and the right edge
// of our offsetParent.
@@ -6004,12 +8050,7 @@ if(dojo.isIE){
// Hack solution is to assume left/right margins are the same.
r = l;
}
- return {
- l: l,
- t: t,
- w: l+r,
- h: t+b
- };
+ return {l: l, t: t, r: r, b: b, w: l + r, h: t + b};
};
// Box getters work in any box context because offsetWidth/clientWidth
@@ -6027,13 +8068,14 @@ if(dojo.isIE){
// 2. factoring the shared code wastes cycles (function call overhead)
// 3. duplicating the shared code wastes bytes
- dojo._getMarginBox = function(/*DomNode*/node, /*Object*/computedStyle){
+ geom.getMarginBox = function getMarginBox(/*DomNode*/node, /*Object*/computedStyle){
// summary:
// returns an object that encodes the width, height, left and top
// positions of the node's margin box.
- var s = computedStyle || gcs(node), me = d._getMarginExtents(node, s);
- var l = node.offsetLeft - me.l, t = node.offsetTop - me.t, p = node.parentNode;
- if(d.isMoz){
+ node = dom.byId(node);
+ var s = computedStyle || style.getComputedStyle(node), me = geom.getMarginExtents(node, s),
+ l = node.offsetLeft - me.l, t = node.offsetTop - me.t, p = node.parentNode, px = style.toPixelValue, pcs;
+ if(has("mozilla")){
// Mozilla:
// If offsetParent has a computed overflow != visible, the offsetLeft is decreased
// by the parent's border.
@@ -6046,83 +8088,43 @@ if(dojo.isIE){
// If child's computed left/top are not parseable as a number (e.g. "auto"), we
// have no choice but to examine the parent's computed style.
if(p && p.style){
- var pcs = gcs(p);
+ pcs = style.getComputedStyle(p);
if(pcs.overflow != "visible"){
- var be = d._getBorderExtents(p, pcs);
- l += be.l, t += be.t;
+ l += pcs.borderLeftStyle != none ? px(node, pcs.borderLeftWidth) : 0;
+ t += pcs.borderTopStyle != none ? px(node, pcs.borderTopWidth) : 0;
}
}
}
- }else if(d.isOpera || (d.isIE > 7 && !d.isQuirks)){
+ }else if(has("opera") || (has("ie") == 8 && !has("quirks"))){
// On Opera and IE 8, offsetLeft/Top includes the parent's border
if(p){
- be = d._getBorderExtents(p);
- l -= be.l;
- t -= be.t;
+ pcs = style.getComputedStyle(p);
+ l -= pcs.borderLeftStyle != none ? px(node, pcs.borderLeftWidth) : 0;
+ t -= pcs.borderTopStyle != none ? px(node, pcs.borderTopWidth) : 0;
}
}
- return {
- l: l,
- t: t,
- w: node.offsetWidth + me.w,
- h: node.offsetHeight + me.h
- };
- }
-
- dojo._getMarginSize = function(/*DomNode*/node, /*Object*/computedStyle){
- // summary:
- // returns an object that encodes the width and height of
- // the node's margin box
- node = byId(node);
- var me = d._getMarginExtents(node, computedStyle || gcs(node));
-
- var size = node.getBoundingClientRect();
- return {
- w: (size.right - size.left) + me.w,
- h: (size.bottom - size.top) + me.h
- }
- }
-
- dojo._getContentBox = function(node, computedStyle){
- // summary:
- // Returns an object that encodes the width, height, left and top
- // positions of the node's content box, irrespective of the
- // current box model.
+ return {l: l, t: t, w: node.offsetWidth + me.w, h: node.offsetHeight + me.h};
+ };
+ geom.getContentBox = function getContentBox(node, computedStyle){
// clientWidth/Height are important since the automatically account for scrollbars
// fallback to offsetWidth/Height for special cases (see #3378)
- var s = computedStyle || gcs(node),
- pe = d._getPadExtents(node, s),
- be = d._getBorderExtents(node, s),
- w = node.clientWidth,
- h
- ;
+ node = dom.byId(node);
+ var s = computedStyle || style.getComputedStyle(node), w = node.clientWidth, h,
+ pe = geom.getPadExtents(node, s), be = geom.getBorderExtents(node, s);
if(!w){
- w = node.offsetWidth, h = node.offsetHeight;
+ w = node.offsetWidth;
+ h = node.offsetHeight;
}else{
- h = node.clientHeight, be.w = be.h = 0;
+ h = node.clientHeight;
+ be.w = be.h = 0;
}
// On Opera, offsetLeft includes the parent's border
- if(d.isOpera){ pe.l += be.l; pe.t += be.t; };
- return {
- l: pe.l,
- t: pe.t,
- w: w - pe.w - be.w,
- h: h - pe.h - be.h
- };
- };
-
- dojo._getBorderBox = function(node, computedStyle){
- var s = computedStyle || gcs(node),
- pe = d._getPadExtents(node, s),
- cb = d._getContentBox(node, s)
- ;
- return {
- l: cb.l - pe.l,
- t: cb.t - pe.t,
- w: cb.w + pe.w,
- h: cb.h + pe.h
- };
+ if(has("opera")){
+ pe.l += be.l;
+ pe.t += be.t;
+ }
+ return {l: pe.l, t: pe.t, w: w - pe.w - be.w, h: h - pe.h - be.h};
};
// Box setters depend on box context because interpretation of width/height styles
@@ -6142,40 +8144,48 @@ if(dojo.isIE){
// In particular, margins on TABLE do not seems to appear
// at all in computedStyle on Mozilla.
- dojo._setBox = function(/*DomNode*/node, /*Number?*/l, /*Number?*/t, /*Number?*/w, /*Number?*/h, /*String?*/u){
- // summary:
+ function setBox(/*DomNode*/node, /*Number?*/l, /*Number?*/t, /*Number?*/w, /*Number?*/h, /*String?*/u){
+ // summary:
// sets width/height/left/top in the current (native) box-model
- // dimentions. Uses the unit passed in u.
- // node:
+ // dimensions. Uses the unit passed in u.
+ // node:
// DOM Node reference. Id string not supported for performance
// reasons.
- // l:
+ // l:
// left offset from parent.
- // t:
+ // t:
// top offset from parent.
- // w:
+ // w:
// width in current box model.
- // h:
+ // h:
// width in current box model.
- // u:
+ // u:
// unit measure to use for other measures. Defaults to "px".
u = u || "px";
var s = node.style;
- if(!isNaN(l)){ s.left = l + u; }
- if(!isNaN(t)){ s.top = t + u; }
- if(w >= 0){ s.width = w + u; }
- if(h >= 0){ s.height = h + u; }
- };
+ if(!isNaN(l)){
+ s.left = l + u;
+ }
+ if(!isNaN(t)){
+ s.top = t + u;
+ }
+ if(w >= 0){
+ s.width = w + u;
+ }
+ if(h >= 0){
+ s.height = h + u;
+ }
+ }
- dojo._isButtonTag = function(/*DomNode*/node) {
+ function isButtonTag(/*DomNode*/node){
// summary:
// True if the node is BUTTON or INPUT.type="button".
- return node.tagName == "BUTTON"
- || node.tagName=="INPUT" && (node.getAttribute("type")||'').toUpperCase() == "BUTTON"; // boolean
- };
+ return node.tagName.toLowerCase() == "button" ||
+ node.tagName.toLowerCase() == "input" && (node.getAttribute("type") || "").toLowerCase() == "button"; // boolean
+ }
- dojo._usesBorderBox = function(/*DomNode*/node){
- // summary:
+ function usesBorderBox(/*DomNode*/node){
+ // summary:
// True if the node uses border-box layout.
// We could test the computed style of node to see if a particular box
@@ -6185,182 +8195,91 @@ if(dojo.isIE){
// If you have assigned a different box to either one via CSS then
// box functions will break.
- var n = node.tagName;
- return d.boxModel=="border-box" || n=="TABLE" || d._isButtonTag(node); // boolean
- };
+ return geom.boxModel == "border-box" || node.tagName.toLowerCase() == "table" || isButtonTag(node); // boolean
+ }
- dojo._setContentSize = function(/*DomNode*/node, /*Number*/widthPx, /*Number*/heightPx, /*Object*/computedStyle){
- // summary:
+ geom.setContentSize = function setContentSize(/*DomNode*/node, /*Object*/box, /*Object*/computedStyle){
+ // summary:
// Sets the size of the node's contents, irrespective of margins,
// padding, or borders.
- if(d._usesBorderBox(node)){
- var pb = d._getPadBorderExtents(node, computedStyle);
- if(widthPx >= 0){ widthPx += pb.w; }
- if(heightPx >= 0){ heightPx += pb.h; }
+
+ node = dom.byId(node);
+ var w = box.w, h = box.h;
+ if(usesBorderBox(node)){
+ var pb = geom.getPadBorderExtents(node, computedStyle);
+ if(w >= 0){
+ w += pb.w;
+ }
+ if(h >= 0){
+ h += pb.h;
+ }
}
- d._setBox(node, NaN, NaN, widthPx, heightPx);
+ setBox(node, NaN, NaN, w, h);
};
- dojo._setMarginBox = function(/*DomNode*/node, /*Number?*/leftPx, /*Number?*/topPx,
- /*Number?*/widthPx, /*Number?*/heightPx,
- /*Object*/computedStyle){
- // summary:
- // sets the size of the node's margin box and placement
- // (left/top), irrespective of box model. Think of it as a
- // passthrough to dojo._setBox that handles box-model vagaries for
- // you.
+ var nilExtents = {l: 0, t: 0, w: 0, h: 0};
- var s = computedStyle || gcs(node),
+ geom.setMarginBox = function setMarginBox(/*DomNode*/node, /*Object*/box, /*Object*/computedStyle){
+ node = dom.byId(node);
+ var s = computedStyle || style.getComputedStyle(node), w = box.w, h = box.h,
// Some elements have special padding, margin, and box-model settings.
// To use box functions you may need to set padding, margin explicitly.
// Controlling box-model is harder, in a pinch you might set dojo.boxModel.
- bb = d._usesBorderBox(node),
- pb = bb ? _nilExtents : d._getPadBorderExtents(node, s)
- ;
- if(d.isWebKit){
+ pb = usesBorderBox(node) ? nilExtents : geom.getPadBorderExtents(node, s),
+ mb = geom.getMarginExtents(node, s);
+ if(has("webkit")){
// on Safari (3.1.2), button nodes with no explicit size have a default margin
// setting an explicit size eliminates the margin.
// We have to swizzle the width to get correct margin reading.
- if(d._isButtonTag(node)){
+ if(isButtonTag(node)){
var ns = node.style;
- if(widthPx >= 0 && !ns.width) { ns.width = "4px"; }
- if(heightPx >= 0 && !ns.height) { ns.height = "4px"; }
+ if(w >= 0 && !ns.width){
+ ns.width = "4px";
+ }
+ if(h >= 0 && !ns.height){
+ ns.height = "4px";
+ }
}
}
- var mb = d._getMarginExtents(node, s);
- if(widthPx >= 0){ widthPx = Math.max(widthPx - pb.w - mb.w, 0); }
- if(heightPx >= 0){ heightPx = Math.max(heightPx - pb.h - mb.h, 0); }
- d._setBox(node, leftPx, topPx, widthPx, heightPx);
- };
-
- var _nilExtents = { l:0, t:0, w:0, h:0 };
-
- // public API
-
- dojo.marginBox = function(/*DomNode|String*/node, /*Object?*/box){
- // summary:
- // Getter/setter for the margin-box of node.
- // description:
- // Getter/setter for the margin-box of node.
- // Returns an object in the expected format of box (regardless
- // if box is passed). The object might look like:
- // `{ l: 50, t: 200, w: 300: h: 150 }`
- // for a node offset from its parent 50px to the left, 200px from
- // the top with a margin width of 300px and a margin-height of
- // 150px.
- // node:
- // id or reference to DOM Node to get/set box for
- // box:
- // If passed, denotes that dojo.marginBox() should
- // update/set the margin box for node. Box is an object in the
- // above format. All properties are optional if passed.
- // example:
- // Retrieve the marginbox of a passed node
- // | var box = dojo.marginBox("someNodeId");
- // | console.dir(box);
- //
- // example:
- // Set a node's marginbox to the size of another node
- // | var box = dojo.marginBox("someNodeId");
- // | dojo.marginBox("someOtherNode", box);
-
- var n = byId(node), s = gcs(n), b = box;
- return !b ? d._getMarginBox(n, s) : d._setMarginBox(n, b.l, b.t, b.w, b.h, s); // Object
- };
-
- dojo.contentBox = function(/*DomNode|String*/node, /*Object?*/box){
- // summary:
- // Getter/setter for the content-box of node.
- // description:
- // Returns an object in the expected format of box (regardless if box is passed).
- // The object might look like:
- // `{ l: 50, t: 200, w: 300: h: 150 }`
- // for a node offset from its parent 50px to the left, 200px from
- // the top with a content width of 300px and a content-height of
- // 150px. Note that the content box may have a much larger border
- // or margin box, depending on the box model currently in use and
- // CSS values set/inherited for node.
- // While the getter will return top and left values, the
- // setter only accepts setting the width and height.
- // node:
- // id or reference to DOM Node to get/set box for
- // box:
- // If passed, denotes that dojo.contentBox() should
- // update/set the content box for node. Box is an object in the
- // above format, but only w (width) and h (height) are supported.
- // All properties are optional if passed.
- var n = byId(node), s = gcs(n), b = box;
- return !b ? d._getContentBox(n, s) : d._setContentSize(n, b.w, b.h, s); // Object
+ if(w >= 0){
+ w = Math.max(w - pb.w - mb.w, 0);
+ }
+ if(h >= 0){
+ h = Math.max(h - pb.h - mb.h, 0);
+ }
+ setBox(node, box.l, box.t, w, h);
};
// =============================
// Positioning
// =============================
- var _sumAncestorProperties = function(node, prop){
- if(!(node = (node||0).parentNode)){return 0;}
- var val, retVal = 0, _b = d.body();
- while(node && node.style){
- if(gcs(node).position == "fixed"){
- return 0;
- }
- val = node[prop];
- if(val){
- retVal += val - 0;
- // opera and khtml #body & #html has the same values, we only
- // need one value
- if(node == _b){ break; }
- }
- node = node.parentNode;
- }
- return retVal; // integer
- };
-
- dojo._docScroll = function(){
- var n = d.global;
- return "pageXOffset" in n
- ? { x:n.pageXOffset, y:n.pageYOffset }
- : (n = d.isQuirks? d.doc.body : d.doc.documentElement, { x:d._fixIeBiDiScrollLeft(n.scrollLeft || 0), y:n.scrollTop || 0 });
+ geom.isBodyLtr = function isBodyLtr(){
+ return (win.body().dir || win.doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean
};
- dojo._isBodyLtr = function(){
- return "_bodyLtr" in d? d._bodyLtr :
- d._bodyLtr = (d.body().dir || d.doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean
+ geom.docScroll = function docScroll(){
+ var node = win.doc.parentWindow || win.doc.defaultView; // use UI window, not dojo.global window
+ return "pageXOffset" in node ? {x: node.pageXOffset, y: node.pageYOffset } :
+ (node = has("quirks") ? win.body() : win.doc.documentElement,
+ {x: geom.fixIeBiDiScrollLeft(node.scrollLeft || 0), y: node.scrollTop || 0 });
};
- dojo._getIeDocumentElementOffset = function(){
- // summary:
- // returns the offset in x and y from the document body to the
- // visual edge of the page
- // description:
- // The following values in IE contain an offset:
- // | event.clientX
- // | event.clientY
- // | node.getBoundingClientRect().left
- // | node.getBoundingClientRect().top
- // But other position related values do not contain this offset,
- // such as node.offsetLeft, node.offsetTop, node.style.left and
- // node.style.top. The offset is always (2, 2) in LTR direction.
- // When the body is in RTL direction, the offset counts the width
- // of left scroll bar's width. This function computes the actual
- // offset.
-
+ geom.getIeDocumentElementOffset = function getIeDocumentElementOffset(){
//NOTE: assumes we're being called in an IE browser
- var de = d.doc.documentElement; // only deal with HTML element here, _abs handles body/quirks
+ var de = win.doc.documentElement; // only deal with HTML element here, position() handles body/quirks
- if(d.isIE < 8){
- var r = de.getBoundingClientRect(); // works well for IE6+
- //console.debug('rect left,top = ' + r.left+','+r.top + ', html client left/top = ' + de.clientLeft+','+de.clientTop + ', rtl = ' + (!d._isBodyLtr()) + ', quirks = ' + d.isQuirks);
- var l = r.left,
- t = r.top;
- if(d.isIE < 7){
+ if(has("ie") < 8){
+ var r = de.getBoundingClientRect(), // works well for IE6+
+ l = r.left, t = r.top;
+ if(has("ie") < 7){
l += de.clientLeft; // scrollbar size in strict/RTL, or,
t += de.clientTop; // HTML border size in strict
}
return {
- x: l < 0? 0 : l, // FRAME element border size can lead to inaccurate negative values
- y: t < 0? 0 : t
+ x: l < 0 ? 0 : l, // FRAME element border size can lead to inaccurate negative values
+ y: t < 0 ? 0 : t
};
}else{
return {
@@ -6368,20 +8287,19 @@ if(dojo.isIE){
y: 0
};
}
-
};
- dojo._fixIeBiDiScrollLeft = function(/*Integer*/ scrollLeft){
+ geom.fixIeBiDiScrollLeft = function fixIeBiDiScrollLeft(/*Integer*/ scrollLeft){
// In RTL direction, scrollLeft should be a negative value, but IE
// returns a positive one. All codes using documentElement.scrollLeft
// must call this function to fix this error, otherwise the position
// will offset to right when there is a horizontal scrollbar.
- var ie = d.isIE;
- if(ie && !d._isBodyLtr()){
- var qk = d.isQuirks,
- de = qk ? d.doc.body : d.doc.documentElement;
- if(ie == 6 && !qk && d.global.frameElement && de.scrollHeight > de.clientHeight){
+ var ie = has("ie");
+ if(ie && !geom.isBodyLtr()){
+ var qk = has("quirks"),
+ de = qk ? win.body() : win.doc.documentElement;
+ if(ie == 6 && !qk && win.global.frameElement && de.scrollHeight > de.clientHeight){
scrollLeft += de.clientLeft; // workaround ie6+strict+rtl+iframe+vertical-scrollbar bug where clientWidth is too small by clientLeft pixels
}
return (ie < 8 || qk) ? (scrollLeft + de.clientWidth - de.scrollWidth) : -scrollLeft; // Integer
@@ -6389,44 +8307,31 @@ if(dojo.isIE){
return scrollLeft; // Integer
};
- // FIXME: need a setter for coords or a moveTo!!
- dojo._abs = dojo.position = function(/*DomNode*/node, /*Boolean?*/includeScroll){
- // summary:
- // Gets the position and size of the passed element relative to
- // the viewport (if includeScroll==false), or relative to the
- // document root (if includeScroll==true).
- //
- // description:
- // Returns an object of the form:
- // { x: 100, y: 300, w: 20, h: 15 }
- // If includeScroll==true, the x and y values will include any
- // document offsets that may affect the position relative to the
- // viewport.
- // Uses the border-box model (inclusive of border and padding but
- // not margin). Does not act as a setter.
-
- node = byId(node);
- var db = d.body(),
+ geom.position = function(/*DomNode*/node, /*Boolean?*/includeScroll){
+ node = dom.byId(node);
+ var db = win.body(),
dh = db.parentNode,
ret = node.getBoundingClientRect();
- ret = { x: ret.left, y: ret.top, w: ret.right - ret.left, h: ret.bottom - ret.top };
- if(d.isIE){
- // On IE there's a 2px offset that we need to adjust for, see _getIeDocumentElementOffset()
- var offset = d._getIeDocumentElementOffset();
-
- // fixes the position in IE, quirks mode
- ret.x -= offset.x + (d.isQuirks ? db.clientLeft+db.offsetLeft : 0);
- ret.y -= offset.y + (d.isQuirks ? db.clientTop+db.offsetTop : 0);
- }else if(d.isFF == 3){
- // In FF3 you have to subtract the document element margins.
- // Fixed in FF3.5 though.
- var cs = gcs(dh);
- ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth);
- ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth);
- }
+ ret = {x: ret.left, y: ret.top, w: ret.right - ret.left, h: ret.bottom - ret.top};
+ if(has("ie")){
+ // On IE there's a 2px offset that we need to adjust for, see dojo.getIeDocumentElementOffset()
+ var offset = geom.getIeDocumentElementOffset();
+
+ // fixes the position in IE, quirks mode
+ ret.x -= offset.x + (has("quirks") ? db.clientLeft + db.offsetLeft : 0);
+ ret.y -= offset.y + (has("quirks") ? db.clientTop + db.offsetTop : 0);
+ }else if(has("ff") == 3){
+ // In FF3 you have to subtract the document element margins.
+ // Fixed in FF3.5 though.
+ var cs = style.getComputedStyle(dh), px = style.toPixelValue;
+ ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth);
+ ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth);
+ }
// account for document scrolling
+ // if offsetParent is used, ret value already includes scroll position
+ // so we may have to actually remove that value if !includeScroll
if(includeScroll){
- var scroll = d._docScroll();
+ var scroll = geom.docScroll();
ret.x += scroll.x;
ret.y += scroll.y;
}
@@ -6434,107 +8339,303 @@ if(dojo.isIE){
return ret; // Object
};
- dojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){
- // summary:
- // Deprecated: Use position() for border-box x/y/w/h
- // or marginBox() for margin-box w/h/l/t.
- // Returns an object representing a node's size and position.
- //
- // description:
- // Returns an object that measures margin-box (w)idth/(h)eight
- // and absolute position x/y of the border-box. Also returned
- // is computed (l)eft and (t)op values in pixels from the
- // node's offsetParent as returned from marginBox().
- // Return value will be in the form:
- //| { l: 50, t: 200, w: 300: h: 150, x: 100, y: 300 }
- // Does not act as a setter. If includeScroll is passed, the x and
- // y params are affected as one would expect in dojo.position().
- var n = byId(node), s = gcs(n), mb = d._getMarginBox(n, s);
- var abs = d.position(n, includeScroll);
- mb.x = abs.x;
- mb.y = abs.y;
- return mb;
+ // random "private" functions wildly used throughout the toolkit
+
+ geom.getMarginSize = function getMarginSize(/*DomNode*/node, /*Object*/computedStyle){
+ node = dom.byId(node);
+ var me = geom.getMarginExtents(node, computedStyle || style.getComputedStyle(node));
+ var size = node.getBoundingClientRect();
+ return {
+ w: (size.right - size.left) + me.w,
+ h: (size.bottom - size.top) + me.h
+ }
};
+ geom.normalizeEvent = function(event){
+ // summary:
+ // Normalizes the geometry of a DOM event, normalizing the pageX, pageY,
+ // offsetX, offsetY, layerX, and layerX properties
+ // event: Object
+ if(!("layerX" in event)){
+ event.layerX = event.offsetX;
+ event.layerY = event.offsetY;
+ }
+ if(!has("dom-addeventlistener")){
+ // old IE version
+ // FIXME: scroll position query is duped from dojo.html to
+ // avoid dependency on that entire module. Now that HTML is in
+ // Base, we should convert back to something similar there.
+ var se = event.target;
+ var doc = (se && se.ownerDocument) || document;
+ // DO NOT replace the following to use dojo.body(), in IE, document.documentElement should be used
+ // here rather than document.body
+ var docBody = has("quirks") ? doc.body : doc.documentElement;
+ var offset = geom.getIeDocumentElementOffset();
+ event.pageX = event.clientX + geom.fixIeBiDiScrollLeft(docBody.scrollLeft || 0) - offset.x;
+ event.pageY = event.clientY + (docBody.scrollTop || 0) - offset.y;
+ }
+ };
+
+ // TODO: evaluate separate getters/setters for position and sizes?
+
+ return geom;
+});
+
+},
+'dojo/dom-prop':function(){
+define("dojo/dom-prop", ["exports", "./_base/kernel", "./_base/sniff", "./_base/lang", "./dom", "./dom-style", "./dom-construct", "./_base/connect"],
+ function(exports, dojo, has, lang, dom, style, ctr, conn){
+ // module:
+ // dojo/dom-prop
+ // summary:
+ // This module defines the core dojo DOM properties API.
+ // Indirectly depends on dojo.empty() and dojo.toDom().
+
// =============================
- // Element attribute Functions
+ // Element properties Functions
// =============================
- // dojo.attr() should conform to http://www.w3.org/TR/DOM-Level-2-Core/
-
- var _propNames = {
- // properties renamed to avoid clashes with reserved words
- "class": "className",
- "for": "htmlFor",
- // properties written as camelCase
- tabindex: "tabIndex",
- readonly: "readOnly",
- colspan: "colSpan",
- frameborder: "frameBorder",
- rowspan: "rowSpan",
- valuetype: "valueType"
- },
- _attrNames = {
- // original attribute names
- classname: "class",
- htmlfor: "for",
- // for IE
- tabindex: "tabIndex",
- readonly: "readOnly"
- },
- _forcePropNames = {
- innerHTML: 1,
- className: 1,
- htmlFor: d.isIE,
- value: 1
- };
+ /*=====
+ prop.get = function(node, name){
+ // summary:
+ // Gets a property on an HTML element.
+ // description:
+ // Handles normalized getting of properties on DOM nodes.
+ //
+ // node: DOMNode|String
+ // id or reference to the element to get the property on
+ // name: String
+ // the name of the property to get.
+ // returns:
+ // the value of the requested property or its default value
+ //
+ // example:
+ // | // get the current value of the "foo" property on a node
+ // | dojo.getProp(dojo.byId("nodeId"), "foo");
+ // | // or we can just pass the id:
+ // | dojo.getProp("nodeId", "foo");
+ };
+ =====*/
- var _fixAttrName = function(/*String*/ name){
- return _attrNames[name.toLowerCase()] || name;
+ /*=====
+ prop.set = function(node, name, value){
+ // summary:
+ // Sets a property on an HTML element.
+ // description:
+ // Handles normalized setting of properties on DOM nodes.
+ //
+ // When passing functions as values, note that they will not be
+ // directly assigned to slots on the node, but rather the default
+ // behavior will be removed and the new behavior will be added
+ // using `dojo.connect()`, meaning that event handler properties
+ // will be normalized and that some caveats with regards to
+ // non-standard behaviors for onsubmit apply. Namely that you
+ // should cancel form submission using `dojo.stopEvent()` on the
+ // passed event object instead of returning a boolean value from
+ // the handler itself.
+ // node: DOMNode|String
+ // id or reference to the element to set the property on
+ // name: String|Object
+ // the name of the property to set, or a hash object to set
+ // multiple properties at once.
+ // value: String?
+ // The value to set for the property
+ // returns:
+ // the DOM node
+ //
+ // example:
+ // | // use prop() to set the tab index
+ // | dojo.setProp("nodeId", "tabIndex", 3);
+ // |
+ //
+ // example:
+ // Set multiple values at once, including event handlers:
+ // | dojo.setProp("formId", {
+ // | "foo": "bar",
+ // | "tabIndex": -1,
+ // | "method": "POST",
+ // | "onsubmit": function(e){
+ // | // stop submitting the form. Note that the IE behavior
+ // | // of returning true or false will have no effect here
+ // | // since our handler is connect()ed to the built-in
+ // | // onsubmit behavior and so we need to use
+ // | // dojo.stopEvent() to ensure that the submission
+ // | // doesn't proceed.
+ // | dojo.stopEvent(e);
+ // |
+ // | // submit the form with Ajax
+ // | dojo.xhrPost({ form: "formId" });
+ // | }
+ // | });
+ //
+ // example:
+ // Style is s special case: Only set with an object hash of styles
+ // | dojo.setProp("someNode",{
+ // | id:"bar",
+ // | style:{
+ // | width:"200px", height:"100px", color:"#000"
+ // | }
+ // | });
+ //
+ // example:
+ // Again, only set style as an object hash of styles:
+ // | var obj = { color:"#fff", backgroundColor:"#000" };
+ // | dojo.setProp("someNode", "style", obj);
+ // |
+ // | // though shorter to use `dojo.style()` in this case:
+ // | dojo.style("someNode", obj);
};
+ =====*/
- var _hasAttr = function(node, name){
- var attr = node.getAttributeNode && node.getAttributeNode(name);
- return attr && attr.specified; // Boolean
+ // helper to connect events
+ var _evtHdlrMap = {}, _ctr = 0, _attrId = dojo._scopeName + "attrid";
+
+ // the next dictionary lists elements with read-only innerHTML on IE
+ var _roInnerHtml = {col: 1, colgroup: 1,
+ // frameset: 1, head: 1, html: 1, style: 1,
+ table: 1, tbody: 1, tfoot: 1, thead: 1, tr: 1, title: 1};
+
+ exports.names = {
+ // properties renamed to avoid clashes with reserved words
+ "class": "className",
+ "for": "htmlFor",
+ // properties written as camelCase
+ tabindex: "tabIndex",
+ readonly: "readOnly",
+ colspan: "colSpan",
+ frameborder: "frameBorder",
+ rowspan: "rowSpan",
+ valuetype: "valueType"
+ };
+
+ exports.get = function getProp(/*DOMNode|String*/node, /*String*/name){
+ node = dom.byId(node);
+ var lc = name.toLowerCase(), propName = exports.names[lc] || name;
+ return node[propName]; // Anything
+ };
+
+ exports.set = function setProp(/*DOMNode|String*/node, /*String|Object*/name, /*String?*/value){
+ node = dom.byId(node);
+ var l = arguments.length;
+ if(l == 2 && typeof name != "string"){ // inline'd type check
+ // the object form of setter: the 2nd argument is a dictionary
+ for(var x in name){
+ exports.set(node, x, name[x]);
+ }
+ return node; // DomNode
+ }
+ var lc = name.toLowerCase(), propName = exports.names[lc] || name;
+ if(propName == "style" && typeof value != "string"){ // inline'd type check
+ // special case: setting a style
+ style.style(node, value);
+ return node; // DomNode
+ }
+ if(propName == "innerHTML"){
+ // special case: assigning HTML
+ if(has("ie") && node.tagName.toLowerCase() in _roInnerHtml){
+ ctr.empty(node);
+ node.appendChild(ctr.toDom(value, node.ownerDocument));
+ }else{
+ node[propName] = value;
+ }
+ return node; // DomNode
+ }
+ if(lang.isFunction(value)){
+ // special case: assigning an event handler
+ // clobber if we can
+ var attrId = node[_attrId];
+ if(!attrId){
+ attrId = _ctr++;
+ node[_attrId] = attrId;
+ }
+ if(!_evtHdlrMap[attrId]){
+ _evtHdlrMap[attrId] = {};
+ }
+ var h = _evtHdlrMap[attrId][propName];
+ if(h){
+ //h.remove();
+ conn.disconnect(h);
+ }else{
+ try{
+ delete node[propName];
+ }catch(e){}
+ }
+ // ensure that event objects are normalized, etc.
+ if(value){
+ //_evtHdlrMap[attrId][propName] = on(node, propName, value);
+ _evtHdlrMap[attrId][propName] = conn.connect(node, propName, value);
+ }else{
+ node[propName] = null;
+ }
+ return node; // DomNode
+ }
+ node[propName] = value;
+ return node; // DomNode
};
+});
- // There is a difference in the presence of certain properties and their default values
- // between browsers. For example, on IE "disabled" is present on all elements,
- // but it is value is "false"; "tabIndex" of <div> returns 0 by default on IE, yet other browsers
- // can return -1.
+},
+'dojo/dom-attr':function(){
+define(["exports", "./_base/sniff", "./_base/lang", "./dom", "./dom-style", "./dom-prop"],
+ function(exports, has, lang, dom, style, prop){
+ // module:
+ // dojo/dom-attr
+ // summary:
+ // This module defines the core dojo DOM attributes API.
- dojo.hasAttr = function(/*DomNode|String*/node, /*String*/name){
- // summary:
+ // =============================
+ // Element attribute Functions
+ // =============================
+
+ // This module will be obsolete soon. Use dojo.prop instead.
+
+ // dojo.attr() should conform to http://www.w3.org/TR/DOM-Level-2-Core/
+
+ // attribute-related functions (to be obsolete soon)
+
+ /*=====
+ dojo.hasAttr = function(node, name){
+ // summary:
// Returns true if the requested attribute is specified on the
// given element, and false otherwise.
- // node:
+ // node: DOMNode|String
// id or reference to the element to check
- // name:
+ // name: String
// the name of the attribute
- // returns:
+ // returns: Boolean
// true if the requested attribute is specified on the
// given element, and false otherwise
- var lc = name.toLowerCase();
- return _forcePropNames[_propNames[lc] || name] || _hasAttr(byId(node), _attrNames[lc] || name); // Boolean
};
+ =====*/
- var _evtHdlrMap = {}, _ctr = 0,
- _attrId = dojo._scopeName + "attrid",
- // the next dictionary lists elements with read-only innerHTML on IE
- _roInnerHtml = {col: 1, colgroup: 1,
- // frameset: 1, head: 1, html: 1, style: 1,
- table: 1, tbody: 1, tfoot: 1, thead: 1, tr: 1, title: 1};
-
- dojo.attr = function(/*DomNode|String*/node, /*String|Object*/name, /*String?*/value){
- // summary:
- // Gets or sets an attribute on an HTML element.
- // description:
- // Handles normalized getting and setting of attributes on DOM
- // Nodes. If 2 arguments are passed, and a the second argumnt is a
- // string, acts as a getter.
+ /*=====
+ dojo.getAttr = function(node, name){
+ // summary:
+ // Gets an attribute on an HTML element.
+ // description:
+ // Handles normalized getting of attributes on DOM Nodes.
+ // node: DOMNode|String
+ // id or reference to the element to get the attribute on
+ // name: String
+ // the name of the attribute to get.
+ // returns:
+ // the value of the requested attribute or null if that attribute does not have a specified or
+ // default value;
//
- // If a third argument is passed, or if the second argument is a
- // map of attributes, acts as a setter.
+ // example:
+ // | // get the current value of the "foo" attribute on a node
+ // | dojo.getAttr(dojo.byId("nodeId"), "foo");
+ // | // or we can just pass the id:
+ // | dojo.getAttr("nodeId", "foo");
+ };
+ =====*/
+
+ /*=====
+ dojo.setAttr = function(node, name, value){
+ // summary:
+ // Sets an attribute on an HTML element.
+ // description:
+ // Handles normalized setting of attributes on DOM Nodes.
//
// When passing functions as values, note that they will not be
// directly assigned to slots on the node, but rather the default
@@ -6545,33 +8646,22 @@ if(dojo.isIE){
// should cancel form submission using `dojo.stopEvent()` on the
// passed event object instead of returning a boolean value from
// the handler itself.
- // node:
- // id or reference to the element to get or set the attribute on
- // name:
- // the name of the attribute to get or set.
- // value:
- // The value to set for the attribute
- // returns:
- // when used as a getter, the value of the requested attribute
- // or null if that attribute does not have a specified or
- // default value;
- //
- // when used as a setter, the DOM node
- //
- // example:
- // | // get the current value of the "foo" attribute on a node
- // | dojo.attr(dojo.byId("nodeId"), "foo");
- // | // or we can just pass the id:
- // | dojo.attr("nodeId", "foo");
+ // node: DOMNode|String
+ // id or reference to the element to set the attribute on
+ // name: String|Object
+ // the name of the attribute to set, or a hash of key-value pairs to set.
+ // value: String?
+ // the value to set for the attribute, if the name is a string.
+ // returns:
+ // the DOM node
//
- // example:
+ // example:
// | // use attr() to set the tab index
- // | dojo.attr("nodeId", "tabIndex", 3);
- // |
+ // | dojo.setAttr("nodeId", "tabIndex", 3);
//
- // example:
+ // example:
// Set multiple values at once, including event handlers:
- // | dojo.attr("formId", {
+ // | dojo.setAttr("formId", {
// | "foo": "bar",
// | "tabIndex": -1,
// | "method": "POST",
@@ -6589,136 +8679,226 @@ if(dojo.isIE){
// | }
// | });
//
- // example:
+ // example:
// Style is s special case: Only set with an object hash of styles
- // | dojo.attr("someNode",{
+ // | dojo.setAttr("someNode",{
// | id:"bar",
// | style:{
// | width:"200px", height:"100px", color:"#000"
// | }
// | });
//
- // example:
+ // example:
// Again, only set style as an object hash of styles:
// | var obj = { color:"#fff", backgroundColor:"#000" };
- // | dojo.attr("someNode", "style", obj);
+ // | dojo.setAttr("someNode", "style", obj);
// |
// | // though shorter to use `dojo.style()` in this case:
- // | dojo.style("someNode", obj);
+ // | dojo.setStyle("someNode", obj);
+ };
+ =====*/
- node = byId(node);
- var args = arguments.length, prop;
- if(args == 2 && typeof name != "string"){ // inline'd type check
- // the object form of setter: the 2nd argument is a dictionary
- for(var x in name){
- d.attr(node, x, name[x]);
- }
- return node; // DomNode
- }
+ /*=====
+ dojo.removeAttr = function(node, name){
+ // summary:
+ // Removes an attribute from an HTML element.
+ // node: DOMNode|String
+ // id or reference to the element to remove the attribute from
+ // name: String
+ // the name of the attribute to remove
+ };
+ =====*/
+
+ /*=====
+ dojo.getNodeProp = function(node, name){
+ // summary:
+ // Returns an effective value of a property or an attribute.
+ // node: DOMNode|String
+ // id or reference to the element to remove the attribute from
+ // name: String
+ // the name of the attribute
+ // returns:
+ // the value of the attribute
+ };
+ =====*/
+
+ var forcePropNames = {
+ innerHTML: 1,
+ className: 1,
+ htmlFor: has("ie"),
+ value: 1
+ },
+ attrNames = {
+ // original attribute names
+ classname: "class",
+ htmlfor: "for",
+ // for IE
+ tabindex: "tabIndex",
+ readonly: "readOnly"
+ };
+
+ function _hasAttr(node, name){
+ var attr = node.getAttributeNode && node.getAttributeNode(name);
+ return attr && attr.specified; // Boolean
+ }
+
+ // There is a difference in the presence of certain properties and their default values
+ // between browsers. For example, on IE "disabled" is present on all elements,
+ // but it is value is "false"; "tabIndex" of <div> returns 0 by default on IE, yet other browsers
+ // can return -1.
+
+ exports.has = function hasAttr(/*DOMNode|String*/node, /*String*/name){
+ var lc = name.toLowerCase();
+ return forcePropNames[prop.names[lc] || name] || _hasAttr(dom.byId(node), attrNames[lc] || name); // Boolean
+ };
+
+ exports.get = function getAttr(/*DOMNode|String*/node, /*String*/name){
+ node = dom.byId(node);
var lc = name.toLowerCase(),
- propName = _propNames[lc] || name,
- forceProp = _forcePropNames[propName],
- attrName = _attrNames[lc] || name;
- if(args == 3){
- // setter
- do{
- if(propName == "style" && typeof value != "string"){ // inline'd type check
- // special case: setting a style
- d.style(node, value);
- break;
- }
- if(propName == "innerHTML"){
- // special case: assigning HTML
- if(d.isIE && node.tagName.toLowerCase() in _roInnerHtml){
- d.empty(node);
- node.appendChild(d._toDom(value, node.ownerDocument));
- }else{
- node[propName] = value;
- }
- break;
- }
- if(d.isFunction(value)){
- // special case: assigning an event handler
- // clobber if we can
- var attrId = d.attr(node, _attrId);
- if(!attrId){
- attrId = _ctr++;
- d.attr(node, _attrId, attrId);
- }
- if(!_evtHdlrMap[attrId]){
- _evtHdlrMap[attrId] = {};
- }
- var h = _evtHdlrMap[attrId][propName];
- if(h){
- d.disconnect(h);
- }else{
- try{
- delete node[propName];
- }catch(e){}
- }
- // ensure that event objects are normalized, etc.
- _evtHdlrMap[attrId][propName] = d.connect(node, propName, value);
- break;
- }
- if(forceProp || typeof value == "boolean"){
- // special case: forcing assignment to the property
- // special case: setting boolean to a property instead of attribute
- node[propName] = value;
- break;
- }
- // node's attribute
- node.setAttribute(attrName, value);
- }while(false);
- return node; // DomNode
- }
- // getter
- // should we access this attribute via a property or
- // via getAttribute()?
+ propName = prop.names[lc] || name,
+ forceProp = forcePropNames[propName];
+ // should we access this attribute via a property or via getAttribute()?
value = node[propName];
if(forceProp && typeof value != "undefined"){
// node's property
return value; // Anything
}
- if(propName != "href" && (typeof value == "boolean" || d.isFunction(value))){
+ if(propName != "href" && (typeof value == "boolean" || lang.isFunction(value))){
// node's property
return value; // Anything
}
// node's attribute
// we need _hasAttr() here to guard against IE returning a default value
+ var attrName = attrNames[lc] || name;
return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything
};
- dojo.removeAttr = function(/*DomNode|String*/ node, /*String*/ name){
- // summary:
- // Removes an attribute from an HTML element.
- // node:
- // id or reference to the element to remove the attribute from
- // name:
- // the name of the attribute to remove
- byId(node).removeAttribute(_fixAttrName(name));
+ exports.set = function setAttr(/*DOMNode|String*/node, /*String|Object*/name, /*String?*/value){
+ node = dom.byId(node);
+ if(arguments.length == 2){ // inline'd type check
+ // the object form of setter: the 2nd argument is a dictionary
+ for(var x in name){
+ exports.set(node, x, name[x]);
+ }
+ return node; // DomNode
+ }
+ var lc = name.toLowerCase(),
+ propName = prop.names[lc] || name,
+ forceProp = forcePropNames[propName];
+ if(propName == "style" && typeof value != "string"){ // inline'd type check
+ // special case: setting a style
+ style.set(node, value);
+ return node; // DomNode
+ }
+ if(forceProp || typeof value == "boolean" || lang.isFunction(value)){
+ return prop.set(node, name, value)
+ }
+ // node's attribute
+ node.setAttribute(attrNames[lc] || name, value);
+ return node; // DomNode
};
- dojo.getNodeProp = function(/*DomNode|String*/ node, /*String*/ name){
- // summary:
- // Returns an effective value of a property or an attribute.
- // node:
- // id or reference to the element to remove the attribute from
- // name:
- // the name of the attribute
- node = byId(node);
- var lc = name.toLowerCase(),
- propName = _propNames[lc] || name;
+ exports.remove = function removeAttr(/*DOMNode|String*/ node, /*String*/ name){
+ dom.byId(node).removeAttribute(attrNames[name.toLowerCase()] || name);
+ };
+
+ exports.getNodeProp = function getNodeProp(/*DomNode|String*/ node, /*String*/ name){
+ node = dom.byId(node);
+ var lc = name.toLowerCase(), propName = prop.names[lc] || name;
if((propName in node) && propName != "href"){
// node's property
return node[propName]; // Anything
}
// node's attribute
- var attrName = _attrNames[lc] || name;
+ var attrName = attrNames[lc] || name;
return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything
};
+});
+
+},
+'dojo/dom-construct':function(){
+define("dojo/dom-construct", ["exports", "./_base/kernel", "./_base/sniff", "./_base/window", "./dom", "./dom-attr", "./on"],
+ function(exports, dojo, has, win, dom, attr, on){
+ // module:
+ // dojo/dom-construct
+ // summary:
+ // This module defines the core dojo DOM construction API.
+ /*=====
+ dojo.toDom = function(frag, doc){
+ // summary:
+ // instantiates an HTML fragment returning the corresponding DOM.
+ // frag: String
+ // the HTML fragment
+ // doc: DocumentNode?
+ // optional document to use when creating DOM nodes, defaults to
+ // dojo.doc if not specified.
+ // returns: DocumentFragment
+ //
+ // example:
+ // Create a table row:
+ // | var tr = dojo.toDom("<tr><td>First!</td></tr>");
+ };
+ =====*/
+
+ /*=====
+ dojo._toDom = function(frag, doc){
+ // summary:
+ // Existing alias for `dojo.toDom`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.place = function(node, refNode, position){
+ // summary:
+ // Attempt to insert node into the DOM, choosing from various positioning options.
+ // Returns the first argument resolved to a DOM node.
+ //
+ // node: DOMNode|String
+ // id or node reference, or HTML fragment starting with "<" to place relative to refNode
+ //
+ // refNode: DOMNode|String
+ // id or node reference to use as basis for placement
+ //
+ // position: String|Number?
+ // string noting the position of node relative to refNode or a
+ // number indicating the location in the childNodes collection of refNode.
+ // Accepted string values are:
+ // | * before
+ // | * after
+ // | * replace
+ // | * only
+ // | * first
+ // | * last
+ // "first" and "last" indicate positions as children of refNode, "replace" replaces refNode,
+ // "only" replaces all children. position defaults to "last" if not specified
+ //
+ // returns: DOMNode
+ // Returned values is the first argument resolved to a DOM node.
+ //
+ // .place() is also a method of `dojo.NodeList`, allowing `dojo.query` node lookups.
+ //
+ // example:
+ // Place a node by string id as the last child of another node by string id:
+ // | dojo.place("someNode", "anotherNode");
+ //
+ // example:
+ // Place a node by string id before another node by string id
+ // | dojo.place("someNode", "anotherNode", "before");
+ //
+ // example:
+ // Create a Node, and place it in the body element (last child):
+ // | dojo.place("<div></div>", dojo.body());
+ //
+ // example:
+ // Put a new LI as the first child of a list by id:
+ // | dojo.place("<li></li>", "someUl", "first");
+ };
+ =====*/
+
+ /*=====
dojo.create = function(tag, attrs, refNode, pos){
- // summary:
+ // summary:
// Create an element, allowing for optional attribute decoration
// and placement.
//
@@ -6727,22 +8907,22 @@ if(dojo.isIE){
// a fragment, and allowing for a convenient optional attribute setting step,
// as well as an optional DOM placement reference.
//|
- // Attributes are set by passing the optional object through `dojo.attr`.
- // See `dojo.attr` for noted caveats and nuances, and API if applicable.
+ // Attributes are set by passing the optional object through `dojo.setAttr`.
+ // See `dojo.setAttr` for noted caveats and nuances, and API if applicable.
//|
// Placement is done via `dojo.place`, assuming the new node to be the action
// node, passing along the optional reference node and position.
//
- // tag: String|DomNode
+ // tag: DOMNode|String
// A string of the element to create (eg: "div", "a", "p", "li", "script", "br"),
// or an existing DOM node to process.
//
// attrs: Object
// An object-hash of attributes to set on the newly created node.
// Can be null, if you don't want to set any attributes/styles.
- // See: `dojo.attr` for a description of available attributes.
+ // See: `dojo.setAttr` for a description of available attributes.
//
- // refNode: String?|DomNode?
+ // refNode: DOMNode?|String?
// Optional reference node. Used by `dojo.place` to place the newly created
// node somewhere in the dom relative to refNode. Can be a DomNode reference
// or String ID of a node.
@@ -6753,23 +8933,23 @@ if(dojo.isIE){
// to further control the placement of the new node relative to the refNode.
// 'refNode' is required if a 'pos' is specified.
//
- // returns: DomNode
+ // returns: DOMNode
//
// example:
- // Create a DIV:
+ // Create a DIV:
// | var n = dojo.create("div");
//
// example:
- // Create a DIV with content:
+ // Create a DIV with content:
// | var n = dojo.create("div", { innerHTML:"<p>hi</p>" });
//
// example:
- // Place a new DIV in the BODY, with no attributes set
+ // Place a new DIV in the BODY, with no attributes set
// | var n = dojo.create("div", null, dojo.body());
//
// example:
- // Create an UL, and populate it with LI's. Place the list as the first-child of a
- // node with id="someId":
+ // Create an UL, and populate it with LI's. Place the list as the first-child of a
+ // node with id="someId":
// | var ul = dojo.create("ul", null, "someId", "first");
// | var items = ["one", "two", "three", "four"];
// | dojo.forEach(items, function(data){
@@ -6777,74 +8957,65 @@ if(dojo.isIE){
// | });
//
// example:
- // Create an anchor, with an href. Place in BODY:
+ // Create an anchor, with an href. Place in BODY:
// | dojo.create("a", { href:"foo.html", title:"Goto FOO!" }, dojo.body());
//
// example:
- // Create a `dojo.NodeList()` from a new element (for syntatic sugar):
+ // Create a `dojo.NodeList()` from a new element (for syntatic sugar):
// | dojo.query(dojo.create('div'))
// | .addClass("newDiv")
// | .onclick(function(e){ console.log('clicked', e.target) })
// | .place("#someNode"); // redundant, but cleaner.
-
- var doc = d.doc;
- if(refNode){
- refNode = byId(refNode);
- doc = refNode.ownerDocument;
- }
- if(typeof tag == "string"){ // inline'd type check
- tag = doc.createElement(tag);
- }
- if(attrs){ d.attr(tag, attrs); }
- if(refNode){ d.place(tag, refNode, pos); }
- return tag; // DomNode
};
+ =====*/
/*=====
dojo.empty = function(node){
- // summary:
+ // summary:
// safely removes all children of the node.
- // node: DOMNode|String
+ // node: DOMNode|String
// a reference to a DOM node or an id.
- // example:
- // Destroy node's children byId:
+ // example:
+ // Destroy node's children byId:
// | dojo.empty("someId");
//
- // example:
- // Destroy all nodes' children in a list by reference:
+ // example:
+ // Destroy all nodes' children in a list by reference:
// | dojo.query(".someNode").forEach(dojo.empty);
}
=====*/
- d.empty =
- d.isIE ? function(node){
- node = byId(node);
- for(var c; c = node.lastChild;){ // intentional assignment
- d.destroy(c);
- }
- } :
- function(node){
- byId(node).innerHTML = "";
- };
+ /*=====
+ dojo.destroy = function(node){
+ // summary:
+ // Removes a node from its parent, clobbering it and all of its
+ // children.
+ //
+ // description:
+ // Removes a node from its parent, clobbering it and all of its
+ // children. Function only works with DomNodes, and returns nothing.
+ //
+ // node: DOMNode|String
+ // A String ID or DomNode reference of the element to be destroyed
+ //
+ // example:
+ // Destroy a node byId:
+ // | dojo.destroy("someId");
+ //
+ // example:
+ // Destroy all nodes in a list by reference:
+ // | dojo.query(".someNode").forEach(dojo.destroy);
+ };
+ =====*/
/*=====
- dojo._toDom = function(frag, doc){
- // summary:
- // instantiates an HTML fragment returning the corresponding DOM.
- // frag: String
- // the HTML fragment
- // doc: DocumentNode?
- // optional document to use when creating DOM nodes, defaults to
- // dojo.doc if not specified.
- // returns: DocumentFragment
- //
- // example:
- // Create a table row:
- // | var tr = dojo._toDom("<tr><td>First!</td></tr>");
- }
+ dojo._destroyElement = function(node){
+ // summary:
+ // Existing alias for `dojo.destroy`. Deprecated, will be removed in 2.0.
+ };
=====*/
- // support stuff for dojo._toDom
+ // support stuff for dojo.toDom
var tagWrap = {
option: ["select"],
tbody: ["table"],
@@ -6861,25 +9032,48 @@ if(dojo.isIE){
},
reTag = /<\s*([\w\:]+)/,
masterNode = {}, masterNum = 0,
- masterName = "__" + d._scopeName + "ToDomId";
+ masterName = "__" + dojo._scopeName + "ToDomId";
// generate start/end tag strings to use
// for the injection for each special tag wrap case.
for(var param in tagWrap){
if(tagWrap.hasOwnProperty(param)){
var tw = tagWrap[param];
- tw.pre = param == "option" ? '<select multiple="multiple">' : "<" + tw.join("><") + ">";
+ tw.pre = param == "option" ? '<select multiple="multiple">' : "<" + tw.join("><") + ">";
tw.post = "</" + tw.reverse().join("></") + ">";
// the last line is destructive: it reverses the array,
// but we don't care at this point
}
}
- d._toDom = function(frag, doc){
- // summary:
- // converts HTML string into DOM nodes.
+ function _insertBefore(/*DomNode*/node, /*DomNode*/ref){
+ var parent = ref.parentNode;
+ if(parent){
+ parent.insertBefore(node, ref);
+ }
+ }
- doc = doc || d.doc;
+ function _insertAfter(/*DomNode*/node, /*DomNode*/ref){
+ // summary:
+ // Try to insert node after ref
+ var parent = ref.parentNode;
+ if(parent){
+ if(parent.lastChild == ref){
+ parent.appendChild(node);
+ }else{
+ parent.insertBefore(node, ref.nextSibling);
+ }
+ }
+ }
+
+ var _destroyContainer = null,
+ _destroyDoc;
+ on(window, "unload", function(){
+ _destroyContainer = null; //prevent IE leak
+ });
+
+ exports.toDom = function toDom(frag, doc){
+ doc = doc || win.doc;
var masterId = doc[masterName];
if(!masterId){
doc[masterName] = masterId = ++masterNum + "";
@@ -6917,3008 +9111,1237 @@ if(dojo.isIE){
return df; // DOMNode
};
- // =============================
- // (CSS) Class Functions
- // =============================
- var _className = "className";
-
- dojo.hasClass = function(/*DomNode|String*/node, /*String*/classStr){
- // summary:
- // Returns whether or not the specified classes are a portion of the
- // class list currently applied to the node.
- //
- // node:
- // String ID or DomNode reference to check the class for.
- //
- // classStr:
- // A string class name to look for.
- //
- // example:
- // Do something if a node with id="someNode" has class="aSillyClassName" present
- // | if(dojo.hasClass("someNode","aSillyClassName")){ ... }
-
- return ((" "+ byId(node)[_className] +" ").indexOf(" " + classStr + " ") >= 0); // Boolean
- };
-
- var spaces = /\s+/, a1 = [""],
- fakeNode = {},
- str2array = function(s){
- if(typeof s == "string" || s instanceof String){
- if(s.indexOf(" ") < 0){
- a1[0] = s;
- return a1;
- }else{
- return s.split(spaces);
- }
- }
- // assumed to be an array
- return s || "";
- };
-
- dojo.addClass = function(/*DomNode|String*/node, /*String|Array*/classStr){
- // summary:
- // Adds the specified classes to the end of the class list on the
- // passed node. Will not re-apply duplicate classes.
- //
- // node:
- // String ID or DomNode reference to add a class string too
- //
- // classStr:
- // A String class name to add, or several space-separated class names,
- // or an array of class names.
- //
- // example:
- // Add a class to some node:
- // | dojo.addClass("someNode", "anewClass");
- //
- // example:
- // Add two classes at once:
- // | dojo.addClass("someNode", "firstClass secondClass");
- //
- // example:
- // Add two classes at once (using array):
- // | dojo.addClass("someNode", ["firstClass", "secondClass"]);
- //
- // example:
- // Available in `dojo.NodeList` for multiple additions
- // | dojo.query("ul > li").addClass("firstLevel");
-
- node = byId(node);
- classStr = str2array(classStr);
- var cls = node[_className], oldLen;
- cls = cls ? " " + cls + " " : " ";
- oldLen = cls.length;
- for(var i = 0, len = classStr.length, c; i < len; ++i){
- c = classStr[i];
- if(c && cls.indexOf(" " + c + " ") < 0){
- cls += c + " ";
- }
- }
- if(oldLen < cls.length){
- node[_className] = cls.substr(1, cls.length - 2);
+ exports.place = function place(/*DOMNode|String*/node, /*DOMNode|String*/refNode, /*String|Number?*/position){
+ refNode = dom.byId(refNode);
+ if(typeof node == "string"){ // inline'd type check
+ node = /^\s*</.test(node) ? exports.toDom(node, refNode.ownerDocument) : dom.byId(node);
}
- };
-
- dojo.removeClass = function(/*DomNode|String*/node, /*String|Array?*/classStr){
- // summary:
- // Removes the specified classes from node. No `dojo.hasClass`
- // check is required.
- //
- // node:
- // String ID or DomNode reference to remove the class from.
- //
- // classStr:
- // An optional String class name to remove, or several space-separated
- // class names, or an array of class names. If omitted, all class names
- // will be deleted.
- //
- // example:
- // Remove a class from some node:
- // | dojo.removeClass("someNode", "firstClass");
- //
- // example:
- // Remove two classes from some node:
- // | dojo.removeClass("someNode", "firstClass secondClass");
- //
- // example:
- // Remove two classes from some node (using array):
- // | dojo.removeClass("someNode", ["firstClass", "secondClass"]);
- //
- // example:
- // Remove all classes from some node:
- // | dojo.removeClass("someNode");
- //
- // example:
- // Available in `dojo.NodeList()` for multiple removal
- // | dojo.query(".foo").removeClass("foo");
-
- node = byId(node);
- var cls;
- if(classStr !== undefined){
- classStr = str2array(classStr);
- cls = " " + node[_className] + " ";
- for(var i = 0, len = classStr.length; i < len; ++i){
- cls = cls.replace(" " + classStr[i] + " ", " ");
+ if(typeof position == "number"){ // inline'd type check
+ var cn = refNode.childNodes;
+ if(!cn.length || cn.length <= position){
+ refNode.appendChild(node);
+ }else{
+ _insertBefore(node, cn[position < 0 ? 0 : position]);
}
- cls = d.trim(cls);
}else{
- cls = "";
- }
- if(node[_className] != cls){ node[_className] = cls; }
- };
-
- dojo.replaceClass = function(/*DomNode|String*/node, /*String|Array*/addClassStr, /*String|Array?*/removeClassStr){
- // summary:
- // Replaces one or more classes on a node if not present.
- // Operates more quickly than calling dojo.removeClass and dojo.addClass
- // node:
- // String ID or DomNode reference to remove the class from.
- // addClassStr:
- // A String class name to add, or several space-separated class names,
- // or an array of class names.
- // removeClassStr:
- // A String class name to remove, or several space-separated class names,
- // or an array of class names.
- //
- // example:
- // | dojo.replaceClass("someNode", "add1 add2", "remove1 remove2");
- //
- // example:
- // Replace all classes with addMe
- // | dojo.replaceClass("someNode", "addMe");
- //
- // example:
- // Available in `dojo.NodeList()` for multiple toggles
- // | dojo.query(".findMe").replaceClass("addMe", "removeMe");
-
- node = byId(node);
- fakeNode.className = node.className;
- dojo.removeClass(fakeNode, removeClassStr);
- dojo.addClass(fakeNode, addClassStr);
- if(node.className !== fakeNode.className){
- node.className = fakeNode.className;
+ switch(position){
+ case "before":
+ _insertBefore(node, refNode);
+ break;
+ case "after":
+ _insertAfter(node, refNode);
+ break;
+ case "replace":
+ refNode.parentNode.replaceChild(node, refNode);
+ break;
+ case "only":
+ exports.empty(refNode);
+ refNode.appendChild(node);
+ break;
+ case "first":
+ if(refNode.firstChild){
+ _insertBefore(node, refNode.firstChild);
+ break;
+ }
+ // else fallthrough...
+ default: // aka: last
+ refNode.appendChild(node);
+ }
}
+ return node; // DomNode
};
- dojo.toggleClass = function(/*DomNode|String*/node, /*String|Array*/classStr, /*Boolean?*/condition){
- // summary:
- // Adds a class to node if not present, or removes if present.
- // Pass a boolean condition if you want to explicitly add or remove.
- // condition:
- // If passed, true means to add the class, false means to remove.
- //
- // example:
- // | dojo.toggleClass("someNode", "hovered");
- //
- // example:
- // Forcefully add a class
- // | dojo.toggleClass("someNode", "hovered", true);
- //
- // example:
- // Available in `dojo.NodeList()` for multiple toggles
- // | dojo.query(".toggleMe").toggleClass("toggleMe");
-
- if(condition === undefined){
- condition = !d.hasClass(node, classStr);
+ exports.create = function create(/*DOMNode|String*/tag, /*Object*/attrs, /*DOMNode?|String?*/refNode, /*String?*/pos){
+ var doc = win.doc;
+ if(refNode){
+ refNode = dom.byId(refNode);
+ doc = refNode.ownerDocument;
}
- d[condition ? "addClass" : "removeClass"](node, classStr);
- };
-
-})();
-
-}
-
-if(!dojo._hasResource["dojo._base.NodeList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.NodeList"] = true;
-dojo.provide("dojo._base.NodeList");
-
-
-
-
-
-
-(function(){
-
- var d = dojo;
-
- var ap = Array.prototype, aps = ap.slice, apc = ap.concat;
-
- var tnl = function(/*Array*/ a, /*dojo.NodeList?*/ parent, /*Function?*/ NodeListCtor){
- // summary:
- // decorate an array to make it look like a `dojo.NodeList`.
- // a:
- // Array of nodes to decorate.
- // parent:
- // An optional parent NodeList that generated the current
- // list of nodes. Used to call _stash() so the parent NodeList
- // can be accessed via end() later.
- // NodeListCtor:
- // An optional constructor function to use for any
- // new NodeList calls. This allows a certain chain of
- // NodeList calls to use a different object than dojo.NodeList.
- if(!a.sort){
- // make sure it's a real array before we pass it on to be wrapped
- a = aps.call(a, 0);
+ if(typeof tag == "string"){ // inline'd type check
+ tag = doc.createElement(tag);
}
- var ctor = NodeListCtor || this._NodeListCtor || d._NodeListCtor;
- a.constructor = ctor;
- dojo._mixin(a, ctor.prototype);
- a._NodeListCtor = ctor;
- return parent ? a._stash(parent) : a;
- };
-
- var loopBody = function(f, a, o){
- a = [0].concat(aps.call(a, 0));
- o = o || d.global;
- return function(node){
- a[0] = node;
- return f.apply(o, a);
- };
- };
-
- // adapters
-
- var adaptAsForEach = function(f, o){
- // summary:
- // adapts a single node function to be used in the forEach-type
- // actions. The initial object is returned from the specialized
- // function.
- // f: Function
- // a function to adapt
- // o: Object?
- // an optional context for f
- return function(){
- this.forEach(loopBody(f, arguments, o));
- return this; // Object
- };
- };
-
- var adaptAsMap = function(f, o){
- // summary:
- // adapts a single node function to be used in the map-type
- // actions. The return is a new array of values, as via `dojo.map`
- // f: Function
- // a function to adapt
- // o: Object?
- // an optional context for f
- return function(){
- return this.map(loopBody(f, arguments, o));
- };
- };
-
- var adaptAsFilter = function(f, o){
- // summary:
- // adapts a single node function to be used in the filter-type actions
- // f: Function
- // a function to adapt
- // o: Object?
- // an optional context for f
- return function(){
- return this.filter(loopBody(f, arguments, o));
- };
+ if(attrs){ attr.set(tag, attrs); }
+ if(refNode){ exports.place(tag, refNode, pos); }
+ return tag; // DomNode
};
- var adaptWithCondition = function(f, g, o){
- // summary:
- // adapts a single node function to be used in the map-type
- // actions, behaves like forEach() or map() depending on arguments
- // f: Function
- // a function to adapt
- // g: Function
- // a condition function, if true runs as map(), otherwise runs as forEach()
- // o: Object?
- // an optional context for f and g
- return function(){
- var a = arguments, body = loopBody(f, a, o);
- if(g.call(o || d.global, a)){
- return this.map(body); // self
+ exports.empty =
+ has("ie") ? function(node){
+ node = dom.byId(node);
+ for(var c; c = node.lastChild;){ // intentional assignment
+ exports.destroy(c);
}
- this.forEach(body);
- return this; // self
+ } :
+ function(node){
+ dom.byId(node).innerHTML = "";
};
- };
-
- var magicGuard = function(a){
- // summary:
- // the guard function for dojo.attr() and dojo.style()
- return a.length == 1 && (typeof a[0] == "string"); // inline'd type check
- };
- var orphan = function(node){
- // summary:
- // function to orphan nodes
- var p = node.parentNode;
- if(p){
- p.removeChild(node);
+ exports.destroy = function destroy(/*DOMNode|String*/node){
+ node = dom.byId(node);
+ try{
+ var doc = node.ownerDocument;
+ // cannot use _destroyContainer.ownerDocument since this can throw an exception on IE
+ if(!_destroyContainer || _destroyDoc != doc){
+ _destroyContainer = doc.createElement("div");
+ _destroyDoc = doc;
+ }
+ _destroyContainer.appendChild(node.parentNode ? node.parentNode.removeChild(node) : node);
+ // NOTE: see http://trac.dojotoolkit.org/ticket/2931. This may be a bug and not a feature
+ _destroyContainer.innerHTML = "";
+ }catch(e){
+ /* squelch */
}
};
- // FIXME: should we move orphan() to dojo.html?
+});
- dojo.NodeList = function(){
- // summary:
- // dojo.NodeList is an of Array subclass which adds syntactic
- // sugar for chaining, common iteration operations, animation, and
- // node manipulation. NodeLists are most often returned as the
- // result of dojo.query() calls.
- // description:
- // dojo.NodeList instances provide many utilities that reflect
- // core Dojo APIs for Array iteration and manipulation, DOM
- // manipulation, and event handling. Instead of needing to dig up
- // functions in the dojo.* namespace, NodeLists generally make the
- // full power of Dojo available for DOM manipulation tasks in a
- // simple, chainable way.
- // example:
- // create a node list from a node
- // | new dojo.NodeList(dojo.byId("foo"));
- // example:
- // get a NodeList from a CSS query and iterate on it
- // | var l = dojo.query(".thinger");
- // | l.forEach(function(node, index, nodeList){
- // | console.log(index, node.innerHTML);
- // | });
- // example:
- // use native and Dojo-provided array methods to manipulate a
- // NodeList without needing to use dojo.* functions explicitly:
- // | var l = dojo.query(".thinger");
- // | // since NodeLists are real arrays, they have a length
- // | // property that is both readable and writable and
- // | // push/pop/shift/unshift methods
- // | console.log(l.length);
- // | l.push(dojo.create("span"));
- // |
- // | // dojo's normalized array methods work too:
- // | console.log( l.indexOf(dojo.byId("foo")) );
- // | // ...including the special "function as string" shorthand
- // | console.log( l.every("item.nodeType == 1") );
- // |
- // | // NodeLists can be [..] indexed, or you can use the at()
- // | // function to get specific items wrapped in a new NodeList:
- // | var node = l[3]; // the 4th element
- // | var newList = l.at(1, 3); // the 2nd and 4th elements
- // example:
- // the style functions you expect are all there too:
- // | // style() as a getter...
- // | var borders = dojo.query(".thinger").style("border");
- // | // ...and as a setter:
- // | dojo.query(".thinger").style("border", "1px solid black");
- // | // class manipulation
- // | dojo.query("li:nth-child(even)").addClass("even");
- // | // even getting the coordinates of all the items
- // | var coords = dojo.query(".thinger").coords();
- // example:
- // DOM manipulation functions from the dojo.* namespace area also
- // available:
- // | // remove all of the elements in the list from their
- // | // parents (akin to "deleting" them from the document)
- // | dojo.query(".thinger").orphan();
- // | // place all elements in the list at the front of #foo
- // | dojo.query(".thinger").place("foo", "first");
- // example:
- // Event handling couldn't be easier. `dojo.connect` is mapped in,
- // and shortcut handlers are provided for most DOM events:
- // | // like dojo.connect(), but with implicit scope
- // | dojo.query("li").connect("onclick", console, "log");
- // |
- // | // many common event handlers are already available directly:
- // | dojo.query("li").onclick(console, "log");
- // | var toggleHovered = dojo.hitch(dojo, "toggleClass", "hovered");
- // | dojo.query("p")
- // | .onmouseenter(toggleHovered)
- // | .onmouseleave(toggleHovered);
- // example:
- // chainability is a key advantage of NodeLists:
- // | dojo.query(".thinger")
- // | .onclick(function(e){ /* ... */ })
- // | .at(1, 3, 8) // get a subset
- // | .style("padding", "5px")
- // | .forEach(console.log);
+},
+'dojo/keys':function(){
+define("dojo/keys", ["./_base/kernel", "./_base/sniff"], function(dojo, has) {
+ // module:
+ // dojo/keys
+ // summary:
+ // key constants
+// Constants
- return tnl(Array.apply(null, arguments));
- };
+// Public: client code should test
+// keyCode against these named constants, as the
+// actual codes can vary by browser.
+return dojo.keys = {
+ // summary:
+ // Definitions for common key values
+ BACKSPACE: 8,
+ TAB: 9,
+ CLEAR: 12,
+ ENTER: 13,
+ SHIFT: 16,
+ CTRL: 17,
+ ALT: 18,
+ META: has("safari") ? 91 : 224, // the apple key on macs
+ PAUSE: 19,
+ CAPS_LOCK: 20,
+ ESCAPE: 27,
+ SPACE: 32,
+ PAGE_UP: 33,
+ PAGE_DOWN: 34,
+ END: 35,
+ HOME: 36,
+ LEFT_ARROW: 37,
+ UP_ARROW: 38,
+ RIGHT_ARROW: 39,
+ DOWN_ARROW: 40,
+ INSERT: 45,
+ DELETE: 46,
+ HELP: 47,
+ LEFT_WINDOW: 91,
+ RIGHT_WINDOW: 92,
+ SELECT: 93,
+ NUMPAD_0: 96,
+ NUMPAD_1: 97,
+ NUMPAD_2: 98,
+ NUMPAD_3: 99,
+ NUMPAD_4: 100,
+ NUMPAD_5: 101,
+ NUMPAD_6: 102,
+ NUMPAD_7: 103,
+ NUMPAD_8: 104,
+ NUMPAD_9: 105,
+ NUMPAD_MULTIPLY: 106,
+ NUMPAD_PLUS: 107,
+ NUMPAD_ENTER: 108,
+ NUMPAD_MINUS: 109,
+ NUMPAD_PERIOD: 110,
+ NUMPAD_DIVIDE: 111,
+ F1: 112,
+ F2: 113,
+ F3: 114,
+ F4: 115,
+ F5: 116,
+ F6: 117,
+ F7: 118,
+ F8: 119,
+ F9: 120,
+ F10: 121,
+ F11: 122,
+ F12: 123,
+ F13: 124,
+ F14: 125,
+ F15: 126,
+ NUM_LOCK: 144,
+ SCROLL_LOCK: 145,
+ UP_DPAD: 175,
+ DOWN_DPAD: 176,
+ LEFT_DPAD: 177,
+ RIGHT_DPAD: 178,
+ // virtual key mapping
+ copyKey: has("mac") && !has("air") ? (has("safari") ? 91 : 224 ) : 17
+};
+});
+
+},
+'dojo/domReady':function(){
+define(['./has'], function(has){
+ var global = this,
+ doc = document,
+ readyStates = { 'loaded': 1, 'complete': 1 },
+ fixReadyState = typeof doc.readyState != "string",
+ ready = !!readyStates[doc.readyState];
+
+ // For FF <= 3.5
+ if(fixReadyState){ doc.readyState = "loading"; }
+
+ if(!ready){
+ var readyQ = [], tests = [],
+ detectReady = function(evt){
+ evt = evt || global.event;
+ if(ready || (evt.type == "readystatechange" && !readyStates[doc.readyState])){ return; }
+ ready = 1;
+
+ // For FF <= 3.5
+ if(fixReadyState){ doc.readyState = "complete"; }
+
+ while(readyQ.length){
+ (readyQ.shift())();
+ }
+ },
+ on = function(node, event){
+ node.addEventListener(event, detectReady, false);
+ readyQ.push(function(){ node.removeEventListener(event, detectReady, false); });
+ };
- //Allow things that new up a NodeList to use a delegated or alternate NodeList implementation.
- d._NodeListCtor = d.NodeList;
+ if(!has("dom-addeventlistener")){
+ on = function(node, event){
+ event = "on" + event;
+ node.attachEvent(event, detectReady);
+ readyQ.push(function(){ node.detachEvent(event, detectReady); });
+ };
- var nl = d.NodeList, nlp = nl.prototype;
+ var div = doc.createElement("div");
+ try{
+ if(div.doScroll && global.frameElement === null){
+ // the doScroll test is only useful if we're in the top-most frame
+ tests.push(function(){
+ // Derived with permission from Diego Perini's IEContentLoaded
+ // http://javascript.nwbox.com/IEContentLoaded/
+ try{
+ div.doScroll("left");
+ return 1;
+ }catch(e){}
+ });
+ }
+ }catch(e){}
+ }
- // expose adapters and the wrapper as private functions
+ on(doc, "DOMContentLoaded");
+ on(global, "load");
- nl._wrap = nlp._wrap = tnl;
- nl._adaptAsMap = adaptAsMap;
- nl._adaptAsForEach = adaptAsForEach;
- nl._adaptAsFilter = adaptAsFilter;
- nl._adaptWithCondition = adaptWithCondition;
+ if("onreadystatechange" in doc){
+ on(doc, "readystatechange");
+ }else if(!fixReadyState){
+ // if the ready state property exists and there's
+ // no readystatechange event, poll for the state
+ // to change
+ tests.push(function(){
+ return readyStates[doc.readyState];
+ });
+ }
- // mass assignment
+ if(tests.length){
+ var poller = function(){
+ if(ready){ return; }
+ var i = tests.length;
+ while(i--){
+ if(tests[i]()){
+ detectReady("poller");
+ return;
+ }
+ }
+ setTimeout(poller, 30);
+ };
+ poller();
+ }
+ }
- // add array redirectors
- d.forEach(["slice", "splice"], function(name){
- var f = ap[name];
- //Use a copy of the this array via this.slice() to allow .end() to work right in the splice case.
- // CANNOT apply ._stash()/end() to splice since it currently modifies
- // the existing this array -- it would break backward compatibility if we copy the array before
- // the splice so that we can use .end(). So only doing the stash option to this._wrap for slice.
- nlp[name] = function(){ return this._wrap(f.apply(this, arguments), name == "slice" ? this : null); };
- });
- // concat should be here but some browsers with native NodeList have problems with it
+ function domReady(callback){
+ if(ready){
+ callback(1);
+ }else{
+ readyQ.push(callback);
+ }
+ }
+ domReady.load = function(id, req, load){
+ domReady(load);
+ };
- // add array.js redirectors
- d.forEach(["indexOf", "lastIndexOf", "every", "some"], function(name){
- var f = d[name];
- nlp[name] = function(){ return f.apply(d, [this].concat(aps.call(arguments, 0))); };
- });
+ return domReady;
+});
- // add conditional methods
- d.forEach(["attr", "style"], function(name){
- nlp[name] = adaptWithCondition(d[name], magicGuard);
- });
+},
+'dojo/_base/lang':function(){
+define(["./kernel", "../has", "./sniff"], function(dojo, has){
+ // module:
+ // dojo/_base/lang
+ // summary:
+ // This module defines Javascript language extensions.
- // add forEach actions
- d.forEach(["connect", "addClass", "removeClass", "replaceClass", "toggleClass", "empty", "removeAttr"], function(name){
- nlp[name] = adaptAsForEach(d[name]);
+ has.add("bug-for-in-skips-shadowed", function(){
+ // if true, the for-in interator skips object properties that exist in Object's prototype (IE 6 - ?)
+ for(var i in {toString: 1}){
+ return 0;
+ }
+ return 1;
});
- dojo.extend(dojo.NodeList, {
- _normalize: function(/*String||Element||Object||NodeList*/content, /*DOMNode?*/refNode){
- // summary:
- // normalizes data to an array of items to insert.
- // description:
- // If content is an object, it can have special properties "template" and
- // "parse". If "template" is defined, then the template value is run through
- // dojo.string.substitute (if dojo.string.substitute has been dojo.required elsewhere),
- // or if templateFunc is a function on the content, that function will be used to
- // transform the template into a final string to be used for for passing to dojo._toDom.
- // If content.parse is true, then it is remembered for later, for when the content
- // nodes are inserted into the DOM. At that point, the nodes will be parsed for widgets
- // (if dojo.parser has been dojo.required elsewhere).
-
- //Wanted to just use a DocumentFragment, but for the array/NodeList
- //case that meant using cloneNode, but we may not want that.
- //Cloning should only happen if the node operations span
- //multiple refNodes. Also, need a real array, not a NodeList from the
- //DOM since the node movements could change those NodeLists.
+ var _extraNames =
+ has("bug-for-in-skips-shadowed") ?
+ "hasOwnProperty.valueOf.isPrototypeOf.propertyIsEnumerable.toLocaleString.toString.constructor".split(".") : [],
- var parse = content.parse === true ? true : false;
+ _extraLen = _extraNames.length,
- //Do we have an object that needs to be run through a template?
- if(typeof content.template == "string"){
- var templateFunc = content.templateFunc || (dojo.string && dojo.string.substitute);
- content = templateFunc ? templateFunc(content.template, content) : content;
+ _mixin = function(dest, source, copyFunc){
+ var name, s, i, empty = {};
+ for(name in source){
+ // the (!(name in empty) || empty[name] !== s) condition avoids copying properties in "source"
+ // inherited from Object.prototype. For example, if dest has a custom toString() method,
+ // don't overwrite it with the toString() method that source inherited from Object.prototype
+ s = source[name];
+ if(!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))){
+ dest[name] = copyFunc ? copyFunc(s) : s;
+ }
}
- var type = (typeof content);
- if(type == "string" || type == "number"){
- content = dojo._toDom(content, (refNode && refNode.ownerDocument));
- if(content.nodeType == 11){
- //DocumentFragment. It cannot handle cloneNode calls, so pull out the children.
- content = dojo._toArray(content.childNodes);
- }else{
- content = [content];
+ if(has("bug-for-in-skips-shadowed")){
+ if(source){
+ for(i = 0; i < _extraLen; ++i){
+ name = _extraNames[i];
+ s = source[name];
+ if(!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))){
+ dest[name] = copyFunc ? copyFunc(s) : s;
+ }
+ }
}
- }else if(!dojo.isArrayLike(content)){
- content = [content];
- }else if(!dojo.isArray(content)){
- //To get to this point, content is array-like, but
- //not an array, which likely means a DOM NodeList. Convert it now.
- content = dojo._toArray(content);
}
- //Pass around the parse info
- if(parse){
- content._runParse = true;
- }
- return content; //Array
+ return dest; // Object
},
- _cloneNode: function(/*DOMNode*/ node){
- // summary:
- // private utility to clone a node. Not very interesting in the vanilla
- // dojo.NodeList case, but delegates could do interesting things like
- // clone event handlers if that is derivable from the node.
- return node.cloneNode(true);
- },
-
- _place: function(/*Array*/ary, /*DOMNode*/refNode, /*String*/position, /*Boolean*/useClone){
- // summary:
- // private utility to handle placing an array of nodes relative to another node.
- // description:
- // Allows for cloning the nodes in the array, and for
- // optionally parsing widgets, if ary._runParse is true.
-
- //Avoid a disallowed operation if trying to do an innerHTML on a non-element node.
- if(refNode.nodeType != 1 && position == "only"){
- return;
+ mixin = function(dest, sources){
+ if(!dest){ dest = {}; }
+ for(var i = 1, l = arguments.length; i < l; i++){
+ lang._mixin(dest, arguments[i]);
}
- var rNode = refNode, tempNode;
-
- //Always cycle backwards in case the array is really a
- //DOM NodeList and the DOM operations take it out of the live collection.
- var length = ary.length;
- for(var i = length - 1; i >= 0; i--){
- var node = (useClone ? this._cloneNode(ary[i]) : ary[i]);
-
- //If need widget parsing, use a temp node, instead of waiting after inserting into
- //real DOM because we need to start widget parsing at one node up from current node,
- //which could cause some already parsed widgets to be parsed again.
- if(ary._runParse && dojo.parser && dojo.parser.parse){
- if(!tempNode){
- tempNode = rNode.ownerDocument.createElement("div");
- }
- tempNode.appendChild(node);
- dojo.parser.parse(tempNode);
- node = tempNode.firstChild;
- while(tempNode.firstChild){
- tempNode.removeChild(tempNode.firstChild);
- }
- }
+ return dest; // Object
+ },
- if(i == length - 1){
- dojo.place(node, rNode, position);
+ getProp = function(/*Array*/parts, /*Boolean*/create, /*Object*/context){
+ var p, i = 0, dojoGlobal = dojo.global;
+ if(!context){
+ if(!parts.length){
+ return dojoGlobal;
}else{
- rNode.parentNode.insertBefore(node, rNode);
+ p = parts[i++];
+ try{
+ context = dojo.scopeMap[p] && dojo.scopeMap[p][1];
+ }catch(e){}
+ context = context || (p in dojoGlobal ? dojoGlobal[p] : (create ? dojoGlobal[p] = {} : undefined));
}
- rNode = node;
}
- },
-
- _stash: function(parent){
- // summary:
- // private function to hold to a parent NodeList. end() to return the parent NodeList.
- //
- // example:
- // How to make a `dojo.NodeList` method that only returns the third node in
- // the dojo.NodeList but allows access to the original NodeList by using this._stash:
- // | dojo.extend(dojo.NodeList, {
- // | third: function(){
- // | var newNodeList = dojo.NodeList(this[2]);
- // | return newNodeList._stash(this);
- // | }
- // | });
- // | // then see how _stash applies a sub-list, to be .end()'ed out of
- // | dojo.query(".foo")
- // | .third()
- // | .addClass("thirdFoo")
- // | .end()
- // | // access to the orig .foo list
- // | .removeClass("foo")
- // |
- //
- this._parent = parent;
- return this; //dojo.NodeList
- },
-
- end: function(){
- // summary:
- // Ends use of the current `dojo.NodeList` by returning the previous dojo.NodeList
- // that generated the current dojo.NodeList.
- // description:
- // Returns the `dojo.NodeList` that generated the current `dojo.NodeList`. If there
- // is no parent dojo.NodeList, an empty dojo.NodeList is returned.
- // example:
- // | dojo.query("a")
- // | .filter(".disabled")
- // | // operate on the anchors that only have a disabled class
- // | .style("color", "grey")
- // | .end()
- // | // jump back to the list of anchors
- // | .style(...)
- //
- if(this._parent){
- return this._parent;
- }else{
- //Just return empty list.
- return new this._NodeListCtor();
+ while(context && (p = parts[i++])){
+ context = (p in context ? context[p] : (create ? context[p] = {} : undefined));
}
+ return context; // mixed
},
- // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Methods
-
- // FIXME: handle return values for #3244
- // http://trac.dojotoolkit.org/ticket/3244
-
- // FIXME:
- // need to wrap or implement:
- // join (perhaps w/ innerHTML/outerHTML overload for toString() of items?)
- // reduce
- // reduceRight
-
- /*=====
- slice: function(begin, end){
- // summary:
- // Returns a new NodeList, maintaining this one in place
- // description:
- // This method behaves exactly like the Array.slice method
- // with the caveat that it returns a dojo.NodeList and not a
- // raw Array. For more details, see Mozilla's (slice
- // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:slice]
- // begin: Integer
- // Can be a positive or negative integer, with positive
- // integers noting the offset to begin at, and negative
- // integers denoting an offset from the end (i.e., to the left
- // of the end)
- // end: Integer?
- // Optional parameter to describe what position relative to
- // the NodeList's zero index to end the slice at. Like begin,
- // can be positive or negative.
- return this._wrap(a.slice.apply(this, arguments));
- },
-
- splice: function(index, howmany, item){
- // summary:
- // Returns a new NodeList, manipulating this NodeList based on
- // the arguments passed, potentially splicing in new elements
- // at an offset, optionally deleting elements
- // description:
- // This method behaves exactly like the Array.splice method
- // with the caveat that it returns a dojo.NodeList and not a
- // raw Array. For more details, see Mozilla's (splice
- // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:splice]
- // For backwards compatibility, calling .end() on the spliced NodeList
- // does not return the original NodeList -- splice alters the NodeList in place.
- // index: Integer
- // begin can be a positive or negative integer, with positive
- // integers noting the offset to begin at, and negative
- // integers denoting an offset from the end (i.e., to the left
- // of the end)
- // howmany: Integer?
- // Optional parameter to describe what position relative to
- // the NodeList's zero index to end the slice at. Like begin,
- // can be positive or negative.
- // item: Object...?
- // Any number of optional parameters may be passed in to be
- // spliced into the NodeList
- // returns:
- // dojo.NodeList
- return this._wrap(a.splice.apply(this, arguments));
- },
-
- indexOf: function(value, fromIndex){
- // summary:
- // see dojo.indexOf(). The primary difference is that the acted-on
- // array is implicitly this NodeList
- // value: Object:
- // The value to search for.
- // fromIndex: Integer?:
- // The location to start searching from. Optional. Defaults to 0.
- // description:
- // For more details on the behavior of indexOf, see Mozilla's
- // (indexOf
- // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf]
- // returns:
- // Positive Integer or 0 for a match, -1 of not found.
- return d.indexOf(this, value, fromIndex); // Integer
- },
-
- lastIndexOf: function(value, fromIndex){
- // summary:
- // see dojo.lastIndexOf(). The primary difference is that the
- // acted-on array is implicitly this NodeList
- // description:
- // For more details on the behavior of lastIndexOf, see
- // Mozilla's (lastIndexOf
- // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:lastIndexOf]
- // value: Object
- // The value to search for.
- // fromIndex: Integer?
- // The location to start searching from. Optional. Defaults to 0.
- // returns:
- // Positive Integer or 0 for a match, -1 of not found.
- return d.lastIndexOf(this, value, fromIndex); // Integer
- },
-
- every: function(callback, thisObject){
- // summary:
- // see `dojo.every()` and the (Array.every
- // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every].
- // Takes the same structure of arguments and returns as
- // dojo.every() with the caveat that the passed array is
- // implicitly this NodeList
- // callback: Function: the callback
- // thisObject: Object?: the context
- return d.every(this, callback, thisObject); // Boolean
+ setObject = function(name, value, context){
+ var parts = name.split("."), p = parts.pop(), obj = getProp(parts, true, context);
+ return obj && p ? (obj[p] = value) : undefined; // Object
},
- some: function(callback, thisObject){
- // summary:
- // Takes the same structure of arguments and returns as
- // `dojo.some()` with the caveat that the passed array is
- // implicitly this NodeList. See `dojo.some()` and Mozilla's
- // (Array.some
- // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some].
- // callback: Function: the callback
- // thisObject: Object?: the context
- return d.some(this, callback, thisObject); // Boolean
+ getObject = function(name, create, context){
+ return getProp(name.split("."), create, context); // Object
},
- =====*/
- concat: function(item){
- // summary:
- // Returns a new NodeList comprised of items in this NodeList
- // as well as items passed in as parameters
- // description:
- // This method behaves exactly like the Array.concat method
- // with the caveat that it returns a `dojo.NodeList` and not a
- // raw Array. For more details, see the (Array.concat
- // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:concat]
- // item: Object?
- // Any number of optional parameters may be passed in to be
- // spliced into the NodeList
- // returns:
- // dojo.NodeList
-
- //return this._wrap(apc.apply(this, arguments));
- // the line above won't work for the native NodeList :-(
-
- // implementation notes:
- // 1) Native NodeList is not an array, and cannot be used directly
- // in concat() --- the latter doesn't recognize it as an array, and
- // does not inline it, but append as a single entity.
- // 2) On some browsers (e.g., Safari) the "constructor" property is
- // read-only and cannot be changed. So we have to test for both
- // native NodeList and dojo.NodeList in this property to recognize
- // the node list.
-
- var t = d.isArray(this) ? this : aps.call(this, 0),
- m = d.map(arguments, function(a){
- return a && !d.isArray(a) &&
- (typeof NodeList != "undefined" && a.constructor === NodeList || a.constructor === this._NodeListCtor) ?
- aps.call(a, 0) : a;
- });
- return this._wrap(apc.apply(t, m), this); // dojo.NodeList
- },
-
- map: function(/*Function*/ func, /*Function?*/ obj){
- // summary:
- // see dojo.map(). The primary difference is that the acted-on
- // array is implicitly this NodeList and the return is a
- // dojo.NodeList (a subclass of Array)
- ///return d.map(this, func, obj, d.NodeList); // dojo.NodeList
- return this._wrap(d.map(this, func, obj), this); // dojo.NodeList
+ exists = function(name, obj){
+ return lang.getObject(name, false, obj) !== undefined; // Boolean
},
- forEach: function(callback, thisObj){
- // summary:
- // see `dojo.forEach()`. The primary difference is that the acted-on
- // array is implicitly this NodeList. If you want the option to break out
- // of the forEach loop, use every() or some() instead.
- d.forEach(this, callback, thisObj);
- // non-standard return to allow easier chaining
- return this; // dojo.NodeList
- },
+ opts = Object.prototype.toString,
- /*=====
- coords: function(){
- // summary:
- // Returns the box objects of all elements in a node list as
- // an Array (*not* a NodeList). Acts like `dojo.coords`, though assumes
- // the node passed is each node in this list.
+ // Crockford (ish) functions
- return d.map(this, d.coords); // Array
+ isString = function(it){
+ return (typeof it == "string" || it instanceof String); // Boolean
},
- position: function(){
- // summary:
- // Returns border-box objects (x/y/w/h) of all elements in a node list
- // as an Array (*not* a NodeList). Acts like `dojo.position`, though
- // assumes the node passed is each node in this list.
-
- return d.map(this, d.position); // Array
+ isArray = function(it){
+ return it && (it instanceof Array || typeof it == "array"); // Boolean
},
- attr: function(property, value){
- // summary:
- // gets or sets the DOM attribute for every element in the
- // NodeList. See also `dojo.attr`
- // property: String
- // the attribute to get/set
- // value: String?
- // optional. The value to set the property to
- // returns:
- // if no value is passed, the result is an array of attribute values
- // If a value is passed, the return is this NodeList
- // example:
- // Make all nodes with a particular class focusable:
- // | dojo.query(".focusable").attr("tabIndex", -1);
- // example:
- // Disable a group of buttons:
- // | dojo.query("button.group").attr("disabled", true);
- // example:
- // innerHTML can be assigned or retrieved as well:
- // | // get the innerHTML (as an array) for each list item
- // | var ih = dojo.query("li.replaceable").attr("innerHTML");
- return; // dojo.NodeList
- return; // Array
+ isFunction = function(it){
+ return opts.call(it) === "[object Function]";
},
- style: function(property, value){
- // summary:
- // gets or sets the CSS property for every element in the NodeList
- // property: String
- // the CSS property to get/set, in JavaScript notation
- // ("lineHieght" instead of "line-height")
- // value: String?
- // optional. The value to set the property to
- // returns:
- // if no value is passed, the result is an array of strings.
- // If a value is passed, the return is this NodeList
- return; // dojo.NodeList
- return; // Array
+ isObject = function(it){
+ return it !== undefined &&
+ (it === null || typeof it == "object" || lang.isArray(it) || lang.isFunction(it)); // Boolean
},
- addClass: function(className){
- // summary:
- // adds the specified class to every node in the list
- // className: String|Array
- // A String class name to add, or several space-separated class names,
- // or an array of class names.
- return; // dojo.NodeList
+ isArrayLike = function(it){
+ return it && it !== undefined && // Boolean
+ // keep out built-in constructors (Number, String, ...) which have length
+ // properties
+ !lang.isString(it) && !lang.isFunction(it) &&
+ !(it.tagName && it.tagName.toLowerCase() == 'form') &&
+ (lang.isArray(it) || isFinite(it.length));
},
- removeClass: function(className){
- // summary:
- // removes the specified class from every node in the list
- // className: String|Array?
- // An optional String class name to remove, or several space-separated
- // class names, or an array of class names. If omitted, all class names
- // will be deleted.
- // returns:
- // dojo.NodeList, this list
- return; // dojo.NodeList
+ isAlien = function(it){
+ return it && !lang.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean
},
- toggleClass: function(className, condition){
- // summary:
- // Adds a class to node if not present, or removes if present.
- // Pass a boolean condition if you want to explicitly add or remove.
- // condition: Boolean?
- // If passed, true means to add the class, false means to remove.
- // className: String
- // the CSS class to add
- return; // dojo.NodeList
- },
-
- connect: function(methodName, objOrFunc, funcName){
- // summary:
- // attach event handlers to every item of the NodeList. Uses dojo.connect()
- // so event properties are normalized
- // methodName: String
- // the name of the method to attach to. For DOM events, this should be
- // the lower-case name of the event
- // objOrFunc: Object|Function|String
- // if 2 arguments are passed (methodName, objOrFunc), objOrFunc should
- // reference a function or be the name of the function in the global
- // namespace to attach. If 3 arguments are provided
- // (methodName, objOrFunc, funcName), objOrFunc must be the scope to
- // locate the bound function in
- // funcName: String?
- // optional. A string naming the function in objOrFunc to bind to the
- // event. May also be a function reference.
- // example:
- // add an onclick handler to every button on the page
- // | dojo.query("div:nth-child(odd)").connect("onclick", function(e){
- // | console.log("clicked!");
- // | });
- // example:
- // attach foo.bar() to every odd div's onmouseover
- // | dojo.query("div:nth-child(odd)").connect("onmouseover", foo, "bar");
+ extend = function(constructor, props){
+ for(var i=1, l=arguments.length; i<l; i++){
+ lang._mixin(constructor.prototype, arguments[i]);
+ }
+ return constructor; // Object
},
- empty: function(){
- // summary:
- // clears all content from each node in the list. Effectively
- // equivalent to removing all child nodes from every item in
- // the list.
- return this.forEach("item.innerHTML='';"); // dojo.NodeList
- // FIXME: should we be checking for and/or disposing of widgets below these nodes?
+ _hitchArgs = function(scope, method){
+ var pre = _toArray(arguments, 2);
+ var named = lang.isString(method);
+ return function(){
+ // arrayify arguments
+ var args = _toArray(arguments);
+ // locate our method
+ var f = named ? (scope||dojo.global)[method] : method;
+ // invoke with collected args
+ return f && f.apply(scope || this, pre.concat(args)); // mixed
+ }; // Function
},
- =====*/
- // useful html methods
- coords: adaptAsMap(d.coords),
- position: adaptAsMap(d.position),
-
- // FIXME: connectPublisher()? connectRunOnce()?
-
- /*
- destroy: function(){
- // summary:
- // destroys every item in the list.
- this.forEach(d.destroy);
- // FIXME: should we be checking for and/or disposing of widgets below these nodes?
- },
- */
-
- place: function(/*String||Node*/ queryOrNode, /*String*/ position){
- // summary:
- // places elements of this node list relative to the first element matched
- // by queryOrNode. Returns the original NodeList. See: `dojo.place`
- // queryOrNode:
- // may be a string representing any valid CSS3 selector or a DOM node.
- // In the selector case, only the first matching element will be used
- // for relative positioning.
- // position:
- // can be one of:
- // | "last" (default)
- // | "first"
- // | "before"
- // | "after"
- // | "only"
- // | "replace"
- // or an offset in the childNodes property
- var item = d.query(queryOrNode)[0];
- return this.forEach(function(node){ d.place(node, item, position); }); // dojo.NodeList
+ hitch = function(scope, method){
+ if(arguments.length > 2){
+ return lang._hitchArgs.apply(dojo, arguments); // Function
+ }
+ if(!method){
+ method = scope;
+ scope = null;
+ }
+ if(lang.isString(method)){
+ scope = scope || dojo.global;
+ if(!scope[method]){ throw(['dojo.hitch: scope["', method, '"] is null (scope="', scope, '")'].join('')); }
+ return function(){ return scope[method].apply(scope, arguments || []); }; // Function
+ }
+ return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function
},
- orphan: function(/*String?*/ filter){
- // summary:
- // removes elements in this list that match the filter
- // from their parents and returns them as a new NodeList.
- // filter:
- // CSS selector like ".foo" or "div > span"
- // returns:
- // `dojo.NodeList` containing the orphaned elements
- return (filter ? d._filterQueryResult(this, filter) : this).forEach(orphan); // dojo.NodeList
- },
+ delegate = (function(){
+ // boodman/crockford delegation w/ cornford optimization
+ function TMP(){}
+ return function(obj, props){
+ TMP.prototype = obj;
+ var tmp = new TMP();
+ TMP.prototype = null;
+ if(props){
+ lang._mixin(tmp, props);
+ }
+ return tmp; // Object
+ };
+ })(),
- adopt: function(/*String||Array||DomNode*/ queryOrListOrNode, /*String?*/ position){
- // summary:
- // places any/all elements in queryOrListOrNode at a
- // position relative to the first element in this list.
- // Returns a dojo.NodeList of the adopted elements.
- // queryOrListOrNode:
- // a DOM node or a query string or a query result.
- // Represents the nodes to be adopted relative to the
- // first element of this NodeList.
- // position:
- // can be one of:
- // | "last" (default)
- // | "first"
- // | "before"
- // | "after"
- // | "only"
- // | "replace"
- // or an offset in the childNodes property
- return d.query(queryOrListOrNode).place(this[0], position)._stash(this); // dojo.NodeList
+ efficient = function(obj, offset, startWith){
+ return (startWith||[]).concat(Array.prototype.slice.call(obj, offset||0));
},
- // FIXME: do we need this?
- query: function(/*String*/ queryStr){
- // summary:
- // Returns a new list whose members match the passed query,
- // assuming elements of the current NodeList as the root for
- // each search.
- // example:
- // assume a DOM created by this markup:
- // | <div id="foo">
- // | <p>
- // | bacon is tasty, <span>dontcha think?</span>
- // | </p>
- // | </div>
- // | <div id="bar">
- // | <p>great comedians may not be funny <span>in person</span></p>
- // | </div>
- // If we are presented with the following definition for a NodeList:
- // | var l = new dojo.NodeList(dojo.byId("foo"), dojo.byId("bar"));
- // it's possible to find all span elements under paragraphs
- // contained by these elements with this sub-query:
- // | var spans = l.query("p span");
-
- // FIXME: probably slow
- if(!queryStr){ return this; }
- var ret = this.map(function(node){
- // FIXME: why would we ever get undefined here?
- return d.query(queryStr, node).filter(function(subNode){ return subNode !== undefined; });
- });
- return this._wrap(apc.apply([], ret), this); // dojo.NodeList
+ _toArray =
+ has("ie") ?
+ (function(){
+ function slow(obj, offset, startWith){
+ var arr = startWith||[];
+ for(var x = offset || 0; x < obj.length; x++){
+ arr.push(obj[x]);
+ }
+ return arr;
+ }
+ return function(obj){
+ return ((obj.item) ? slow : efficient).apply(this, arguments);
+ };
+ })() : efficient,
+
+ partial = function(/*Function|String*/method /*, ...*/){
+ var arr = [ null ];
+ return lang.hitch.apply(dojo, arr.concat(lang._toArray(arguments))); // Function
},
- filter: function(/*String|Function*/ filter){
- // summary:
- // "masks" the built-in javascript filter() method (supported
- // in Dojo via `dojo.filter`) to support passing a simple
- // string filter in addition to supporting filtering function
- // objects.
- // filter:
- // If a string, a CSS rule like ".thinger" or "div > span".
- // example:
- // "regular" JS filter syntax as exposed in dojo.filter:
- // | dojo.query("*").filter(function(item){
- // | // highlight every paragraph
- // | return (item.nodeName == "p");
- // | }).style("backgroundColor", "yellow");
- // example:
- // the same filtering using a CSS selector
- // | dojo.query("*").filter("p").styles("backgroundColor", "yellow");
-
- var a = arguments, items = this, start = 0;
- if(typeof filter == "string"){ // inline'd type check
- items = d._filterQueryResult(this, a[0]);
- if(a.length == 1){
- // if we only got a string query, pass back the filtered results
- return items._stash(this); // dojo.NodeList
+ clone = function(/*anything*/ src){
+ if(!src || typeof src != "object" || lang.isFunction(src)){
+ // null, undefined, any non-object, or function
+ return src; // anything
+ }
+ if(src.nodeType && "cloneNode" in src){
+ // DOM Node
+ return src.cloneNode(true); // Node
+ }
+ if(src instanceof Date){
+ // Date
+ return new Date(src.getTime()); // Date
+ }
+ if(src instanceof RegExp){
+ // RegExp
+ return new RegExp(src); // RegExp
+ }
+ var r, i, l;
+ if(lang.isArray(src)){
+ // array
+ r = [];
+ for(i = 0, l = src.length; i < l; ++i){
+ if(i in src){
+ r.push(clone(src[i]));
+ }
}
- // if we got a callback, run it over the filtered items
- start = 1;
- }
- return this._wrap(d.filter(items, a[start], a[start + 1]), this); // dojo.NodeList
- },
-
- /*
- // FIXME: should this be "copyTo" and include parenting info?
- clone: function(){
- // summary:
- // creates node clones of each element of this list
- // and returns a new list containing the clones
- },
- */
-
- addContent: function(/*String||DomNode||Object||dojo.NodeList*/ content, /*String||Integer?*/ position){
- // summary:
- // add a node, NodeList or some HTML as a string to every item in the
- // list. Returns the original list.
- // description:
- // a copy of the HTML content is added to each item in the
- // list, with an optional position argument. If no position
- // argument is provided, the content is appended to the end of
- // each item.
- // content:
- // DOM node, HTML in string format, a NodeList or an Object. If a DOM node or
- // NodeList, the content will be cloned if the current NodeList has more than one
- // element. Only the DOM nodes are cloned, no event handlers. If it is an Object,
- // it should be an object with at "template" String property that has the HTML string
- // to insert. If dojo.string has already been dojo.required, then dojo.string.substitute
- // will be used on the "template" to generate the final HTML string. Other allowed
- // properties on the object are: "parse" if the HTML
- // string should be parsed for widgets (dojo.require("dojo.parser") to get that
- // option to work), and "templateFunc" if a template function besides dojo.string.substitute
- // should be used to transform the "template".
- // position:
- // can be one of:
- // | "last"||"end" (default)
- // | "first||"start"
- // | "before"
- // | "after"
- // | "replace" (replaces nodes in this NodeList with new content)
- // | "only" (removes other children of the nodes so new content is the only child)
- // or an offset in the childNodes property
- // example:
- // appends content to the end if the position is omitted
- // | dojo.query("h3 > p").addContent("hey there!");
- // example:
- // add something to the front of each element that has a
- // "thinger" property:
- // | dojo.query("[thinger]").addContent("...", "first");
- // example:
- // adds a header before each element of the list
- // | dojo.query(".note").addContent("<h4>NOTE:</h4>", "before");
- // example:
- // add a clone of a DOM node to the end of every element in
- // the list, removing it from its existing parent.
- // | dojo.query(".note").addContent(dojo.byId("foo"));
- // example:
- // Append nodes from a templatized string.
- // dojo.require("dojo.string");
- // dojo.query(".note").addContent({
- // template: '<b>${id}: </b><span>${name}</span>',
- // id: "user332",
- // name: "Mr. Anderson"
- // });
- // example:
- // Append nodes from a templatized string that also has widgets parsed.
- // dojo.require("dojo.string");
- // dojo.require("dojo.parser");
- // var notes = dojo.query(".note").addContent({
- // template: '<button dojoType="dijit.form.Button">${text}</button>',
- // parse: true,
- // text: "Send"
- // });
- content = this._normalize(content, this[0]);
- for(var i = 0, node; (node = this[i]); i++){
- this._place(content, node, position, i > 0);
+ // we don't clone functions for performance reasons
+ // }else if(d.isFunction(src)){
+ // // function
+ // r = function(){ return src.apply(this, arguments); };
+ }else{
+ // generic objects
+ r = src.constructor ? new src.constructor() : {};
}
- return this; //dojo.NodeList
+ return lang._mixin(r, src, clone);
},
- instantiate: function(/*String|Object*/ declaredClass, /*Object?*/ properties){
- // summary:
- // Create a new instance of a specified class, using the
- // specified properties and each node in the nodeList as a
- // srcNodeRef.
- // example:
- // Grabs all buttons in the page and converts them to diji.form.Buttons.
- // | var buttons = dojo.query("button").instantiate("dijit.form.Button", {showLabel: true});
- var c = d.isFunction(declaredClass) ? declaredClass : d.getObject(declaredClass);
- properties = properties || {};
- return this.forEach(function(node){
- new c(properties, node);
- }); // dojo.NodeList
- },
-
- at: function(/*===== index =====*/){
- // summary:
- // Returns a new NodeList comprised of items in this NodeList
- // at the given index or indices.
- //
- // index: Integer...
- // One or more 0-based indices of items in the current
- // NodeList. A negative index will start at the end of the
- // list and go backwards.
- //
- // example:
- // Shorten the list to the first, second, and third elements
- // | dojo.query("a").at(0, 1, 2).forEach(fn);
- //
- // example:
- // Retrieve the first and last elements of a unordered list:
- // | dojo.query("ul > li").at(0, -1).forEach(cb);
- //
- // example:
- // Do something for the first element only, but end() out back to
- // the original list and continue chaining:
- // | dojo.query("a").at(0).onclick(fn).end().forEach(function(n){
- // | console.log(n); // all anchors on the page.
- // | })
- //
- // returns:
- // dojo.NodeList
- var t = new this._NodeListCtor();
- d.forEach(arguments, function(i){
- if(i < 0){ i = this.length + i }
- if(this[i]){ t.push(this[i]); }
- }, this);
- return t._stash(this); // dojo.NodeList
- }
-
- });
- nl.events = [
- // summary:
- // list of all DOM events used in NodeList
- "blur", "focus", "change", "click", "error", "keydown", "keypress",
- "keyup", "load", "mousedown", "mouseenter", "mouseleave", "mousemove",
- "mouseout", "mouseover", "mouseup", "submit"
- ];
-
- // FIXME: pseudo-doc the above automatically generated on-event functions
+ trim = String.prototype.trim ?
+ function(str){ return str.trim(); } :
+ function(str){ return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); },
- // syntactic sugar for DOM events
- d.forEach(nl.events, function(evt){
- var _oe = "on" + evt;
- nlp[_oe] = function(a, b){
- return this.connect(_oe, a, b);
- };
- // FIXME: should these events trigger publishes?
- /*
- return (a ? this.connect(_oe, a, b) :
- this.forEach(function(n){
- // FIXME:
- // listeners get buried by
- // addEventListener and can't be dug back
- // out to be triggered externally.
- // see:
- // http://developer.mozilla.org/en/docs/DOM:element
- console.log(n, evt, _oe);
-
- // FIXME: need synthetic event support!
- var _e = { target: n, faux: true, type: evt };
- // dojo._event_listener._synthesizeEvent({}, { target: n, faux: true, type: evt });
- try{ n[evt](_e); }catch(e){ console.log(e); }
- try{ n[_oe](_e); }catch(e){ console.log(e); }
- })
- );
- */
- }
- );
-
-})();
-
-}
+ _pattern = /\{([^\}]+)\}/g,
-if(!dojo._hasResource["dojo._base.query"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.query"] = true;
-(function(){
-
-/*
- dojo.query() architectural overview:
-
- dojo.query is a relatively full-featured CSS3 query library. It is
- designed to take any valid CSS3 selector and return the nodes matching
- the selector. To do this quickly, it processes queries in several
- steps, applying caching where profitable.
-
- The steps (roughly in reverse order of the way they appear in the code):
- 1.) check to see if we already have a "query dispatcher"
- - if so, use that with the given parameterization. Skip to step 4.
- 2.) attempt to determine which branch to dispatch the query to:
- - JS (optimized DOM iteration)
- - native (FF3.1+, Safari 3.1+, IE 8+)
- 3.) tokenize and convert to executable "query dispatcher"
- - this is where the lion's share of the complexity in the
- system lies. In the DOM version, the query dispatcher is
- assembled as a chain of "yes/no" test functions pertaining to
- a section of a simple query statement (".blah:nth-child(odd)"
- but not "div div", which is 2 simple statements). Individual
- statement dispatchers are cached (to prevent re-definition)
- as are entire dispatch chains (to make re-execution of the
- same query fast)
- 4.) the resulting query dispatcher is called in the passed scope
- (by default the top-level document)
- - for DOM queries, this results in a recursive, top-down
- evaluation of nodes based on each simple query section
- - for native implementations, this may mean working around spec
- bugs. So be it.
- 5.) matched nodes are pruned to ensure they are unique (if necessary)
-*/
-
-var defineQuery= function(d){
- // define everything in a closure for compressability reasons. "d" is an
- // alias to "dojo" (or the toolkit alias object, e.g., "acme").
-
- ////////////////////////////////////////////////////////////////////////
- // Toolkit aliases
- ////////////////////////////////////////////////////////////////////////
-
- // if you are extracting dojo.query for use in your own system, you will
- // need to provide these methods and properties. No other porting should be
- // necessary, save for configuring the system to use a class other than
- // dojo.NodeList as the return instance instantiator
- var trim = d.trim;
- var each = d.forEach;
- // d.isIE; // float
- // d.isSafari; // float
- // d.isOpera; // float
- // d.isWebKit; // float
- // d.doc ; // document element
- var qlc = (d._NodeListCtor = d.NodeList);
-
- var getDoc = function(){ return d.doc; };
- // NOTE(alex): the spec is idiotic. CSS queries should ALWAYS be case-sensitive, but nooooooo
- var cssCaseBug = ((d.isWebKit||d.isMozilla) && ((getDoc().compatMode) == "BackCompat"));
-
- ////////////////////////////////////////////////////////////////////////
- // Global utilities
- ////////////////////////////////////////////////////////////////////////
-
-
- // on browsers that support the "children" collection we can avoid a lot of
- // iteration on chaff (non-element) nodes.
- // why.
- var childNodesName = !!getDoc().firstChild["children"] ? "children" : "childNodes";
-
- var specials = ">~+";
+ replace = function(tmpl, map, pattern){
+ return tmpl.replace(pattern || _pattern, lang.isFunction(map) ?
+ map : function(_, k){ return getObject(k, false, map); });
+ },
- // global thunk to determine whether we should treat the current query as
- // case sensitive or not. This switch is flipped by the query evaluator
- // based on the document passed as the context to search.
- var caseSensitive = false;
+ lang = {
+ _extraNames:_extraNames,
+ _mixin:_mixin,
+ mixin:mixin,
+ setObject:setObject,
+ getObject:getObject,
+ exists:exists,
+ isString:isString,
+ isArray:isArray,
+ isFunction:isFunction,
+ isObject:isObject,
+ isArrayLike:isArrayLike,
+ isAlien:isAlien,
+ extend:extend,
+ _hitchArgs:_hitchArgs,
+ hitch:hitch,
+ delegate:delegate,
+ _toArray:_toArray,
+ partial:partial,
+ clone:clone,
+ trim:trim,
+ replace:replace
+ };
- // how high?
- var yesman = function(){ return true; };
+ 1 && mixin(dojo, lang);
+ return lang;
- ////////////////////////////////////////////////////////////////////////
- // Tokenizer
- ////////////////////////////////////////////////////////////////////////
+ /*=====
+ dojo._extraNames
+ // summary:
+ // Array of strings. Lists property names that must be explicitly processed during for-in interation
+ // in environments that have has("bug-for-in-skips-shadowed") true.
+ =====*/
- var getQueryParts = function(query){
+ /*=====
+ dojo._mixin = function(dest, source, copyFunc){
// summary:
- // state machine for query tokenization
+ // Copies/adds all properties of source to dest; returns dest.
+ // dest: Object:
+ // The object to which to copy/add all properties contained in source.
+ // source: Object:
+ // The object from which to draw all properties to copy into dest.
+ // copyFunc: Function?:
+ // The process used to copy/add a property in source; defaults to the Javascript assignment operator.
+ // returns:
+ // dest, as modified
// description:
- // instead of using a brittle and slow regex-based CSS parser,
- // dojo.query implements an AST-style query representation. This
- // representation is only generated once per query. For example,
- // the same query run multiple times or under different root nodes
- // does not re-parse the selector expression but instead uses the
- // cached data structure. The state machine implemented here
- // terminates on the last " " (space) character and returns an
- // ordered array of query component structures (or "parts"). Each
- // part represents an operator or a simple CSS filtering
- // expression. The structure for parts is documented in the code
- // below.
-
-
- // NOTE:
- // this code is designed to run fast and compress well. Sacrifices
- // to readability and maintainability have been made. Your best
- // bet when hacking the tokenizer is to put The Donnas on *really*
- // loud (may we recommend their "Spend The Night" release?) and
- // just assume you're gonna make mistakes. Keep the unit tests
- // open and run them frequently. Knowing is half the battle ;-)
- if(specials.indexOf(query.slice(-1)) >= 0){
- // if we end with a ">", "+", or "~", that means we're implicitly
- // searching all children, so make it explicit
- query += " * "
- }else{
- // if you have not provided a terminator, one will be provided for
- // you...
- query += " ";
- }
-
- var ts = function(/*Integer*/ s, /*Integer*/ e){
- // trim and slice.
-
- // take an index to start a string slice from and an end position
- // and return a trimmed copy of that sub-string
- return trim(query.slice(s, e));
- }
-
- // the overall data graph of the full query, as represented by queryPart objects
- var queryParts = [];
-
-
- // state keeping vars
- var inBrackets = -1, inParens = -1, inMatchFor = -1,
- inPseudo = -1, inClass = -1, inId = -1, inTag = -1,
- lc = "", cc = "", pStart;
+ // All properties, including functions (sometimes termed "methods"), excluding any non-standard extensions
+ // found in Object.prototype, are copied/added to dest. Copying/adding each particular property is
+ // delegated to copyFunc (if any); copyFunc defaults to the Javascript assignment operator if not provided.
+ // Notice that by default, _mixin executes a so-called "shallow copy" and aggregate types are copied/added by reference.
+ }
+ =====*/
- // iteration vars
- var x = 0, // index in the query
- ql = query.length,
- currentPart = null, // data structure representing the entire clause
- _cp = null; // the current pseudo or attr matcher
+ /*=====
+ dojo.mixin = function(dest, sources){
+ // summary:
+ // Copies/adds all properties of one or more sources to dest; returns dest.
+ // dest: Object
+ // The object to which to copy/add all properties contained in source. If dest is falsy, then
+ // a new object is manufactured before copying/adding properties begins.
+ // sources: Object...
+ // One of more objects from which to draw all properties to copy into dest. sources are processed
+ // left-to-right and if more than one of these objects contain the same property name, the right-most
+ // value "wins".
+ // returns: Object
+ // dest, as modified
+ // description:
+ // All properties, including functions (sometimes termed "methods"), excluding any non-standard extensions
+ // found in Object.prototype, are copied/added from sources to dest. sources are processed left to right.
+ // The Javascript assignment operator is used to copy/add each property; therefore, by default, mixin
+ // executes a so-called "shallow copy" and aggregate types are copied/added by reference.
+ // example:
+ // make a shallow copy of an object
+ // | var copy = lang.mixin({}, source);
+ // example:
+ // many class constructors often take an object which specifies
+ // values to be configured on the object. In this case, it is
+ // often simplest to call `lang.mixin` on the `this` object:
+ // | dojo.declare("acme.Base", null, {
+ // | constructor: function(properties){
+ // | // property configuration:
+ // | lang.mixin(this, properties);
+ // |
+ // | console.log(this.quip);
+ // | // ...
+ // | },
+ // | quip: "I wasn't born yesterday, you know - I've seen movies.",
+ // | // ...
+ // | });
+ // |
+ // | // create an instance of the class and configure it
+ // | var b = new acme.Base({quip: "That's what it does!" });
+ // example:
+ // copy in properties from multiple objects
+ // | var flattened = lang.mixin(
+ // | {
+ // | name: "Frylock",
+ // | braces: true
+ // | },
+ // | {
+ // | name: "Carl Brutanananadilewski"
+ // | }
+ // | );
+ // |
+ // | // will print "Carl Brutanananadilewski"
+ // | console.log(flattened.name);
+ // | // will print "true"
+ // | console.log(flattened.braces);
+ }
+ =====*/
- // several temporary variables are assigned to this structure during a
- // potential sub-expression match:
- // attr:
- // a string representing the current full attribute match in a
- // bracket expression
- // type:
- // if there's an operator in a bracket expression, this is
- // used to keep track of it
- // value:
- // the internals of parenthetical expression for a pseudo. for
- // :nth-child(2n+1), value might be "2n+1"
+ /*=====
+ dojo.setObject = function(name, value, context){
+ // summary:
+ // Set a property from a dot-separated string, such as "A.B.C"
+ // description:
+ // Useful for longer api chains where you have to test each object in
+ // the chain, or when you have an object reference in string format.
+ // Objects are created as needed along `path`. Returns the passed
+ // value if setting is successful or `undefined` if not.
+ // name: String
+ // Path to a property, in the form "A.B.C".
+ // value: anything
+ // value or object to place at location given by name
+ // context: Object?
+ // Optional. Object to use as root of path. Defaults to
+ // `dojo.global`.
+ // example:
+ // set the value of `foo.bar.baz`, regardless of whether
+ // intermediate objects already exist:
+ // | lang.setObject("foo.bar.baz", value);
+ // example:
+ // without `lang.setObject`, we often see code like this:
+ // | // ensure that intermediate objects are available
+ // | if(!obj["parent"]){ obj.parent = {}; }
+ // | if(!obj.parent["child"]){ obj.parent.child = {}; }
+ // | // now we can safely set the property
+ // | obj.parent.child.prop = "some value";
+ // whereas with `lang.setObject`, we can shorten that to:
+ // | lang.setObject("parent.child.prop", "some value", obj);
+ }
+ =====*/
- var endTag = function(){
- // called when the tokenizer hits the end of a particular tag name.
- // Re-sets state variables for tag matching and sets up the matcher
- // to handle the next type of token (tag or operator).
- if(inTag >= 0){
- var tv = (inTag == x) ? null : ts(inTag, x); // .toLowerCase();
- currentPart[ (specials.indexOf(tv) < 0) ? "tag" : "oper" ] = tv;
- inTag = -1;
- }
- }
+ /*=====
+ dojo.getObject = function(name, create, context){
+ // summary:
+ // Get a property from a dot-separated string, such as "A.B.C"
+ // description:
+ // Useful for longer api chains where you have to test each object in
+ // the chain, or when you have an object reference in string format.
+ // name: String
+ // Path to an property, in the form "A.B.C".
+ // create: Boolean?
+ // Optional. Defaults to `false`. If `true`, Objects will be
+ // created at any point along the 'path' that is undefined.
+ // context: Object?
+ // Optional. Object to use as root of path. Defaults to
+ // 'dojo.global'. Null may be passed.
+ }
+ =====*/
- var endId = function(){
- // called when the tokenizer might be at the end of an ID portion of a match
- if(inId >= 0){
- currentPart.id = ts(inId, x).replace(/\\/g, "");
- inId = -1;
- }
- }
+ /*=====
+ dojo.exists = function(name, obj){
+ // summary:
+ // determine if an object supports a given method
+ // description:
+ // useful for longer api chains where you have to test each object in
+ // the chain. Useful for object and method detection.
+ // name: String
+ // Path to an object, in the form "A.B.C".
+ // obj: Object?
+ // Object to use as root of path. Defaults to
+ // 'dojo.global'. Null may be passed.
+ // example:
+ // | // define an object
+ // | var foo = {
+ // | bar: { }
+ // | };
+ // |
+ // | // search the global scope
+ // | lang.exists("foo.bar"); // true
+ // | lang.exists("foo.bar.baz"); // false
+ // |
+ // | // search from a particular scope
+ // | lang.exists("bar", foo); // true
+ // | lang.exists("bar.baz", foo); // false
+ }
+ =====*/
- var endClass = function(){
- // called when the tokenizer might be at the end of a class name
- // match. CSS allows for multiple classes, so we augment the
- // current item with another class in its list
- if(inClass >= 0){
- currentPart.classes.push(ts(inClass+1, x).replace(/\\/g, ""));
- inClass = -1;
- }
- }
+ /*=====
+ dojo.isString = function(it){
+ // summary:
+ // Return true if it is a String
+ // it: anything
+ // Item to test.
+ }
+ =====*/
- var endAll = function(){
- // at the end of a simple fragment, so wall off the matches
- endId(); endTag(); endClass();
- }
+ /*=====
+ dojo.isArray = function(it){
+ // summary:
+ // Return true if it is an Array.
+ // Does not work on Arrays created in other windows.
+ // it: anything
+ // Item to test.
+ }
+ =====*/
- var endPart = function(){
- endAll();
- if(inPseudo >= 0){
- currentPart.pseudos.push({ name: ts(inPseudo+1, x) });
- }
- // hint to the selector engine to tell it whether or not it
- // needs to do any iteration. Many simple selectors don't, and
- // we can avoid significant construction-time work by advising
- // the system to skip them
- currentPart.loops = (
- currentPart.pseudos.length ||
- currentPart.attrs.length ||
- currentPart.classes.length );
+ /*=====
+ dojo.isFunction = function(it){
+ // summary:
+ // Return true if it is a Function
+ // it: anything
+ // Item to test.
+ }
+ =====*/
- currentPart.oquery = currentPart.query = ts(pStart, x); // save the full expression as a string
+ /*=====
+ dojo.isObject = function(it){
+ // summary:
+ // Returns true if it is a JavaScript object (or an Array, a Function
+ // or null)
+ // it: anything
+ // Item to test.
+ }
+ =====*/
+ /*=====
+ dojo.isArrayLike = function(it){
+ // summary:
+ // similar to dojo.isArray() but more permissive
+ // it: anything
+ // Item to test.
+ // returns:
+ // If it walks like a duck and quacks like a duck, return `true`
+ // description:
+ // Doesn't strongly test for "arrayness". Instead, settles for "isn't
+ // a string or number and has a length property". Arguments objects
+ // and DOM collections will return true when passed to
+ // dojo.isArrayLike(), but will return false when passed to
+ // dojo.isArray().
+ }
+ =====*/
- // otag/tag are hints to suggest to the system whether or not
- // it's an operator or a tag. We save a copy of otag since the
- // tag name is cast to upper-case in regular HTML matches. The
- // system has a global switch to figure out if the current
- // expression needs to be case sensitive or not and it will use
- // otag or tag accordingly
- currentPart.otag = currentPart.tag = (currentPart["oper"]) ? null : (currentPart.tag || "*");
+ /*=====
+ dojo.isAlien = function(it){
+ // summary:
+ // Returns true if it is a built-in function or some other kind of
+ // oddball that *should* report as a function but doesn't
+ }
+ =====*/
- if(currentPart.tag){
- // if we're in a case-insensitive HTML doc, we likely want
- // the toUpperCase when matching on element.tagName. If we
- // do it here, we can skip the string op per node
- // comparison
- currentPart.tag = currentPart.tag.toUpperCase();
- }
-
- // add the part to the list
- if(queryParts.length && (queryParts[queryParts.length-1].oper)){
- // operators are always infix, so we remove them from the
- // list and attach them to the next match. The evaluator is
- // responsible for sorting out how to handle them.
- currentPart.infixOper = queryParts.pop();
- currentPart.query = currentPart.infixOper.query + " " + currentPart.query;
- /*
- console.debug( "swapping out the infix",
- currentPart.infixOper,
- "and attaching it to",
- currentPart);
- */
- }
- queryParts.push(currentPart);
-
- currentPart = null;
- }
-
- // iterate over the query, character by character, building up a
- // list of query part objects
- for(; lc=cc, cc=query.charAt(x), x < ql; x++){
- // cc: the current character in the match
- // lc: the last character (if any)
-
- // someone is trying to escape something, so don't try to match any
- // fragments. We assume we're inside a literal.
- if(lc == "\\"){ continue; }
- if(!currentPart){ // a part was just ended or none has yet been created
- // NOTE: I hate all this alloc, but it's shorter than writing tons of if's
- pStart = x;
- // rules describe full CSS sub-expressions, like:
- // #someId
- // .className:first-child
- // but not:
- // thinger > div.howdy[type=thinger]
- // the indidual components of the previous query would be
- // split into 3 parts that would be represented a structure
- // like:
- // [
- // {
- // query: "thinger",
- // tag: "thinger",
- // },
- // {
- // query: "div.howdy[type=thinger]",
- // classes: ["howdy"],
- // infixOper: {
- // query: ">",
- // oper: ">",
- // }
- // },
- // ]
- currentPart = {
- query: null, // the full text of the part's rule
- pseudos: [], // CSS supports multiple pseud-class matches in a single rule
- attrs: [], // CSS supports multi-attribute match, so we need an array
- classes: [], // class matches may be additive, e.g.: .thinger.blah.howdy
- tag: null, // only one tag...
- oper: null, // ...or operator per component. Note that these wind up being exclusive.
- id: null, // the id component of a rule
- getTag: function(){
- return (caseSensitive) ? this.otag : this.tag;
- }
- };
+ /*=====
+ dojo.extend = function(constructor, props){
+ // summary:
+ // Adds all properties and methods of props to constructor's
+ // prototype, making them available to all instances created with
+ // constructor.
+ // constructor: Object
+ // Target constructor to extend.
+ // props: Object...
+ // One or more objects to mix into constructor.prototype
+ }
+ =====*/
- // if we don't have a part, we assume we're going to start at
- // the beginning of a match, which should be a tag name. This
- // might fault a little later on, but we detect that and this
- // iteration will still be fine.
- inTag = x;
- }
-
- if(inBrackets >= 0){
- // look for a the close first
- if(cc == "]"){ // if we're in a [...] clause and we end, do assignment
- if(!_cp.attr){
- // no attribute match was previously begun, so we
- // assume this is an attribute existence match in the
- // form of [someAttributeName]
- _cp.attr = ts(inBrackets+1, x);
- }else{
- // we had an attribute already, so we know that we're
- // matching some sort of value, as in [attrName=howdy]
- _cp.matchFor = ts((inMatchFor||inBrackets+1), x);
- }
- var cmf = _cp.matchFor;
- if(cmf){
- // try to strip quotes from the matchFor value. We want
- // [attrName=howdy] to match the same
- // as [attrName = 'howdy' ]
- if( (cmf.charAt(0) == '"') || (cmf.charAt(0) == "'") ){
- _cp.matchFor = cmf.slice(1, -1);
- }
- }
- // end the attribute by adding it to the list of attributes.
- currentPart.attrs.push(_cp);
- _cp = null; // necessary?
- inBrackets = inMatchFor = -1;
- }else if(cc == "="){
- // if the last char was an operator prefix, make sure we
- // record it along with the "=" operator.
- var addToCc = ("|~^$*".indexOf(lc) >=0 ) ? lc : "";
- _cp.type = addToCc+cc;
- _cp.attr = ts(inBrackets+1, x-addToCc.length);
- inMatchFor = x+1;
- }
- // now look for other clause parts
- }else if(inParens >= 0){
- // if we're in a parenthetical expression, we need to figure
- // out if it's attached to a pseudo-selector rule like
- // :nth-child(1)
- if(cc == ")"){
- if(inPseudo >= 0){
- _cp.value = ts(inParens+1, x);
- }
- inPseudo = inParens = -1;
- }
- }else if(cc == "#"){
- // start of an ID match
- endAll();
- inId = x+1;
- }else if(cc == "."){
- // start of a class match
- endAll();
- inClass = x;
- }else if(cc == ":"){
- // start of a pseudo-selector match
- endAll();
- inPseudo = x;
- }else if(cc == "["){
- // start of an attribute match.
- endAll();
- inBrackets = x;
- // provide a new structure for the attribute match to fill-in
- _cp = {
- /*=====
- attr: null, type: null, matchFor: null
- =====*/
- };
- }else if(cc == "("){
- // we really only care if we've entered a parenthetical
- // expression if we're already inside a pseudo-selector match
- if(inPseudo >= 0){
- // provide a new structure for the pseudo match to fill-in
- _cp = {
- name: ts(inPseudo+1, x),
- value: null
- }
- currentPart.pseudos.push(_cp);
- }
- inParens = x;
- }else if(
- (cc == " ") &&
- // if it's a space char and the last char is too, consume the
- // current one without doing more work
- (lc != cc)
- ){
- endPart();
- }
- }
- return queryParts;
- };
-
+ /*=====
+ dojo.hitch = function(scope, method){
+ // summary:
+ // Returns a function that will only ever execute in the a given scope.
+ // This allows for easy use of object member functions
+ // in callbacks and other places in which the "this" keyword may
+ // otherwise not reference the expected scope.
+ // Any number of default positional arguments may be passed as parameters
+ // beyond "method".
+ // Each of these values will be used to "placehold" (similar to curry)
+ // for the hitched function.
+ // scope: Object
+ // The scope to use when method executes. If method is a string,
+ // scope is also the object containing method.
+ // method: Function|String...
+ // A function to be hitched to scope, or the name of the method in
+ // scope to be hitched.
+ // example:
+ // | dojo.hitch(foo, "bar")();
+ // runs foo.bar() in the scope of foo
+ // example:
+ // | dojo.hitch(foo, myFunction);
+ // returns a function that runs myFunction in the scope of foo
+ // example:
+ // Expansion on the default positional arguments passed along from
+ // hitch. Passed args are mixed first, additional args after.
+ // | var foo = { bar: function(a, b, c){ console.log(a, b, c); } };
+ // | var fn = dojo.hitch(foo, "bar", 1, 2);
+ // | fn(3); // logs "1, 2, 3"
+ // example:
+ // | var foo = { bar: 2 };
+ // | dojo.hitch(foo, function(){ this.bar = 10; })();
+ // execute an anonymous function in scope of foo
+ }
+ =====*/
- ////////////////////////////////////////////////////////////////////////
- // DOM query infrastructure
- ////////////////////////////////////////////////////////////////////////
+ /*=====
+ dojo.delegate = function(obj, props){
+ // summary:
+ // Returns a new object which "looks" to obj for properties which it
+ // does not have a value for. Optionally takes a bag of properties to
+ // seed the returned object with initially.
+ // description:
+ // This is a small implementaton of the Boodman/Crockford delegation
+ // pattern in JavaScript. An intermediate object constructor mediates
+ // the prototype chain for the returned object, using it to delegate
+ // down to obj for property lookup when object-local lookup fails.
+ // This can be thought of similarly to ES4's "wrap", save that it does
+ // not act on types but rather on pure objects.
+ // obj: Object
+ // The object to delegate to for properties not found directly on the
+ // return object or in props.
+ // props: Object...
+ // an object containing properties to assign to the returned object
+ // returns:
+ // an Object of anonymous type
+ // example:
+ // | var foo = { bar: "baz" };
+ // | var thinger = dojo.delegate(foo, { thud: "xyzzy"});
+ // | thinger.bar == "baz"; // delegated to foo
+ // | foo.thud == undefined; // by definition
+ // | thinger.thud == "xyzzy"; // mixed in from props
+ // | foo.bar = "thonk";
+ // | thinger.bar == "thonk"; // still delegated to foo's bar
+ }
+ =====*/
- var agree = function(first, second){
- // the basic building block of the yes/no chaining system. agree(f1,
- // f2) generates a new function which returns the boolean results of
- // both of the passed functions to a single logical-anded result. If
- // either are not passed, the other is used exclusively.
- if(!first){ return second; }
- if(!second){ return first; }
+ /*=====
+ dojo.partial = function(method){
+ // summary:
+ // similar to hitch() except that the scope object is left to be
+ // whatever the execution context eventually becomes.
+ // method: Function|String
+ // description:
+ // Calling dojo.partial is the functional equivalent of calling:
+ // | dojo.hitch(null, funcName, ...);
+ }
+ =====*/
- return function(){
- return first.apply(window, arguments) && second.apply(window, arguments);
- }
- };
+ /*=====
+ dojo.trim = function(str){
+ // summary:
+ // Trims whitespace from both sides of the string
+ // str: String
+ // String to be trimmed
+ // returns: String
+ // Returns the trimmed string
+ // description:
+ // This version of trim() was selected for inclusion into the base due
+ // to its compact size and relatively good performance
+ // (see [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript)
+ // Uses String.prototype.trim instead, if available.
+ // The fastest but longest version of this function is located at
+ // dojo.string.trim()
+ }
+ =====*/
- var getArr = function(i, arr){
- // helps us avoid array alloc when we don't need it
- var r = arr||[]; // FIXME: should this be 'new d._NodeListCtor()' ?
- if(i){ r.push(i); }
- return r;
- };
+ /*=====
+ dojo.clone = function(src){
+ // summary:
+ // Clones objects (including DOM nodes) and all children.
+ // Warning: do not clone cyclic structures.
+ // src:
+ // The object to clone
+ }
+ =====*/
- var _isElement = function(n){ return (1 == n.nodeType); };
+ /*=====
+ dojo._toArray = function(obj, offset, startWith){
+ // summary:
+ // Converts an array-like object (i.e. arguments, DOMCollection) to an
+ // array. Returns a new Array with the elements of obj.
+ // obj: Object
+ // the object to "arrayify". We expect the object to have, at a
+ // minimum, a length property which corresponds to integer-indexed
+ // properties.
+ // offset: Number?
+ // the location in obj to start iterating from. Defaults to 0.
+ // Optional.
+ // startWith: Array?
+ // An array to pack with the properties of obj. If provided,
+ // properties in obj are appended at the end of startWith and
+ // startWith is the returned array.
+ }
+ =====*/
- // FIXME: need to coalesce _getAttr with defaultGetter
- var blank = "";
- var _getAttr = function(elem, attr){
- if(!elem){ return blank; }
- if(attr == "class"){
- return elem.className || blank;
- }
- if(attr == "for"){
- return elem.htmlFor || blank;
- }
- if(attr == "style"){
- return elem.style.cssText || blank;
- }
- return (caseSensitive ? elem.getAttribute(attr) : elem.getAttribute(attr, 2)) || blank;
- };
+ /*=====
+ dojo.replace = function(tmpl, map, pattern){
+ // summary:
+ // Performs parameterized substitutions on a string. Throws an
+ // exception if any parameter is unmatched.
+ // tmpl: String
+ // String to be used as a template.
+ // map: Object|Function
+ // If an object, it is used as a dictionary to look up substitutions.
+ // If a function, it is called for every substitution with following
+ // parameters: a whole match, a name, an offset, and the whole template
+ // string (see https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace
+ // for more details).
+ // pattern: RegEx?
+ // Optional regular expression objects that overrides the default pattern.
+ // Must be global and match one item. The default is: /\{([^\}]+)\}/g,
+ // which matches patterns like that: "{xxx}", where "xxx" is any sequence
+ // of characters, which doesn't include "}".
+ // returns: String
+ // Returns the substituted string.
+ // example:
+ // | // uses a dictionary for substitutions:
+ // | dojo.replace("Hello, {name.first} {name.last} AKA {nick}!",
+ // | {
+ // | nick: "Bob",
+ // | name: {
+ // | first: "Robert",
+ // | middle: "X",
+ // | last: "Cringely"
+ // | }
+ // | });
+ // | // returns: Hello, Robert Cringely AKA Bob!
+ // example:
+ // | // uses an array for substitutions:
+ // | dojo.replace("Hello, {0} {2}!",
+ // | ["Robert", "X", "Cringely"]);
+ // | // returns: Hello, Robert Cringely!
+ // example:
+ // | // uses a function for substitutions:
+ // | function sum(a){
+ // | var t = 0;
+ // | dojo.forEach(a, function(x){ t += x; });
+ // | return t;
+ // | }
+ // | dojo.replace(
+ // | "{count} payments averaging {avg} USD per payment.",
+ // | dojo.hitch(
+ // | { payments: [11, 16, 12] },
+ // | function(_, key){
+ // | switch(key){
+ // | case "count": return this.payments.length;
+ // | case "min": return Math.min.apply(Math, this.payments);
+ // | case "max": return Math.max.apply(Math, this.payments);
+ // | case "sum": return sum(this.payments);
+ // | case "avg": return sum(this.payments) / this.payments.length;
+ // | }
+ // | }
+ // | )
+ // | );
+ // | // prints: 3 payments averaging 13 USD per payment.
+ // example:
+ // | // uses an alternative PHP-like pattern for substitutions:
+ // | dojo.replace("Hello, ${0} ${2}!",
+ // | ["Robert", "X", "Cringely"], /\$\{([^\}]+)\}/g);
+ // | // returns: Hello, Robert Cringely!
+ return ""; // String
+ }
+ =====*/
+});
- var attrs = {
- "*=": function(attr, value){
- return function(elem){
- // E[foo*="bar"]
- // an E element whose "foo" attribute value contains
- // the substring "bar"
- return (_getAttr(elem, attr).indexOf(value)>=0);
- }
- },
- "^=": function(attr, value){
- // E[foo^="bar"]
- // an E element whose "foo" attribute value begins exactly
- // with the string "bar"
- return function(elem){
- return (_getAttr(elem, attr).indexOf(value)==0);
- }
- },
- "$=": function(attr, value){
- // E[foo$="bar"]
- // an E element whose "foo" attribute value ends exactly
- // with the string "bar"
- var tval = " "+value;
- return function(elem){
- var ea = " "+_getAttr(elem, attr);
- return (ea.lastIndexOf(value)==(ea.length-value.length));
- }
- },
- "~=": function(attr, value){
- // E[foo~="bar"]
- // an E element whose "foo" attribute value is a list of
- // space-separated values, one of which is exactly equal
- // to "bar"
- // return "[contains(concat(' ',@"+attr+",' '), ' "+ value +" ')]";
- var tval = " "+value+" ";
- return function(elem){
- var ea = " "+_getAttr(elem, attr)+" ";
- return (ea.indexOf(tval)>=0);
- }
- },
- "|=": function(attr, value){
- // E[hreflang|="en"]
- // an E element whose "hreflang" attribute has a
- // hyphen-separated list of values beginning (from the
- // left) with "en"
- var valueDash = " "+value+"-";
- return function(elem){
- var ea = " "+_getAttr(elem, attr);
- return (
- (ea == value) ||
- (ea.indexOf(valueDash)==0)
- );
- }
+},
+'dojo/Evented':function(){
+define(["./aspect", "./on"], function(aspect, on){
+ // summary:
+ // The export of this module is a class that can be used as a mixin or base class,
+ // to add on() and emit() methods to a class
+ // for listening for events and emiting events:
+ // |define(["dojo/Evented"], function(Evented){
+ // | var EventedWidget = dojo.declare([Evented, dijit._Widget], {...});
+ // | widget = new EventedWidget();
+ // | widget.on("open", function(event){
+ // | ... do something with event
+ // | });
+ // |
+ // | widget.emit("open", {name:"some event", ...});
+
+ "use strict";
+ var after = aspect.after;
+ function Evented(){
+ }
+ Evented.prototype = {
+ on: function(type, listener){
+ return on.parse(this, type, listener, function(target, type){
+ return after(target, 'on' + type, listener, true);
+ });
},
- "=": function(attr, value){
- return function(elem){
- return (_getAttr(elem, attr) == value);
- }
+ emit: function(type, event){
+ var args = [this];
+ args.push.apply(args, arguments);
+ return on.emit.apply(on, args);
}
};
+ return Evented;
+});
- // avoid testing for node type if we can. Defining this in the negative
- // here to avoid negation in the fast path.
- var _noNES = (typeof getDoc().firstChild.nextElementSibling == "undefined");
- var _ns = !_noNES ? "nextElementSibling" : "nextSibling";
- var _ps = !_noNES ? "previousElementSibling" : "previousSibling";
- var _simpleNodeTest = (_noNES ? _isElement : yesman);
-
- var _lookLeft = function(node){
- // look left
- while(node = node[_ps]){
- if(_simpleNodeTest(node)){ return false; }
- }
- return true;
- };
+},
+'dojo/mouse':function(){
+define(["./_base/kernel", "./on", "./has", "./dom", "./_base/window"], function(dojo, on, has, dom, win){
- var _lookRight = function(node){
- // look right
- while(node = node[_ns]){
- if(_simpleNodeTest(node)){ return false; }
- }
- return true;
+ /*=====
+ dojo.mouse = {
+ // summary:
+ // This module provide mouse event handling utility functions and exports
+ // mouseenter and mouseleave event emulation.
+ // enter: Synthetic Event
+ // This is an extension event for the mouseenter that IE provides, emulating the
+ // behavior on other browsers.
+ // leave: Synthetic Event
+ // This is an extension event for the mouseleave that IE provides, emulating the
+ // behavior on other browsers.
+ // isLeft: Function
+ // Test an event object (from a mousedown event) to see if the left button was pressed.
+ // isMiddle: Function
+ // Test an event object (from a mousedown event) to see if the middle button was pressed.
+ // isRight: Function
+ // Test an event object (from a mousedown event) to see if the right button was pressed.
+ // example:
+ // To use these events, you register a mouseenter like this:
+ // | define(["dojo/on", dojo/mouse"], function(on, mouse){
+ // | on(targetNode, mouse.enter, function(event){
+ // | dojo.addClass(targetNode, "highlighted");
+ // | });
+ // | on(targetNode, mouse.leave, function(event){
+ // | dojo.removeClass(targetNode, "highlighted");
+ // | });
};
+ ======*/
- var getNodeIndex = function(node){
- var root = node.parentNode;
- var i = 0,
- tret = root[childNodesName],
- ci = (node["_i"]||-1),
- cl = (root["_l"]||-1);
-
- if(!tret){ return -1; }
- var l = tret.length;
-
- // we calculate the parent length as a cheap way to invalidate the
- // cache. It's not 100% accurate, but it's much more honest than what
- // other libraries do
- if( cl == l && ci >= 0 && cl >= 0 ){
- // if it's legit, tag and release
- return ci;
- }
+ has.add("dom-quirks", win.doc && win.doc.compatMode == "BackCompat");
+ has.add("events-mouseenter", win.doc && "onmouseenter" in win.doc.createElement("div"));
- // else re-key things
- root["_l"] = l;
- ci = -1;
- for(var te = root["firstElementChild"]||root["firstChild"]; te; te = te[_ns]){
- if(_simpleNodeTest(te)){
- te["_i"] = ++i;
- if(node === te){
- // NOTE:
- // shortcutting the return at this step in indexing works
- // very well for benchmarking but we avoid it here since
- // it leads to potential O(n^2) behavior in sequential
- // getNodexIndex operations on a previously un-indexed
- // parent. We may revisit this at a later time, but for
- // now we just want to get the right answer more often
- // than not.
- ci = i;
- }
- }
- }
- return ci;
- };
-
- var isEven = function(elem){
- return !((getNodeIndex(elem)) % 2);
- };
+ var mouseButtons;
+ if(has("dom-quirks") || !has("dom-addeventlistener")){
+ mouseButtons = {
+ LEFT: 1,
+ MIDDLE: 4,
+ RIGHT: 2,
+ // helper functions
+ isButton: function(e, button){ return e.button & button; },
+ isLeft: function(e){ return e.button & 1; },
+ isMiddle: function(e){ return e.button & 4; },
+ isRight: function(e){ return e.button & 2; }
+ };
+ }else{
+ mouseButtons = {
+ LEFT: 0,
+ MIDDLE: 1,
+ RIGHT: 2,
+ // helper functions
+ isButton: function(e, button){ return e.button == button; },
+ isLeft: function(e){ return e.button == 0; },
+ isMiddle: function(e){ return e.button == 1; },
+ isRight: function(e){ return e.button == 2; }
+ };
+ }
+ dojo.mouseButtons = mouseButtons;
- var isOdd = function(elem){
- return ((getNodeIndex(elem)) % 2);
- };
+/*=====
+ dojo.mouseButtons = {
+ // LEFT: Number
+ // Numeric value of the left mouse button for the platform.
+ LEFT: 0,
+ // MIDDLE: Number
+ // Numeric value of the middle mouse button for the platform.
+ MIDDLE: 1,
+ // RIGHT: Number
+ // Numeric value of the right mouse button for the platform.
+ RIGHT: 2,
- var pseudos = {
- "checked": function(name, condition){
- return function(elem){
- return !!("checked" in elem ? elem.checked : elem.selected);
- }
+ isButton: function(e, button){
+ // summary:
+ // Checks an event object for a pressed button
+ // e: Event
+ // Event object to examine
+ // button: Number
+ // The button value (example: dojo.mouseButton.LEFT)
+ return e.button == button; // Boolean
},
- "first-child": function(){ return _lookLeft; },
- "last-child": function(){ return _lookRight; },
- "only-child": function(name, condition){
- return function(node){
- if(!_lookLeft(node)){ return false; }
- if(!_lookRight(node)){ return false; }
- return true;
- };
+ isLeft: function(e){
+ // summary:
+ // Checks an event object for the pressed left button
+ // e: Event
+ // Event object to examine
+ return e.button == 0; // Boolean
},
- "empty": function(name, condition){
- return function(elem){
- // DomQuery and jQuery get this wrong, oddly enough.
- // The CSS 3 selectors spec is pretty explicit about it, too.
- var cn = elem.childNodes;
- var cnl = elem.childNodes.length;
- // if(!cnl){ return true; }
- for(var x=cnl-1; x >= 0; x--){
- var nt = cn[x].nodeType;
- if((nt === 1)||(nt == 3)){ return false; }
- }
- return true;
- }
+ isMiddle: function(e){
+ // summary:
+ // Checks an event object for the pressed middle button
+ // e: Event
+ // Event object to examine
+ return e.button == 1; // Boolean
},
- "contains": function(name, condition){
- var cz = condition.charAt(0);
- if( cz == '"' || cz == "'" ){ //remove quote
- condition = condition.slice(1, -1);
- }
- return function(elem){
- return (elem.innerHTML.indexOf(condition) >= 0);
- }
- },
- "not": function(name, condition){
- var p = getQueryParts(condition)[0];
- var ignores = { el: 1 };
- if(p.tag != "*"){
- ignores.tag = 1;
- }
- if(!p.classes.length){
- ignores.classes = 1;
- }
- var ntf = getSimpleFilterFunc(p, ignores);
- return function(elem){
- return (!ntf(elem));
- }
- },
- "nth-child": function(name, condition){
- var pi = parseInt;
- // avoid re-defining function objects if we can
- if(condition == "odd"){
- return isOdd;
- }else if(condition == "even"){
- return isEven;
- }
- // FIXME: can we shorten this?
- if(condition.indexOf("n") != -1){
- var tparts = condition.split("n", 2);
- var pred = tparts[0] ? ((tparts[0] == '-') ? -1 : pi(tparts[0])) : 1;
- var idx = tparts[1] ? pi(tparts[1]) : 0;
- var lb = 0, ub = -1;
- if(pred > 0){
- if(idx < 0){
- idx = (idx % pred) && (pred + (idx % pred));
- }else if(idx>0){
- if(idx >= pred){
- lb = idx - idx % pred;
- }
- idx = idx % pred;
- }
- }else if(pred<0){
- pred *= -1;
- // idx has to be greater than 0 when pred is negative;
- // shall we throw an error here?
- if(idx > 0){
- ub = idx;
- idx = idx % pred;
- }
- }
- if(pred > 0){
- return function(elem){
- var i = getNodeIndex(elem);
- return (i>=lb) && (ub<0 || i<=ub) && ((i % pred) == idx);
- }
- }else{
- condition = idx;
- }
- }
- var ncount = pi(condition);
- return function(elem){
- return (getNodeIndex(elem) == ncount);
- }
- }
- };
-
- var defaultGetter = (d.isIE < 9 || (dojo.isIE && dojo.isQuirks)) ? function(cond){
- var clc = cond.toLowerCase();
- if(clc == "class"){ cond = "className"; }
- return function(elem){
- return (caseSensitive ? elem.getAttribute(cond) : elem[cond]||elem[clc]);
- }
- } : function(cond){
- return function(elem){
- return (elem && elem.getAttribute && elem.hasAttribute(cond));
+ isRight: function(e){
+ // summary:
+ // Checks an event object for the pressed right button
+ // e: Event
+ // Event object to examine
+ return e.button == 2; // Boolean
}
};
+=====*/
- var getSimpleFilterFunc = function(query, ignores){
- // generates a node tester function based on the passed query part. The
- // query part is one of the structures generated by the query parser
- // when it creates the query AST. The "ignores" object specifies which
- // (if any) tests to skip, allowing the system to avoid duplicating
- // work where it may have already been taken into account by other
- // factors such as how the nodes to test were fetched in the first
- // place
- if(!query){ return yesman; }
- ignores = ignores||{};
-
- var ff = null;
-
- if(!("el" in ignores)){
- ff = agree(ff, _isElement);
- }
-
- if(!("tag" in ignores)){
- if(query.tag != "*"){
- ff = agree(ff, function(elem){
- return (elem && (elem.tagName == query.getTag()));
- });
- }
- }
-
- if(!("classes" in ignores)){
- each(query.classes, function(cname, idx, arr){
- // get the class name
- /*
- var isWildcard = cname.charAt(cname.length-1) == "*";
- if(isWildcard){
- cname = cname.substr(0, cname.length-1);
- }
- // I dislike the regex thing, even if memoized in a cache, but it's VERY short
- var re = new RegExp("(?:^|\\s)" + cname + (isWildcard ? ".*" : "") + "(?:\\s|$)");
- */
- var re = new RegExp("(?:^|\\s)" + cname + "(?:\\s|$)");
- ff = agree(ff, function(elem){
- return re.test(elem.className);
- });
- ff.count = idx;
- });
- }
-
- if(!("pseudos" in ignores)){
- each(query.pseudos, function(pseudo){
- var pn = pseudo.name;
- if(pseudos[pn]){
- ff = agree(ff, pseudos[pn](pn, pseudo.value));
- }
- });
- }
-
- if(!("attrs" in ignores)){
- each(query.attrs, function(attr){
- var matcher;
- var a = attr.attr;
- // type, attr, matchFor
- if(attr.type && attrs[attr.type]){
- matcher = attrs[attr.type](a, attr.matchFor);
- }else if(a.length){
- matcher = defaultGetter(a);
- }
- if(matcher){
- ff = agree(ff, matcher);
+ function eventHandler(type, mustBubble){
+ // emulation of mouseenter/leave with mouseover/out using descendant checking
+ var handler = function(node, listener){
+ return on(node, type, function(evt){
+ if(!dom.isDescendant(evt.relatedTarget, mustBubble ? evt.target : node)){
+ return listener.call(this, evt);
}
});
- }
-
- if(!("id" in ignores)){
- if(query.id){
- ff = agree(ff, function(elem){
- return (!!elem && (elem.id == query.id));
- });
- }
- }
-
- if(!ff){
- if(!("default" in ignores)){
- ff = yesman;
- }
- }
- return ff;
- };
-
- var _nextSibling = function(filterFunc){
- return function(node, ret, bag){
- while(node = node[_ns]){
- if(_noNES && (!_isElement(node))){ continue; }
- if(
- (!bag || _isUnique(node, bag)) &&
- filterFunc(node)
- ){
- ret.push(node);
- }
- break;
- }
- return ret;
- }
- };
-
- var _nextSiblings = function(filterFunc){
- return function(root, ret, bag){
- var te = root[_ns];
- while(te){
- if(_simpleNodeTest(te)){
- if(bag && !_isUnique(te, bag)){
- break;
- }
- if(filterFunc(te)){
- ret.push(te);
- }
- }
- te = te[_ns];
- }
- return ret;
- }
- };
-
- // get an array of child *elements*, skipping text and comment nodes
- var _childElements = function(filterFunc){
- filterFunc = filterFunc||yesman;
- return function(root, ret, bag){
- // get an array of child elements, skipping text and comment nodes
- var te, x = 0, tret = root[childNodesName];
- while(te = tret[x++]){
- if(
- _simpleNodeTest(te) &&
- (!bag || _isUnique(te, bag)) &&
- (filterFunc(te, x))
- ){
- ret.push(te);
- }
- }
- return ret;
};
- };
-
- /*
- // thanks, Dean!
- var itemIsAfterRoot = d.isIE ? function(item, root){
- return (item.sourceIndex > root.sourceIndex);
- } : function(item, root){
- return (item.compareDocumentPosition(root) == 2);
- };
- */
-
- // test to see if node is below root
- var _isDescendant = function(node, root){
- var pn = node.parentNode;
- while(pn){
- if(pn == root){
- break;
- }
- pn = pn.parentNode;
- }
- return !!pn;
- };
-
- var _getElementsFuncCache = {};
-
- var getElementsFunc = function(query){
- var retFunc = _getElementsFuncCache[query.query];
- // if we've got a cached dispatcher, just use that
- if(retFunc){ return retFunc; }
- // else, generate a new on
-
- // NOTE:
- // this function returns a function that searches for nodes and
- // filters them. The search may be specialized by infix operators
- // (">", "~", or "+") else it will default to searching all
- // descendants (the " " selector). Once a group of children is
- // found, a test function is applied to weed out the ones we
- // don't want. Many common cases can be fast-pathed. We spend a
- // lot of cycles to create a dispatcher that doesn't do more work
- // than necessary at any point since, unlike this function, the
- // dispatchers will be called every time. The logic of generating
- // efficient dispatchers looks like this in pseudo code:
- //
- // # if it's a purely descendant query (no ">", "+", or "~" modifiers)
- // if infixOperator == " ":
- // if only(id):
- // return def(root):
- // return d.byId(id, root);
- //
- // elif id:
- // return def(root):
- // return filter(d.byId(id, root));
- //
- // elif cssClass && getElementsByClassName:
- // return def(root):
- // return filter(root.getElementsByClassName(cssClass));
- //
- // elif only(tag):
- // return def(root):
- // return root.getElementsByTagName(tagName);
- //
- // else:
- // # search by tag name, then filter
- // return def(root):
- // return filter(root.getElementsByTagName(tagName||"*"));
- //
- // elif infixOperator == ">":
- // # search direct children
- // return def(root):
- // return filter(root.children);
- //
- // elif infixOperator == "+":
- // # search next sibling
- // return def(root):
- // return filter(root.nextElementSibling);
- //
- // elif infixOperator == "~":
- // # search rightward siblings
- // return def(root):
- // return filter(nextSiblings(root));
-
- var io = query.infixOper;
- var oper = (io ? io.oper : "");
- // the default filter func which tests for all conditions in the query
- // part. This is potentially inefficient, so some optimized paths may
- // re-define it to test fewer things.
- var filterFunc = getSimpleFilterFunc(query, { el: 1 });
- var qt = query.tag;
- var wildcardTag = ("*" == qt);
- var ecs = getDoc()["getElementsByClassName"];
-
- if(!oper){
- // if there's no infix operator, then it's a descendant query. ID
- // and "elements by class name" variants can be accelerated so we
- // call them out explicitly:
- if(query.id){
- // testing shows that the overhead of yesman() is acceptable
- // and can save us some bytes vs. re-defining the function
- // everywhere.
- filterFunc = (!query.loops && wildcardTag) ?
- yesman :
- getSimpleFilterFunc(query, { el: 1, id: 1 });
-
- retFunc = function(root, arr){
- var te = d.byId(query.id, (root.ownerDocument||root));
- if(!te || !filterFunc(te)){ return; }
- if(9 == root.nodeType){ // if root's a doc, we just return directly
- return getArr(te, arr);
- }else{ // otherwise check ancestry
- if(_isDescendant(te, root)){
- return getArr(te, arr);
- }
- }
- }
- }else if(
- ecs &&
- // isAlien check. Workaround for Prototype.js being totally evil/dumb.
- /\{\s*\[native code\]\s*\}/.test(String(ecs)) &&
- query.classes.length &&
- !cssCaseBug
- ){
- // it's a class-based query and we've got a fast way to run it.
-
- // ignore class and ID filters since we will have handled both
- filterFunc = getSimpleFilterFunc(query, { el: 1, classes: 1, id: 1 });
- var classesString = query.classes.join(" ");
- retFunc = function(root, arr, bag){
- var ret = getArr(0, arr), te, x=0;
- var tret = root.getElementsByClassName(classesString);
- while((te = tret[x++])){
- if(filterFunc(te, root) && _isUnique(te, bag)){
- ret.push(te);
- }
- }
- return ret;
- };
-
- }else if(!wildcardTag && !query.loops){
- // it's tag only. Fast-path it.
- retFunc = function(root, arr, bag){
- var ret = getArr(0, arr), te, x=0;
- var tret = root.getElementsByTagName(query.getTag());
- while((te = tret[x++])){
- if(_isUnique(te, bag)){
- ret.push(te);
- }
- }
- return ret;
- };
- }else{
- // the common case:
- // a descendant selector without a fast path. By now it's got
- // to have a tag selector, even if it's just "*" so we query
- // by that and filter
- filterFunc = getSimpleFilterFunc(query, { el: 1, tag: 1, id: 1 });
- retFunc = function(root, arr, bag){
- var ret = getArr(0, arr), te, x=0;
- // we use getTag() to avoid case sensitivity issues
- var tret = root.getElementsByTagName(query.getTag());
- while((te = tret[x++])){
- if(filterFunc(te, root) && _isUnique(te, bag)){
- ret.push(te);
- }
- }
- return ret;
- };
- }
- }else{
- // the query is scoped in some way. Instead of querying by tag we
- // use some other collection to find candidate nodes
- var skipFilters = { el: 1 };
- if(wildcardTag){
- skipFilters.tag = 1;
- }
- filterFunc = getSimpleFilterFunc(query, skipFilters);
- if("+" == oper){
- retFunc = _nextSibling(filterFunc);
- }else if("~" == oper){
- retFunc = _nextSiblings(filterFunc);
- }else if(">" == oper){
- retFunc = _childElements(filterFunc);
- }
- }
- // cache it and return
- return _getElementsFuncCache[query.query] = retFunc;
- };
-
- var filterDown = function(root, queryParts){
- // NOTE:
- // this is the guts of the DOM query system. It takes a list of
- // parsed query parts and a root and finds children which match
- // the selector represented by the parts
- var candidates = getArr(root), qp, x, te, qpl = queryParts.length, bag, ret;
-
- for(var i = 0; i < qpl; i++){
- ret = [];
- qp = queryParts[i];
- x = candidates.length - 1;
- if(x > 0){
- // if we have more than one root at this level, provide a new
- // hash to use for checking group membership but tell the
- // system not to post-filter us since we will already have been
- // gauranteed to be unique
- bag = {};
- ret.nozip = true;
- }
- var gef = getElementsFunc(qp);
- for(var j = 0; (te = candidates[j]); j++){
- // for every root, get the elements that match the descendant
- // selector, adding them to the "ret" array and filtering them
- // via membership in this level's bag. If there are more query
- // parts, then this level's return will be used as the next
- // level's candidates
- gef(te, ret, bag);
- }
- if(!ret.length){ break; }
- candidates = ret;
- }
- return ret;
- };
-
- ////////////////////////////////////////////////////////////////////////
- // the query runner
- ////////////////////////////////////////////////////////////////////////
-
- // these are the primary caches for full-query results. The query
- // dispatcher functions are generated then stored here for hash lookup in
- // the future
- var _queryFuncCacheDOM = {},
- _queryFuncCacheQSA = {};
-
- // this is the second level of spliting, from full-length queries (e.g.,
- // "div.foo .bar") into simple query expressions (e.g., ["div.foo",
- // ".bar"])
- var getStepQueryFunc = function(query){
- var qparts = getQueryParts(trim(query));
-
- // if it's trivial, avoid iteration and zipping costs
- if(qparts.length == 1){
- // we optimize this case here to prevent dispatch further down the
- // chain, potentially slowing things down. We could more elegantly
- // handle this in filterDown(), but it's slower for simple things
- // that need to be fast (e.g., "#someId").
- var tef = getElementsFunc(qparts[0]);
- return function(root){
- var r = tef(root, new qlc());
- if(r){ r.nozip = true; }
- return r;
- }
- }
-
- // otherwise, break it up and return a runner that iterates over the parts recursively
- return function(root){
- return filterDown(root, qparts);
- }
- };
-
- // NOTES:
- // * we can't trust QSA for anything but document-rooted queries, so
- // caching is split into DOM query evaluators and QSA query evaluators
- // * caching query results is dirty and leak-prone (or, at a minimum,
- // prone to unbounded growth). Other toolkits may go this route, but
- // they totally destroy their own ability to manage their memory
- // footprint. If we implement it, it should only ever be with a fixed
- // total element reference # limit and an LRU-style algorithm since JS
- // has no weakref support. Caching compiled query evaluators is also
- // potentially problematic, but even on large documents the size of the
- // query evaluators is often < 100 function objects per evaluator (and
- // LRU can be applied if it's ever shown to be an issue).
- // * since IE's QSA support is currently only for HTML documents and even
- // then only in IE 8's "standards mode", we have to detect our dispatch
- // route at query time and keep 2 separate caches. Ugg.
-
- // we need to determine if we think we can run a given query via
- // querySelectorAll or if we'll need to fall back on DOM queries to get
- // there. We need a lot of information about the environment and the query
- // to make the determiniation (e.g. does it support QSA, does the query in
- // question work in the native QSA impl, etc.).
- var nua = navigator.userAgent;
- // some versions of Safari provided QSA, but it was buggy and crash-prone.
- // We need te detect the right "internal" webkit version to make this work.
- var wk = "WebKit/";
- var is525 = (
- d.isWebKit &&
- (nua.indexOf(wk) > 0) &&
- (parseFloat(nua.split(wk)[1]) > 528)
- );
-
- // IE QSA queries may incorrectly include comment nodes, so we throw the
- // zipping function into "remove" comments mode instead of the normal "skip
- // it" which every other QSA-clued browser enjoys
- var noZip = d.isIE ? "commentStrip" : "nozip";
-
- var qsa = "querySelectorAll";
- var qsaAvail = (
- !!getDoc()[qsa] &&
- // see #5832
- (!d.isSafari || (d.isSafari > 3.1) || is525 )
- );
-
- //Don't bother with n+3 type of matches, IE complains if we modify those.
- var infixSpaceRe = /n\+\d|([^ ])?([>~+])([^ =])?/g;
- var infixSpaceFunc = function(match, pre, ch, post) {
- return ch ? (pre ? pre + " " : "") + ch + (post ? " " + post : "") : /*n+3*/ match;
- };
-
- var getQueryFunc = function(query, forceDOM){
- //Normalize query. The CSS3 selectors spec allows for omitting spaces around
- //infix operators, >, ~ and +
- //Do the work here since detection for spaces is used as a simple "not use QSA"
- //test below.
- query = query.replace(infixSpaceRe, infixSpaceFunc);
-
- if(qsaAvail){
- // if we've got a cached variant and we think we can do it, run it!
- var qsaCached = _queryFuncCacheQSA[query];
- if(qsaCached && !forceDOM){ return qsaCached; }
- }
-
- // else if we've got a DOM cached variant, assume that we already know
- // all we need to and use it
- var domCached = _queryFuncCacheDOM[query];
- if(domCached){ return domCached; }
-
- // TODO:
- // today we're caching DOM and QSA branches separately so we
- // recalc useQSA every time. If we had a way to tag root+query
- // efficiently, we'd be in good shape to do a global cache.
-
- var qcz = query.charAt(0);
- var nospace = (-1 == query.indexOf(" "));
-
- // byId searches are wicked fast compared to QSA, even when filtering
- // is required
- if( (query.indexOf("#") >= 0) && (nospace) ){
- forceDOM = true;
- }
-
- var useQSA = (
- qsaAvail && (!forceDOM) &&
- // as per CSS 3, we can't currently start w/ combinator:
- // http://www.w3.org/TR/css3-selectors/#w3cselgrammar
- (specials.indexOf(qcz) == -1) &&
- // IE's QSA impl sucks on pseudos
- (!d.isIE || (query.indexOf(":") == -1)) &&
-
- (!(cssCaseBug && (query.indexOf(".") >= 0))) &&
-
- // FIXME:
- // need to tighten up browser rules on ":contains" and "|=" to
- // figure out which aren't good
- // Latest webkit (around 531.21.8) does not seem to do well with :checked on option
- // elements, even though according to spec, selected options should
- // match :checked. So go nonQSA for it:
- // http://bugs.dojotoolkit.org/ticket/5179
- (query.indexOf(":contains") == -1) && (query.indexOf(":checked") == -1) &&
- (query.indexOf("|=") == -1) // some browsers don't grok it
- );
-
- // TODO:
- // if we've got a descendant query (e.g., "> .thinger" instead of
- // just ".thinger") in a QSA-able doc, but are passed a child as a
- // root, it should be possible to give the item a synthetic ID and
- // trivially rewrite the query to the form "#synid > .thinger" to
- // use the QSA branch
-
-
- if(useQSA){
- var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ?
- (query + " *") : query;
- return _queryFuncCacheQSA[query] = function(root){
- try{
- // the QSA system contains an egregious spec bug which
- // limits us, effectively, to only running QSA queries over
- // entire documents. See:
- // http://ejohn.org/blog/thoughts-on-queryselectorall/
- // despite this, we can also handle QSA runs on simple
- // selectors, but we don't want detection to be expensive
- // so we're just checking for the presence of a space char
- // right now. Not elegant, but it's cheaper than running
- // the query parser when we might not need to
- if(!((9 == root.nodeType) || nospace)){ throw ""; }
- var r = root[qsa](tq);
- // skip expensive duplication checks and just wrap in a NodeList
- r[noZip] = true;
- return r;
- }catch(e){
- // else run the DOM branch on this query, ensuring that we
- // default that way in the future
- return getQueryFunc(query, true)(root);
- }
- }
- }else{
- // DOM branch
- var parts = query.split(/\s*,\s*/);
- return _queryFuncCacheDOM[query] = ((parts.length < 2) ?
- // if not a compound query (e.g., ".foo, .bar"), cache and return a dispatcher
- getStepQueryFunc(query) :
- // if it *is* a complex query, break it up into its
- // constituent parts and return a dispatcher that will
- // merge the parts when run
- function(root){
- var pindex = 0, // avoid array alloc for every invocation
- ret = [],
- tp;
- while((tp = parts[pindex++])){
- ret = ret.concat(getStepQueryFunc(tp)(root));
- }
- return ret;
- }
- );
- }
- };
-
- var _zipIdx = 0;
-
- // NOTE:
- // this function is Moo inspired, but our own impl to deal correctly
- // with XML in IE
- var _nodeUID = d.isIE ? function(node){
- if(caseSensitive){
- // XML docs don't have uniqueID on their nodes
- return (node.getAttribute("_uid") || node.setAttribute("_uid", ++_zipIdx) || _zipIdx);
-
- }else{
- return node.uniqueID;
- }
- } :
- function(node){
- return (node._uid || (node._uid = ++_zipIdx));
- };
-
- // determine if a node in is unique in a "bag". In this case we don't want
- // to flatten a list of unique items, but rather just tell if the item in
- // question is already in the bag. Normally we'd just use hash lookup to do
- // this for us but IE's DOM is busted so we can't really count on that. On
- // the upside, it gives us a built in unique ID function.
- var _isUnique = function(node, bag){
- if(!bag){ return 1; }
- var id = _nodeUID(node);
- if(!bag[id]){ return bag[id] = 1; }
- return 0;
- };
-
- // attempt to efficiently determine if an item in a list is a dupe,
- // returning a list of "uniques", hopefully in doucment order
- var _zipIdxName = "_zipIdx";
- var _zip = function(arr){
- if(arr && arr.nozip){
- return (qlc._wrap) ? qlc._wrap(arr) : arr;
- }
- // var ret = new d._NodeListCtor();
- var ret = new qlc();
- if(!arr || !arr.length){ return ret; }
- if(arr[0]){
- ret.push(arr[0]);
- }
- if(arr.length < 2){ return ret; }
-
- _zipIdx++;
-
- // we have to fork here for IE and XML docs because we can't set
- // expandos on their nodes (apparently). *sigh*
- if(d.isIE && caseSensitive){
- var szidx = _zipIdx+"";
- arr[0].setAttribute(_zipIdxName, szidx);
- for(var x = 1, te; te = arr[x]; x++){
- if(arr[x].getAttribute(_zipIdxName) != szidx){
- ret.push(te);
- }
- te.setAttribute(_zipIdxName, szidx);
- }
- }else if(d.isIE && arr.commentStrip){
- try{
- for(var x = 1, te; te = arr[x]; x++){
- if(_isElement(te)){
- ret.push(te);
- }
- }
- }catch(e){ /* squelch */ }
- }else{
- if(arr[0]){ arr[0][_zipIdxName] = _zipIdx; }
- for(var x = 1, te; te = arr[x]; x++){
- if(arr[x][_zipIdxName] != _zipIdx){
- ret.push(te);
- }
- te[_zipIdxName] = _zipIdx;
- }
- }
- return ret;
- };
-
- // the main executor
- d.query = function(/*String*/ query, /*String|DOMNode?*/ root){
- // summary:
- // Returns nodes which match the given CSS3 selector, searching the
- // entire document by default but optionally taking a node to scope
- // the search by. Returns an instance of dojo.NodeList.
- // description:
- // dojo.query() is the swiss army knife of DOM node manipulation in
- // Dojo. Much like Prototype's "$$" (bling-bling) function or JQuery's
- // "$" function, dojo.query provides robust, high-performance
- // CSS-based node selector support with the option of scoping searches
- // to a particular sub-tree of a document.
- //
- // Supported Selectors:
- // --------------------
- //
- // dojo.query() supports a rich set of CSS3 selectors, including:
- //
- // * class selectors (e.g., `.foo`)
- // * node type selectors like `span`
- // * ` ` descendant selectors
- // * `>` child element selectors
- // * `#foo` style ID selectors
- // * `*` universal selector
- // * `~`, the preceded-by sibling selector
- // * `+`, the immediately preceded-by sibling selector
- // * attribute queries:
- // | * `[foo]` attribute presence selector
- // | * `[foo='bar']` attribute value exact match
- // | * `[foo~='bar']` attribute value list item match
- // | * `[foo^='bar']` attribute start match
- // | * `[foo$='bar']` attribute end match
- // | * `[foo*='bar']` attribute substring match
- // * `:first-child`, `:last-child`, and `:only-child` positional selectors
- // * `:empty` content emtpy selector
- // * `:checked` pseudo selector
- // * `:nth-child(n)`, `:nth-child(2n+1)` style positional calculations
- // * `:nth-child(even)`, `:nth-child(odd)` positional selectors
- // * `:not(...)` negation pseudo selectors
- //
- // Any legal combination of these selectors will work with
- // `dojo.query()`, including compound selectors ("," delimited).
- // Very complex and useful searches can be constructed with this
- // palette of selectors and when combined with functions for
- // manipulation presented by dojo.NodeList, many types of DOM
- // manipulation operations become very straightforward.
- //
- // Unsupported Selectors:
- // ----------------------
- //
- // While dojo.query handles many CSS3 selectors, some fall outside of
- // what's reasonable for a programmatic node querying engine to
- // handle. Currently unsupported selectors include:
- //
- // * namespace-differentiated selectors of any form
- // * all `::` pseduo-element selectors
- // * certain pseduo-selectors which don't get a lot of day-to-day use:
- // | * `:root`, `:lang()`, `:target`, `:focus`
- // * all visual and state selectors:
- // | * `:root`, `:active`, `:hover`, `:visisted`, `:link`,
- // `:enabled`, `:disabled`
- // * `:*-of-type` pseudo selectors
- //
- // dojo.query and XML Documents:
- // -----------------------------
- //
- // `dojo.query` (as of dojo 1.2) supports searching XML documents
- // in a case-sensitive manner. If an HTML document is served with
- // a doctype that forces case-sensitivity (e.g., XHTML 1.1
- // Strict), dojo.query() will detect this and "do the right
- // thing". Case sensitivity is dependent upon the document being
- // searched and not the query used. It is therefore possible to
- // use case-sensitive queries on strict sub-documents (iframes,
- // etc.) or XML documents while still assuming case-insensitivity
- // for a host/root document.
- //
- // Non-selector Queries:
- // ---------------------
- //
- // If something other than a String is passed for the query,
- // `dojo.query` will return a new `dojo.NodeList` instance
- // constructed from that parameter alone and all further
- // processing will stop. This means that if you have a reference
- // to a node or NodeList, you can quickly construct a new NodeList
- // from the original by calling `dojo.query(node)` or
- // `dojo.query(list)`.
- //
- // query:
- // The CSS3 expression to match against. For details on the syntax of
- // CSS3 selectors, see <http://www.w3.org/TR/css3-selectors/#selectors>
- // root:
- // A DOMNode (or node id) to scope the search from. Optional.
- // returns: dojo.NodeList
- // An instance of `dojo.NodeList`. Many methods are available on
- // NodeLists for searching, iterating, manipulating, and handling
- // events on the matched nodes in the returned list.
- // example:
- // search the entire document for elements with the class "foo":
- // | dojo.query(".foo");
- // these elements will match:
- // | <span class="foo"></span>
- // | <span class="foo bar"></span>
- // | <p class="thud foo"></p>
- // example:
- // search the entire document for elements with the classes "foo" *and* "bar":
- // | dojo.query(".foo.bar");
- // these elements will match:
- // | <span class="foo bar"></span>
- // while these will not:
- // | <span class="foo"></span>
- // | <p class="thud foo"></p>
- // example:
- // find `<span>` elements which are descendants of paragraphs and
- // which have a "highlighted" class:
- // | dojo.query("p span.highlighted");
- // the innermost span in this fragment matches:
- // | <p class="foo">
- // | <span>...
- // | <span class="highlighted foo bar">...</span>
- // | </span>
- // | </p>
- // example:
- // set an "odd" class on all odd table rows inside of the table
- // `#tabular_data`, using the `>` (direct child) selector to avoid
- // affecting any nested tables:
- // | dojo.query("#tabular_data > tbody > tr:nth-child(odd)").addClass("odd");
- // example:
- // remove all elements with the class "error" from the document
- // and store them in a list:
- // | var errors = dojo.query(".error").orphan();
- // example:
- // add an onclick handler to every submit button in the document
- // which causes the form to be sent via Ajax instead:
- // | dojo.query("input[type='submit']").onclick(function(e){
- // | dojo.stopEvent(e); // prevent sending the form
- // | var btn = e.target;
- // | dojo.xhrPost({
- // | form: btn.form,
- // | load: function(data){
- // | // replace the form with the response
- // | var div = dojo.doc.createElement("div");
- // | dojo.place(div, btn.form, "after");
- // | div.innerHTML = data;
- // | dojo.style(btn.form, "display", "none");
- // | }
- // | });
- // | });
-
- //Set list constructor to desired value. This can change
- //between calls, so always re-assign here.
- qlc = d._NodeListCtor;
-
- if(!query){
- return new qlc();
- }
-
- if(query.constructor == qlc){
- return query;
+ if(!mustBubble){
+ handler.bubble = eventHandler(type, true);
}
- if(typeof query != "string"){ // inline'd type check
- return new qlc(query); // dojo.NodeList
- }
- if(typeof root == "string"){ // inline'd type check
- root = d.byId(root);
- if(!root){ return new qlc(); }
- }
-
- root = root||getDoc();
- var od = root.ownerDocument||root.documentElement;
-
- // throw the big case sensitivity switch
-
- // NOTE:
- // Opera in XHTML mode doesn't detect case-sensitivity correctly
- // and it's not clear that there's any way to test for it
- caseSensitive = (root.contentType && root.contentType=="application/xml") ||
- (d.isOpera && (root.doctype || od.toString() == "[object XMLDocument]")) ||
- (!!od) &&
- (d.isIE ? od.xml : (root.xmlVersion||od.xmlVersion));
-
- // NOTE:
- // adding "true" as the 2nd argument to getQueryFunc is useful for
- // testing the DOM branch without worrying about the
- // behavior/performance of the QSA branch.
- var r = getQueryFunc(query)(root);
-
- // FIXME:
- // need to investigate this branch WRT #8074 and #8075
- if(r && r.nozip && !qlc._wrap){
- return r;
- }
- return _zip(r); // dojo.NodeList
+ return handler;
}
+ return {
+ enter: eventHandler("mouseover"),
+ leave: eventHandler("mouseout"),
+ isLeft: mouseButtons.isLeft,
+ isMiddle: mouseButtons.isMiddle,
+ isRight: mouseButtons.isRight
+ };
+});
+
+},
+'dojo/topic':function(){
+define(["./Evented"], function(Evented){
+ // summary:
+ // The export of this module is a pubsub hub
+ // You can also use listen function itself as a pub/sub hub:
+ // | topic.subscribe("some/topic", function(event){
+ // | ... do something with event
+ // | });
+ // | topic.publish("some/topic", {name:"some event", ...});
- // FIXME: need to add infrastructure for post-filtering pseudos, ala :last
- d.query.pseudos = pseudos;
-
- // function for filtering a NodeList based on a selector, optimized for simple selectors
- d._filterQueryResult = function(/*NodeList*/ nodeList, /*String*/ filter, /*String|DOMNode?*/ root){
- var tmpNodeList = new d._NodeListCtor(),
- parts = getQueryParts(filter),
- filterFunc =
- (parts.length == 1 && !/[^\w#\.]/.test(filter)) ?
- getSimpleFilterFunc(parts[0]) :
- function(node) {
- return dojo.query(filter, root).indexOf(node) != -1;
- };
- for(var x = 0, te; te = nodeList[x]; x++){
- if(filterFunc(te)){ tmpNodeList.push(te); }
- }
- return tmpNodeList;
- }
-};//end defineQuery
-
-var defineAcme= function(){
- // a self-sufficient query impl
- acme = {
- trim: function(/*String*/ str){
+ var hub = new Evented;
+ return {
+ publish: function(topic, event){
// summary:
- // trims whitespaces from both sides of the string
- str = str.replace(/^\s+/, '');
- for(var i = str.length - 1; i >= 0; i--){
- if(/\S/.test(str.charAt(i))){
- str = str.substring(0, i + 1);
- break;
- }
- }
- return str; // String
+ // Publishes a message to a topic on the pub/sub hub. All arguments after
+ // the first will be passed to the subscribers, so any number of arguments
+ // can be provided (not just event).
+ // topic: String
+ // The name of the topic to publish to
+ // event: Object
+ // An event to distribute to the topic listeners
+ return hub.emit.apply(hub, arguments);
},
- forEach: function(/*String*/ arr, /*Function*/ callback, /*Object?*/ thisObject){
- // summary:
- // an iterator function that passes items, indexes,
- // and the array to a callback
- if(!arr || !arr.length){ return; }
- for(var i=0,l=arr.length; i<l; ++i){
- callback.call(thisObject||window, arr[i], i, arr);
- }
- },
- byId: function(id, doc){
- // summary:
- // a function that return an element by ID, but also
- // accepts nodes safely
- if(typeof id == "string"){
- return (doc||document).getElementById(id); // DomNode
- }else{
- return id; // DomNode
- }
- },
- // the default document to search
- doc: document,
- // the constructor for node list objects returned from query()
- NodeList: Array
- };
-
- // define acme.isIE, acme.isSafari, acme.isOpera, etc.
- var n = navigator;
- var dua = n.userAgent;
- var dav = n.appVersion;
- var tv = parseFloat(dav);
- acme.isOpera = (dua.indexOf("Opera") >= 0) ? tv: undefined;
- acme.isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : undefined;
- acme.isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined;
- acme.isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined;
- var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);
- if(index && !acme.isChrome){
- acme.isSafari = parseFloat(dav.split("Version/")[1]);
- if(!acme.isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){
- acme.isSafari = 2;
- }
- }
- if(document.all && !acme.isOpera){
- acme.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined;
- }
-
- Array._wrap = function(arr){ return arr; };
- return acme;
-};
-
- //prefers queryPortability, then acme, then dojo
- if(this["dojo"]){
- dojo.provide("dojo._base.query");
-
-
- defineQuery(this["queryPortability"]||this["acme"]||dojo);
- }else{
- defineQuery(this["queryPortability"]||this["acme"]||defineAcme());
- }
-
-})();
-
-/*
-*/
-
-}
-
-if(!dojo._hasResource["dojo._base.xhr"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.xhr"] = true;
-dojo.provide("dojo._base.xhr");
-
-
-
-
-
-
-(function(){
- var _d = dojo, cfg = _d.config;
-
- function setValue(/*Object*/obj, /*String*/name, /*String*/value){
- //summary:
- // For the named property in object, set the value. If a value
- // already exists and it is a string, convert the value to be an
- // array of values.
-
- //Skip it if there is no value
- if(value === null){
- return;
- }
-
- var val = obj[name];
- if(typeof val == "string"){ // inline'd type check
- obj[name] = [val, value];
- }else if(_d.isArray(val)){
- val.push(value);
- }else{
- obj[name] = value;
+ subscribe: function(topic, listener){
+ // summary:
+ // Subcribes to a topic on the pub/sub hub
+ // topic: String
+ // The topic to subscribe to
+ // listener: Function
+ // A function to call when a message is published to the given topic
+ return hub.on.apply(hub, arguments);
}
}
-
- dojo.fieldToObject = function(/*DOMNode||String*/ inputNode){
- // summary:
- // Serialize a form field to a JavaScript object.
- //
- // description:
- // Returns the value encoded in a form field as
- // as a string or an array of strings. Disabled form elements
- // and unchecked radio and checkboxes are skipped. Multi-select
- // elements are returned as an array of string values.
- var ret = null;
- var item = _d.byId(inputNode);
- if(item){
- var _in = item.name;
- var type = (item.type||"").toLowerCase();
- if(_in && type && !item.disabled){
- if(type == "radio" || type == "checkbox"){
- if(item.checked){ ret = item.value; }
- }else if(item.multiple){
- ret = [];
- _d.query("option", item).forEach(function(opt){
- if(opt.selected){
- ret.push(opt.value);
- }
- });
- }else{
- ret = item.value;
- }
- }
- }
- return ret; // Object
- };
+});
+
+},
+'dojo/_base/xhr':function(){
+define([
+ "./kernel", "./sniff", "require", "../io-query", "../dom", "../dom-form", "./Deferred", "./json", "./lang", "./array", "../on"
+], function(dojo, has, require, ioq, dom, domForm, deferred, json, lang, array, on){
+ // module:
+ // dojo/_base.xhr
+ // summary:
+ // This modules defines the dojo.xhr* API.
- dojo.formToObject = function(/*DOMNode||String*/ formNode){
- // summary:
- // Serialize a form node to a JavaScript object.
- // description:
- // Returns the values encoded in an HTML form as
- // string properties in an object which it then returns. Disabled form
- // elements, buttons, and other non-value form elements are skipped.
- // Multi-select elements are returned as an array of string values.
- //
- // example:
- // This form:
- // | <form id="test_form">
- // | <input type="text" name="blah" value="blah">
- // | <input type="text" name="no_value" value="blah" disabled>
- // | <input type="button" name="no_value2" value="blah">
- // | <select type="select" multiple name="multi" size="5">
- // | <option value="blah">blah</option>
- // | <option value="thud" selected>thud</option>
- // | <option value="thonk" selected>thonk</option>
- // | </select>
- // | </form>
- //
- // yields this object structure as the result of a call to
- // formToObject():
- //
- // | {
- // | blah: "blah",
- // | multi: [
- // | "thud",
- // | "thonk"
- // | ]
- // | };
+ has.add("native-xhr", function() {
+ // if true, the environment has a native XHR implementation
+ return typeof XMLHttpRequest !== 'undefined';
+ });
- var ret = {};
- var exclude = "file|submit|image|reset|button|";
- _d.forEach(dojo.byId(formNode).elements, function(item){
- var _in = item.name;
- var type = (item.type||"").toLowerCase();
- if(_in && type && exclude.indexOf(type) == -1 && !item.disabled){
- setValue(ret, _in, _d.fieldToObject(item));
- if(type == "image"){
- ret[_in+".x"] = ret[_in+".y"] = ret[_in].x = ret[_in].y = 0;
- }
+ if(1 && require.getXhr){
+ dojo._xhrObj = require.getXhr;
+ }else if (has("native-xhr")){
+ dojo._xhrObj = function(){
+ // summary:
+ // does the work of portably generating a new XMLHTTPRequest object.
+ try{
+ return new XMLHttpRequest();
+ }catch(e){
+ throw new Error("XMLHTTP not available: "+e);
}
- });
- return ret; // Object
- };
-
- dojo.objectToQuery = function(/*Object*/ map){
- // summary:
- // takes a name/value mapping object and returns a string representing
- // a URL-encoded version of that object.
- // example:
- // this object:
- //
- // | {
- // | blah: "blah",
- // | multi: [
- // | "thud",
- // | "thonk"
- // | ]
- // | };
- //
- // yields the following query string:
- //
- // | "blah=blah&multi=thud&multi=thonk"
-
- // FIXME: need to implement encodeAscii!!
- var enc = encodeURIComponent;
- var pairs = [];
- var backstop = {};
- for(var name in map){
- var value = map[name];
- if(value != backstop[name]){
- var assign = enc(name) + "=";
- if(_d.isArray(value)){
- for(var i=0; i < value.length; i++){
- pairs.push(assign + enc(value[i]));
- }
- }else{
- pairs.push(assign + enc(value));
+ };
+ }else{
+ // PROGIDs are in order of decreasing likelihood; this will change in time.
+ for(var XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'], progid, i = 0; i < 3;){
+ try{
+ progid = XMLHTTP_PROGIDS[i++];
+ if (new ActiveXObject(progid)) {
+ // this progid works; therefore, use it from now on
+ break;
}
+ }catch(e){
+ // squelch; we're just trying to find a good ActiveX PROGID
+ // if they all fail, then progid ends up as the last attempt and that will signal the error
+ // the first time the client actually tries to exec an xhr
}
}
- return pairs.join("&"); // String
- };
+ dojo._xhrObj= function() {
+ return new ActiveXObject(progid);
+ };
+ }
- dojo.formToQuery = function(/*DOMNode||String*/ formNode){
- // summary:
- // Returns a URL-encoded string representing the form passed as either a
- // node or string ID identifying the form to serialize
- return _d.objectToQuery(_d.formToObject(formNode)); // String
- };
+ var cfg = dojo.config;
- dojo.formToJson = function(/*DOMNode||String*/ formNode, /*Boolean?*/prettyPrint){
- // summary:
- // Create a serialized JSON string from a form node or string
- // ID identifying the form to serialize
- return _d.toJson(_d.formToObject(formNode), prettyPrint); // String
- };
-
- dojo.queryToObject = function(/*String*/ str){
- // summary:
- // Create an object representing a de-serialized query section of a
- // URL. Query keys with multiple values are returned in an array.
- //
- // example:
- // This string:
- //
- // | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&"
- //
- // results in this object structure:
- //
- // | {
- // | foo: [ "bar", "baz" ],
- // | thinger: " spaces =blah",
- // | zonk: "blarg"
- // | }
- //
- // Note that spaces and other urlencoded entities are correctly
- // handled.
-
- // FIXME: should we grab the URL string if we're not passed one?
- var ret = {};
- var qp = str.split("&");
- var dec = decodeURIComponent;
- _d.forEach(qp, function(item){
- if(item.length){
- var parts = item.split("=");
- var name = dec(parts.shift());
- var val = dec(parts.join("="));
- if(typeof ret[name] == "string"){ // inline'd type check
- ret[name] = [ret[name]];
- }
-
- if(_d.isArray(ret[name])){
- ret[name].push(val);
- }else{
- ret[name] = val;
- }
- }
- });
- return ret; // Object
- };
+ // mix in io-query and dom-form
+ dojo.objectToQuery = ioq.objectToQuery;
+ dojo.queryToObject = ioq.queryToObject;
+ dojo.fieldToObject = domForm.fieldToObject;
+ dojo.formToObject = domForm.toObject;
+ dojo.formToQuery = domForm.toQuery;
+ dojo.formToJson = domForm.toJson;
// need to block async callbacks from snatching this thread as the result
// of an async callback might call another sync XHR, this hangs khtml forever
@@ -9927,7 +10350,7 @@ dojo.provide("dojo._base.xhr");
dojo._blockAsync = false;
// MOW: remove dojo._contentHandlers alias in 2.0
- var handlers = _d._contentHandlers = dojo.contentHandlers = {
+ var handlers = dojo._contentHandlers = dojo.contentHandlers = {
// summary:
// A map of availble XHR transport handle types. Name matches the
// `handleAs` attribute passed to XHR calls.
@@ -9951,13 +10374,13 @@ dojo.provide("dojo._base.xhr");
// | load: function(data){ /* data is a toUpper version of foo.txt */ }
// | });
- text: function(xhr){
+ "text": function(xhr){
// summary: A contentHandler which simply returns the plaintext response data
return xhr.responseText;
},
- json: function(xhr){
+ "json": function(xhr){
// summary: A contentHandler which returns a JavaScript object created from the response data
- return _d.fromJson(xhr.responseText || null);
+ return json.fromJson(xhr.responseText || null);
},
"json-comment-filtered": function(xhr){
// summary: A contentHandler which expects comment-filtered JSON.
@@ -9986,33 +10409,36 @@ dojo.provide("dojo._base.xhr");
if(cStartIdx == -1 || cEndIdx == -1){
throw new Error("JSON was not comment filtered");
}
- return _d.fromJson(value.substring(cStartIdx+2, cEndIdx));
+ return json.fromJson(value.substring(cStartIdx+2, cEndIdx));
},
- javascript: function(xhr){
+ "javascript": function(xhr){
// summary: A contentHandler which evaluates the response data, expecting it to be valid JavaScript
// FIXME: try Moz and IE specific eval variants?
- return _d.eval(xhr.responseText);
+ return dojo.eval(xhr.responseText);
},
- xml: function(xhr){
+ "xml": function(xhr){
// summary: A contentHandler returning an XML Document parsed from the response data
var result = xhr.responseXML;
- if(_d.isIE && (!result || !result.documentElement)){
- //WARNING: this branch used by the xml handling in dojo.io.iframe,
- //so be sure to test dojo.io.iframe if making changes below.
- var ms = function(n){ return "MSXML" + n + ".DOMDocument"; };
- var dp = ["Microsoft.XMLDOM", ms(6), ms(4), ms(3), ms(2)];
- _d.some(dp, function(p){
- try{
- var dom = new ActiveXObject(p);
- dom.async = false;
- dom.loadXML(xhr.responseText);
- result = dom;
- }catch(e){ return false; }
- return true;
- });
- }
- return result; // DOMDocument
+
+ if(has("ie")){
+ if((!result || !result.documentElement)){
+ //WARNING: this branch used by the xml handling in dojo.io.iframe,
+ //so be sure to test dojo.io.iframe if making changes below.
+ var ms = function(n){ return "MSXML" + n + ".DOMDocument"; };
+ var dp = ["Microsoft.XMLDOM", ms(6), ms(4), ms(3), ms(2)];
+ array.some(dp, function(p){
+ try{
+ var dom = new ActiveXObject(p);
+ dom.async = false;
+ dom.loadXML(xhr.responseText);
+ result = dom;
+ }catch(e){ return false; }
+ return true;
+ });
+ }
+ }
+ return result; // DOMDocument
},
"json-comment-optional": function(xhr){
// summary: A contentHandler which checks the presence of comment-filtered JSON and
@@ -10048,15 +10474,15 @@ dojo.provide("dojo._base.xhr");
// Acceptable values depend on the type of IO
// transport (see specific IO calls for more information).
// rawBody: String?
- // Sets the raw body for an HTTP request. If this is used, then the content
- // property is ignored. This is mostly useful for HTTP methods that have
- // a body to their requests, like PUT or POST. This property can be used instead
- // of postData and putData for dojo.rawXhrPost and dojo.rawXhrPut respectively.
+ // Sets the raw body for an HTTP request. If this is used, then the content
+ // property is ignored. This is mostly useful for HTTP methods that have
+ // a body to their requests, like PUT or POST. This property can be used instead
+ // of postData and putData for dojo.rawXhrPost and dojo.rawXhrPut respectively.
// ioPublish: Boolean?
// Set this explicitly to false to prevent publishing of topics related to
- // IO operations. Otherwise, if djConfig.ioPublish is set to true, topics
- // will be published via dojo.publish for different phases of an IO operation.
- // See dojo.__IoPublish for a list of topics that are published.
+ // IO operations. Otherwise, if djConfig.ioPublish is set to true, topics
+ // will be published via dojo.publish for different phases of an IO operation.
+ // See dojo.__IoPublish for a list of topics that are published.
// load: Function?
// This function will be
// called on a successful HTTP response code.
@@ -10064,7 +10490,7 @@ dojo.provide("dojo._base.xhr");
// This function will
// be called when the request fails due to a network or server error, the url
// is invalid, etc. It will also be called if the load or handle callback throws an
- // exception, unless djConfig.debugAtAllCosts is true. This allows deployed applications
+ // exception, unless djConfig.debugAtAllCosts is true. This allows deployed applications
// to continue to run even when a logic error happens in the callback, while making
// it easier to troubleshoot while in debug mode.
// handle: Function?
@@ -10150,34 +10576,34 @@ dojo.provide("dojo._base.xhr");
/*=====
dojo.__IoPublish = function(){
- // summary:
- // This is a list of IO topics that can be published
- // if djConfig.ioPublish is set to true. IO topics can be
- // published for any Input/Output, network operation. So,
- // dojo.xhr, dojo.io.script and dojo.io.iframe can all
- // trigger these topics to be published.
+ // summary:
+ // This is a list of IO topics that can be published
+ // if djConfig.ioPublish is set to true. IO topics can be
+ // published for any Input/Output, network operation. So,
+ // dojo.xhr, dojo.io.script and dojo.io.iframe can all
+ // trigger these topics to be published.
// start: String
// "/dojo/io/start" is sent when there are no outstanding IO
- // requests, and a new IO request is started. No arguments
- // are passed with this topic.
+ // requests, and a new IO request is started. No arguments
+ // are passed with this topic.
// send: String
// "/dojo/io/send" is sent whenever a new IO request is started.
- // It passes the dojo.Deferred for the request with the topic.
+ // It passes the dojo.Deferred for the request with the topic.
// load: String
// "/dojo/io/load" is sent whenever an IO request has loaded
- // successfully. It passes the response and the dojo.Deferred
- // for the request with the topic.
+ // successfully. It passes the response and the dojo.Deferred
+ // for the request with the topic.
// error: String
// "/dojo/io/error" is sent whenever an IO request has errored.
- // It passes the error and the dojo.Deferred
- // for the request with the topic.
+ // It passes the error and the dojo.Deferred
+ // for the request with the topic.
// done: String
// "/dojo/io/done" is sent whenever an IO request has completed,
- // either by loading or by erroring. It passes the error and
- // the dojo.Deferred for the request with the topic.
+ // either by loading or by erroring. It passes the error and
+ // the dojo.Deferred for the request with the topic.
// stop: String
// "/dojo/io/stop" is sent when all outstanding IO requests have
- // finished. No arguments are passed with this topic.
+ // finished. No arguments are passed with this topic.
this.start = "/dojo/io/start";
this.send = "/dojo/io/send";
this.load = "/dojo/io/load";
@@ -10216,17 +10642,17 @@ dojo.provide("dojo._base.xhr");
//Get values from form if requestd.
var formObject = null;
if(args.form){
- var form = _d.byId(args.form);
+ var form = dom.byId(args.form);
//IE requires going through getAttributeNode instead of just getAttribute in some form cases,
- //so use it for all. See #2844
+ //so use it for all. See #2844
var actnNode = form.getAttributeNode("action");
ioArgs.url = ioArgs.url || (actnNode ? actnNode.value : null);
- formObject = _d.formToObject(form);
+ formObject = domForm.toObject(form);
}
// set up the query params
var miArgs = [{}];
-
+
if(formObject){
// potentially over-ride url-provided params w/ form values
miArgs.push(formObject);
@@ -10238,11 +10664,11 @@ dojo.provide("dojo._base.xhr");
if(args.preventCache){
miArgs.push({"dojo.preventCache": new Date().valueOf()});
}
- ioArgs.query = _d.objectToQuery(_d.mixin.apply(null, miArgs));
-
+ ioArgs.query = ioq.objectToQuery(lang.mixin.apply(null, miArgs));
+
// .. and the real work of getting the deferred in order, etc.
ioArgs.handleAs = args.handleAs || "text";
- var d = new _d.Deferred(canceller);
+ var d = new deferred(canceller);
d.addCallbacks(okHandler, function(error){
return errHandler(error, d);
});
@@ -10252,44 +10678,44 @@ dojo.provide("dojo._base.xhr");
//The callbacks will get the deferred result value as the
//first argument and the ioArgs object as the second argument.
var ld = args.load;
- if(ld && _d.isFunction(ld)){
+ if(ld && lang.isFunction(ld)){
d.addCallback(function(value){
return ld.call(args, value, ioArgs);
});
}
var err = args.error;
- if(err && _d.isFunction(err)){
+ if(err && lang.isFunction(err)){
d.addErrback(function(value){
return err.call(args, value, ioArgs);
});
}
var handle = args.handle;
- if(handle && _d.isFunction(handle)){
+ if(handle && lang.isFunction(handle)){
d.addBoth(function(value){
return handle.call(args, value, ioArgs);
});
}
//Plug in topic publishing, if dojo.publish is loaded.
- if(cfg.ioPublish && _d.publish && ioArgs.args.ioPublish !== false){
+ if(cfg.ioPublish && dojo.publish && ioArgs.args.ioPublish !== false){
d.addCallbacks(
function(res){
- _d.publish("/dojo/io/load", [d, res]);
+ dojo.publish("/dojo/io/load", [d, res]);
return res;
},
function(res){
- _d.publish("/dojo/io/error", [d, res]);
+ dojo.publish("/dojo/io/error", [d, res]);
return res;
}
);
d.addBoth(function(res){
- _d.publish("/dojo/io/done", [d, res]);
+ dojo.publish("/dojo/io/done", [d, res]);
return res;
});
}
d.ioArgs = ioArgs;
-
+
// FIXME: need to wire up the xhr object's abort method to something
// analagous in the Deferred
return d;
@@ -10297,7 +10723,7 @@ dojo.provide("dojo._base.xhr");
var _deferredCancel = function(/*Deferred*/dfd){
// summary: canceller function for dojo._ioSetArgs call.
-
+
dfd.canceled = true;
var xhr = dfd.ioArgs.xhr;
var _at = typeof xhr.abort;
@@ -10330,8 +10756,8 @@ dojo.provide("dojo._base.xhr");
// something fierece if we don't use unified loops.
var _inFlightIntvl = null;
var _inFlight = [];
-
-
+
+
//Use a separate count for knowing if we are starting/stopping io calls.
//Cannot use _inFlight.length since it can change at a different time than
//when we want to do this kind of test. We only want to decrement the count
@@ -10341,8 +10767,8 @@ dojo.provide("dojo._base.xhr");
var _checkPubCount = function(dfd){
if(_pubCount <= 0){
_pubCount = 0;
- if(cfg.ioPublish && _d.publish && (!dfd || dfd && dfd.ioArgs.args.ioPublish !== false)){
- _d.publish("/dojo/io/stop");
+ if(cfg.ioPublish && dojo.publish && (!dfd || dfd && dfd.ioArgs.args.ioPublish !== false)){
+ dojo.publish("/dojo/io/stop");
}
}
};
@@ -10351,12 +10777,12 @@ dojo.provide("dojo._base.xhr");
//summary:
// internal method that checks each inflight XMLHttpRequest to see
// if it has completed or if the timeout situation applies.
-
+
var now = (new Date()).getTime();
// make sure sync calls stay thread safe, if this callback is called
// during a sync call and this results in another sync call before the
// first sync call ends the browser hangs
- if(!_d._blockAsync){
+ if(!dojo._blockAsync){
// we need manual loop because we often modify _inFlight (and therefore 'i') while iterating
// note: the second clause is an assigment on purpose, lint may complain
for(var i = 0, tif; i < _inFlight.length && (tif = _inFlight[i]); i++){
@@ -10399,7 +10825,6 @@ dojo.provide("dojo._base.xhr");
if(!_inFlight.length){
clearInterval(_inFlightIntvl);
_inFlightIntvl = null;
- return;
}
};
@@ -10407,7 +10832,7 @@ dojo.provide("dojo._base.xhr");
//summary: Cancels all pending IO requests, regardless of IO type
//(xhr, script, iframe).
try{
- _d.forEach(_inFlight, function(i){
+ array.forEach(_inFlight, function(i){
try{
i.dfd.cancel();
}catch(e){/*squelch*/}
@@ -10417,28 +10842,28 @@ dojo.provide("dojo._base.xhr");
//Automatically call cancel all io calls on unload
//in IE for trac issue #2357.
- if(_d.isIE){
- _d.addOnWindowUnload(_d._ioCancelAll);
+ if(has("ie")){
+ on(window, "unload", dojo._ioCancelAll);
}
-
- _d._ioNotifyStart = function(/*Deferred*/dfd){
+
+ dojo._ioNotifyStart = function(/*Deferred*/dfd){
// summary:
- // If dojo.publish is available, publish topics
- // about the start of a request queue and/or the
- // the beginning of request.
+ // If dojo.publish is available, publish topics
+ // about the start of a request queue and/or the
+ // the beginning of request.
// description:
- // Used by IO transports. An IO transport should
- // call this method before making the network connection.
- if(cfg.ioPublish && _d.publish && dfd.ioArgs.args.ioPublish !== false){
+ // Used by IO transports. An IO transport should
+ // call this method before making the network connection.
+ if(cfg.ioPublish && dojo.publish && dfd.ioArgs.args.ioPublish !== false){
if(!_pubCount){
- _d.publish("/dojo/io/start");
+ dojo.publish("/dojo/io/start");
}
_pubCount += 1;
- _d.publish("/dojo/io/send", [dfd]);
+ dojo.publish("/dojo/io/send", [dfd]);
}
};
- _d._ioWatch = function(dfd, validCheck, ioCheck, resHandle){
+ dojo._ioWatch = function(dfd, validCheck, ioCheck, resHandle){
// summary:
// Watches the io request represented by dfd to see if it completes.
// dfd: Deferred
@@ -10456,7 +10881,7 @@ dojo.provide("dojo._base.xhr");
if(args.timeout){
dfd.startTime = (new Date()).getTime();
}
-
+
_inFlight.push({dfd: dfd, validCheck: validCheck, ioCheck: ioCheck, resHandle: resHandle});
if(!_inFlightIntvl){
_inFlightIntvl = setInterval(_watchInFlight, 50);
@@ -10481,12 +10906,13 @@ dojo.provide("dojo._base.xhr");
};
var _resHandle = function(/*Deferred*/dfd){
var xhr = dfd.ioArgs.xhr;
- if(_d._isDocumentOk(xhr)){
+ if(dojo._isDocumentOk(xhr)){
dfd.callback(dfd);
}else{
var err = new Error("Unable to load " + dfd.ioArgs.url + " status:" + xhr.status);
err.status = xhr.status;
err.responseText = xhr.responseText;
+ err.xhr = xhr;
dfd.errback(err);
}
};
@@ -10518,6 +10944,10 @@ dojo.provide("dojo._base.xhr");
// false is default. Indicates whether a request should be
// allowed to fail (and therefore no console error message in
// the event of a failure)
+ // contentType: String|Boolean
+ // "application/x-www-form-urlencoded" is default. Set to false to
+ // prevent a Content-Type header from being sent, or to a string
+ // to send a different Content-Type.
this.handleAs = handleAs;
this.sync = sync;
this.headers = headers;
@@ -10535,17 +10965,17 @@ dojo.provide("dojo._base.xhr");
// for those HTTP methods. There are also methods for "raw" PUT and POST methods
// via dojo.rawXhrPut() and dojo.rawXhrPost() respectively.
// method:
- // HTTP method to be used, such as GET, POST, PUT, DELETE. Should be uppercase.
+ // HTTP method to be used, such as GET, POST, PUT, DELETE. Should be uppercase.
// hasBody:
// If the request has an HTTP body, then pass true for hasBody.
//Make the Deferred object for this xhr request.
- var dfd = _d._ioSetArgs(args, _deferredCancel, _deferredOk, _deferError);
+ var dfd = dojo._ioSetArgs(args, _deferredCancel, _deferredOk, _deferError);
var ioArgs = dfd.ioArgs;
//Pass the args to _xhrObj, to allow alternate XHR calls based specific calls, like
//the one used for iframe proxies.
- var xhr = ioArgs.xhr = _d._xhrObj(ioArgs.args);
+ var xhr = ioArgs.xhr = dojo._xhrObj(ioArgs.args);
//If XHR factory fails, cancel the deferred.
if(!xhr){
dfd.cancel();
@@ -10562,7 +10992,7 @@ dojo.provide("dojo._base.xhr");
}else if((arguments.length > 2 && !hasBody) || "POST|PUT".indexOf(method.toUpperCase()) == -1){
//Check for hasBody being passed. If no hasBody,
//then only append query string if not a POST or PUT request.
- _d._ioAddQueryToUrl(ioArgs);
+ dojo._ioAddQueryToUrl(ioArgs);
}
// IE 6 is a steaming pile. It won't let you call apply() on the native function (xhr.open).
@@ -10580,12 +11010,14 @@ dojo.provide("dojo._base.xhr");
}
}
// FIXME: is this appropriate for all content types?
- xhr.setRequestHeader("Content-Type", args.contentType || _defaultContentType);
+ if(args.contentType !== false){
+ xhr.setRequestHeader("Content-Type", args.contentType || _defaultContentType);
+ }
if(!args.headers || !("X-Requested-With" in args.headers)){
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
}
// FIXME: set other headers here!
- _d._ioNotifyStart(dfd);
+ dojo._ioNotifyStart(dfd);
if(dojo.config.debugAtAllCosts){
xhr.send(ioArgs.query);
}else{
@@ -10596,7 +11028,7 @@ dojo.provide("dojo._base.xhr");
dfd.cancel();
}
}
- _d._ioWatch(dfd, _validCheck, _ioCheck, _resHandle);
+ dojo._ioWatch(dfd, _validCheck, _ioCheck, _resHandle);
xhr = null;
return dfd; // dojo.Deferred
};
@@ -10604,7 +11036,7 @@ dojo.provide("dojo._base.xhr");
dojo.xhrGet = function(/*dojo.__XhrArgs*/ args){
// summary:
// Sends an HTTP GET request to the server.
- return _d.xhr("GET", args); // dojo.Deferred
+ return dojo.xhr("GET", args); // dojo.Deferred
};
dojo.rawXhrPost = dojo.xhrPost = function(/*dojo.__XhrArgs*/ args){
@@ -10613,7 +11045,7 @@ dojo.provide("dojo._base.xhr");
// listed for the dojo.__XhrArgs type, the following property is allowed:
// postData:
// String. Send raw data in the body of the POST request.
- return _d.xhr("POST", args, true); // dojo.Deferred
+ return dojo.xhr("POST", args, true); // dojo.Deferred
};
dojo.rawXhrPut = dojo.xhrPut = function(/*dojo.__XhrArgs*/ args){
@@ -10622,13 +11054,13 @@ dojo.provide("dojo._base.xhr");
// listed for the dojo.__XhrArgs type, the following property is allowed:
// putData:
// String. Send raw data in the body of the PUT request.
- return _d.xhr("PUT", args, true); // dojo.Deferred
+ return dojo.xhr("PUT", args, true); // dojo.Deferred
};
dojo.xhrDelete = function(/*dojo.__XhrArgs*/ args){
// summary:
// Sends an HTTP DELETE request to the server.
- return _d.xhr("DELETE", args); //dojo.Deferred
+ return dojo.xhr("DELETE", args); //dojo.Deferred
};
/*
@@ -10642,722 +11074,3106 @@ dojo.provide("dojo._base.xhr");
throw new Error("dojo.wrapForm not yet implemented");
}
*/
-})();
-
-}
-
-if(!dojo._hasResource["dojo._base.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.fx"] = true;
-dojo.provide("dojo._base.fx");
+ dojo._isDocumentOk = function(http){
+ var stat = http.status || 0;
+ stat =
+ (stat >= 200 && stat < 300) || // allow any 2XX response code
+ stat == 304 || // or, get it out of the cache
+ stat == 1223 || // or, Internet Explorer mangled the status code
+ !stat; // or, we're Titanium/browser chrome/chrome extension requesting a local file
+ return stat; // Boolean
+ };
+
+ dojo._getText = function(url){
+ var result;
+ dojo.xhrGet({url:url, sync:true, load:function(text){
+ result = text;
+ }});
+ return result;
+ };
+ // Add aliases for static functions to dojo.xhr since dojo.xhr is what's returned from this module
+ lang.mixin(dojo.xhr, {
+ _xhrObj: dojo._xhrObj,
+ fieldToObject: domForm.fieldToObject,
+ formToObject: domForm.toObject,
+ objectToQuery: ioq.objectToQuery,
+ formToQuery: domForm.toQuery,
+ formToJson: domForm.toJson,
+ queryToObject: ioq.queryToObject,
+ contentHandlers: handlers,
+ _ioSetArgs: dojo._ioSetArgs,
+ _ioCancelAll: dojo._ioCancelAll,
+ _ioNotifyStart: dojo._ioNotifyStart,
+ _ioWatch: dojo._ioWatch,
+ _ioAddQueryToUrl: dojo._ioAddQueryToUrl,
+ _isDocumentOk: dojo._isDocumentOk,
+ _getText: dojo._getText,
+ get: dojo.xhrGet,
+ post: dojo.xhrPost,
+ put: dojo.xhrPut,
+ del: dojo.xhrDelete // because "delete" is a reserved word
+ });
+ return dojo.xhr;
+});
+},
+'dojo/_base/unload':function(){
+define(["./kernel", "./connect"], function(dojo, connect) {
+ // module:
+ // dojo/unload
+ // summary:
+ // This module contains the document and window unload detection API.
+ var win = window;
-/*
- Animation loosely package based on Dan Pupius' work, contributed under CLA:
- http://pupius.co.uk/js/Toolkit.Drawing.js
-*/
-(function(){
- var d = dojo;
- var _mixin = d._mixin;
+ /*=====
+ dojo.windowUnloaded = function(){
+ // summary:
+ // signal fired by impending window destruction. You may use
+ // dojo.addOnWindowUnload() to register a listener for this
+ // event. NOTE: if you wish to dojo.connect() to this method
+ // to perform page/application cleanup, be aware that this
+ // event WILL NOT fire if no handler has been registered with
+ // dojo.addOnWindowUnload. This behavior started in Dojo 1.3.
+ // Previous versions always triggered dojo.windowUnloaded. See
+ // dojo.addOnWindowUnload for more info.
+ };
+ =====*/
- dojo._Line = function(/*int*/ start, /*int*/ end){
- // summary:
- // dojo._Line is the object used to generate values from a start value
- // to an end value
- // start: int
- // Beginning value for range
- // end: int
- // Ending value for range
- this.start = start;
- this.end = end;
- };
+ dojo.addOnWindowUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
+ // summary:
+ // registers a function to be triggered when window.onunload
+ // fires.
+ // description:
+ // The first time that addOnWindowUnload is called Dojo
+ // will register a page listener to trigger your unload
+ // handler with. Note that registering these handlers may
+ // destory "fastback" page caching in browsers that support
+ // it. Be careful trying to modify the DOM or access
+ // JavaScript properties during this phase of page unloading:
+ // they may not always be available. Consider
+ // dojo.addOnUnload() if you need to modify the DOM or do
+ // heavy JavaScript work since it fires at the eqivalent of
+ // the page's "onbeforeunload" event.
+ // example:
+ // | dojo.addOnWindowUnload(functionPointer)
+ // | dojo.addOnWindowUnload(object, "functionName");
+ // | dojo.addOnWindowUnload(object, function(){ /* ... */});
- dojo._Line.prototype.getValue = function(/*float*/ n){
- // summary: Returns the point on the line
- // n: a floating point number greater than 0 and less than 1
- return ((this.end - this.start) * n) + this.start; // Decimal
+ if (!dojo.windowUnloaded) {
+ connect.connect(win, "unload", (dojo.windowUnloaded= function(){}));
+ }
+ connect.connect(win, "unload", obj, functionName);
};
- dojo.Animation = function(args){
- // summary:
- // A generic animation class that fires callbacks into its handlers
- // object at various states.
+ dojo.addOnUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){
+ // summary:
+ // registers a function to be triggered when the page unloads.
// description:
- // A generic animation class that fires callbacks into its handlers
- // object at various states. Nearly all dojo animation functions
- // return an instance of this method, usually without calling the
- // .play() method beforehand. Therefore, you will likely need to
- // call .play() on instances of `dojo.Animation` when one is
- // returned.
- // args: Object
- // The 'magic argument', mixing all the properties into this
- // animation instance.
+ // The first time that addOnUnload is called Dojo will
+ // register a page listener to trigger your unload handler
+ // with.
+ //
+ // In a browser enviroment, the functions will be triggered
+ // during the window.onbeforeunload event. Be careful of doing
+ // too much work in an unload handler. onbeforeunload can be
+ // triggered if a link to download a file is clicked, or if
+ // the link is a javascript: link. In these cases, the
+ // onbeforeunload event fires, but the document is not
+ // actually destroyed. So be careful about doing destructive
+ // operations in a dojo.addOnUnload callback.
+ //
+ // Further note that calling dojo.addOnUnload will prevent
+ // browsers from using a "fast back" cache to make page
+ // loading via back button instantaneous.
+ // example:
+ // | dojo.addOnUnload(functionPointer)
+ // | dojo.addOnUnload(object, "functionName")
+ // | dojo.addOnUnload(object, function(){ /* ... */});
- _mixin(this, args);
- if(d.isArray(this.curve)){
- this.curve = new d._Line(this.curve[0], this.curve[1]);
- }
+ connect.connect(win, "beforeunload", obj, functionName);
+ };
+ return {
+ addOnWindowUnload: dojo.addOnWindowUnload,
+ addOnUnload: dojo.addOnUnload
};
+});
- // Alias to drop come 2.0:
- d._Animation = d.Animation;
-
- d.extend(dojo.Animation, {
- // duration: Integer
- // The time in milliseonds the animation will take to run
- duration: 350,
+},
+'dojo/_base/NodeList':function(){
+define(["./kernel", "../query", "./array", "./html", "../NodeList-dom"], function(dojo, query, array){
+ // module:
+ // dojo/_base/NodeList
+ // summary:
+ // This module defines dojo.NodeList.
+
+var NodeList = query.NodeList;
/*=====
- // curve: dojo._Line|Array
- // A two element array of start and end values, or a `dojo._Line` instance to be
- // used in the Animation.
- curve: null,
+ dojo.extend(dojo.NodeList, {
+ connect: function(methodName, objOrFunc, funcName){
+ // summary:
+ // attach event handlers to every item of the NodeList. Uses dojo.connect()
+ // so event properties are normalized
+ // methodName: String
+ // the name of the method to attach to. For DOM events, this should be
+ // the lower-case name of the event
+ // objOrFunc: Object|Function|String
+ // if 2 arguments are passed (methodName, objOrFunc), objOrFunc should
+ // reference a function or be the name of the function in the global
+ // namespace to attach. If 3 arguments are provided
+ // (methodName, objOrFunc, funcName), objOrFunc must be the scope to
+ // locate the bound function in
+ // funcName: String?
+ // optional. A string naming the function in objOrFunc to bind to the
+ // event. May also be a function reference.
+ // example:
+ // add an onclick handler to every button on the page
+ // | dojo.query("div:nth-child(odd)").connect("onclick", function(e){
+ // | console.log("clicked!");
+ // | });
+ // example:
+ // attach foo.bar() to every odd div's onmouseover
+ // | dojo.query("div:nth-child(odd)").connect("onmouseover", foo, "bar");
+ },
+ coords: function(){
+ // summary:
+ // Deprecated: Use position() for border-box x/y/w/h
+ // or marginBox() for margin-box w/h/l/t.
+ // Returns the box objects of all elements in a node list as
+ // an Array (*not* a NodeList). Acts like `dojo.coords`, though assumes
+ // the node passed is each node in this list.
- // easing: Function?
- // A Function to adjust the acceleration (or deceleration) of the progress
- // across a dojo._Line
- easing: null,
+ return dojo.map(this, dojo.coords); // Array
+ }
+ });
+
+ var NodeList = dojo.NodeList;
=====*/
+ var nlp = NodeList.prototype;
- // repeat: Integer?
- // The number of times to loop the animation
- repeat: 0,
+ // don't bind early to dojo.connect since we no longer explicitly depend on it
+ nlp.connect = NodeList._adaptAsForEach(function(){
+ return dojo.connect.apply(this, arguments);
+ });
+ nlp.coords = NodeList._adaptAsMap(dojo.coords);
- // rate: Integer?
- // the time in milliseconds to wait before advancing to next frame
- // (used as a fps timer: 1000/rate = fps)
- rate: 20 /* 50 fps */,
+ NodeList.events = [
+ // summary:
+ // list of all DOM events used in NodeList
+ "blur", "focus", "change", "click", "error", "keydown", "keypress",
+ "keyup", "load", "mousedown", "mouseenter", "mouseleave", "mousemove",
+ "mouseout", "mouseover", "mouseup", "submit"
+ ];
- /*=====
- // delay: Integer?
- // The time in milliseconds to wait before starting animation after it
- // has been .play()'ed
- delay: null,
+ // FIXME: pseudo-doc the above automatically generated on-event functions
- // beforeBegin: Event?
- // Synthetic event fired before a dojo.Animation begins playing (synchronous)
- beforeBegin: null,
+ // syntactic sugar for DOM events
+ array.forEach(NodeList.events, function(evt){
+ var _oe = "on" + evt;
+ nlp[_oe] = function(a, b){
+ return this.connect(_oe, a, b);
+ };
+ // FIXME: should these events trigger publishes?
+ /*
+ return (a ? this.connect(_oe, a, b) :
+ this.forEach(function(n){
+ // FIXME:
+ // listeners get buried by
+ // addEventListener and can't be dug back
+ // out to be triggered externally.
+ // see:
+ // http://developer.mozilla.org/en/docs/DOM:element
- // onBegin: Event?
- // Synthetic event fired as a dojo.Animation begins playing (useful?)
- onBegin: null,
+ console.log(n, evt, _oe);
- // onAnimate: Event?
- // Synthetic event fired at each interval of a `dojo.Animation`
- onAnimate: null,
+ // FIXME: need synthetic event support!
+ var _e = { target: n, faux: true, type: evt };
+ // dojo._event_listener._synthesizeEvent({}, { target: n, faux: true, type: evt });
+ try{ n[evt](_e); }catch(e){ console.log(e); }
+ try{ n[_oe](_e); }catch(e){ console.log(e); }
+ })
+ );
+ */
+ }
+ );
- // onEnd: Event?
- // Synthetic event fired after the final frame of a `dojo.Animation`
- onEnd: null,
+ dojo.NodeList = NodeList;
+ return dojo.NodeList;
+});
- // onPlay: Event?
- // Synthetic event fired any time a `dojo.Animation` is play()'ed
- onPlay: null,
-
- // onPause: Event?
- // Synthetic event fired when a `dojo.Animation` is paused
- onPause: null,
+},
+'dojo/_base/Color':function(){
+define(["./kernel", "./lang", "./array", "./config"], function(dojo, lang, ArrayUtil, config){
- // onStop: Event
- // Synthetic event fires when a `dojo.Animation` is stopped
- onStop: null,
+ var Color = dojo.Color = function(/*Array|String|Object*/ color){
+ // summary:
+ // Takes a named string, hex string, array of rgb or rgba values,
+ // an object with r, g, b, and a properties, or another `dojo.Color` object
+ // and creates a new Color instance to work from.
+ //
+ // example:
+ // Work with a Color instance:
+ // | var c = new dojo.Color();
+ // | c.setColor([0,0,0]); // black
+ // | var hex = c.toHex(); // #000000
+ //
+ // example:
+ // Work with a node's color:
+ // | var color = dojo.style("someNode", "backgroundColor");
+ // | var n = new dojo.Color(color);
+ // | // adjust the color some
+ // | n.r *= .5;
+ // | console.log(n.toString()); // rgb(128, 255, 255);
+ if(color){ this.setColor(color); }
+ };
+ /*=====
+ lang.mixin(dojo.Color,{
+ named:{
+ // summary: Dictionary list of all CSS named colors, by name. Values are 3-item arrays with corresponding RG and B values.
+ }
+ });
=====*/
- _percent: 0,
- _startRepeatCount: 0,
-
- _getStep: function(){
- var _p = this._percent,
- _e = this.easing
- ;
- return _e ? _e(_p) : _p;
+ // FIXME:
+ // there's got to be a more space-efficient way to encode or discover
+ // these!! Use hex?
+ Color.named = {
+ "black": [0,0,0],
+ "silver": [192,192,192],
+ "gray": [128,128,128],
+ "white": [255,255,255],
+ "maroon": [128,0,0],
+ "red": [255,0,0],
+ "purple": [128,0,128],
+ "fuchsia":[255,0,255],
+ "green": [0,128,0],
+ "lime": [0,255,0],
+ "olive": [128,128,0],
+ "yellow": [255,255,0],
+ "navy": [0,0,128],
+ "blue": [0,0,255],
+ "teal": [0,128,128],
+ "aqua": [0,255,255],
+ "transparent": config.transparentColor || [0,0,0,0]
+ };
+
+ lang.extend(Color, {
+ r: 255, g: 255, b: 255, a: 1,
+ _set: function(r, g, b, a){
+ var t = this; t.r = r; t.g = g; t.b = b; t.a = a;
},
- _fire: function(/*Event*/ evt, /*Array?*/ args){
- // summary:
- // Convenience function. Fire event "evt" and pass it the
- // arguments specified in "args".
- // description:
- // Convenience function. Fire event "evt" and pass it the
- // arguments specified in "args".
- // Fires the callback in the scope of the `dojo.Animation`
- // instance.
- // evt:
- // The event to fire.
- // args:
- // The arguments to pass to the event.
- var a = args||[];
- if(this[evt]){
- if(d.config.debugAtAllCosts){
- this[evt].apply(this, a);
- }else{
- try{
- this[evt].apply(this, a);
- }catch(e){
- // squelch and log because we shouldn't allow exceptions in
- // synthetic event handlers to cause the internal timer to run
- // amuck, potentially pegging the CPU. I'm not a fan of this
- // squelch, but hopefully logging will make it clear what's
- // going on
- console.error("exception in animation handler for:", evt);
- console.error(e);
- }
- }
+ setColor: function(/*Array|String|Object*/ color){
+ // summary:
+ // Takes a named string, hex string, array of rgb or rgba values,
+ // an object with r, g, b, and a properties, or another `dojo.Color` object
+ // and sets this color instance to that value.
+ //
+ // example:
+ // | var c = new dojo.Color(); // no color
+ // | c.setColor("#ededed"); // greyish
+ if(lang.isString(color)){
+ Color.fromString(color, this);
+ }else if(lang.isArray(color)){
+ Color.fromArray(color, this);
+ }else{
+ this._set(color.r, color.g, color.b, color.a);
+ if(!(color instanceof Color)){ this.sanitize(); }
}
- return this; // dojo.Animation
+ return this; // dojo.Color
},
-
- play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
+ sanitize: function(){
// summary:
- // Start the animation.
- // delay:
- // How many milliseconds to delay before starting.
- // gotoStart:
- // If true, starts the animation from the beginning; otherwise,
- // starts it from its current position.
- // returns: dojo.Animation
- // The instance to allow chaining.
+ // Ensures the object has correct attributes
+ // description:
+ // the default implementation does nothing, include dojo.colors to
+ // augment it with real checks
+ return this; // dojo.Color
+ },
+ toRgb: function(){
+ // summary:
+ // Returns 3 component array of rgb values
+ // example:
+ // | var c = new dojo.Color("#000000");
+ // | console.log(c.toRgb()); // [0,0,0]
+ var t = this;
+ return [t.r, t.g, t.b]; // Array
+ },
+ toRgba: function(){
+ // summary:
+ // Returns a 4 component array of rgba values from the color
+ // represented by this object.
+ var t = this;
+ return [t.r, t.g, t.b, t.a]; // Array
+ },
+ toHex: function(){
+ // summary:
+ // Returns a CSS color string in hexadecimal representation
+ // example:
+ // | console.log(new dojo.Color([0,0,0]).toHex()); // #000000
+ var arr = ArrayUtil.map(["r", "g", "b"], function(x){
+ var s = this[x].toString(16);
+ return s.length < 2 ? "0" + s : s;
+ }, this);
+ return "#" + arr.join(""); // String
+ },
+ toCss: function(/*Boolean?*/ includeAlpha){
+ // summary:
+ // Returns a css color string in rgb(a) representation
+ // example:
+ // | var c = new dojo.Color("#FFF").toCss();
+ // | console.log(c); // rgb('255','255','255')
+ var t = this, rgb = t.r + ", " + t.g + ", " + t.b;
+ return (includeAlpha ? "rgba(" + rgb + ", " + t.a : "rgb(" + rgb) + ")"; // String
+ },
+ toString: function(){
+ // summary:
+ // Returns a visual representation of the color
+ return this.toCss(true); // String
+ }
+ });
- var _t = this;
- if(_t._delayTimer){ _t._clearTimer(); }
- if(gotoStart){
- _t._stopTimer();
- _t._active = _t._paused = false;
- _t._percent = 0;
- }else if(_t._active && !_t._paused){
- return _t;
- }
+ Color.blendColors = dojo.blendColors = function(
+ /*dojo.Color*/ start,
+ /*dojo.Color*/ end,
+ /*Number*/ weight,
+ /*dojo.Color?*/ obj
+ ){
+ // summary:
+ // Blend colors end and start with weight from 0 to 1, 0.5 being a 50/50 blend,
+ // can reuse a previously allocated dojo.Color object for the result
+ var t = obj || new Color();
+ ArrayUtil.forEach(["r", "g", "b", "a"], function(x){
+ t[x] = start[x] + (end[x] - start[x]) * weight;
+ if(x != "a"){ t[x] = Math.round(t[x]); }
+ });
+ return t.sanitize(); // dojo.Color
+ };
- _t._fire("beforeBegin", [_t.node]);
+ Color.fromRgb = dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){
+ // summary:
+ // Returns a `dojo.Color` instance from a string of the form
+ // "rgb(...)" or "rgba(...)". Optionally accepts a `dojo.Color`
+ // object to update with the parsed value and return instead of
+ // creating a new object.
+ // returns:
+ // A dojo.Color object. If obj is passed, it will be the return value.
+ var m = color.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);
+ return m && Color.fromArray(m[1].split(/\s*,\s*/), obj); // dojo.Color
+ };
- var de = delay || _t.delay,
- _p = dojo.hitch(_t, "_play", gotoStart);
+ Color.fromHex = dojo.colorFromHex = function(/*String*/ color, /*dojo.Color?*/ obj){
+ // summary:
+ // Converts a hex string with a '#' prefix to a color object.
+ // Supports 12-bit #rgb shorthand. Optionally accepts a
+ // `dojo.Color` object to update with the parsed value.
+ //
+ // returns:
+ // A dojo.Color object. If obj is passed, it will be the return value.
+ //
+ // example:
+ // | var thing = dojo.colorFromHex("#ededed"); // grey, longhand
+ //
+ // example:
+ // | var thing = dojo.colorFromHex("#000"); // black, shorthand
+ var t = obj || new Color(),
+ bits = (color.length == 4) ? 4 : 8,
+ mask = (1 << bits) - 1;
+ color = Number("0x" + color.substr(1));
+ if(isNaN(color)){
+ return null; // dojo.Color
+ }
+ ArrayUtil.forEach(["b", "g", "r"], function(x){
+ var c = color & mask;
+ color >>= bits;
+ t[x] = bits == 4 ? 17 * c : c;
+ });
+ t.a = 1;
+ return t; // dojo.Color
+ };
- if(de > 0){
- _t._delayTimer = setTimeout(_p, de);
- return _t;
- }
- _p();
- return _t;
- },
+ Color.fromArray = dojo.colorFromArray = function(/*Array*/ a, /*dojo.Color?*/ obj){
+ // summary:
+ // Builds a `dojo.Color` from a 3 or 4 element array, mapping each
+ // element in sequence to the rgb(a) values of the color.
+ // example:
+ // | var myColor = dojo.colorFromArray([237,237,237,0.5]); // grey, 50% alpha
+ // returns:
+ // A dojo.Color object. If obj is passed, it will be the return value.
+ var t = obj || new Color();
+ t._set(Number(a[0]), Number(a[1]), Number(a[2]), Number(a[3]));
+ if(isNaN(t.a)){ t.a = 1; }
+ return t.sanitize(); // dojo.Color
+ };
- _play: function(gotoStart){
- var _t = this;
- if(_t._delayTimer){ _t._clearTimer(); }
- _t._startTime = new Date().valueOf();
- if(_t._paused){
- _t._startTime -= _t.duration * _t._percent;
+ Color.fromString = dojo.colorFromString = function(/*String*/ str, /*dojo.Color?*/ obj){
+ // summary:
+ // Parses `str` for a color value. Accepts hex, rgb, and rgba
+ // style color values.
+ // description:
+ // Acceptable input values for str may include arrays of any form
+ // accepted by dojo.colorFromArray, hex strings such as "#aaaaaa", or
+ // rgb or rgba strings such as "rgb(133, 200, 16)" or "rgba(10, 10,
+ // 10, 50)"
+ // returns:
+ // A dojo.Color object. If obj is passed, it will be the return value.
+ var a = Color.named[str];
+ return a && Color.fromArray(a, obj) || Color.fromRgb(str, obj) || Color.fromHex(str, obj); // dojo.Color
+ };
+
+ return Color;
+});
+
+},
+'dojo/selector/_loader':function(){
+define(["../has", "require"],
+ function(has, require){
+// summary:
+// This module handles loading the appropriate selector engine for the given browser
+"use strict";
+var testDiv = document.createElement("div");
+has.add("dom-qsa2.1", !!testDiv.querySelectorAll);
+has.add("dom-qsa3", function(){
+ // test to see if we have a reasonable native selector engine available
+ try{
+ testDiv.innerHTML = "<p class='TEST'></p>"; // test kind of from sizzle
+ // Safari can't handle uppercase or unicode characters when
+ // in quirks mode, IE8 can't handle pseudos like :empty
+ return testDiv.querySelectorAll(".TEST:empty").length == 1;
+ }catch(e){}
+ });
+var fullEngine;
+var acme = "./acme", lite = "./lite";
+return {
+ load: function(id, parentRequire, loaded, config){
+ var req = require;
+ // here we implement the default logic for choosing a selector engine
+ id = id == "default" ? has("config-selectorEngine") || "css3" : id;
+ id = id == "css2" || id == "lite" ? lite :
+ id == "css2.1" ? has("dom-qsa2.1") ? lite : acme :
+ id == "css3" ? has("dom-qsa3") ? lite : acme :
+ id == "acme" ? acme : (req = parentRequire) && id;
+ if(id.charAt(id.length-1) == '?'){
+ id = id.substring(0,id.length - 1);
+ var optionalLoad = true;
+ }
+ // the query engine is optional, only load it if a native one is not available or existing one has not been loaded
+ if(optionalLoad && (has("dom-compliant-qsa") || fullEngine)){
+ return loaded(fullEngine);
+ }
+ // load the referenced selector engine
+ req([id], function(engine){
+ if(id != "./lite"){
+ fullEngine = engine;
+ }
+ loaded(engine);
+ });
+ }
+};
+});
+
+},
+'dojo/on':function(){
+define(["./has!dom-addeventlistener?:./aspect", "./_base/kernel", "./has"], function(aspect, dojo, has){
+ // summary:
+ // The export of this module is a function that provides core event listening functionality. With this function
+ // you can provide a target, event type, and listener to be notified of
+ // future matching events that are fired.
+ // target: Element|Object
+ // This is the target object or DOM element that to receive events from
+ // type: String|Function
+ // This is the name of the event to listen for or an extension event type.
+ // listener: Function
+ // This is the function that should be called when the event fires.
+ // returns: Object
+ // An object with a remove() method that can be used to stop listening for this
+ // event.
+ // description:
+ // To listen for "click" events on a button node, we can do:
+ // | define(["dojo/on"], function(listen){
+ // | on(button, "click", clickHandler);
+ // | ...
+ // Evented JavaScript objects can also have their own events.
+ // | var obj = new Evented;
+ // | on(obj, "foo", fooHandler);
+ // And then we could publish a "foo" event:
+ // | on.emit(obj, "foo", {key: "value"});
+ // We can use extension events as well. For example, you could listen for a tap gesture:
+ // | define(["dojo/on", "dojo/gesture/tap", function(listen, tap){
+ // | on(button, tap, tapHandler);
+ // | ...
+ // which would trigger fooHandler. Note that for a simple object this is equivalent to calling:
+ // | obj.onfoo({key:"value"});
+ // If you use on.emit on a DOM node, it will use native event dispatching when possible.
+
+ "use strict";
+ if(1){ // check to make sure we are in a browser, this module should work anywhere
+ var major = window.ScriptEngineMajorVersion;
+ has.add("jscript", major && (major() + ScriptEngineMinorVersion() / 10));
+ has.add("event-orientationchange", has("touch") && !has("android")); // TODO: how do we detect this?
+ }
+ var on = function(target, type, listener, dontFix){
+ if(target.on){
+ // delegate to the target's on() method, so it can handle it's own listening if it wants
+ return target.on(type, listener);
+ }
+ // delegate to main listener code
+ return on.parse(target, type, listener, addListener, dontFix, this);
+ };
+ on.pausable = function(target, type, listener, dontFix){
+ // summary:
+ // This function acts the same as on(), but with pausable functionality. The
+ // returned signal object has pause() and resume() functions. Calling the
+ // pause() method will cause the listener to not be called for future events. Calling the
+ // resume() method will cause the listener to again be called for future events.
+ var paused;
+ var signal = on(target, type, function(){
+ if(!paused){
+ return listener.apply(this, arguments);
+ }
+ }, dontFix);
+ signal.pause = function(){
+ paused = true;
+ };
+ signal.resume = function(){
+ paused = false;
+ };
+ return signal;
+ };
+ on.once = function(target, type, listener, dontFix){
+ // summary:
+ // This function acts the same as on(), but will only call the listener once. The
+ // listener will be called for the first
+ // event that takes place and then listener will automatically be removed.
+ var signal = on(target, type, function(){
+ // remove this listener
+ signal.remove();
+ // proceed to call the listener
+ return listener.apply(this, arguments);
+ });
+ return signal;
+ };
+ on.parse = function(target, type, listener, addListener, dontFix, matchesTarget){
+ if(type.call){
+ // event handler function
+ // on(node, dojo.touch.press, touchListener);
+ return type.call(matchesTarget, target, listener);
+ }
+
+ if(type.indexOf(",") > -1){
+ // we allow comma delimited event names, so you can register for multiple events at once
+ var events = type.split(/\s*,\s*/);
+ var handles = [];
+ var i = 0;
+ var eventName;
+ while(eventName = events[i++]){
+ handles.push(addListener(target, eventName, listener, dontFix, matchesTarget));
+ }
+ handles.remove = function(){
+ for(var i = 0; i < handles.length; i++){
+ handles[i].remove();
+ }
+ };
+ return handles;
+ }
+ return addListener(target, type, listener, dontFix, matchesTarget)
+ };
+ var touchEvents = /^touch/;
+ function addListener(target, type, listener, dontFix, matchesTarget){
+ // event delegation:
+ var selector = type.match(/(.*):(.*)/);
+ // if we have a selector:event, the last one is interpreted as an event, and we use event delegation
+ if(selector){
+ type = selector[2];
+ selector = selector[1];
+ // create the extension event for selectors and directly call it
+ return on.selector(selector, type).call(matchesTarget, target, listener);
+ }
+ // test to see if it a touch event right now, so we don't have to do it every time it fires
+ if(has("touch")){
+ if(touchEvents.test(type)){
+ // touch event, fix it
+ listener = fixTouchListener(listener);
+ }
+ if(!has("event-orientationchange") && (type == "orientationchange")){
+ //"orientationchange" not supported <= Android 2.1,
+ //but works through "resize" on window
+ type = "resize";
+ target = window;
+ listener = fixTouchListener(listener);
+ }
+ }
+ // normal path, the target is |this|
+ if(target.addEventListener){
+ // the target has addEventListener, which should be used if available (might or might not be a node, non-nodes can implement this method as well)
+ // check for capture conversions
+ var capture = type in captures;
+ target.addEventListener(capture ? captures[type] : type, listener, capture);
+ // create and return the signal
+ return {
+ remove: function(){
+ target.removeEventListener(type, listener, capture);
+ }
+ };
+ }
+ type = "on" + type;
+ if(fixAttach && target.attachEvent){
+ return fixAttach(target, type, listener);
+ }
+ throw new Error("Target must be an event emitter");
+ }
+
+ on.selector = function(selector, eventType, children){
+ // summary:
+ // Creates a new extension event with event delegation. This is based on
+ // the provided event type (can be extension event) that
+ // only calls the listener when the CSS selector matches the target of the event.
+ // selector:
+ // The CSS selector to use for filter events and determine the |this| of the event listener.
+ // eventType:
+ // The event to listen for
+ // children:
+ // Indicates if children elements of the selector should be allowed. This defaults to
+ // true (except in the case of normally non-bubbling events like mouse.enter, in which case it defaults to false).
+ // example:
+ // define(["dojo/on", "dojo/mouse"], function(listen, mouse){
+ // on(node, on.selector(".my-class", mouse.enter), handlerForMyHover);
+ return function(target, listener){
+ var matchesTarget = this;
+ var bubble = eventType.bubble;
+ if(bubble){
+ // the event type doesn't naturally bubble, but has a bubbling form, use that
+ eventType = bubble;
+ }else if(children !== false){
+ // for normal bubbling events we default to allowing children of the selector
+ children = true;
+ }
+ return on(target, eventType, function(event){
+ var eventTarget = event.target;
+ // see if we have a valid matchesTarget or default to dojo.query
+ matchesTarget = matchesTarget && matchesTarget.matches ? matchesTarget : dojo.query;
+ // there is a selector, so make sure it matches
+ while(!matchesTarget.matches(eventTarget, selector, target)){
+ if(eventTarget == target || !children || !(eventTarget = eventTarget.parentNode)){ // intentional assignment
+ return;
+ }
+ }
+ return listener.call(eventTarget, event);
+ });
+ };
+ };
+
+ function syntheticPreventDefault(){
+ this.cancelable = false;
+ }
+ function syntheticStopPropagation(){
+ this.bubbles = false;
+ }
+ var slice = [].slice,
+ syntheticDispatch = on.emit = function(target, type, event){
+ // summary:
+ // Fires an event on the target object.
+ // target:
+ // The target object to fire the event on. This can be a DOM element or a plain
+ // JS object. If the target is a DOM element, native event emiting mechanisms
+ // are used when possible.
+ // type:
+ // The event type name. You can emulate standard native events like "click" and
+ // "mouseover" or create custom events like "open" or "finish".
+ // event:
+ // An object that provides the properties for the event. See https://developer.mozilla.org/en/DOM/event.initEvent
+ // for some of the properties. These properties are copied to the event object.
+ // Of particular importance are the cancelable and bubbles properties. The
+ // cancelable property indicates whether or not the event has a default action
+ // that can be cancelled. The event is cancelled by calling preventDefault() on
+ // the event object. The bubbles property indicates whether or not the
+ // event will bubble up the DOM tree. If bubbles is true, the event will be called
+ // on the target and then each parent successively until the top of the tree
+ // is reached or stopPropagation() is called. Both bubbles and cancelable
+ // default to false.
+ // returns:
+ // If the event is cancelable and the event is not cancelled,
+ // emit will return true. If the event is cancelable and the event is cancelled,
+ // emit will return false.
+ // details:
+ // Note that this is designed to emit events for listeners registered through
+ // dojo/on. It should actually work with any event listener except those
+ // added through IE's attachEvent (IE8 and below's non-W3C event emiting
+ // doesn't support custom event types). It should work with all events registered
+ // through dojo/on. Also note that the emit method does do any default
+ // action, it only returns a value to indicate if the default action should take
+ // place. For example, emiting a keypress event would not cause a character
+ // to appear in a textbox.
+ // example:
+ // To fire our own click event
+ // | on.emit(dojo.byId("button"), "click", {
+ // | cancelable: true,
+ // | bubbles: true,
+ // | screenX: 33,
+ // | screenY: 44
+ // | });
+ // We can also fire our own custom events:
+ // | on.emit(dojo.byId("slider"), "slide", {
+ // | cancelable: true,
+ // | bubbles: true,
+ // | direction: "left-to-right"
+ // | });
+ var args = slice.call(arguments, 2);
+ var method = "on" + type;
+ if("parentNode" in target){
+ // node (or node-like), create event controller methods
+ var newEvent = args[0] = {};
+ for(var i in event){
+ newEvent[i] = event[i];
+ }
+ newEvent.preventDefault = syntheticPreventDefault;
+ newEvent.stopPropagation = syntheticStopPropagation;
+ newEvent.target = target;
+ newEvent.type = type;
+ event = newEvent;
+ }
+ do{
+ // call any node which has a handler (note that ideally we would try/catch to simulate normal event propagation but that causes too much pain for debugging)
+ target[method] && target[method].apply(target, args);
+ // and then continue up the parent node chain if it is still bubbling (if started as bubbles and stopPropagation hasn't been called)
+ }while(event && event.bubbles && (target = target.parentNode));
+ return event && event.cancelable && event; // if it is still true (was cancelable and was cancelled), return the event to indicate default action should happen
+ };
+ var captures = {};
+ if(has("dom-addeventlistener")){
+ // normalize focusin and focusout
+ captures = {
+ focusin: "focus",
+ focusout: "blur"
+ };
+ if(has("opera")){
+ captures.keydown = "keypress"; // this one needs to be transformed because Opera doesn't support repeating keys on keydown (and keypress works because it incorrectly fires on all keydown events)
+ }
+
+ // emiter that works with native event handling
+ on.emit = function(target, type, event){
+ if(target.dispatchEvent && document.createEvent){
+ // use the native event emiting mechanism if it is available on the target object
+ // create a generic event
+ // we could create branch into the different types of event constructors, but
+ // that would be a lot of extra code, with little benefit that I can see, seems
+ // best to use the generic constructor and copy properties over, making it
+ // easy to have events look like the ones created with specific initializers
+ var nativeEvent = document.createEvent("HTMLEvents");
+ nativeEvent.initEvent(type, !!event.bubbles, !!event.cancelable);
+ // and copy all our properties over
+ for(var i in event){
+ var value = event[i];
+ if(!(i in nativeEvent)){
+ nativeEvent[i] = event[i];
+ }
+ }
+ return target.dispatchEvent(nativeEvent) && nativeEvent;
}
+ return syntheticDispatch.apply(on, arguments); // emit for a non-node
+ };
+ }else{
+ // no addEventListener, basically old IE event normalization
+ on._fixEvent = function(evt, sender){
+ // summary:
+ // normalizes properties on the event object including event
+ // bubbling methods, keystroke normalization, and x/y positions
+ // evt:
+ // native event object
+ // sender:
+ // node to treat as "currentTarget"
+ if(!evt){
+ var w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window;
+ evt = w.event;
+ }
+ if(!evt){return(evt);}
+ if(!evt.target){ // check to see if it has been fixed yet
+ evt.target = evt.srcElement;
+ evt.currentTarget = (sender || evt.srcElement);
+ if(evt.type == "mouseover"){
+ evt.relatedTarget = evt.fromElement;
+ }
+ if(evt.type == "mouseout"){
+ evt.relatedTarget = evt.toElement;
+ }
+ if(!evt.stopPropagation){
+ evt.stopPropagation = stopPropagation;
+ evt.preventDefault = preventDefault;
+ }
+ switch(evt.type){
+ case "keypress":
+ var c = ("charCode" in evt ? evt.charCode : evt.keyCode);
+ if (c==10){
+ // CTRL-ENTER is CTRL-ASCII(10) on IE, but CTRL-ENTER on Mozilla
+ c=0;
+ evt.keyCode = 13;
+ }else if(c==13||c==27){
+ c=0; // Mozilla considers ENTER and ESC non-printable
+ }else if(c==3){
+ c=99; // Mozilla maps CTRL-BREAK to CTRL-c
+ }
+ // Mozilla sets keyCode to 0 when there is a charCode
+ // but that stops the event on IE.
+ evt.charCode = c;
+ _setKeyChar(evt);
+ break;
+ }
+ }
+ return evt;
+ };
+ var IESignal = function(handle){
+ this.handle = handle;
+ };
+ IESignal.prototype.remove = function(){
+ delete _dojoIEListeners_[this.handle];
+ };
+ var fixListener = function(listener){
+ // this is a minimal function for closing on the previous listener with as few as variables as possible
+ return function(evt){
+ evt = on._fixEvent(evt, this);
+ return listener.call(this, evt);
+ }
+ }
+ var fixAttach = function(target, type, listener){
+ listener = fixListener(listener);
+ if(((target.ownerDocument ? target.ownerDocument.parentWindow : target.parentWindow || target.window || window) != top ||
+ has("jscript") < 5.8) &&
+ !has("config-_allow_leaks")){
+ // IE will leak memory on certain handlers in frames (IE8 and earlier) and in unattached DOM nodes for JScript 5.7 and below.
+ // Here we use global redirection to solve the memory leaks
+ if(typeof _dojoIEListeners_ == "undefined"){
+ _dojoIEListeners_ = [];
+ }
+ var emiter = target[type];
+ if(!emiter || !emiter.listeners){
+ var oldListener = emiter;
+ target[type] = emiter = Function('event', 'var callee = arguments.callee; for(var i = 0; i<callee.listeners.length; i++){var listener = _dojoIEListeners_[callee.listeners[i]]; if(listener){listener.call(this,event);}}');
+ emiter.listeners = [];
+ emiter.global = this;
+ if(oldListener){
+ emiter.listeners.push(_dojoIEListeners_.push(oldListener) - 1);
+ }
+ }
+ var handle;
+ emiter.listeners.push(handle = (emiter.global._dojoIEListeners_.push(listener) - 1));
+ return new IESignal(handle);
+ }
+ return aspect.after(target, type, listener, true);
+ };
- _t._active = true;
- _t._paused = false;
- var value = _t.curve.getValue(_t._getStep());
- if(!_t._percent){
- if(!_t._startRepeatCount){
- _t._startRepeatCount = _t.repeat;
+ var _setKeyChar = function(evt){
+ evt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : '';
+ evt.charOrCode = evt.keyChar || evt.keyCode;
+ };
+ // Called in Event scope
+ var stopPropagation = function(){
+ this.cancelBubble = true;
+ };
+ var preventDefault = on._preventDefault = function(){
+ // Setting keyCode to 0 is the only way to prevent certain keypresses (namely
+ // ctrl-combinations that correspond to menu accelerator keys).
+ // Otoh, it prevents upstream listeners from getting this information
+ // Try to split the difference here by clobbering keyCode only for ctrl
+ // combinations. If you still need to access the key upstream, bubbledKeyCode is
+ // provided as a workaround.
+ this.bubbledKeyCode = this.keyCode;
+ if(this.ctrlKey){
+ try{
+ // squelch errors when keyCode is read-only
+ // (e.g. if keyCode is ctrl or shift)
+ this.keyCode = 0;
+ }catch(e){
}
- _t._fire("onBegin", [value]);
}
+ this.returnValue = false;
+ };
+ }
+ if(has("touch")){
+ var Event = function (){};
+ var windowOrientation = window.orientation;
+ var fixTouchListener = function(listener){
+ return function(originalEvent){
+ //Event normalization(for ontouchxxx and resize):
+ //1.incorrect e.pageX|pageY in iOS
+ //2.there are no "e.rotation", "e.scale" and "onorientationchange" in Andriod
+ //3.More TBD e.g. force | screenX | screenX | clientX | clientY | radiusX | radiusY
+
+ // see if it has already been corrected
+ var event = originalEvent.corrected;
+ if(!event){
+ var type = originalEvent.type;
+ try{
+ delete originalEvent.type; // on some JS engines (android), deleting properties make them mutable
+ }catch(e){}
+ if(originalEvent.type){
+ // deleting properties doesn't work (older iOS), have to use delegation
+ Event.prototype = originalEvent;
+ var event = new Event;
+ // have to delegate methods to make them work
+ event.preventDefault = function(){
+ originalEvent.preventDefault();
+ };
+ event.stopPropagation = function(){
+ originalEvent.stopPropagation();
+ };
+ }else{
+ // deletion worked, use property as is
+ event = originalEvent;
+ event.type = type;
+ }
+ originalEvent.corrected = event;
+ if(type == 'resize'){
+ if(windowOrientation == window.orientation){
+ return null;//double tap causes an unexpected 'resize' in Andriod
+ }
+ windowOrientation = window.orientation;
+ event.type = "orientationchange";
+ return listener.call(this, event);
+ }
+ // We use the original event and augment, rather than doing an expensive mixin operation
+ if(!("rotation" in event)){ // test to see if it has rotation
+ event.rotation = 0;
+ event.scale = 1;
+ }
+ //use event.changedTouches[0].pageX|pageY|screenX|screenY|clientX|clientY|target
+ var firstChangeTouch = event.changedTouches[0];
+ for(var i in firstChangeTouch){ // use for-in, we don't need to have dependency on dojo/_base/lang here
+ delete event[i]; // delete it first to make it mutable
+ event[i] = firstChangeTouch[i];
+ }
+ }
+ return listener.call(this, event);
+ };
+ };
+ }
+ return on;
+});
+
+},
+'dojo/_base/sniff':function(){
+define(["./kernel", "../has"], function(dojo, has){
+ // module:
+ // dojo/sniff
+ // summary:
+ // This module populates the dojo browser version sniffing properties.
- _t._fire("onPlay", [value]);
+ if(!1){
+ return has;
+ }
- _t._cycle();
- return _t; // dojo.Animation
- },
+ dojo.isBrowser = true,
+ dojo._name = "browser";
- pause: function(){
- // summary: Pauses a running animation.
- var _t = this;
- if(_t._delayTimer){ _t._clearTimer(); }
- _t._stopTimer();
- if(!_t._active){ return _t; /*dojo.Animation*/ }
- _t._paused = true;
- _t._fire("onPause", [_t.curve.getValue(_t._getStep())]);
- return _t; // dojo.Animation
- },
+ var hasAdd = has.add,
+ n = navigator,
+ dua = n.userAgent,
+ dav = n.appVersion,
+ tv = parseFloat(dav),
+ isOpera,
+ isAIR,
+ isKhtml,
+ isWebKit,
+ isChrome,
+ isMac,
+ isSafari,
+ isMozilla ,
+ isMoz,
+ isIE,
+ isFF,
+ isQuirks,
+ isIos,
+ isAndroid,
+ isWii;
- gotoPercent: function(/*Decimal*/ percent, /*Boolean?*/ andPlay){
- // summary:
- // Sets the progress of the animation.
- // percent:
- // A percentage in decimal notation (between and including 0.0 and 1.0).
- // andPlay:
- // If true, play the animation after setting the progress.
- var _t = this;
- _t._stopTimer();
- _t._active = _t._paused = true;
- _t._percent = percent;
- if(andPlay){ _t.play(); }
- return _t; // dojo.Animation
- },
+ /*=====
+ dojo.isBrowser = {
+ // example:
+ // | if(dojo.isBrowser){ ... }
+ };
- stop: function(/*boolean?*/ gotoEnd){
- // summary: Stops a running animation.
- // gotoEnd: If true, the animation will end.
- var _t = this;
- if(_t._delayTimer){ _t._clearTimer(); }
- if(!_t._timer){ return _t; /* dojo.Animation */ }
- _t._stopTimer();
- if(gotoEnd){
- _t._percent = 1;
+ dojo.isFF = {
+ // example:
+ // | if(dojo.isFF > 1){ ... }
+ };
+
+ dojo.isIE = {
+ // example:
+ // | if(dojo.isIE > 6){
+ // | // we are IE7
+ // | }
+ };
+
+ dojo.isSafari = {
+ // example:
+ // | if(dojo.isSafari){ ... }
+ // example:
+ // Detect iPhone:
+ // | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){
+ // | // we are iPhone. Note, iPod touch reports "iPod" above and fails this test.
+ // | }
+ };
+
+ dojo.mixin(dojo, {
+ // isBrowser: Boolean
+ // True if the client is a web-browser
+ isBrowser: true,
+ // isFF: Number | undefined
+ // Version as a Number if client is FireFox. undefined otherwise. Corresponds to
+ // major detected FireFox version (1.5, 2, 3, etc.)
+ isFF: 2,
+ // isIE: Number | undefined
+ // Version as a Number if client is MSIE(PC). undefined otherwise. Corresponds to
+ // major detected IE version (6, 7, 8, etc.)
+ isIE: 6,
+ // isKhtml: Number | undefined
+ // Version as a Number if client is a KHTML browser. undefined otherwise. Corresponds to major
+ // detected version.
+ isKhtml: 0,
+ // isWebKit: Number | undefined
+ // Version as a Number if client is a WebKit-derived browser (Konqueror,
+ // Safari, Chrome, etc.). undefined otherwise.
+ isWebKit: 0,
+ // isMozilla: Number | undefined
+ // Version as a Number if client is a Mozilla-based browser (Firefox,
+ // SeaMonkey). undefined otherwise. Corresponds to major detected version.
+ isMozilla: 0,
+ // isOpera: Number | undefined
+ // Version as a Number if client is Opera. undefined otherwise. Corresponds to
+ // major detected version.
+ isOpera: 0,
+ // isSafari: Number | undefined
+ // Version as a Number if client is Safari or iPhone. undefined otherwise.
+ isSafari: 0,
+ // isChrome: Number | undefined
+ // Version as a Number if client is Chrome browser. undefined otherwise.
+ isChrome: 0,
+ // isMac: Boolean
+ // True if the client runs on Mac
+ isMac: 0,
+ // isIos: Boolean
+ // True if client is iPhone, iPod, or iPad
+ isIos: 0,
+ // isAndroid: Number | undefined
+ // Version as a Number if client is android browser. undefined otherwise.
+ isAndroid: 0,
+ // isWii: Boolean
+ // True if client is Wii
+ isWii: 0
+ });
+ =====*/
+
+ // fill in the rendering support information in dojo.render.*
+ if(dua.indexOf("AdobeAIR") >= 0){ isAIR = 1; }
+ isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : 0;
+ isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined;
+ isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined;
+ isMac = dav.indexOf("Macintosh") >= 0;
+ isIos = /iPhone|iPod|iPad/.test(dua);
+ isAndroid = parseFloat(dua.split("Android ")[1]) || undefined;
+ isWii = typeof opera != "undefined" && opera.wiiremote;
+
+ // safari detection derived from:
+ // http://developer.apple.com/internet/safari/faq.html#anchor2
+ // http://developer.apple.com/internet/safari/uamatrix.html
+ var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);
+ if(index && !isChrome){
+ // try to grab the explicit Safari version first. If we don't get
+ // one, look for less than 419.3 as the indication that we're on something
+ // "Safari 2-ish".
+ isSafari = parseFloat(dav.split("Version/")[1]);
+ if(!isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){
+ isSafari = 2;
+ }
+ }
+
+ if (!has("dojo-webkit")) {
+ if(dua.indexOf("Opera") >= 0){
+ isOpera = tv;
+ // see http://dev.opera.com/articles/view/opera-ua-string-changes and http://www.useragentstring.com/pages/Opera/
+ // 9.8 has both styles; <9.8, 9.9 only old style
+ if(isOpera >= 9.8){
+ isOpera = parseFloat(dua.split("Version/")[1]) || tv;
}
- _t._fire("onStop", [_t.curve.getValue(_t._getStep())]);
- _t._active = _t._paused = false;
- return _t; // dojo.Animation
- },
+ }
- status: function(){
- // summary:
- // Returns a string token representation of the status of
- // the animation, one of: "paused", "playing", "stopped"
- if(this._active){
- return this._paused ? "paused" : "playing"; // String
+ if(dua.indexOf("Gecko") >= 0 && !isKhtml && !isWebKit){
+ isMozilla = isMoz = tv;
+ }
+ if(isMoz){
+ //We really need to get away from this. Consider a sane isGecko approach for the future.
+ isFF = parseFloat(dua.split("Firefox/")[1] || dua.split("Minefield/")[1]) || undefined;
+ }
+ if(document.all && !isOpera){
+ isIE = parseFloat(dav.split("MSIE ")[1]) || undefined;
+ //In cases where the page has an HTTP header or META tag with
+ //X-UA-Compatible, then it is in emulation mode.
+ //Make sure isIE reflects the desired version.
+ //document.documentMode of 5 means quirks mode.
+ //Only switch the value if documentMode's major version
+ //is different from isIE's major version.
+ var mode = document.documentMode;
+ if(mode && mode != 5 && Math.floor(isIE) != mode){
+ isIE = mode;
}
- return "stopped"; // String
- },
+ }
+ }
- _cycle: function(){
- var _t = this;
- if(_t._active){
- var curr = new Date().valueOf();
- var step = (curr - _t._startTime) / (_t.duration);
+ isQuirks = document.compatMode == "BackCompat";
+
+ hasAdd("opera", dojo.isOpera = isOpera);
+ hasAdd("air", dojo.isAIR = isAIR);
+ hasAdd("khtml", dojo.isKhtml = isKhtml);
+ hasAdd("webkit", dojo.isWebKit = isWebKit);
+ hasAdd("chrome", dojo.isChrome = isChrome);
+ hasAdd("mac", dojo.isMac = isMac );
+ hasAdd("safari", dojo.isSafari = isSafari);
+ hasAdd("mozilla", dojo.isMozilla = dojo.isMoz = isMozilla );
+ hasAdd("ie", dojo.isIE = isIE );
+ hasAdd("ff", dojo.isFF = isFF);
+ hasAdd("quirks", dojo.isQuirks = isQuirks);
+ hasAdd("ios", dojo.isIos = isIos);
+ hasAdd("android", dojo.isAndroid = isAndroid);
+
+ dojo.locale = dojo.locale || (isIE ? n.userLanguage : n.language).toLowerCase();
+
+ return has;
+});
+
+},
+'dojo/_base/array':function(){
+define("dojo/_base/array", ["./kernel", "../has", "./lang"], function(dojo, has, lang){
+ // module:
+ // dojo/_base/array
+ // summary:
+ // This module defines the Javascript v1.6 array extensions.
- if(step >= 1){
- step = 1;
- }
- _t._percent = step;
+ /*=====
+ dojo.indexOf = function(arr, value, fromIndex, findLast){
+ // summary:
+ // locates the first index of the provided value in the
+ // passed array. If the value is not found, -1 is returned.
+ // description:
+ // This method corresponds to the JavaScript 1.6 Array.indexOf method, with one difference: when
+ // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript
+ // 1.6's indexOf skips the holes in the sparse array.
+ // For details on this method, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf
+ // arr: Array
+ // value: Object
+ // fromIndex: Integer?
+ // findLast: Boolean?
+ // returns: Number
+ };
+ dojo.lastIndexOf = function(arr, value, fromIndex){
+ // summary:
+ // locates the last index of the provided value in the passed
+ // array. If the value is not found, -1 is returned.
+ // description:
+ // This method corresponds to the JavaScript 1.6 Array.lastIndexOf method, with one difference: when
+ // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript
+ // 1.6's lastIndexOf skips the holes in the sparse array.
+ // For details on this method, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/lastIndexOf
+ // arr: Array,
+ // value: Object,
+ // fromIndex: Integer?
+ // returns: Number
+ };
+ dojo.forEach = function(arr, callback, thisObject){
+ // summary:
+ // for every item in arr, callback is invoked. Return values are ignored.
+ // If you want to break out of the loop, consider using dojo.every() or dojo.some().
+ // forEach does not allow breaking out of the loop over the items in arr.
+ // arr:
+ // the array to iterate over. If a string, operates on individual characters.
+ // callback:
+ // a function is invoked with three arguments: item, index, and array
+ // thisObject:
+ // may be used to scope the call to callback
+ // description:
+ // This function corresponds to the JavaScript 1.6 Array.forEach() method, with one difference: when
+ // run over sparse arrays, this implementation passes the "holes" in the sparse array to
+ // the callback function with a value of undefined. JavaScript 1.6's forEach skips the holes in the sparse array.
+ // For more details, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach
+ // example:
+ // | // log out all members of the array:
+ // | dojo.forEach(
+ // | [ "thinger", "blah", "howdy", 10 ],
+ // | function(item){
+ // | console.log(item);
+ // | }
+ // | );
+ // example:
+ // | // log out the members and their indexes
+ // | dojo.forEach(
+ // | [ "thinger", "blah", "howdy", 10 ],
+ // | function(item, idx, arr){
+ // | console.log(item, "at index:", idx);
+ // | }
+ // | );
+ // example:
+ // | // use a scoped object member as the callback
+ // |
+ // | var obj = {
+ // | prefix: "logged via obj.callback:",
+ // | callback: function(item){
+ // | console.log(this.prefix, item);
+ // | }
+ // | };
+ // |
+ // | // specifying the scope function executes the callback in that scope
+ // | dojo.forEach(
+ // | [ "thinger", "blah", "howdy", 10 ],
+ // | obj.callback,
+ // | obj
+ // | );
+ // |
+ // | // alternately, we can accomplish the same thing with dojo.hitch()
+ // | dojo.forEach(
+ // | [ "thinger", "blah", "howdy", 10 ],
+ // | dojo.hitch(obj, "callback")
+ // | );
+ // arr: Array|String
+ // callback: Function|String
+ // thisObject: Object?
+ };
+ dojo.every = function(arr, callback, thisObject){
+ // summary:
+ // Determines whether or not every item in arr satisfies the
+ // condition implemented by callback.
+ // arr: Array|String
+ // the array to iterate on. If a string, operates on individual characters.
+ // callback: Function|String
+ // a function is invoked with three arguments: item, index,
+ // and array and returns true if the condition is met.
+ // thisObject: Object?
+ // may be used to scope the call to callback
+ // returns: Boolean
+ // description:
+ // This function corresponds to the JavaScript 1.6 Array.every() method, with one difference: when
+ // run over sparse arrays, this implementation passes the "holes" in the sparse array to
+ // the callback function with a value of undefined. JavaScript 1.6's every skips the holes in the sparse array.
+ // For more details, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/every
+ // example:
+ // | // returns false
+ // | dojo.every([1, 2, 3, 4], function(item){ return item>1; });
+ // example:
+ // | // returns true
+ // | dojo.every([1, 2, 3, 4], function(item){ return item>0; });
+ };
+ dojo.some = function(arr, callback, thisObject){
+ // summary:
+ // Determines whether or not any item in arr satisfies the
+ // condition implemented by callback.
+ // arr: Array|String
+ // the array to iterate over. If a string, operates on individual characters.
+ // callback: Function|String
+ // a function is invoked with three arguments: item, index,
+ // and array and returns true if the condition is met.
+ // thisObject: Object?
+ // may be used to scope the call to callback
+ // returns: Boolean
+ // description:
+ // This function corresponds to the JavaScript 1.6 Array.some() method, with one difference: when
+ // run over sparse arrays, this implementation passes the "holes" in the sparse array to
+ // the callback function with a value of undefined. JavaScript 1.6's some skips the holes in the sparse array.
+ // For more details, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/some
+ // example:
+ // | // is true
+ // | dojo.some([1, 2, 3, 4], function(item){ return item>1; });
+ // example:
+ // | // is false
+ // | dojo.some([1, 2, 3, 4], function(item){ return item<1; });
+ };
+ dojo.map = function(arr, callback, thisObject){
+ // summary:
+ // applies callback to each element of arr and returns
+ // an Array with the results
+ // arr: Array|String
+ // the array to iterate on. If a string, operates on
+ // individual characters.
+ // callback: Function|String
+ // a function is invoked with three arguments, (item, index,
+ // array), and returns a value
+ // thisObject: Object?
+ // may be used to scope the call to callback
+ // returns: Array
+ // description:
+ // This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when
+ // run over sparse arrays, this implementation passes the "holes" in the sparse array to
+ // the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array.
+ // For more details, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
+ // example:
+ // | // returns [2, 3, 4, 5]
+ // | dojo.map([1, 2, 3, 4], function(item){ return item+1 });
+ };
+ dojo.filter = function(arr, callback, thisObject){
+ // summary:
+ // Returns a new Array with those items from arr that match the
+ // condition implemented by callback.
+ // arr: Array
+ // the array to iterate over.
+ // callback: Function|String
+ // a function that is invoked with three arguments (item,
+ // index, array). The return of this function is expected to
+ // be a boolean which determines whether the passed-in item
+ // will be included in the returned array.
+ // thisObject: Object?
+ // may be used to scope the call to callback
+ // returns: Array
+ // description:
+ // This function corresponds to the JavaScript 1.6 Array.filter() method, with one difference: when
+ // run over sparse arrays, this implementation passes the "holes" in the sparse array to
+ // the callback function with a value of undefined. JavaScript 1.6's filter skips the holes in the sparse array.
+ // For more details, see:
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
+ // example:
+ // | // returns [2, 3, 4]
+ // | dojo.filter([1, 2, 3, 4], function(item){ return item>1; });
+ };
+ =====*/
- // Perform easing
- if(_t.easing){
- step = _t.easing(step);
- }
+ // our old simple function builder stuff
+ var cache = {}, u, array; // the export object
- _t._fire("onAnimate", [_t.curve.getValue(step)]);
+ function clearCache(){
+ cache = {};
+ }
- if(_t._percent < 1){
- _t._startTimer();
- }else{
- _t._active = false;
+ function buildFn(fn){
+ return cache[fn] = new Function("item", "index", "array", fn); // Function
+ }
+ // magic snippet: if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
- if(_t.repeat > 0){
- _t.repeat--;
- _t.play(null, true);
- }else if(_t.repeat == -1){
- _t.play(null, true);
- }else{
- if(_t._startRepeatCount){
- _t.repeat = _t._startRepeatCount;
- _t._startRepeatCount = 0;
- }
+ // every & some
+
+ function everyOrSome(some){
+ var every = !some;
+ return function(a, fn, o){
+ var i = 0, l = a && a.length || 0, result;
+ if(l && typeof a == "string") a = a.split("");
+ if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
+ if(o){
+ for(; i < l; ++i){
+ result = !fn.call(o, a[i], i, a);
+ if(some ^ result){
+ return !result;
+ }
+ }
+ }else{
+ for(; i < l; ++i){
+ result = !fn(a[i], i, a);
+ if(some ^ result){
+ return !result;
}
- _t._percent = 0;
- _t._fire("onEnd", [_t.node]);
- !_t.repeat && _t._stopTimer();
}
}
- return _t; // dojo.Animation
- },
-
- _clearTimer: function(){
- // summary: Clear the play delay timer
- clearTimeout(this._delayTimer);
- delete this._delayTimer;
+ return every; // Boolean
}
+ }
+ // var every = everyOrSome(false), some = everyOrSome(true);
- });
-
- // the local timer, stubbed into all Animation instances
- var ctr = 0,
- timer = null,
- runner = {
- run: function(){}
- };
-
- d.extend(d.Animation, {
+ // indexOf, lastIndexOf
- _startTimer: function(){
- if(!this._timer){
- this._timer = d.connect(runner, "run", this, "_cycle");
- ctr++;
+ function index(up){
+ var delta = 1, lOver = 0, uOver = 0;
+ if(!up){
+ delta = lOver = uOver = -1;
+ }
+ return function(a, x, from, last){
+ if(last && delta > 0){
+ // TODO: why do we use a non-standard signature? why do we need "last"?
+ return array.lastIndexOf(a, x, from);
}
- if(!timer){
- timer = setInterval(d.hitch(runner, "run"), this.rate);
+ var l = a && a.length || 0, end = up ? l + uOver : lOver, i;
+ if(from === u){
+ i = up ? lOver : l + uOver;
+ }else{
+ if(from < 0){
+ i = l + from;
+ if(i < 0){
+ i = lOver;
+ }
+ }else{
+ i = from >= l ? l + uOver : from;
+ }
}
- },
+ if(l && typeof a == "string") a = a.split("");
+ for(; i != end; i += delta){
+ if(a[i] == x){
+ return i; // Number
+ }
+ }
+ return -1; // Number
+ }
+ }
+ // var indexOf = index(true), lastIndexOf = index(false);
- _stopTimer: function(){
- if(this._timer){
- d.disconnect(this._timer);
- this._timer = null;
- ctr--;
+ function forEach(a, fn, o){
+ var i = 0, l = a && a.length || 0;
+ if(l && typeof a == "string") a = a.split("");
+ if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
+ if(o){
+ for(; i < l; ++i){
+ fn.call(o, a[i], i, a);
}
- if(ctr <= 0){
- clearInterval(timer);
- timer = null;
- ctr = 0;
+ }else{
+ for(; i < l; ++i){
+ fn(a[i], i, a);
}
}
+ }
- });
+ function map(a, fn, o, Ctr){
+ // TODO: why do we have a non-standard signature here? do we need "Ctr"?
+ var i = 0, l = a && a.length || 0, out = new (Ctr || Array)(l);
+ if(l && typeof a == "string") a = a.split("");
+ if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
+ if(o){
+ for(; i < l; ++i){
+ out[i] = fn.call(o, a[i], i, a);
+ }
+ }else{
+ for(; i < l; ++i){
+ out[i] = fn(a[i], i, a);
+ }
+ }
+ return out; // Array
+ }
- var _makeFadeable =
- d.isIE ? function(node){
- // only set the zoom if the "tickle" value would be the same as the
- // default
- var ns = node.style;
- // don't set the width to auto if it didn't already cascade that way.
- // We don't want to f anyones designs
- if(!ns.width.length && d.style(node, "width") == "auto"){
- ns.width = "auto";
+ function filter(a, fn, o){
+ // TODO: do we need "Ctr" here like in map()?
+ var i = 0, l = a && a.length || 0, out = [], value;
+ if(l && typeof a == "string") a = a.split("");
+ if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
+ if(o){
+ for(; i < l; ++i){
+ value = a[i];
+ if(fn.call(o, value, i, a)){
+ out.push(value);
+ }
}
- } :
- function(){};
+ }else{
+ for(; i < l; ++i){
+ value = a[i];
+ if(fn(value, i, a)){
+ out.push(value);
+ }
+ }
+ }
+ return out; // Array
+ }
- dojo._fade = function(/*Object*/ args){
- // summary:
- // Returns an animation that will fade the node defined by
- // args.node from the start to end values passed (args.start
- // args.end) (end is mandatory, start is optional)
+ array = {
+ every: everyOrSome(false),
+ some: everyOrSome(true),
+ indexOf: index(true),
+ lastIndexOf: index(false),
+ forEach: forEach,
+ map: map,
+ filter: filter,
+ clearCache: clearCache
+ };
- args.node = d.byId(args.node);
- var fArgs = _mixin({ properties: {} }, args),
- props = (fArgs.properties.opacity = {});
+ 1 && lang.mixin(dojo, array);
- props.start = !("start" in fArgs) ?
- function(){
- return +d.style(fArgs.node, "opacity")||0;
- } : fArgs.start;
- props.end = fArgs.end;
+ /*===== return dojo.array; =====*/
+ return array;
+});
- var anim = d.animateProperty(fArgs);
- d.connect(anim, "beforeBegin", d.partial(_makeFadeable, fArgs.node));
+},
+'dojo/_base/json':function(){
+define(["./kernel", "../json"], function(dojo, json){
+ // module:
+ // dojo/_base/json
+ // summary:
+ // This module defines the dojo JSON API.
- return anim; // dojo.Animation
- };
-
- /*=====
- dojo.__FadeArgs = function(node, duration, easing){
- // node: DOMNode|String
- // The node referenced in the animation
- // duration: Integer?
- // Duration of the animation in milliseconds.
- // easing: Function?
- // An easing function.
- this.node = node;
- this.duration = duration;
- this.easing = easing;
- }
- =====*/
+dojo.fromJson = function(/*String*/ js){
+ // summary:
+ // Parses a JavaScript expression and returns a JavaScript value.
+ // description:
+ // Throws for invalid JavaScript expressions. It does not use a strict JSON parser. It
+ // always delegates to eval(). The content passed to this method must therefore come
+ // from a trusted source.
+ // It is recommend that you use dojo/json's parse function for an
+ // implementation uses the (faster) native JSON parse when available.
+ // js:
+ // a string literal of a JavaScript expression, for instance:
+ // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'`
- dojo.fadeIn = function(/*dojo.__FadeArgs*/ args){
- // summary:
- // Returns an animation that will fade node defined in 'args' from
- // its current opacity to fully opaque.
- return d._fade(_mixin({ end: 1 }, args)); // dojo.Animation
- };
+ return eval("(" + js + ")"); // Object
+};
- dojo.fadeOut = function(/*dojo.__FadeArgs*/ args){
- // summary:
- // Returns an animation that will fade node defined in 'args'
- // from its current opacity to fully transparent.
- return d._fade(_mixin({ end: 0 }, args)); // dojo.Animation
- };
+/*=====
+dojo._escapeString = function(){
+ // summary:
+ // Adds escape sequences for non-visual characters, double quote and
+ // backslash and surrounds with double quotes to form a valid string
+ // literal.
+};
+=====*/
+dojo._escapeString = json.stringify; // just delegate to json.stringify
- dojo._defaultEasing = function(/*Decimal?*/ n){
- // summary: The default easing function for dojo.Animation(s)
- return 0.5 + ((Math.sin((n + 1.5) * Math.PI)) / 2);
- };
+dojo.toJsonIndentStr = "\t";
+dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint){
+ // summary:
+ // Returns a [JSON](http://json.org) serialization of an object.
+ // description:
+ // Returns a [JSON](http://json.org) serialization of an object.
+ // Note that this doesn't check for infinite recursion, so don't do that!
+ // It is recommend that you use dojo/json's stringify function for an lighter
+ // and faster implementation that matches the native JSON API and uses the
+ // native JSON serializer when available.
+ // it:
+ // an object to be serialized. Objects may define their own
+ // serialization via a special "__json__" or "json" function
+ // property. If a specialized serializer has been defined, it will
+ // be used as a fallback.
+ // Note that in 1.6, toJson would serialize undefined, but this no longer supported
+ // since it is not supported by native JSON serializer.
+ // prettyPrint:
+ // if true, we indent objects and arrays to make the output prettier.
+ // The variable `dojo.toJsonIndentStr` is used as the indent string --
+ // to use something other than the default (tab), change that variable
+ // before calling dojo.toJson().
+ // Note that if native JSON support is available, it will be used for serialization,
+ // and native implementations vary on the exact spacing used in pretty printing.
+ // returns:
+ // A JSON string serialization of the passed-in object.
+ // example:
+ // simple serialization of a trivial object
+ // | var jsonStr = dojo.toJson({ howdy: "stranger!", isStrange: true });
+ // | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr);
+ // example:
+ // a custom serializer for an objects of a particular class:
+ // | dojo.declare("Furby", null, {
+ // | furbies: "are strange",
+ // | furbyCount: 10,
+ // | __json__: function(){
+ // | },
+ // | });
- var PropLine = function(properties){
- // PropLine is an internal class which is used to model the values of
- // an a group of CSS properties across an animation lifecycle. In
- // particular, the "getValue" function handles getting interpolated
- // values between start and end for a particular CSS value.
- this._properties = properties;
- for(var p in properties){
- var prop = properties[p];
- if(prop.start instanceof d.Color){
- // create a reusable temp color object to keep intermediate results
- prop.tempColor = new d.Color();
+ // use dojo/json
+ return json.stringify(it, function(key, value){
+ if(value){
+ var tf = value.__json__||value.json;
+ if(typeof tf == "function"){
+ return tf.call(value);
}
}
- };
+ return value;
+ }, prettyPrint && dojo.toJsonIndentStr); // String
+};
- PropLine.prototype.getValue = function(r){
- var ret = {};
- for(var p in this._properties){
- var prop = this._properties[p],
- start = prop.start;
- if(start instanceof d.Color){
- ret[p] = d.blendColors(start, prop.end, r, prop.tempColor).toCss();
- }else if(!d.isArray(start)){
- ret[p] = ((prop.end - start) * r) + start + (p != "opacity" ? prop.units || "px" : 0);
- }
- }
- return ret;
+return dojo;
+});
+
+},
+'dojo/dom-class':function(){
+define(["./_base/lang", "./_base/array", "./dom"], function(lang, array, dom){
+ // module:
+ // dojo/dom-class
+ // summary:
+ // This module defines the core dojo DOM class API.
+
+ var className = "className";
+
+ /* Part I of classList-based implementation is preserved here for posterity
+ var classList = "classList";
+ has.add("dom-classList", function(){
+ return classList in document.createElement("p");
+ });
+ */
+
+ // =============================
+ // (CSS) Class Functions
+ // =============================
+
+ /*=====
+ dojo.hasClass = function(node, classStr){
+ // summary:
+ // Returns whether or not the specified classes are a portion of the
+ // class list currently applied to the node.
+ //
+ // node: String|DOMNode
+ // String ID or DomNode reference to check the class for.
+ //
+ // classStr: String
+ // A string class name to look for.
+ //
+ // returns: Boolean
+ //
+ // example:
+ // Do something if a node with id="someNode" has class="aSillyClassName" present
+ // | if(dojo.hasClass("someNode","aSillyClassName")){ ... }
};
+ =====*/
/*=====
- dojo.declare("dojo.__AnimArgs", [dojo.__FadeArgs], {
- // Properties: Object?
- // A hash map of style properties to Objects describing the transition,
- // such as the properties of dojo._Line with an additional 'units' property
- properties: {}
+ dojo.addClass = function(node, classStr){
+ // summary:
+ // Adds the specified classes to the end of the class list on the
+ // passed node. Will not re-apply duplicate classes.
+ //
+ // node: String|DOMNode
+ // String ID or DomNode reference to add a class string too
+ //
+ // classStr: String|Array
+ // A String class name to add, or several space-separated class names,
+ // or an array of class names.
+ //
+ // example:
+ // Add a class to some node:
+ // | dojo.addClass("someNode", "anewClass");
+ //
+ // example:
+ // Add two classes at once:
+ // | dojo.addClass("someNode", "firstClass secondClass");
+ //
+ // example:
+ // Add two classes at once (using array):
+ // | dojo.addClass("someNode", ["firstClass", "secondClass"]);
+ //
+ // example:
+ // Available in `dojo.NodeList` for multiple additions
+ // | dojo.query("ul > li").addClass("firstLevel");
+ };
+ =====*/
- //TODOC: add event callbacks
- });
+ /*=====
+ dojo.removeClass = function(node, classStr){
+ // summary:
+ // Removes the specified classes from node. No `dojo.hasClass`
+ // check is required.
+ //
+ // node: String|DOMNode
+ // String ID or DomNode reference to remove the class from.
+ //
+ // classStr: String|Array
+ // An optional String class name to remove, or several space-separated
+ // class names, or an array of class names. If omitted, all class names
+ // will be deleted.
+ //
+ // example:
+ // Remove a class from some node:
+ // | dojo.removeClass("someNode", "firstClass");
+ //
+ // example:
+ // Remove two classes from some node:
+ // | dojo.removeClass("someNode", "firstClass secondClass");
+ //
+ // example:
+ // Remove two classes from some node (using array):
+ // | dojo.removeClass("someNode", ["firstClass", "secondClass"]);
+ //
+ // example:
+ // Remove all classes from some node:
+ // | dojo.removeClass("someNode");
+ //
+ // example:
+ // Available in `dojo.NodeList()` for multiple removal
+ // | dojo.query(".foo").removeClass("foo");
+ };
=====*/
- dojo.animateProperty = function(/*dojo.__AnimArgs*/ args){
+ /*=====
+ dojo.replaceClass = function(node, addClassStr, removeClassStr){
// summary:
- // Returns an animation that will transition the properties of
- // node defined in `args` depending how they are defined in
- // `args.properties`
+ // Replaces one or more classes on a node if not present.
+ // Operates more quickly than calling dojo.removeClass and dojo.addClass
//
- // description:
- // `dojo.animateProperty` is the foundation of most `dojo.fx`
- // animations. It takes an object of "properties" corresponding to
- // style properties, and animates them in parallel over a set
- // duration.
+ // node: String|DOMNode
+ // String ID or DomNode reference to remove the class from.
+ //
+ // addClassStr: String|Array
+ // A String class name to add, or several space-separated class names,
+ // or an array of class names.
+ //
+ // removeClassStr: String|Array?
+ // A String class name to remove, or several space-separated class names,
+ // or an array of class names.
//
// example:
- // A simple animation that changes the width of the specified node.
- // | dojo.animateProperty({
- // | node: "nodeId",
- // | properties: { width: 400 },
- // | }).play();
- // Dojo figures out the start value for the width and converts the
- // integer specified for the width to the more expressive but
- // verbose form `{ width: { end: '400', units: 'px' } }` which you
- // can also specify directly. Defaults to 'px' if ommitted.
+ // | dojo.replaceClass("someNode", "add1 add2", "remove1 remove2");
//
// example:
- // Animate width, height, and padding over 2 seconds... the
- // pedantic way:
- // | dojo.animateProperty({ node: node, duration:2000,
- // | properties: {
- // | width: { start: '200', end: '400', units:"px" },
- // | height: { start:'200', end: '400', units:"px" },
- // | paddingTop: { start:'5', end:'50', units:"px" }
- // | }
- // | }).play();
- // Note 'paddingTop' is used over 'padding-top'. Multi-name CSS properties
- // are written using "mixed case", as the hyphen is illegal as an object key.
+ // Replace all classes with addMe
+ // | dojo.replaceClass("someNode", "addMe");
//
// example:
- // Plug in a different easing function and register a callback for
- // when the animation ends. Easing functions accept values between
- // zero and one and return a value on that basis. In this case, an
- // exponential-in curve.
- // | dojo.animateProperty({
- // | node: "nodeId",
- // | // dojo figures out the start value
- // | properties: { width: { end: 400 } },
- // | easing: function(n){
- // | return (n==0) ? 0 : Math.pow(2, 10 * (n - 1));
- // | },
- // | onEnd: function(node){
- // | // called when the animation finishes. The animation
- // | // target is passed to this function
- // | }
- // | }).play(500); // delay playing half a second
+ // Available in `dojo.NodeList()` for multiple toggles
+ // | dojo.query(".findMe").replaceClass("addMe", "removeMe");
+ };
+ =====*/
+
+ /*=====
+ dojo.toggleClass = function(node, classStr, condition){
+ // summary:
+ // Adds a class to node if not present, or removes if present.
+ // Pass a boolean condition if you want to explicitly add or remove.
+ // Returns the condition that was specified directly or indirectly.
+ //
+ // node: String|DOMNode
+ // String ID or DomNode reference to toggle a class string
+ //
+ // classStr: String|Array
+ // A String class name to toggle, or several space-separated class names,
+ // or an array of class names.
+ //
+ // condition:
+ // If passed, true means to add the class, false means to remove.
+ // Otherwise dojo.hasClass(node, classStr) is used to detect the class presence.
//
// example:
- // Like all `dojo.Animation`s, animateProperty returns a handle to the
- // Animation instance, which fires the events common to Dojo FX. Use `dojo.connect`
- // to access these events outside of the Animation definiton:
- // | var anim = dojo.animateProperty({
- // | node:"someId",
- // | properties:{
- // | width:400, height:500
- // | }
- // | });
- // | dojo.connect(anim,"onEnd", function(){
- // | console.log("animation ended");
- // | });
- // | // play the animation now:
- // | anim.play();
+ // | dojo.toggleClass("someNode", "hovered");
//
// example:
- // Each property can be a function whose return value is substituted along.
- // Additionally, each measurement (eg: start, end) can be a function. The node
- // reference is passed direcly to callbacks.
- // | dojo.animateProperty({
- // | node:"mine",
- // | properties:{
- // | height:function(node){
- // | // shrink this node by 50%
- // | return dojo.position(node).h / 2
- // | },
- // | width:{
- // | start:function(node){ return 100; },
- // | end:function(node){ return 200; }
- // | }
- // | }
- // | }).play();
+ // Forcefully add a class
+ // | dojo.toggleClass("someNode", "hovered", true);
//
+ // example:
+ // Available in `dojo.NodeList()` for multiple toggles
+ // | dojo.query(".toggleMe").toggleClass("toggleMe");
+ };
+ =====*/
- var n = args.node = d.byId(args.node);
- if(!args.easing){ args.easing = d._defaultEasing; }
+ var cls, // exports object
+ spaces = /\s+/, a1 = [""];
- var anim = new d.Animation(args);
- d.connect(anim, "beforeBegin", anim, function(){
- var pm = {};
- for(var p in this.properties){
- // Make shallow copy of properties into pm because we overwrite
- // some values below. In particular if start/end are functions
- // we don't want to overwrite them or the functions won't be
- // called if the animation is reused.
- if(p == "width" || p == "height"){
- this.node.display = "block";
+ function str2array(s){
+ if(typeof s == "string" || s instanceof String){
+ if(s && !spaces.test(s)){
+ a1[0] = s;
+ return a1;
+ }
+ var a = s.split(spaces);
+ if(a.length && !a[0]){
+ a.shift();
+ }
+ if(a.length && !a[a.length - 1]){
+ a.pop();
+ }
+ return a;
+ }
+ // assumed to be an array
+ if(!s){
+ return [];
+ }
+ return array.filter(s, function(x){ return x; });
+ }
+
+ /* Part II of classList-based implementation is preserved here for posterity
+ if(has("dom-classList")){
+ // new classList version
+ cls = {
+ contains: function containsClass(node, classStr){
+ var clslst = classStr && dom.byId(node)[classList];
+ return clslst && clslst.contains(classStr); // Boolean
+ },
+
+ add: function addClass(node, classStr){
+ node = dom.byId(node);
+ classStr = str2array(classStr);
+ for(var i = 0, len = classStr.length; i < len; ++i){
+ node[classList].add(classStr[i]);
}
- var prop = this.properties[p];
- if(d.isFunction(prop)){
- prop = prop(n);
+ },
+
+ remove: function removeClass(node, classStr){
+ node = dom.byId(node);
+ if(classStr === undefined){
+ node[className] = "";
+ }else{
+ classStr = str2array(classStr);
+ for(var i = 0, len = classStr.length; i < len; ++i){
+ node[classList].remove(classStr[i]);
+ }
}
- prop = pm[p] = _mixin({}, (d.isObject(prop) ? prop: { end: prop }));
+ },
- if(d.isFunction(prop.start)){
- prop.start = prop.start(n);
+ replace: function replaceClass(node, addClassStr, removeClassStr){
+ node = dom.byId(node);
+ if(removeClassStr === undefined){
+ node[className] = "";
+ }else{
+ removeClassStr = str2array(removeClassStr);
+ for(var i = 0, len = removeClassStr.length; i < len; ++i){
+ node[classList].remove(removeClassStr[i]);
+ }
}
- if(d.isFunction(prop.end)){
- prop.end = prop.end(n);
+ addClassStr = str2array(addClassStr);
+ for(i = 0, len = addClassStr.length; i < len; ++i){
+ node[classList].add(addClassStr[i]);
}
- var isColor = (p.toLowerCase().indexOf("color") >= 0);
- function getStyle(node, p){
- // dojo.style(node, "height") can return "auto" or "" on IE; this is more reliable:
- var v = { height: node.offsetHeight, width: node.offsetWidth }[p];
- if(v !== undefined){ return v; }
- v = d.style(node, p);
- return (p == "opacity") ? +v : (isColor ? v : parseFloat(v));
+ },
+
+ toggle: function toggleClass(node, classStr, condition){
+ node = dom.byId(node);
+ if(condition === undefined){
+ classStr = str2array(classStr);
+ for(var i = 0, len = classStr.length; i < len; ++i){
+ node[classList].toggle(classStr[i]);
+ }
+ }else{
+ cls[condition ? "add" : "remove"](node, classStr);
}
- if(!("end" in prop)){
- prop.end = getStyle(n, p);
- }else if(!("start" in prop)){
- prop.start = getStyle(n, p);
+ return condition; // Boolean
+ }
+ }
+ }
+ */
+
+ // regular DOM version
+ var fakeNode = {}; // for effective replacement
+ cls = {
+ contains: function containsClass(/*DomNode|String*/node, /*String*/classStr){
+ return ((" " + dom.byId(node)[className] + " ").indexOf(" " + classStr + " ") >= 0); // Boolean
+ },
+
+ add: function addClass(/*DomNode|String*/node, /*String|Array*/classStr){
+ node = dom.byId(node);
+ classStr = str2array(classStr);
+ var cls = node[className], oldLen;
+ cls = cls ? " " + cls + " " : " ";
+ oldLen = cls.length;
+ for(var i = 0, len = classStr.length, c; i < len; ++i){
+ c = classStr[i];
+ if(c && cls.indexOf(" " + c + " ") < 0){
+ cls += c + " ";
}
+ }
+ if(oldLen < cls.length){
+ node[className] = cls.substr(1, cls.length - 2);
+ }
+ },
- if(isColor){
- prop.start = new d.Color(prop.start);
- prop.end = new d.Color(prop.end);
- }else{
- prop.start = (p == "opacity") ? +prop.start : parseFloat(prop.start);
+ remove: function removeClass(/*DomNode|String*/node, /*String|Array?*/classStr){
+ node = dom.byId(node);
+ var cls;
+ if(classStr !== undefined){
+ classStr = str2array(classStr);
+ cls = " " + node[className] + " ";
+ for(var i = 0, len = classStr.length; i < len; ++i){
+ cls = cls.replace(" " + classStr[i] + " ", " ");
}
+ cls = lang.trim(cls);
+ }else{
+ cls = "";
}
- this.curve = new PropLine(pm);
- });
- d.connect(anim, "onAnimate", d.hitch(d, "style", anim.node));
- return anim; // dojo.Animation
- };
+ if(node[className] != cls){ node[className] = cls; }
+ },
- dojo.anim = function( /*DOMNode|String*/ node,
- /*Object*/ properties,
- /*Integer?*/ duration,
- /*Function?*/ easing,
- /*Function?*/ onEnd,
- /*Integer?*/ delay){
- // summary:
- // A simpler interface to `dojo.animateProperty()`, also returns
- // an instance of `dojo.Animation` but begins the animation
- // immediately, unlike nearly every other Dojo animation API.
- // description:
- // `dojo.anim` is a simpler (but somewhat less powerful) version
- // of `dojo.animateProperty`. It uses defaults for many basic properties
- // and allows for positional parameters to be used in place of the
- // packed "property bag" which is used for other Dojo animation
- // methods.
- //
- // The `dojo.Animation` object returned from `dojo.anim` will be
- // already playing when it is returned from this function, so
- // calling play() on it again is (usually) a no-op.
- // node:
- // a DOM node or the id of a node to animate CSS properties on
- // duration:
- // The number of milliseconds over which the animation
- // should run. Defaults to the global animation default duration
- // (350ms).
- // easing:
- // An easing function over which to calculate acceleration
- // and deceleration of the animation through its duration.
- // A default easing algorithm is provided, but you may
- // plug in any you wish. A large selection of easing algorithms
- // are available in `dojo.fx.easing`.
- // onEnd:
- // A function to be called when the animation finishes
- // running.
- // delay:
- // The number of milliseconds to delay beginning the
- // animation by. The default is 0.
- // example:
- // Fade out a node
- // | dojo.anim("id", { opacity: 0 });
- // example:
- // Fade out a node over a full second
- // | dojo.anim("id", { opacity: 0 }, 1000);
- return d.animateProperty({ // dojo.Animation
- node: node,
- duration: duration || d.Animation.prototype.duration,
- properties: properties,
- easing: easing,
- onEnd: onEnd
- }).play(delay || 0);
+ replace: function replaceClass(/*DomNode|String*/node, /*String|Array*/addClassStr, /*String|Array?*/removeClassStr){
+ node = dom.byId(node);
+ fakeNode[className] = node[className];
+ cls.remove(fakeNode, removeClassStr);
+ cls.add(fakeNode, addClassStr);
+ if(node[className] !== fakeNode[className]){
+ node[className] = fakeNode[className];
+ }
+ },
+
+ toggle: function toggleClass(/*DomNode|String*/node, /*String|Array*/classStr, /*Boolean?*/condition){
+ node = dom.byId(node);
+ if(condition === undefined){
+ classStr = str2array(classStr);
+ for(var i = 0, len = classStr.length, c; i < len; ++i){
+ c = classStr[i];
+ cls[cls.contains(node, c) ? "remove" : "add"](node, c);
+ }
+ }else{
+ cls[condition ? "add" : "remove"](node, classStr);
+ }
+ return condition; // Boolean
+ }
};
-})();
+ return cls;
+});
+
+},
+'dojo/_base/window':function(){
+define(["./kernel", "../has", "./sniff"], function(dojo, has){
+ // module:
+ // dojo/window
+ // summary:
+ // This module provides an API to save/set/restore the global/document scope.
+
+/*=====
+dojo.doc = {
+ // summary:
+ // Alias for the current document. 'dojo.doc' can be modified
+ // for temporary context shifting. Also see dojo.withDoc().
+ // description:
+ // Refer to dojo.doc rather
+ // than referring to 'window.document' to ensure your code runs
+ // correctly in managed contexts.
+ // example:
+ // | n.appendChild(dojo.doc.createElement('div'));
}
+=====*/
+dojo.doc = this["document"] || null;
+
+dojo.body = function(){
+ // summary:
+ // Return the body element of the document
+ // return the body object associated with dojo.doc
+ // example:
+ // | dojo.body().appendChild(dojo.doc.createElement('div'));
+
+ // Note: document.body is not defined for a strict xhtml document
+ // Would like to memoize this, but dojo.doc can change vi dojo.withDoc().
+ return dojo.doc.body || dojo.doc.getElementsByTagName("body")[0]; // Node
+};
+
+dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocument){
+ // summary:
+ // changes the behavior of many core Dojo functions that deal with
+ // namespace and DOM lookup, changing them to work in a new global
+ // context (e.g., an iframe). The varibles dojo.global and dojo.doc
+ // are modified as a result of calling this function and the result of
+ // `dojo.body()` likewise differs.
+ dojo.global = ret.global = globalObject;
+ dojo.doc = ret.doc = globalDocument;
+};
+
+dojo.withGlobal = function( /*Object*/globalObject,
+ /*Function*/callback,
+ /*Object?*/thisObject,
+ /*Array?*/cbArguments){
+ // summary:
+ // Invoke callback with globalObject as dojo.global and
+ // globalObject.document as dojo.doc.
+ // description:
+ // Invoke callback with globalObject as dojo.global and
+ // globalObject.document as dojo.doc. If provided, globalObject
+ // will be executed in the context of object thisObject
+ // When callback() returns or throws an error, the dojo.global
+ // and dojo.doc will be restored to its previous state.
-if(!dojo._hasResource["dojo._base.browser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.browser"] = true;
-dojo.provide("dojo._base.browser");
+ var oldGlob = dojo.global;
+ try{
+ dojo.global = ret.global = globalObject;
+ return dojo.withDoc.call(null, globalObject.document, callback, thisObject, cbArguments);
+ }finally{
+ dojo.global = ret.global = oldGlob;
+ }
+};
+dojo.withDoc = function( /*DocumentElement*/documentObject,
+ /*Function*/callback,
+ /*Object?*/thisObject,
+ /*Array?*/cbArguments){
+ // summary:
+ // Invoke callback with documentObject as dojo.doc.
+ // description:
+ // Invoke callback with documentObject as dojo.doc. If provided,
+ // callback will be executed in the context of object thisObject
+ // When callback() returns or throws an error, the dojo.doc will
+ // be restored to its previous state.
+ var oldDoc = dojo.doc,
+ oldQ = dojo.isQuirks,
+ oldIE = dojo.isIE, isIE, mode, pwin;
+ try{
+ dojo.doc = ret.doc = documentObject;
+ // update dojo.isQuirks and the value of the has feature "quirks"
+ dojo.isQuirks = has.add("quirks", dojo.doc.compatMode == "BackCompat", true, true); // no need to check for QuirksMode which was Opera 7 only
+
+ if(has("ie")){
+ if((pwin = documentObject.parentWindow) && pwin.navigator){
+ // re-run IE detection logic and update dojo.isIE / has("ie")
+ // (the only time parentWindow/navigator wouldn't exist is if we were not
+ // passed an actual legitimate document object)
+ isIE = parseFloat(pwin.navigator.appVersion.split("MSIE ")[1]) || undefined;
+ mode = documentObject.documentMode;
+ if(mode && mode != 5 && Math.floor(isIE) != mode){
+ isIE = mode;
+ }
+ dojo.isIE = has.add("ie", isIE, true, true);
+ }
+ }
+ if(thisObject && typeof callback == "string"){
+ callback = thisObject[callback];
+ }
+ return callback.apply(thisObject, cbArguments || []);
+ }finally{
+ dojo.doc = ret.doc = oldDoc;
+ dojo.isQuirks = has.add("quirks", oldQ, true, true);
+ dojo.isIE = has.add("ie", oldIE, true, true);
+ }
+};
+var ret = {
+ global: dojo.global,
+ doc: dojo.doc,
+ body: dojo.body,
+ setContext: dojo.setContext,
+ withGlobal: dojo.withGlobal,
+ withDoc: dojo.withDoc
+};
+return ret;
+});
- //Need this to be the last code segment in base, so do not place any
- //dojo/requireIf calls in this file/ Otherwise, due to how the build system
- //puts all requireIf dependencies after the current file, the require calls
- //could be called before all of base is defined/
- dojo.forEach(dojo.config.require, function(i){
- dojo["require"](i);
- });
+},
+'dojo/_base/config':function(){
+define(["../has", "require"], function(has, require){
+ // module:
+ // dojo/_base/config
+ // summary:
+ // This module defines the user configuration during bootstrap.
+ // description:
+ // By defining user configuration as a module value, an entire configuration can be specified in a build,
+ // thereby eliminating the need for sniffing and or explicitly setting in the global variable dojoConfig.
+ // Also, when multiple instances of dojo exist in a single application, each will necessarily be located
+ // at an unique absolute module identifier as given by the package configuration. Implementing configuration
+ // as a module allows for specifying unique, per-instance configurations.
+ // example:
+ // Create a second instance of dojo with a different, instance-uniqe configuration (assume the loader and
+ // dojo.js are already loaded).
+ // | // specify a configuration that creates a new instance of dojo at the absolute module identifier "myDojo"
+ // | require({
+ // | packages:[{
+ // | name:"myDojo",
+ // | location:".", //assume baseUrl points to dojo.js
+ // | }]
+ // | });
+ // |
+ // | // specify a configuration for the myDojo instance
+ // | define("myDojo/config", {
+ // | // normal configuration variables go here, e.g.,
+ // | locale:"fr-ca"
+ // | });
+ // |
+ // | // load and use the new instance of dojo
+ // | require(["myDojo"], function(dojo) {
+ // | // dojo is the new instance of dojo
+ // | // use as required
+ // | });
+ var result = {};
+ if(1){
+ // must be the dojo loader; take a shallow copy of require.rawConfig
+ var src = require.rawConfig, p;
+ for(p in src){
+ result[p] = src[p];
+ }
+ }else{
+ var adviseHas = function(featureSet, prefix, booting){
+ for(p in featureSet){
+ p!="has" && has.add(prefix + p, featureSet[p], 0, booting);
+ }
+ };
+ result = 1 ?
+ // must be a built version of the dojo loader; all config stuffed in require.rawConfig
+ require.rawConfig :
+ // a foreign loader
+ this.dojoConfig || this.djConfig || {};
+ adviseHas(result, "config", 1);
+ adviseHas(result.has, "", 1);
+ }
+ return result;
+
+/*=====
+// note:
+// 'dojoConfig' does not exist under 'dojo.*' so that it can be set before the
+// 'dojo' variable exists.
+// note:
+// Setting any of these variables *after* the library has loaded does
+// nothing at all.
+
+// FIXME: can we document these on dojo.config object and explain they must be set via djConfig/dojoConfig global prior to loading dojo.js
+
+dojoConfig = {
+ // summary:
+ // Application code can set the global 'dojoConfig' prior to loading
+ // the library to control certain global settings for how dojo works.
+ //
+ // isDebug: Boolean
+ // Defaults to `false`. If set to `true`, ensures that Dojo provides
+ // extended debugging feedback via Firebug. If Firebug is not available
+ // on your platform, setting `isDebug` to `true` will force Dojo to
+ // pull in (and display) the version of Firebug Lite which is
+ // integrated into the Dojo distribution, thereby always providing a
+ // debugging/logging console when `isDebug` is enabled. Note that
+ // Firebug's `console.*` methods are ALWAYS defined by Dojo. If
+ // `isDebug` is false and you are on a platform without Firebug, these
+ // methods will be defined as no-ops.
+ isDebug: false,
+ // locale: String
+ // The locale to assume for loading localized resources in this page,
+ // specified according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).
+ // Must be specified entirely in lowercase, e.g. `en-us` and `zh-cn`.
+ // See the documentation for `dojo.i18n` and `dojo.requireLocalization`
+ // for details on loading localized resources. If no locale is specified,
+ // Dojo assumes the locale of the user agent, according to `navigator.userLanguage`
+ // or `navigator.language` properties.
+ locale: undefined,
+ // extraLocale: Array
+ // No default value. Specifies additional locales whose
+ // resources should also be loaded alongside the default locale when
+ // calls to `dojo.requireLocalization()` are processed.
+ extraLocale: undefined,
+ // baseUrl: String
+ // The directory in which `dojo.js` is located. Under normal
+ // conditions, Dojo auto-detects the correct location from which it
+ // was loaded. You may need to manually configure `baseUrl` in cases
+ // where you have renamed `dojo.js` or in which `<base>` tags confuse
+ // some browsers (e.g. IE 6). The variable `dojo.baseUrl` is assigned
+ // either the value of `djConfig.baseUrl` if one is provided or the
+ // auto-detected root if not. Other modules are located relative to
+ // this path. The path should end in a slash.
+ baseUrl: undefined,
+ // modulePaths: Object
+ // A map of module names to paths relative to `dojo.baseUrl`. The
+ // key/value pairs correspond directly to the arguments which
+ // `dojo.registerModulePath` accepts. Specifiying
+ // `djConfig.modulePaths = { "foo": "../../bar" }` is the equivalent
+ // of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple
+ // modules may be configured via `djConfig.modulePaths`.
+ modulePaths: {},
+ // afterOnLoad: Boolean
+ // Indicates Dojo was added to the page after the page load. In this case
+ // Dojo will not wait for the page DOMContentLoad/load events and fire
+ // its dojo.addOnLoad callbacks after making sure all outstanding
+ // dojo.required modules have loaded. Only works with a built dojo.js,
+ // it does not work the dojo.js directly from source control.
+ afterOnLoad: false,
+ // addOnLoad: Function or Array
+ // Adds a callback via dojo.addOnLoad. Useful when Dojo is added after
+ // the page loads and djConfig.afterOnLoad is true. Supports the same
+ // arguments as dojo.addOnLoad. When using a function reference, use
+ // `djConfig.addOnLoad = function(){};`. For object with function name use
+ // `djConfig.addOnLoad = [myObject, "functionName"];` and for object with
+ // function reference use
+ // `djConfig.addOnLoad = [myObject, function(){}];`
+ addOnLoad: null,
+ // require: Array
+ // An array of module names to be loaded immediately after dojo.js has been included
+ // in a page.
+ require: [],
+ // defaultDuration: Array
+ // Default duration, in milliseconds, for wipe and fade animations within dijits.
+ // Assigned to dijit.defaultDuration.
+ defaultDuration: 200,
+ // dojoBlankHtmlUrl: String
+ // Used by some modules to configure an empty iframe. Used by dojo.io.iframe and
+ // dojo.back, and dijit popup support in IE where an iframe is needed to make sure native
+ // controls do not bleed through the popups. Normally this configuration variable
+ // does not need to be set, except when using cross-domain/CDN Dojo builds.
+ // Save dojo/resources/blank.html to your domain and set `djConfig.dojoBlankHtmlUrl`
+ // to the path on your domain your copy of blank.html.
+ dojoBlankHtmlUrl: undefined,
+ // ioPublish: Boolean?
+ // Set this to true to enable publishing of topics for the different phases of
+ // IO operations. Publishing is done via dojo.publish. See dojo.__IoPublish for a list
+ // of topics that are published.
+ ioPublish: false,
+ // useCustomLogger: Anything?
+ // If set to a value that evaluates to true such as a string or array and
+ // isDebug is true and Firebug is not available or running, then it bypasses
+ // the creation of Firebug Lite allowing you to define your own console object.
+ useCustomLogger: undefined,
+ // transparentColor: Array
+ // Array containing the r, g, b components used as transparent color in dojo.Color;
+ // if undefined, [255,255,255] (white) will be used.
+ transparentColor: undefined,
+ // skipIeDomLoaded: Boolean
+ // For IE only, skip the DOMContentLoaded hack used. Sometimes it can cause an Operation
+ // Aborted error if the rest of the page triggers script defers before the DOM is ready.
+ // If this is config value is set to true, then dojo.addOnLoad callbacks will not be
+ // triggered until the page load event, which is after images and iframes load. If you
+ // want to trigger the callbacks sooner, you can put a script block in the bottom of
+ // your HTML that calls dojo._loadInit();. If you are using multiversion support, change
+ // "dojo." to the appropriate scope name for dojo.
+ skipIeDomLoaded: false
}
+=====*/
+});
+
+
+},
+'dojo/_base/event':function(){
+define(["./kernel", "../on", "../has", "../dom-geometry"], function(dojo, on, has, dom){
+ // module:
+ // dojo/_base/event
+ // summary:
+ // This module defines dojo DOM event API.
+ if(on._fixEvent){
+ var fixEvent = on._fixEvent;
+ on._fixEvent = function(evt, se){
+ // add some additional normalization for back-compat, this isn't in on.js because it is somewhat more expensive
+ evt = fixEvent(evt, se);
+ if(evt){
+ dom.normalizeEvent(evt);
+ }
+ return evt;
+ };
+ }
+ dojo.fixEvent = function(/*Event*/ evt, /*DOMNode*/ sender){
+ // summary:
+ // normalizes properties on the event object including event
+ // bubbling methods, keystroke normalization, and x/y positions
+ // evt: Event
+ // native event object
+ // sender: DOMNode
+ // node to treat as "currentTarget"
+ if(on._fixEvent){
+ return on._fixEvent(evt, sender);
+ }
+ return evt; // Event
+ };
+
+ dojo.stopEvent = function(/*Event*/ evt){
+ // summary:
+ // prevents propagation and clobbers the default action of the
+ // passed event
+ // evt: Event
+ // The event object. If omitted, window.event is used on IE.
+ if(has("dom-addeventlistener") || (evt && evt.preventDefault)){
+ evt.preventDefault();
+ evt.stopPropagation();
+ }else{
+ evt = evt || window.event;
+ evt.cancelBubble = true;
+ on._preventDefault.call(evt);
+ }
+ };
+
+ return {
+ fix: dojo.fixEvent,
+ stop: dojo.stopEvent
+ };
+});
+
+},
+'dojo/main':function(){
+define([
+ "./_base/kernel",
+ "./has",
+ "require",
+ "./_base/sniff",
+ "./_base/lang",
+ "./_base/array",
+ "./ready",
+ "./_base/declare",
+ "./_base/connect",
+ "./_base/Deferred",
+ "./_base/json",
+ "./_base/Color",
+ "./has!dojo-firebug?./_firebug/firebug",
+ "./_base/browser",
+ "./_base/loader"], function(dojo, has, require, sniff, lang, array, ready){
+ // module:
+ // dojo/main
+ // summary:
+ // This is the package main module for the dojo package; it loads dojo base appropriate for the execution environment.
+
+ // the preferred way to load the dojo firebug console is by setting has("dojo-firebug") true in dojoConfig
+ // the isDebug config switch is for backcompat and will work fine in sync loading mode; it works in
+ // async mode too, but there's no guarantee when the module is loaded; therefore, if you need a firebug
+ // console guarnanteed at a particular spot in an app, either set config.has["dojo-firebug"] true before
+ // loading dojo.js or explicitly include dojo/_firebug/firebug in a dependency list.
+ if(dojo.config.isDebug){
+ require(["./_firebug/firebug"]);
+ }
+
+ // dojoConfig.require is deprecated; use the loader configuration property deps
+ true || has.add("dojo-config-require", 1);
+ if(1){
+ var deps= dojo.config.require;
+ if(deps){
+ // dojo.config.require may be dot notation
+ deps= array.map(lang.isArray(deps) ? deps : [deps], function(item){ return item.replace(/\./g, "/"); });
+ if(dojo.isAsync){
+ require(deps);
+ }else{
+ // this is a bit janky; in 1.6- dojo is defined before these requires are applied; but in 1.7+
+ // dojo isn't defined until returning from this module; this is only a problem in sync mode
+ // since we're in sync mode, we know we've got our loader with its priority ready queue
+ ready(1, function(){require(deps);});
+ }
+ }
+ }
+
+ return dojo;
+});
+
+},
+'dojo/ready':function(){
+define(["./_base/kernel", "./has", "require", "./domReady", "./_base/lang"], function(dojo, has, require, domReady, lang) {
+ // module:
+ // dojo/ready
+ // summary:
+ // This module defines the dojo.ready API.
+ //
+ // note:
+ // This module should be unnecessary in dojo 2.0
+ var
+ // truthy if DOMContentLoaded or better (e.g., window.onload fired) has been achieved
+ isDomReady = 0,
+
+ // a function to call to cause onLoad to be called when all requested modules have been loaded
+ requestCompleteSignal,
+
+ // The queue of functions waiting to execute as soon as dojo.ready conditions satisfied
+ loadQ = [],
+
+ // prevent recursion in onLoad
+ onLoadRecursiveGuard = 0,
+
+ handleDomReady = function(){
+ isDomReady = 1;
+ dojo._postLoad = dojo.config.afterOnLoad = true;
+ if(loadQ.length){
+ requestCompleteSignal(onLoad);
+ }
+ },
+
+ // run the next function queued with dojo.ready
+ onLoad = function(){
+ if(isDomReady && !onLoadRecursiveGuard && loadQ.length){
+ //guard against recursions into this function
+ onLoadRecursiveGuard = 1;
+ var f = loadQ.shift();
+ try{
+ f();
+ }
+ // FIXME: signal the error via require.on
+ finally{
+ onLoadRecursiveGuard = 0;
+ }
+ onLoadRecursiveGuard = 0;
+ if(loadQ.length){
+ requestCompleteSignal(onLoad);
+ }
+ }
+ };
+
+ // define requireCompleteSignal; impl depends on loader
+ if(1){
+ require.on("idle", onLoad);
+ requestCompleteSignal = function(){
+ if(require.idle()){
+ onLoad();
+ } // else do nothing, onLoad will be called with the next idle signal
+ };
+ }else{
+ // RequireJS or similar
+ requestCompleteSignal = function(){
+ // the next function call will fail if you don't have a loader with require.ready
+ // in that case, either fix your loader, use dojo's loader, or don't call dojo.ready;
+ require.ready(onLoad);
+ };
+ }
-if(!dojo._hasResource["dojo._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base"] = true;
-dojo.provide("dojo._base");
+ var ready = dojo.ready = dojo.addOnLoad = function(priority, context, callback){
+ // summary: Add a function to execute on DOM content loaded and all requested modules have arrived and been evaluated.
+ // priority: Integer?
+ // The order in which to exec this callback relative to other callbacks, defaults to 1000
+ // context: Object?|Function
+ // The context in which to run execute callback, or a callback if not using context
+ // callback: Function?
+ // The function to execute.
+ //
+ // example:
+ // Simple DOM and Modules ready syntax
+ // | dojo.ready(function(){ alert("Dom ready!"); });
+ //
+ // example:
+ // Using a priority
+ // | dojo.ready(2, function(){ alert("low priority ready!"); })
+ //
+ // example:
+ // Using context
+ // | dojo.ready(foo, function(){
+ // | // in here, this == foo
+ // | })
+ //
+ // example:
+ // Using dojo.hitch style args:
+ // | var foo = { dojoReady: function(){ console.warn(this, "dojo dom and modules ready."); } };
+ // | dojo.ready(foo, "dojoReady");
+
+ var hitchArgs = lang._toArray(arguments);
+ if(typeof priority != "number"){
+ callback = context;
+ context = priority;
+ priority = 1000;
+ }else{
+ hitchArgs.shift();
+ }
+ callback = callback ?
+ lang.hitch.apply(dojo, hitchArgs) :
+ function(){
+ context();
+ };
+ callback.priority = priority;
+ for(var i = 0; i < loadQ.length && priority >= loadQ[i].priority; i++){}
+ loadQ.splice(i, 0, callback);
+ requestCompleteSignal();
+ };
+ true || has.add("dojo-config-addOnLoad", 1);
+ if(1){
+ var dca = dojo.config.addOnLoad;
+ if(dca){
+ ready[(lang.isArray(dca) ? "apply" : "call")](dojo, dca);
+ }
+ }
+ if(1 && dojo.config.parseOnLoad && !dojo.isAsync){
+ ready(99, function(){
+ if(!dojo.parser){
+ dojo.deprecated("Add explicit require(['dojo/parser']);", "", "2.0");
+ require(["dojo/parser"]);
+ }
+ });
+ }
+ if(1){
+ domReady(handleDomReady);
+ }else{
+ handleDomReady();
+ }
+ return ready;
+});
+},
+'dojo/aspect':function(){
+define([], function(){
+// TODOC: after/before/around return object
+// TODOC: after/before/around param types.
+/*=====
+ dojo.aspect = {
+ // summary: provides aspect oriented programming functionality, allowing for
+ // one to add before, around, or after advice on existing methods.
+ //
+ // example:
+ // | define(["dojo/aspect"], function(aspect){
+ // | var signal = aspect.after(targetObject, "methodName", function(someArgument){
+ // | this will be called when targetObject.methodName() is called, after the original function is called
+ // | });
+ //
+ // example:
+ // The returned signal object can be used to cancel the advice.
+ // | signal.remove(); // this will stop the advice from being executed anymore
+ // | aspect.before(targetObject, "methodName", function(someArgument){
+ // | // this will be called when targetObject.methodName() is called, before the original function is called
+ // | });
+
+ after: function(target, methodName, advice, receiveArguments){
+ // summary: The "after" export of the aspect module is a function that can be used to attach
+ // "after" advice to a method. This function will be executed after the original method
+ // is executed. By default the function will be called with a single argument, the return
+ // value of the original method, or the the return value of the last executed advice (if a previous one exists).
+ // The fourth (optional) argument can be set to true to so the function receives the original
+ // arguments (from when the original method was called) rather than the return value.
+ // If there are multiple "after" advisors, they are executed in the order they were registered.
+ // target: Object
+ // This is the target object
+ // methodName: String
+ // This is the name of the method to attach to.
+ // advice: Function
+ // This is function to be called after the original method
+ // receiveArguments: Boolean?
+ // If this is set to true, the advice function receives the original arguments (from when the original mehtod
+ // was called) rather than the return value of the original/previous method.
+ // returns:
+ // A signal object that can be used to cancel the advice. If remove() is called on this signal object, it will
+ // stop the advice function from being executed.
+ },
+
+ before: function(target, methodName, advice){
+ // summary: The "before" export of the aspect module is a function that can be used to attach
+ // "before" advice to a method. This function will be executed before the original method
+ // is executed. This function will be called with the arguments used to call the method.
+ // This function may optionally return an array as the new arguments to use to call
+ // the original method (or the previous, next-to-execute before advice, if one exists).
+ // If the before method doesn't return anything (returns undefined) the original arguments
+ // will be preserved.
+ // If there are multiple "before" advisors, they are executed in the reverse order they were registered.
+ //
+ // target: Object
+ // This is the target object
+ // methodName: String
+ // This is the name of the method to attach to.
+ // advice: Function
+ // This is function to be called before the original method
+ },
+ around: function(target, methodName, advice){
+ // summary: The "around" export of the aspect module is a function that can be used to attach
+ // "around" advice to a method. The advisor function is immediately executed when
+ // the around() is called, is passed a single argument that is a function that can be
+ // called to continue execution of the original method (or the next around advisor).
+ // The advisor function should return a function, and this function will be called whenever
+ // the method is called. It will be called with the arguments used to call the method.
+ // Whatever this function returns will be returned as the result of the method call (unless after advise changes it).
+ //
+ // example:
+ // If there are multiple "around" advisors, the most recent one is executed first,
+ // which can then delegate to the next one and so on. For example:
+ // | around(obj, "foo", function(originalFoo){
+ // | return function(){
+ // | var start = new Date().getTime();
+ // | var results = originalFoo.apply(this, arguments); // call the original
+ // | var end = new Date().getTime();
+ // | console.log("foo execution took " + (end - start) + " ms");
+ // | return results;
+ // | };
+ // | });
+ //
+ // target: Object
+ // This is the target object
+ // methodName: String
+ // This is the name of the method to attach to.
+ // advice: Function
+ // This is function to be called around the original method
+ }
+ };
+=====*/
+ "use strict";
+ var nextId = 0;
+ function advise(dispatcher, type, advice, receiveArguments){
+ var previous = dispatcher[type];
+ var around = type == "around";
+ var signal;
+ if(around){
+ var advised = advice(function(){
+ return previous.advice(this, arguments);
+ });
+ signal = {
+ remove: function(){
+ signal.cancelled = true;
+ },
+ advice: function(target, args){
+ return signal.cancelled ?
+ previous.advice(target, args) : // cancelled, skip to next one
+ advised.apply(target, args); // called the advised function
+ }
+ };
+ }else{
+ // create the remove handler
+ signal = {
+ remove: function(){
+ var previous = signal.previous;
+ var next = signal.next;
+ if(!next && !previous){
+ delete dispatcher[type];
+ }else{
+ if(previous){
+ previous.next = next;
+ }else{
+ dispatcher[type] = next;
+ }
+ if(next){
+ next.previous = previous;
+ }
+ }
+ },
+ id: nextId++,
+ advice: advice,
+ receiveArguments: receiveArguments
+ };
+ }
+ if(previous && !around){
+ if(type == "after"){
+ // add the listener to the end of the list
+ var next = previous;
+ while(next){
+ previous = next;
+ next = next.next;
+ }
+ previous.next = signal;
+ signal.previous = previous;
+ }else if(type == "before"){
+ // add to beginning
+ dispatcher[type] = signal;
+ signal.next = previous;
+ previous.previous = signal;
+ }
+ }else{
+ // around or first one just replaces
+ dispatcher[type] = signal;
+ }
+ return signal;
+ }
+ function aspect(type){
+ return function(target, methodName, advice, receiveArguments){
+ var existing = target[methodName], dispatcher;
+ if(!existing || existing.target != target){
+ // no dispatcher in place
+ target[methodName] = dispatcher = function(){
+ var executionId = nextId;
+ // before advice
+ var args = arguments;
+ var before = dispatcher.before;
+ while(before){
+ args = before.advice.apply(this, args) || args;
+ before = before.next;
+ }
+ // around advice
+ if(dispatcher.around){
+ var results = dispatcher.around.advice(this, args);
+ }
+ // after advice
+ var after = dispatcher.after;
+ while(after && after.id < executionId){
+ results = after.receiveArguments ? after.advice.apply(this, args) || results :
+ after.advice.call(this, results);
+ after = after.next;
+ }
+ return results;
+ };
+ if(existing){
+ dispatcher.around = {advice: function(target, args){
+ return existing.apply(target, args);
+ }};
+ }
+ dispatcher.target = target;
+ }
+ var results = advise((dispatcher || existing), type, advice, receiveArguments);
+ advice = null;
+ return results;
+ };
+ }
+ return {
+ before: aspect("before"),
+ around: aspect("around"),
+ after: aspect("after")
+ };
+});
+
+},
+'dojo/_base/connect':function(){
+define(["./kernel", "../on", "../topic", "../aspect", "./event", "../mouse", "./sniff", "./lang", "../keys"], function(kernel, on, hub, aspect, eventModule, mouse, has, lang){
+// module:
+// dojo/_base/connect
+// summary:
+// This module defines the dojo.connect API.
+// This modules also provides keyboard event handling helpers.
+// This module exports an extension event for emulating Firefox's keypress handling.
+// However, this extension event exists primarily for backwards compatibility and
+// is not recommended. WebKit and IE uses an alternate keypress handling (only
+// firing for printable characters, to distinguish from keydown events), and most
+// consider the WebKit/IE behavior more desirable.
+has.add("events-keypress-typed", function(){ // keypresses should only occur a printable character is hit
+ var testKeyEvent = {charCode: 0};
+ try{
+ testKeyEvent = document.createEvent("KeyboardEvent");
+ (testKeyEvent.initKeyboardEvent || testKeyEvent.initKeyEvent).call(testKeyEvent, "keypress", true, true, null, false, false, false, false, 9, 3);
+ }catch(e){}
+ return testKeyEvent.charCode == 0 && !has("opera");
+});
+
+function connect_(obj, event, context, method, dontFix){
+ method = lang.hitch(context, method);
+ if(!obj || !(obj.addEventListener || obj.attachEvent)){
+ // it is a not a DOM node and we are using the dojo.connect style of treating a
+ // method like an event, must go right to aspect
+ return aspect.after(obj || kernel.global, event, method, true);
+ }
+ if(typeof event == "string" && event.substring(0, 2) == "on"){
+ event = event.substring(2);
+ }
+ if(!obj){
+ obj = kernel.global;
+ }
+ if(!dontFix){
+ switch(event){
+ // dojo.connect has special handling for these event types
+ case "keypress":
+ event = keypress;
+ break;
+ case "mouseenter":
+ event = mouse.enter;
+ break;
+ case "mouseleave":
+ event = mouse.leave;
+ break;
+ }
+ }
+ return on(obj, event, method, dontFix);
+}
+var _punctMap = {
+ 106:42,
+ 111:47,
+ 186:59,
+ 187:43,
+ 188:44,
+ 189:45,
+ 190:46,
+ 191:47,
+ 192:96,
+ 219:91,
+ 220:92,
+ 221:93,
+ 222:39,
+ 229:113
+};
+var evtCopyKey = has("mac") ? "metaKey" : "ctrlKey";
+
+
+var _synthesizeEvent = function(evt, props){
+ var faux = lang.mixin({}, evt, props);
+ setKeyChar(faux);
+ // FIXME: would prefer to use lang.hitch: lang.hitch(evt, evt.preventDefault);
+ // but it throws an error when preventDefault is invoked on Safari
+ // does Event.preventDefault not support "apply" on Safari?
+ faux.preventDefault = function(){ evt.preventDefault(); };
+ faux.stopPropagation = function(){ evt.stopPropagation(); };
+ return faux;
+};
+function setKeyChar(evt){
+ evt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : '';
+ evt.charOrCode = evt.keyChar || evt.keyCode;
}
+var keypress;
+if(has("events-keypress-typed")){
+ // this emulates Firefox's keypress behavior where every keydown can correspond to a keypress
+ var _trySetKeyCode = function(e, code){
+ try{
+ // squelch errors when keyCode is read-only
+ // (e.g. if keyCode is ctrl or shift)
+ return (e.keyCode = code);
+ }catch(e){
+ return 0;
+ }
+ };
+ keypress = function(object, listener){
+ var keydownSignal = on(object, "keydown", function(evt){
+ // munge key/charCode
+ var k=evt.keyCode;
+ // These are Windows Virtual Key Codes
+ // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp
+ var unprintable = (k!=13 || (has("ie") >= 9 && !has("quirks"))) && k!=32 && (k!=27||!has("ie")) && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222) && k!=229;
+ // synthesize keypress for most unprintables and CTRL-keys
+ if(unprintable||evt.ctrlKey){
+ var c = unprintable ? 0 : k;
+ if(evt.ctrlKey){
+ if(k==3 || k==13){
+ return listener.call(evt.currentTarget, evt); // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively
+ }else if(c>95 && c<106){
+ c -= 48; // map CTRL-[numpad 0-9] to ASCII
+ }else if((!evt.shiftKey)&&(c>=65&&c<=90)){
+ c += 32; // map CTRL-[A-Z] to lowercase
+ }else{
+ c = _punctMap[c] || c; // map other problematic CTRL combinations to ASCII
+ }
+ }
+ // simulate a keypress event
+ var faux = _synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c});
+ listener.call(evt.currentTarget, faux);
+ if(has("ie")){
+ _trySetKeyCode(evt, faux.keyCode);
+ }
+ }
+ });
+ var keypressSignal = on(object, "keypress", function(evt){
+ var c = evt.charCode;
+ c = c>=32 ? c : 0;
+ evt = _synthesizeEvent(evt, {charCode: c, faux: true});
+ return listener.call(this, evt);
+ });
+ return {
+ remove: function(){
+ keydownSignal.remove();
+ keypressSignal.remove();
+ }
+ };
+ };
+}else{
+ if(has("opera")){
+ keypress = function(object, listener){
+ return on(object, "keypress", function(evt){
+ var c = evt.which;
+ if(c==3){
+ c=99; // Mozilla maps CTRL-BREAK to CTRL-c
+ }
+ // can't trap some keys at all, like INSERT and DELETE
+ // there is no differentiating info between DELETE and ".", or INSERT and "-"
+ c = c<32 && !evt.shiftKey ? 0 : c;
+ if(evt.ctrlKey && !evt.shiftKey && c>=65 && c<=90){
+ // lowercase CTRL-[A-Z] keys
+ c += 32;
+ }
+ return listener.call(this, _synthesizeEvent(evt, { charCode: c }));
+ });
+ };
+ }else{
+ keypress = function(object, listener){
+ return on(object, "keypress", function(evt){
+ setKeyChar(evt);
+ return listener.call(this, evt);
+ });
+ };
+ }
+}
+
+var connect = {
+ _keypress:keypress,
+
+ connect:function(obj, event, context, method, dontFix){
+ // normalize arguments
+ var a=arguments, args=[], i=0;
+ // if a[0] is a String, obj was omitted
+ args.push(typeof a[0] == "string" ? null : a[i++], a[i++]);
+ // if the arg-after-next is a String or Function, context was NOT omitted
+ var a1 = a[i+1];
+ args.push(typeof a1 == "string" || typeof a1 == "function" ? a[i++] : null, a[i++]);
+ // absorb any additional arguments
+ for(var l=a.length; i<l; i++){ args.push(a[i]); }
+ return connect_.apply(this, args);
+ },
- //INSERT dojo.i18n._preloadLocalizations HERE
+ disconnect:function(handle){
+ if(handle){
+ handle.remove();
+ }
+ },
+
+ subscribe:function(topic, context, method){
+ return hub.subscribe(topic, lang.hitch(context, method));
+ },
- //Check if document already complete, and if so, just trigger page load
- //listeners. NOTE: does not work with Firefox before 3.6. To support
- //those browsers, set djConfig.afterOnLoad = true when you know Dojo is added
- //after page load. Using a timeout so the rest of this
- //script gets evaluated properly. This work needs to happen after the
- //dojo.config.require work done in dojo._base.
- if(dojo.isBrowser && (document.readyState === "complete" || dojo.config.afterOnLoad)){
- window.setTimeout(dojo._loadInit, 100);
+ publish:function(topic, args){
+ return hub.publish.apply(hub, [topic].concat(args));
+ },
+
+ connectPublisher:function(topic, obj, event){
+ var pf = function(){ connect.publish(topic, arguments); };
+ return event ? connect.connect(obj, event, pf) : connect.connect(obj, pf); //Handle
+ },
+
+ isCopyKey: function(e){
+ return e[evtCopyKey]; // Boolean
}
-})();
+};
+connect.unsubscribe = connect.disconnect;
+
+1 && lang.mixin(kernel, connect);
+return connect;
+/*=====
+dojo.connect = function(obj, event, context, method, dontFix){
+ // summary:
+ // `dojo.connect` is the core event handling and delegation method in
+ // Dojo. It allows one function to "listen in" on the execution of
+ // any other, triggering the second whenever the first is called. Many
+ // listeners may be attached to a function, and source functions may
+ // be either regular function calls or DOM events.
+ //
+ // description:
+ // Connects listeners to actions, so that after event fires, a
+ // listener is called with the same arguments passed to the original
+ // function.
+ //
+ // Since `dojo.connect` allows the source of events to be either a
+ // "regular" JavaScript function or a DOM event, it provides a uniform
+ // interface for listening to all the types of events that an
+ // application is likely to deal with though a single, unified
+ // interface. DOM programmers may want to think of it as
+ // "addEventListener for everything and anything".
+ //
+ // When setting up a connection, the `event` parameter must be a
+ // string that is the name of the method/event to be listened for. If
+ // `obj` is null, `kernel.global` is assumed, meaning that connections
+ // to global methods are supported but also that you may inadvertently
+ // connect to a global by passing an incorrect object name or invalid
+ // reference.
+ //
+ // `dojo.connect` generally is forgiving. If you pass the name of a
+ // function or method that does not yet exist on `obj`, connect will
+ // not fail, but will instead set up a stub method. Similarly, null
+ // arguments may simply be omitted such that fewer than 4 arguments
+ // may be required to set up a connection See the examples for details.
+ //
+ // The return value is a handle that is needed to
+ // remove this connection with `dojo.disconnect`.
+ //
+ // obj: Object|null:
+ // The source object for the event function.
+ // Defaults to `kernel.global` if null.
+ // If obj is a DOM node, the connection is delegated
+ // to the DOM event manager (unless dontFix is true).
+ //
+ // event: String:
+ // String name of the event function in obj.
+ // I.e. identifies a property `obj[event]`.
+ //
+ // context: Object|null
+ // The object that method will receive as "this".
+ //
+ // If context is null and method is a function, then method
+ // inherits the context of event.
+ //
+ // If method is a string then context must be the source
+ // object object for method (context[method]). If context is null,
+ // kernel.global is used.
+ //
+ // method: String|Function:
+ // A function reference, or name of a function in context.
+ // The function identified by method fires after event does.
+ // method receives the same arguments as the event.
+ // See context argument comments for information on method's scope.
+ //
+ // dontFix: Boolean?
+ // If obj is a DOM node, set dontFix to true to prevent delegation
+ // of this connection to the DOM event manager.
+ //
+ // example:
+ // When obj.onchange(), do ui.update():
+ // | dojo.connect(obj, "onchange", ui, "update");
+ // | dojo.connect(obj, "onchange", ui, ui.update); // same
+ //
+ // example:
+ // Using return value for disconnect:
+ // | var link = dojo.connect(obj, "onchange", ui, "update");
+ // | ...
+ // | dojo.disconnect(link);
+ //
+ // example:
+ // When onglobalevent executes, watcher.handler is invoked:
+ // | dojo.connect(null, "onglobalevent", watcher, "handler");
+ //
+ // example:
+ // When ob.onCustomEvent executes, customEventHandler is invoked:
+ // | dojo.connect(ob, "onCustomEvent", null, "customEventHandler");
+ // | dojo.connect(ob, "onCustomEvent", "customEventHandler"); // same
+ //
+ // example:
+ // When ob.onCustomEvent executes, customEventHandler is invoked
+ // with the same scope (this):
+ // | dojo.connect(ob, "onCustomEvent", null, customEventHandler);
+ // | dojo.connect(ob, "onCustomEvent", customEventHandler); // same
+ //
+ // example:
+ // When globalEvent executes, globalHandler is invoked
+ // with the same scope (this):
+ // | dojo.connect(null, "globalEvent", null, globalHandler);
+ // | dojo.connect("globalEvent", globalHandler); // same
+}
+=====*/
+
+/*=====
+dojo.disconnect = function(handle){
+ // summary:
+ // Remove a link created by dojo.connect.
+ // description:
+ // Removes the connection between event and the method referenced by handle.
+ // handle: Handle:
+ // the return value of the dojo.connect call that created the connection.
+}
+=====*/
+
+/*=====
+dojo.subscribe = function(topic, context, method){
+ // summary:
+ // Attach a listener to a named topic. The listener function is invoked whenever the
+ // named topic is published (see: dojo.publish).
+ // Returns a handle which is needed to unsubscribe this listener.
+ // topic: String:
+ // The topic to which to subscribe.
+ // context: Object|null:
+ // Scope in which method will be invoked, or null for default scope.
+ // method: String|Function:
+ // The name of a function in context, or a function reference. This is the function that
+ // is invoked when topic is published.
+ // example:
+ // | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); });
+ // | dojo.publish("alerts", [ "read this", "hello world" ]);
+}
+=====*/
+
+/*=====
+dojo.unsubscribe = function(handle){
+ // summary:
+ // Remove a topic listener.
+ // handle: Handle
+ // The handle returned from a call to subscribe.
+ // example:
+ // | var alerter = dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
+ // | ...
+ // | dojo.unsubscribe(alerter);
+}
+=====*/
+
+/*=====
+dojo.publish = function(topic, args){
+ // summary:
+ // Invoke all listener method subscribed to topic.
+ // topic: String:
+ // The name of the topic to publish.
+ // args: Array?
+ // An array of arguments. The arguments will be applied
+ // to each topic subscriber (as first class parameters, via apply).
+ // example:
+ // | dojo.subscribe("alerts", null, function(caption, message){ alert(caption + "\n" + message); };
+ // | dojo.publish("alerts", [ "read this", "hello world" ]);
+}
+=====*/
+
+/*=====
+dojo.connectPublisher = function(topic, obj, event){
+ // summary:
+ // Ensure that every time obj.event() is called, a message is published
+ // on the topic. Returns a handle which can be passed to
+ // dojo.disconnect() to disable subsequent automatic publication on
+ // the topic.
+ // topic: String:
+ // The name of the topic to publish.
+ // obj: Object|null:
+ // The source object for the event function. Defaults to kernel.global
+ // if null.
+ // event: String:
+ // The name of the event function in obj.
+ // I.e. identifies a property obj[event].
+ // example:
+ // | dojo.connectPublisher("/ajax/start", dojo, "xhrGet");
+}
+=====*/
+
+/*=====
+dojo.isCopyKey = function(e){
+ // summary:
+ // Checks an event for the copy key (meta on Mac, and ctrl anywhere else)
+ // e: Event
+ // Event object to examine
+}
+=====*/
+
+});
+
+
+
+}}});
+(function(){
+ // must use this.require to make this work in node.js
+ var require = this.require;
+ // consume the cached dojo layer
+ require({cache:{}});
+ !require.async && require(["dojo"]);
+ require.boot && require.apply(null, require.boot);
+})();
diff --git a/lib/dojo/dojo.profile.js b/lib/dojo/dojo.profile.js
new file mode 100644
index 000000000..40e45f923
--- /dev/null
+++ b/lib/dojo/dojo.profile.js
@@ -0,0 +1,40 @@
+var profile = (function(){
+ var testResourceRe = /^dojo\/tests\//,
+
+ copyOnly = function(filename, mid){
+ var list = {
+ "dojo/dojo.profile":1,
+ "dojo/package.json":1,
+ "dojo/OpenAjax":1,
+ "dojo/tests":1,
+ // these are test modules that are not intended to ever be built
+ "dojo/tests/_base/loader/requirejs/requirejs-setup":1,
+ "dojo/tests/_base/loader/requirejs/dataMain":1,
+ "dojo/tests/_base/loader/requirejs/depoverlap":1,
+ "dojo/tests/_base/loader/requirejs/simple-tests":1,
+ "dojo/tests/_base/loader/requirejs/relative/relative-tests":1,
+ "dojo/tests/_base/loader/requirejs/exports/exports-tests":1
+ };
+ return (mid in list) || /^dojo\/_base\/config\w+$/.test(mid) || (/^dojo\/resources\//.test(mid) && !/\.css$/.test(filename)) || /(png|jpg|jpeg|gif|tiff)$/.test(filename);
+ };
+
+ return {
+ resourceTags:{
+ test: function(filename, mid){
+ return testResourceRe.test(mid) || mid=="dojo/tests" || mid=="dojo/robot" || mid=="dojo/robotx";
+ },
+
+ copyOnly: function(filename, mid){
+ return copyOnly(filename, mid);
+ },
+
+ amd: function(filename, mid){
+ return !testResourceRe.test(mid) && !copyOnly(filename, mid) && /\.js$/.test(filename);
+ }
+ },
+
+ trees:[
+ [".", ".", /(\/\.)|(~$)/]
+ ]
+ };
+})();
diff --git a/lib/dojo/dom-attr.js b/lib/dojo/dom-attr.js
new file mode 100644
index 000000000..de63f414c
--- /dev/null
+++ b/lib/dojo/dom-attr.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/dom-attr",["exports","./_base/sniff","./_base/lang","./dom","./dom-style","./dom-prop"],function(_1,_2,_3,_4,_5,_6){var _7={innerHTML:1,className:1,htmlFor:_2("ie"),value:1},_8={classname:"class",htmlfor:"for",tabindex:"tabIndex",readonly:"readOnly"};function _9(_a,_b){var _c=_a.getAttributeNode&&_a.getAttributeNode(_b);return _c&&_c.specified;};_1.has=function hasAttr(_d,_e){var lc=_e.toLowerCase();return _7[_6.names[lc]||_e]||_9(_4.byId(_d),_8[lc]||_e);};_1.get=function getAttr(_f,_10){_f=_4.byId(_f);var lc=_10.toLowerCase(),_11=_6.names[lc]||_10,_12=_7[_11];value=_f[_11];if(_12&&typeof value!="undefined"){return value;}if(_11!="href"&&(typeof value=="boolean"||_3.isFunction(value))){return value;}var _13=_8[lc]||_10;return _9(_f,_13)?_f.getAttribute(_13):null;};_1.set=function setAttr(_14,_15,_16){_14=_4.byId(_14);if(arguments.length==2){for(var x in _15){_1.set(_14,x,_15[x]);}return _14;}var lc=_15.toLowerCase(),_17=_6.names[lc]||_15,_18=_7[_17];if(_17=="style"&&typeof _16!="string"){_5.set(_14,_16);return _14;}if(_18||typeof _16=="boolean"||_3.isFunction(_16)){return _6.set(_14,_15,_16);}_14.setAttribute(_8[lc]||_15,_16);return _14;};_1.remove=function removeAttr(_19,_1a){_4.byId(_19).removeAttribute(_8[_1a.toLowerCase()]||_1a);};_1.getNodeProp=function getNodeProp(_1b,_1c){_1b=_4.byId(_1b);var lc=_1c.toLowerCase(),_1d=_6.names[lc]||_1c;if((_1d in _1b)&&_1d!="href"){return _1b[_1d];}var _1e=_8[lc]||_1c;return _9(_1b,_1e)?_1b.getAttribute(_1e):null;};}); \ No newline at end of file
diff --git a/lib/dojo/dom-attr.js.uncompressed.js b/lib/dojo/dom-attr.js.uncompressed.js
new file mode 100644
index 000000000..99a91bc87
--- /dev/null
+++ b/lib/dojo/dom-attr.js.uncompressed.js
@@ -0,0 +1,238 @@
+define("dojo/dom-attr", ["exports", "./_base/sniff", "./_base/lang", "./dom", "./dom-style", "./dom-prop"],
+ function(exports, has, lang, dom, style, prop){
+ // module:
+ // dojo/dom-attr
+ // summary:
+ // This module defines the core dojo DOM attributes API.
+
+ // =============================
+ // Element attribute Functions
+ // =============================
+
+ // This module will be obsolete soon. Use dojo.prop instead.
+
+ // dojo.attr() should conform to http://www.w3.org/TR/DOM-Level-2-Core/
+
+ // attribute-related functions (to be obsolete soon)
+
+ /*=====
+ dojo.hasAttr = function(node, name){
+ // summary:
+ // Returns true if the requested attribute is specified on the
+ // given element, and false otherwise.
+ // node: DOMNode|String
+ // id or reference to the element to check
+ // name: String
+ // the name of the attribute
+ // returns: Boolean
+ // true if the requested attribute is specified on the
+ // given element, and false otherwise
+ };
+ =====*/
+
+ /*=====
+ dojo.getAttr = function(node, name){
+ // summary:
+ // Gets an attribute on an HTML element.
+ // description:
+ // Handles normalized getting of attributes on DOM Nodes.
+ // node: DOMNode|String
+ // id or reference to the element to get the attribute on
+ // name: String
+ // the name of the attribute to get.
+ // returns:
+ // the value of the requested attribute or null if that attribute does not have a specified or
+ // default value;
+ //
+ // example:
+ // | // get the current value of the "foo" attribute on a node
+ // | dojo.getAttr(dojo.byId("nodeId"), "foo");
+ // | // or we can just pass the id:
+ // | dojo.getAttr("nodeId", "foo");
+ };
+ =====*/
+
+ /*=====
+ dojo.setAttr = function(node, name, value){
+ // summary:
+ // Sets an attribute on an HTML element.
+ // description:
+ // Handles normalized setting of attributes on DOM Nodes.
+ //
+ // When passing functions as values, note that they will not be
+ // directly assigned to slots on the node, but rather the default
+ // behavior will be removed and the new behavior will be added
+ // using `dojo.connect()`, meaning that event handler properties
+ // will be normalized and that some caveats with regards to
+ // non-standard behaviors for onsubmit apply. Namely that you
+ // should cancel form submission using `dojo.stopEvent()` on the
+ // passed event object instead of returning a boolean value from
+ // the handler itself.
+ // node: DOMNode|String
+ // id or reference to the element to set the attribute on
+ // name: String|Object
+ // the name of the attribute to set, or a hash of key-value pairs to set.
+ // value: String?
+ // the value to set for the attribute, if the name is a string.
+ // returns:
+ // the DOM node
+ //
+ // example:
+ // | // use attr() to set the tab index
+ // | dojo.setAttr("nodeId", "tabIndex", 3);
+ //
+ // example:
+ // Set multiple values at once, including event handlers:
+ // | dojo.setAttr("formId", {
+ // | "foo": "bar",
+ // | "tabIndex": -1,
+ // | "method": "POST",
+ // | "onsubmit": function(e){
+ // | // stop submitting the form. Note that the IE behavior
+ // | // of returning true or false will have no effect here
+ // | // since our handler is connect()ed to the built-in
+ // | // onsubmit behavior and so we need to use
+ // | // dojo.stopEvent() to ensure that the submission
+ // | // doesn't proceed.
+ // | dojo.stopEvent(e);
+ // |
+ // | // submit the form with Ajax
+ // | dojo.xhrPost({ form: "formId" });
+ // | }
+ // | });
+ //
+ // example:
+ // Style is s special case: Only set with an object hash of styles
+ // | dojo.setAttr("someNode",{
+ // | id:"bar",
+ // | style:{
+ // | width:"200px", height:"100px", color:"#000"
+ // | }
+ // | });
+ //
+ // example:
+ // Again, only set style as an object hash of styles:
+ // | var obj = { color:"#fff", backgroundColor:"#000" };
+ // | dojo.setAttr("someNode", "style", obj);
+ // |
+ // | // though shorter to use `dojo.style()` in this case:
+ // | dojo.setStyle("someNode", obj);
+ };
+ =====*/
+
+ /*=====
+ dojo.removeAttr = function(node, name){
+ // summary:
+ // Removes an attribute from an HTML element.
+ // node: DOMNode|String
+ // id or reference to the element to remove the attribute from
+ // name: String
+ // the name of the attribute to remove
+ };
+ =====*/
+
+ /*=====
+ dojo.getNodeProp = function(node, name){
+ // summary:
+ // Returns an effective value of a property or an attribute.
+ // node: DOMNode|String
+ // id or reference to the element to remove the attribute from
+ // name: String
+ // the name of the attribute
+ // returns:
+ // the value of the attribute
+ };
+ =====*/
+
+ var forcePropNames = {
+ innerHTML: 1,
+ className: 1,
+ htmlFor: has("ie"),
+ value: 1
+ },
+ attrNames = {
+ // original attribute names
+ classname: "class",
+ htmlfor: "for",
+ // for IE
+ tabindex: "tabIndex",
+ readonly: "readOnly"
+ };
+
+ function _hasAttr(node, name){
+ var attr = node.getAttributeNode && node.getAttributeNode(name);
+ return attr && attr.specified; // Boolean
+ }
+
+ // There is a difference in the presence of certain properties and their default values
+ // between browsers. For example, on IE "disabled" is present on all elements,
+ // but it is value is "false"; "tabIndex" of <div> returns 0 by default on IE, yet other browsers
+ // can return -1.
+
+ exports.has = function hasAttr(/*DOMNode|String*/node, /*String*/name){
+ var lc = name.toLowerCase();
+ return forcePropNames[prop.names[lc] || name] || _hasAttr(dom.byId(node), attrNames[lc] || name); // Boolean
+ };
+
+ exports.get = function getAttr(/*DOMNode|String*/node, /*String*/name){
+ node = dom.byId(node);
+ var lc = name.toLowerCase(),
+ propName = prop.names[lc] || name,
+ forceProp = forcePropNames[propName];
+ // should we access this attribute via a property or via getAttribute()?
+ value = node[propName];
+ if(forceProp && typeof value != "undefined"){
+ // node's property
+ return value; // Anything
+ }
+ if(propName != "href" && (typeof value == "boolean" || lang.isFunction(value))){
+ // node's property
+ return value; // Anything
+ }
+ // node's attribute
+ // we need _hasAttr() here to guard against IE returning a default value
+ var attrName = attrNames[lc] || name;
+ return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything
+ };
+
+ exports.set = function setAttr(/*DOMNode|String*/node, /*String|Object*/name, /*String?*/value){
+ node = dom.byId(node);
+ if(arguments.length == 2){ // inline'd type check
+ // the object form of setter: the 2nd argument is a dictionary
+ for(var x in name){
+ exports.set(node, x, name[x]);
+ }
+ return node; // DomNode
+ }
+ var lc = name.toLowerCase(),
+ propName = prop.names[lc] || name,
+ forceProp = forcePropNames[propName];
+ if(propName == "style" && typeof value != "string"){ // inline'd type check
+ // special case: setting a style
+ style.set(node, value);
+ return node; // DomNode
+ }
+ if(forceProp || typeof value == "boolean" || lang.isFunction(value)){
+ return prop.set(node, name, value)
+ }
+ // node's attribute
+ node.setAttribute(attrNames[lc] || name, value);
+ return node; // DomNode
+ };
+
+ exports.remove = function removeAttr(/*DOMNode|String*/ node, /*String*/ name){
+ dom.byId(node).removeAttribute(attrNames[name.toLowerCase()] || name);
+ };
+
+ exports.getNodeProp = function getNodeProp(/*DomNode|String*/ node, /*String*/ name){
+ node = dom.byId(node);
+ var lc = name.toLowerCase(), propName = prop.names[lc] || name;
+ if((propName in node) && propName != "href"){
+ // node's property
+ return node[propName]; // Anything
+ }
+ // node's attribute
+ var attrName = attrNames[lc] || name;
+ return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything
+ };
+});
diff --git a/lib/dojo/dom-class.js b/lib/dojo/dom-class.js
new file mode 100644
index 000000000..e4f09f161
--- /dev/null
+++ b/lib/dojo/dom-class.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/dom-class",["./_base/lang","./_base/array","./dom"],function(_1,_2,_3){var _4="className";var _5,_6=/\s+/,a1=[""];function _7(s){if(typeof s=="string"||s instanceof String){if(s&&!_6.test(s)){a1[0]=s;return a1;}var a=s.split(_6);if(a.length&&!a[0]){a.shift();}if(a.length&&!a[a.length-1]){a.pop();}return a;}if(!s){return [];}return _2.filter(s,function(x){return x;});};var _8={};_5={contains:function containsClass(_9,_a){return ((" "+_3.byId(_9)[_4]+" ").indexOf(" "+_a+" ")>=0);},add:function addClass(_b,_c){_b=_3.byId(_b);_c=_7(_c);var _d=_b[_4],_e;_d=_d?" "+_d+" ":" ";_e=_d.length;for(var i=0,_f=_c.length,c;i<_f;++i){c=_c[i];if(c&&_d.indexOf(" "+c+" ")<0){_d+=c+" ";}}if(_e<_d.length){_b[_4]=_d.substr(1,_d.length-2);}},remove:function removeClass(_10,_11){_10=_3.byId(_10);var cls;if(_11!==undefined){_11=_7(_11);cls=" "+_10[_4]+" ";for(var i=0,len=_11.length;i<len;++i){cls=cls.replace(" "+_11[i]+" "," ");}cls=_1.trim(cls);}else{cls="";}if(_10[_4]!=cls){_10[_4]=cls;}},replace:function replaceClass(_12,_13,_14){_12=_3.byId(_12);_8[_4]=_12[_4];_5.remove(_8,_14);_5.add(_8,_13);if(_12[_4]!==_8[_4]){_12[_4]=_8[_4];}},toggle:function toggleClass(_15,_16,_17){_15=_3.byId(_15);if(_17===undefined){_16=_7(_16);for(var i=0,len=_16.length,c;i<len;++i){c=_16[i];_5[_5.contains(_15,c)?"remove":"add"](_15,c);}}else{_5[_17?"add":"remove"](_15,_16);}return _17;}};return _5;}); \ No newline at end of file
diff --git a/lib/dojo/dom-class.js.uncompressed.js b/lib/dojo/dom-class.js.uncompressed.js
new file mode 100644
index 000000000..1237cddc9
--- /dev/null
+++ b/lib/dojo/dom-class.js.uncompressed.js
@@ -0,0 +1,320 @@
+define("dojo/dom-class", ["./_base/lang", "./_base/array", "./dom"], function(lang, array, dom){
+ // module:
+ // dojo/dom-class
+ // summary:
+ // This module defines the core dojo DOM class API.
+
+ var className = "className";
+
+ /* Part I of classList-based implementation is preserved here for posterity
+ var classList = "classList";
+ has.add("dom-classList", function(){
+ return classList in document.createElement("p");
+ });
+ */
+
+ // =============================
+ // (CSS) Class Functions
+ // =============================
+
+ /*=====
+ dojo.hasClass = function(node, classStr){
+ // summary:
+ // Returns whether or not the specified classes are a portion of the
+ // class list currently applied to the node.
+ //
+ // node: String|DOMNode
+ // String ID or DomNode reference to check the class for.
+ //
+ // classStr: String
+ // A string class name to look for.
+ //
+ // returns: Boolean
+ //
+ // example:
+ // Do something if a node with id="someNode" has class="aSillyClassName" present
+ // | if(dojo.hasClass("someNode","aSillyClassName")){ ... }
+ };
+ =====*/
+
+ /*=====
+ dojo.addClass = function(node, classStr){
+ // summary:
+ // Adds the specified classes to the end of the class list on the
+ // passed node. Will not re-apply duplicate classes.
+ //
+ // node: String|DOMNode
+ // String ID or DomNode reference to add a class string too
+ //
+ // classStr: String|Array
+ // A String class name to add, or several space-separated class names,
+ // or an array of class names.
+ //
+ // example:
+ // Add a class to some node:
+ // | dojo.addClass("someNode", "anewClass");
+ //
+ // example:
+ // Add two classes at once:
+ // | dojo.addClass("someNode", "firstClass secondClass");
+ //
+ // example:
+ // Add two classes at once (using array):
+ // | dojo.addClass("someNode", ["firstClass", "secondClass"]);
+ //
+ // example:
+ // Available in `dojo.NodeList` for multiple additions
+ // | dojo.query("ul > li").addClass("firstLevel");
+ };
+ =====*/
+
+ /*=====
+ dojo.removeClass = function(node, classStr){
+ // summary:
+ // Removes the specified classes from node. No `dojo.hasClass`
+ // check is required.
+ //
+ // node: String|DOMNode
+ // String ID or DomNode reference to remove the class from.
+ //
+ // classStr: String|Array
+ // An optional String class name to remove, or several space-separated
+ // class names, or an array of class names. If omitted, all class names
+ // will be deleted.
+ //
+ // example:
+ // Remove a class from some node:
+ // | dojo.removeClass("someNode", "firstClass");
+ //
+ // example:
+ // Remove two classes from some node:
+ // | dojo.removeClass("someNode", "firstClass secondClass");
+ //
+ // example:
+ // Remove two classes from some node (using array):
+ // | dojo.removeClass("someNode", ["firstClass", "secondClass"]);
+ //
+ // example:
+ // Remove all classes from some node:
+ // | dojo.removeClass("someNode");
+ //
+ // example:
+ // Available in `dojo.NodeList()` for multiple removal
+ // | dojo.query(".foo").removeClass("foo");
+ };
+ =====*/
+
+ /*=====
+ dojo.replaceClass = function(node, addClassStr, removeClassStr){
+ // summary:
+ // Replaces one or more classes on a node if not present.
+ // Operates more quickly than calling dojo.removeClass and dojo.addClass
+ //
+ // node: String|DOMNode
+ // String ID or DomNode reference to remove the class from.
+ //
+ // addClassStr: String|Array
+ // A String class name to add, or several space-separated class names,
+ // or an array of class names.
+ //
+ // removeClassStr: String|Array?
+ // A String class name to remove, or several space-separated class names,
+ // or an array of class names.
+ //
+ // example:
+ // | dojo.replaceClass("someNode", "add1 add2", "remove1 remove2");
+ //
+ // example:
+ // Replace all classes with addMe
+ // | dojo.replaceClass("someNode", "addMe");
+ //
+ // example:
+ // Available in `dojo.NodeList()` for multiple toggles
+ // | dojo.query(".findMe").replaceClass("addMe", "removeMe");
+ };
+ =====*/
+
+ /*=====
+ dojo.toggleClass = function(node, classStr, condition){
+ // summary:
+ // Adds a class to node if not present, or removes if present.
+ // Pass a boolean condition if you want to explicitly add or remove.
+ // Returns the condition that was specified directly or indirectly.
+ //
+ // node: String|DOMNode
+ // String ID or DomNode reference to toggle a class string
+ //
+ // classStr: String|Array
+ // A String class name to toggle, or several space-separated class names,
+ // or an array of class names.
+ //
+ // condition:
+ // If passed, true means to add the class, false means to remove.
+ // Otherwise dojo.hasClass(node, classStr) is used to detect the class presence.
+ //
+ // example:
+ // | dojo.toggleClass("someNode", "hovered");
+ //
+ // example:
+ // Forcefully add a class
+ // | dojo.toggleClass("someNode", "hovered", true);
+ //
+ // example:
+ // Available in `dojo.NodeList()` for multiple toggles
+ // | dojo.query(".toggleMe").toggleClass("toggleMe");
+ };
+ =====*/
+
+ var cls, // exports object
+ spaces = /\s+/, a1 = [""];
+
+ function str2array(s){
+ if(typeof s == "string" || s instanceof String){
+ if(s && !spaces.test(s)){
+ a1[0] = s;
+ return a1;
+ }
+ var a = s.split(spaces);
+ if(a.length && !a[0]){
+ a.shift();
+ }
+ if(a.length && !a[a.length - 1]){
+ a.pop();
+ }
+ return a;
+ }
+ // assumed to be an array
+ if(!s){
+ return [];
+ }
+ return array.filter(s, function(x){ return x; });
+ }
+
+ /* Part II of classList-based implementation is preserved here for posterity
+ if(has("dom-classList")){
+ // new classList version
+ cls = {
+ contains: function containsClass(node, classStr){
+ var clslst = classStr && dom.byId(node)[classList];
+ return clslst && clslst.contains(classStr); // Boolean
+ },
+
+ add: function addClass(node, classStr){
+ node = dom.byId(node);
+ classStr = str2array(classStr);
+ for(var i = 0, len = classStr.length; i < len; ++i){
+ node[classList].add(classStr[i]);
+ }
+ },
+
+ remove: function removeClass(node, classStr){
+ node = dom.byId(node);
+ if(classStr === undefined){
+ node[className] = "";
+ }else{
+ classStr = str2array(classStr);
+ for(var i = 0, len = classStr.length; i < len; ++i){
+ node[classList].remove(classStr[i]);
+ }
+ }
+ },
+
+ replace: function replaceClass(node, addClassStr, removeClassStr){
+ node = dom.byId(node);
+ if(removeClassStr === undefined){
+ node[className] = "";
+ }else{
+ removeClassStr = str2array(removeClassStr);
+ for(var i = 0, len = removeClassStr.length; i < len; ++i){
+ node[classList].remove(removeClassStr[i]);
+ }
+ }
+ addClassStr = str2array(addClassStr);
+ for(i = 0, len = addClassStr.length; i < len; ++i){
+ node[classList].add(addClassStr[i]);
+ }
+ },
+
+ toggle: function toggleClass(node, classStr, condition){
+ node = dom.byId(node);
+ if(condition === undefined){
+ classStr = str2array(classStr);
+ for(var i = 0, len = classStr.length; i < len; ++i){
+ node[classList].toggle(classStr[i]);
+ }
+ }else{
+ cls[condition ? "add" : "remove"](node, classStr);
+ }
+ return condition; // Boolean
+ }
+ }
+ }
+ */
+
+ // regular DOM version
+ var fakeNode = {}; // for effective replacement
+ cls = {
+ contains: function containsClass(/*DomNode|String*/node, /*String*/classStr){
+ return ((" " + dom.byId(node)[className] + " ").indexOf(" " + classStr + " ") >= 0); // Boolean
+ },
+
+ add: function addClass(/*DomNode|String*/node, /*String|Array*/classStr){
+ node = dom.byId(node);
+ classStr = str2array(classStr);
+ var cls = node[className], oldLen;
+ cls = cls ? " " + cls + " " : " ";
+ oldLen = cls.length;
+ for(var i = 0, len = classStr.length, c; i < len; ++i){
+ c = classStr[i];
+ if(c && cls.indexOf(" " + c + " ") < 0){
+ cls += c + " ";
+ }
+ }
+ if(oldLen < cls.length){
+ node[className] = cls.substr(1, cls.length - 2);
+ }
+ },
+
+ remove: function removeClass(/*DomNode|String*/node, /*String|Array?*/classStr){
+ node = dom.byId(node);
+ var cls;
+ if(classStr !== undefined){
+ classStr = str2array(classStr);
+ cls = " " + node[className] + " ";
+ for(var i = 0, len = classStr.length; i < len; ++i){
+ cls = cls.replace(" " + classStr[i] + " ", " ");
+ }
+ cls = lang.trim(cls);
+ }else{
+ cls = "";
+ }
+ if(node[className] != cls){ node[className] = cls; }
+ },
+
+ replace: function replaceClass(/*DomNode|String*/node, /*String|Array*/addClassStr, /*String|Array?*/removeClassStr){
+ node = dom.byId(node);
+ fakeNode[className] = node[className];
+ cls.remove(fakeNode, removeClassStr);
+ cls.add(fakeNode, addClassStr);
+ if(node[className] !== fakeNode[className]){
+ node[className] = fakeNode[className];
+ }
+ },
+
+ toggle: function toggleClass(/*DomNode|String*/node, /*String|Array*/classStr, /*Boolean?*/condition){
+ node = dom.byId(node);
+ if(condition === undefined){
+ classStr = str2array(classStr);
+ for(var i = 0, len = classStr.length, c; i < len; ++i){
+ c = classStr[i];
+ cls[cls.contains(node, c) ? "remove" : "add"](node, c);
+ }
+ }else{
+ cls[condition ? "add" : "remove"](node, classStr);
+ }
+ return condition; // Boolean
+ }
+ };
+
+ return cls;
+});
diff --git a/lib/dojo/dom-construct.js b/lib/dojo/dom-construct.js
new file mode 100644
index 000000000..856d00058
--- /dev/null
+++ b/lib/dojo/dom-construct.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/dom-construct",["exports","./_base/kernel","./_base/sniff","./_base/window","./dom","./dom-attr","./on"],function(_1,_2,_3,_4,_5,_6,on){var _7={option:["select"],tbody:["table"],thead:["table"],tfoot:["table"],tr:["table","tbody"],td:["table","tbody","tr"],th:["table","thead","tr"],legend:["fieldset"],caption:["table"],colgroup:["table"],col:["table","colgroup"],li:["ul"]},_8=/<\s*([\w\:]+)/,_9={},_a=0,_b="__"+_2._scopeName+"ToDomId";for(var _c in _7){if(_7.hasOwnProperty(_c)){var tw=_7[_c];tw.pre=_c=="option"?"<select multiple=\"multiple\">":"<"+tw.join("><")+">";tw.post="</"+tw.reverse().join("></")+">";}}function _d(_e,_f){var _10=_f.parentNode;if(_10){_10.insertBefore(_e,_f);}};function _11(_12,ref){var _13=ref.parentNode;if(_13){if(_13.lastChild==ref){_13.appendChild(_12);}else{_13.insertBefore(_12,ref.nextSibling);}}};var _14=null,_15;on(window,"unload",function(){_14=null;});_1.toDom=function toDom(_16,doc){doc=doc||_4.doc;var _17=doc[_b];if(!_17){doc[_b]=_17=++_a+"";_9[_17]=doc.createElement("div");}_16+="";var _18=_16.match(_8),tag=_18?_18[1].toLowerCase():"",_19=_9[_17],_1a,i,fc,df;if(_18&&_7[tag]){_1a=_7[tag];_19.innerHTML=_1a.pre+_16+_1a.post;for(i=_1a.length;i;--i){_19=_19.firstChild;}}else{_19.innerHTML=_16;}if(_19.childNodes.length==1){return _19.removeChild(_19.firstChild);}df=doc.createDocumentFragment();while(fc=_19.firstChild){df.appendChild(fc);}return df;};_1.place=function place(_1b,_1c,_1d){_1c=_5.byId(_1c);if(typeof _1b=="string"){_1b=/^\s*</.test(_1b)?_1.toDom(_1b,_1c.ownerDocument):_5.byId(_1b);}if(typeof _1d=="number"){var cn=_1c.childNodes;if(!cn.length||cn.length<=_1d){_1c.appendChild(_1b);}else{_d(_1b,cn[_1d<0?0:_1d]);}}else{switch(_1d){case "before":_d(_1b,_1c);break;case "after":_11(_1b,_1c);break;case "replace":_1c.parentNode.replaceChild(_1b,_1c);break;case "only":_1.empty(_1c);_1c.appendChild(_1b);break;case "first":if(_1c.firstChild){_d(_1b,_1c.firstChild);break;}default:_1c.appendChild(_1b);}}return _1b;};_1.create=function create(tag,_1e,_1f,pos){var doc=_4.doc;if(_1f){_1f=_5.byId(_1f);doc=_1f.ownerDocument;}if(typeof tag=="string"){tag=doc.createElement(tag);}if(_1e){_6.set(tag,_1e);}if(_1f){_1.place(tag,_1f,pos);}return tag;};_1.empty=_3("ie")?function(_20){_20=_5.byId(_20);for(var c;c=_20.lastChild;){_1.destroy(c);}}:function(_21){_5.byId(_21).innerHTML="";};_1.destroy=function destroy(_22){_22=_5.byId(_22);try{var doc=_22.ownerDocument;if(!_14||_15!=doc){_14=doc.createElement("div");_15=doc;}_14.appendChild(_22.parentNode?_22.parentNode.removeChild(_22):_22);_14.innerHTML="";}catch(e){}};}); \ No newline at end of file
diff --git a/lib/dojo/dom-construct.js.uncompressed.js b/lib/dojo/dom-construct.js.uncompressed.js
new file mode 100644
index 000000000..9cde253c1
--- /dev/null
+++ b/lib/dojo/dom-construct.js.uncompressed.js
@@ -0,0 +1,376 @@
+define("dojo/dom-construct", ["exports", "./_base/kernel", "./_base/sniff", "./_base/window", "./dom", "./dom-attr", "./on"],
+ function(exports, dojo, has, win, dom, attr, on){
+ // module:
+ // dojo/dom-construct
+ // summary:
+ // This module defines the core dojo DOM construction API.
+
+ /*=====
+ dojo.toDom = function(frag, doc){
+ // summary:
+ // instantiates an HTML fragment returning the corresponding DOM.
+ // frag: String
+ // the HTML fragment
+ // doc: DocumentNode?
+ // optional document to use when creating DOM nodes, defaults to
+ // dojo.doc if not specified.
+ // returns: DocumentFragment
+ //
+ // example:
+ // Create a table row:
+ // | var tr = dojo.toDom("<tr><td>First!</td></tr>");
+ };
+ =====*/
+
+ /*=====
+ dojo._toDom = function(frag, doc){
+ // summary:
+ // Existing alias for `dojo.toDom`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.place = function(node, refNode, position){
+ // summary:
+ // Attempt to insert node into the DOM, choosing from various positioning options.
+ // Returns the first argument resolved to a DOM node.
+ //
+ // node: DOMNode|String
+ // id or node reference, or HTML fragment starting with "<" to place relative to refNode
+ //
+ // refNode: DOMNode|String
+ // id or node reference to use as basis for placement
+ //
+ // position: String|Number?
+ // string noting the position of node relative to refNode or a
+ // number indicating the location in the childNodes collection of refNode.
+ // Accepted string values are:
+ // | * before
+ // | * after
+ // | * replace
+ // | * only
+ // | * first
+ // | * last
+ // "first" and "last" indicate positions as children of refNode, "replace" replaces refNode,
+ // "only" replaces all children. position defaults to "last" if not specified
+ //
+ // returns: DOMNode
+ // Returned values is the first argument resolved to a DOM node.
+ //
+ // .place() is also a method of `dojo.NodeList`, allowing `dojo.query` node lookups.
+ //
+ // example:
+ // Place a node by string id as the last child of another node by string id:
+ // | dojo.place("someNode", "anotherNode");
+ //
+ // example:
+ // Place a node by string id before another node by string id
+ // | dojo.place("someNode", "anotherNode", "before");
+ //
+ // example:
+ // Create a Node, and place it in the body element (last child):
+ // | dojo.place("<div></div>", dojo.body());
+ //
+ // example:
+ // Put a new LI as the first child of a list by id:
+ // | dojo.place("<li></li>", "someUl", "first");
+ };
+ =====*/
+
+ /*=====
+ dojo.create = function(tag, attrs, refNode, pos){
+ // summary:
+ // Create an element, allowing for optional attribute decoration
+ // and placement.
+ //
+ // description:
+ // A DOM Element creation function. A shorthand method for creating a node or
+ // a fragment, and allowing for a convenient optional attribute setting step,
+ // as well as an optional DOM placement reference.
+ //|
+ // Attributes are set by passing the optional object through `dojo.setAttr`.
+ // See `dojo.setAttr` for noted caveats and nuances, and API if applicable.
+ //|
+ // Placement is done via `dojo.place`, assuming the new node to be the action
+ // node, passing along the optional reference node and position.
+ //
+ // tag: DOMNode|String
+ // A string of the element to create (eg: "div", "a", "p", "li", "script", "br"),
+ // or an existing DOM node to process.
+ //
+ // attrs: Object
+ // An object-hash of attributes to set on the newly created node.
+ // Can be null, if you don't want to set any attributes/styles.
+ // See: `dojo.setAttr` for a description of available attributes.
+ //
+ // refNode: DOMNode?|String?
+ // Optional reference node. Used by `dojo.place` to place the newly created
+ // node somewhere in the dom relative to refNode. Can be a DomNode reference
+ // or String ID of a node.
+ //
+ // pos: String?
+ // Optional positional reference. Defaults to "last" by way of `dojo.place`,
+ // though can be set to "first","after","before","last", "replace" or "only"
+ // to further control the placement of the new node relative to the refNode.
+ // 'refNode' is required if a 'pos' is specified.
+ //
+ // returns: DOMNode
+ //
+ // example:
+ // Create a DIV:
+ // | var n = dojo.create("div");
+ //
+ // example:
+ // Create a DIV with content:
+ // | var n = dojo.create("div", { innerHTML:"<p>hi</p>" });
+ //
+ // example:
+ // Place a new DIV in the BODY, with no attributes set
+ // | var n = dojo.create("div", null, dojo.body());
+ //
+ // example:
+ // Create an UL, and populate it with LI's. Place the list as the first-child of a
+ // node with id="someId":
+ // | var ul = dojo.create("ul", null, "someId", "first");
+ // | var items = ["one", "two", "three", "four"];
+ // | dojo.forEach(items, function(data){
+ // | dojo.create("li", { innerHTML: data }, ul);
+ // | });
+ //
+ // example:
+ // Create an anchor, with an href. Place in BODY:
+ // | dojo.create("a", { href:"foo.html", title:"Goto FOO!" }, dojo.body());
+ //
+ // example:
+ // Create a `dojo.NodeList()` from a new element (for syntatic sugar):
+ // | dojo.query(dojo.create('div'))
+ // | .addClass("newDiv")
+ // | .onclick(function(e){ console.log('clicked', e.target) })
+ // | .place("#someNode"); // redundant, but cleaner.
+ };
+ =====*/
+
+ /*=====
+ dojo.empty = function(node){
+ // summary:
+ // safely removes all children of the node.
+ // node: DOMNode|String
+ // a reference to a DOM node or an id.
+ // example:
+ // Destroy node's children byId:
+ // | dojo.empty("someId");
+ //
+ // example:
+ // Destroy all nodes' children in a list by reference:
+ // | dojo.query(".someNode").forEach(dojo.empty);
+ }
+ =====*/
+
+ /*=====
+ dojo.destroy = function(node){
+ // summary:
+ // Removes a node from its parent, clobbering it and all of its
+ // children.
+ //
+ // description:
+ // Removes a node from its parent, clobbering it and all of its
+ // children. Function only works with DomNodes, and returns nothing.
+ //
+ // node: DOMNode|String
+ // A String ID or DomNode reference of the element to be destroyed
+ //
+ // example:
+ // Destroy a node byId:
+ // | dojo.destroy("someId");
+ //
+ // example:
+ // Destroy all nodes in a list by reference:
+ // | dojo.query(".someNode").forEach(dojo.destroy);
+ };
+ =====*/
+
+ /*=====
+ dojo._destroyElement = function(node){
+ // summary:
+ // Existing alias for `dojo.destroy`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ // support stuff for dojo.toDom
+ var tagWrap = {
+ option: ["select"],
+ tbody: ["table"],
+ thead: ["table"],
+ tfoot: ["table"],
+ tr: ["table", "tbody"],
+ td: ["table", "tbody", "tr"],
+ th: ["table", "thead", "tr"],
+ legend: ["fieldset"],
+ caption: ["table"],
+ colgroup: ["table"],
+ col: ["table", "colgroup"],
+ li: ["ul"]
+ },
+ reTag = /<\s*([\w\:]+)/,
+ masterNode = {}, masterNum = 0,
+ masterName = "__" + dojo._scopeName + "ToDomId";
+
+ // generate start/end tag strings to use
+ // for the injection for each special tag wrap case.
+ for(var param in tagWrap){
+ if(tagWrap.hasOwnProperty(param)){
+ var tw = tagWrap[param];
+ tw.pre = param == "option" ? '<select multiple="multiple">' : "<" + tw.join("><") + ">";
+ tw.post = "</" + tw.reverse().join("></") + ">";
+ // the last line is destructive: it reverses the array,
+ // but we don't care at this point
+ }
+ }
+
+ function _insertBefore(/*DomNode*/node, /*DomNode*/ref){
+ var parent = ref.parentNode;
+ if(parent){
+ parent.insertBefore(node, ref);
+ }
+ }
+
+ function _insertAfter(/*DomNode*/node, /*DomNode*/ref){
+ // summary:
+ // Try to insert node after ref
+ var parent = ref.parentNode;
+ if(parent){
+ if(parent.lastChild == ref){
+ parent.appendChild(node);
+ }else{
+ parent.insertBefore(node, ref.nextSibling);
+ }
+ }
+ }
+
+ var _destroyContainer = null,
+ _destroyDoc;
+ on(window, "unload", function(){
+ _destroyContainer = null; //prevent IE leak
+ });
+
+ exports.toDom = function toDom(frag, doc){
+ doc = doc || win.doc;
+ var masterId = doc[masterName];
+ if(!masterId){
+ doc[masterName] = masterId = ++masterNum + "";
+ masterNode[masterId] = doc.createElement("div");
+ }
+
+ // make sure the frag is a string.
+ frag += "";
+
+ // find the starting tag, and get node wrapper
+ var match = frag.match(reTag),
+ tag = match ? match[1].toLowerCase() : "",
+ master = masterNode[masterId],
+ wrap, i, fc, df;
+ if(match && tagWrap[tag]){
+ wrap = tagWrap[tag];
+ master.innerHTML = wrap.pre + frag + wrap.post;
+ for(i = wrap.length; i; --i){
+ master = master.firstChild;
+ }
+ }else{
+ master.innerHTML = frag;
+ }
+
+ // one node shortcut => return the node itself
+ if(master.childNodes.length == 1){
+ return master.removeChild(master.firstChild); // DOMNode
+ }
+
+ // return multiple nodes as a document fragment
+ df = doc.createDocumentFragment();
+ while(fc = master.firstChild){ // intentional assignment
+ df.appendChild(fc);
+ }
+ return df; // DOMNode
+ };
+
+ exports.place = function place(/*DOMNode|String*/node, /*DOMNode|String*/refNode, /*String|Number?*/position){
+ refNode = dom.byId(refNode);
+ if(typeof node == "string"){ // inline'd type check
+ node = /^\s*</.test(node) ? exports.toDom(node, refNode.ownerDocument) : dom.byId(node);
+ }
+ if(typeof position == "number"){ // inline'd type check
+ var cn = refNode.childNodes;
+ if(!cn.length || cn.length <= position){
+ refNode.appendChild(node);
+ }else{
+ _insertBefore(node, cn[position < 0 ? 0 : position]);
+ }
+ }else{
+ switch(position){
+ case "before":
+ _insertBefore(node, refNode);
+ break;
+ case "after":
+ _insertAfter(node, refNode);
+ break;
+ case "replace":
+ refNode.parentNode.replaceChild(node, refNode);
+ break;
+ case "only":
+ exports.empty(refNode);
+ refNode.appendChild(node);
+ break;
+ case "first":
+ if(refNode.firstChild){
+ _insertBefore(node, refNode.firstChild);
+ break;
+ }
+ // else fallthrough...
+ default: // aka: last
+ refNode.appendChild(node);
+ }
+ }
+ return node; // DomNode
+ };
+
+ exports.create = function create(/*DOMNode|String*/tag, /*Object*/attrs, /*DOMNode?|String?*/refNode, /*String?*/pos){
+ var doc = win.doc;
+ if(refNode){
+ refNode = dom.byId(refNode);
+ doc = refNode.ownerDocument;
+ }
+ if(typeof tag == "string"){ // inline'd type check
+ tag = doc.createElement(tag);
+ }
+ if(attrs){ attr.set(tag, attrs); }
+ if(refNode){ exports.place(tag, refNode, pos); }
+ return tag; // DomNode
+ };
+
+ exports.empty =
+ has("ie") ? function(node){
+ node = dom.byId(node);
+ for(var c; c = node.lastChild;){ // intentional assignment
+ exports.destroy(c);
+ }
+ } :
+ function(node){
+ dom.byId(node).innerHTML = "";
+ };
+
+ exports.destroy = function destroy(/*DOMNode|String*/node){
+ node = dom.byId(node);
+ try{
+ var doc = node.ownerDocument;
+ // cannot use _destroyContainer.ownerDocument since this can throw an exception on IE
+ if(!_destroyContainer || _destroyDoc != doc){
+ _destroyContainer = doc.createElement("div");
+ _destroyDoc = doc;
+ }
+ _destroyContainer.appendChild(node.parentNode ? node.parentNode.removeChild(node) : node);
+ // NOTE: see http://trac.dojotoolkit.org/ticket/2931. This may be a bug and not a feature
+ _destroyContainer.innerHTML = "";
+ }catch(e){
+ /* squelch */
+ }
+ };
+});
diff --git a/lib/dojo/dom-form.js b/lib/dojo/dom-form.js
new file mode 100644
index 000000000..0854d6b96
--- /dev/null
+++ b/lib/dojo/dom-form.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/dom-form",["./_base/lang","./dom","./io-query","./json"],function(_1,_2,_3,_4){function _5(_6,_7,_8){if(_8===null){return;}var _9=_6[_7];if(typeof _9=="string"){_6[_7]=[_9,_8];}else{if(_1.isArray(_9)){_9.push(_8);}else{_6[_7]=_8;}}};var _a="file|submit|image|reset|button";var _b={fieldToObject:function fieldToObject(_c){var _d=null;_c=_2.byId(_c);if(_c){var _e=_c.name,_f=(_c.type||"").toLowerCase();if(_e&&_f&&!_c.disabled){if(_f=="radio"||_f=="checkbox"){if(_c.checked){_d=_c.value;}}else{if(_c.multiple){_d=[];var _10=[_c.firstChild];while(_10.length){for(var _11=_10.pop();_11;_11=_11.nextSibling){if(_11.nodeType==1&&_11.tagName.toLowerCase()=="option"){if(_11.selected){_d.push(_11.value);}}else{if(_11.nextSibling){_10.push(_11.nextSibling);}if(_11.firstChild){_10.push(_11.firstChild);}break;}}}}else{_d=_c.value;}}}}return _d;},toObject:function formToObject(_12){var ret={},_13=_2.byId(_12).elements;for(var i=0,l=_13.length;i<l;++i){var _14=_13[i],_15=_14.name,_16=(_14.type||"").toLowerCase();if(_15&&_16&&_a.indexOf(_16)<0&&!_14.disabled){_5(ret,_15,_b.fieldToObject(_14));if(_16=="image"){ret[_15+".x"]=ret[_15+".y"]=ret[_15].x=ret[_15].y=0;}}}return ret;},toQuery:function formToQuery(_17){return _3.objectToQuery(_b.toObject(_17));},toJson:function formToJson(_18,_19){return _4.stringify(_b.toObject(_18),null,_19?4:0);}};return _b;}); \ No newline at end of file
diff --git a/lib/dojo/dom-form.js.uncompressed.js b/lib/dojo/dom-form.js.uncompressed.js
new file mode 100644
index 000000000..5a7210709
--- /dev/null
+++ b/lib/dojo/dom-form.js.uncompressed.js
@@ -0,0 +1,166 @@
+define("dojo/dom-form", ["./_base/lang", "./dom", "./io-query", "./json"], function(lang, dom, ioq, json){
+ // module:
+ // dojo/dom-form
+ // summary:
+ // This module defines form-processing functions.
+
+ /*=====
+ dojo.fieldToObject = function(inputNode){
+ // summary:
+ // Serialize a form field to a JavaScript object.
+ // description:
+ // Returns the value encoded in a form field as
+ // as a string or an array of strings. Disabled form elements
+ // and unchecked radio and checkboxes are skipped. Multi-select
+ // elements are returned as an array of string values.
+ // inputNode: DOMNode|String
+ // returns: Object
+ };
+ =====*/
+
+ /*=====
+ dojo.formToObject = function(formNode){
+ // summary:
+ // Serialize a form node to a JavaScript object.
+ // description:
+ // Returns the values encoded in an HTML form as
+ // string properties in an object which it then returns. Disabled form
+ // elements, buttons, and other non-value form elements are skipped.
+ // Multi-select elements are returned as an array of string values.
+ // formNode: DOMNode|String
+ // returns: Object
+ //
+ // example:
+ // This form:
+ // | <form id="test_form">
+ // | <input type="text" name="blah" value="blah">
+ // | <input type="text" name="no_value" value="blah" disabled>
+ // | <input type="button" name="no_value2" value="blah">
+ // | <select type="select" multiple name="multi" size="5">
+ // | <option value="blah">blah</option>
+ // | <option value="thud" selected>thud</option>
+ // | <option value="thonk" selected>thonk</option>
+ // | </select>
+ // | </form>
+ //
+ // yields this object structure as the result of a call to
+ // formToObject():
+ //
+ // | {
+ // | blah: "blah",
+ // | multi: [
+ // | "thud",
+ // | "thonk"
+ // | ]
+ // | };
+ };
+ =====*/
+
+ /*=====
+ dojo.formToQuery = function(formNode){
+ // summary:
+ // Returns a URL-encoded string representing the form passed as either a
+ // node or string ID identifying the form to serialize
+ // formNode: DOMNode|String
+ // returns: String
+ };
+ =====*/
+
+ /*=====
+ dojo.formToJson = function(formNode, prettyPrint){
+ // summary:
+ // Create a serialized JSON string from a form node or string
+ // ID identifying the form to serialize
+ // formNode: DOMNode|String
+ // prettyPrint: Boolean?
+ // returns: String
+ };
+ =====*/
+
+ function setValue(/*Object*/obj, /*String*/name, /*String*/value){
+ // summary:
+ // For the named property in object, set the value. If a value
+ // already exists and it is a string, convert the value to be an
+ // array of values.
+
+ // Skip it if there is no value
+ if(value === null){
+ return;
+ }
+
+ var val = obj[name];
+ if(typeof val == "string"){ // inline'd type check
+ obj[name] = [val, value];
+ }else if(lang.isArray(val)){
+ val.push(value);
+ }else{
+ obj[name] = value;
+ }
+ }
+
+ var exclude = "file|submit|image|reset|button";
+
+ var form = {
+ fieldToObject: function fieldToObject(/*DOMNode|String*/ inputNode){
+ var ret = null;
+ inputNode = dom.byId(inputNode);
+ if(inputNode){
+ var _in = inputNode.name, type = (inputNode.type || "").toLowerCase();
+ if(_in && type && !inputNode.disabled){
+ if(type == "radio" || type == "checkbox"){
+ if(inputNode.checked){
+ ret = inputNode.value;
+ }
+ }else if(inputNode.multiple){
+ ret = [];
+ var nodes = [inputNode.firstChild];
+ while(nodes.length){
+ for(var node = nodes.pop(); node; node = node.nextSibling){
+ if(node.nodeType == 1 && node.tagName.toLowerCase() == "option"){
+ if(node.selected){
+ ret.push(node.value);
+ }
+ }else{
+ if(node.nextSibling){
+ nodes.push(node.nextSibling);
+ }
+ if(node.firstChild){
+ nodes.push(node.firstChild);
+ }
+ break;
+ }
+ }
+ }
+ }else{
+ ret = inputNode.value;
+ }
+ }
+ }
+ return ret; // Object
+ },
+
+ toObject: function formToObject(/*DOMNode|String*/ formNode){
+ var ret = {}, elems = dom.byId(formNode).elements;
+ for(var i = 0, l = elems.length; i < l; ++i){
+ var item = elems[i], _in = item.name, type = (item.type || "").toLowerCase();
+ if(_in && type && exclude.indexOf(type) < 0 && !item.disabled){
+ setValue(ret, _in, form.fieldToObject(item));
+ if(type == "image"){
+ ret[_in + ".x"] = ret[_in + ".y"] = ret[_in].x = ret[_in].y = 0;
+ }
+ }
+ }
+ return ret; // Object
+ },
+
+ toQuery: function formToQuery(/*DOMNode|String*/ formNode){
+ return ioq.objectToQuery(form.toObject(formNode)); // String
+ },
+
+ toJson: function formToJson(/*DOMNode|String*/ formNode, /*Boolean?*/prettyPrint){
+ return json.stringify(form.toObject(formNode), null, prettyPrint ? 4 : 0); // String
+ }
+ };
+
+ return form;
+});
diff --git a/lib/dojo/dom-geometry.js b/lib/dojo/dom-geometry.js
new file mode 100644
index 000000000..e9ade9c65
--- /dev/null
+++ b/lib/dojo/dom-geometry.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/dom-geometry",["./_base/sniff","./_base/window","./dom","./dom-style"],function(_1,_2,_3,_4){var _5={};_5.boxModel="content-box";if(_1("ie")){_5.boxModel=document.compatMode=="BackCompat"?"border-box":"content-box";}_5.getPadExtents=function getPadExtents(_6,_7){_6=_3.byId(_6);var s=_7||_4.getComputedStyle(_6),px=_4.toPixelValue,l=px(_6,s.paddingLeft),t=px(_6,s.paddingTop),r=px(_6,s.paddingRight),b=px(_6,s.paddingBottom);return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};var _8="none";_5.getBorderExtents=function getBorderExtents(_9,_a){_9=_3.byId(_9);var px=_4.toPixelValue,s=_a||_4.getComputedStyle(_9),l=s.borderLeftStyle!=_8?px(_9,s.borderLeftWidth):0,t=s.borderTopStyle!=_8?px(_9,s.borderTopWidth):0,r=s.borderRightStyle!=_8?px(_9,s.borderRightWidth):0,b=s.borderBottomStyle!=_8?px(_9,s.borderBottomWidth):0;return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};_5.getPadBorderExtents=function getPadBorderExtents(_b,_c){_b=_3.byId(_b);var s=_c||_4.getComputedStyle(_b),p=_5.getPadExtents(_b,s),b=_5.getBorderExtents(_b,s);return {l:p.l+b.l,t:p.t+b.t,r:p.r+b.r,b:p.b+b.b,w:p.w+b.w,h:p.h+b.h};};_5.getMarginExtents=function getMarginExtents(_d,_e){_d=_3.byId(_d);var s=_e||_4.getComputedStyle(_d),px=_4.toPixelValue,l=px(_d,s.marginLeft),t=px(_d,s.marginTop),r=px(_d,s.marginRight),b=px(_d,s.marginBottom);if(_1("webkit")&&(s.position!="absolute")){r=l;}return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};_5.getMarginBox=function getMarginBox(_f,_10){_f=_3.byId(_f);var s=_10||_4.getComputedStyle(_f),me=_5.getMarginExtents(_f,s),l=_f.offsetLeft-me.l,t=_f.offsetTop-me.t,p=_f.parentNode,px=_4.toPixelValue,pcs;if(_1("mozilla")){var sl=parseFloat(s.left),st=parseFloat(s.top);if(!isNaN(sl)&&!isNaN(st)){l=sl,t=st;}else{if(p&&p.style){pcs=_4.getComputedStyle(p);if(pcs.overflow!="visible"){l+=pcs.borderLeftStyle!=_8?px(_f,pcs.borderLeftWidth):0;t+=pcs.borderTopStyle!=_8?px(_f,pcs.borderTopWidth):0;}}}}else{if(_1("opera")||(_1("ie")==8&&!_1("quirks"))){if(p){pcs=_4.getComputedStyle(p);l-=pcs.borderLeftStyle!=_8?px(_f,pcs.borderLeftWidth):0;t-=pcs.borderTopStyle!=_8?px(_f,pcs.borderTopWidth):0;}}}return {l:l,t:t,w:_f.offsetWidth+me.w,h:_f.offsetHeight+me.h};};_5.getContentBox=function getContentBox(_11,_12){_11=_3.byId(_11);var s=_12||_4.getComputedStyle(_11),w=_11.clientWidth,h,pe=_5.getPadExtents(_11,s),be=_5.getBorderExtents(_11,s);if(!w){w=_11.offsetWidth;h=_11.offsetHeight;}else{h=_11.clientHeight;be.w=be.h=0;}if(_1("opera")){pe.l+=be.l;pe.t+=be.t;}return {l:pe.l,t:pe.t,w:w-pe.w-be.w,h:h-pe.h-be.h};};function _13(_14,l,t,w,h,u){u=u||"px";var s=_14.style;if(!isNaN(l)){s.left=l+u;}if(!isNaN(t)){s.top=t+u;}if(w>=0){s.width=w+u;}if(h>=0){s.height=h+u;}};function _15(_16){return _16.tagName.toLowerCase()=="button"||_16.tagName.toLowerCase()=="input"&&(_16.getAttribute("type")||"").toLowerCase()=="button";};function _17(_18){return _5.boxModel=="border-box"||_18.tagName.toLowerCase()=="table"||_15(_18);};_5.setContentSize=function setContentSize(_19,box,_1a){_19=_3.byId(_19);var w=box.w,h=box.h;if(_17(_19)){var pb=_5.getPadBorderExtents(_19,_1a);if(w>=0){w+=pb.w;}if(h>=0){h+=pb.h;}}_13(_19,NaN,NaN,w,h);};var _1b={l:0,t:0,w:0,h:0};_5.setMarginBox=function setMarginBox(_1c,box,_1d){_1c=_3.byId(_1c);var s=_1d||_4.getComputedStyle(_1c),w=box.w,h=box.h,pb=_17(_1c)?_1b:_5.getPadBorderExtents(_1c,s),mb=_5.getMarginExtents(_1c,s);if(_1("webkit")){if(_15(_1c)){var ns=_1c.style;if(w>=0&&!ns.width){ns.width="4px";}if(h>=0&&!ns.height){ns.height="4px";}}}if(w>=0){w=Math.max(w-pb.w-mb.w,0);}if(h>=0){h=Math.max(h-pb.h-mb.h,0);}_13(_1c,box.l,box.t,w,h);};_5.isBodyLtr=function isBodyLtr(){return (_2.body().dir||_2.doc.documentElement.dir||"ltr").toLowerCase()=="ltr";};_5.docScroll=function docScroll(){var _1e=_2.doc.parentWindow||_2.doc.defaultView;return "pageXOffset" in _1e?{x:_1e.pageXOffset,y:_1e.pageYOffset}:(_1e=_1("quirks")?_2.body():_2.doc.documentElement,{x:_5.fixIeBiDiScrollLeft(_1e.scrollLeft||0),y:_1e.scrollTop||0});};_5.getIeDocumentElementOffset=function getIeDocumentElementOffset(){var de=_2.doc.documentElement;if(_1("ie")<8){var r=de.getBoundingClientRect(),l=r.left,t=r.top;if(_1("ie")<7){l+=de.clientLeft;t+=de.clientTop;}return {x:l<0?0:l,y:t<0?0:t};}else{return {x:0,y:0};}};_5.fixIeBiDiScrollLeft=function fixIeBiDiScrollLeft(_1f){var ie=_1("ie");if(ie&&!_5.isBodyLtr()){var qk=_1("quirks"),de=qk?_2.body():_2.doc.documentElement;if(ie==6&&!qk&&_2.global.frameElement&&de.scrollHeight>de.clientHeight){_1f+=de.clientLeft;}return (ie<8||qk)?(_1f+de.clientWidth-de.scrollWidth):-_1f;}return _1f;};_5.position=function(_20,_21){_20=_3.byId(_20);var db=_2.body(),dh=db.parentNode,ret=_20.getBoundingClientRect();ret={x:ret.left,y:ret.top,w:ret.right-ret.left,h:ret.bottom-ret.top};if(_1("ie")){var _22=_5.getIeDocumentElementOffset();ret.x-=_22.x+(_1("quirks")?db.clientLeft+db.offsetLeft:0);ret.y-=_22.y+(_1("quirks")?db.clientTop+db.offsetTop:0);}else{if(_1("ff")==3){var cs=_4.getComputedStyle(dh),px=_4.toPixelValue;ret.x-=px(dh,cs.marginLeft)+px(dh,cs.borderLeftWidth);ret.y-=px(dh,cs.marginTop)+px(dh,cs.borderTopWidth);}}if(_21){var _23=_5.docScroll();ret.x+=_23.x;ret.y+=_23.y;}return ret;};_5.getMarginSize=function getMarginSize(_24,_25){_24=_3.byId(_24);var me=_5.getMarginExtents(_24,_25||_4.getComputedStyle(_24));var _26=_24.getBoundingClientRect();return {w:(_26.right-_26.left)+me.w,h:(_26.bottom-_26.top)+me.h};};_5.normalizeEvent=function(_27){if(!("layerX" in _27)){_27.layerX=_27.offsetX;_27.layerY=_27.offsetY;}if(!_1("dom-addeventlistener")){var se=_27.target;var doc=(se&&se.ownerDocument)||document;var _28=_1("quirks")?doc.body:doc.documentElement;var _29=_5.getIeDocumentElementOffset();_27.pageX=_27.clientX+_5.fixIeBiDiScrollLeft(_28.scrollLeft||0)-_29.x;_27.pageY=_27.clientY+(_28.scrollTop||0)-_29.y;}};return _5;}); \ No newline at end of file
diff --git a/lib/dojo/dom-geometry.js.uncompressed.js b/lib/dojo/dom-geometry.js.uncompressed.js
new file mode 100644
index 000000000..0e3234a9e
--- /dev/null
+++ b/lib/dojo/dom-geometry.js.uncompressed.js
@@ -0,0 +1,751 @@
+define("dojo/dom-geometry", ["./_base/sniff", "./_base/window","./dom", "./dom-style"],
+ function(has, win, dom, style){
+ // module:
+ // dojo/dom-geometry
+ // summary:
+ // This module defines the core dojo DOM geometry API.
+
+ var geom = {}; // the result object
+
+ // Box functions will assume this model.
+ // On IE/Opera, BORDER_BOX will be set if the primary document is in quirks mode.
+ // Can be set to change behavior of box setters.
+
+ // can be either:
+ // "border-box"
+ // "content-box" (default)
+ geom.boxModel = "content-box";
+
+ // We punt per-node box mode testing completely.
+ // If anybody cares, we can provide an additional (optional) unit
+ // that overrides existing code to include per-node box sensitivity.
+
+ // Opera documentation claims that Opera 9 uses border-box in BackCompat mode.
+ // but experiments (Opera 9.10.8679 on Windows Vista) indicate that it actually continues to use content-box.
+ // IIRC, earlier versions of Opera did in fact use border-box.
+ // Opera guys, this is really confusing. Opera being broken in quirks mode is not our fault.
+
+ if(has("ie") /*|| has("opera")*/){
+ // client code may have to adjust if compatMode varies across iframes
+ geom.boxModel = document.compatMode == "BackCompat" ? "border-box" : "content-box";
+ }
+
+ // =============================
+ // Box Functions
+ // =============================
+
+ /*=====
+ dojo.getPadExtents = function(node, computedStyle){
+ // summary:
+ // Returns object with special values specifically useful for node
+ // fitting.
+ // description:
+ // Returns an object with `w`, `h`, `l`, `t` properties:
+ // | l/t/r/b = left/top/right/bottom padding (respectively)
+ // | w = the total of the left and right padding
+ // | h = the total of the top and bottom padding
+ // If 'node' has position, l/t forms the origin for child nodes.
+ // The w/h are used for calculating boxes.
+ // Normally application code will not need to invoke this
+ // directly, and will use the ...box... functions instead.
+ // node: DOMNode
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+
+
+ };
+ =====*/
+
+ /*=====
+ dojo._getPadExtents = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getPadExtents`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getBorderExtents = function(node, computedStyle){
+ // summary:
+ // returns an object with properties useful for noting the border
+ // dimensions.
+ // description:
+ // * l/t/r/b = the sum of left/top/right/bottom border (respectively)
+ // * w = the sum of the left and right border
+ // * h = the sum of the top and bottom border
+ //
+ // The w/h are used for calculating boxes.
+ // Normally application code will not need to invoke this
+ // directly, and will use the ...box... functions instead.
+ // node: DOMNode
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+
+
+ };
+ =====*/
+
+ /*=====
+ dojo._getBorderExtents = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getBorderExtents`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getPadBorderExtents = function(node, computedStyle){
+ // summary:
+ // Returns object with properties useful for box fitting with
+ // regards to padding.
+ // description:
+ // * l/t/r/b = the sum of left/top/right/bottom padding and left/top/right/bottom border (respectively)
+ // * w = the sum of the left and right padding and border
+ // * h = the sum of the top and bottom padding and border
+ //
+ // The w/h are used for calculating boxes.
+ // Normally application code will not need to invoke this
+ // directly, and will use the ...box... functions instead.
+ // node: DOMNode
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+
+
+ };
+ =====*/
+
+ /*=====
+ dojo._getPadBorderExtents = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getPadBorderExtents`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getMarginExtents = function(node, computedStyle){
+ // summary:
+ // returns object with properties useful for box fitting with
+ // regards to box margins (i.e., the outer-box).
+ //
+ // * l/t = marginLeft, marginTop, respectively
+ // * w = total width, margin inclusive
+ // * h = total height, margin inclusive
+ //
+ // The w/h are used for calculating boxes.
+ // Normally application code will not need to invoke this
+ // directly, and will use the ...box... functions instead.
+ // node: DOMNode
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+ };
+ =====*/
+
+ /*=====
+ dojo._getMarginExtents = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getMarginExtents`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getMarginSize = function(node, computedStyle){
+ // summary:
+ // returns an object that encodes the width and height of
+ // the node's margin box
+ // node: DOMNode|String
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+ };
+ =====*/
+
+ /*=====
+ dojo._getMarginSize = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getMarginSize`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getMarginBox = function(node, computedStyle){
+ // summary:
+ // returns an object that encodes the width, height, left and top
+ // positions of the node's margin box.
+ // node: DOMNode
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+ };
+ =====*/
+
+ /*=====
+ dojo._getMarginBox = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getMarginBox`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.setMarginBox = function(node, box, computedStyle){
+ // summary:
+ // sets the size of the node's margin box and placement
+ // (left/top), irrespective of box model. Think of it as a
+ // passthrough to setBox that handles box-model vagaries for
+ // you.
+ // node: DOMNode
+ // box: Object
+ // hash with optional "l", "t", "w", and "h" properties for "left", "right", "width", and "height"
+ // respectively. All specified properties should have numeric values in whole pixels.
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+ };
+ =====*/
+
+ /*=====
+ dojo.getContentBox = function(node, computedStyle){
+ // summary:
+ // Returns an object that encodes the width, height, left and top
+ // positions of the node's content box, irrespective of the
+ // current box model.
+ // node: DOMNode
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+ };
+ =====*/
+
+ /*=====
+ dojo._getContentBox = function(node, computedStyle){
+ // summary:
+ // Existing alias for `dojo.getContentBox`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.setContentSize = function(node, box, computedStyle){
+ // summary:
+ // Sets the size of the node's contents, irrespective of margins,
+ // padding, or borders.
+ // node: DOMNode
+ // box: Object
+ // hash with optional "w", and "h" properties for "width", and "height"
+ // respectively. All specified properties should have numeric values in whole pixels.
+ // computedStyle: Object?
+ // This parameter accepts computed styles object.
+ // If this parameter is omitted, the functions will call
+ // dojo.getComputedStyle to get one. It is a better way, calling
+ // dojo.computedStyle once, and then pass the reference to this
+ // computedStyle parameter. Wherever possible, reuse the returned
+ // object of dojo.getComputedStyle.
+ };
+ =====*/
+
+ /*=====
+ dojo.isBodyLtr = function(){
+ // summary:
+ // Returns true if the current language is left-to-right, and false otherwise.
+ // returns: Boolean
+ };
+ =====*/
+
+ /*=====
+ dojo._isBodyLtr = function(){
+ // summary:
+ // Existing alias for `dojo.isBodyLtr`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.docScroll = function(){
+ // summary:
+ // Returns an object with {node, x, y} with corresponding offsets.
+ // returns: Object
+ };
+ =====*/
+
+ /*=====
+ dojo._docScroll = function(){
+ // summary:
+ // Existing alias for `dojo.docScroll`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getIeDocumentElementOffset = function(){
+ // summary:
+ // returns the offset in x and y from the document body to the
+ // visual edge of the page for IE
+ // description:
+ // The following values in IE contain an offset:
+ // | event.clientX
+ // | event.clientY
+ // | node.getBoundingClientRect().left
+ // | node.getBoundingClientRect().top
+ // But other position related values do not contain this offset,
+ // such as node.offsetLeft, node.offsetTop, node.style.left and
+ // node.style.top. The offset is always (2, 2) in LTR direction.
+ // When the body is in RTL direction, the offset counts the width
+ // of left scroll bar's width. This function computes the actual
+ // offset.
+ };
+ =====*/
+
+ /*=====
+ dojo._getIeDocumentElementOffset = function(){
+ // summary:
+ // Existing alias for `dojo.getIeDocumentElementOffset`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.fixIeBiDiScrollLeft = function(scrollLeft){
+ // summary:
+ // In RTL direction, scrollLeft should be a negative value, but IE
+ // returns a positive one. All codes using documentElement.scrollLeft
+ // must call this function to fix this error, otherwise the position
+ // will offset to right when there is a horizontal scrollbar.
+ // scrollLeft: NUmber
+ // returns: Number
+ };
+ =====*/
+
+ /*=====
+ dojo._fixIeBiDiScrollLeft = function(scrollLeft){
+ // summary:
+ // Existing alias for `dojo.fixIeBiDiScrollLeft`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.position = function(node, includeScroll){
+ // summary:
+ // Gets the position and size of the passed element relative to
+ // the viewport (if includeScroll==false), or relative to the
+ // document root (if includeScroll==true).
+ //
+ // description:
+ // Returns an object of the form:
+ // { x: 100, y: 300, w: 20, h: 15 }
+ // If includeScroll==true, the x and y values will include any
+ // document offsets that may affect the position relative to the
+ // viewport.
+ // Uses the border-box model (inclusive of border and padding but
+ // not margin). Does not act as a setter.
+ // node: DOMNode|String
+ // includeScroll: Boolean?
+ // returns: Object
+ };
+ =====*/
+
+ geom.getPadExtents = function getPadExtents(/*DomNode*/node, /*Object*/computedStyle){
+ node = dom.byId(node);
+ var s = computedStyle || style.getComputedStyle(node), px = style.toPixelValue,
+ l = px(node, s.paddingLeft), t = px(node, s.paddingTop), r = px(node, s.paddingRight), b = px(node, s.paddingBottom);
+ return {l: l, t: t, r: r, b: b, w: l + r, h: t + b};
+ };
+
+ var none = "none";
+
+ geom.getBorderExtents = function getBorderExtents(/*DomNode*/node, /*Object*/computedStyle){
+ node = dom.byId(node);
+ var px = style.toPixelValue, s = computedStyle || style.getComputedStyle(node),
+ l = s.borderLeftStyle != none ? px(node, s.borderLeftWidth) : 0,
+ t = s.borderTopStyle != none ? px(node, s.borderTopWidth) : 0,
+ r = s.borderRightStyle != none ? px(node, s.borderRightWidth) : 0,
+ b = s.borderBottomStyle != none ? px(node, s.borderBottomWidth) : 0;
+ return {l: l, t: t, r: r, b: b, w: l + r, h: t + b};
+ };
+
+ geom.getPadBorderExtents = function getPadBorderExtents(/*DomNode*/node, /*Object*/computedStyle){
+ node = dom.byId(node);
+ var s = computedStyle || style.getComputedStyle(node),
+ p = geom.getPadExtents(node, s),
+ b = geom.getBorderExtents(node, s);
+ return {
+ l: p.l + b.l,
+ t: p.t + b.t,
+ r: p.r + b.r,
+ b: p.b + b.b,
+ w: p.w + b.w,
+ h: p.h + b.h
+ };
+ };
+
+ geom.getMarginExtents = function getMarginExtents(node, computedStyle){
+ node = dom.byId(node);
+ var s = computedStyle || style.getComputedStyle(node), px = style.toPixelValue,
+ l = px(node, s.marginLeft), t = px(node, s.marginTop), r = px(node, s.marginRight), b = px(node, s.marginBottom);
+ if(has("webkit") && (s.position != "absolute")){
+ // FIXME: Safari's version of the computed right margin
+ // is the space between our right edge and the right edge
+ // of our offsetParent.
+ // What we are looking for is the actual margin value as
+ // determined by CSS.
+ // Hack solution is to assume left/right margins are the same.
+ r = l;
+ }
+ return {l: l, t: t, r: r, b: b, w: l + r, h: t + b};
+ };
+
+ // Box getters work in any box context because offsetWidth/clientWidth
+ // are invariant wrt box context
+ //
+ // They do *not* work for display: inline objects that have padding styles
+ // because the user agent ignores padding (it's bogus styling in any case)
+ //
+ // Be careful with IMGs because they are inline or block depending on
+ // browser and browser mode.
+
+ // Although it would be easier to read, there are not separate versions of
+ // _getMarginBox for each browser because:
+ // 1. the branching is not expensive
+ // 2. factoring the shared code wastes cycles (function call overhead)
+ // 3. duplicating the shared code wastes bytes
+
+ geom.getMarginBox = function getMarginBox(/*DomNode*/node, /*Object*/computedStyle){
+ // summary:
+ // returns an object that encodes the width, height, left and top
+ // positions of the node's margin box.
+ node = dom.byId(node);
+ var s = computedStyle || style.getComputedStyle(node), me = geom.getMarginExtents(node, s),
+ l = node.offsetLeft - me.l, t = node.offsetTop - me.t, p = node.parentNode, px = style.toPixelValue, pcs;
+ if(has("mozilla")){
+ // Mozilla:
+ // If offsetParent has a computed overflow != visible, the offsetLeft is decreased
+ // by the parent's border.
+ // We don't want to compute the parent's style, so instead we examine node's
+ // computed left/top which is more stable.
+ var sl = parseFloat(s.left), st = parseFloat(s.top);
+ if(!isNaN(sl) && !isNaN(st)){
+ l = sl, t = st;
+ }else{
+ // If child's computed left/top are not parseable as a number (e.g. "auto"), we
+ // have no choice but to examine the parent's computed style.
+ if(p && p.style){
+ pcs = style.getComputedStyle(p);
+ if(pcs.overflow != "visible"){
+ l += pcs.borderLeftStyle != none ? px(node, pcs.borderLeftWidth) : 0;
+ t += pcs.borderTopStyle != none ? px(node, pcs.borderTopWidth) : 0;
+ }
+ }
+ }
+ }else if(has("opera") || (has("ie") == 8 && !has("quirks"))){
+ // On Opera and IE 8, offsetLeft/Top includes the parent's border
+ if(p){
+ pcs = style.getComputedStyle(p);
+ l -= pcs.borderLeftStyle != none ? px(node, pcs.borderLeftWidth) : 0;
+ t -= pcs.borderTopStyle != none ? px(node, pcs.borderTopWidth) : 0;
+ }
+ }
+ return {l: l, t: t, w: node.offsetWidth + me.w, h: node.offsetHeight + me.h};
+ };
+
+ geom.getContentBox = function getContentBox(node, computedStyle){
+ // clientWidth/Height are important since the automatically account for scrollbars
+ // fallback to offsetWidth/Height for special cases (see #3378)
+ node = dom.byId(node);
+ var s = computedStyle || style.getComputedStyle(node), w = node.clientWidth, h,
+ pe = geom.getPadExtents(node, s), be = geom.getBorderExtents(node, s);
+ if(!w){
+ w = node.offsetWidth;
+ h = node.offsetHeight;
+ }else{
+ h = node.clientHeight;
+ be.w = be.h = 0;
+ }
+ // On Opera, offsetLeft includes the parent's border
+ if(has("opera")){
+ pe.l += be.l;
+ pe.t += be.t;
+ }
+ return {l: pe.l, t: pe.t, w: w - pe.w - be.w, h: h - pe.h - be.h};
+ };
+
+ // Box setters depend on box context because interpretation of width/height styles
+ // vary wrt box context.
+ //
+ // The value of dojo.boxModel is used to determine box context.
+ // dojo.boxModel can be set directly to change behavior.
+ //
+ // Beware of display: inline objects that have padding styles
+ // because the user agent ignores padding (it's a bogus setup anyway)
+ //
+ // Be careful with IMGs because they are inline or block depending on
+ // browser and browser mode.
+ //
+ // Elements other than DIV may have special quirks, like built-in
+ // margins or padding, or values not detectable via computedStyle.
+ // In particular, margins on TABLE do not seems to appear
+ // at all in computedStyle on Mozilla.
+
+ function setBox(/*DomNode*/node, /*Number?*/l, /*Number?*/t, /*Number?*/w, /*Number?*/h, /*String?*/u){
+ // summary:
+ // sets width/height/left/top in the current (native) box-model
+ // dimensions. Uses the unit passed in u.
+ // node:
+ // DOM Node reference. Id string not supported for performance
+ // reasons.
+ // l:
+ // left offset from parent.
+ // t:
+ // top offset from parent.
+ // w:
+ // width in current box model.
+ // h:
+ // width in current box model.
+ // u:
+ // unit measure to use for other measures. Defaults to "px".
+ u = u || "px";
+ var s = node.style;
+ if(!isNaN(l)){
+ s.left = l + u;
+ }
+ if(!isNaN(t)){
+ s.top = t + u;
+ }
+ if(w >= 0){
+ s.width = w + u;
+ }
+ if(h >= 0){
+ s.height = h + u;
+ }
+ }
+
+ function isButtonTag(/*DomNode*/node){
+ // summary:
+ // True if the node is BUTTON or INPUT.type="button".
+ return node.tagName.toLowerCase() == "button" ||
+ node.tagName.toLowerCase() == "input" && (node.getAttribute("type") || "").toLowerCase() == "button"; // boolean
+ }
+
+ function usesBorderBox(/*DomNode*/node){
+ // summary:
+ // True if the node uses border-box layout.
+
+ // We could test the computed style of node to see if a particular box
+ // has been specified, but there are details and we choose not to bother.
+
+ // TABLE and BUTTON (and INPUT type=button) are always border-box by default.
+ // If you have assigned a different box to either one via CSS then
+ // box functions will break.
+
+ return geom.boxModel == "border-box" || node.tagName.toLowerCase() == "table" || isButtonTag(node); // boolean
+ }
+
+ geom.setContentSize = function setContentSize(/*DomNode*/node, /*Object*/box, /*Object*/computedStyle){
+ // summary:
+ // Sets the size of the node's contents, irrespective of margins,
+ // padding, or borders.
+
+ node = dom.byId(node);
+ var w = box.w, h = box.h;
+ if(usesBorderBox(node)){
+ var pb = geom.getPadBorderExtents(node, computedStyle);
+ if(w >= 0){
+ w += pb.w;
+ }
+ if(h >= 0){
+ h += pb.h;
+ }
+ }
+ setBox(node, NaN, NaN, w, h);
+ };
+
+ var nilExtents = {l: 0, t: 0, w: 0, h: 0};
+
+ geom.setMarginBox = function setMarginBox(/*DomNode*/node, /*Object*/box, /*Object*/computedStyle){
+ node = dom.byId(node);
+ var s = computedStyle || style.getComputedStyle(node), w = box.w, h = box.h,
+ // Some elements have special padding, margin, and box-model settings.
+ // To use box functions you may need to set padding, margin explicitly.
+ // Controlling box-model is harder, in a pinch you might set dojo.boxModel.
+ pb = usesBorderBox(node) ? nilExtents : geom.getPadBorderExtents(node, s),
+ mb = geom.getMarginExtents(node, s);
+ if(has("webkit")){
+ // on Safari (3.1.2), button nodes with no explicit size have a default margin
+ // setting an explicit size eliminates the margin.
+ // We have to swizzle the width to get correct margin reading.
+ if(isButtonTag(node)){
+ var ns = node.style;
+ if(w >= 0 && !ns.width){
+ ns.width = "4px";
+ }
+ if(h >= 0 && !ns.height){
+ ns.height = "4px";
+ }
+ }
+ }
+ if(w >= 0){
+ w = Math.max(w - pb.w - mb.w, 0);
+ }
+ if(h >= 0){
+ h = Math.max(h - pb.h - mb.h, 0);
+ }
+ setBox(node, box.l, box.t, w, h);
+ };
+
+ // =============================
+ // Positioning
+ // =============================
+
+ geom.isBodyLtr = function isBodyLtr(){
+ return (win.body().dir || win.doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean
+ };
+
+ geom.docScroll = function docScroll(){
+ var node = win.doc.parentWindow || win.doc.defaultView; // use UI window, not dojo.global window
+ return "pageXOffset" in node ? {x: node.pageXOffset, y: node.pageYOffset } :
+ (node = has("quirks") ? win.body() : win.doc.documentElement,
+ {x: geom.fixIeBiDiScrollLeft(node.scrollLeft || 0), y: node.scrollTop || 0 });
+ };
+
+ geom.getIeDocumentElementOffset = function getIeDocumentElementOffset(){
+ //NOTE: assumes we're being called in an IE browser
+
+ var de = win.doc.documentElement; // only deal with HTML element here, position() handles body/quirks
+
+ if(has("ie") < 8){
+ var r = de.getBoundingClientRect(), // works well for IE6+
+ l = r.left, t = r.top;
+ if(has("ie") < 7){
+ l += de.clientLeft; // scrollbar size in strict/RTL, or,
+ t += de.clientTop; // HTML border size in strict
+ }
+ return {
+ x: l < 0 ? 0 : l, // FRAME element border size can lead to inaccurate negative values
+ y: t < 0 ? 0 : t
+ };
+ }else{
+ return {
+ x: 0,
+ y: 0
+ };
+ }
+ };
+
+ geom.fixIeBiDiScrollLeft = function fixIeBiDiScrollLeft(/*Integer*/ scrollLeft){
+ // In RTL direction, scrollLeft should be a negative value, but IE
+ // returns a positive one. All codes using documentElement.scrollLeft
+ // must call this function to fix this error, otherwise the position
+ // will offset to right when there is a horizontal scrollbar.
+
+ var ie = has("ie");
+ if(ie && !geom.isBodyLtr()){
+ var qk = has("quirks"),
+ de = qk ? win.body() : win.doc.documentElement;
+ if(ie == 6 && !qk && win.global.frameElement && de.scrollHeight > de.clientHeight){
+ scrollLeft += de.clientLeft; // workaround ie6+strict+rtl+iframe+vertical-scrollbar bug where clientWidth is too small by clientLeft pixels
+ }
+ return (ie < 8 || qk) ? (scrollLeft + de.clientWidth - de.scrollWidth) : -scrollLeft; // Integer
+ }
+ return scrollLeft; // Integer
+ };
+
+ geom.position = function(/*DomNode*/node, /*Boolean?*/includeScroll){
+ node = dom.byId(node);
+ var db = win.body(),
+ dh = db.parentNode,
+ ret = node.getBoundingClientRect();
+ ret = {x: ret.left, y: ret.top, w: ret.right - ret.left, h: ret.bottom - ret.top};
+ if(has("ie")){
+ // On IE there's a 2px offset that we need to adjust for, see dojo.getIeDocumentElementOffset()
+ var offset = geom.getIeDocumentElementOffset();
+
+ // fixes the position in IE, quirks mode
+ ret.x -= offset.x + (has("quirks") ? db.clientLeft + db.offsetLeft : 0);
+ ret.y -= offset.y + (has("quirks") ? db.clientTop + db.offsetTop : 0);
+ }else if(has("ff") == 3){
+ // In FF3 you have to subtract the document element margins.
+ // Fixed in FF3.5 though.
+ var cs = style.getComputedStyle(dh), px = style.toPixelValue;
+ ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth);
+ ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth);
+ }
+ // account for document scrolling
+ // if offsetParent is used, ret value already includes scroll position
+ // so we may have to actually remove that value if !includeScroll
+ if(includeScroll){
+ var scroll = geom.docScroll();
+ ret.x += scroll.x;
+ ret.y += scroll.y;
+ }
+
+ return ret; // Object
+ };
+
+ // random "private" functions wildly used throughout the toolkit
+
+ geom.getMarginSize = function getMarginSize(/*DomNode*/node, /*Object*/computedStyle){
+ node = dom.byId(node);
+ var me = geom.getMarginExtents(node, computedStyle || style.getComputedStyle(node));
+ var size = node.getBoundingClientRect();
+ return {
+ w: (size.right - size.left) + me.w,
+ h: (size.bottom - size.top) + me.h
+ }
+ };
+
+ geom.normalizeEvent = function(event){
+ // summary:
+ // Normalizes the geometry of a DOM event, normalizing the pageX, pageY,
+ // offsetX, offsetY, layerX, and layerX properties
+ // event: Object
+ if(!("layerX" in event)){
+ event.layerX = event.offsetX;
+ event.layerY = event.offsetY;
+ }
+ if(!has("dom-addeventlistener")){
+ // old IE version
+ // FIXME: scroll position query is duped from dojo.html to
+ // avoid dependency on that entire module. Now that HTML is in
+ // Base, we should convert back to something similar there.
+ var se = event.target;
+ var doc = (se && se.ownerDocument) || document;
+ // DO NOT replace the following to use dojo.body(), in IE, document.documentElement should be used
+ // here rather than document.body
+ var docBody = has("quirks") ? doc.body : doc.documentElement;
+ var offset = geom.getIeDocumentElementOffset();
+ event.pageX = event.clientX + geom.fixIeBiDiScrollLeft(docBody.scrollLeft || 0) - offset.x;
+ event.pageY = event.clientY + (docBody.scrollTop || 0) - offset.y;
+ }
+ };
+
+ // TODO: evaluate separate getters/setters for position and sizes?
+
+ return geom;
+});
diff --git a/lib/dojo/dom-prop.js b/lib/dojo/dom-prop.js
new file mode 100644
index 000000000..5867d8fae
--- /dev/null
+++ b/lib/dojo/dom-prop.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/dom-prop",["exports","./_base/kernel","./_base/sniff","./_base/lang","./dom","./dom-style","./dom-construct","./_base/connect"],function(_1,_2,_3,_4,_5,_6,_7,_8){var _9={},_a=0,_b=_2._scopeName+"attrid";var _c={col:1,colgroup:1,table:1,tbody:1,tfoot:1,thead:1,tr:1,title:1};_1.names={"class":"className","for":"htmlFor",tabindex:"tabIndex",readonly:"readOnly",colspan:"colSpan",frameborder:"frameBorder",rowspan:"rowSpan",valuetype:"valueType"};_1.get=function getProp(_d,_e){_d=_5.byId(_d);var lc=_e.toLowerCase(),_f=_1.names[lc]||_e;return _d[_f];};_1.set=function setProp(_10,_11,_12){_10=_5.byId(_10);var l=arguments.length;if(l==2&&typeof _11!="string"){for(var x in _11){_1.set(_10,x,_11[x]);}return _10;}var lc=_11.toLowerCase(),_13=_1.names[lc]||_11;if(_13=="style"&&typeof _12!="string"){_6.style(_10,_12);return _10;}if(_13=="innerHTML"){if(_3("ie")&&_10.tagName.toLowerCase() in _c){_7.empty(_10);_10.appendChild(_7.toDom(_12,_10.ownerDocument));}else{_10[_13]=_12;}return _10;}if(_4.isFunction(_12)){var _14=_10[_b];if(!_14){_14=_a++;_10[_b]=_14;}if(!_9[_14]){_9[_14]={};}var h=_9[_14][_13];if(h){_8.disconnect(h);}else{try{delete _10[_13];}catch(e){}}if(_12){_9[_14][_13]=_8.connect(_10,_13,_12);}else{_10[_13]=null;}return _10;}_10[_13]=_12;return _10;};}); \ No newline at end of file
diff --git a/lib/dojo/dom-prop.js.uncompressed.js b/lib/dojo/dom-prop.js.uncompressed.js
new file mode 100644
index 000000000..04e690e62
--- /dev/null
+++ b/lib/dojo/dom-prop.js.uncompressed.js
@@ -0,0 +1,190 @@
+define("dojo/dom-prop", ["exports", "./_base/kernel", "./_base/sniff", "./_base/lang", "./dom", "./dom-style", "./dom-construct", "./_base/connect"],
+ function(exports, dojo, has, lang, dom, style, ctr, conn){
+ // module:
+ // dojo/dom-prop
+ // summary:
+ // This module defines the core dojo DOM properties API.
+ // Indirectly depends on dojo.empty() and dojo.toDom().
+
+ // =============================
+ // Element properties Functions
+ // =============================
+
+ /*=====
+ prop.get = function(node, name){
+ // summary:
+ // Gets a property on an HTML element.
+ // description:
+ // Handles normalized getting of properties on DOM nodes.
+ //
+ // node: DOMNode|String
+ // id or reference to the element to get the property on
+ // name: String
+ // the name of the property to get.
+ // returns:
+ // the value of the requested property or its default value
+ //
+ // example:
+ // | // get the current value of the "foo" property on a node
+ // | dojo.getProp(dojo.byId("nodeId"), "foo");
+ // | // or we can just pass the id:
+ // | dojo.getProp("nodeId", "foo");
+ };
+ =====*/
+
+ /*=====
+ prop.set = function(node, name, value){
+ // summary:
+ // Sets a property on an HTML element.
+ // description:
+ // Handles normalized setting of properties on DOM nodes.
+ //
+ // When passing functions as values, note that they will not be
+ // directly assigned to slots on the node, but rather the default
+ // behavior will be removed and the new behavior will be added
+ // using `dojo.connect()`, meaning that event handler properties
+ // will be normalized and that some caveats with regards to
+ // non-standard behaviors for onsubmit apply. Namely that you
+ // should cancel form submission using `dojo.stopEvent()` on the
+ // passed event object instead of returning a boolean value from
+ // the handler itself.
+ // node: DOMNode|String
+ // id or reference to the element to set the property on
+ // name: String|Object
+ // the name of the property to set, or a hash object to set
+ // multiple properties at once.
+ // value: String?
+ // The value to set for the property
+ // returns:
+ // the DOM node
+ //
+ // example:
+ // | // use prop() to set the tab index
+ // | dojo.setProp("nodeId", "tabIndex", 3);
+ // |
+ //
+ // example:
+ // Set multiple values at once, including event handlers:
+ // | dojo.setProp("formId", {
+ // | "foo": "bar",
+ // | "tabIndex": -1,
+ // | "method": "POST",
+ // | "onsubmit": function(e){
+ // | // stop submitting the form. Note that the IE behavior
+ // | // of returning true or false will have no effect here
+ // | // since our handler is connect()ed to the built-in
+ // | // onsubmit behavior and so we need to use
+ // | // dojo.stopEvent() to ensure that the submission
+ // | // doesn't proceed.
+ // | dojo.stopEvent(e);
+ // |
+ // | // submit the form with Ajax
+ // | dojo.xhrPost({ form: "formId" });
+ // | }
+ // | });
+ //
+ // example:
+ // Style is s special case: Only set with an object hash of styles
+ // | dojo.setProp("someNode",{
+ // | id:"bar",
+ // | style:{
+ // | width:"200px", height:"100px", color:"#000"
+ // | }
+ // | });
+ //
+ // example:
+ // Again, only set style as an object hash of styles:
+ // | var obj = { color:"#fff", backgroundColor:"#000" };
+ // | dojo.setProp("someNode", "style", obj);
+ // |
+ // | // though shorter to use `dojo.style()` in this case:
+ // | dojo.style("someNode", obj);
+ };
+ =====*/
+
+ // helper to connect events
+ var _evtHdlrMap = {}, _ctr = 0, _attrId = dojo._scopeName + "attrid";
+
+ // the next dictionary lists elements with read-only innerHTML on IE
+ var _roInnerHtml = {col: 1, colgroup: 1,
+ // frameset: 1, head: 1, html: 1, style: 1,
+ table: 1, tbody: 1, tfoot: 1, thead: 1, tr: 1, title: 1};
+
+ exports.names = {
+ // properties renamed to avoid clashes with reserved words
+ "class": "className",
+ "for": "htmlFor",
+ // properties written as camelCase
+ tabindex: "tabIndex",
+ readonly: "readOnly",
+ colspan: "colSpan",
+ frameborder: "frameBorder",
+ rowspan: "rowSpan",
+ valuetype: "valueType"
+ };
+
+ exports.get = function getProp(/*DOMNode|String*/node, /*String*/name){
+ node = dom.byId(node);
+ var lc = name.toLowerCase(), propName = exports.names[lc] || name;
+ return node[propName]; // Anything
+ };
+
+ exports.set = function setProp(/*DOMNode|String*/node, /*String|Object*/name, /*String?*/value){
+ node = dom.byId(node);
+ var l = arguments.length;
+ if(l == 2 && typeof name != "string"){ // inline'd type check
+ // the object form of setter: the 2nd argument is a dictionary
+ for(var x in name){
+ exports.set(node, x, name[x]);
+ }
+ return node; // DomNode
+ }
+ var lc = name.toLowerCase(), propName = exports.names[lc] || name;
+ if(propName == "style" && typeof value != "string"){ // inline'd type check
+ // special case: setting a style
+ style.style(node, value);
+ return node; // DomNode
+ }
+ if(propName == "innerHTML"){
+ // special case: assigning HTML
+ if(has("ie") && node.tagName.toLowerCase() in _roInnerHtml){
+ ctr.empty(node);
+ node.appendChild(ctr.toDom(value, node.ownerDocument));
+ }else{
+ node[propName] = value;
+ }
+ return node; // DomNode
+ }
+ if(lang.isFunction(value)){
+ // special case: assigning an event handler
+ // clobber if we can
+ var attrId = node[_attrId];
+ if(!attrId){
+ attrId = _ctr++;
+ node[_attrId] = attrId;
+ }
+ if(!_evtHdlrMap[attrId]){
+ _evtHdlrMap[attrId] = {};
+ }
+ var h = _evtHdlrMap[attrId][propName];
+ if(h){
+ //h.remove();
+ conn.disconnect(h);
+ }else{
+ try{
+ delete node[propName];
+ }catch(e){}
+ }
+ // ensure that event objects are normalized, etc.
+ if(value){
+ //_evtHdlrMap[attrId][propName] = on(node, propName, value);
+ _evtHdlrMap[attrId][propName] = conn.connect(node, propName, value);
+ }else{
+ node[propName] = null;
+ }
+ return node; // DomNode
+ }
+ node[propName] = value;
+ return node; // DomNode
+ };
+});
diff --git a/lib/dojo/dom-style.js b/lib/dojo/dom-style.js
new file mode 100644
index 000000000..f996e2e5c
--- /dev/null
+++ b/lib/dojo/dom-style.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/dom-style",["./_base/sniff","./dom"],function(_1,_2){var _3,_4={};if(_1("webkit")){_3=function(_5){var s;if(_5.nodeType==1){var dv=_5.ownerDocument.defaultView;s=dv.getComputedStyle(_5,null);if(!s&&_5.style){_5.style.display="";s=dv.getComputedStyle(_5,null);}}return s||{};};}else{if(_1("ie")&&(_1("ie")<9||_1("quirks"))){_3=function(_6){return _6.nodeType==1?_6.currentStyle:{};};}else{_3=function(_7){return _7.nodeType==1?_7.ownerDocument.defaultView.getComputedStyle(_7,null):{};};}}_4.getComputedStyle=_3;var _8;if(!_1("ie")){_8=function(_9,_a){return parseFloat(_a)||0;};}else{_8=function(_b,_c){if(!_c){return 0;}if(_c=="medium"){return 4;}if(_c.slice&&_c.slice(-2)=="px"){return parseFloat(_c);}var s=_b.style,rs=_b.runtimeStyle,cs=_b.currentStyle,_d=s.left,_e=rs.left;rs.left=cs.left;try{s.left=_c;_c=s.pixelLeft;}catch(e){_c=0;}s.left=_d;rs.left=_e;return _c;};}_4.toPixelValue=_8;var _f="DXImageTransform.Microsoft.Alpha";var af=function(n,f){try{return n.filters.item(_f);}catch(e){return f?{}:null;}};var _10=_1("ie")<9||(_1("ie")&&_1("quirks"))?function(_11){try{return af(_11).Opacity/100;}catch(e){return 1;}}:function(_12){return _3(_12).opacity;};var _13=_1("ie")<9||(_1("ie")&&_1("quirks"))?function(_14,_15){var ov=_15*100,_16=_15==1;_14.style.zoom=_16?"":1;if(!af(_14)){if(_16){return _15;}_14.style.filter+=" progid:"+_f+"(Opacity="+ov+")";}else{af(_14,1).Opacity=ov;}af(_14,1).Enabled=!_16;if(_14.tagName.toLowerCase()=="tr"){for(var td=_14.firstChild;td;td=td.nextSibling){if(td.tagName.toLowerCase()=="td"){_13(td,_15);}}}return _15;}:function(_17,_18){return _17.style.opacity=_18;};var _19={left:true,top:true};var _1a=/margin|padding|width|height|max|min|offset/;function _1b(_1c,_1d,_1e){_1d=_1d.toLowerCase();if(_1("ie")){if(_1e=="auto"){if(_1d=="height"){return _1c.offsetHeight;}if(_1d=="width"){return _1c.offsetWidth;}}if(_1d=="fontweight"){switch(_1e){case 700:return "bold";case 400:default:return "normal";}}}if(!(_1d in _19)){_19[_1d]=_1a.test(_1d);}return _19[_1d]?_8(_1c,_1e):_1e;};var _1f=_1("ie")?"styleFloat":"cssFloat",_20={"cssFloat":_1f,"styleFloat":_1f,"float":_1f};_4.get=function getStyle(_21,_22){var n=_2.byId(_21),l=arguments.length,op=(_22=="opacity");if(l==2&&op){return _10(n);}_22=_20[_22]||_22;var s=_4.getComputedStyle(n);return (l==1)?s:_1b(n,_22,s[_22]||n.style[_22]);};_4.set=function setStyle(_23,_24,_25){var n=_2.byId(_23),l=arguments.length,op=(_24=="opacity");_24=_20[_24]||_24;if(l==3){return op?_13(n,_25):n.style[_24]=_25;}for(var x in _24){_4.set(_23,x,_24[x]);}return _4.getComputedStyle(n);};return _4;}); \ No newline at end of file
diff --git a/lib/dojo/dom-style.js.uncompressed.js b/lib/dojo/dom-style.js.uncompressed.js
new file mode 100644
index 000000000..e6b3822c9
--- /dev/null
+++ b/lib/dojo/dom-style.js.uncompressed.js
@@ -0,0 +1,321 @@
+define("dojo/dom-style", ["./_base/sniff", "./dom"], function(has, dom){
+ // module:
+ // dojo/dom-style
+ // summary:
+ // This module defines the core dojo DOM style API.
+
+ // =============================
+ // Style Functions
+ // =============================
+
+ // getComputedStyle drives most of the style code.
+ // Wherever possible, reuse the returned object.
+ //
+ // API functions below that need to access computed styles accept an
+ // optional computedStyle parameter.
+ // If this parameter is omitted, the functions will call getComputedStyle themselves.
+ // This way, calling code can access computedStyle once, and then pass the reference to
+ // multiple API functions.
+
+ /*=====
+ dojo.getComputedStyle = function(node){
+ // summary:
+ // Returns a "computed style" object.
+ //
+ // description:
+ // Gets a "computed style" object which can be used to gather
+ // information about the current state of the rendered node.
+ //
+ // Note that this may behave differently on different browsers.
+ // Values may have different formats and value encodings across
+ // browsers.
+ //
+ // Note also that this method is expensive. Wherever possible,
+ // reuse the returned object.
+ //
+ // Use the dojo.style() method for more consistent (pixelized)
+ // return values.
+ //
+ // node: DOMNode
+ // A reference to a DOM node. Does NOT support taking an
+ // ID string for speed reasons.
+ // example:
+ // | dojo.getComputedStyle(dojo.byId('foo')).borderWidth;
+ //
+ // example:
+ // Reusing the returned object, avoiding multiple lookups:
+ // | var cs = dojo.getComputedStyle(dojo.byId("someNode"));
+ // | var w = cs.width, h = cs.height;
+ return; // CSS2Properties
+ }
+ =====*/
+
+ /*=====
+ dojo.toPixelValue = function(node, value){
+ // summary:
+ // converts style value to pixels on IE or return a numeric value.
+ // node: DOMNode
+ // value: String
+ // returns: Number
+ };
+ =====*/
+
+ /*=====
+ dojo._toPixelValue = function(node, value){
+ // summary:
+ // Existing alias for `dojo._toPixelValue`. Deprecated, will be removed in 2.0.
+ };
+ =====*/
+
+ /*=====
+ dojo.getStyle = function(node, name){
+ // summary:
+ // Accesses styles on a node.
+ // description:
+ // Getting the style value uses the computed style for the node, so the value
+ // will be a calculated value, not just the immediate node.style value.
+ // Also when getting values, use specific style names,
+ // like "borderBottomWidth" instead of "border" since compound values like
+ // "border" are not necessarily reflected as expected.
+ // If you want to get node dimensions, use `dojo.marginBox()`,
+ // `dojo.contentBox()` or `dojo.position()`.
+ // node: DOMNode|String
+ // id or reference to node to get style for
+ // name: String?
+ // the style property to get
+ // example:
+ // Passing only an ID or node returns the computed style object of
+ // the node:
+ // | dojo.getStyle("thinger");
+ // example:
+ // Passing a node and a style property returns the current
+ // normalized, computed value for that property:
+ // | dojo.getStyle("thinger", "opacity"); // 1 by default
+ };
+ =====*/
+
+ /*=====
+ dojo.setStyle = function(node, name, value){
+ // summary:
+ // Sets styles on a node.
+ // node: DOMNode|String
+ // id or reference to node to set style for
+ // name: String|Object
+ // the style property to set in DOM-accessor format
+ // ("borderWidth", not "border-width") or an object with key/value
+ // pairs suitable for setting each property.
+ // value: String?
+ // If passed, sets value on the node for style, handling
+ // cross-browser concerns. When setting a pixel value,
+ // be sure to include "px" in the value. For instance, top: "200px".
+ // Otherwise, in some cases, some browsers will not apply the style.
+ //
+ // example:
+ // Passing a node, a style property, and a value changes the
+ // current display of the node and returns the new computed value
+ // | dojo.setStyle("thinger", "opacity", 0.5); // == 0.5
+ //
+ // example:
+ // Passing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node:
+ // | dojo.setStyle("thinger", {
+ // | "opacity": 0.5,
+ // | "border": "3px solid black",
+ // | "height": "300px"
+ // | });
+ //
+ // example:
+ // When the CSS style property is hyphenated, the JavaScript property is camelCased.
+ // font-size becomes fontSize, and so on.
+ // | dojo.setStyle("thinger",{
+ // | fontSize:"14pt",
+ // | letterSpacing:"1.2em"
+ // | });
+ //
+ // example:
+ // dojo.NodeList implements .style() using the same syntax, omitting the "node" parameter, calling
+ // dojo.style() on every element of the list. See: `dojo.query()` and `dojo.NodeList()`
+ // | dojo.query(".someClassName").style("visibility","hidden");
+ // | // or
+ // | dojo.query("#baz > div").style({
+ // | opacity:0.75,
+ // | fontSize:"13pt"
+ // | });
+ };
+ =====*/
+
+ // Although we normally eschew argument validation at this
+ // level, here we test argument 'node' for (duck)type,
+ // by testing nodeType, ecause 'document' is the 'parentNode' of 'body'
+ // it is frequently sent to this function even
+ // though it is not Element.
+ var getComputedStyle, style = {};
+ if(has("webkit")){
+ getComputedStyle = function(/*DomNode*/node){
+ var s;
+ if(node.nodeType == 1){
+ var dv = node.ownerDocument.defaultView;
+ s = dv.getComputedStyle(node, null);
+ if(!s && node.style){
+ node.style.display = "";
+ s = dv.getComputedStyle(node, null);
+ }
+ }
+ return s || {};
+ };
+ }else if(has("ie") && (has("ie") < 9 || has("quirks"))){
+ getComputedStyle = function(node){
+ // IE (as of 7) doesn't expose Element like sane browsers
+ return node.nodeType == 1 /* ELEMENT_NODE*/ ? node.currentStyle : {};
+ };
+ }else{
+ getComputedStyle = function(node){
+ return node.nodeType == 1 ?
+ node.ownerDocument.defaultView.getComputedStyle(node, null) : {};
+ };
+ }
+ style.getComputedStyle = getComputedStyle;
+
+ var toPixel;
+ if(!has("ie")){
+ toPixel = function(element, value){
+ // style values can be floats, client code may want
+ // to round for integer pixels.
+ return parseFloat(value) || 0;
+ };
+ }else{
+ toPixel = function(element, avalue){
+ if(!avalue){ return 0; }
+ // on IE7, medium is usually 4 pixels
+ if(avalue == "medium"){ return 4; }
+ // style values can be floats, client code may
+ // want to round this value for integer pixels.
+ if(avalue.slice && avalue.slice(-2) == 'px'){ return parseFloat(avalue); }
+ var s = element.style, rs = element.runtimeStyle, cs = element.currentStyle,
+ sLeft = s.left, rsLeft = rs.left;
+ rs.left = cs.left;
+ try{
+ // 'avalue' may be incompatible with style.left, which can cause IE to throw
+ // this has been observed for border widths using "thin", "medium", "thick" constants
+ // those particular constants could be trapped by a lookup
+ // but perhaps there are more
+ s.left = avalue;
+ avalue = s.pixelLeft;
+ }catch(e){
+ avalue = 0;
+ }
+ s.left = sLeft;
+ rs.left = rsLeft;
+ return avalue;
+ }
+ }
+ style.toPixelValue = toPixel;
+
+ // FIXME: there opacity quirks on FF that we haven't ported over. Hrm.
+
+ var astr = "DXImageTransform.Microsoft.Alpha";
+ var af = function(n, f){
+ try{
+ return n.filters.item(astr);
+ }catch(e){
+ return f ? {} : null;
+ }
+ };
+
+ var _getOpacity =
+ has("ie") < 9 || (has("ie") && has("quirks")) ? function(node){
+ try{
+ return af(node).Opacity / 100; // Number
+ }catch(e){
+ return 1; // Number
+ }
+ } :
+ function(node){
+ return getComputedStyle(node).opacity;
+ };
+
+ var _setOpacity =
+ has("ie") < 9 || (has("ie") && has("quirks")) ? function(/*DomNode*/node, /*Number*/opacity){
+ var ov = opacity * 100, opaque = opacity == 1;
+ node.style.zoom = opaque ? "" : 1;
+
+ if(!af(node)){
+ if(opaque){
+ return opacity;
+ }
+ node.style.filter += " progid:" + astr + "(Opacity=" + ov + ")";
+ }else{
+ af(node, 1).Opacity = ov;
+ }
+
+ // on IE7 Alpha(Filter opacity=100) makes text look fuzzy so disable it altogether (bug #2661),
+ //but still update the opacity value so we can get a correct reading if it is read later.
+ af(node, 1).Enabled = !opaque;
+
+ if(node.tagName.toLowerCase() == "tr"){
+ for(var td = node.firstChild; td; td = td.nextSibling){
+ if(td.tagName.toLowerCase() == "td"){
+ _setOpacity(td, opacity);
+ }
+ }
+ }
+ return opacity;
+ } :
+ function(node, opacity){
+ return node.style.opacity = opacity;
+ };
+
+ var _pixelNamesCache = {
+ left: true, top: true
+ };
+ var _pixelRegExp = /margin|padding|width|height|max|min|offset/; // |border
+ function _toStyleValue(node, type, value){
+ //TODO: should we really be doing string case conversion here? Should we cache it? Need to profile!
+ type = type.toLowerCase();
+ if(has("ie")){
+ if(value == "auto"){
+ if(type == "height"){ return node.offsetHeight; }
+ if(type == "width"){ return node.offsetWidth; }
+ }
+ if(type == "fontweight"){
+ switch(value){
+ case 700: return "bold";
+ case 400:
+ default: return "normal";
+ }
+ }
+ }
+ if(!(type in _pixelNamesCache)){
+ _pixelNamesCache[type] = _pixelRegExp.test(type);
+ }
+ return _pixelNamesCache[type] ? toPixel(node, value) : value;
+ }
+
+ var _floatStyle = has("ie") ? "styleFloat" : "cssFloat",
+ _floatAliases = {"cssFloat": _floatStyle, "styleFloat": _floatStyle, "float": _floatStyle};
+
+ // public API
+
+ style.get = function getStyle(/*DOMNode|String*/ node, /*String?*/ name){
+ var n = dom.byId(node), l = arguments.length, op = (name == "opacity");
+ if(l == 2 && op){
+ return _getOpacity(n);
+ }
+ name = _floatAliases[name] || name;
+ var s = style.getComputedStyle(n);
+ return (l == 1) ? s : _toStyleValue(n, name, s[name] || n.style[name]); /* CSS2Properties||String||Number */
+ };
+
+ style.set = function setStyle(/*DOMNode|String*/ node, /*String|Object*/ name, /*String?*/ value){
+ var n = dom.byId(node), l = arguments.length, op = (name == "opacity");
+ name = _floatAliases[name] || name;
+ if(l == 3){
+ return op ? _setOpacity(n, value) : n.style[name] = value; // Number
+ }
+ for(var x in name){
+ style.set(node, x, name[x]);
+ }
+ return style.getComputedStyle(n);
+ };
+
+ return style;
+});
diff --git a/lib/dojo/dom.js b/lib/dojo/dom.js
new file mode 100644
index 000000000..7a2bd6bd1
--- /dev/null
+++ b/lib/dojo/dom.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/dom",["./_base/sniff","./_base/lang","./_base/window"],function(_1,_2,_3){try{document.execCommand("BackgroundImageCache",false,true);}catch(e){}var _4={};if(_1("ie")){_4.byId=function(id,_5){if(typeof id!="string"){return id;}var _6=_5||_3.doc,te=id&&_6.getElementById(id);if(te&&(te.attributes.id.value==id||te.id==id)){return te;}else{var _7=_6.all[id];if(!_7||_7.nodeName){_7=[_7];}var i=0;while((te=_7[i++])){if((te.attributes&&te.attributes.id&&te.attributes.id.value==id)||te.id==id){return te;}}}};}else{_4.byId=function(id,_8){return ((typeof id=="string")?(_8||_3.doc).getElementById(id):id)||null;};}_4.isDescendant=function(_9,_a){try{_9=_4.byId(_9);_a=_4.byId(_a);while(_9){if(_9==_a){return true;}_9=_9.parentNode;}}catch(e){}return false;};_4.setSelectable=function(_b,_c){_b=_4.byId(_b);if(_1("mozilla")){_b.style.MozUserSelect=_c?"":"none";}else{if(_1("khtml")||_1("webkit")){_b.style.KhtmlUserSelect=_c?"auto":"none";}else{if(_1("ie")){var v=(_b.unselectable=_c?"":"on"),cs=_b.getElementsByTagName("*"),i=0,l=cs.length;for(;i<l;++i){cs.item(i).unselectable=v;}}}}};return _4;}); \ No newline at end of file
diff --git a/lib/dojo/dom.js.uncompressed.js b/lib/dojo/dom.js.uncompressed.js
new file mode 100644
index 000000000..00bb8e757
--- /dev/null
+++ b/lib/dojo/dom.js.uncompressed.js
@@ -0,0 +1,156 @@
+define("dojo/dom", ["./_base/sniff", "./_base/lang", "./_base/window"],
+ function(has, lang, win){
+ // module:
+ // dojo/dom
+ // summary:
+ // This module defines the core dojo DOM API.
+
+ // FIXME: need to add unit tests for all the semi-public methods
+
+ try{
+ document.execCommand("BackgroundImageCache", false, true);
+ }catch(e){
+ // sane browsers don't have cache "issues"
+ }
+
+ // =============================
+ // DOM Functions
+ // =============================
+
+ /*=====
+ dojo.byId = function(id, doc){
+ // summary:
+ // Returns DOM node with matching `id` attribute or `null`
+ // if not found. If `id` is a DomNode, this function is a no-op.
+ //
+ // id: String|DOMNode
+ // A string to match an HTML id attribute or a reference to a DOM Node
+ //
+ // doc: Document?
+ // Document to work in. Defaults to the current value of
+ // dojo.doc. Can be used to retrieve
+ // node references from other documents.
+ //
+ // example:
+ // Look up a node by ID:
+ // | var n = dojo.byId("foo");
+ //
+ // example:
+ // Check if a node exists, and use it.
+ // | var n = dojo.byId("bar");
+ // | if(n){ doStuff() ... }
+ //
+ // example:
+ // Allow string or DomNode references to be passed to a custom function:
+ // | var foo = function(nodeOrId){
+ // | nodeOrId = dojo.byId(nodeOrId);
+ // | // ... more stuff
+ // | }
+ =====*/
+
+ /*=====
+ dojo.isDescendant = function(node, ancestor){
+ // summary:
+ // Returns true if node is a descendant of ancestor
+ // node: DOMNode|String
+ // string id or node reference to test
+ // ancestor: DOMNode|String
+ // string id or node reference of potential parent to test against
+ //
+ // example:
+ // Test is node id="bar" is a descendant of node id="foo"
+ // | if(dojo.isDescendant("bar", "foo")){ ... }
+ };
+ =====*/
+
+ // TODO: do we need this function in the base?
+
+ /*=====
+ dojo.setSelectable = function(node, selectable){
+ // summary:
+ // Enable or disable selection on a node
+ // node: DOMNode|String
+ // id or reference to node
+ // selectable: Boolean
+ // state to put the node in. false indicates unselectable, true
+ // allows selection.
+ // example:
+ // Make the node id="bar" unselectable
+ // | dojo.setSelectable("bar");
+ // example:
+ // Make the node id="bar" selectable
+ // | dojo.setSelectable("bar", true);
+ };
+ =====*/
+
+ var dom = {}; // the result object
+
+ if(has("ie")){
+ dom.byId = function(id, doc){
+ if(typeof id != "string"){
+ return id;
+ }
+ var _d = doc || win.doc, te = id && _d.getElementById(id);
+ // attributes.id.value is better than just id in case the
+ // user has a name=id inside a form
+ if(te && (te.attributes.id.value == id || te.id == id)){
+ return te;
+ }else{
+ var eles = _d.all[id];
+ if(!eles || eles.nodeName){
+ eles = [eles];
+ }
+ // if more than 1, choose first with the correct id
+ var i = 0;
+ while((te = eles[i++])){
+ if((te.attributes && te.attributes.id && te.attributes.id.value == id) || te.id == id){
+ return te;
+ }
+ }
+ }
+ };
+ }else{
+ dom.byId = function(id, doc){
+ // inline'd type check.
+ // be sure to return null per documentation, to match IE branch.
+ return ((typeof id == "string") ? (doc || win.doc).getElementById(id) : id) || null; // DOMNode
+ };
+ }
+ /*=====
+ };
+ =====*/
+
+ dom.isDescendant = function(/*DOMNode|String*/node, /*DOMNode|String*/ancestor){
+ try{
+ node = dom.byId(node);
+ ancestor = dom.byId(ancestor);
+ while(node){
+ if(node == ancestor){
+ return true; // Boolean
+ }
+ node = node.parentNode;
+ }
+ }catch(e){ /* squelch, return false */ }
+ return false; // Boolean
+ };
+
+ // TODO: do we need this function in the base?
+
+ dom.setSelectable = function(/*DOMNode|String*/node, /*Boolean*/selectable){
+ node = dom.byId(node);
+ if(has("mozilla")){
+ node.style.MozUserSelect = selectable ? "" : "none";
+ }else if(has("khtml") || has("webkit")){
+ node.style.KhtmlUserSelect = selectable ? "auto" : "none";
+ }else if(has("ie")){
+ var v = (node.unselectable = selectable ? "" : "on"),
+ cs = node.getElementsByTagName("*"), i = 0, l = cs.length;
+ for(; i < l; ++i){
+ cs.item(i).unselectable = v;
+ }
+ }
+ //FIXME: else? Opera?
+ };
+
+ return dom;
+});
diff --git a/lib/dojo/domReady.js b/lib/dojo/domReady.js
new file mode 100644
index 000000000..1e3dd6680
--- /dev/null
+++ b/lib/dojo/domReady.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/domReady",["./has"],function(_1){var _2=this,_3=document,_4={"loaded":1,"complete":1},_5=typeof _3.readyState!="string",_6=!!_4[_3.readyState];if(_5){_3.readyState="loading";}if(!_6){var _7=[],_8=[],_9=function(_a){_a=_a||_2.event;if(_6||(_a.type=="readystatechange"&&!_4[_3.readyState])){return;}_6=1;if(_5){_3.readyState="complete";}while(_7.length){(_7.shift())();}},on=function(_b,_c){_b.addEventListener(_c,_9,false);_7.push(function(){_b.removeEventListener(_c,_9,false);});};if(!_1("dom-addeventlistener")){on=function(_d,_e){_e="on"+_e;_d.attachEvent(_e,_9);_7.push(function(){_d.detachEvent(_e,_9);});};var _f=_3.createElement("div");try{if(_f.doScroll&&_2.frameElement===null){_8.push(function(){try{_f.doScroll("left");return 1;}catch(e){}});}}catch(e){}}on(_3,"DOMContentLoaded");on(_2,"load");if("onreadystatechange" in _3){on(_3,"readystatechange");}else{if(!_5){_8.push(function(){return _4[_3.readyState];});}}if(_8.length){var _10=function(){if(_6){return;}var i=_8.length;while(i--){if(_8[i]()){_9("poller");return;}}setTimeout(_10,30);};_10();}}function _11(_12){if(_6){_12(1);}else{_7.push(_12);}};_11.load=function(id,req,_13){_11(_13);};return _11;}); \ No newline at end of file
diff --git a/lib/dojo/domReady.js.uncompressed.js b/lib/dojo/domReady.js.uncompressed.js
new file mode 100644
index 000000000..bc0ea8b3c
--- /dev/null
+++ b/lib/dojo/domReady.js.uncompressed.js
@@ -0,0 +1,95 @@
+define("dojo/domReady", ['./has'], function(has){
+ var global = this,
+ doc = document,
+ readyStates = { 'loaded': 1, 'complete': 1 },
+ fixReadyState = typeof doc.readyState != "string",
+ ready = !!readyStates[doc.readyState];
+
+ // For FF <= 3.5
+ if(fixReadyState){ doc.readyState = "loading"; }
+
+ if(!ready){
+ var readyQ = [], tests = [],
+ detectReady = function(evt){
+ evt = evt || global.event;
+ if(ready || (evt.type == "readystatechange" && !readyStates[doc.readyState])){ return; }
+ ready = 1;
+
+ // For FF <= 3.5
+ if(fixReadyState){ doc.readyState = "complete"; }
+
+ while(readyQ.length){
+ (readyQ.shift())();
+ }
+ },
+ on = function(node, event){
+ node.addEventListener(event, detectReady, false);
+ readyQ.push(function(){ node.removeEventListener(event, detectReady, false); });
+ };
+
+ if(!has("dom-addeventlistener")){
+ on = function(node, event){
+ event = "on" + event;
+ node.attachEvent(event, detectReady);
+ readyQ.push(function(){ node.detachEvent(event, detectReady); });
+ };
+
+ var div = doc.createElement("div");
+ try{
+ if(div.doScroll && global.frameElement === null){
+ // the doScroll test is only useful if we're in the top-most frame
+ tests.push(function(){
+ // Derived with permission from Diego Perini's IEContentLoaded
+ // http://javascript.nwbox.com/IEContentLoaded/
+ try{
+ div.doScroll("left");
+ return 1;
+ }catch(e){}
+ });
+ }
+ }catch(e){}
+ }
+
+ on(doc, "DOMContentLoaded");
+ on(global, "load");
+
+ if("onreadystatechange" in doc){
+ on(doc, "readystatechange");
+ }else if(!fixReadyState){
+ // if the ready state property exists and there's
+ // no readystatechange event, poll for the state
+ // to change
+ tests.push(function(){
+ return readyStates[doc.readyState];
+ });
+ }
+
+ if(tests.length){
+ var poller = function(){
+ if(ready){ return; }
+ var i = tests.length;
+ while(i--){
+ if(tests[i]()){
+ detectReady("poller");
+ return;
+ }
+ }
+ setTimeout(poller, 30);
+ };
+ poller();
+ }
+ }
+
+ function domReady(callback){
+ if(ready){
+ callback(1);
+ }else{
+ readyQ.push(callback);
+ }
+ }
+ domReady.load = function(id, req, load){
+ domReady(load);
+ };
+
+ return domReady;
+});
diff --git a/lib/dojo/fx.js b/lib/dojo/fx.js
index 60782accb..53c611e2e 100644
--- a/lib/dojo/fx.js
+++ b/lib/dojo/fx.js
@@ -4,403 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.fx"] = true;
-dojo.provide("dojo.fx");
-dojo.require("dojo.fx.Toggler");
-
-
-/*=====
-dojo.fx = {
- // summary: Effects library on top of Base animations
-};
-=====*/
-(function(){
-
- var d = dojo,
- _baseObj = {
- _fire: function(evt, args){
- if(this[evt]){
- this[evt].apply(this, args||[]);
- }
- return this;
- }
- };
-
- var _chain = function(animations){
- this._index = -1;
- this._animations = animations||[];
- this._current = this._onAnimateCtx = this._onEndCtx = null;
-
- this.duration = 0;
- d.forEach(this._animations, function(a){
- this.duration += a.duration;
- if(a.delay){ this.duration += a.delay; }
- }, this);
- };
- d.extend(_chain, {
- _onAnimate: function(){
- this._fire("onAnimate", arguments);
- },
- _onEnd: function(){
- d.disconnect(this._onAnimateCtx);
- d.disconnect(this._onEndCtx);
- this._onAnimateCtx = this._onEndCtx = null;
- if(this._index + 1 == this._animations.length){
- this._fire("onEnd");
- }else{
- // switch animations
- this._current = this._animations[++this._index];
- this._onAnimateCtx = d.connect(this._current, "onAnimate", this, "_onAnimate");
- this._onEndCtx = d.connect(this._current, "onEnd", this, "_onEnd");
- this._current.play(0, true);
- }
- },
- play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
- if(!this._current){ this._current = this._animations[this._index = 0]; }
- if(!gotoStart && this._current.status() == "playing"){ return this; }
- var beforeBegin = d.connect(this._current, "beforeBegin", this, function(){
- this._fire("beforeBegin");
- }),
- onBegin = d.connect(this._current, "onBegin", this, function(arg){
- this._fire("onBegin", arguments);
- }),
- onPlay = d.connect(this._current, "onPlay", this, function(arg){
- this._fire("onPlay", arguments);
- d.disconnect(beforeBegin);
- d.disconnect(onBegin);
- d.disconnect(onPlay);
- });
- if(this._onAnimateCtx){
- d.disconnect(this._onAnimateCtx);
- }
- this._onAnimateCtx = d.connect(this._current, "onAnimate", this, "_onAnimate");
- if(this._onEndCtx){
- d.disconnect(this._onEndCtx);
- }
- this._onEndCtx = d.connect(this._current, "onEnd", this, "_onEnd");
- this._current.play.apply(this._current, arguments);
- return this;
- },
- pause: function(){
- if(this._current){
- var e = d.connect(this._current, "onPause", this, function(arg){
- this._fire("onPause", arguments);
- d.disconnect(e);
- });
- this._current.pause();
- }
- return this;
- },
- gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){
- this.pause();
- var offset = this.duration * percent;
- this._current = null;
- d.some(this._animations, function(a){
- if(a.duration <= offset){
- this._current = a;
- return true;
- }
- offset -= a.duration;
- return false;
- });
- if(this._current){
- this._current.gotoPercent(offset / this._current.duration, andPlay);
- }
- return this;
- },
- stop: function(/*boolean?*/ gotoEnd){
- if(this._current){
- if(gotoEnd){
- for(; this._index + 1 < this._animations.length; ++this._index){
- this._animations[this._index].stop(true);
- }
- this._current = this._animations[this._index];
- }
- var e = d.connect(this._current, "onStop", this, function(arg){
- this._fire("onStop", arguments);
- d.disconnect(e);
- });
- this._current.stop();
- }
- return this;
- },
- status: function(){
- return this._current ? this._current.status() : "stopped";
- },
- destroy: function(){
- if(this._onAnimateCtx){ d.disconnect(this._onAnimateCtx); }
- if(this._onEndCtx){ d.disconnect(this._onEndCtx); }
- }
- });
- d.extend(_chain, _baseObj);
-
- dojo.fx.chain = function(/*dojo.Animation[]*/ animations){
- // summary:
- // Chain a list of `dojo.Animation`s to run in sequence
- //
- // description:
- // Return a `dojo.Animation` which will play all passed
- // `dojo.Animation` instances in sequence, firing its own
- // synthesized events simulating a single animation. (eg:
- // onEnd of this animation means the end of the chain,
- // not the individual animations within)
- //
- // example:
- // Once `node` is faded out, fade in `otherNode`
- // | dojo.fx.chain([
- // | dojo.fadeIn({ node:node }),
- // | dojo.fadeOut({ node:otherNode })
- // | ]).play();
- //
- return new _chain(animations) // dojo.Animation
- };
-
- var _combine = function(animations){
- this._animations = animations||[];
- this._connects = [];
- this._finished = 0;
-
- this.duration = 0;
- d.forEach(animations, function(a){
- var duration = a.duration;
- if(a.delay){ duration += a.delay; }
- if(this.duration < duration){ this.duration = duration; }
- this._connects.push(d.connect(a, "onEnd", this, "_onEnd"));
- }, this);
-
- this._pseudoAnimation = new d.Animation({curve: [0, 1], duration: this.duration});
- var self = this;
- d.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop", "onEnd"],
- function(evt){
- self._connects.push(d.connect(self._pseudoAnimation, evt,
- function(){ self._fire(evt, arguments); }
- ));
- }
- );
- };
- d.extend(_combine, {
- _doAction: function(action, args){
- d.forEach(this._animations, function(a){
- a[action].apply(a, args);
- });
- return this;
- },
- _onEnd: function(){
- if(++this._finished > this._animations.length){
- this._fire("onEnd");
- }
- },
- _call: function(action, args){
- var t = this._pseudoAnimation;
- t[action].apply(t, args);
- },
- play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
- this._finished = 0;
- this._doAction("play", arguments);
- this._call("play", arguments);
- return this;
- },
- pause: function(){
- this._doAction("pause", arguments);
- this._call("pause", arguments);
- return this;
- },
- gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){
- var ms = this.duration * percent;
- d.forEach(this._animations, function(a){
- a.gotoPercent(a.duration < ms ? 1 : (ms / a.duration), andPlay);
- });
- this._call("gotoPercent", arguments);
- return this;
- },
- stop: function(/*boolean?*/ gotoEnd){
- this._doAction("stop", arguments);
- this._call("stop", arguments);
- return this;
- },
- status: function(){
- return this._pseudoAnimation.status();
- },
- destroy: function(){
- d.forEach(this._connects, dojo.disconnect);
- }
- });
- d.extend(_combine, _baseObj);
-
- dojo.fx.combine = function(/*dojo.Animation[]*/ animations){
- // summary:
- // Combine a list of `dojo.Animation`s to run in parallel
- //
- // description:
- // Combine an array of `dojo.Animation`s to run in parallel,
- // providing a new `dojo.Animation` instance encompasing each
- // animation, firing standard animation events.
- //
- // example:
- // Fade out `node` while fading in `otherNode` simultaneously
- // | dojo.fx.combine([
- // | dojo.fadeIn({ node:node }),
- // | dojo.fadeOut({ node:otherNode })
- // | ]).play();
- //
- // example:
- // When the longest animation ends, execute a function:
- // | var anim = dojo.fx.combine([
- // | dojo.fadeIn({ node: n, duration:700 }),
- // | dojo.fadeOut({ node: otherNode, duration: 300 })
- // | ]);
- // | dojo.connect(anim, "onEnd", function(){
- // | // overall animation is done.
- // | });
- // | anim.play(); // play the animation
- //
- return new _combine(animations); // dojo.Animation
- };
-
- dojo.fx.wipeIn = function(/*Object*/ args){
- // summary:
- // Expand a node to it's natural height.
- //
- // description:
- // Returns an animation that will expand the
- // node defined in 'args' object from it's current height to
- // it's natural height (with no scrollbar).
- // Node must have no margin/border/padding.
- //
- // args: Object
- // A hash-map of standard `dojo.Animation` constructor properties
- // (such as easing: node: duration: and so on)
- //
- // example:
- // | dojo.fx.wipeIn({
- // | node:"someId"
- // | }).play()
- var node = args.node = d.byId(args.node), s = node.style, o;
-
- var anim = d.animateProperty(d.mixin({
- properties: {
- height: {
- // wrapped in functions so we wait till the last second to query (in case value has changed)
- start: function(){
- // start at current [computed] height, but use 1px rather than 0
- // because 0 causes IE to display the whole panel
- o = s.overflow;
- s.overflow = "hidden";
- if(s.visibility == "hidden" || s.display == "none"){
- s.height = "1px";
- s.display = "";
- s.visibility = "";
- return 1;
- }else{
- var height = d.style(node, "height");
- return Math.max(height, 1);
- }
- },
- end: function(){
- return node.scrollHeight;
- }
- }
- }
- }, args));
-
- d.connect(anim, "onEnd", function(){
- s.height = "auto";
- s.overflow = o;
- });
-
- return anim; // dojo.Animation
- };
-
- dojo.fx.wipeOut = function(/*Object*/ args){
- // summary:
- // Shrink a node to nothing and hide it.
- //
- // description:
- // Returns an animation that will shrink node defined in "args"
- // from it's current height to 1px, and then hide it.
- //
- // args: Object
- // A hash-map of standard `dojo.Animation` constructor properties
- // (such as easing: node: duration: and so on)
- //
- // example:
- // | dojo.fx.wipeOut({ node:"someId" }).play()
-
- var node = args.node = d.byId(args.node), s = node.style, o;
-
- var anim = d.animateProperty(d.mixin({
- properties: {
- height: {
- end: 1 // 0 causes IE to display the whole panel
- }
- }
- }, args));
-
- d.connect(anim, "beforeBegin", function(){
- o = s.overflow;
- s.overflow = "hidden";
- s.display = "";
- });
- d.connect(anim, "onEnd", function(){
- s.overflow = o;
- s.height = "auto";
- s.display = "none";
- });
-
- return anim; // dojo.Animation
- };
-
- dojo.fx.slideTo = function(/*Object*/ args){
- // summary:
- // Slide a node to a new top/left position
- //
- // description:
- // Returns an animation that will slide "node"
- // defined in args Object from its current position to
- // the position defined by (args.left, args.top).
- //
- // args: Object
- // A hash-map of standard `dojo.Animation` constructor properties
- // (such as easing: node: duration: and so on). Special args members
- // are `top` and `left`, which indicate the new position to slide to.
- //
- // example:
- // | dojo.fx.slideTo({ node: node, left:"40", top:"50", units:"px" }).play()
-
- var node = args.node = d.byId(args.node),
- top = null, left = null;
-
- var init = (function(n){
- return function(){
- var cs = d.getComputedStyle(n);
- var pos = cs.position;
- top = (pos == 'absolute' ? n.offsetTop : parseInt(cs.top) || 0);
- left = (pos == 'absolute' ? n.offsetLeft : parseInt(cs.left) || 0);
- if(pos != 'absolute' && pos != 'relative'){
- var ret = d.position(n, true);
- top = ret.y;
- left = ret.x;
- n.style.position="absolute";
- n.style.top=top+"px";
- n.style.left=left+"px";
- }
- };
- })(node);
- init();
-
- var anim = d.animateProperty(d.mixin({
- properties: {
- top: args.top || 0,
- left: args.left || 0
- }
- }, args));
- d.connect(anim, "beforeBegin", anim, init);
-
- return anim; // dojo.Animation
- };
-
-})();
-
-}
+//>>built
+define("dojo/fx",["./_base/lang","./Evented","./_base/kernel","./_base/array","./_base/connect","./_base/fx","./dom","./dom-style","./dom-geometry","./ready","require"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){if(!_3.isAsync){_a(0,function(){var _c=["./fx/Toggler"];_b(_c);});}var _d=_3.fx={};var _e={_fire:function(_f,_10){if(this[_f]){this[_f].apply(this,_10||[]);}return this;}};var _11=function(_12){this._index=-1;this._animations=_12||[];this._current=this._onAnimateCtx=this._onEndCtx=null;this.duration=0;_4.forEach(this._animations,function(a){this.duration+=a.duration;if(a.delay){this.duration+=a.delay;}},this);};_11.prototype=new _2();_1.extend(_11,{_onAnimate:function(){this._fire("onAnimate",arguments);},_onEnd:function(){_5.disconnect(this._onAnimateCtx);_5.disconnect(this._onEndCtx);this._onAnimateCtx=this._onEndCtx=null;if(this._index+1==this._animations.length){this._fire("onEnd");}else{this._current=this._animations[++this._index];this._onAnimateCtx=_5.connect(this._current,"onAnimate",this,"_onAnimate");this._onEndCtx=_5.connect(this._current,"onEnd",this,"_onEnd");this._current.play(0,true);}},play:function(_13,_14){if(!this._current){this._current=this._animations[this._index=0];}if(!_14&&this._current.status()=="playing"){return this;}var _15=_5.connect(this._current,"beforeBegin",this,function(){this._fire("beforeBegin");}),_16=_5.connect(this._current,"onBegin",this,function(arg){this._fire("onBegin",arguments);}),_17=_5.connect(this._current,"onPlay",this,function(arg){this._fire("onPlay",arguments);_5.disconnect(_15);_5.disconnect(_16);_5.disconnect(_17);});if(this._onAnimateCtx){_5.disconnect(this._onAnimateCtx);}this._onAnimateCtx=_5.connect(this._current,"onAnimate",this,"_onAnimate");if(this._onEndCtx){_5.disconnect(this._onEndCtx);}this._onEndCtx=_5.connect(this._current,"onEnd",this,"_onEnd");this._current.play.apply(this._current,arguments);return this;},pause:function(){if(this._current){var e=_5.connect(this._current,"onPause",this,function(arg){this._fire("onPause",arguments);_5.disconnect(e);});this._current.pause();}return this;},gotoPercent:function(_18,_19){this.pause();var _1a=this.duration*_18;this._current=null;_4.some(this._animations,function(a){if(a.duration<=_1a){this._current=a;return true;}_1a-=a.duration;return false;});if(this._current){this._current.gotoPercent(_1a/this._current.duration,_19);}return this;},stop:function(_1b){if(this._current){if(_1b){for(;this._index+1<this._animations.length;++this._index){this._animations[this._index].stop(true);}this._current=this._animations[this._index];}var e=_5.connect(this._current,"onStop",this,function(arg){this._fire("onStop",arguments);_5.disconnect(e);});this._current.stop();}return this;},status:function(){return this._current?this._current.status():"stopped";},destroy:function(){if(this._onAnimateCtx){_5.disconnect(this._onAnimateCtx);}if(this._onEndCtx){_5.disconnect(this._onEndCtx);}}});_1.extend(_11,_e);_d.chain=function(_1c){return new _11(_1c);};var _1d=function(_1e){this._animations=_1e||[];this._connects=[];this._finished=0;this.duration=0;_4.forEach(_1e,function(a){var _1f=a.duration;if(a.delay){_1f+=a.delay;}if(this.duration<_1f){this.duration=_1f;}this._connects.push(_5.connect(a,"onEnd",this,"_onEnd"));},this);this._pseudoAnimation=new _6.Animation({curve:[0,1],duration:this.duration});var _20=this;_4.forEach(["beforeBegin","onBegin","onPlay","onAnimate","onPause","onStop","onEnd"],function(evt){_20._connects.push(_5.connect(_20._pseudoAnimation,evt,function(){_20._fire(evt,arguments);}));});};_1.extend(_1d,{_doAction:function(_21,_22){_4.forEach(this._animations,function(a){a[_21].apply(a,_22);});return this;},_onEnd:function(){if(++this._finished>this._animations.length){this._fire("onEnd");}},_call:function(_23,_24){var t=this._pseudoAnimation;t[_23].apply(t,_24);},play:function(_25,_26){this._finished=0;this._doAction("play",arguments);this._call("play",arguments);return this;},pause:function(){this._doAction("pause",arguments);this._call("pause",arguments);return this;},gotoPercent:function(_27,_28){var ms=this.duration*_27;_4.forEach(this._animations,function(a){a.gotoPercent(a.duration<ms?1:(ms/a.duration),_28);});this._call("gotoPercent",arguments);return this;},stop:function(_29){this._doAction("stop",arguments);this._call("stop",arguments);return this;},status:function(){return this._pseudoAnimation.status();},destroy:function(){_4.forEach(this._connects,_5.disconnect);}});_1.extend(_1d,_e);_d.combine=function(_2a){return new _1d(_2a);};_d.wipeIn=function(_2b){var _2c=_2b.node=_7.byId(_2b.node),s=_2c.style,o;var _2d=_6.animateProperty(_1.mixin({properties:{height:{start:function(){o=s.overflow;s.overflow="hidden";if(s.visibility=="hidden"||s.display=="none"){s.height="1px";s.display="";s.visibility="";return 1;}else{var _2e=_8.get(_2c,"height");return Math.max(_2e,1);}},end:function(){return _2c.scrollHeight;}}}},_2b));var _2f=function(){s.height="auto";s.overflow=o;};_5.connect(_2d,"onStop",_2f);_5.connect(_2d,"onEnd",_2f);return _2d;};_d.wipeOut=function(_30){var _31=_30.node=_7.byId(_30.node),s=_31.style,o;var _32=_6.animateProperty(_1.mixin({properties:{height:{end:1}}},_30));_5.connect(_32,"beforeBegin",function(){o=s.overflow;s.overflow="hidden";s.display="";});var _33=function(){s.overflow=o;s.height="auto";s.display="none";};_5.connect(_32,"onStop",_33);_5.connect(_32,"onEnd",_33);return _32;};_d.slideTo=function(_34){var _35=_34.node=_7.byId(_34.node),top=null,_36=null;var _37=(function(n){return function(){var cs=_8.getComputedStyle(n);var pos=cs.position;top=(pos=="absolute"?n.offsetTop:parseInt(cs.top)||0);_36=(pos=="absolute"?n.offsetLeft:parseInt(cs.left)||0);if(pos!="absolute"&&pos!="relative"){var ret=_9.position(n,true);top=ret.y;_36=ret.x;n.style.position="absolute";n.style.top=top+"px";n.style.left=_36+"px";}};})(_35);_37();var _38=_6.animateProperty(_1.mixin({properties:{top:_34.top||0,left:_34.left||0}},_34));_5.connect(_38,"beforeBegin",_38,_37);return _38;};return _d;}); \ No newline at end of file
diff --git a/lib/dojo/fx.js.uncompressed.js b/lib/dojo/fx.js.uncompressed.js
new file mode 100644
index 000000000..7853e3ec4
--- /dev/null
+++ b/lib/dojo/fx.js.uncompressed.js
@@ -0,0 +1,426 @@
+define("dojo/fx", [
+ "./_base/lang",
+ "./Evented",
+ "./_base/kernel",
+ "./_base/array",
+ "./_base/connect",
+ "./_base/fx",
+ "./dom",
+ "./dom-style",
+ "./dom-geometry",
+ "./ready",
+ "require" // for context sensitive loading of Toggler
+], function(lang, Evented, dojo, arrayUtil, connect, baseFx, dom, domStyle, geom, ready, require) {
+
+ // module:
+ // dojo/fx
+ // summary:
+ // TODOC
+
+
+ /*=====
+ dojo.fx = {
+ // summary: Effects library on top of Base animations
+ };
+ var coreFx = dojo.fx;
+ =====*/
+
+// For back-compat, remove in 2.0.
+if(!dojo.isAsync){
+ ready(0, function(){
+ var requires = ["./fx/Toggler"];
+ require(requires); // use indirection so modules not rolled into a build
+ });
+}
+
+ var coreFx = dojo.fx = {};
+
+ var _baseObj = {
+ _fire: function(evt, args){
+ if(this[evt]){
+ this[evt].apply(this, args||[]);
+ }
+ return this;
+ }
+ };
+
+ var _chain = function(animations){
+ this._index = -1;
+ this._animations = animations||[];
+ this._current = this._onAnimateCtx = this._onEndCtx = null;
+
+ this.duration = 0;
+ arrayUtil.forEach(this._animations, function(a){
+ this.duration += a.duration;
+ if(a.delay){ this.duration += a.delay; }
+ }, this);
+ };
+ _chain.prototype = new Evented();
+ lang.extend(_chain, {
+ _onAnimate: function(){
+ this._fire("onAnimate", arguments);
+ },
+ _onEnd: function(){
+ connect.disconnect(this._onAnimateCtx);
+ connect.disconnect(this._onEndCtx);
+ this._onAnimateCtx = this._onEndCtx = null;
+ if(this._index + 1 == this._animations.length){
+ this._fire("onEnd");
+ }else{
+ // switch animations
+ this._current = this._animations[++this._index];
+ this._onAnimateCtx = connect.connect(this._current, "onAnimate", this, "_onAnimate");
+ this._onEndCtx = connect.connect(this._current, "onEnd", this, "_onEnd");
+ this._current.play(0, true);
+ }
+ },
+ play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
+ if(!this._current){ this._current = this._animations[this._index = 0]; }
+ if(!gotoStart && this._current.status() == "playing"){ return this; }
+ var beforeBegin = connect.connect(this._current, "beforeBegin", this, function(){
+ this._fire("beforeBegin");
+ }),
+ onBegin = connect.connect(this._current, "onBegin", this, function(arg){
+ this._fire("onBegin", arguments);
+ }),
+ onPlay = connect.connect(this._current, "onPlay", this, function(arg){
+ this._fire("onPlay", arguments);
+ connect.disconnect(beforeBegin);
+ connect.disconnect(onBegin);
+ connect.disconnect(onPlay);
+ });
+ if(this._onAnimateCtx){
+ connect.disconnect(this._onAnimateCtx);
+ }
+ this._onAnimateCtx = connect.connect(this._current, "onAnimate", this, "_onAnimate");
+ if(this._onEndCtx){
+ connect.disconnect(this._onEndCtx);
+ }
+ this._onEndCtx = connect.connect(this._current, "onEnd", this, "_onEnd");
+ this._current.play.apply(this._current, arguments);
+ return this;
+ },
+ pause: function(){
+ if(this._current){
+ var e = connect.connect(this._current, "onPause", this, function(arg){
+ this._fire("onPause", arguments);
+ connect.disconnect(e);
+ });
+ this._current.pause();
+ }
+ return this;
+ },
+ gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){
+ this.pause();
+ var offset = this.duration * percent;
+ this._current = null;
+ arrayUtil.some(this._animations, function(a){
+ if(a.duration <= offset){
+ this._current = a;
+ return true;
+ }
+ offset -= a.duration;
+ return false;
+ });
+ if(this._current){
+ this._current.gotoPercent(offset / this._current.duration, andPlay);
+ }
+ return this;
+ },
+ stop: function(/*boolean?*/ gotoEnd){
+ if(this._current){
+ if(gotoEnd){
+ for(; this._index + 1 < this._animations.length; ++this._index){
+ this._animations[this._index].stop(true);
+ }
+ this._current = this._animations[this._index];
+ }
+ var e = connect.connect(this._current, "onStop", this, function(arg){
+ this._fire("onStop", arguments);
+ connect.disconnect(e);
+ });
+ this._current.stop();
+ }
+ return this;
+ },
+ status: function(){
+ return this._current ? this._current.status() : "stopped";
+ },
+ destroy: function(){
+ if(this._onAnimateCtx){ connect.disconnect(this._onAnimateCtx); }
+ if(this._onEndCtx){ connect.disconnect(this._onEndCtx); }
+ }
+ });
+ lang.extend(_chain, _baseObj);
+
+ coreFx.chain = /*===== dojo.fx.chain = =====*/ function(/*dojo.Animation[]*/ animations){
+ // summary:
+ // Chain a list of `dojo.Animation`s to run in sequence
+ //
+ // description:
+ // Return a `dojo.Animation` which will play all passed
+ // `dojo.Animation` instances in sequence, firing its own
+ // synthesized events simulating a single animation. (eg:
+ // onEnd of this animation means the end of the chain,
+ // not the individual animations within)
+ //
+ // example:
+ // Once `node` is faded out, fade in `otherNode`
+ // | dojo.fx.chain([
+ // | dojo.fadeIn({ node:node }),
+ // | dojo.fadeOut({ node:otherNode })
+ // | ]).play();
+ //
+ return new _chain(animations); // dojo.Animation
+ };
+
+ var _combine = function(animations){
+ this._animations = animations||[];
+ this._connects = [];
+ this._finished = 0;
+
+ this.duration = 0;
+ arrayUtil.forEach(animations, function(a){
+ var duration = a.duration;
+ if(a.delay){ duration += a.delay; }
+ if(this.duration < duration){ this.duration = duration; }
+ this._connects.push(connect.connect(a, "onEnd", this, "_onEnd"));
+ }, this);
+
+ this._pseudoAnimation = new baseFx.Animation({curve: [0, 1], duration: this.duration});
+ var self = this;
+ arrayUtil.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop", "onEnd"],
+ function(evt){
+ self._connects.push(connect.connect(self._pseudoAnimation, evt,
+ function(){ self._fire(evt, arguments); }
+ ));
+ }
+ );
+ };
+ lang.extend(_combine, {
+ _doAction: function(action, args){
+ arrayUtil.forEach(this._animations, function(a){
+ a[action].apply(a, args);
+ });
+ return this;
+ },
+ _onEnd: function(){
+ if(++this._finished > this._animations.length){
+ this._fire("onEnd");
+ }
+ },
+ _call: function(action, args){
+ var t = this._pseudoAnimation;
+ t[action].apply(t, args);
+ },
+ play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
+ this._finished = 0;
+ this._doAction("play", arguments);
+ this._call("play", arguments);
+ return this;
+ },
+ pause: function(){
+ this._doAction("pause", arguments);
+ this._call("pause", arguments);
+ return this;
+ },
+ gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){
+ var ms = this.duration * percent;
+ arrayUtil.forEach(this._animations, function(a){
+ a.gotoPercent(a.duration < ms ? 1 : (ms / a.duration), andPlay);
+ });
+ this._call("gotoPercent", arguments);
+ return this;
+ },
+ stop: function(/*boolean?*/ gotoEnd){
+ this._doAction("stop", arguments);
+ this._call("stop", arguments);
+ return this;
+ },
+ status: function(){
+ return this._pseudoAnimation.status();
+ },
+ destroy: function(){
+ arrayUtil.forEach(this._connects, connect.disconnect);
+ }
+ });
+ lang.extend(_combine, _baseObj);
+
+ coreFx.combine = /*===== dojo.fx.combine = =====*/ function(/*dojo.Animation[]*/ animations){
+ // summary:
+ // Combine a list of `dojo.Animation`s to run in parallel
+ //
+ // description:
+ // Combine an array of `dojo.Animation`s to run in parallel,
+ // providing a new `dojo.Animation` instance encompasing each
+ // animation, firing standard animation events.
+ //
+ // example:
+ // Fade out `node` while fading in `otherNode` simultaneously
+ // | dojo.fx.combine([
+ // | dojo.fadeIn({ node:node }),
+ // | dojo.fadeOut({ node:otherNode })
+ // | ]).play();
+ //
+ // example:
+ // When the longest animation ends, execute a function:
+ // | var anim = dojo.fx.combine([
+ // | dojo.fadeIn({ node: n, duration:700 }),
+ // | dojo.fadeOut({ node: otherNode, duration: 300 })
+ // | ]);
+ // | dojo.connect(anim, "onEnd", function(){
+ // | // overall animation is done.
+ // | });
+ // | anim.play(); // play the animation
+ //
+ return new _combine(animations); // dojo.Animation
+ };
+
+ coreFx.wipeIn = /*===== dojo.fx.wipeIn = =====*/ function(/*Object*/ args){
+ // summary:
+ // Expand a node to it's natural height.
+ //
+ // description:
+ // Returns an animation that will expand the
+ // node defined in 'args' object from it's current height to
+ // it's natural height (with no scrollbar).
+ // Node must have no margin/border/padding.
+ //
+ // args: Object
+ // A hash-map of standard `dojo.Animation` constructor properties
+ // (such as easing: node: duration: and so on)
+ //
+ // example:
+ // | dojo.fx.wipeIn({
+ // | node:"someId"
+ // | }).play()
+ var node = args.node = dom.byId(args.node), s = node.style, o;
+
+ var anim = baseFx.animateProperty(lang.mixin({
+ properties: {
+ height: {
+ // wrapped in functions so we wait till the last second to query (in case value has changed)
+ start: function(){
+ // start at current [computed] height, but use 1px rather than 0
+ // because 0 causes IE to display the whole panel
+ o = s.overflow;
+ s.overflow = "hidden";
+ if(s.visibility == "hidden" || s.display == "none"){
+ s.height = "1px";
+ s.display = "";
+ s.visibility = "";
+ return 1;
+ }else{
+ var height = domStyle.get(node, "height");
+ return Math.max(height, 1);
+ }
+ },
+ end: function(){
+ return node.scrollHeight;
+ }
+ }
+ }
+ }, args));
+
+ var fini = function(){
+ s.height = "auto";
+ s.overflow = o;
+ };
+ connect.connect(anim, "onStop", fini);
+ connect.connect(anim, "onEnd", fini);
+
+ return anim; // dojo.Animation
+ };
+
+ coreFx.wipeOut = /*===== dojo.fx.wipeOut = =====*/ function(/*Object*/ args){
+ // summary:
+ // Shrink a node to nothing and hide it.
+ //
+ // description:
+ // Returns an animation that will shrink node defined in "args"
+ // from it's current height to 1px, and then hide it.
+ //
+ // args: Object
+ // A hash-map of standard `dojo.Animation` constructor properties
+ // (such as easing: node: duration: and so on)
+ //
+ // example:
+ // | dojo.fx.wipeOut({ node:"someId" }).play()
+
+ var node = args.node = dom.byId(args.node), s = node.style, o;
+
+ var anim = baseFx.animateProperty(lang.mixin({
+ properties: {
+ height: {
+ end: 1 // 0 causes IE to display the whole panel
+ }
+ }
+ }, args));
+
+ connect.connect(anim, "beforeBegin", function(){
+ o = s.overflow;
+ s.overflow = "hidden";
+ s.display = "";
+ });
+ var fini = function(){
+ s.overflow = o;
+ s.height = "auto";
+ s.display = "none";
+ };
+ connect.connect(anim, "onStop", fini);
+ connect.connect(anim, "onEnd", fini);
+
+ return anim; // dojo.Animation
+ };
+
+ coreFx.slideTo = /*===== dojo.fx.slideTo = =====*/ function(/*Object*/ args){
+ // summary:
+ // Slide a node to a new top/left position
+ //
+ // description:
+ // Returns an animation that will slide "node"
+ // defined in args Object from its current position to
+ // the position defined by (args.left, args.top).
+ //
+ // args: Object
+ // A hash-map of standard `dojo.Animation` constructor properties
+ // (such as easing: node: duration: and so on). Special args members
+ // are `top` and `left`, which indicate the new position to slide to.
+ //
+ // example:
+ // | .slideTo({ node: node, left:"40", top:"50", units:"px" }).play()
+
+ var node = args.node = dom.byId(args.node),
+ top = null, left = null;
+
+ var init = (function(n){
+ return function(){
+ var cs = domStyle.getComputedStyle(n);
+ var pos = cs.position;
+ top = (pos == 'absolute' ? n.offsetTop : parseInt(cs.top) || 0);
+ left = (pos == 'absolute' ? n.offsetLeft : parseInt(cs.left) || 0);
+ if(pos != 'absolute' && pos != 'relative'){
+ var ret = geom.position(n, true);
+ top = ret.y;
+ left = ret.x;
+ n.style.position="absolute";
+ n.style.top=top+"px";
+ n.style.left=left+"px";
+ }
+ };
+ })(node);
+ init();
+
+ var anim = baseFx.animateProperty(lang.mixin({
+ properties: {
+ top: args.top || 0,
+ left: args.left || 0
+ }
+ }, args));
+ connect.connect(anim, "beforeBegin", anim, init);
+
+ return anim; // dojo.Animation
+ };
+
+ return coreFx;
+});
diff --git a/lib/dojo/fx/Toggler.js b/lib/dojo/fx/Toggler.js
index dc4693d8e..265586c37 100644
--- a/lib/dojo/fx/Toggler.js
+++ b/lib/dojo/fx/Toggler.js
@@ -4,105 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.fx.Toggler"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.fx.Toggler"] = true;
-dojo.provide("dojo.fx.Toggler");
-
-
-dojo.declare("dojo.fx.Toggler", null, {
- // summary:
- // A simple `dojo.Animation` toggler API.
- //
- // description:
- // class constructor for an animation toggler. It accepts a packed
- // set of arguments about what type of animation to use in each
- // direction, duration, etc. All available members are mixed into
- // these animations from the constructor (for example, `node`,
- // `showDuration`, `hideDuration`).
- //
- // example:
- // | var t = new dojo.fx.Toggler({
- // | node: "nodeId",
- // | showDuration: 500,
- // | // hideDuration will default to "200"
- // | showFunc: dojo.fx.wipeIn,
- // | // hideFunc will default to "fadeOut"
- // | });
- // | t.show(100); // delay showing for 100ms
- // | // ...time passes...
- // | t.hide();
-
- // node: DomNode
- // the node to target for the showing and hiding animations
- node: null,
-
- // showFunc: Function
- // The function that returns the `dojo.Animation` to show the node
- showFunc: dojo.fadeIn,
-
- // hideFunc: Function
- // The function that returns the `dojo.Animation` to hide the node
- hideFunc: dojo.fadeOut,
-
- // showDuration:
- // Time in milliseconds to run the show Animation
- showDuration: 200,
-
- // hideDuration:
- // Time in milliseconds to run the hide Animation
- hideDuration: 200,
-
- // FIXME: need a policy for where the toggler should "be" the next
- // time show/hide are called if we're stopped somewhere in the
- // middle.
- // FIXME: also would be nice to specify individual showArgs/hideArgs mixed into
- // each animation individually.
- // FIXME: also would be nice to have events from the animations exposed/bridged
-
- /*=====
- _showArgs: null,
- _showAnim: null,
-
- _hideArgs: null,
- _hideAnim: null,
-
- _isShowing: false,
- _isHiding: false,
- =====*/
-
- constructor: function(args){
- var _t = this;
-
- dojo.mixin(_t, args);
- _t.node = args.node;
- _t._showArgs = dojo.mixin({}, args);
- _t._showArgs.node = _t.node;
- _t._showArgs.duration = _t.showDuration;
- _t.showAnim = _t.showFunc(_t._showArgs);
-
- _t._hideArgs = dojo.mixin({}, args);
- _t._hideArgs.node = _t.node;
- _t._hideArgs.duration = _t.hideDuration;
- _t.hideAnim = _t.hideFunc(_t._hideArgs);
-
- dojo.connect(_t.showAnim, "beforeBegin", dojo.hitch(_t.hideAnim, "stop", true));
- dojo.connect(_t.hideAnim, "beforeBegin", dojo.hitch(_t.showAnim, "stop", true));
- },
-
- show: function(delay){
- // summary: Toggle the node to showing
- // delay: Integer?
- // Ammount of time to stall playing the show animation
- return this.showAnim.play(delay || 0);
- },
-
- hide: function(delay){
- // summary: Toggle the node to hidden
- // delay: Integer?
- // Ammount of time to stall playing the hide animation
- return this.hideAnim.play(delay || 0);
- }
-});
-
-}
+//>>built
+define("dojo/fx/Toggler",["../_base/lang","../_base/declare","../_base/fx","../_base/connect"],function(_1,_2,_3,_4){return _2("dojo.fx.Toggler",null,{node:null,showFunc:_3.fadeIn,hideFunc:_3.fadeOut,showDuration:200,hideDuration:200,constructor:function(_5){var _6=this;_1.mixin(_6,_5);_6.node=_5.node;_6._showArgs=_1.mixin({},_5);_6._showArgs.node=_6.node;_6._showArgs.duration=_6.showDuration;_6.showAnim=_6.showFunc(_6._showArgs);_6._hideArgs=_1.mixin({},_5);_6._hideArgs.node=_6.node;_6._hideArgs.duration=_6.hideDuration;_6.hideAnim=_6.hideFunc(_6._hideArgs);_4.connect(_6.showAnim,"beforeBegin",_1.hitch(_6.hideAnim,"stop",true));_4.connect(_6.hideAnim,"beforeBegin",_1.hitch(_6.showAnim,"stop",true));},show:function(_7){return this.showAnim.play(_7||0);},hide:function(_8){return this.hideAnim.play(_8||0);}});}); \ No newline at end of file
diff --git a/lib/dojo/fx/Toggler.js.uncompressed.js b/lib/dojo/fx/Toggler.js.uncompressed.js
new file mode 100644
index 000000000..3e4891af2
--- /dev/null
+++ b/lib/dojo/fx/Toggler.js.uncompressed.js
@@ -0,0 +1,103 @@
+define("dojo/fx/Toggler", ["../_base/lang","../_base/declare","../_base/fx", "../_base/connect"],
+ function(lang, declare, baseFx, connectUtil) {
+ // module:
+ // dojo/fx/Toggler
+ // summary:
+ // TODOC
+
+return declare("dojo.fx.Toggler", null, {
+ // summary:
+ // A simple `dojo.Animation` toggler API.
+ //
+ // description:
+ // class constructor for an animation toggler. It accepts a packed
+ // set of arguments about what type of animation to use in each
+ // direction, duration, etc. All available members are mixed into
+ // these animations from the constructor (for example, `node`,
+ // `showDuration`, `hideDuration`).
+ //
+ // example:
+ // | var t = new dojo.fx.Toggler({
+ // | node: "nodeId",
+ // | showDuration: 500,
+ // | // hideDuration will default to "200"
+ // | showFunc: dojo.fx.wipeIn,
+ // | // hideFunc will default to "fadeOut"
+ // | });
+ // | t.show(100); // delay showing for 100ms
+ // | // ...time passes...
+ // | t.hide();
+
+ // node: DomNode
+ // the node to target for the showing and hiding animations
+ node: null,
+
+ // showFunc: Function
+ // The function that returns the `dojo.Animation` to show the node
+ showFunc: baseFx.fadeIn,
+
+ // hideFunc: Function
+ // The function that returns the `dojo.Animation` to hide the node
+ hideFunc: baseFx.fadeOut,
+
+ // showDuration:
+ // Time in milliseconds to run the show Animation
+ showDuration: 200,
+
+ // hideDuration:
+ // Time in milliseconds to run the hide Animation
+ hideDuration: 200,
+
+ // FIXME: need a policy for where the toggler should "be" the next
+ // time show/hide are called if we're stopped somewhere in the
+ // middle.
+ // FIXME: also would be nice to specify individual showArgs/hideArgs mixed into
+ // each animation individually.
+ // FIXME: also would be nice to have events from the animations exposed/bridged
+
+ /*=====
+ _showArgs: null,
+ _showAnim: null,
+
+ _hideArgs: null,
+ _hideAnim: null,
+
+ _isShowing: false,
+ _isHiding: false,
+ =====*/
+
+ constructor: function(args){
+ var _t = this;
+
+ lang.mixin(_t, args);
+ _t.node = args.node;
+ _t._showArgs = lang.mixin({}, args);
+ _t._showArgs.node = _t.node;
+ _t._showArgs.duration = _t.showDuration;
+ _t.showAnim = _t.showFunc(_t._showArgs);
+
+ _t._hideArgs = lang.mixin({}, args);
+ _t._hideArgs.node = _t.node;
+ _t._hideArgs.duration = _t.hideDuration;
+ _t.hideAnim = _t.hideFunc(_t._hideArgs);
+
+ connectUtil.connect(_t.showAnim, "beforeBegin", lang.hitch(_t.hideAnim, "stop", true));
+ connectUtil.connect(_t.hideAnim, "beforeBegin", lang.hitch(_t.showAnim, "stop", true));
+ },
+
+ show: function(delay){
+ // summary: Toggle the node to showing
+ // delay: Integer?
+ // Ammount of time to stall playing the show animation
+ return this.showAnim.play(delay || 0);
+ },
+
+ hide: function(delay){
+ // summary: Toggle the node to hidden
+ // delay: Integer?
+ // Ammount of time to stall playing the hide animation
+ return this.hideAnim.play(delay || 0);
+ }
+});
+
+});
diff --git a/lib/dojo/fx/easing.js b/lib/dojo/fx/easing.js
index c26af8971..e9a2fb75b 100644
--- a/lib/dojo/fx/easing.js
+++ b/lib/dojo/fx/easing.js
@@ -4,285 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.fx.easing"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.fx.easing"] = true;
-dojo.provide("dojo.fx.easing");
-
-dojo.getObject("fx.easing", true, dojo);
-
-dojo.fx.easing = {
- // summary:
- // Collection of easing functions to use beyond the default
- // `dojo._defaultEasing` function.
- //
- // description:
- //
- // Easing functions are used to manipulate the iteration through
- // an `dojo.Animation`s _Line. _Line being the properties of an Animation,
- // and the easing function progresses through that Line determing
- // how quickly (or slowly) it should go. Or more accurately: modify
- // the value of the _Line based on the percentage of animation completed.
- //
- // All functions follow a simple naming convention of "ease type" + "when".
- // If the name of the function ends in Out, the easing described appears
- // towards the end of the animation. "In" means during the beginning,
- // and InOut means both ranges of the Animation will applied, both
- // beginning and end.
- //
- // One does not call the easing function directly, it must be passed to
- // the `easing` property of an animation.
- //
- // example:
- // | dojo.require("dojo.fx.easing");
- // | var anim = dojo.fadeOut({
- // | node: 'node',
- // | duration: 2000,
- // | // note there is no ()
- // | easing: dojo.fx.easing.quadIn
- // | }).play();
- //
-
- linear: function(/* Decimal? */n){
- // summary: A linear easing function
- return n;
- },
-
- quadIn: function(/* Decimal? */n){
- return Math.pow(n, 2);
- },
-
- quadOut: function(/* Decimal? */n){
- return n * (n - 2) * -1;
- },
-
- quadInOut: function(/* Decimal? */n){
- n = n * 2;
- if(n < 1){ return Math.pow(n, 2) / 2; }
- return -1 * ((--n) * (n - 2) - 1) / 2;
- },
-
- cubicIn: function(/* Decimal? */n){
- return Math.pow(n, 3);
- },
-
- cubicOut: function(/* Decimal? */n){
- return Math.pow(n - 1, 3) + 1;
- },
-
- cubicInOut: function(/* Decimal? */n){
- n = n * 2;
- if(n < 1){ return Math.pow(n, 3) / 2; }
- n -= 2;
- return (Math.pow(n, 3) + 2) / 2;
- },
-
- quartIn: function(/* Decimal? */n){
- return Math.pow(n, 4);
- },
-
- quartOut: function(/* Decimal? */n){
- return -1 * (Math.pow(n - 1, 4) - 1);
- },
-
- quartInOut: function(/* Decimal? */n){
- n = n * 2;
- if(n < 1){ return Math.pow(n, 4) / 2; }
- n -= 2;
- return -1 / 2 * (Math.pow(n, 4) - 2);
- },
-
- quintIn: function(/* Decimal? */n){
- return Math.pow(n, 5);
- },
-
- quintOut: function(/* Decimal? */n){
- return Math.pow(n - 1, 5) + 1;
- },
-
- quintInOut: function(/* Decimal? */n){
- n = n * 2;
- if(n < 1){ return Math.pow(n, 5) / 2; };
- n -= 2;
- return (Math.pow(n, 5) + 2) / 2;
- },
-
- sineIn: function(/* Decimal? */n){
- return -1 * Math.cos(n * (Math.PI / 2)) + 1;
- },
-
- sineOut: function(/* Decimal? */n){
- return Math.sin(n * (Math.PI / 2));
- },
-
- sineInOut: function(/* Decimal? */n){
- return -1 * (Math.cos(Math.PI * n) - 1) / 2;
- },
-
- expoIn: function(/* Decimal? */n){
- return (n == 0) ? 0 : Math.pow(2, 10 * (n - 1));
- },
-
- expoOut: function(/* Decimal? */n){
- return (n == 1) ? 1 : (-1 * Math.pow(2, -10 * n) + 1);
- },
-
- expoInOut: function(/* Decimal? */n){
- if(n == 0){ return 0; }
- if(n == 1){ return 1; }
- n = n * 2;
- if(n < 1){ return Math.pow(2, 10 * (n - 1)) / 2; }
- --n;
- return (-1 * Math.pow(2, -10 * n) + 2) / 2;
- },
-
- circIn: function(/* Decimal? */n){
- return -1 * (Math.sqrt(1 - Math.pow(n, 2)) - 1);
- },
-
- circOut: function(/* Decimal? */n){
- n = n - 1;
- return Math.sqrt(1 - Math.pow(n, 2));
- },
-
- circInOut: function(/* Decimal? */n){
- n = n * 2;
- if(n < 1){ return -1 / 2 * (Math.sqrt(1 - Math.pow(n, 2)) - 1); }
- n -= 2;
- return 1 / 2 * (Math.sqrt(1 - Math.pow(n, 2)) + 1);
- },
-
- backIn: function(/* Decimal? */n){
- // summary:
- // An easing function that starts away from the target,
- // and quickly accelerates towards the end value.
- //
- // Use caution when the easing will cause values to become
- // negative as some properties cannot be set to negative values.
- var s = 1.70158;
- return Math.pow(n, 2) * ((s + 1) * n - s);
- },
-
- backOut: function(/* Decimal? */n){
- // summary:
- // An easing function that pops past the range briefly, and slowly comes back.
- //
- // description:
- // An easing function that pops past the range briefly, and slowly comes back.
- //
- // Use caution when the easing will cause values to become negative as some
- // properties cannot be set to negative values.
-
- n = n - 1;
- var s = 1.70158;
- return Math.pow(n, 2) * ((s + 1) * n + s) + 1;
- },
-
- backInOut: function(/* Decimal? */n){
- // summary:
- // An easing function combining the effects of `backIn` and `backOut`
- //
- // description:
- // An easing function combining the effects of `backIn` and `backOut`.
- // Use caution when the easing will cause values to become negative
- // as some properties cannot be set to negative values.
- var s = 1.70158 * 1.525;
- n = n * 2;
- if(n < 1){ return (Math.pow(n, 2) * ((s + 1) * n - s)) / 2; }
- n-=2;
- return (Math.pow(n, 2) * ((s + 1) * n + s) + 2) / 2;
- },
-
- elasticIn: function(/* Decimal? */n){
- // summary:
- // An easing function the elastically snaps from the start value
- //
- // description:
- // An easing function the elastically snaps from the start value
- //
- // Use caution when the elasticity will cause values to become negative
- // as some properties cannot be set to negative values.
- if(n == 0 || n == 1){ return n; }
- var p = .3;
- var s = p / 4;
- n = n - 1;
- return -1 * Math.pow(2, 10 * n) * Math.sin((n - s) * (2 * Math.PI) / p);
- },
-
- elasticOut: function(/* Decimal? */n){
- // summary:
- // An easing function that elasticly snaps around the target value,
- // near the end of the Animation
- //
- // description:
- // An easing function that elasticly snaps around the target value,
- // near the end of the Animation
- //
- // Use caution when the elasticity will cause values to become
- // negative as some properties cannot be set to negative values.
- if(n==0 || n == 1){ return n; }
- var p = .3;
- var s = p / 4;
- return Math.pow(2, -10 * n) * Math.sin((n - s) * (2 * Math.PI) / p) + 1;
- },
-
- elasticInOut: function(/* Decimal? */n){
- // summary:
- // An easing function that elasticly snaps around the value, near
- // the beginning and end of the Animation.
- //
- // description:
- // An easing function that elasticly snaps around the value, near
- // the beginning and end of the Animation.
- //
- // Use caution when the elasticity will cause values to become
- // negative as some properties cannot be set to negative values.
- if(n == 0) return 0;
- n = n * 2;
- if(n == 2) return 1;
- var p = .3 * 1.5;
- var s = p / 4;
- if(n < 1){
- n -= 1;
- return -.5 * (Math.pow(2, 10 * n) * Math.sin((n - s) * (2 * Math.PI) / p));
- }
- n -= 1;
- return .5 * (Math.pow(2, -10 * n) * Math.sin((n - s) * (2 * Math.PI) / p)) + 1;
- },
-
- bounceIn: function(/* Decimal? */n){
- // summary:
- // An easing function that 'bounces' near the beginning of an Animation
- return (1 - dojo.fx.easing.bounceOut(1 - n)); // Decimal
- },
-
- bounceOut: function(/* Decimal? */n){
- // summary:
- // An easing function that 'bounces' near the end of an Animation
- var s = 7.5625;
- var p = 2.75;
- var l;
- if(n < (1 / p)){
- l = s * Math.pow(n, 2);
- }else if(n < (2 / p)){
- n -= (1.5 / p);
- l = s * Math.pow(n, 2) + .75;
- }else if(n < (2.5 / p)){
- n -= (2.25 / p);
- l = s * Math.pow(n, 2) + .9375;
- }else{
- n -= (2.625 / p);
- l = s * Math.pow(n, 2) + .984375;
- }
- return l;
- },
-
- bounceInOut: function(/* Decimal? */n){
- // summary:
- // An easing function that 'bounces' at the beginning and end of the Animation
- if(n < 0.5){ return dojo.fx.easing.bounceIn(n * 2) / 2; }
- return (dojo.fx.easing.bounceOut(n * 2 - 1) / 2) + 0.5; // Decimal
- }
-};
-
-}
+//>>built
+define("dojo/fx/easing",["../_base/lang"],function(_1){var _2={linear:function(n){return n;},quadIn:function(n){return Math.pow(n,2);},quadOut:function(n){return n*(n-2)*-1;},quadInOut:function(n){n=n*2;if(n<1){return Math.pow(n,2)/2;}return -1*((--n)*(n-2)-1)/2;},cubicIn:function(n){return Math.pow(n,3);},cubicOut:function(n){return Math.pow(n-1,3)+1;},cubicInOut:function(n){n=n*2;if(n<1){return Math.pow(n,3)/2;}n-=2;return (Math.pow(n,3)+2)/2;},quartIn:function(n){return Math.pow(n,4);},quartOut:function(n){return -1*(Math.pow(n-1,4)-1);},quartInOut:function(n){n=n*2;if(n<1){return Math.pow(n,4)/2;}n-=2;return -1/2*(Math.pow(n,4)-2);},quintIn:function(n){return Math.pow(n,5);},quintOut:function(n){return Math.pow(n-1,5)+1;},quintInOut:function(n){n=n*2;if(n<1){return Math.pow(n,5)/2;}n-=2;return (Math.pow(n,5)+2)/2;},sineIn:function(n){return -1*Math.cos(n*(Math.PI/2))+1;},sineOut:function(n){return Math.sin(n*(Math.PI/2));},sineInOut:function(n){return -1*(Math.cos(Math.PI*n)-1)/2;},expoIn:function(n){return (n==0)?0:Math.pow(2,10*(n-1));},expoOut:function(n){return (n==1)?1:(-1*Math.pow(2,-10*n)+1);},expoInOut:function(n){if(n==0){return 0;}if(n==1){return 1;}n=n*2;if(n<1){return Math.pow(2,10*(n-1))/2;}--n;return (-1*Math.pow(2,-10*n)+2)/2;},circIn:function(n){return -1*(Math.sqrt(1-Math.pow(n,2))-1);},circOut:function(n){n=n-1;return Math.sqrt(1-Math.pow(n,2));},circInOut:function(n){n=n*2;if(n<1){return -1/2*(Math.sqrt(1-Math.pow(n,2))-1);}n-=2;return 1/2*(Math.sqrt(1-Math.pow(n,2))+1);},backIn:function(n){var s=1.70158;return Math.pow(n,2)*((s+1)*n-s);},backOut:function(n){n=n-1;var s=1.70158;return Math.pow(n,2)*((s+1)*n+s)+1;},backInOut:function(n){var s=1.70158*1.525;n=n*2;if(n<1){return (Math.pow(n,2)*((s+1)*n-s))/2;}n-=2;return (Math.pow(n,2)*((s+1)*n+s)+2)/2;},elasticIn:function(n){if(n==0||n==1){return n;}var p=0.3;var s=p/4;n=n-1;return -1*Math.pow(2,10*n)*Math.sin((n-s)*(2*Math.PI)/p);},elasticOut:function(n){if(n==0||n==1){return n;}var p=0.3;var s=p/4;return Math.pow(2,-10*n)*Math.sin((n-s)*(2*Math.PI)/p)+1;},elasticInOut:function(n){if(n==0){return 0;}n=n*2;if(n==2){return 1;}var p=0.3*1.5;var s=p/4;if(n<1){n-=1;return -0.5*(Math.pow(2,10*n)*Math.sin((n-s)*(2*Math.PI)/p));}n-=1;return 0.5*(Math.pow(2,-10*n)*Math.sin((n-s)*(2*Math.PI)/p))+1;},bounceIn:function(n){return (1-_2.bounceOut(1-n));},bounceOut:function(n){var s=7.5625;var p=2.75;var l;if(n<(1/p)){l=s*Math.pow(n,2);}else{if(n<(2/p)){n-=(1.5/p);l=s*Math.pow(n,2)+0.75;}else{if(n<(2.5/p)){n-=(2.25/p);l=s*Math.pow(n,2)+0.9375;}else{n-=(2.625/p);l=s*Math.pow(n,2)+0.984375;}}}return l;},bounceInOut:function(n){if(n<0.5){return _2.bounceIn(n*2)/2;}return (_2.bounceOut(n*2-1)/2)+0.5;}};_1.setObject("dojo.fx.easing",_2);return _2;}); \ No newline at end of file
diff --git a/lib/dojo/fx/easing.js.uncompressed.js b/lib/dojo/fx/easing.js.uncompressed.js
new file mode 100644
index 000000000..6663deb2b
--- /dev/null
+++ b/lib/dojo/fx/easing.js.uncompressed.js
@@ -0,0 +1,284 @@
+define("dojo/fx/easing", ["../_base/lang"], function(lang) {
+// module:
+// dojo/fx/easing
+// summary:
+// This module defines standard easing functions that are useful for animations.
+
+var easingFuncs = /*===== dojo.fx.easing= =====*/ {
+ // summary:
+ // Collection of easing functions to use beyond the default
+ // `dojo._defaultEasing` function.
+ //
+ // description:
+ //
+ // Easing functions are used to manipulate the iteration through
+ // an `dojo.Animation`s _Line. _Line being the properties of an Animation,
+ // and the easing function progresses through that Line determing
+ // how quickly (or slowly) it should go. Or more accurately: modify
+ // the value of the _Line based on the percentage of animation completed.
+ //
+ // All functions follow a simple naming convention of "ease type" + "when".
+ // If the name of the function ends in Out, the easing described appears
+ // towards the end of the animation. "In" means during the beginning,
+ // and InOut means both ranges of the Animation will applied, both
+ // beginning and end.
+ //
+ // One does not call the easing function directly, it must be passed to
+ // the `easing` property of an animation.
+ //
+ // example:
+ // | dojo.require("dojo.fx.easing");
+ // | var anim = dojo.fadeOut({
+ // | node: 'node',
+ // | duration: 2000,
+ // | // note there is no ()
+ // | easing: dojo.fx.easing.quadIn
+ // | }).play();
+ //
+
+ linear: function(/* Decimal? */n){
+ // summary: A linear easing function
+ return n;
+ },
+
+ quadIn: function(/* Decimal? */n){
+ return Math.pow(n, 2);
+ },
+
+ quadOut: function(/* Decimal? */n){
+ return n * (n - 2) * -1;
+ },
+
+ quadInOut: function(/* Decimal? */n){
+ n = n * 2;
+ if(n < 1){ return Math.pow(n, 2) / 2; }
+ return -1 * ((--n) * (n - 2) - 1) / 2;
+ },
+
+ cubicIn: function(/* Decimal? */n){
+ return Math.pow(n, 3);
+ },
+
+ cubicOut: function(/* Decimal? */n){
+ return Math.pow(n - 1, 3) + 1;
+ },
+
+ cubicInOut: function(/* Decimal? */n){
+ n = n * 2;
+ if(n < 1){ return Math.pow(n, 3) / 2; }
+ n -= 2;
+ return (Math.pow(n, 3) + 2) / 2;
+ },
+
+ quartIn: function(/* Decimal? */n){
+ return Math.pow(n, 4);
+ },
+
+ quartOut: function(/* Decimal? */n){
+ return -1 * (Math.pow(n - 1, 4) - 1);
+ },
+
+ quartInOut: function(/* Decimal? */n){
+ n = n * 2;
+ if(n < 1){ return Math.pow(n, 4) / 2; }
+ n -= 2;
+ return -1 / 2 * (Math.pow(n, 4) - 2);
+ },
+
+ quintIn: function(/* Decimal? */n){
+ return Math.pow(n, 5);
+ },
+
+ quintOut: function(/* Decimal? */n){
+ return Math.pow(n - 1, 5) + 1;
+ },
+
+ quintInOut: function(/* Decimal? */n){
+ n = n * 2;
+ if(n < 1){ return Math.pow(n, 5) / 2; }
+ n -= 2;
+ return (Math.pow(n, 5) + 2) / 2;
+ },
+
+ sineIn: function(/* Decimal? */n){
+ return -1 * Math.cos(n * (Math.PI / 2)) + 1;
+ },
+
+ sineOut: function(/* Decimal? */n){
+ return Math.sin(n * (Math.PI / 2));
+ },
+
+ sineInOut: function(/* Decimal? */n){
+ return -1 * (Math.cos(Math.PI * n) - 1) / 2;
+ },
+
+ expoIn: function(/* Decimal? */n){
+ return (n == 0) ? 0 : Math.pow(2, 10 * (n - 1));
+ },
+
+ expoOut: function(/* Decimal? */n){
+ return (n == 1) ? 1 : (-1 * Math.pow(2, -10 * n) + 1);
+ },
+
+ expoInOut: function(/* Decimal? */n){
+ if(n == 0){ return 0; }
+ if(n == 1){ return 1; }
+ n = n * 2;
+ if(n < 1){ return Math.pow(2, 10 * (n - 1)) / 2; }
+ --n;
+ return (-1 * Math.pow(2, -10 * n) + 2) / 2;
+ },
+
+ circIn: function(/* Decimal? */n){
+ return -1 * (Math.sqrt(1 - Math.pow(n, 2)) - 1);
+ },
+
+ circOut: function(/* Decimal? */n){
+ n = n - 1;
+ return Math.sqrt(1 - Math.pow(n, 2));
+ },
+
+ circInOut: function(/* Decimal? */n){
+ n = n * 2;
+ if(n < 1){ return -1 / 2 * (Math.sqrt(1 - Math.pow(n, 2)) - 1); }
+ n -= 2;
+ return 1 / 2 * (Math.sqrt(1 - Math.pow(n, 2)) + 1);
+ },
+
+ backIn: function(/* Decimal? */n){
+ // summary:
+ // An easing function that starts away from the target,
+ // and quickly accelerates towards the end value.
+ //
+ // Use caution when the easing will cause values to become
+ // negative as some properties cannot be set to negative values.
+ var s = 1.70158;
+ return Math.pow(n, 2) * ((s + 1) * n - s);
+ },
+
+ backOut: function(/* Decimal? */n){
+ // summary:
+ // An easing function that pops past the range briefly, and slowly comes back.
+ //
+ // description:
+ // An easing function that pops past the range briefly, and slowly comes back.
+ //
+ // Use caution when the easing will cause values to become negative as some
+ // properties cannot be set to negative values.
+
+ n = n - 1;
+ var s = 1.70158;
+ return Math.pow(n, 2) * ((s + 1) * n + s) + 1;
+ },
+
+ backInOut: function(/* Decimal? */n){
+ // summary:
+ // An easing function combining the effects of `backIn` and `backOut`
+ //
+ // description:
+ // An easing function combining the effects of `backIn` and `backOut`.
+ // Use caution when the easing will cause values to become negative
+ // as some properties cannot be set to negative values.
+ var s = 1.70158 * 1.525;
+ n = n * 2;
+ if(n < 1){ return (Math.pow(n, 2) * ((s + 1) * n - s)) / 2; }
+ n-=2;
+ return (Math.pow(n, 2) * ((s + 1) * n + s) + 2) / 2;
+ },
+
+ elasticIn: function(/* Decimal? */n){
+ // summary:
+ // An easing function the elastically snaps from the start value
+ //
+ // description:
+ // An easing function the elastically snaps from the start value
+ //
+ // Use caution when the elasticity will cause values to become negative
+ // as some properties cannot be set to negative values.
+ if(n == 0 || n == 1){ return n; }
+ var p = .3;
+ var s = p / 4;
+ n = n - 1;
+ return -1 * Math.pow(2, 10 * n) * Math.sin((n - s) * (2 * Math.PI) / p);
+ },
+
+ elasticOut: function(/* Decimal? */n){
+ // summary:
+ // An easing function that elasticly snaps around the target value,
+ // near the end of the Animation
+ //
+ // description:
+ // An easing function that elasticly snaps around the target value,
+ // near the end of the Animation
+ //
+ // Use caution when the elasticity will cause values to become
+ // negative as some properties cannot be set to negative values.
+ if(n==0 || n == 1){ return n; }
+ var p = .3;
+ var s = p / 4;
+ return Math.pow(2, -10 * n) * Math.sin((n - s) * (2 * Math.PI) / p) + 1;
+ },
+
+ elasticInOut: function(/* Decimal? */n){
+ // summary:
+ // An easing function that elasticly snaps around the value, near
+ // the beginning and end of the Animation.
+ //
+ // description:
+ // An easing function that elasticly snaps around the value, near
+ // the beginning and end of the Animation.
+ //
+ // Use caution when the elasticity will cause values to become
+ // negative as some properties cannot be set to negative values.
+ if(n == 0) return 0;
+ n = n * 2;
+ if(n == 2) return 1;
+ var p = .3 * 1.5;
+ var s = p / 4;
+ if(n < 1){
+ n -= 1;
+ return -.5 * (Math.pow(2, 10 * n) * Math.sin((n - s) * (2 * Math.PI) / p));
+ }
+ n -= 1;
+ return .5 * (Math.pow(2, -10 * n) * Math.sin((n - s) * (2 * Math.PI) / p)) + 1;
+ },
+
+ bounceIn: function(/* Decimal? */n){
+ // summary:
+ // An easing function that 'bounces' near the beginning of an Animation
+ return (1 - easingFuncs.bounceOut(1 - n)); // Decimal
+ },
+
+ bounceOut: function(/* Decimal? */n){
+ // summary:
+ // An easing function that 'bounces' near the end of an Animation
+ var s = 7.5625;
+ var p = 2.75;
+ var l;
+ if(n < (1 / p)){
+ l = s * Math.pow(n, 2);
+ }else if(n < (2 / p)){
+ n -= (1.5 / p);
+ l = s * Math.pow(n, 2) + .75;
+ }else if(n < (2.5 / p)){
+ n -= (2.25 / p);
+ l = s * Math.pow(n, 2) + .9375;
+ }else{
+ n -= (2.625 / p);
+ l = s * Math.pow(n, 2) + .984375;
+ }
+ return l;
+ },
+
+ bounceInOut: function(/* Decimal? */n){
+ // summary:
+ // An easing function that 'bounces' at the beginning and end of the Animation
+ if(n < 0.5){ return easingFuncs.bounceIn(n * 2) / 2; }
+ return (easingFuncs.bounceOut(n * 2 - 1) / 2) + 0.5; // Decimal
+ }
+};
+
+lang.setObject("dojo.fx.easing", easingFuncs);
+
+return easingFuncs;
+});
diff --git a/lib/dojo/gears.js b/lib/dojo/gears.js
index d5595b191..bc59a9dd8 100644
--- a/lib/dojo/gears.js
+++ b/lib/dojo/gears.js
@@ -4,62 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.gears"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.gears"] = true;
-dojo.provide("dojo.gears");
-
-dojo.getObject("gears", true, dojo);
-
-dojo.gears._gearsObject = function(){
- // summary:
- // factory method to get a Google Gears plugin instance to
- // expose in the browser runtime environment, if present
- var factory;
- var results;
-
- var gearsObj = dojo.getObject("google.gears");
- if(gearsObj){ return gearsObj; } // already defined elsewhere
-
- if(typeof GearsFactory != "undefined"){ // Firefox
- factory = new GearsFactory();
- }else{
- if(dojo.isIE){
- // IE
- try{
- factory = new ActiveXObject("Gears.Factory");
- }catch(e){
- // ok to squelch; there's no gears factory. move on.
- }
- }else if(navigator.mimeTypes["application/x-googlegears"]){
- // Safari?
- factory = document.createElement("object");
- factory.setAttribute("type", "application/x-googlegears");
- factory.setAttribute("width", 0);
- factory.setAttribute("height", 0);
- factory.style.display = "none";
- document.documentElement.appendChild(factory);
- }
- }
-
- // still nothing?
- if(!factory){ return null; }
-
- // define the global objects now; don't overwrite them though if they
- // were somehow set internally by the Gears plugin, which is on their
- // dev roadmap for the future
- dojo.setObject("google.gears.factory", factory);
- return dojo.getObject("google.gears");
-};
-
-/*=====
-dojo.gears.available = {
- // summary: True if client is using Google Gears
-};
-=====*/
-// see if we have Google Gears installed, and if
-// so, make it available in the runtime environment
-// and in the Google standard 'google.gears' global object
-dojo.gears.available = (!!dojo.gears._gearsObject())||0;
-
-}
+//>>built
+define("dojo/gears",["./_base/kernel","./_base/lang","./_base/sniff"],function(_1,_2,_3){_2.getObject("gears",true,_1);_1.gears._gearsObject=function(){var _4;var _5=_2.getObject("google.gears");if(_5){return _5;}if(typeof GearsFactory!="undefined"){_4=new GearsFactory();}else{if(_3("ie")){try{_4=new ActiveXObject("Gears.Factory");}catch(e){}}else{if(navigator.mimeTypes["application/x-googlegears"]){_4=document.createElement("object");_4.setAttribute("type","application/x-googlegears");_4.setAttribute("width",0);_4.setAttribute("height",0);_4.style.display="none";document.documentElement.appendChild(_4);}}}if(!_4){return null;}_2.setObject("google.gears.factory",_4);return _2.getObject("google.gears");};_1.gears.available=(!!_1.gears._gearsObject())||0;return _1.gears;}); \ No newline at end of file
diff --git a/lib/dojo/gears.js.uncompressed.js b/lib/dojo/gears.js.uncompressed.js
new file mode 100644
index 000000000..8ab6c9568
--- /dev/null
+++ b/lib/dojo/gears.js.uncompressed.js
@@ -0,0 +1,61 @@
+define("dojo/gears", ["./_base/kernel", "./_base/lang", "./_base/sniff"],
+ function(dojo, lang, has) {
+ // module:
+ // dojo/gears
+ // summary:
+ // TODOC
+
+lang.getObject("gears", true, dojo);
+
+dojo.gears._gearsObject = function(){
+ // summary:
+ // factory method to get a Google Gears plugin instance to
+ // expose in the browser runtime environment, if present
+ var factory;
+
+ var gearsObj = lang.getObject("google.gears");
+ if(gearsObj){ return gearsObj; } // already defined elsewhere
+
+ if(typeof GearsFactory != "undefined"){ // Firefox
+ factory = new GearsFactory();
+ }else{
+ if(has("ie")){
+ // IE
+ try{
+ factory = new ActiveXObject("Gears.Factory");
+ }catch(e){
+ // ok to squelch; there's no gears factory. move on.
+ }
+ }else if(navigator.mimeTypes["application/x-googlegears"]){
+ // Safari?
+ factory = document.createElement("object");
+ factory.setAttribute("type", "application/x-googlegears");
+ factory.setAttribute("width", 0);
+ factory.setAttribute("height", 0);
+ factory.style.display = "none";
+ document.documentElement.appendChild(factory);
+ }
+ }
+
+ // still nothing?
+ if(!factory){ return null; }
+
+ // define the global objects now; don't overwrite them though if they
+ // were somehow set internally by the Gears plugin, which is on their
+ // dev roadmap for the future
+ lang.setObject("google.gears.factory", factory);
+ return lang.getObject("google.gears");
+};
+
+/*=====
+dojo.gears.available = {
+ // summary: True if client is using Google Gears
+};
+=====*/
+// see if we have Google Gears installed, and if
+// so, make it available in the runtime environment
+// and in the Google standard 'google.gears' global object
+dojo.gears.available = (!!dojo.gears._gearsObject())||0;
+
+return dojo.gears;
+});
diff --git a/lib/dojo/has.js b/lib/dojo/has.js
new file mode 100644
index 000000000..32160dc0e
--- /dev/null
+++ b/lib/dojo/has.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/has",["require"],function(_1){var _2=_1.has||function(){};if(!1){var _3=typeof window!="undefined"&&typeof location!="undefined"&&typeof document!="undefined"&&window.location==location&&window.document==document,_4=this,_5=_3&&document,_6=_5&&_5.createElement("DiV"),_7={};_2=function(_8){return typeof _7[_8]=="function"?(_7[_8]=_7[_8](_4,_5,_6)):_7[_8];};_2.cache=_7;_2.add=function(_9,_a,_b,_c){(typeof _7[_9]=="undefined"||_c)&&(_7[_9]=_a);return _b&&_2(_9);};true||_2.add("host-browser",_3);true||_2.add("dom",_3);true||_2.add("dojo-dom-ready-api",1);true||_2.add("dojo-sniff",1);}if(1){var _d=navigator.userAgent;_2.add("dom-addeventlistener",!!document.addEventListener);_2.add("touch","ontouchstart" in document);_2.add("device-width",screen.availWidth||innerWidth);_2.add("agent-ios",!!_d.match(/iPhone|iP[ao]d/));_2.add("agent-android",_d.indexOf("android")>1);}_2.clearElement=function(_e){_e.innerHTML="";return _e;};_2.normalize=function(id,_f){var _10=id.match(/[\?:]|[^:\?]*/g),i=0,get=function(_11){var _12=_10[i++];if(_12==":"){return 0;}else{if(_10[i++]=="?"){if(!_11&&_2(_12)){return get();}else{get(true);return get(_11);}}return _12||0;}};id=get();return id&&_f(id);};_2.load=function(id,_13,_14){if(id){_13([id],_14);}else{_14();}};return _2;}); \ No newline at end of file
diff --git a/lib/dojo/has.js.uncompressed.js b/lib/dojo/has.js.uncompressed.js
new file mode 100644
index 000000000..18ed4f581
--- /dev/null
+++ b/lib/dojo/has.js.uncompressed.js
@@ -0,0 +1,178 @@
+define("dojo/has", ["require"], function(require) {
+ // module:
+ // dojo/has
+ // summary:
+ // Defines the has.js API and several feature tests used by dojo.
+ // description:
+ // This module defines the has API as described by the project has.js with the following additional features:
+ //
+ // * the has test cache is exposed at has.cache.
+ // * the method has.add includes a forth parameter that controls whether or not existing tests are replaced
+ // * the loader's has cache may be optionally copied into this module's has cahce.
+ //
+ // This module adopted from https://github.com/phiggins42/has.js; thanks has.js team!
+
+ // try to pull the has implementation from the loader; both the dojo loader and bdLoad provide one
+ // WARNING: if a foreign loader defines require.has to be something other than the has.js API, then this implementation fail
+ var has = require.has || function(){};
+ if(!1){
+ // notice the condition is written so that if 1 is transformed to 1 during a build
+ // the conditional will be (!1 && typeof has=="function") which is statically false and the closure
+ // compiler will discard the block.
+ var
+ isBrowser =
+ // the most fundamental decision: are we in the browser?
+ typeof window != "undefined" &&
+ typeof location != "undefined" &&
+ typeof document != "undefined" &&
+ window.location == location && window.document == document,
+
+ // has API variables
+ global = this,
+ doc = isBrowser && document,
+ element = doc && doc.createElement("DiV"),
+ cache = {};
+
+ has = /*===== dojo.has= =====*/ function(name){
+ // summary:
+ // Return the current value of the named feature.
+ //
+ // name: String|Integer
+ // The name (if a string) or identifier (if an integer) of the feature to test.
+ //
+ // description:
+ // Returns the value of the feature named by name. The feature must have been
+ // previously added to the cache by has.add.
+
+ return typeof cache[name] == "function" ? (cache[name] = cache[name](global, doc, element)) : cache[name]; // Boolean
+ };
+
+ has.cache = cache;
+
+ has.add = /*====== dojo.has.add= ======*/ function(name, test, now, force){
+ // summary:
+ // Register a new feature test for some named feature.
+ //
+ // name: String|Integer
+ // The name (if a string) or identifier (if an integer) of the feature to test.
+ //
+ // test: Function
+ // A test function to register. If a function, queued for testing until actually
+ // needed. The test function should return a boolean indicating
+ // the presence of a feature or bug.
+ //
+ // now: Boolean?
+ // Optional. Omit if `test` is not a function. Provides a way to immediately
+ // run the test and cache the result.
+ //
+ // force: Boolean?
+ // Optional. If the test already exists and force is truthy, then the existing
+ // test will be replaced; otherwise, add does not replace an existing test (that
+ // is, by default, the first test advice wins).
+ //
+ // example:
+ // A redundant test, testFn with immediate execution:
+ // | has.add("javascript", function(){ return true; }, true);
+ //
+ // example:
+ // Again with the redundantness. You can do this in your tests, but we should
+ // not be doing this in any internal has.js tests
+ // | has.add("javascript", true);
+ //
+ // example:
+ // Three things are passed to the testFunction. `global`, `document`, and a generic element
+ // from which to work your test should the need arise.
+ // | has.add("bug-byid", function(g, d, el){
+ // | // g == global, typically window, yadda yadda
+ // | // d == document object
+ // | // el == the generic element. a `has` element.
+ // | return false; // fake test, byid-when-form-has-name-matching-an-id is slightly longer
+ // | });
+
+ (typeof cache[name]=="undefined" || force) && (cache[name]= test);
+ return now && has(name);
+ };
+
+ // since we're operating under a loader that doesn't provide a has API, we must explicitly initialize
+ // has as it would have otherwise been initialized by the dojo loader; use has.add to the builder
+ // can optimize these away iff desired
+ true || has.add("host-browser", isBrowser);
+ true || has.add("dom", isBrowser);
+ true || has.add("dojo-dom-ready-api", 1);
+ true || has.add("dojo-sniff", 1);
+ }
+
+ if(1){
+ var agent = navigator.userAgent;
+ // Common application level tests
+ has.add("dom-addeventlistener", !!document.addEventListener);
+ has.add("touch", "ontouchstart" in document);
+ // I don't know if any of these tests are really correct, just a rough guess
+ has.add("device-width", screen.availWidth || innerWidth);
+ has.add("agent-ios", !!agent.match(/iPhone|iP[ao]d/));
+ has.add("agent-android", agent.indexOf("android") > 1);
+ }
+
+ has.clearElement = /*===== dojo.has.clearElement= ======*/ function(element) {
+ // summary:
+ // Deletes the contents of the element passed to test functions.
+ element.innerHTML= "";
+ return element;
+ };
+
+ has.normalize = /*===== dojo.has.normalize= ======*/ function(id, toAbsMid){
+ // summary:
+ // Resolves id into a module id based on possibly-nested tenary expression that branches on has feature test value(s).
+ //
+ // toAbsMid: Function
+ // Resolves a relative module id into an absolute module id
+ var
+ tokens = id.match(/[\?:]|[^:\?]*/g), i = 0,
+ get = function(skip){
+ var term = tokens[i++];
+ if(term == ":"){
+ // empty string module name, resolves to 0
+ return 0;
+ }else{
+ // postfixed with a ? means it is a feature to branch on, the term is the name of the feature
+ if(tokens[i++] == "?"){
+ if(!skip && has(term)){
+ // matched the feature, get the first value from the options
+ return get();
+ }else{
+ // did not match, get the second value, passing over the first
+ get(true);
+ return get(skip);
+ }
+ }
+ // a module
+ return term || 0;
+ }
+ };
+ id = get();
+ return id && toAbsMid(id);
+ };
+
+ has.load = /*===== dojo.has.load= ======*/ function(id, parentRequire, loaded){
+ // summary:
+ // Conditional loading of AMD modules based on a has feature test value.
+ //
+ // id: String
+ // Gives the resolved module id to load.
+ //
+ // parentRequire: Function
+ // The loader require function with respect to the module that contained the plugin resource in it's
+ // dependency list.
+ //
+ // loaded: Function
+ // Callback to loader that consumes result of plugin demand.
+
+ if(id){
+ parentRequire([id], loaded);
+ }else{
+ loaded();
+ }
+ };
+
+ return has;
+});
diff --git a/lib/dojo/hash.js b/lib/dojo/hash.js
index e7f6a400f..b39080176 100644
--- a/lib/dojo/hash.js
+++ b/lib/dojo/hash.js
@@ -4,244 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.hash"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.hash"] = true;
-dojo.provide("dojo.hash");
-
-
-//TODOC: where does this go?
-// summary:
-// Methods for monitoring and updating the hash in the browser URL.
-//
-// example:
-// dojo.subscribe("/dojo/hashchange", context, callback);
-//
-// function callback (hashValue){
-// // do something based on the hash value.
-// }
-
-(function(){
- dojo.hash = function(/* String? */ hash, /* Boolean? */ replace){
- // summary:
- // Gets or sets the hash string.
- // description:
- // Handles getting and setting of location.hash.
- // - If no arguments are passed, acts as a getter.
- // - If a string is passed, acts as a setter.
- // hash:
- // the hash is set - #string.
- // replace:
- // If true, updates the hash value in the current history
- // state instead of creating a new history state.
- // returns:
- // when used as a getter, returns the current hash string.
- // when used as a setter, returns the new hash string.
-
- // getter
- if(!arguments.length){
- return _getHash();
- }
- // setter
- if(hash.charAt(0) == "#"){
- hash = hash.substring(1);
- }
- if(replace){
- _replace(hash);
- }else{
- location.href = "#" + hash;
- }
- return hash; // String
- };
-
- // Global vars
- var _recentHash, _ieUriMonitor, _connect,
- _pollFrequency = dojo.config.hashPollFrequency || 100;
-
- //Internal functions
- function _getSegment(str, delimiter){
- var i = str.indexOf(delimiter);
- return (i >= 0) ? str.substring(i+1) : "";
- }
-
- function _getHash(){
- return _getSegment(location.href, "#");
- }
-
- function _dispatchEvent(){
- dojo.publish("/dojo/hashchange", [_getHash()]);
- }
-
- function _pollLocation(){
- if(_getHash() === _recentHash){
- return;
- }
- _recentHash = _getHash();
- _dispatchEvent();
- }
-
- function _replace(hash){
- if(_ieUriMonitor){
- if(_ieUriMonitor.isTransitioning()){
- setTimeout(dojo.hitch(null,_replace,hash), _pollFrequency);
- return;
- }
- var href = _ieUriMonitor.iframe.location.href;
- var index = href.indexOf('?');
- // main frame will detect and update itself
- _ieUriMonitor.iframe.location.replace(href.substring(0, index) + "?" + hash);
- return;
- }
- location.replace("#"+hash);
- !_connect && _pollLocation();
- }
-
- function IEUriMonitor(){
- // summary:
- // Determine if the browser's URI has changed or if the user has pressed the
- // back or forward button. If so, call _dispatchEvent.
- //
- // description:
- // IE doesn't add changes to the URI's hash into the history unless the hash
- // value corresponds to an actual named anchor in the document. To get around
- // this IE difference, we use a background IFrame to maintain a back-forward
- // history, by updating the IFrame's query string to correspond to the
- // value of the main browser location's hash value.
- //
- // E.g. if the value of the browser window's location changes to
- //
- // #action=someAction
- //
- // ... then we'd update the IFrame's source to:
- //
- // ?action=someAction
- //
- // This design leads to a somewhat complex state machine, which is
- // described below:
- //
- // s1: Stable state - neither the window's location has changed nor
- // has the IFrame's location. Note that this is the 99.9% case, so
- // we optimize for it.
- // Transitions: s1, s2, s3
- // s2: Window's location changed - when a user clicks a hyperlink or
- // code programmatically changes the window's URI.
- // Transitions: s4
- // s3: Iframe's location changed as a result of user pressing back or
- // forward - when the user presses back or forward, the location of
- // the background's iframe changes to the previous or next value in
- // its history.
- // Transitions: s1
- // s4: IEUriMonitor has programmatically changed the location of the
- // background iframe, but it's location hasn't yet changed. In this
- // case we do nothing because we need to wait for the iframe's
- // location to reflect its actual state.
- // Transitions: s4, s5
- // s5: IEUriMonitor has programmatically changed the location of the
- // background iframe, and the iframe's location has caught up with
- // reality. In this case we need to transition to s1.
- // Transitions: s1
- //
- // The hashchange event is always dispatched on the transition back to s1.
- //
-
- // create and append iframe
- var ifr = document.createElement("iframe"),
- IFRAME_ID = "dojo-hash-iframe",
- ifrSrc = dojo.config.dojoBlankHtmlUrl || dojo.moduleUrl("dojo", "resources/blank.html");
-
- if(dojo.config.useXDomain && !dojo.config.dojoBlankHtmlUrl){
- console.warn("dojo.hash: When using cross-domain Dojo builds,"
- + " please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl"
- + " to the path on your domain to blank.html");
- }
-
- ifr.id = IFRAME_ID;
- ifr.src = ifrSrc + "?" + _getHash();
- ifr.style.display = "none";
- document.body.appendChild(ifr);
-
- this.iframe = dojo.global[IFRAME_ID];
- var recentIframeQuery, transitioning, expectedIFrameQuery, docTitle, ifrOffline,
- iframeLoc = this.iframe.location;
-
- function resetState(){
- _recentHash = _getHash();
- recentIframeQuery = ifrOffline ? _recentHash : _getSegment(iframeLoc.href, "?");
- transitioning = false;
- expectedIFrameQuery = null;
- }
-
- this.isTransitioning = function(){
- return transitioning;
- };
-
- this.pollLocation = function(){
- if(!ifrOffline) {
- try{
- //see if we can access the iframe's location without a permission denied error
- var iframeSearch = _getSegment(iframeLoc.href, "?");
- //good, the iframe is same origin (no thrown exception)
- if(document.title != docTitle){ //sync title of main window with title of iframe.
- docTitle = this.iframe.document.title = document.title;
- }
- }catch(e){
- //permission denied - server cannot be reached.
- ifrOffline = true;
- console.error("dojo.hash: Error adding history entry. Server unreachable.");
- }
- }
- var hash = _getHash();
- if(transitioning && _recentHash === hash){
- // we're in an iframe transition (s4 or s5)
- if(ifrOffline || iframeSearch === expectedIFrameQuery){
- // s5 (iframe caught up to main window or iframe offline), transition back to s1
- resetState();
- _dispatchEvent();
- }else{
- // s4 (waiting for iframe to catch up to main window)
- setTimeout(dojo.hitch(this,this.pollLocation),0);
- return;
- }
- }else if(_recentHash === hash && (ifrOffline || recentIframeQuery === iframeSearch)){
- // we're in stable state (s1, iframe query == main window hash), do nothing
- }else{
- // the user has initiated a URL change somehow.
- // sync iframe query <-> main window hash
- if(_recentHash !== hash){
- // s2 (main window location changed), set iframe url and transition to s4
- _recentHash = hash;
- transitioning = true;
- expectedIFrameQuery = hash;
- ifr.src = ifrSrc + "?" + expectedIFrameQuery;
- ifrOffline = false; //we're updating the iframe src - set offline to false so we can check again on next poll.
- setTimeout(dojo.hitch(this,this.pollLocation),0); //yielded transition to s4 while iframe reloads.
- return;
- }else if(!ifrOffline){
- // s3 (iframe location changed via back/forward button), set main window url and transition to s1.
- location.href = "#" + iframeLoc.search.substring(1);
- resetState();
- _dispatchEvent();
- }
- }
- setTimeout(dojo.hitch(this,this.pollLocation), _pollFrequency);
- };
- resetState(); // initialize state (transition to s1)
- setTimeout(dojo.hitch(this,this.pollLocation), _pollFrequency);
- }
- dojo.addOnLoad(function(){
- if("onhashchange" in dojo.global && (!dojo.isIE || (dojo.isIE >= 8 && document.compatMode != "BackCompat"))){ //need this IE browser test because "onhashchange" exists in IE8 in IE7 mode
- _connect = dojo.connect(dojo.global,"onhashchange",_dispatchEvent);
- }else{
- if(document.addEventListener){ // Non-IE
- _recentHash = _getHash();
- setInterval(_pollLocation, _pollFrequency); //Poll the window location for changes
- }else if(document.attachEvent){ // IE7-
- //Use hidden iframe in versions of IE that don't have onhashchange event
- _ieUriMonitor = new IEUriMonitor();
- }
- // else non-supported browser, do nothing.
- }
- });
-})();
-
-}
+//>>built
+define("dojo/hash",["./_base/kernel","require","./_base/connect","./_base/lang","./ready","./_base/sniff"],function(_1,_2,_3,_4,_5,_6){_1.hash=function(_7,_8){if(!arguments.length){return _9();}if(_7.charAt(0)=="#"){_7=_7.substring(1);}if(_8){_a(_7);}else{location.href="#"+_7;}return _7;};var _b,_c,_d,_e=_1.config.hashPollFrequency||100;function _f(str,_10){var i=str.indexOf(_10);return (i>=0)?str.substring(i+1):"";};function _9(){return _f(location.href,"#");};function _11(){_3.publish("/dojo/hashchange",[_9()]);};function _12(){if(_9()===_b){return;}_b=_9();_11();};function _a(_13){if(_c){if(_c.isTransitioning()){setTimeout(_4.hitch(null,_a,_13),_e);return;}var _14=_c.iframe.location.href;var _15=_14.indexOf("?");_c.iframe.location.replace(_14.substring(0,_15)+"?"+_13);return;}location.replace("#"+_13);!_d&&_12();};function _16(){var ifr=document.createElement("iframe"),_17="dojo-hash-iframe",_18=_1.config.dojoBlankHtmlUrl||_2.toUrl("./resources/blank.html");if(_1.config.useXDomain&&!_1.config.dojoBlankHtmlUrl){console.warn("dojo.hash: When using cross-domain Dojo builds,"+" please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl"+" to the path on your domain to blank.html");}ifr.id=_17;ifr.src=_18+"?"+_9();ifr.style.display="none";document.body.appendChild(ifr);this.iframe=_1.global[_17];var _19,_1a,_1b,_1c,_1d,_1e=this.iframe.location;function _1f(){_b=_9();_19=_1d?_b:_f(_1e.href,"?");_1a=false;_1b=null;};this.isTransitioning=function(){return _1a;};this.pollLocation=function(){if(!_1d){try{var _20=_f(_1e.href,"?");if(document.title!=_1c){_1c=this.iframe.document.title=document.title;}}catch(e){_1d=true;console.error("dojo.hash: Error adding history entry. Server unreachable.");}}var _21=_9();if(_1a&&_b===_21){if(_1d||_20===_1b){_1f();_11();}else{setTimeout(_4.hitch(this,this.pollLocation),0);return;}}else{if(_b===_21&&(_1d||_19===_20)){}else{if(_b!==_21){_b=_21;_1a=true;_1b=_21;ifr.src=_18+"?"+_1b;_1d=false;setTimeout(_4.hitch(this,this.pollLocation),0);return;}else{if(!_1d){location.href="#"+_1e.search.substring(1);_1f();_11();}}}}setTimeout(_4.hitch(this,this.pollLocation),_e);};_1f();setTimeout(_4.hitch(this,this.pollLocation),_e);};_5(function(){if("onhashchange" in _1.global&&(!_6("ie")||(_6("ie")>=8&&document.compatMode!="BackCompat"))){_d=_3.connect(_1.global,"onhashchange",_11);}else{if(document.addEventListener){_b=_9();setInterval(_12,_e);}else{if(document.attachEvent){_c=new _16();}}}});return _1.hash;}); \ No newline at end of file
diff --git a/lib/dojo/hash.js.uncompressed.js b/lib/dojo/hash.js.uncompressed.js
new file mode 100644
index 000000000..6824f818c
--- /dev/null
+++ b/lib/dojo/hash.js.uncompressed.js
@@ -0,0 +1,243 @@
+define("dojo/hash", ["./_base/kernel", "require", "./_base/connect", "./_base/lang", "./ready", "./_base/sniff"],
+ function(dojo, require, connect, lang, ready, has) {
+ // module:
+ // dojo/hash
+ // summary:
+ // TODOC
+
+
+//TODOC: where does this go?
+// summary:
+// Methods for monitoring and updating the hash in the browser URL.
+//
+// example:
+// dojo.subscribe("/dojo/hashchange", context, callback);
+//
+// function callback (hashValue){
+// // do something based on the hash value.
+// }
+
+ dojo.hash = function(/* String? */ hash, /* Boolean? */ replace){
+ // summary:
+ // Gets or sets the hash string.
+ // description:
+ // Handles getting and setting of location.hash.
+ // - If no arguments are passed, acts as a getter.
+ // - If a string is passed, acts as a setter.
+ // hash:
+ // the hash is set - #string.
+ // replace:
+ // If true, updates the hash value in the current history
+ // state instead of creating a new history state.
+ // returns:
+ // when used as a getter, returns the current hash string.
+ // when used as a setter, returns the new hash string.
+
+ // getter
+ if(!arguments.length){
+ return _getHash();
+ }
+ // setter
+ if(hash.charAt(0) == "#"){
+ hash = hash.substring(1);
+ }
+ if(replace){
+ _replace(hash);
+ }else{
+ location.href = "#" + hash;
+ }
+ return hash; // String
+ };
+
+ // Global vars
+ var _recentHash, _ieUriMonitor, _connect,
+ _pollFrequency = dojo.config.hashPollFrequency || 100;
+
+ //Internal functions
+ function _getSegment(str, delimiter){
+ var i = str.indexOf(delimiter);
+ return (i >= 0) ? str.substring(i+1) : "";
+ }
+
+ function _getHash(){
+ return _getSegment(location.href, "#");
+ }
+
+ function _dispatchEvent(){
+ connect.publish("/dojo/hashchange", [_getHash()]);
+ }
+
+ function _pollLocation(){
+ if(_getHash() === _recentHash){
+ return;
+ }
+ _recentHash = _getHash();
+ _dispatchEvent();
+ }
+
+ function _replace(hash){
+ if(_ieUriMonitor){
+ if(_ieUriMonitor.isTransitioning()){
+ setTimeout(lang.hitch(null,_replace,hash), _pollFrequency);
+ return;
+ }
+ var href = _ieUriMonitor.iframe.location.href;
+ var index = href.indexOf('?');
+ // main frame will detect and update itself
+ _ieUriMonitor.iframe.location.replace(href.substring(0, index) + "?" + hash);
+ return;
+ }
+ location.replace("#"+hash);
+ !_connect && _pollLocation();
+ }
+
+ function IEUriMonitor(){
+ // summary:
+ // Determine if the browser's URI has changed or if the user has pressed the
+ // back or forward button. If so, call _dispatchEvent.
+ //
+ // description:
+ // IE doesn't add changes to the URI's hash into the history unless the hash
+ // value corresponds to an actual named anchor in the document. To get around
+ // this IE difference, we use a background IFrame to maintain a back-forward
+ // history, by updating the IFrame's query string to correspond to the
+ // value of the main browser location's hash value.
+ //
+ // E.g. if the value of the browser window's location changes to
+ //
+ // #action=someAction
+ //
+ // ... then we'd update the IFrame's source to:
+ //
+ // ?action=someAction
+ //
+ // This design leads to a somewhat complex state machine, which is
+ // described below:
+ //
+ // s1: Stable state - neither the window's location has changed nor
+ // has the IFrame's location. Note that this is the 99.9% case, so
+ // we optimize for it.
+ // Transitions: s1, s2, s3
+ // s2: Window's location changed - when a user clicks a hyperlink or
+ // code programmatically changes the window's URI.
+ // Transitions: s4
+ // s3: Iframe's location changed as a result of user pressing back or
+ // forward - when the user presses back or forward, the location of
+ // the background's iframe changes to the previous or next value in
+ // its history.
+ // Transitions: s1
+ // s4: IEUriMonitor has programmatically changed the location of the
+ // background iframe, but it's location hasn't yet changed. In this
+ // case we do nothing because we need to wait for the iframe's
+ // location to reflect its actual state.
+ // Transitions: s4, s5
+ // s5: IEUriMonitor has programmatically changed the location of the
+ // background iframe, and the iframe's location has caught up with
+ // reality. In this case we need to transition to s1.
+ // Transitions: s1
+ //
+ // The hashchange event is always dispatched on the transition back to s1.
+ //
+
+ // create and append iframe
+ var ifr = document.createElement("iframe"),
+ IFRAME_ID = "dojo-hash-iframe",
+ ifrSrc = dojo.config.dojoBlankHtmlUrl || require.toUrl("./resources/blank.html");
+
+ if(dojo.config.useXDomain && !dojo.config.dojoBlankHtmlUrl){
+ console.warn("dojo.hash: When using cross-domain Dojo builds,"
+ + " please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl"
+ + " to the path on your domain to blank.html");
+ }
+
+ ifr.id = IFRAME_ID;
+ ifr.src = ifrSrc + "?" + _getHash();
+ ifr.style.display = "none";
+ document.body.appendChild(ifr);
+
+ this.iframe = dojo.global[IFRAME_ID];
+ var recentIframeQuery, transitioning, expectedIFrameQuery, docTitle, ifrOffline,
+ iframeLoc = this.iframe.location;
+
+ function resetState(){
+ _recentHash = _getHash();
+ recentIframeQuery = ifrOffline ? _recentHash : _getSegment(iframeLoc.href, "?");
+ transitioning = false;
+ expectedIFrameQuery = null;
+ }
+
+ this.isTransitioning = function(){
+ return transitioning;
+ };
+
+ this.pollLocation = function(){
+ if(!ifrOffline) {
+ try{
+ //see if we can access the iframe's location without a permission denied error
+ var iframeSearch = _getSegment(iframeLoc.href, "?");
+ //good, the iframe is same origin (no thrown exception)
+ if(document.title != docTitle){ //sync title of main window with title of iframe.
+ docTitle = this.iframe.document.title = document.title;
+ }
+ }catch(e){
+ //permission denied - server cannot be reached.
+ ifrOffline = true;
+ console.error("dojo.hash: Error adding history entry. Server unreachable.");
+ }
+ }
+ var hash = _getHash();
+ if(transitioning && _recentHash === hash){
+ // we're in an iframe transition (s4 or s5)
+ if(ifrOffline || iframeSearch === expectedIFrameQuery){
+ // s5 (iframe caught up to main window or iframe offline), transition back to s1
+ resetState();
+ _dispatchEvent();
+ }else{
+ // s4 (waiting for iframe to catch up to main window)
+ setTimeout(lang.hitch(this,this.pollLocation),0);
+ return;
+ }
+ }else if(_recentHash === hash && (ifrOffline || recentIframeQuery === iframeSearch)){
+ // we're in stable state (s1, iframe query == main window hash), do nothing
+ }else{
+ // the user has initiated a URL change somehow.
+ // sync iframe query <-> main window hash
+ if(_recentHash !== hash){
+ // s2 (main window location changed), set iframe url and transition to s4
+ _recentHash = hash;
+ transitioning = true;
+ expectedIFrameQuery = hash;
+ ifr.src = ifrSrc + "?" + expectedIFrameQuery;
+ ifrOffline = false; //we're updating the iframe src - set offline to false so we can check again on next poll.
+ setTimeout(lang.hitch(this,this.pollLocation),0); //yielded transition to s4 while iframe reloads.
+ return;
+ }else if(!ifrOffline){
+ // s3 (iframe location changed via back/forward button), set main window url and transition to s1.
+ location.href = "#" + iframeLoc.search.substring(1);
+ resetState();
+ _dispatchEvent();
+ }
+ }
+ setTimeout(lang.hitch(this,this.pollLocation), _pollFrequency);
+ };
+ resetState(); // initialize state (transition to s1)
+ setTimeout(lang.hitch(this,this.pollLocation), _pollFrequency);
+ }
+ ready(function(){
+ if("onhashchange" in dojo.global && (!has("ie") || (has("ie") >= 8 && document.compatMode != "BackCompat"))){ //need this IE browser test because "onhashchange" exists in IE8 in IE7 mode
+ _connect = connect.connect(dojo.global,"onhashchange",_dispatchEvent);
+ }else{
+ if(document.addEventListener){ // Non-IE
+ _recentHash = _getHash();
+ setInterval(_pollLocation, _pollFrequency); //Poll the window location for changes
+ }else if(document.attachEvent){ // IE7-
+ //Use hidden iframe in versions of IE that don't have onhashchange event
+ _ieUriMonitor = new IEUriMonitor();
+ }
+ // else non-supported browser, do nothing.
+ }
+ });
+
+ return dojo.hash;
+
+});
diff --git a/lib/dojo/html.js b/lib/dojo/html.js
index f88f899cc..97872db25 100644
--- a/lib/dojo/html.js
+++ b/lib/dojo/html.js
@@ -4,347 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.html"] = true;
-dojo.provide("dojo.html");
-dojo.require("dojo.parser");
-
-dojo.getObject("html", true, dojo);
-
-// the parser might be needed..
-(function(){ // private scope, sort of a namespace
-
- // idCounter is incremented with each instantiation to allow asignment of a unique id for tracking, logging purposes
- var idCounter = 0,
- d = dojo;
-
- dojo.html._secureForInnerHtml = function(/*String*/ cont){
- // summary:
- // removes !DOCTYPE and title elements from the html string.
- //
- // khtml is picky about dom faults, you can't attach a style or <title> node as child of body
- // must go into head, so we need to cut out those tags
- // cont:
- // An html string for insertion into the dom
- //
- return cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig, ""); // String
- };
-
-/*====
- dojo.html._emptyNode = function(node){
- // summary:
- // removes all child nodes from the given node
- // node: DOMNode
- // the parent element
- };
-=====*/
- dojo.html._emptyNode = dojo.empty;
-
- dojo.html._setNodeContent = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont){
- // summary:
- // inserts the given content into the given node
- // node:
- // the parent element
- // content:
- // the content to be set on the parent element.
- // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes
-
- // always empty
- d.empty(node);
-
- if(cont) {
- if(typeof cont == "string") {
- cont = d._toDom(cont, node.ownerDocument);
- }
- if(!cont.nodeType && d.isArrayLike(cont)) {
- // handle as enumerable, but it may shrink as we enumerate it
- for(var startlen=cont.length, i=0; i<cont.length; i=startlen==cont.length ? i+1 : 0) {
- d.place( cont[i], node, "last");
- }
- } else {
- // pass nodes, documentFragments and unknowns through to dojo.place
- d.place(cont, node, "last");
- }
- }
-
- // return DomNode
- return node;
- };
-
- // we wrap up the content-setting operation in a object
- dojo.declare("dojo.html._ContentSetter", null,
- {
- // node: DomNode|String
- // An node which will be the parent element that we set content into
- node: "",
-
- // content: String|DomNode|DomNode[]
- // The content to be placed in the node. Can be an HTML string, a node reference, or a enumerable list of nodes
- content: "",
-
- // id: String?
- // Usually only used internally, and auto-generated with each instance
- id: "",
-
- // cleanContent: Boolean
- // Should the content be treated as a full html document,
- // and the real content stripped of <html>, <body> wrapper before injection
- cleanContent: false,
-
- // extractContent: Boolean
- // Should the content be treated as a full html document, and the real content stripped of <html>, <body> wrapper before injection
- extractContent: false,
-
- // parseContent: Boolean
- // Should the node by passed to the parser after the new content is set
- parseContent: false,
-
- // 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,
-
- // startup: Boolean
- // Start the child widgets after parsing them. Only obeyed if parseContent is true.
- startup: true,
-
- // lifecyle methods
- constructor: function(/* Object */params, /* String|DomNode */node){
- // summary:
- // Provides a configurable, extensible object to wrap the setting on content on a node
- // call the set() method to actually set the content..
-
- // the original params are mixed directly into the instance "this"
- dojo.mixin(this, params || {});
-
- // give precedence to params.node vs. the node argument
- // and ensure its a node, not an id string
- node = this.node = dojo.byId( this.node || node );
-
- if(!this.id){
- this.id = [
- "Setter",
- (node) ? node.id || node.tagName : "",
- idCounter++
- ].join("_");
- }
- },
- set: function(/* String|DomNode|NodeList? */ cont, /* Object? */ params){
- // summary:
- // front-end to the set-content sequence
- // cont:
- // An html string, node or enumerable list of nodes for insertion into the dom
- // If not provided, the object's content property will be used
- if(undefined !== cont){
- this.content = cont;
- }
- // in the re-use scenario, set needs to be able to mixin new configuration
- if(params){
- this._mixin(params);
- }
-
- this.onBegin();
- this.setContent();
- this.onEnd();
-
- return this.node;
- },
- setContent: function(){
- // summary:
- // sets the content on the node
-
- var node = this.node;
- if(!node) {
- // can't proceed
- throw new Error(this.declaredClass + ": setContent given no node");
- }
- try{
- node = dojo.html._setNodeContent(node, this.content);
- }catch(e){
- // check if a domfault occurs when we are appending this.errorMessage
- // like for instance if domNode is a UL and we try append a DIV
-
- // FIXME: need to allow the user to provide a content error message string
- var errMess = this.onContentError(e);
- try{
- node.innerHTML = errMess;
- }catch(e){
- console.error('Fatal ' + this.declaredClass + '.setContent could not change content due to '+e.message, e);
- }
- }
- // always put back the node for the next method
- this.node = node; // DomNode
- },
-
- empty: function() {
- // summary
- // cleanly empty out existing content
-
- // destroy any widgets from a previous run
- // NOTE: if you dont want this you'll need to empty
- // the parseResults array property yourself to avoid bad things happenning
- if(this.parseResults && this.parseResults.length) {
- dojo.forEach(this.parseResults, function(w) {
- if(w.destroy){
- w.destroy();
- }
- });
- delete this.parseResults;
- }
- // this is fast, but if you know its already empty or safe, you could
- // override empty to skip this step
- dojo.html._emptyNode(this.node);
- },
-
- onBegin: function(){
- // summary
- // Called after instantiation, but before set();
- // It allows modification of any of the object properties
- // - including the node and content provided - before the set operation actually takes place
- // This default implementation checks for cleanContent and extractContent flags to
- // optionally pre-process html string content
- var cont = this.content;
-
- if(dojo.isString(cont)){
- if(this.cleanContent){
- cont = dojo.html._secureForInnerHtml(cont);
- }
-
- if(this.extractContent){
- var match = cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
- if(match){ cont = match[1]; }
- }
- }
-
- // clean out the node and any cruft associated with it - like widgets
- this.empty();
-
- this.content = cont;
- return this.node; /* DomNode */
- },
-
- onEnd: function(){
- // summary
- // Called after set(), when the new content has been pushed into the node
- // It provides an opportunity for post-processing before handing back the node to the caller
- // This default implementation checks a parseContent flag to optionally run the dojo parser over the new content
- if(this.parseContent){
- // populates this.parseResults if you need those..
- this._parse();
- }
- return this.node; /* DomNode */
- },
-
- tearDown: function(){
- // summary
- // manually reset the Setter instance if its being re-used for example for another set()
- // description
- // tearDown() is not called automatically.
- // In normal use, the Setter instance properties are simply allowed to fall out of scope
- // but the tearDown method can be called to explicitly reset this instance.
- delete this.parseResults;
- delete this.node;
- delete this.content;
- },
-
- onContentError: function(err){
- return "Error occured setting content: " + err;
- },
-
- _mixin: function(params){
- // mix properties/methods into the instance
- // TODO: the intention with tearDown is to put the Setter's state
- // back to that of the original constructor (vs. deleting/resetting everything regardless of ctor params)
- // so we could do something here to move the original properties aside for later restoration
- var empty = {}, key;
- for(key in params){
- if(key in empty){ continue; }
- // TODO: here's our opportunity to mask the properties we dont consider configurable/overridable
- // .. but history shows we'll almost always guess wrong
- this[key] = params[key];
- }
- },
- _parse: function(){
- // summary:
- // runs the dojo parser over the node contents, storing any results in this.parseResults
- // Any errors resulting from parsing are passed to _onError for handling
-
- var rootNode = this.node;
- try{
- // store the results (widgets, whatever) for potential retrieval
- var inherited = {};
- dojo.forEach(["dir", "lang", "textDir"], function(name){
- if(this[name]){
- inherited[name] = this[name];
- }
- }, this);
- this.parseResults = dojo.parser.parse({
- rootNode: rootNode,
- noStart: !this.startup,
- inherited: inherited,
- scope: this.parserScope
- });
- }catch(e){
- this._onError('Content', e, "Error parsing in _ContentSetter#"+this.id);
- }
- },
-
- _onError: function(type, err, consoleText){
- // summary:
- // shows user the string that is returned by on[type]Error
- // overide/implement 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
- dojo.html._setNodeContent(this.node, errText, true);
- }
- }
- }); // end dojo.declare()
-
- dojo.html.set = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont, /* Object? */ params){
- // summary:
- // inserts (replaces) the given content into the given node. dojo.place(cont, node, "only")
- // may be a better choice for simple HTML insertion.
- // description:
- // Unless you need to use the params capabilities of this method, you should use
- // dojo.place(cont, node, "only"). dojo.place() has more robust support for injecting
- // an HTML string into the DOM, but it only handles inserting an HTML string as DOM
- // elements, or inserting a DOM node. dojo.place does not handle NodeList insertions
- // or the other capabilities as defined by the params object for this method.
- // node:
- // the parent element that will receive the content
- // cont:
- // the content to be set on the parent element.
- // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes
- // params:
- // Optional flags/properties to configure the content-setting. See dojo.html._ContentSetter
- // example:
- // A safe string/node/nodelist content replacement/injection with hooks for extension
- // Example Usage:
- // dojo.html.set(node, "some string");
- // dojo.html.set(node, contentNode, {options});
- // dojo.html.set(node, myNode.childNodes, {options});
- if(undefined == cont){
- console.warn("dojo.html.set: no cont argument provided, using empty string");
- cont = "";
- }
- if(!params){
- // simple and fast
- return dojo.html._setNodeContent(node, cont, true);
- }else{
- // more options but slower
- // note the arguments are reversed in order, to match the convention for instantiation via the parser
- var op = new dojo.html._ContentSetter(dojo.mixin(
- params,
- { content: cont, node: node }
- ));
- return op.set();
- }
- };
-})();
-
-}
+//>>built
+define("dojo/html",["./_base/kernel","./_base/lang","./_base/array","./_base/declare","./dom","./dom-construct","./parser"],function(_1,_2,_3,_4,_5,_6,_7){_2.getObject("html",true,_1);var _8=0;_1.html._secureForInnerHtml=function(_9){return _9.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig,"");};_1.html._emptyNode=_6.empty;_1.html._setNodeContent=function(_a,_b){_6.empty(_a);if(_b){if(typeof _b=="string"){_b=_6.toDom(_b,_a.ownerDocument);}if(!_b.nodeType&&_2.isArrayLike(_b)){for(var _c=_b.length,i=0;i<_b.length;i=_c==_b.length?i+1:0){_6.place(_b[i],_a,"last");}}else{_6.place(_b,_a,"last");}}return _a;};_4("dojo.html._ContentSetter",null,{node:"",content:"",id:"",cleanContent:false,extractContent:false,parseContent:false,parserScope:_1._scopeName,startup:true,constructor:function(_d,_e){_2.mixin(this,_d||{});_e=this.node=_5.byId(this.node||_e);if(!this.id){this.id=["Setter",(_e)?_e.id||_e.tagName:"",_8++].join("_");}},set:function(_f,_10){if(undefined!==_f){this.content=_f;}if(_10){this._mixin(_10);}this.onBegin();this.setContent();this.onEnd();return this.node;},setContent:function(){var _11=this.node;if(!_11){throw new Error(this.declaredClass+": setContent given no node");}try{_11=_1.html._setNodeContent(_11,this.content);}catch(e){var _12=this.onContentError(e);try{_11.innerHTML=_12;}catch(e){console.error("Fatal "+this.declaredClass+".setContent could not change content due to "+e.message,e);}}this.node=_11;},empty:function(){if(this.parseResults&&this.parseResults.length){_3.forEach(this.parseResults,function(w){if(w.destroy){w.destroy();}});delete this.parseResults;}_1.html._emptyNode(this.node);},onBegin:function(){var _13=this.content;if(_2.isString(_13)){if(this.cleanContent){_13=_1.html._secureForInnerHtml(_13);}if(this.extractContent){var _14=_13.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_14){_13=_14[1];}}}this.empty();this.content=_13;return this.node;},onEnd:function(){if(this.parseContent){this._parse();}return this.node;},tearDown:function(){delete this.parseResults;delete this.node;delete this.content;},onContentError:function(err){return "Error occured setting content: "+err;},_mixin:function(_15){var _16={},key;for(key in _15){if(key in _16){continue;}this[key]=_15[key];}},_parse:function(){var _17=this.node;try{var _18={};_3.forEach(["dir","lang","textDir"],function(_19){if(this[_19]){_18[_19]=this[_19];}},this);this.parseResults=_7.parse({rootNode:_17,noStart:!this.startup,inherited:_18,scope:this.parserScope});}catch(e){this._onError("Content",e,"Error parsing in _ContentSetter#"+this.id);}},_onError:function(_1a,err,_1b){var _1c=this["on"+_1a+"Error"].call(this,err);if(_1b){console.error(_1b,err);}else{if(_1c){_1.html._setNodeContent(this.node,_1c,true);}}}});_1.html.set=function(_1d,_1e,_1f){if(undefined==_1e){console.warn("dojo.html.set: no cont argument provided, using empty string");_1e="";}if(!_1f){return _1.html._setNodeContent(_1d,_1e,true);}else{var op=new _1.html._ContentSetter(_2.mixin(_1f,{content:_1e,node:_1d}));return op.set();}};return _1.html;}); \ No newline at end of file
diff --git a/lib/dojo/html.js.uncompressed.js b/lib/dojo/html.js.uncompressed.js
new file mode 100644
index 000000000..696973102
--- /dev/null
+++ b/lib/dojo/html.js.uncompressed.js
@@ -0,0 +1,342 @@
+define("dojo/html", ["./_base/kernel", "./_base/lang", "./_base/array", "./_base/declare", "./dom", "./dom-construct", "./parser"], function(dojo, lang, darray, declare, dom, domConstruct, parser) {
+ // module:
+ // dojo/html
+ // summary:
+ // TODOC
+
+ lang.getObject("html", true, dojo);
+
+ // the parser might be needed..
+
+ // idCounter is incremented with each instantiation to allow asignment of a unique id for tracking, logging purposes
+ var idCounter = 0;
+
+ dojo.html._secureForInnerHtml = function(/*String*/ cont){
+ // summary:
+ // removes !DOCTYPE and title elements from the html string.
+ //
+ // khtml is picky about dom faults, you can't attach a style or <title> node as child of body
+ // must go into head, so we need to cut out those tags
+ // cont:
+ // An html string for insertion into the dom
+ //
+ return cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig, ""); // String
+ };
+
+/*====
+ dojo.html._emptyNode = function(node){
+ // summary:
+ // removes all child nodes from the given node
+ // node: DOMNode
+ // the parent element
+ };
+=====*/
+ dojo.html._emptyNode = domConstruct.empty;
+
+ dojo.html._setNodeContent = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont){
+ // summary:
+ // inserts the given content into the given node
+ // node:
+ // the parent element
+ // content:
+ // the content to be set on the parent element.
+ // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes
+
+ // always empty
+ domConstruct.empty(node);
+
+ if(cont) {
+ if(typeof cont == "string") {
+ cont = domConstruct.toDom(cont, node.ownerDocument);
+ }
+ if(!cont.nodeType && lang.isArrayLike(cont)) {
+ // handle as enumerable, but it may shrink as we enumerate it
+ for(var startlen=cont.length, i=0; i<cont.length; i=startlen==cont.length ? i+1 : 0) {
+ domConstruct.place( cont[i], node, "last");
+ }
+ } else {
+ // pass nodes, documentFragments and unknowns through to dojo.place
+ domConstruct.place(cont, node, "last");
+ }
+ }
+
+ // return DomNode
+ return node;
+ };
+
+ // we wrap up the content-setting operation in a object
+ declare("dojo.html._ContentSetter", null,
+ {
+ // node: DomNode|String
+ // An node which will be the parent element that we set content into
+ node: "",
+
+ // content: String|DomNode|DomNode[]
+ // The content to be placed in the node. Can be an HTML string, a node reference, or a enumerable list of nodes
+ content: "",
+
+ // id: String?
+ // Usually only used internally, and auto-generated with each instance
+ id: "",
+
+ // cleanContent: Boolean
+ // Should the content be treated as a full html document,
+ // and the real content stripped of <html>, <body> wrapper before injection
+ cleanContent: false,
+
+ // extractContent: Boolean
+ // Should the content be treated as a full html document, and the real content stripped of <html>, <body> wrapper before injection
+ extractContent: false,
+
+ // parseContent: Boolean
+ // Should the node by passed to the parser after the new content is set
+ parseContent: false,
+
+ // 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,
+
+ // startup: Boolean
+ // Start the child widgets after parsing them. Only obeyed if parseContent is true.
+ startup: true,
+
+ // lifecyle methods
+ constructor: function(/* Object */params, /* String|DomNode */node){
+ // summary:
+ // Provides a configurable, extensible object to wrap the setting on content on a node
+ // call the set() method to actually set the content..
+
+ // the original params are mixed directly into the instance "this"
+ lang.mixin(this, params || {});
+
+ // give precedence to params.node vs. the node argument
+ // and ensure its a node, not an id string
+ node = this.node = dom.byId( this.node || node );
+
+ if(!this.id){
+ this.id = [
+ "Setter",
+ (node) ? node.id || node.tagName : "",
+ idCounter++
+ ].join("_");
+ }
+ },
+ set: function(/* String|DomNode|NodeList? */ cont, /* Object? */ params){
+ // summary:
+ // front-end to the set-content sequence
+ // cont:
+ // An html string, node or enumerable list of nodes for insertion into the dom
+ // If not provided, the object's content property will be used
+ if(undefined !== cont){
+ this.content = cont;
+ }
+ // in the re-use scenario, set needs to be able to mixin new configuration
+ if(params){
+ this._mixin(params);
+ }
+
+ this.onBegin();
+ this.setContent();
+ this.onEnd();
+
+ return this.node;
+ },
+ setContent: function(){
+ // summary:
+ // sets the content on the node
+
+ var node = this.node;
+ if(!node) {
+ // can't proceed
+ throw new Error(this.declaredClass + ": setContent given no node");
+ }
+ try{
+ node = dojo.html._setNodeContent(node, this.content);
+ }catch(e){
+ // check if a domfault occurs when we are appending this.errorMessage
+ // like for instance if domNode is a UL and we try append a DIV
+
+ // FIXME: need to allow the user to provide a content error message string
+ var errMess = this.onContentError(e);
+ try{
+ node.innerHTML = errMess;
+ }catch(e){
+ console.error('Fatal ' + this.declaredClass + '.setContent could not change content due to '+e.message, e);
+ }
+ }
+ // always put back the node for the next method
+ this.node = node; // DomNode
+ },
+
+ empty: function() {
+ // summary
+ // cleanly empty out existing content
+
+ // destroy any widgets from a previous run
+ // NOTE: if you dont want this you'll need to empty
+ // the parseResults array property yourself to avoid bad things happenning
+ if(this.parseResults && this.parseResults.length) {
+ darray.forEach(this.parseResults, function(w) {
+ if(w.destroy){
+ w.destroy();
+ }
+ });
+ delete this.parseResults;
+ }
+ // this is fast, but if you know its already empty or safe, you could
+ // override empty to skip this step
+ dojo.html._emptyNode(this.node);
+ },
+
+ onBegin: function(){
+ // summary
+ // Called after instantiation, but before set();
+ // It allows modification of any of the object properties
+ // - including the node and content provided - before the set operation actually takes place
+ // This default implementation checks for cleanContent and extractContent flags to
+ // optionally pre-process html string content
+ var cont = this.content;
+
+ if(lang.isString(cont)){
+ if(this.cleanContent){
+ cont = dojo.html._secureForInnerHtml(cont);
+ }
+
+ if(this.extractContent){
+ var match = cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+ if(match){ cont = match[1]; }
+ }
+ }
+
+ // clean out the node and any cruft associated with it - like widgets
+ this.empty();
+
+ this.content = cont;
+ return this.node; /* DomNode */
+ },
+
+ onEnd: function(){
+ // summary
+ // Called after set(), when the new content has been pushed into the node
+ // It provides an opportunity for post-processing before handing back the node to the caller
+ // This default implementation checks a parseContent flag to optionally run the dojo parser over the new content
+ if(this.parseContent){
+ // populates this.parseResults if you need those..
+ this._parse();
+ }
+ return this.node; /* DomNode */
+ },
+
+ tearDown: function(){
+ // summary
+ // manually reset the Setter instance if its being re-used for example for another set()
+ // description
+ // tearDown() is not called automatically.
+ // In normal use, the Setter instance properties are simply allowed to fall out of scope
+ // but the tearDown method can be called to explicitly reset this instance.
+ delete this.parseResults;
+ delete this.node;
+ delete this.content;
+ },
+
+ onContentError: function(err){
+ return "Error occured setting content: " + err;
+ },
+
+ _mixin: function(params){
+ // mix properties/methods into the instance
+ // TODO: the intention with tearDown is to put the Setter's state
+ // back to that of the original constructor (vs. deleting/resetting everything regardless of ctor params)
+ // so we could do something here to move the original properties aside for later restoration
+ var empty = {}, key;
+ for(key in params){
+ if(key in empty){ continue; }
+ // TODO: here's our opportunity to mask the properties we dont consider configurable/overridable
+ // .. but history shows we'll almost always guess wrong
+ this[key] = params[key];
+ }
+ },
+ _parse: function(){
+ // summary:
+ // runs the dojo parser over the node contents, storing any results in this.parseResults
+ // Any errors resulting from parsing are passed to _onError for handling
+
+ var rootNode = this.node;
+ try{
+ // store the results (widgets, whatever) for potential retrieval
+ var inherited = {};
+ darray.forEach(["dir", "lang", "textDir"], function(name){
+ if(this[name]){
+ inherited[name] = this[name];
+ }
+ }, this);
+ this.parseResults = parser.parse({
+ rootNode: rootNode,
+ noStart: !this.startup,
+ inherited: inherited,
+ scope: this.parserScope
+ });
+ }catch(e){
+ this._onError('Content', e, "Error parsing in _ContentSetter#"+this.id);
+ }
+ },
+
+ _onError: function(type, err, consoleText){
+ // summary:
+ // shows user the string that is returned by on[type]Error
+ // overide/implement 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
+ dojo.html._setNodeContent(this.node, errText, true);
+ }
+ }
+ }); // end dojo.declare()
+
+ dojo.html.set = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont, /* Object? */ params){
+ // summary:
+ // inserts (replaces) the given content into the given node. dojo.place(cont, node, "only")
+ // may be a better choice for simple HTML insertion.
+ // description:
+ // Unless you need to use the params capabilities of this method, you should use
+ // dojo.place(cont, node, "only"). dojo.place() has more robust support for injecting
+ // an HTML string into the DOM, but it only handles inserting an HTML string as DOM
+ // elements, or inserting a DOM node. dojo.place does not handle NodeList insertions
+ // or the other capabilities as defined by the params object for this method.
+ // node:
+ // the parent element that will receive the content
+ // cont:
+ // the content to be set on the parent element.
+ // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes
+ // params:
+ // Optional flags/properties to configure the content-setting. See dojo.html._ContentSetter
+ // example:
+ // A safe string/node/nodelist content replacement/injection with hooks for extension
+ // Example Usage:
+ // dojo.html.set(node, "some string");
+ // dojo.html.set(node, contentNode, {options});
+ // dojo.html.set(node, myNode.childNodes, {options});
+ if(undefined == cont){
+ console.warn("dojo.html.set: no cont argument provided, using empty string");
+ cont = "";
+ }
+ if(!params){
+ // simple and fast
+ return dojo.html._setNodeContent(node, cont, true);
+ }else{
+ // more options but slower
+ // note the arguments are reversed in order, to match the convention for instantiation via the parser
+ var op = new dojo.html._ContentSetter(lang.mixin(
+ params,
+ { content: cont, node: node }
+ ));
+ return op.set();
+ }
+ };
+
+ return dojo.html;
+});
diff --git a/lib/dojo/i18n.js b/lib/dojo/i18n.js
index 893490fe0..b79ec6c5b 100644
--- a/lib/dojo/i18n.js
+++ b/lib/dojo/i18n.js
@@ -4,259 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.i18n"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.i18n"] = true;
-dojo.provide("dojo.i18n");
-
-dojo.getObject("i18n", true, dojo);
-
-/*=====
-dojo.i18n = {
- // summary: Utility classes to enable loading of resources for internationalization (i18n)
-};
-=====*/
-
-// when using a real AMD loader, dojo.i18n.getLocalization is already defined by dojo/lib/backCompat
-dojo.i18n.getLocalization = dojo.i18n.getLocalization || function(/*String*/packageName, /*String*/bundleName, /*String?*/locale){
- // summary:
- // Returns an Object containing the localization for a given resource
- // bundle in a package, matching the specified locale.
- // description:
- // Returns a hash containing name/value pairs in its prototypesuch
- // that values can be easily overridden. Throws an exception if the
- // bundle is not found. Bundle must have already been loaded by
- // `dojo.requireLocalization()` or by a build optimization step. NOTE:
- // try not to call this method as part of an object property
- // definition (`var foo = { bar: dojo.i18n.getLocalization() }`). In
- // some loading situations, the bundle may not be available in time
- // for the object definition. Instead, call this method inside a
- // function that is run after all modules load or the page loads (like
- // in `dojo.addOnLoad()`), or in a widget lifecycle method.
- // packageName:
- // package which is associated with this resource
- // bundleName:
- // the base filename of the resource bundle (without the ".js" suffix)
- // locale:
- // the variant to load (optional). By default, the locale defined by
- // the host environment: dojo.locale
-
- locale = dojo.i18n.normalizeLocale(locale);
-
- // look for nearest locale match
- var elements = locale.split('-');
- var module = [packageName,"nls",bundleName].join('.');
- var bundle = dojo._loadedModules[module];
- if(bundle){
- var localization;
- for(var i = elements.length; i > 0; i--){
- var loc = elements.slice(0, i).join('_');
- if(bundle[loc]){
- localization = bundle[loc];
- break;
- }
- }
- if(!localization){
- localization = bundle.ROOT;
- }
-
- // make a singleton prototype so that the caller won't accidentally change the values globally
- if(localization){
- var clazz = function(){};
- clazz.prototype = localization;
- return new clazz(); // Object
- }
- }
-
- throw new Error("Bundle not found: " + bundleName + " in " + packageName+" , locale=" + locale);
-};
-
-dojo.i18n.normalizeLocale = function(/*String?*/locale){
- // summary:
- // Returns canonical form of locale, as used by Dojo.
- //
- // description:
- // All variants are case-insensitive and are separated by '-' as specified in [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).
- // If no locale is specified, the dojo.locale is returned. dojo.locale is defined by
- // the user agent's locale unless overridden by djConfig.
-
- var result = locale ? locale.toLowerCase() : dojo.locale;
- if(result == "root"){
- result = "ROOT";
- }
- return result; // String
-};
-
-dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){
- // summary:
- // See dojo.requireLocalization()
- // description:
- // Called by the bootstrap, but factored out so that it is only
- // included in the build when needed.
-
- var targetLocale = dojo.i18n.normalizeLocale(locale);
- var bundlePackage = [moduleName, "nls", bundleName].join(".");
- // NOTE:
- // When loading these resources, the packaging does not match what is
- // on disk. This is an implementation detail, as this is just a
- // private data structure to hold the loaded resources. e.g.
- // `tests/hello/nls/en-us/salutations.js` is loaded as the object
- // `tests.hello.nls.salutations.en_us={...}` The structure on disk is
- // intended to be most convenient for developers and translators, but
- // in memory it is more logical and efficient to store in a different
- // order. Locales cannot use dashes, since the resulting path will
- // not evaluate as valid JS, so we translate them to underscores.
-
- //Find the best-match locale to load if we have available flat locales.
- var bestLocale = "";
- if(availableFlatLocales){
- var flatLocales = availableFlatLocales.split(",");
- for(var i = 0; i < flatLocales.length; i++){
- //Locale must match from start of string.
- //Using ["indexOf"] so customBase builds do not see
- //this as a dojo._base.array dependency.
- if(targetLocale["indexOf"](flatLocales[i]) == 0){
- if(flatLocales[i].length > bestLocale.length){
- bestLocale = flatLocales[i];
- }
- }
- }
- if(!bestLocale){
- bestLocale = "ROOT";
- }
- }
-
- //See if the desired locale is already loaded.
- var tempLocale = availableFlatLocales ? bestLocale : targetLocale;
- var bundle = dojo._loadedModules[bundlePackage];
- var localizedBundle = null;
- if(bundle){
- if(dojo.config.localizationComplete && bundle._built){return;}
- var jsLoc = tempLocale.replace(/-/g, '_');
- var translationPackage = bundlePackage+"."+jsLoc;
- localizedBundle = dojo._loadedModules[translationPackage];
- }
-
- if(!localizedBundle){
- bundle = dojo["provide"](bundlePackage);
- var syms = dojo._getModuleSymbols(moduleName);
- var modpath = syms.concat("nls").join("/");
- var parent;
-
- dojo.i18n._searchLocalePath(tempLocale, availableFlatLocales, function(loc){
- var jsLoc = loc.replace(/-/g, '_');
- var translationPackage = bundlePackage + "." + jsLoc;
- var loaded = false;
- if(!dojo._loadedModules[translationPackage]){
- // Mark loaded whether it's found or not, so that further load attempts will not be made
- dojo["provide"](translationPackage);
- var module = [modpath];
- if(loc != "ROOT"){module.push(loc);}
- module.push(bundleName);
- var filespec = module.join("/") + '.js';
- loaded = dojo._loadPath(filespec, null, function(hash){
- hash = hash.root || hash;
- // Use singleton with prototype to point to parent bundle, then mix-in result from loadPath
- var clazz = function(){};
- clazz.prototype = parent;
- bundle[jsLoc] = new clazz();
- for(var j in hash){ bundle[jsLoc][j] = hash[j]; }
- });
- }else{
- loaded = true;
- }
- if(loaded && bundle[jsLoc]){
- parent = bundle[jsLoc];
- }else{
- bundle[jsLoc] = parent;
- }
-
- if(availableFlatLocales){
- //Stop the locale path searching if we know the availableFlatLocales, since
- //the first call to this function will load the only bundle that is needed.
- return true;
- }
- });
- }
-
- //Save the best locale bundle as the target locale bundle when we know the
- //the available bundles.
- if(availableFlatLocales && targetLocale != bestLocale){
- bundle[targetLocale.replace(/-/g, '_')] = bundle[bestLocale.replace(/-/g, '_')];
- }
-};
-
-(function(){
- // If other locales are used, dojo.requireLocalization should load them as
- // well, by default.
- //
- // Override dojo.requireLocalization to do load the default bundle, then
- // iterate through the extraLocale list and load those translations as
- // well, unless a particular locale was requested.
-
- var extra = dojo.config.extraLocale;
- if(extra){
- if(!extra instanceof Array){
- extra = [extra];
- }
-
- var req = dojo.i18n._requireLocalization;
- dojo.i18n._requireLocalization = function(m, b, locale, availableFlatLocales){
- req(m,b,locale, availableFlatLocales);
- if(locale){return;}
- for(var i=0; i<extra.length; i++){
- req(m,b,extra[i], availableFlatLocales);
- }
- };
- }
-})();
-
-dojo.i18n._searchLocalePath = function(/*String*/locale, /*Boolean*/down, /*Function*/searchFunc){
- // summary:
- // A helper method to assist in searching for locale-based resources.
- // Will iterate through the variants of a particular locale, either up
- // or down, executing a callback function. For example, "en-us" and
- // true will try "en-us" followed by "en" and finally "ROOT".
-
- locale = dojo.i18n.normalizeLocale(locale);
-
- var elements = locale.split('-');
- var searchlist = [];
- for(var i = elements.length; i > 0; i--){
- searchlist.push(elements.slice(0, i).join('-'));
- }
- searchlist.push(false);
- if(down){searchlist.reverse();}
-
- for(var j = searchlist.length - 1; j >= 0; j--){
- var loc = searchlist[j] || "ROOT";
- var stop = searchFunc(loc);
- if(stop){ break; }
- }
-};
-
-dojo.i18n._preloadLocalizations = function(/*String*/bundlePrefix, /*Array*/localesGenerated){
- // summary:
- // Load built, flattened resource bundles, if available for all
- // locales used in the page. Only called by built layer files.
-
- function preload(locale){
- locale = dojo.i18n.normalizeLocale(locale);
- dojo.i18n._searchLocalePath(locale, true, function(loc){
- for(var i=0; i<localesGenerated.length;i++){
- if(localesGenerated[i] == loc){
- dojo["require"](bundlePrefix+"_"+loc);
- return true; // Boolean
- }
- }
- return false; // Boolean
- });
- }
- preload();
- var extra = dojo.config.extraLocale||[];
- for(var i=0; i<extra.length; i++){
- preload(extra[i]);
- }
-};
-
-}
+//>>built
+define("dojo/i18n",["./_base/kernel","require","./has","./_base/array","./_base/config","./_base/lang","./_base/xhr","./json"],function(_1,_2,_3,_4,_5,_6,_7,_8){_3.add("dojo-preload-i18n-Api",1);true||_3.add("dojo-v1x-i18n-Api",1);var _9=_1.i18n={},_a=/(^.*(^|\/)nls)(\/|$)([^\/]*)\/?([^\/]*)/,_b=function(_c,_d,_e,_f){for(var _10=[_e+_f],_11=_d.split("-"),_12="",i=0;i<_11.length;i++){_12+=(_12?"-":"")+_11[i];if(!_c||_c[_12]){_10.push(_e+_12+"/"+_f);}}return _10;},_13={},_14=_1.getL10nName=function(_15,_16,_17){_17=_17?_17.toLowerCase():_1.locale;_15="dojo/i18n!"+_15.replace(/\./g,"/");_16=_16.replace(/\./g,"/");return (/root/i.test(_17))?(_15+"/nls/"+_16):(_15+"/nls/"+_17+"/"+_16);},_18=function(_19,_1a,_1b,_1c,_1d,_1e){_19([_1a],function(_1f){var _20=_6.clone(_1f.root),_21=_b(!_1f._v1x&&_1f,_1d,_1b,_1c);_19(_21,function(){for(var i=1;i<_21.length;i++){_20=_6.mixin(_6.clone(_20),arguments[i]);}var _22=_1a+"/"+_1d;_13[_22]=_20;_1e();});});},_23=function(id,_24){return /^\./.test(id)?_24(id):id;},_25=function(_26){var _27=_5.extraLocale||[];_27=_6.isArray(_27)?_27:[_27];_27.push(_26);return _27;},_28=function(id,_29,_2a){if(_3("dojo-preload-i18n-Api")){var _2b=id.split("*"),_2c=_2b[1]=="preload";if(_2c){if(!_13[id]){_13[id]=1;_2d(_2b[2],_8.parse(_2b[3]),1);}_2a(1);}if(_2c||_2e(id,_29,_2a)){return;}}var _2f=_a.exec(id),_30=_2f[1]+"/",_31=_2f[5]||_2f[4],_32=_30+_31,_33=(_2f[5]&&_2f[4]),_34=_33||_1.locale,_35=_32+"/"+_34,_36=_33?[_34]:_25(_34),_37=_36.length,_38=function(){if(!--_37){_2a(_6.delegate(_13[_35]));}};_4.forEach(_36,function(_39){var _3a=_32+"/"+_39;if(_3("dojo-preload-i18n-Api")){_3b(_3a);}if(!_13[_3a]){_18(_29,_32,_30,_31,_39,_38);}else{_38();}});};if(_3("dojo-unit-tests")){var _3c=_9.unitTests=[];}if(_3("dojo-preload-i18n-Api")||1){var _3d=_9.normalizeLocale=function(_3e){var _3f=_3e?_3e.toLowerCase():_1.locale;return _3f=="root"?"ROOT":_3f;},_40=function(mid){return (1&&1)?_2.isXdUrl(_2.toUrl(mid+".js")):true;},_41=0,_42=[],_2d=_9._preloadLocalizations=function(_43,_44,_45){function _46(_47,_48){var _49=_47.split("-");while(_49.length){if(_48(_49.join("-"))){return true;}_49.pop();}return _48("ROOT");};function _4a(_4b){_4b=_3d(_4b);_46(_4b,function(loc){if(_4.indexOf(_44,loc)>=0){var mid=_43.replace(/\./g,"/")+"_"+loc;_41++;(_40(mid)||_45?_2:_50)([mid],function(_4c){for(var p in _4c){_13[p+"/"+_4b]=_4c[p];}--_41;while(!_41&&_42.length){_28.apply(null,_42.shift());}});return true;}return false;});};_4a();_4.forEach(_1.config.extraLocale,_4a);},_2e=function(id,_4d,_4e){if(_41){_42.push([id,_4d,_4e]);}return _41;};}if(1){var _4f=new Function("__bundle","__checkForLegacyModules","__mid","var define = function(){define.called = 1;},"+" require = function(){define.called = 1;};"+"try{"+"define.called = 0;"+"eval(__bundle);"+"if(define.called==1)"+"return 1;"+"if((__checkForLegacyModules = __checkForLegacyModules(__mid)))"+"return __checkForLegacyModules;"+"}catch(e){}"+"try{"+"return eval('('+__bundle+')');"+"}catch(e){"+"return e;"+"}"),_50=function(_51,_52){var _53=[];_4.forEach(_51,function(mid){var url=_2.toUrl(mid+".js");function _28(_54){var _55=_4f(_54,_3b,mid);if(_55===1){_2([mid],function(_56){_53.push(_13[url]=_56);});}else{if(_55 instanceof Error){console.error("failed to evaluate i18n bundle; url="+url,_55);_55={};}_53.push(_13[url]=(/nls\/[^\/]+\/[^\/]+$/.test(url)?_55:{root:_55,_v1x:1}));}};if(_13[url]){_53.push(_13[url]);}else{var _57=_2.syncLoadNls(mid);if(_57){_53.push(_57);}else{if(!_7){try{_2.getText(url,true,_28);}catch(e){_53.push(_13[url]={});}}else{_7.get({url:url,sync:true,load:_28,error:function(){_53.push(_13[url]={});}});}}}});_52&&_52.apply(null,_53);},_3b=function(_58){for(var _59,_5a=_58.split("/"),_5b=_1.global[_5a[0]],i=1;_5b&&i<_5a.length-1;_5b=_5b[_5a[i++]]){}if(_5b){_59=_5b[_5a[i]];if(!_59){_59=_5b[_5a[i].replace(/-/g,"_")];}if(_59){_13[_58]=_59;}}return _59;};_9.getLocalization=function(_5c,_5d,_5e){var _5f,_60=_14(_5c,_5d,_5e).substring(10);_28(_60,(!_40(_60)?_50:_2),function(_61){_5f=_61;});return _5f;};if(_3("dojo-unit-tests")){_3c.push(function(doh){doh.register("tests.i18n.unit",function(t){var _62;_62=_4f("{prop:1}");t.is({prop:1},_62);t.is(undefined,_62[1]);_62=_4f("({prop:1})");t.is({prop:1},_62);t.is(undefined,_62[1]);_62=_4f("{'prop-x':1}");t.is({"prop-x":1},_62);t.is(undefined,_62[1]);_62=_4f("({'prop-x':1})");t.is({"prop-x":1},_62);t.is(undefined,_62[1]);_62=_4f("define({'prop-x':1})");t.is(1,_62);_62=_4f("this is total nonsense and should throw an error");t.is(_62 instanceof Error,true);});});}}return _6.mixin(_9,{dynamic:true,normalize:_23,load:_28,cache:_13});}); \ No newline at end of file
diff --git a/lib/dojo/i18n.js.uncompressed.js b/lib/dojo/i18n.js.uncompressed.js
new file mode 100644
index 000000000..ebc94c265
--- /dev/null
+++ b/lib/dojo/i18n.js.uncompressed.js
@@ -0,0 +1,514 @@
+define("dojo/i18n", ["./_base/kernel", "require", "./has", "./_base/array", "./_base/config", "./_base/lang", "./_base/xhr", "./json"],
+ function(dojo, require, has, array, config, lang, xhr, json) {
+ // module:
+ // dojo/i18n
+ // summary:
+ // This module implements the !dojo/i18n plugin and the v1.6- i18n API
+ // description:
+ // We choose to include our own plugin to leverage functionality already contained in dojo
+ // and thereby reduce the size of the plugin compared to various loader implementations. Also, this
+ // allows foreign AMD loaders to be used without their plugins.
+
+
+ has.add("dojo-preload-i18n-Api",
+ // if true, define the preload localizations machinery
+ 1
+ );
+
+ true || has.add("dojo-v1x-i18n-Api",
+ // if true, define the v1.x i18n functions
+ 1
+ );
+
+ var
+ thisModule= dojo.i18n=
+ // the dojo.i18n module
+ {},
+
+ nlsRe=
+ // regexp for reconstructing the master bundle name from parts of the regexp match
+ // nlsRe.exec("foo/bar/baz/nls/en-ca/foo") gives:
+ // ["foo/bar/baz/nls/en-ca/foo", "foo/bar/baz/nls/", "/", "/", "en-ca", "foo"]
+ // nlsRe.exec("foo/bar/baz/nls/foo") gives:
+ // ["foo/bar/baz/nls/foo", "foo/bar/baz/nls/", "/", "/", "foo", ""]
+ // so, if match[5] is blank, it means this is the top bundle definition.
+ // courtesy of http://requirejs.org
+ /(^.*(^|\/)nls)(\/|$)([^\/]*)\/?([^\/]*)/,
+
+ getAvailableLocales= function(
+ root,
+ locale,
+ bundlePath,
+ bundleName
+ ){
+ // return a vector of module ids containing all available locales with respect to the target locale
+ // For example, assuming:
+ // * the root bundle indicates specific bundles for "fr" and "fr-ca",
+ // * bundlePath is "myPackage/nls"
+ // * bundleName is "myBundle"
+ // Then a locale argument of "fr-ca" would return
+ // ["myPackage/nls/myBundle", "myPackage/nls/fr/myBundle", "myPackage/nls/fr-ca/myBundle"]
+ // Notice that bundles are returned least-specific to most-specific, starting with the root.
+ //
+ // If root===false indicates we're working with a pre-AMD i18n bundle that doesn't tell about the available locales;
+ // therefore, assume everything is available and get 404 errors that indicate a particular localization is not available
+ //
+
+ for(var result= [bundlePath + bundleName], localeParts= locale.split("-"), current= "", i= 0; i<localeParts.length; i++){
+ current+= (current ? "-" : "") + localeParts[i];
+ if(!root || root[current]){
+ result.push(bundlePath + current + "/" + bundleName);
+ }
+ }
+ return result;
+ },
+
+ cache= {},
+
+ getL10nName= dojo.getL10nName = function(moduleName, bundleName, locale){
+ locale = locale ? locale.toLowerCase() : dojo.locale;
+ moduleName = "dojo/i18n!" + moduleName.replace(/\./g, "/");
+ bundleName = bundleName.replace(/\./g, "/");
+ return (/root/i.test(locale)) ?
+ (moduleName + "/nls/" + bundleName) :
+ (moduleName + "/nls/" + locale + "/" + bundleName);
+ },
+
+ doLoad = function(require, bundlePathAndName, bundlePath, bundleName, locale, load){
+ // get the root bundle which instructs which other bundles are required to construct the localized bundle
+ require([bundlePathAndName], function(root){
+ var current= lang.clone(root.root),
+ availableLocales= getAvailableLocales(!root._v1x && root, locale, bundlePath, bundleName);
+ require(availableLocales, function(){
+ for (var i= 1; i<availableLocales.length; i++){
+ current= lang.mixin(lang.clone(current), arguments[i]);
+ }
+ // target may not have been resolve (e.g., maybe only "fr" exists when "fr-ca" was requested)
+ var target= bundlePathAndName + "/" + locale;
+ cache[target]= current;
+ load();
+ });
+ });
+ },
+
+ normalize = function(id, toAbsMid){
+ // id may be relative
+ // preload has form *preload*<path>/nls/<module>*<flattened locales> and
+ // therefore never looks like a relative
+ return /^\./.test(id) ? toAbsMid(id) : id;
+ },
+
+ getLocalesToLoad = function(targetLocale){
+ var list = config.extraLocale || [];
+ list = lang.isArray(list) ? list : [list];
+ list.push(targetLocale);
+ return list;
+ },
+
+ load = function(id, require, load){
+ //
+ // id is in one of the following formats
+ //
+ // 1. <path>/nls/<bundle>
+ // => load the bundle, localized to config.locale; load all bundles localized to
+ // config.extraLocale (if any); return the loaded bundle localized to config.locale.
+ //
+ // 2. <path>/nls/<locale>/<bundle>
+ // => load then return the bundle localized to <locale>
+ //
+ // 3. *preload*<path>/nls/<module>*<JSON array of available locales>
+ // => for config.locale and all config.extraLocale, load all bundles found
+ // in the best-matching bundle rollup. A value of 1 is returned, which
+ // is meaningless other than to say the plugin is executing the requested
+ // preloads
+ //
+ // In cases 1 and 2, <path> is always normalized to an absolute module id upon entry; see
+ // normalize. In case 3, it <path> is assumed to be absolue; this is arranged by the builder.
+ //
+ // To load a bundle means to insert the bundle into the plugin's cache and publish the bundle
+ // value to the loader. Given <path>, <bundle>, and a particular <locale>, the cache key
+ //
+ // <path>/nls/<bundle>/<locale>
+ //
+ // will hold the value. Similarly, then plugin will publish this value to the loader by
+ //
+ // define("<path>/nls/<bundle>/<locale>", <bundle-value>);
+ //
+ // Given this algorithm, other machinery can provide fast load paths be preplacing
+ // values in the plugin's cache, which is public. When a load is demanded the
+ // cache is inspected before starting any loading. Explicitly placing values in the plugin
+ // cache is an advanced/experimental feature that should not be needed; use at your own risk.
+ //
+ // For the normal AMD algorithm, the root bundle is loaded first, which instructs the
+ // plugin what additional localized bundles are required for a particular locale. These
+ // additional locales are loaded and a mix of the root and each progressively-specific
+ // locale is returned. For example:
+ //
+ // 1. The client demands "dojo/i18n!some/path/nls/someBundle
+ //
+ // 2. The loader demands load(some/path/nls/someBundle)
+ //
+ // 3. This plugin require's "some/path/nls/someBundle", which is the root bundle.
+ //
+ // 4. Assuming config.locale is "ab-cd-ef" and the root bundle indicates that localizations
+ // are available for "ab" and "ab-cd-ef" (note the missing "ab-cd", then the plugin
+ // requires "some/path/nls/ab/someBundle" and "some/path/nls/ab-cd-ef/someBundle"
+ //
+ // 5. Upon receiving all required bundles, the plugin constructs the value of the bundle
+ // ab-cd-ef as...
+ //
+ // mixin(mixin(mixin({}, require("some/path/nls/someBundle"),
+ // require("some/path/nls/ab/someBundle")),
+ // require("some/path/nls/ab-cd-ef/someBundle"));
+ //
+ // This value is inserted into the cache and published to the loader at the
+ // key/module-id some/path/nls/someBundle/ab-cd-ef.
+ //
+ // The special preload signature (case 3) instructs the plugin to stop servicing all normal requests
+ // (further preload requests will be serviced) until all ongoing preloading has completed.
+ //
+ // The preload signature instructs the plugin that a special rollup module is available that contains
+ // one or more flattened, localized bundles. The JSON array of available locales indicates which locales
+ // are available. Here is an example:
+ //
+ // *preload*some/path/nls/someModule*["root", "ab", "ab-cd-ef"]
+ //
+ // This indicates the following rollup modules are available:
+ //
+ // some/path/nls/someModule_ROOT
+ // some/path/nls/someModule_ab
+ // some/path/nls/someModule_ab-cd-ef
+ //
+ // Each of these modules is a normal AMD module that contains one or more flattened bundles in a hash.
+ // For example, assume someModule contained the bundles some/bundle/path/someBundle and
+ // some/bundle/path/someOtherBundle, then some/path/nls/someModule_ab would be expressed as folllows:
+ //
+ // define({
+ // some/bundle/path/someBundle:<value of someBundle, flattened with respect to locale ab>,
+ // some/bundle/path/someOtherBundle:<value of someOtherBundle, flattened with respect to locale ab>,
+ // });
+ //
+ // E.g., given this design, preloading for locale=="ab" can execute the following algorithm:
+ //
+ // require(["some/path/nls/someModule_ab"], function(rollup){
+ // for(var p in rollup){
+ // var id = p + "/ab",
+ // cache[id] = rollup[p];
+ // define(id, rollup[p]);
+ // }
+ // });
+ //
+ // Similarly, if "ab-cd" is requested, the algorithm can determine that "ab" is the best available and
+ // load accordingly.
+ //
+ // The builder will write such rollups for every layer if a non-empty localeList profile property is
+ // provided. Further, the builder will include the following cache entry in the cache associated with
+ // any layer.
+ //
+ // "*now":function(r){r(['dojo/i18n!*preload*<path>/nls/<module>*<JSON array of available locales>']);}
+ //
+ // The *now special cache module instructs the loader to apply the provided function to context-require
+ // with respect to the particular layer being defined. This causes the plugin to hold all normal service
+ // requests until all preloading is complete.
+ //
+ // Notice that this algorithm is rarely better than the standard AMD load algorithm. Consider the normal case
+ // where the target locale has a single segment and a layer depends on a single bundle:
+ //
+ // Without Preloads:
+ //
+ // 1. Layer loads root bundle.
+ // 2. bundle is demanded; plugin loads single localized bundle.
+ //
+ // With Preloads:
+ //
+ // 1. Layer causes preloading of target bundle.
+ // 2. bundle is demanded; service is delayed until preloading complete; bundle is returned.
+ //
+ // In each case a single transaction is required to load the target bundle. In cases where multiple bundles
+ // are required and/or the locale has multiple segments, preloads still requires a single transaction whereas
+ // the normal path requires an additional transaction for each additional bundle/locale-segment. However all
+ // of these additional transactions can be done concurrently. Owing to this analysis, the entire preloading
+ // algorithm can be discard during a build by setting the has feature dojo-preload-i18n-Api to false.
+ //
+ if(has("dojo-preload-i18n-Api")){
+ var split = id.split("*"),
+ preloadDemand = split[1]=="preload";
+ if(preloadDemand){
+ if(!cache[id]){
+ // use cache[id] to prevent multiple preloads of the same preload; this shouldn't happen, but
+ // who knows what over-aggressive human optimizers may attempt
+ cache[id] = 1;
+ preloadL10n(split[2], json.parse(split[3]), 1);
+ }
+ // don't stall the loader!
+ load(1);
+ }
+ if(preloadDemand || waitForPreloads(id, require, load)){
+ return;
+ }
+ }
+
+ var match= nlsRe.exec(id),
+ bundlePath= match[1] + "/",
+ bundleName= match[5] || match[4],
+ bundlePathAndName= bundlePath + bundleName,
+ localeSpecified = (match[5] && match[4]),
+ targetLocale= localeSpecified || dojo.locale,
+ loadTarget= bundlePathAndName + "/" + targetLocale,
+ loadList = localeSpecified ? [targetLocale] : getLocalesToLoad(targetLocale),
+ remaining = loadList.length,
+ finish = function(){
+ if(!--remaining){
+ load(lang.delegate(cache[loadTarget]));
+ }
+ };
+ array.forEach(loadList, function(locale){
+ var target = bundlePathAndName + "/" + locale;
+ if(has("dojo-preload-i18n-Api")){
+ checkForLegacyModules(target);
+ }
+ if(!cache[target]){
+ doLoad(require, bundlePathAndName, bundlePath, bundleName, locale, finish);
+ }else{
+ finish();
+ }
+ });
+ };
+
+ if(has("dojo-unit-tests")){
+ var unitTests = thisModule.unitTests = [];
+ }
+
+ if(has("dojo-preload-i18n-Api") || 1){
+ var normalizeLocale = thisModule.normalizeLocale= function(locale){
+ var result = locale ? locale.toLowerCase() : dojo.locale;
+ return result == "root" ? "ROOT" : result;
+ },
+
+ isXd = function(mid){
+ return (1 && 1) ?
+ require.isXdUrl(require.toUrl(mid + ".js")) :
+ true;
+ },
+
+ preloading = 0,
+
+ preloadWaitQueue = [],
+
+ preloadL10n = thisModule._preloadLocalizations = function(/*String*/bundlePrefix, /*Array*/localesGenerated, /*boolean*/ guaranteedAmdFormat){
+ // summary:
+ // Load available flattened resource bundles associated with a particular module for dojo.locale and all dojo.config.extraLocale (if any)
+ //
+ // descirption:
+ // Only called by built layer files. The entire locale hierarchy is loaded. For example,
+ // if locale=="ab-cd", then ROOT, "ab", and "ab-cd" are loaded. This is different than v1.6-
+ // in that the v1.6- would lonly load ab-cd...which was *always* flattened.
+ //
+ // If guaranteedAmdFormat is true, then the module can be loaded with require thereby circumventing the detection algorithm
+ // and the extra possible extra transaction.
+ //
+
+ function forEachLocale(locale, func){
+ // given locale= "ab-cd-ef", calls func on "ab-cd-ef", "ab-cd", "ab", "ROOT"; stops calling the first time func returns truthy
+ var parts = locale.split("-");
+ while(parts.length){
+ if(func(parts.join("-"))){
+ return true;
+ }
+ parts.pop();
+ }
+ return func("ROOT");
+ }
+
+ function preload(locale){
+ locale = normalizeLocale(locale);
+ forEachLocale(locale, function(loc){
+ if(array.indexOf(localesGenerated, loc)>=0){
+ var mid = bundlePrefix.replace(/\./g, "/")+"_"+loc;
+ preloading++;
+ (isXd(mid) || guaranteedAmdFormat ? require : syncRequire)([mid], function(rollup){
+ for(var p in rollup){
+ cache[p + "/" + locale] = rollup[p];
+ }
+ --preloading;
+ while(!preloading && preloadWaitQueue.length){
+ load.apply(null, preloadWaitQueue.shift());
+ }
+ });
+ return true;
+ }
+ return false;
+ });
+ }
+
+ preload();
+ array.forEach(dojo.config.extraLocale, preload);
+ },
+
+ waitForPreloads = function(id, require, load){
+ if(preloading){
+ preloadWaitQueue.push([id, require, load]);
+ }
+ return preloading;
+ };
+ }
+
+ if(1){
+ // this code path assumes the dojo loader and won't work with a standard AMD loader
+ var evalBundle=
+ // use the function ctor to keep the minifiers away (also come close to global scope, but this is secondary)
+ new Function(
+ "__bundle", // the bundle to evalutate
+ "__checkForLegacyModules", // a function that checks if __bundle defined __mid in the global space
+ "__mid", // the mid that __bundle is intended to define
+
+ // returns one of:
+ // 1 => the bundle was an AMD bundle
+ // a legacy bundle object that is the value of __mid
+ // instance of Error => could not figure out how to evaluate bundle
+
+ // used to detect when __bundle calls define
+ "var define = function(){define.called = 1;},"
+ + " require = function(){define.called = 1;};"
+
+ + "try{"
+ + "define.called = 0;"
+ + "eval(__bundle);"
+ + "if(define.called==1)"
+ // bundle called define; therefore signal it's an AMD bundle
+ + "return 1;"
+
+ + "if((__checkForLegacyModules = __checkForLegacyModules(__mid)))"
+ // bundle was probably a v1.6- built NLS flattened NLS bundle that defined __mid in the global space
+ + "return __checkForLegacyModules;"
+
+ + "}catch(e){}"
+ // evaulating the bundle was *neither* an AMD *nor* a legacy flattened bundle
+ // either way, re-eval *after* surrounding with parentheses
+
+ + "try{"
+ + "return eval('('+__bundle+')');"
+ + "}catch(e){"
+ + "return e;"
+ + "}"
+ ),
+
+ syncRequire= function(deps, callback){
+ var results= [];
+ array.forEach(deps, function(mid){
+ var url= require.toUrl(mid + ".js");
+
+ function load(text){
+ var result = evalBundle(text, checkForLegacyModules, mid);
+ if(result===1){
+ // the bundle was an AMD module; re-inject it through the normal AMD path
+ // we gotta do this since it could be an anonymous module and simply evaluating
+ // the text here won't provide the loader with the context to know what
+ // module is being defined()'d. With browser caching, this should be free; further
+ // this entire code path can be circumvented by using the AMD format to begin with
+ require([mid], function(bundle){
+ results.push(cache[url]= bundle);
+ });
+ }else{
+ if(result instanceof Error){
+ console.error("failed to evaluate i18n bundle; url=" + url, result);
+ result = {};
+ }
+ // nls/<locale>/<bundle-name> indicates not the root.
+ results.push(cache[url] = (/nls\/[^\/]+\/[^\/]+$/.test(url) ? result : {root:result, _v1x:1}));
+ }
+ }
+
+ if(cache[url]){
+ results.push(cache[url]);
+ }else{
+ var bundle= require.syncLoadNls(mid);
+ // don't need to check for legacy since syncLoadNls returns a module if the module
+ // (1) was already loaded, or (2) was in the cache. In case 1, if syncRequire is called
+ // from getLocalization --> load, then load will have called checkForLegacyModules() before
+ // calling syncRequire; if syncRequire is called from preloadLocalizations, then we
+ // don't care about checkForLegacyModules() because that will be done when a particular
+ // bundle is actually demanded. In case 2, checkForLegacyModules() is never relevant
+ // because cached modules are always v1.7+ built modules.
+ if(bundle){
+ results.push(bundle);
+ }else{
+ if(!xhr){
+ try{
+ require.getText(url, true, load);
+ }catch(e){
+ results.push(cache[url]= {});
+ }
+ }else{
+ xhr.get({
+ url:url,
+ sync:true,
+ load:load,
+ error:function(){
+ results.push(cache[url]= {});
+ }
+ });
+ }
+ }
+ }
+ });
+ callback && callback.apply(null, results);
+ },
+
+ checkForLegacyModules = function(target){
+ // legacy code may have already loaded [e.g] the raw bundle x/y/z at x.y.z; when true, push into the cache
+ for(var result, names = target.split("/"), object = dojo.global[names[0]], i = 1; object && i<names.length-1; object = object[names[i++]]){}
+ if(object){
+ result = object[names[i]];
+ if(!result){
+ // fallback for incorrect bundle build of 1.6
+ result = object[names[i].replace(/-/g,"_")];
+ }
+ if(result){
+ cache[target] = result;
+ }
+ }
+ return result;
+ };
+
+ thisModule.getLocalization= function(moduleName, bundleName, locale){
+ var result,
+ l10nName= getL10nName(moduleName, bundleName, locale).substring(10);
+ load(l10nName, (!isXd(l10nName) ? syncRequire : require), function(result_){ result= result_; });
+ return result;
+ };
+
+ if(has("dojo-unit-tests")){
+ unitTests.push(function(doh){
+ doh.register("tests.i18n.unit", function(t){
+ var check;
+
+ check = evalBundle("{prop:1}");
+ t.is({prop:1}, check); t.is(undefined, check[1]);
+
+ check = evalBundle("({prop:1})");
+ t.is({prop:1}, check); t.is(undefined, check[1]);
+
+ check = evalBundle("{'prop-x':1}");
+ t.is({'prop-x':1}, check); t.is(undefined, check[1]);
+
+ check = evalBundle("({'prop-x':1})");
+ t.is({'prop-x':1}, check); t.is(undefined, check[1]);
+
+ check = evalBundle("define({'prop-x':1})");
+ t.is(1, check);
+
+ check = evalBundle("this is total nonsense and should throw an error");
+ t.is(check instanceof Error, true);
+ });
+ });
+ }
+ }
+
+ return lang.mixin(thisModule, {
+ dynamic:true,
+ normalize:normalize,
+ load:load,
+ cache:cache
+ });
+});
diff --git a/lib/dojo/io-query.js b/lib/dojo/io-query.js
new file mode 100644
index 000000000..91f2e74dd
--- /dev/null
+++ b/lib/dojo/io-query.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/io-query",["./_base/lang"],function(_1){var _2={};function _3(_4){var _5=encodeURIComponent,_6=[];for(var _7 in _4){var _8=_4[_7];if(_8!=_2[_7]){var _9=_5(_7)+"=";if(_1.isArray(_8)){for(var i=0,l=_8.length;i<l;++i){_6.push(_9+_5(_8[i]));}}else{_6.push(_9+_5(_8));}}}return _6.join("&");};function _a(_b){var _c=decodeURIComponent,qp=_b.split("&"),_d={},_e,_f;for(var i=0,l=qp.length,_10;i<l;++i){_10=qp[i];if(_10.length){var s=_10.indexOf("=");if(s<0){_e=_c(_10);_f="";}else{_e=_c(_10.slice(0,s));_f=_c(_10.slice(s+1));}if(typeof _d[_e]=="string"){_d[_e]=[_d[_e]];}if(_1.isArray(_d[_e])){_d[_e].push(_f);}else{_d[_e]=_f;}}}return _d;};return {objectToQuery:_3,queryToObject:_a};}); \ No newline at end of file
diff --git a/lib/dojo/io-query.js.uncompressed.js b/lib/dojo/io-query.js.uncompressed.js
new file mode 100644
index 000000000..a5799bfc2
--- /dev/null
+++ b/lib/dojo/io-query.js.uncompressed.js
@@ -0,0 +1,98 @@
+define("dojo/io-query", ["./_base/lang"], function(lang){
+ // module:
+ // dojo/io-query
+ // summary:
+ // This module defines query string processing functions.
+
+ var backstop = {};
+
+ function objectToQuery(/*Object*/ map){
+ // summary:
+ // takes a name/value mapping object and returns a string representing
+ // a URL-encoded version of that object.
+ // example:
+ // this object:
+ //
+ // | {
+ // | blah: "blah",
+ // | multi: [
+ // | "thud",
+ // | "thonk"
+ // | ]
+ // | };
+ //
+ // yields the following query string:
+ //
+ // | "blah=blah&multi=thud&multi=thonk"
+
+ // FIXME: need to implement encodeAscii!!
+ var enc = encodeURIComponent, pairs = [];
+ for(var name in map){
+ var value = map[name];
+ if(value != backstop[name]){
+ var assign = enc(name) + "=";
+ if(lang.isArray(value)){
+ for(var i = 0, l = value.length; i < l; ++i){
+ pairs.push(assign + enc(value[i]));
+ }
+ }else{
+ pairs.push(assign + enc(value));
+ }
+ }
+ }
+ return pairs.join("&"); // String
+ }
+
+ function queryToObject(/*String*/ str){
+ // summary:
+ // Create an object representing a de-serialized query section of a
+ // URL. Query keys with multiple values are returned in an array.
+ //
+ // example:
+ // This string:
+ //
+ // | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&"
+ //
+ // results in this object structure:
+ //
+ // | {
+ // | foo: [ "bar", "baz" ],
+ // | thinger: " spaces =blah",
+ // | zonk: "blarg"
+ // | }
+ //
+ // Note that spaces and other urlencoded entities are correctly
+ // handled.
+
+ // FIXME: should we grab the URL string if we're not passed one?
+ var dec = decodeURIComponent, qp = str.split("&"), ret = {}, name, val;
+ for(var i = 0, l = qp.length, item; i < l; ++i){
+ item = qp[i];
+ if(item.length){
+ var s = item.indexOf("=");
+ if(s < 0){
+ name = dec(item);
+ val = "";
+ }else{
+ name = dec(item.slice(0, s));
+ val = dec(item.slice(s + 1));
+ }
+ if(typeof ret[name] == "string"){ // inline'd type check
+ ret[name] = [ret[name]];
+ }
+
+ if(lang.isArray(ret[name])){
+ ret[name].push(val);
+ }else{
+ ret[name] = val;
+ }
+ }
+ }
+ return ret; // Object
+ }
+
+ return {
+ objectToQuery: objectToQuery,
+ queryToObject: queryToObject
+ };
+}); \ No newline at end of file
diff --git a/lib/dojo/io/iframe.js b/lib/dojo/io/iframe.js
index aa8ddf290..9db3fbcfc 100644
--- a/lib/dojo/io/iframe.js
+++ b/lib/dojo/io/iframe.js
@@ -4,380 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.io.iframe"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.io.iframe"] = true;
-dojo.provide("dojo.io.iframe");
-
-dojo.getObject("io", true, dojo);
-
-/*=====
-dojo.declare("dojo.io.iframe.__ioArgs", dojo.__IoArgs, {
- constructor: function(){
- // summary:
- // All the properties described in the dojo.__ioArgs type, apply
- // to this type. The following additional properties are allowed
- // for dojo.io.iframe.send():
- // method: String?
- // The HTTP method to use. "GET" or "POST" are the only supported
- // values. It will try to read the value from the form node's
- // method, then try this argument. If neither one exists, then it
- // defaults to POST.
- // handleAs: String?
- // Specifies what format the result data should be given to the
- // load/handle callback. Valid values are: text, html, xml, json,
- // javascript. IMPORTANT: For all values EXCEPT html and xml, The
- // server response should be an HTML file with a textarea element.
- // The response data should be inside the textarea element. Using an
- // HTML document the only reliable, cross-browser way this
- // transport can know when the response has loaded. For the html
- // handleAs value, just return a normal HTML document. NOTE: xml
- // is now supported with this transport (as of 1.1+); a known issue
- // is if the XML document in question is malformed, Internet Explorer
- // will throw an uncatchable error.
- // content: Object?
- // If "form" is one of the other args properties, then the content
- // object properties become hidden form form elements. For
- // instance, a content object of {name1 : "value1"} is converted
- // to a hidden form element with a name of "name1" and a value of
- // "value1". If there is not a "form" property, then the content
- // object is converted into a name=value&name=value string, by
- // using dojo.objectToQuery().
- this.method = method;
- this.handleAs = handleAs;
- this.content = content;
- }
-});
-=====*/
-
-dojo.io.iframe = {
- // summary:
- // Sends an Ajax I/O call using and Iframe (for instance, to upload files)
-
- create: function(/*String*/fname, /*String*/onloadstr, /*String?*/uri){
- // summary:
- // Creates a hidden iframe in the page. Used mostly for IO
- // transports. You do not need to call this to start a
- // dojo.io.iframe request. Just call send().
- // fname: String
- // The name of the iframe. Used for the name attribute on the
- // iframe.
- // onloadstr: String
- // A string of JavaScript that will be executed when the content
- // in the iframe loads.
- // uri: String
- // The value of the src attribute on the iframe element. If a
- // value is not given, then dojo/resources/blank.html will be
- // used.
- if(window[fname]){ return window[fname]; }
- if(window.frames[fname]){ return window.frames[fname]; }
- var cframe = null;
- var turi = uri;
- if(!turi){
- if(dojo.config["useXDomain"] && !dojo.config["dojoBlankHtmlUrl"]){
- console.warn("dojo.io.iframe.create: When using cross-domain Dojo builds,"
- + " please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl"
- + " to the path on your domain to blank.html");
- }
- turi = (dojo.config["dojoBlankHtmlUrl"]||dojo.moduleUrl("dojo", "resources/blank.html"));
- }
- var cframe = dojo.place(
- '<iframe id="'+fname+'" name="'+fname+'" src="'+turi+'" onload="'+onloadstr+
- '" style="position: absolute; left: 1px; top: 1px; height: 1px; width: 1px; visibility: hidden">',
- dojo.body());
-
- window[fname] = cframe;
-
- return cframe;
- },
-
- setSrc: function(/*DOMNode*/iframe, /*String*/src, /*Boolean*/replace){
- //summary:
- // Sets the URL that is loaded in an IFrame. The replace parameter
- // indicates whether location.replace() should be used when
- // changing the location of the iframe.
- try{
- if(!replace){
- if(dojo.isWebKit){
- iframe.location = src;
- }else{
- frames[iframe.name].location = src;
- }
- }else{
- // Fun with DOM 0 incompatibilities!
- var idoc;
- if(dojo.isIE || dojo.isWebKit){
- idoc = iframe.contentWindow.document;
- }else{ // if(d.isMozilla){
- idoc = iframe.contentWindow;
- }
-
- //For Safari (at least 2.0.3) and Opera, if the iframe
- //has just been created but it doesn't have content
- //yet, then iframe.document may be null. In that case,
- //use iframe.location and return.
- if(!idoc){
- iframe.location = src;
- return;
- }else{
- idoc.location.replace(src);
- }
- }
- }catch(e){
- console.log("dojo.io.iframe.setSrc: ", e);
- }
- },
-
- doc: function(/*DOMNode*/iframeNode){
- //summary: Returns the document object associated with the iframe DOM Node argument.
- var doc = iframeNode.contentDocument || // W3
- (
- (
- (iframeNode.name) && (iframeNode.document) &&
- (dojo.doc.getElementsByTagName("iframe")[iframeNode.name].contentWindow) &&
- (dojo.doc.getElementsByTagName("iframe")[iframeNode.name].contentWindow.document)
- )
- ) || // IE
- (
- (iframeNode.name)&&(dojo.doc.frames[iframeNode.name])&&
- (dojo.doc.frames[iframeNode.name].document)
- ) || null;
- return doc;
- },
-
- send: function(/*dojo.io.iframe.__ioArgs*/args){
- //summary:
- // Function that sends the request to the server.
- // This transport can only process one send() request at a time, so if send() is called
- //multiple times, it will queue up the calls and only process one at a time.
- if(!this["_frame"]){
- this._frame = this.create(this._iframeName, dojo._scopeName + ".io.iframe._iframeOnload();");
- }
-
- //Set up the deferred.
- var dfd = dojo._ioSetArgs(
- args,
- function(/*Deferred*/dfd){
- //summary: canceller function for dojo._ioSetArgs call.
- dfd.canceled = true;
- dfd.ioArgs._callNext();
- },
- function(/*Deferred*/dfd){
- //summary: okHandler function for dojo._ioSetArgs call.
- var value = null;
- try{
- var ioArgs = dfd.ioArgs;
- var dii = dojo.io.iframe;
- var ifd = dii.doc(dii._frame);
- var handleAs = ioArgs.handleAs;
-
- //Assign correct value based on handleAs value.
- value = ifd; //html
- if(handleAs != "html"){
- if(handleAs == "xml"){
- // FF, Saf 3+ and Opera all seem to be fine with ifd being xml. We have to
- // do it manually for IE6-8. Refs #6334.
- if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){
- dojo.query("a", dii._frame.contentWindow.document.documentElement).orphan();
- var xmlText=(dii._frame.contentWindow.document).documentElement.innerText;
- xmlText=xmlText.replace(/>\s+</g, "><");
- xmlText=dojo.trim(xmlText);
- //Reusing some code in base dojo for handling XML content. Simpler and keeps
- //Core from duplicating the effort needed to locate the XML Parser on IE.
- var fauxXhr = { responseText: xmlText };
- value = dojo._contentHandlers["xml"](fauxXhr); // DOMDocument
- }
- }else{
- value = ifd.getElementsByTagName("textarea")[0].value; //text
- if(handleAs == "json"){
- value = dojo.fromJson(value); //json
- }else if(handleAs == "javascript"){
- value = dojo.eval(value); //javascript
- }
- }
- }
- }catch(e){
- value = e;
- }finally{
- ioArgs._callNext();
- }
- return value;
- },
- function(/*Error*/error, /*Deferred*/dfd){
- //summary: errHandler function for dojo._ioSetArgs call.
- dfd.ioArgs._hasError = true;
- dfd.ioArgs._callNext();
- return error;
- }
- );
-
- //Set up a function that will fire the next iframe request. Make sure it only
- //happens once per deferred.
- dfd.ioArgs._callNext = function(){
- if(!this["_calledNext"]){
- this._calledNext = true;
- dojo.io.iframe._currentDfd = null;
- dojo.io.iframe._fireNextRequest();
- }
- };
-
- this._dfdQueue.push(dfd);
- this._fireNextRequest();
-
- //Add it the IO watch queue, to get things like timeout support.
- dojo._ioWatch(
- dfd,
- function(/*Deferred*/dfd){
- //validCheck
- return !dfd.ioArgs["_hasError"];
- },
- function(dfd){
- //ioCheck
- return (!!dfd.ioArgs["_finished"]);
- },
- function(dfd){
- //resHandle
- if(dfd.ioArgs._finished){
- dfd.callback(dfd);
- }else{
- dfd.errback(new Error("Invalid dojo.io.iframe request state"));
- }
- }
- );
-
- return dfd;
- },
-
- _currentDfd: null,
- _dfdQueue: [],
- _iframeName: dojo._scopeName + "IoIframe",
-
- _fireNextRequest: function(){
- //summary: Internal method used to fire the next request in the bind queue.
- try{
- if((this._currentDfd)||(this._dfdQueue.length == 0)){ return; }
- //Find next deferred, skip the canceled ones.
- do{
- var dfd = this._currentDfd = this._dfdQueue.shift();
- } while(dfd && dfd.canceled && this._dfdQueue.length);
-
- //If no more dfds, cancel.
- if(!dfd || dfd.canceled){
- this._currentDfd = null;
- return;
- }
-
- var ioArgs = dfd.ioArgs;
- var args = ioArgs.args;
-
- ioArgs._contentToClean = [];
- var fn = dojo.byId(args["form"]);
- var content = args["content"] || {};
- if(fn){
- if(content){
- // if we have things in content, we need to add them to the form
- // before submission
- var pHandler = function(name, value) {
- dojo.create("input", {type: "hidden", name: name, value: value}, fn);
- ioArgs._contentToClean.push(name);
- };
- for(var x in content){
- var val = content[x];
- if(dojo.isArray(val) && val.length > 1){
- var i;
- for (i = 0; i < val.length; i++) {
- pHandler(x,val[i]);
- }
- }else{
- if(!fn[x]){
- pHandler(x,val);
- }else{
- fn[x].value = val;
- }
- }
- }
- }
- //IE requires going through getAttributeNode instead of just getAttribute in some form cases,
- //so use it for all. See #2844
- var actnNode = fn.getAttributeNode("action");
- var mthdNode = fn.getAttributeNode("method");
- var trgtNode = fn.getAttributeNode("target");
- if(args["url"]){
- ioArgs._originalAction = actnNode ? actnNode.value : null;
- if(actnNode){
- actnNode.value = args.url;
- }else{
- fn.setAttribute("action",args.url);
- }
- }
- if(!mthdNode || !mthdNode.value){
- if(mthdNode){
- mthdNode.value= (args["method"]) ? args["method"] : "post";
- }else{
- fn.setAttribute("method", (args["method"]) ? args["method"] : "post");
- }
- }
- ioArgs._originalTarget = trgtNode ? trgtNode.value: null;
- if(trgtNode){
- trgtNode.value = this._iframeName;
- }else{
- fn.setAttribute("target", this._iframeName);
- }
- fn.target = this._iframeName;
- dojo._ioNotifyStart(dfd);
- fn.submit();
- }else{
- // otherwise we post a GET string by changing URL location for the
- // iframe
- var tmpUrl = args.url + (args.url.indexOf("?") > -1 ? "&" : "?") + ioArgs.query;
- dojo._ioNotifyStart(dfd);
- this.setSrc(this._frame, tmpUrl, true);
- }
- }catch(e){
- dfd.errback(e);
- }
- },
-
- _iframeOnload: function(){
- var dfd = this._currentDfd;
- if(!dfd){
- this._fireNextRequest();
- return;
- }
-
- var ioArgs = dfd.ioArgs;
- var args = ioArgs.args;
- var fNode = dojo.byId(args.form);
-
- if(fNode){
- // remove all the hidden content inputs
- var toClean = ioArgs._contentToClean;
- for(var i = 0; i < toClean.length; i++) {
- var key = toClean[i];
- //Need to cycle over all nodes since we may have added
- //an array value which means that more than one node could
- //have the same .name value.
- for(var j = 0; j < fNode.childNodes.length; j++){
- var chNode = fNode.childNodes[j];
- if(chNode.name == key){
- dojo.destroy(chNode);
- break;
- }
- }
- }
-
- // restore original action + target
- if(ioArgs["_originalAction"]){
- fNode.setAttribute("action", ioArgs._originalAction);
- }
- if(ioArgs["_originalTarget"]){
- fNode.setAttribute("target", ioArgs._originalTarget);
- fNode.target = ioArgs._originalTarget;
- }
- }
-
- ioArgs._finished = true;
- }
-};
-
-}
+//>>built
+define("dojo/io/iframe",["../main","require"],function(_1,_2){_1.getObject("io",true,_1);_1.io.iframe={create:function(_3,_4,_5){if(window[_3]){return window[_3];}if(window.frames[_3]){return window.frames[_3];}var _6=_5;if(!_6){if(_1.config["useXDomain"]&&!_1.config["dojoBlankHtmlUrl"]){console.warn("dojo.io.iframe.create: When using cross-domain Dojo builds,"+" please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl"+" to the path on your domain to blank.html");}_6=(_1.config["dojoBlankHtmlUrl"]||_2.toUrl("../resources/blank.html"));}var _7=_1.place("<iframe id=\""+_3+"\" name=\""+_3+"\" src=\""+_6+"\" onload=\""+_4+"\" style=\"position: absolute; left: 1px; top: 1px; height: 1px; width: 1px; visibility: hidden\">",_1.body());window[_3]=_7;return _7;},setSrc:function(_8,_9,_a){try{if(!_a){if(_1.isWebKit){_8.location=_9;}else{frames[_8.name].location=_9;}}else{var _b;if(_1.isIE||_1.isWebKit){_b=_8.contentWindow.document;}else{_b=_8.contentWindow;}if(!_b){_8.location=_9;}else{_b.location.replace(_9);}}}catch(e){}},doc:function(_c){return _c.contentDocument||(((_c.name)&&(_c.document)&&(_1.doc.getElementsByTagName("iframe")[_c.name].contentWindow)&&(_1.doc.getElementsByTagName("iframe")[_c.name].contentWindow.document)))||((_c.name)&&(_1.doc.frames[_c.name])&&(_1.doc.frames[_c.name].document))||null;},send:function(_d){if(!this["_frame"]){this._frame=this.create(this._iframeName,_1._scopeName+".io.iframe._iframeOnload();");}var _e=_1._ioSetArgs(_d,function(_f){_f.canceled=true;_f.ioArgs._callNext();},function(dfd){var _10=null;try{var _11=dfd.ioArgs;var dii=_1.io.iframe;var ifd=dii.doc(dii._frame);var _12=_11.handleAs;_10=ifd;if(_12!="html"){if(_12=="xml"){if(_1.isIE<9||(_1.isIE&&_1.isQuirks)){_1.query("a",dii._frame.contentWindow.document.documentElement).orphan();var _13=(dii._frame.contentWindow.document).documentElement.innerText;_13=_13.replace(/>\s+</g,"><");_13=_1.trim(_13);var _14={responseText:_13};_10=_1._contentHandlers["xml"](_14);}}else{_10=ifd.getElementsByTagName("textarea")[0].value;if(_12=="json"){_10=_1.fromJson(_10);}else{if(_12=="javascript"){_10=_1.eval(_10);}}}}}catch(e){_10=e;}finally{_11._callNext();}return _10;},function(_15,dfd){dfd.ioArgs._hasError=true;dfd.ioArgs._callNext();return _15;});_e.ioArgs._callNext=function(){if(!this["_calledNext"]){this._calledNext=true;_1.io.iframe._currentDfd=null;_1.io.iframe._fireNextRequest();}};this._dfdQueue.push(_e);this._fireNextRequest();_1._ioWatch(_e,function(dfd){return !dfd.ioArgs["_hasError"];},function(dfd){return (!!dfd.ioArgs["_finished"]);},function(dfd){if(dfd.ioArgs._finished){dfd.callback(dfd);}else{dfd.errback(new Error("Invalid dojo.io.iframe request state"));}});return _e;},_currentDfd:null,_dfdQueue:[],_iframeName:_1._scopeName+"IoIframe",_fireNextRequest:function(){try{if((this._currentDfd)||(this._dfdQueue.length==0)){return;}do{var dfd=this._currentDfd=this._dfdQueue.shift();}while(dfd&&dfd.canceled&&this._dfdQueue.length);if(!dfd||dfd.canceled){this._currentDfd=null;return;}var _16=dfd.ioArgs;var _17=_16.args;_16._contentToClean=[];var fn=_1.byId(_17["form"]);var _18=_17["content"]||{};if(fn){if(_18){var _19=function(_1a,_1b){_1.create("input",{type:"hidden",name:_1a,value:_1b},fn);_16._contentToClean.push(_1a);};for(var x in _18){var val=_18[x];if(_1.isArray(val)&&val.length>1){var i;for(i=0;i<val.length;i++){_19(x,val[i]);}}else{if(!fn[x]){_19(x,val);}else{fn[x].value=val;}}}}var _1c=fn.getAttributeNode("action");var _1d=fn.getAttributeNode("method");var _1e=fn.getAttributeNode("target");if(_17["url"]){_16._originalAction=_1c?_1c.value:null;if(_1c){_1c.value=_17.url;}else{fn.setAttribute("action",_17.url);}}if(!_1d||!_1d.value){if(_1d){_1d.value=(_17["method"])?_17["method"]:"post";}else{fn.setAttribute("method",(_17["method"])?_17["method"]:"post");}}_16._originalTarget=_1e?_1e.value:null;if(_1e){_1e.value=this._iframeName;}else{fn.setAttribute("target",this._iframeName);}fn.target=this._iframeName;_1._ioNotifyStart(dfd);fn.submit();}else{var _1f=_17.url+(_17.url.indexOf("?")>-1?"&":"?")+_16.query;_1._ioNotifyStart(dfd);this.setSrc(this._frame,_1f,true);}}catch(e){dfd.errback(e);}},_iframeOnload:function(){var dfd=this._currentDfd;if(!dfd){this._fireNextRequest();return;}var _20=dfd.ioArgs;var _21=_20.args;var _22=_1.byId(_21.form);if(_22){var _23=_20._contentToClean;for(var i=0;i<_23.length;i++){var key=_23[i];for(var j=0;j<_22.childNodes.length;j++){var _24=_22.childNodes[j];if(_24.name==key){_1.destroy(_24);break;}}}if(_20["_originalAction"]){_22.setAttribute("action",_20._originalAction);}if(_20["_originalTarget"]){_22.setAttribute("target",_20._originalTarget);_22.target=_20._originalTarget;}}_20._finished=true;}};return _1.io.iframe;}); \ No newline at end of file
diff --git a/lib/dojo/io/iframe.js.uncompressed.js b/lib/dojo/io/iframe.js.uncompressed.js
new file mode 100644
index 000000000..9ac948278
--- /dev/null
+++ b/lib/dojo/io/iframe.js.uncompressed.js
@@ -0,0 +1,376 @@
+define("dojo/io/iframe", ["../main", "require"], function(dojo, require) {
+ // module:
+ // dojo/io/iframe
+ // summary:
+ // TODOC
+
+dojo.getObject("io", true, dojo);
+
+/*=====
+dojo.declare("dojo.io.iframe.__ioArgs", dojo.__IoArgs, {
+ constructor: function(){
+ // summary:
+ // All the properties described in the dojo.__ioArgs type, apply
+ // to this type. The following additional properties are allowed
+ // for dojo.io.iframe.send():
+ // method: String?
+ // The HTTP method to use. "GET" or "POST" are the only supported
+ // values. It will try to read the value from the form node's
+ // method, then try this argument. If neither one exists, then it
+ // defaults to POST.
+ // handleAs: String?
+ // Specifies what format the result data should be given to the
+ // load/handle callback. Valid values are: text, html, xml, json,
+ // javascript. IMPORTANT: For all values EXCEPT html and xml, The
+ // server response should be an HTML file with a textarea element.
+ // The response data should be inside the textarea element. Using an
+ // HTML document the only reliable, cross-browser way this
+ // transport can know when the response has loaded. For the html
+ // handleAs value, just return a normal HTML document. NOTE: xml
+ // is now supported with this transport (as of 1.1+); a known issue
+ // is if the XML document in question is malformed, Internet Explorer
+ // will throw an uncatchable error.
+ // content: Object?
+ // If "form" is one of the other args properties, then the content
+ // object properties become hidden form form elements. For
+ // instance, a content object of {name1 : "value1"} is converted
+ // to a hidden form element with a name of "name1" and a value of
+ // "value1". If there is not a "form" property, then the content
+ // object is converted into a name=value&name=value string, by
+ // using dojo.objectToQuery().
+ this.method = method;
+ this.handleAs = handleAs;
+ this.content = content;
+ }
+});
+=====*/
+
+dojo.io.iframe = {
+ // summary:
+ // Sends an Ajax I/O call using and Iframe (for instance, to upload files)
+
+ create: function(/*String*/fname, /*String*/onloadstr, /*String?*/uri){
+ // summary:
+ // Creates a hidden iframe in the page. Used mostly for IO
+ // transports. You do not need to call this to start a
+ // dojo.io.iframe request. Just call send().
+ // fname: String
+ // The name of the iframe. Used for the name attribute on the
+ // iframe.
+ // onloadstr: String
+ // A string of JavaScript that will be executed when the content
+ // in the iframe loads.
+ // uri: String
+ // The value of the src attribute on the iframe element. If a
+ // value is not given, then dojo/resources/blank.html will be
+ // used.
+ if(window[fname]){ return window[fname]; }
+ if(window.frames[fname]){ return window.frames[fname]; }
+ var turi = uri;
+ if(!turi){
+ if(dojo.config["useXDomain"] && !dojo.config["dojoBlankHtmlUrl"]){
+ console.warn("dojo.io.iframe.create: When using cross-domain Dojo builds,"
+ + " please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl"
+ + " to the path on your domain to blank.html");
+ }
+ turi = (dojo.config["dojoBlankHtmlUrl"]||require.toUrl("../resources/blank.html"));
+ }
+ var cframe = dojo.place(
+ '<iframe id="'+fname+'" name="'+fname+'" src="'+turi+'" onload="'+onloadstr+
+ '" style="position: absolute; left: 1px; top: 1px; height: 1px; width: 1px; visibility: hidden">',
+ dojo.body());
+
+ window[fname] = cframe;
+
+ return cframe;
+ },
+
+ setSrc: function(/*DOMNode*/iframe, /*String*/src, /*Boolean*/replace){
+ //summary:
+ // Sets the URL that is loaded in an IFrame. The replace parameter
+ // indicates whether location.replace() should be used when
+ // changing the location of the iframe.
+ try{
+ if(!replace){
+ if(dojo.isWebKit){
+ iframe.location = src;
+ }else{
+ frames[iframe.name].location = src;
+ }
+ }else{
+ // Fun with DOM 0 incompatibilities!
+ var idoc;
+ if(dojo.isIE || dojo.isWebKit){
+ idoc = iframe.contentWindow.document;
+ }else{ // if(d.isMozilla){
+ idoc = iframe.contentWindow;
+ }
+
+ //For Safari (at least 2.0.3) and Opera, if the iframe
+ //has just been created but it doesn't have content
+ //yet, then iframe.document may be null. In that case,
+ //use iframe.location and return.
+ if(!idoc){
+ iframe.location = src;
+ }else{
+ idoc.location.replace(src);
+ }
+ }
+ }catch(e){
+ console.log("dojo.io.iframe.setSrc: ", e);
+ }
+ },
+
+ doc: function(/*DOMNode*/iframeNode){
+ //summary: Returns the document object associated with the iframe DOM Node argument.
+ return iframeNode.contentDocument || // W3
+ (
+ (
+ (iframeNode.name) && (iframeNode.document) &&
+ (dojo.doc.getElementsByTagName("iframe")[iframeNode.name].contentWindow) &&
+ (dojo.doc.getElementsByTagName("iframe")[iframeNode.name].contentWindow.document)
+ )
+ ) || // IE
+ (
+ (iframeNode.name)&&(dojo.doc.frames[iframeNode.name])&&
+ (dojo.doc.frames[iframeNode.name].document)
+ ) || null;
+ },
+
+ send: function(/*dojo.io.iframe.__ioArgs*/args){
+ //summary:
+ // Function that sends the request to the server.
+ // This transport can only process one send() request at a time, so if send() is called
+ //multiple times, it will queue up the calls and only process one at a time.
+ if(!this["_frame"]){
+ this._frame = this.create(this._iframeName, dojo._scopeName + ".io.iframe._iframeOnload();");
+ }
+
+ //Set up the deferred.
+ var dfd = dojo._ioSetArgs(
+ args,
+ function(/*Deferred*/dfd){
+ //summary: canceller function for dojo._ioSetArgs call.
+ dfd.canceled = true;
+ dfd.ioArgs._callNext();
+ },
+ function(/*Deferred*/dfd){
+ //summary: okHandler function for dojo._ioSetArgs call.
+ var value = null;
+ try{
+ var ioArgs = dfd.ioArgs;
+ var dii = dojo.io.iframe;
+ var ifd = dii.doc(dii._frame);
+ var handleAs = ioArgs.handleAs;
+
+ //Assign correct value based on handleAs value.
+ value = ifd; //html
+ if(handleAs != "html"){
+ if(handleAs == "xml"){
+ // FF, Saf 3+ and Opera all seem to be fine with ifd being xml. We have to
+ // do it manually for IE6-8. Refs #6334.
+ if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){
+ dojo.query("a", dii._frame.contentWindow.document.documentElement).orphan();
+ var xmlText=(dii._frame.contentWindow.document).documentElement.innerText;
+ xmlText=xmlText.replace(/>\s+</g, "><");
+ xmlText=dojo.trim(xmlText);
+ //Reusing some code in base dojo for handling XML content. Simpler and keeps
+ //Core from duplicating the effort needed to locate the XML Parser on IE.
+ var fauxXhr = { responseText: xmlText };
+ value = dojo._contentHandlers["xml"](fauxXhr); // DOMDocument
+ }
+ }else{
+ value = ifd.getElementsByTagName("textarea")[0].value; //text
+ if(handleAs == "json"){
+ value = dojo.fromJson(value); //json
+ }else if(handleAs == "javascript"){
+ value = dojo.eval(value); //javascript
+ }
+ }
+ }
+ }catch(e){
+ value = e;
+ }finally{
+ ioArgs._callNext();
+ }
+ return value;
+ },
+ function(/*Error*/error, /*Deferred*/dfd){
+ //summary: errHandler function for dojo._ioSetArgs call.
+ dfd.ioArgs._hasError = true;
+ dfd.ioArgs._callNext();
+ return error;
+ }
+ );
+
+ //Set up a function that will fire the next iframe request. Make sure it only
+ //happens once per deferred.
+ dfd.ioArgs._callNext = function(){
+ if(!this["_calledNext"]){
+ this._calledNext = true;
+ dojo.io.iframe._currentDfd = null;
+ dojo.io.iframe._fireNextRequest();
+ }
+ };
+
+ this._dfdQueue.push(dfd);
+ this._fireNextRequest();
+
+ //Add it the IO watch queue, to get things like timeout support.
+ dojo._ioWatch(
+ dfd,
+ function(/*Deferred*/dfd){
+ //validCheck
+ return !dfd.ioArgs["_hasError"];
+ },
+ function(dfd){
+ //ioCheck
+ return (!!dfd.ioArgs["_finished"]);
+ },
+ function(dfd){
+ //resHandle
+ if(dfd.ioArgs._finished){
+ dfd.callback(dfd);
+ }else{
+ dfd.errback(new Error("Invalid dojo.io.iframe request state"));
+ }
+ }
+ );
+
+ return dfd;
+ },
+
+ _currentDfd: null,
+ _dfdQueue: [],
+ _iframeName: dojo._scopeName + "IoIframe",
+
+ _fireNextRequest: function(){
+ //summary: Internal method used to fire the next request in the bind queue.
+ try{
+ if((this._currentDfd)||(this._dfdQueue.length == 0)){ return; }
+ //Find next deferred, skip the canceled ones.
+ do{
+ var dfd = this._currentDfd = this._dfdQueue.shift();
+ } while(dfd && dfd.canceled && this._dfdQueue.length);
+
+ //If no more dfds, cancel.
+ if(!dfd || dfd.canceled){
+ this._currentDfd = null;
+ return;
+ }
+
+ var ioArgs = dfd.ioArgs;
+ var args = ioArgs.args;
+
+ ioArgs._contentToClean = [];
+ var fn = dojo.byId(args["form"]);
+ var content = args["content"] || {};
+ if(fn){
+ if(content){
+ // if we have things in content, we need to add them to the form
+ // before submission
+ var pHandler = function(name, value) {
+ dojo.create("input", {type: "hidden", name: name, value: value}, fn);
+ ioArgs._contentToClean.push(name);
+ };
+ for(var x in content){
+ var val = content[x];
+ if(dojo.isArray(val) && val.length > 1){
+ var i;
+ for (i = 0; i < val.length; i++) {
+ pHandler(x,val[i]);
+ }
+ }else{
+ if(!fn[x]){
+ pHandler(x,val);
+ }else{
+ fn[x].value = val;
+ }
+ }
+ }
+ }
+ //IE requires going through getAttributeNode instead of just getAttribute in some form cases,
+ //so use it for all. See #2844
+ var actnNode = fn.getAttributeNode("action");
+ var mthdNode = fn.getAttributeNode("method");
+ var trgtNode = fn.getAttributeNode("target");
+ if(args["url"]){
+ ioArgs._originalAction = actnNode ? actnNode.value : null;
+ if(actnNode){
+ actnNode.value = args.url;
+ }else{
+ fn.setAttribute("action",args.url);
+ }
+ }
+ if(!mthdNode || !mthdNode.value){
+ if(mthdNode){
+ mthdNode.value= (args["method"]) ? args["method"] : "post";
+ }else{
+ fn.setAttribute("method", (args["method"]) ? args["method"] : "post");
+ }
+ }
+ ioArgs._originalTarget = trgtNode ? trgtNode.value: null;
+ if(trgtNode){
+ trgtNode.value = this._iframeName;
+ }else{
+ fn.setAttribute("target", this._iframeName);
+ }
+ fn.target = this._iframeName;
+ dojo._ioNotifyStart(dfd);
+ fn.submit();
+ }else{
+ // otherwise we post a GET string by changing URL location for the
+ // iframe
+ var tmpUrl = args.url + (args.url.indexOf("?") > -1 ? "&" : "?") + ioArgs.query;
+ dojo._ioNotifyStart(dfd);
+ this.setSrc(this._frame, tmpUrl, true);
+ }
+ }catch(e){
+ dfd.errback(e);
+ }
+ },
+
+ _iframeOnload: function(){
+ var dfd = this._currentDfd;
+ if(!dfd){
+ this._fireNextRequest();
+ return;
+ }
+
+ var ioArgs = dfd.ioArgs;
+ var args = ioArgs.args;
+ var fNode = dojo.byId(args.form);
+
+ if(fNode){
+ // remove all the hidden content inputs
+ var toClean = ioArgs._contentToClean;
+ for(var i = 0; i < toClean.length; i++) {
+ var key = toClean[i];
+ //Need to cycle over all nodes since we may have added
+ //an array value which means that more than one node could
+ //have the same .name value.
+ for(var j = 0; j < fNode.childNodes.length; j++){
+ var chNode = fNode.childNodes[j];
+ if(chNode.name == key){
+ dojo.destroy(chNode);
+ break;
+ }
+ }
+ }
+
+ // restore original action + target
+ if(ioArgs["_originalAction"]){
+ fNode.setAttribute("action", ioArgs._originalAction);
+ }
+ if(ioArgs["_originalTarget"]){
+ fNode.setAttribute("target", ioArgs._originalTarget);
+ fNode.target = ioArgs._originalTarget;
+ }
+ }
+
+ ioArgs._finished = true;
+ }
+};
+
+return dojo.io.iframe;
+});
diff --git a/lib/dojo/io/script.js b/lib/dojo/io/script.js
index a44e9f2ee..03459fae1 100644
--- a/lib/dojo/io/script.js
+++ b/lib/dojo/io/script.js
@@ -4,259 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.io.script"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.io.script"] = true;
-dojo.provide("dojo.io.script");
-
-dojo.getObject("io", true, dojo);
-
-/*=====
-dojo.declare("dojo.io.script.__ioArgs", dojo.__IoArgs, {
- constructor: function(){
- // summary:
- // All the properties described in the dojo.__ioArgs type, apply to this
- // type as well, EXCEPT "handleAs". It is not applicable to
- // dojo.io.script.get() calls, since it is implied by the usage of
- // "jsonp" (response will be a JSONP call returning JSON)
- // or the response is pure JavaScript defined in
- // the body of the script that was attached.
- // callbackParamName: String
- // Deprecated as of Dojo 1.4 in favor of "jsonp", but still supported for
- // legacy code. See notes for jsonp property.
- // jsonp: String
- // The URL parameter name that indicates the JSONP callback string.
- // For instance, when using Yahoo JSONP calls it is normally,
- // jsonp: "callback". For AOL JSONP calls it is normally
- // jsonp: "c".
- // checkString: String
- // A string of JavaScript that when evaluated like so:
- // "typeof(" + checkString + ") != 'undefined'"
- // being true means that the script fetched has been loaded.
- // Do not use this if doing a JSONP type of call (use callbackParamName instead).
- // frameDoc: Document
- // The Document object for a child iframe. If this is passed in, the script
- // will be attached to that document. This can be helpful in some comet long-polling
- // scenarios with Firefox and Opera.
- this.callbackParamName = callbackParamName;
- this.jsonp = jsonp;
- this.checkString = checkString;
- this.frameDoc = frameDoc;
- }
-});
-=====*/
-(function(){
- var loadEvent = dojo.isIE ? "onreadystatechange" : "load",
- readyRegExp = /complete|loaded/;
-
- dojo.io.script = {
- get: function(/*dojo.io.script.__ioArgs*/args){
- // summary:
- // sends a get request using a dynamically created script tag.
- var dfd = this._makeScriptDeferred(args);
- var ioArgs = dfd.ioArgs;
- dojo._ioAddQueryToUrl(ioArgs);
-
- dojo._ioNotifyStart(dfd);
-
- if(this._canAttach(ioArgs)){
- var node = this.attach(ioArgs.id, ioArgs.url, args.frameDoc);
-
- //If not a jsonp callback or a polling checkString case, bind
- //to load event on the script tag.
- if(!ioArgs.jsonp && !ioArgs.args.checkString){
- var handle = dojo.connect(node, loadEvent, function(evt){
- if(evt.type == "load" || readyRegExp.test(node.readyState)){
- dojo.disconnect(handle);
- ioArgs.scriptLoaded = evt;
- }
- });
- }
- }
-
- dojo._ioWatch(dfd, this._validCheck, this._ioCheck, this._resHandle);
- return dfd;
- },
-
- attach: function(/*String*/id, /*String*/url, /*Document?*/frameDocument){
- // summary:
- // creates a new <script> tag pointing to the specified URL and
- // adds it to the document.
- // description:
- // Attaches the script element to the DOM. Use this method if you
- // just want to attach a script to the DOM and do not care when or
- // if it loads.
- var doc = (frameDocument || dojo.doc);
- var element = doc.createElement("script");
- element.type = "text/javascript";
- element.src = url;
- element.id = id;
- element.charset = "utf-8";
- return doc.getElementsByTagName("head")[0].appendChild(element);
- },
-
- remove: function(/*String*/id, /*Document?*/frameDocument){
- //summary: removes the script element with the given id, from the given frameDocument.
- //If no frameDocument is passed, the current document is used.
- dojo.destroy(dojo.byId(id, frameDocument));
-
- //Remove the jsonp callback on dojo.io.script, if it exists.
- if(this["jsonp_" + id]){
- delete this["jsonp_" + id];
- }
- },
-
- _makeScriptDeferred: function(/*Object*/args){
- //summary:
- // sets up a Deferred object for an IO request.
- var dfd = dojo._ioSetArgs(args, this._deferredCancel, this._deferredOk, this._deferredError);
-
- var ioArgs = dfd.ioArgs;
- ioArgs.id = dojo._scopeName + "IoScript" + (this._counter++);
- ioArgs.canDelete = false;
-
- //Special setup for jsonp case
- ioArgs.jsonp = args.callbackParamName || args.jsonp;
- if(ioArgs.jsonp){
- //Add the jsonp parameter.
- ioArgs.query = ioArgs.query || "";
- if(ioArgs.query.length > 0){
- ioArgs.query += "&";
- }
- ioArgs.query += ioArgs.jsonp
- + "="
- + (args.frameDoc ? "parent." : "")
- + dojo._scopeName + ".io.script.jsonp_" + ioArgs.id + "._jsonpCallback";
-
- ioArgs.frameDoc = args.frameDoc;
-
- //Setup the Deferred to have the jsonp callback.
- ioArgs.canDelete = true;
- dfd._jsonpCallback = this._jsonpCallback;
- this["jsonp_" + ioArgs.id] = dfd;
- }
- return dfd; // dojo.Deferred
- },
-
- _deferredCancel: function(/*Deferred*/dfd){
- //summary: canceller function for dojo._ioSetArgs call.
-
- //DO NOT use "this" and expect it to be dojo.io.script.
- dfd.canceled = true;
- if(dfd.ioArgs.canDelete){
- dojo.io.script._addDeadScript(dfd.ioArgs);
- }
- },
-
- _deferredOk: function(/*Deferred*/dfd){
- //summary: okHandler function for dojo._ioSetArgs call.
-
- //DO NOT use "this" and expect it to be dojo.io.script.
- var ioArgs = dfd.ioArgs;
-
- //Add script to list of things that can be removed.
- if(ioArgs.canDelete){
- dojo.io.script._addDeadScript(ioArgs);
- }
-
- //Favor JSONP responses, script load events then lastly ioArgs.
- //The ioArgs are goofy, but cannot return the dfd since that stops
- //the callback chain in Deferred. The return value is not that important
- //in that case, probably a checkString case.
- return ioArgs.json || ioArgs.scriptLoaded || ioArgs;
- },
-
- _deferredError: function(/*Error*/error, /*Deferred*/dfd){
- //summary: errHandler function for dojo._ioSetArgs call.
-
- if(dfd.ioArgs.canDelete){
- //DO NOT use "this" and expect it to be dojo.io.script.
- if(error.dojoType == "timeout"){
- //For timeouts, remove the script element immediately to
- //avoid a response from it coming back later and causing trouble.
- dojo.io.script.remove(dfd.ioArgs.id, dfd.ioArgs.frameDoc);
- }else{
- dojo.io.script._addDeadScript(dfd.ioArgs);
- }
- }
- console.log("dojo.io.script error", error);
- return error;
- },
-
- _deadScripts: [],
- _counter: 1,
-
- _addDeadScript: function(/*Object*/ioArgs){
- //summary: sets up an entry in the deadScripts array.
- dojo.io.script._deadScripts.push({id: ioArgs.id, frameDoc: ioArgs.frameDoc});
- //Being extra paranoid about leaks:
- ioArgs.frameDoc = null;
- },
-
- _validCheck: function(/*Deferred*/dfd){
- //summary: inflight check function to see if dfd is still valid.
-
- //Do script cleanup here. We wait for one inflight pass
- //to make sure we don't get any weird things by trying to remove a script
- //tag that is part of the call chain (IE 6 has been known to
- //crash in that case).
- var _self = dojo.io.script;
- var deadScripts = _self._deadScripts;
- if(deadScripts && deadScripts.length > 0){
- for(var i = 0; i < deadScripts.length; i++){
- //Remove the script tag
- _self.remove(deadScripts[i].id, deadScripts[i].frameDoc);
- deadScripts[i].frameDoc = null;
- }
- dojo.io.script._deadScripts = [];
- }
-
- return true;
- },
-
- _ioCheck: function(/*Deferred*/dfd){
- //summary: inflight check function to see if IO finished.
- var ioArgs = dfd.ioArgs;
- //Check for finished jsonp
- if(ioArgs.json || (ioArgs.scriptLoaded && !ioArgs.args.checkString)){
- return true;
- }
-
- //Check for finished "checkString" case.
- var checkString = ioArgs.args.checkString;
- if(checkString && eval("typeof(" + checkString + ") != 'undefined'")){
- return true;
- }
-
- return false;
- },
-
- _resHandle: function(/*Deferred*/dfd){
- //summary: inflight function to handle a completed response.
- if(dojo.io.script._ioCheck(dfd)){
- dfd.callback(dfd);
- }else{
- //This path should never happen since the only way we can get
- //to _resHandle is if _ioCheck is true.
- dfd.errback(new Error("inconceivable dojo.io.script._resHandle error"));
- }
- },
-
- _canAttach: function(/*Object*/ioArgs){
- //summary: A method that can be overridden by other modules
- //to control when the script attachment occurs.
- return true;
- },
-
- _jsonpCallback: function(/*JSON Object*/json){
- //summary:
- // generic handler for jsonp callback. A pointer to this function
- // is used for all jsonp callbacks. NOTE: the "this" in this
- // function will be the Deferred object that represents the script
- // request.
- this.ioArgs.json = json;
- }
- };
-})();
-
-}
+//>>built
+define("dojo/io/script",["../main"],function(_1){_1.getObject("io",true,_1);var _2=_1.isIE?"onreadystatechange":"load",_3=/complete|loaded/;_1.io.script={get:function(_4){var _5=this._makeScriptDeferred(_4);var _6=_5.ioArgs;_1._ioAddQueryToUrl(_6);_1._ioNotifyStart(_5);if(this._canAttach(_6)){var _7=this.attach(_6.id,_6.url,_4.frameDoc);if(!_6.jsonp&&!_6.args.checkString){var _8=_1.connect(_7,_2,function(_9){if(_9.type=="load"||_3.test(_7.readyState)){_1.disconnect(_8);_6.scriptLoaded=_9;}});}}_1._ioWatch(_5,this._validCheck,this._ioCheck,this._resHandle);return _5;},attach:function(id,_a,_b){var _c=(_b||_1.doc);var _d=_c.createElement("script");_d.type="text/javascript";_d.src=_a;_d.id=id;_d.async=true;_d.charset="utf-8";return _c.getElementsByTagName("head")[0].appendChild(_d);},remove:function(id,_e){_1.destroy(_1.byId(id,_e));if(this["jsonp_"+id]){delete this["jsonp_"+id];}},_makeScriptDeferred:function(_f){var dfd=_1._ioSetArgs(_f,this._deferredCancel,this._deferredOk,this._deferredError);var _10=dfd.ioArgs;_10.id=_1._scopeName+"IoScript"+(this._counter++);_10.canDelete=false;_10.jsonp=_f.callbackParamName||_f.jsonp;if(_10.jsonp){_10.query=_10.query||"";if(_10.query.length>0){_10.query+="&";}_10.query+=_10.jsonp+"="+(_f.frameDoc?"parent.":"")+_1._scopeName+".io.script.jsonp_"+_10.id+"._jsonpCallback";_10.frameDoc=_f.frameDoc;_10.canDelete=true;dfd._jsonpCallback=this._jsonpCallback;this["jsonp_"+_10.id]=dfd;}return dfd;},_deferredCancel:function(dfd){dfd.canceled=true;if(dfd.ioArgs.canDelete){_1.io.script._addDeadScript(dfd.ioArgs);}},_deferredOk:function(dfd){var _11=dfd.ioArgs;if(_11.canDelete){_1.io.script._addDeadScript(_11);}return _11.json||_11.scriptLoaded||_11;},_deferredError:function(_12,dfd){if(dfd.ioArgs.canDelete){if(_12.dojoType=="timeout"){_1.io.script.remove(dfd.ioArgs.id,dfd.ioArgs.frameDoc);}else{_1.io.script._addDeadScript(dfd.ioArgs);}}return _12;},_deadScripts:[],_counter:1,_addDeadScript:function(_13){_1.io.script._deadScripts.push({id:_13.id,frameDoc:_13.frameDoc});_13.frameDoc=null;},_validCheck:function(dfd){var _14=_1.io.script;var _15=_14._deadScripts;if(_15&&_15.length>0){for(var i=0;i<_15.length;i++){_14.remove(_15[i].id,_15[i].frameDoc);_15[i].frameDoc=null;}_1.io.script._deadScripts=[];}return true;},_ioCheck:function(dfd){var _16=dfd.ioArgs;if(_16.json||(_16.scriptLoaded&&!_16.args.checkString)){return true;}var _17=_16.args.checkString;return _17&&eval("typeof("+_17+") != 'undefined'");},_resHandle:function(dfd){if(_1.io.script._ioCheck(dfd)){dfd.callback(dfd);}else{dfd.errback(new Error("inconceivable dojo.io.script._resHandle error"));}},_canAttach:function(_18){return true;},_jsonpCallback:function(_19){this.ioArgs.json=_19;}};return _1.io.script;}); \ No newline at end of file
diff --git a/lib/dojo/io/script.js.uncompressed.js b/lib/dojo/io/script.js.uncompressed.js
new file mode 100644
index 000000000..628e31948
--- /dev/null
+++ b/lib/dojo/io/script.js.uncompressed.js
@@ -0,0 +1,256 @@
+define("dojo/io/script", ["../main"], function(dojo) {
+ // module:
+ // dojo/io/script
+ // summary:
+ // TODOC
+
+ dojo.getObject("io", true, dojo);
+
+/*=====
+dojo.declare("dojo.io.script.__ioArgs", dojo.__IoArgs, {
+ constructor: function(){
+ // summary:
+ // All the properties described in the dojo.__ioArgs type, apply to this
+ // type as well, EXCEPT "handleAs". It is not applicable to
+ // dojo.io.script.get() calls, since it is implied by the usage of
+ // "jsonp" (response will be a JSONP call returning JSON)
+ // or the response is pure JavaScript defined in
+ // the body of the script that was attached.
+ // callbackParamName: String
+ // Deprecated as of Dojo 1.4 in favor of "jsonp", but still supported for
+ // legacy code. See notes for jsonp property.
+ // jsonp: String
+ // The URL parameter name that indicates the JSONP callback string.
+ // For instance, when using Yahoo JSONP calls it is normally,
+ // jsonp: "callback". For AOL JSONP calls it is normally
+ // jsonp: "c".
+ // checkString: String
+ // A string of JavaScript that when evaluated like so:
+ // "typeof(" + checkString + ") != 'undefined'"
+ // being true means that the script fetched has been loaded.
+ // Do not use this if doing a JSONP type of call (use callbackParamName instead).
+ // frameDoc: Document
+ // The Document object for a child iframe. If this is passed in, the script
+ // will be attached to that document. This can be helpful in some comet long-polling
+ // scenarios with Firefox and Opera.
+ this.callbackParamName = callbackParamName;
+ this.jsonp = jsonp;
+ this.checkString = checkString;
+ this.frameDoc = frameDoc;
+ }
+});
+=====*/
+
+ var loadEvent = dojo.isIE ? "onreadystatechange" : "load",
+ readyRegExp = /complete|loaded/;
+
+ dojo.io.script = {
+ get: function(/*dojo.io.script.__ioArgs*/args){
+ // summary:
+ // sends a get request using a dynamically created script tag.
+ var dfd = this._makeScriptDeferred(args);
+ var ioArgs = dfd.ioArgs;
+ dojo._ioAddQueryToUrl(ioArgs);
+
+ dojo._ioNotifyStart(dfd);
+
+ if(this._canAttach(ioArgs)){
+ var node = this.attach(ioArgs.id, ioArgs.url, args.frameDoc);
+
+ //If not a jsonp callback or a polling checkString case, bind
+ //to load event on the script tag.
+ if(!ioArgs.jsonp && !ioArgs.args.checkString){
+ var handle = dojo.connect(node, loadEvent, function(evt){
+ if(evt.type == "load" || readyRegExp.test(node.readyState)){
+ dojo.disconnect(handle);
+ ioArgs.scriptLoaded = evt;
+ }
+ });
+ }
+ }
+
+ dojo._ioWatch(dfd, this._validCheck, this._ioCheck, this._resHandle);
+ return dfd;
+ },
+
+ attach: function(/*String*/id, /*String*/url, /*Document?*/frameDocument){
+ // summary:
+ // creates a new <script> tag pointing to the specified URL and
+ // adds it to the document.
+ // description:
+ // Attaches the script element to the DOM. Use this method if you
+ // just want to attach a script to the DOM and do not care when or
+ // if it loads.
+ var doc = (frameDocument || dojo.doc);
+ var element = doc.createElement("script");
+ element.type = "text/javascript";
+ element.src = url;
+ element.id = id;
+ element.async = true;
+ element.charset = "utf-8";
+ return doc.getElementsByTagName("head")[0].appendChild(element);
+ },
+
+ remove: function(/*String*/id, /*Document?*/frameDocument){
+ //summary: removes the script element with the given id, from the given frameDocument.
+ //If no frameDocument is passed, the current document is used.
+ dojo.destroy(dojo.byId(id, frameDocument));
+
+ //Remove the jsonp callback on dojo.io.script, if it exists.
+ if(this["jsonp_" + id]){
+ delete this["jsonp_" + id];
+ }
+ },
+
+ _makeScriptDeferred: function(/*Object*/args){
+ //summary:
+ // sets up a Deferred object for an IO request.
+ var dfd = dojo._ioSetArgs(args, this._deferredCancel, this._deferredOk, this._deferredError);
+
+ var ioArgs = dfd.ioArgs;
+ ioArgs.id = dojo._scopeName + "IoScript" + (this._counter++);
+ ioArgs.canDelete = false;
+
+ //Special setup for jsonp case
+ ioArgs.jsonp = args.callbackParamName || args.jsonp;
+ if(ioArgs.jsonp){
+ //Add the jsonp parameter.
+ ioArgs.query = ioArgs.query || "";
+ if(ioArgs.query.length > 0){
+ ioArgs.query += "&";
+ }
+ ioArgs.query += ioArgs.jsonp
+ + "="
+ + (args.frameDoc ? "parent." : "")
+ + dojo._scopeName + ".io.script.jsonp_" + ioArgs.id + "._jsonpCallback";
+
+ ioArgs.frameDoc = args.frameDoc;
+
+ //Setup the Deferred to have the jsonp callback.
+ ioArgs.canDelete = true;
+ dfd._jsonpCallback = this._jsonpCallback;
+ this["jsonp_" + ioArgs.id] = dfd;
+ }
+ return dfd; // dojo.Deferred
+ },
+
+ _deferredCancel: function(/*Deferred*/dfd){
+ //summary: canceller function for dojo._ioSetArgs call.
+
+ //DO NOT use "this" and expect it to be dojo.io.script.
+ dfd.canceled = true;
+ if(dfd.ioArgs.canDelete){
+ dojo.io.script._addDeadScript(dfd.ioArgs);
+ }
+ },
+
+ _deferredOk: function(/*Deferred*/dfd){
+ //summary: okHandler function for dojo._ioSetArgs call.
+
+ //DO NOT use "this" and expect it to be dojo.io.script.
+ var ioArgs = dfd.ioArgs;
+
+ //Add script to list of things that can be removed.
+ if(ioArgs.canDelete){
+ dojo.io.script._addDeadScript(ioArgs);
+ }
+
+ //Favor JSONP responses, script load events then lastly ioArgs.
+ //The ioArgs are goofy, but cannot return the dfd since that stops
+ //the callback chain in Deferred. The return value is not that important
+ //in that case, probably a checkString case.
+ return ioArgs.json || ioArgs.scriptLoaded || ioArgs;
+ },
+
+ _deferredError: function(/*Error*/error, /*Deferred*/dfd){
+ //summary: errHandler function for dojo._ioSetArgs call.
+
+ if(dfd.ioArgs.canDelete){
+ //DO NOT use "this" and expect it to be dojo.io.script.
+ if(error.dojoType == "timeout"){
+ //For timeouts, remove the script element immediately to
+ //avoid a response from it coming back later and causing trouble.
+ dojo.io.script.remove(dfd.ioArgs.id, dfd.ioArgs.frameDoc);
+ }else{
+ dojo.io.script._addDeadScript(dfd.ioArgs);
+ }
+ }
+ console.log("dojo.io.script error", error);
+ return error;
+ },
+
+ _deadScripts: [],
+ _counter: 1,
+
+ _addDeadScript: function(/*Object*/ioArgs){
+ //summary: sets up an entry in the deadScripts array.
+ dojo.io.script._deadScripts.push({id: ioArgs.id, frameDoc: ioArgs.frameDoc});
+ //Being extra paranoid about leaks:
+ ioArgs.frameDoc = null;
+ },
+
+ _validCheck: function(/*Deferred*/dfd){
+ //summary: inflight check function to see if dfd is still valid.
+
+ //Do script cleanup here. We wait for one inflight pass
+ //to make sure we don't get any weird things by trying to remove a script
+ //tag that is part of the call chain (IE 6 has been known to
+ //crash in that case).
+ var _self = dojo.io.script;
+ var deadScripts = _self._deadScripts;
+ if(deadScripts && deadScripts.length > 0){
+ for(var i = 0; i < deadScripts.length; i++){
+ //Remove the script tag
+ _self.remove(deadScripts[i].id, deadScripts[i].frameDoc);
+ deadScripts[i].frameDoc = null;
+ }
+ dojo.io.script._deadScripts = [];
+ }
+
+ return true;
+ },
+
+ _ioCheck: function(/*Deferred*/dfd){
+ //summary: inflight check function to see if IO finished.
+ var ioArgs = dfd.ioArgs;
+ //Check for finished jsonp
+ if(ioArgs.json || (ioArgs.scriptLoaded && !ioArgs.args.checkString)){
+ return true;
+ }
+
+ //Check for finished "checkString" case.
+ var checkString = ioArgs.args.checkString;
+ return checkString && eval("typeof(" + checkString + ") != 'undefined'");
+
+
+ },
+
+ _resHandle: function(/*Deferred*/dfd){
+ //summary: inflight function to handle a completed response.
+ if(dojo.io.script._ioCheck(dfd)){
+ dfd.callback(dfd);
+ }else{
+ //This path should never happen since the only way we can get
+ //to _resHandle is if _ioCheck is true.
+ dfd.errback(new Error("inconceivable dojo.io.script._resHandle error"));
+ }
+ },
+
+ _canAttach: function(/*Object*/ioArgs){
+ //summary: A method that can be overridden by other modules
+ //to control when the script attachment occurs.
+ return true;
+ },
+
+ _jsonpCallback: function(/*JSON Object*/json){
+ //summary:
+ // generic handler for jsonp callback. A pointer to this function
+ // is used for all jsonp callbacks. NOTE: the "this" in this
+ // function will be the Deferred object that represents the script
+ // request.
+ this.ioArgs.json = json;
+ }
+ };
+
+ return dojo.io.script;
+});
diff --git a/lib/dojo/jaxer.js b/lib/dojo/jaxer.js
index 2ac115e18..835661dae 100644
--- a/lib/dojo/jaxer.js
+++ b/lib/dojo/jaxer.js
@@ -4,20 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.jaxer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.jaxer"] = true;
-dojo.provide("dojo.jaxer");
-
-
-if(typeof print == "function"){
- console.debug = Jaxer.Log.debug;
- console.warn = Jaxer.Log.warn;
- console.error = Jaxer.Log.error;
- console.info = Jaxer.Log.info;
- console.log = Jaxer.Log.warn;
-}
-
-onserverload = dojo._loadInit;
-
-}
+//>>built
+define("dojo/jaxer",["./main"],function(_1){if(typeof print=="function"){console.debug=Jaxer.Log.debug;console.warn=Jaxer.Log.warn;console.error=Jaxer.Log.error;console.info=Jaxer.Log.info;console.log=Jaxer.Log.warn;}onserverload=_1._loadInit;return _1;}); \ No newline at end of file
diff --git a/lib/dojo/jaxer.js.uncompressed.js b/lib/dojo/jaxer.js.uncompressed.js
new file mode 100644
index 000000000..b5b12da24
--- /dev/null
+++ b/lib/dojo/jaxer.js.uncompressed.js
@@ -0,0 +1,19 @@
+define("dojo/jaxer", ["./main"], function(dojo) {
+ // module:
+ // dojo/jaxer
+ // summary:
+ // TODOC
+
+
+if(typeof print == "function"){
+ console.debug = Jaxer.Log.debug;
+ console.warn = Jaxer.Log.warn;
+ console.error = Jaxer.Log.error;
+ console.info = Jaxer.Log.info;
+ console.log = Jaxer.Log.warn;
+}
+
+onserverload = dojo._loadInit;
+
+return dojo;
+});
diff --git a/lib/dojo/json.js b/lib/dojo/json.js
new file mode 100644
index 000000000..fa84ba63e
--- /dev/null
+++ b/lib/dojo/json.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/json",["./has"],function(_1){"use strict";var _2=typeof JSON!="undefined";_1.add("json-parse",_2);_1.add("json-stringify",_2&&JSON.stringify({a:0},function(k,v){return v||1;})=="{\"a\":1}");if(_1("json-stringify")){return JSON;}else{var _3=function(_4){return ("\""+_4.replace(/(["\\])/g,"\\$1")+"\"").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");};return {parse:_1("json-parse")?JSON.parse:function(_5,_6){if(_6&&!/^([\s\[\{]*(?:"(?:\\.|[^"])+"|-?\d[\d\.]*(?:[Ee][+-]?\d+)?|null|true|false|)[\s\]\}]*(?:,|:|$))+$/.test(_5)){throw new SyntaxError("Invalid characters in JSON");}return eval("("+_5+")");},stringify:function(_7,_8,_9){var _a;if(typeof _8=="string"){_9=_8;_8=null;}function _b(it,_c,_d){if(_8){it=_8(_d,it);}var _e,_f=typeof it;if(_f=="number"){return isFinite(it)?it+"":"null";}if(_f=="boolean"){return it+"";}if(it===null){return "null";}if(typeof it=="string"){return _3(it);}if(_f=="function"||_f=="undefined"){return _a;}if(typeof it.toJSON=="function"){return _b(it.toJSON(_d),_c,_d);}if(it instanceof Date){return "\"{FullYear}-{Month+}-{Date}T{Hours}:{Minutes}:{Seconds}Z\"".replace(/\{(\w+)(\+)?\}/g,function(t,_10,_11){var num=it["getUTC"+_10]()+(_11?1:0);return num<10?"0"+num:num;});}if(it.valueOf()!==it){return _b(it.valueOf(),_c,_d);}var _12=_9?(_c+_9):"";var sep=_9?" ":"";var _13=_9?"\n":"";if(it instanceof Array){var itl=it.length,res=[];for(_d=0;_d<itl;_d++){var obj=it[_d];_e=_b(obj,_12,_d);if(typeof _e!="string"){_e="null";}res.push(_13+_12+_e);}return "["+res.join(",")+_13+_c+"]";}var _14=[];for(_d in it){var _15;if(typeof _d=="number"){_15="\""+_d+"\"";}else{if(typeof _d=="string"){_15=_3(_d);}else{continue;}}_e=_b(it[_d],_12,_d);if(typeof _e!="string"){continue;}_14.push(_13+_12+_15+":"+sep+_e);}return "{"+_14.join(",")+_13+_c+"}";};return _b(_7,"","");}};}}); \ No newline at end of file
diff --git a/lib/dojo/json.js.uncompressed.js b/lib/dojo/json.js.uncompressed.js
new file mode 100644
index 000000000..307730f03
--- /dev/null
+++ b/lib/dojo/json.js.uncompressed.js
@@ -0,0 +1,149 @@
+define("dojo/json", ["./has"], function(has){
+ "use strict";
+ var hasJSON = typeof JSON != "undefined";
+ has.add("json-parse", hasJSON); // all the parsers work fine
+ // Firefox 3.5/Gecko 1.9 fails to use replacer in stringify properly https://bugzilla.mozilla.org/show_bug.cgi?id=509184
+ has.add("json-stringify", hasJSON && JSON.stringify({a:0}, function(k,v){return v||1;}) == '{"a":1}');
+ if(has("json-stringify")){
+ return JSON;
+ }
+ else{
+ var escapeString = function(/*String*/str){
+ //summary:
+ // Adds escape sequences for non-visual characters, double quote and
+ // backslash and surrounds with double quotes to form a valid string
+ // literal.
+ return ('"' + str.replace(/(["\\])/g, '\\$1') + '"').
+ replace(/[\f]/g, "\\f").replace(/[\b]/g, "\\b").replace(/[\n]/g, "\\n").
+ replace(/[\t]/g, "\\t").replace(/[\r]/g, "\\r"); // string
+ };
+ return {
+ parse: has("json-parse") ? JSON.parse : function(str, strict){
+ // summary:
+ // Parses a [JSON](http://json.org) string to return a JavaScript object.
+ // description:
+ // This function follows [native JSON API](https://developer.mozilla.org/en/JSON)
+ // Throws for invalid JSON strings. This delegates to eval() if native JSON
+ // support is not available. By default this will evaluate any valid JS expression.
+ // With the strict parameter set to true, the parser will ensure that only
+ // valid JSON strings are parsed (otherwise throwing an error). Without the strict
+ // parameter, the content passed to this method must come
+ // from a trusted source.
+ // str:
+ // a string literal of a JSON item, for instance:
+ // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'`
+ // strict:
+ // When set to true, this will ensure that only valid, secure JSON is ever parsed.
+ // Make sure this is set to true for untrusted content. Note that on browsers/engines
+ // without native JSON support, setting this to true will run slower.
+ if(strict && !/^([\s\[\{]*(?:"(?:\\.|[^"])+"|-?\d[\d\.]*(?:[Ee][+-]?\d+)?|null|true|false|)[\s\]\}]*(?:,|:|$))+$/.test(str)){
+ throw new SyntaxError("Invalid characters in JSON");
+ }
+ return eval('(' + str + ')');
+ },
+ stringify: function(value, replacer, spacer){
+ // summary:
+ // Returns a [JSON](http://json.org) serialization of an object.
+ // description:
+ // Returns a [JSON](http://json.org) serialization of an object.
+ // This function follows [native JSON API](https://developer.mozilla.org/en/JSON)
+ // Note that this doesn't check for infinite recursion, so don't do that!
+ // value:
+ // A value to be serialized.
+ // replacer:
+ // A replacer function that is called for each value and can return a replacement
+ // spacer:
+ // A spacer string to be used for pretty printing of JSON
+ //
+ // example:
+ // simple serialization of a trivial object
+ // | define(["dojo/json"], function(JSON){
+ // | var jsonStr = JSON.stringify({ howdy: "stranger!", isStrange: true });
+ // | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr);
+ var undef;
+ if(typeof replacer == "string"){
+ spacer = replacer;
+ replacer = null;
+ }
+ function stringify(it, indent, key){
+ if(replacer){
+ it = replacer(key, it);
+ }
+ var val, objtype = typeof it;
+ if(objtype == "number"){
+ return isFinite(it) ? it + "" : "null";
+ }
+ if(objtype == "boolean"){
+ return it + "";
+ }
+ if(it === null){
+ return "null";
+ }
+ if(typeof it == "string"){
+ return escapeString(it);
+ }
+ if(objtype == "function" || objtype == "undefined"){
+ return undef; // undefined
+ }
+ // short-circuit for objects that support "json" serialization
+ // if they return "self" then just pass-through...
+ if(typeof it.toJSON == "function"){
+ return stringify(it.toJSON(key), indent, key);
+ }
+ if(it instanceof Date){
+ return '"{FullYear}-{Month+}-{Date}T{Hours}:{Minutes}:{Seconds}Z"'.replace(/\{(\w+)(\+)?\}/g, function(t, prop, plus){
+ var num = it["getUTC" + prop]() + (plus ? 1 : 0);
+ return num < 10 ? "0" + num : num;
+ });
+ }
+ if(it.valueOf() !== it){
+ // primitive wrapper, try again unwrapped:
+ return stringify(it.valueOf(), indent, key);
+ }
+ var nextIndent= spacer ? (indent + spacer) : "";
+ /* we used to test for DOM nodes and throw, but FF serializes them as {}, so cross-browser consistency is probably not efficiently attainable */
+
+ var sep = spacer ? " " : "";
+ var newLine = spacer ? "\n" : "";
+
+ // array
+ if(it instanceof Array){
+ var itl = it.length, res = [];
+ for(key = 0; key < itl; key++){
+ var obj = it[key];
+ val = stringify(obj, nextIndent, key);
+ if(typeof val != "string"){
+ val = "null";
+ }
+ res.push(newLine + nextIndent + val);
+ }
+ return "[" + res.join(",") + newLine + indent + "]";
+ }
+ // generic object code path
+ var output = [];
+ for(key in it){
+ var keyStr;
+ if(typeof key == "number"){
+ keyStr = '"' + key + '"';
+ }else if(typeof key == "string"){
+ keyStr = escapeString(key);
+ }else{
+ // skip non-string or number keys
+ continue;
+ }
+ val = stringify(it[key], nextIndent, key);
+ if(typeof val != "string"){
+ // skip non-serializable values
+ continue;
+ }
+ // At this point, the most non-IE browsers don't get in this branch
+ // (they have native JSON), so push is definitely the way to
+ output.push(newLine + nextIndent + keyStr + ":" + sep + val);
+ }
+ return "{" + output.join(",") + newLine + indent + "}"; // String
+ }
+ return stringify(value, "", "");
+ }
+ };
+ }
+});
diff --git a/lib/dojo/keys.js b/lib/dojo/keys.js
new file mode 100644
index 000000000..3086cd8b1
--- /dev/null
+++ b/lib/dojo/keys.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/keys",["./_base/kernel","./_base/sniff"],function(_1,_2){return _1.keys={BACKSPACE:8,TAB:9,CLEAR:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,META:_2("safari")?91:224,PAUSE:19,CAPS_LOCK:20,ESCAPE:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT_ARROW:37,UP_ARROW:38,RIGHT_ARROW:39,DOWN_ARROW:40,INSERT:45,DELETE:46,HELP:47,LEFT_WINDOW:91,RIGHT_WINDOW:92,SELECT:93,NUMPAD_0:96,NUMPAD_1:97,NUMPAD_2:98,NUMPAD_3:99,NUMPAD_4:100,NUMPAD_5:101,NUMPAD_6:102,NUMPAD_7:103,NUMPAD_8:104,NUMPAD_9:105,NUMPAD_MULTIPLY:106,NUMPAD_PLUS:107,NUMPAD_ENTER:108,NUMPAD_MINUS:109,NUMPAD_PERIOD:110,NUMPAD_DIVIDE:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,NUM_LOCK:144,SCROLL_LOCK:145,UP_DPAD:175,DOWN_DPAD:176,LEFT_DPAD:177,RIGHT_DPAD:178,copyKey:_2("mac")&&!_2("air")?(_2("safari")?91:224):17};}); \ No newline at end of file
diff --git a/lib/dojo/keys.js.uncompressed.js b/lib/dojo/keys.js.uncompressed.js
new file mode 100644
index 000000000..e6dbd3d61
--- /dev/null
+++ b/lib/dojo/keys.js.uncompressed.js
@@ -0,0 +1,80 @@
+define("dojo/keys", ["./_base/kernel", "./_base/sniff"], function(dojo, has) {
+ // module:
+ // dojo/keys
+ // summary:
+ // key constants
+// Constants
+
+// Public: client code should test
+// keyCode against these named constants, as the
+// actual codes can vary by browser.
+return dojo.keys = {
+ // summary:
+ // Definitions for common key values
+ BACKSPACE: 8,
+ TAB: 9,
+ CLEAR: 12,
+ ENTER: 13,
+ SHIFT: 16,
+ CTRL: 17,
+ ALT: 18,
+ META: has("safari") ? 91 : 224, // the apple key on macs
+ PAUSE: 19,
+ CAPS_LOCK: 20,
+ ESCAPE: 27,
+ SPACE: 32,
+ PAGE_UP: 33,
+ PAGE_DOWN: 34,
+ END: 35,
+ HOME: 36,
+ LEFT_ARROW: 37,
+ UP_ARROW: 38,
+ RIGHT_ARROW: 39,
+ DOWN_ARROW: 40,
+ INSERT: 45,
+ DELETE: 46,
+ HELP: 47,
+ LEFT_WINDOW: 91,
+ RIGHT_WINDOW: 92,
+ SELECT: 93,
+ NUMPAD_0: 96,
+ NUMPAD_1: 97,
+ NUMPAD_2: 98,
+ NUMPAD_3: 99,
+ NUMPAD_4: 100,
+ NUMPAD_5: 101,
+ NUMPAD_6: 102,
+ NUMPAD_7: 103,
+ NUMPAD_8: 104,
+ NUMPAD_9: 105,
+ NUMPAD_MULTIPLY: 106,
+ NUMPAD_PLUS: 107,
+ NUMPAD_ENTER: 108,
+ NUMPAD_MINUS: 109,
+ NUMPAD_PERIOD: 110,
+ NUMPAD_DIVIDE: 111,
+ F1: 112,
+ F2: 113,
+ F3: 114,
+ F4: 115,
+ F5: 116,
+ F6: 117,
+ F7: 118,
+ F8: 119,
+ F9: 120,
+ F10: 121,
+ F11: 122,
+ F12: 123,
+ F13: 124,
+ F14: 125,
+ F15: 126,
+ NUM_LOCK: 144,
+ SCROLL_LOCK: 145,
+ UP_DPAD: 175,
+ DOWN_DPAD: 176,
+ LEFT_DPAD: 177,
+ RIGHT_DPAD: 178,
+ // virtual key mapping
+ copyKey: has("mac") && !has("air") ? (has("safari") ? 91 : 224 ) : 17
+};
+});
diff --git a/lib/dojo/lib/backCompat.js b/lib/dojo/lib/backCompat.js
deleted file mode 100644
index 101f4e520..000000000
--- a/lib/dojo/lib/backCompat.js
+++ /dev/null
@@ -1,283 +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 = dojo/lib/backCompat
-//
-// This module defines those dojo properties/methods that are defined by
-// dojo/_base/_loader/loader and are still needed when loading with and
-// AMD loader (when loading with an AMD loader, dojo/_base/_loader/loader
-// is never loaded).
-//
-// note: this module is relevant only when loading dojo with an AMD loader;
-// it is never evaluated otherwise.
-
-define(["require", "dojo/_base/_loader/bootstrap"], function(require, dojo){
- // the following dojo properties do not exist in the AMD-loaded version of dojo 1.x:
- var names= [
- "_moduleHasPrefix",
- "_loadPath",
- "_loadUri",
- "_loadUriAndCheck",
- "loaded",
- "_callLoaded",
- "_getModuleSymbols",
- "_loadModule",
- "require",
- "provide",
- "platformRequire",
- "requireIf",
- "requireAfterIf",
- "registerModulePath"
- ], i, name;
- for(i = 0; i<names.length;){
- name = names[i++];
- dojo[name] = (function(name) {
- return function(){
- console.warn("dojo." + name + " not available when using an AMD loader.");
- };
- })(name);
- }
-
- // define dojo.addOnLoad in terms of the DOMContentLoaded detection available from the AMD loaders
- // (requirejs and bdBuild). Note that the behavior of this feature is slightly different compared to the dojo
- // v1.x sync loader. There, the onload queue is fired upon detecting both DOMContentLoaded *and* all
- // demanded modules have arrived. It is impossible to simulate this behavior with requirejs since it does
- // not publish its internal status (it is possible with bdLoad).
- // TODO: consider taking ownership of this API back from the loader.
- // TODO: consider requesting requirejs publish more enough internal state to determine if all demanded
- // modules have been defined.
- var
- argsToArray = function(args) {
- var result = [], i;
- for(i = 0; i<args.length;){
- result.push(args[i++]);
- }
- return result;
- },
-
- simpleHitch = function(context, callback){
- if(callback){
- return (typeof callback=="string") ?
- function(){context[callback]();} :
- function(){callback.call(context);};
- }else{
- return context;
- }
- };
- dojo.ready = dojo.addOnLoad = function(context, callback){
- require.ready(callback ? simpleHitch(context, callback) : context);
- };
- dojo.addOnLoad(function() {
- dojo.postLoad = dojo.config.afterOnLoad = true;
- });
- var dca = dojo.config.addOnLoad;
- if(dca){
- dojo.addOnLoad[(dca instanceof Array ? "apply" : "call")](dojo, dca);
- }
-
- // TODO: in the dojo 1.x sync loader the array dojo._loaders holds the queue of callbacks to be executed
- // upon DOMContentLoaded. This queue is manipulated directly by dojo/uacss, dojo/parser, dijit/_base/wia
- // and others (at least in dojox). This is also impossible to simulate universally across all AMD loaders.
- // The following will at least accept client code accessing dojo._loaders , dojo._loaders.unshift, and
- // dojo._loaders.splice--which is all that exists in the current dojo/dijit code stacks.
- var
- loaders = dojo._loaders = [],
- runLoaders = function(){
- var temp= loaders.slice(0);
- Array.prototype.splice.apply(loaders, [0, loaders.length]);
- while(temp.length){
- temp.shift().call();
- };
- };
- loaders.unshift = function() {
- Array.prototype.unshift.apply(loaders, argsToArray(arguments));
- require.ready(runLoaders);
- };
- loaders.splice = function() {
- Array.prototype.splice.apply(loaders, argsToArray(arguments));
- require.ready(runLoaders);
- };
-
- //TODO: put unload handling in a separate module
- var unloaders = dojo._unloaders = [];
- dojo.unloaded = function(){
- while(unloaders.length){
- unloaders.pop().call();
- }
- };
-
- //TODO: kill this low-value function when it is exorcised from dojo
- dojo._onto = function(arr, obj, fn){
- arr.push(fn ? simpleHitch(obj, fn) : obj);
- };
-
- //TODO: kill this when the bootstrap is rewritten to not include DOMContentLoaded detection
- // (it should probably be just a module) for now, just sink the detection; leverage the
- // AMD loaders to handle DOMContentLoaded detection
- dojo._modulesLoaded = function(){};
-
- //TODO: kill this when we understand its purpose relative to AMD
- dojo.loadInit = function(init){
- init();
- };
-
- var amdModuleName= function(moduleName){
- return moduleName.replace(/\./g, "/");
- };
-
- dojo.getL10nName = function(moduleName, bundleName, locale){
- locale = locale ? locale.toLowerCase() : dojo.locale;
- moduleName = "i18n!" + amdModuleName(moduleName);
- return (/root/i.test(locale)) ?
- (moduleName + "/nls/" + bundleName) :
- (moduleName + "/nls/" + locale + "/" + bundleName);
- };
-
- dojo.requireLocalization = function(moduleName, bundleName, locale){
- // NOTE: locales other than the locale specified in dojo.locale need to be specifically
- // declared as a module dependency when using AMD.
- if(require.vendor!="altoviso.com"){
- locale = !locale || locale.toLowerCase() === dojo.locale ? "root" : locale;
- }
- return require(dojo.getL10nName(moduleName, bundleName, locale));
- };
-
- dojo.i18n= {
- getLocalization: dojo.requireLocalization,
- normalizeLocale: function(locale){
- var result = locale ? locale.toLowerCase() : dojo.locale;
- if(result == "root"){
- result = "ROOT";
- }
- return result;
- }
- };
-
- //TODO: dojo._Url seems rarely used and long to be part of the boostrap; consider moving
- //note: this routine cut and paste from dojo/_base/_loader/loader
- var
- ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),
- ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$");
- dojo._Url = function(){
- var n = null,
- _a = arguments,
- uri = [_a[0]];
- // resolve uri components relative to each other
- for(var i = 1; i<_a.length; i++){
- if(!_a[i]){ continue; }
-
- // Safari doesn't support this.constructor so we have to be explicit
- // FIXME: Tracked (and fixed) in Webkit bug 3537.
- // http://bugs.webkit.org/show_bug.cgi?id=3537
- var relobj = new dojo._Url(_a[i]+""),
- uriobj = new dojo._Url(uri[0]+"");
-
- if(
- relobj.path == "" &&
- !relobj.scheme &&
- !relobj.authority &&
- !relobj.query
- ){
- if(relobj.fragment != n){
- uriobj.fragment = relobj.fragment;
- }
- relobj = uriobj;
- }else if(!relobj.scheme){
- relobj.scheme = uriobj.scheme;
-
- if(!relobj.authority){
- relobj.authority = uriobj.authority;
-
- if(relobj.path.charAt(0) != "/"){
- var path = uriobj.path.substring(0,
- uriobj.path.lastIndexOf("/") + 1) + relobj.path;
-
- var segs = path.split("/");
- for(var j = 0; j < segs.length; j++){
- if(segs[j] == "."){
- // flatten "./" references
- if(j == segs.length - 1){
- segs[j] = "";
- }else{
- segs.splice(j, 1);
- j--;
- }
- }else if(j > 0 && !(j == 1 && segs[0] == "") &&
- segs[j] == ".." && segs[j-1] != ".."){
- // flatten "../" references
- if(j == (segs.length - 1)){
- segs.splice(j, 1);
- segs[j - 1] = "";
- }else{
- segs.splice(j - 1, 2);
- j -= 2;
- }
- }
- }
- relobj.path = segs.join("/");
- }
- }
- }
-
- uri = [];
- if(relobj.scheme){
- uri.push(relobj.scheme, ":");
- }
- if(relobj.authority){
- uri.push("//", relobj.authority);
- }
- uri.push(relobj.path);
- if(relobj.query){
- uri.push("?", relobj.query);
- }
- if(relobj.fragment){
- uri.push("#", relobj.fragment);
- }
- }
-
- this.uri = uri.join("");
-
- // break the uri into its main components
- var r = this.uri.match(ore);
-
- this.scheme = r[2] || (r[1] ? "" : n);
- this.authority = r[4] || (r[3] ? "" : n);
- this.path = r[5]; // can never be undefined
- this.query = r[7] || (r[6] ? "" : n);
- this.fragment = r[9] || (r[8] ? "" : n);
-
- if(this.authority != n){
- // server based naming authority
- r = this.authority.match(ire);
-
- this.user = r[3] || n;
- this.password = r[4] || n;
- this.host = r[6] || r[7]; // ipv6 || ipv4
- this.port = r[9] || n;
- }
- };
-
- dojo._Url.prototype.toString = function(){ return this.uri; };
-
- dojo.moduleUrl = function(module, url){
- if(!module){
- //TODO: don't understand why this would ever be so, but that's the logic in loader
- return null;
- }
- module = amdModuleName(module) + (url ? ("/" + url) : "");
- var
- type= "",
- match= module.match(/(.+)(\.[^\/]*)$/);
- if (match) {
- module= match[1];
- type= match[2];
- }
- return new dojo._Url(require.nameToUrl(module, type)); // dojo._Url
- };
-
- return dojo;
-});
diff --git a/lib/dojo/lib/kernel.js b/lib/dojo/lib/kernel.js
deleted file mode 100644
index 94a3fefae..000000000
--- a/lib/dojo/lib/kernel.js
+++ /dev/null
@@ -1,26 +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 = dojo/lib/kernel
-//
-// This module ensures the dojo object is initialized by...
-//
-// * dojo/_base/_loader/bootstrap
-// * dojo/lib/backCompat
-// * dojo/_base/_loader/hostenv_browser
-//
-// This is roughly equivalent to the work that dojo.js does by injecting
-// bootstrap, loader, and hostenv_browser.
-//
-// note: this module is relevant only when loading dojo with an AMD loader;
-// it is never evaluated otherwise.
-
-// for now, we publish dojo into the global namespace because so many tests and apps expect it.
-define(["dojo/_base/_loader/hostenv_browser"], function(dojo_){
- dojo= dojo_;
- return dojo_;
-});
diff --git a/lib/dojo/lib/main-browser.js b/lib/dojo/lib/main-browser.js
deleted file mode 100644
index cb5cc2a43..000000000
--- a/lib/dojo/lib/main-browser.js
+++ /dev/null
@@ -1,61 +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 = dojo
-//
-// This is a package main module for the dojo package implemented so that the *absolute minimal*
-// changes are made to the dojo 1.x code. It is by no means optimal and should/will be replaced with
-// a less naive design--particularly as dojo v2.0 evolves.
-//
-// There are a few key design weaknesses in this implementation:
-//
-// * generally, v1.x bootstrap, tests, and apps assume dojo is global
-//
-// * the v1.x dojo/_base modules assume dojo is defined before they are defined
-// and their factory functions go about populating dojo--which is really part of defining
-// dojo. This leads to the appearance of a circular dependency and is a somewhat obtuse
-// design since the dojo object must be delivered to them under a different module
-// name (dojo/lib/kernel).
-//
-// * bootstrap modules tend to incorporate unrelated features (e.g., hostenv_browser includes
-// DOMContentLoad detection, thereby making it impossible to build out this feature if a
-// particular app does not need it).
-//
-// * The back compatibility layer requires/contains some non-optimal code that needs to be improved.
-//
-// As 1.7 and 2.0 evolve, these items will be addressed with more robust implementation.
-//
-// The boot sequence is as follows:
-//
-// dojo (this module) depends on...
-// dojo/lib/kernel which depends on...
-// dojo/_base/_loader/hostenv_browser which depends on...
-// dojo/lib/backCompat which depends on...
-// dojo/_base/_loader/bootstrap which depends on nothing
-//
-// This module further depends on the fairly ordinary modules in dojo/_base; each of these
-// modules depends on dojo/lib/kernel (at least) which provide the dojo object for them to augment.
-
-define("dojo", [
- "dojo/lib/kernel",
- "dojo/_base/lang",
- "dojo/_base/array",
- "dojo/_base/declare",
- "dojo/_base/connect",
- "dojo/_base/Deferred",
- "dojo/_base/json",
- "dojo/_base/Color",
- "dojo/_base/window",
- "dojo/_base/event",
- "dojo/_base/html",
- "dojo/_base/NodeList",
- "dojo/_base/query",
- "dojo/_base/xhr",
- "dojo/_base/fx"
-], function(dojo){
- return dojo;
-});
diff --git a/lib/dojo/lib/plugins/i18n.js b/lib/dojo/lib/plugins/i18n.js
deleted file mode 100644
index 93a57f76b..000000000
--- a/lib/dojo/lib/plugins/i18n.js
+++ /dev/null
@@ -1,94 +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
-*/
-
-
-//
-// dojo i18n! plugin
-//
-// We choose to include our own plugin in hopes of leveraging functionality already contained in dojo
-// and thereby reducing the size of the plugin compared to various loader implementations. Naturally, this
-// allows AMD loaders to be used without their plugins.
-
-// CAUTION, this module may return improper results if the AMD loader does not support toAbsMid and client
-// code passes relative plugin resource module ids. In that case, you should consider using the i18n! plugin
-// that comes with your loader.
-
-define(["dojo"], function(dojo) {
- var
- nlsRe=
- // regexp for reconstructing the master bundle name from parts of the regexp match
- // nlsRe.exec("foo/bar/baz/nls/en-ca/foo") gives:
- // ["foo/bar/baz/nls/en-ca/foo", "foo/bar/baz/nls/", "/", "/", "en-ca", "foo"]
- // nlsRe.exec("foo/bar/baz/nls/foo") gives:
- // ["foo/bar/baz/nls/foo", "foo/bar/baz/nls/", "/", "/", "foo", ""]
- // so, if match[5] is blank, it means this is the top bundle definition.
- // courtesy of http://requirejs.org
- /(^.*(^|\/)nls(\/|$))([^\/]*)\/?([^\/]*)/,
-
- getAvailableLocales= function(
- root,
- locale,
- bundlePath,
- bundleName
- ){
- // return a vector of module ids containing all available locales with respect to the target locale
- // For example, assuming:
- // * the root bundle indicates specific bundles for "fr" and "fr-ca",
- // * bundlePath is "myPackage/nls"
- // * bundleName is "myBundle"
- // Then a locale argument of "fr-ca" would return
- // ["myPackage/nls/myBundle", "myPackage/nls/fr/myBundle", "myPackage/nls/fr-ca/myBundle"]
- // Notice that bundles are returned least-specific to most-specific, starting with the root.
-
- for(var result= [bundlePath + bundleName], localeParts= locale.split("-"), current= "", i= 0; i<localeParts.length; i++){
- current+= localeParts[i];
- if(root[current]){
- result.push(bundlePath + current + "/" + bundleName);
- }
- }
- return result;
- },
-
- cache= {};
-
- return {
- load: function(id, require, load){
- // note: id may be relative
- var
- match= nlsRe.exec(id),
- bundlePath= (require.toAbsMid && require.toAbsMid(match[1])) || match[1],
- bundleName= match[5] || match[4],
- bundlePathAndName= bundlePath + bundleName,
- locale= (match[5] && match[4]) || dojo.locale,
- target= bundlePathAndName + "/" + locale;
-
- // if we've already resolved this request, just return it
- if (cache[target]) {
- load(cache[target]);
- return;
- }
-
- // get the root bundle which instructs which other bundles are required to contruct the localized bundle
- require([bundlePathAndName], function(root){
- var
- current= cache[bundlePathAndName + "/"]= dojo.clone(root.root),
- availableLocales= getAvailableLocales(root, locale, bundlePath, bundleName);
- require(availableLocales, function(){
- for (var i= 1; i<availableLocales.length; i++){
- cache[bundlePathAndName + "/" + availableLocales[i]]= current= dojo.mixin(dojo.clone(current), arguments[i]);
- }
- // target may not have been resolve (e.g., maybe only "fr" exists when "fr-ca" was requested)
- cache[target]= current;
- load(current);
- });
- });
- },
-
- cache: function(mid, value){
- cache[mid]= value;
- }
- };
-});
diff --git a/lib/dojo/lib/plugins/text.js b/lib/dojo/lib/plugins/text.js
deleted file mode 100644
index 75894a32a..000000000
--- a/lib/dojo/lib/plugins/text.js
+++ /dev/null
@@ -1,70 +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
-*/
-
-
-//
-// dojo text! plugin
-//
-// We choose to include our own plugin in hopes of leveraging functionality already contained in dojo
-// and thereby reducing the size of the plugin compared to various loader implementations. Naturally, this
-// allows AMD loaders to be used without their plugins.
-
-// CAUTION, this module may return improper results if the AMD loader does not support toAbsMid and client
-// code passes relative plugin resource module ids. In that case, you should consider using the text! plugin
-// that comes with your loader.
-
-define(["dojo", "dojo/cache"], function(dojo){
- var
- cached= {},
-
- cache= function(cacheId, url, value){
- cached[cacheId]= value;
- dojo.cache({toString:function(){return url;}}, value);
- },
-
- strip= function(text){
- //note: this function courtesy of James Burke (https://github.com/jrburke/requirejs)
- //Strips <?xml ...?> declarations so that external SVG and XML
- //documents can be added to a document without worry. Also, if the string
- //is an HTML document, only the part inside the body tag is returned.
- if(text){
- text= text.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, "");
- var matches= text.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
- if(matches){
- text= matches[1];
- }
- }else{
- text = "";
- }
- return text;
- };
-
- return {
- load:function(id, require, load){
- var match, cacheId, url, parts= id.split("!");
- if(require.toAbsMid){
- match= parts[0].match(/(.+)(\.[^\/]*)$/);
- cacheId= match ? require.toAbsMid(match[1]) + match[2] : require.toAbsMid(parts[0]);
- if(cacheId in cached){
- load(parts[1]=="strip" ? strip(cached[cacheId]) : cached[cacheId]);
- return;
- }
- }
- url= require.toUrl(parts[0]);
- dojo.xhrGet({
- url:url,
- load:function(text){
- cacheId && cache(cacheId, url, text);
- load(parts[1]=="strip" ? strip(text) : text);
- }
- });
- },
-
- cache:function(cacheId, mid, type, value) {
- cache(cacheId, require.nameToUrl(mid) + type, value);
- }
- };
-});
diff --git a/lib/dojo/loadInit.js b/lib/dojo/loadInit.js
new file mode 100644
index 000000000..e5f966fe0
--- /dev/null
+++ b/lib/dojo/loadInit.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/loadInit",["./_base/loader"],function(_1){return {dynamic:0,normalize:function(id){return id;},load:_1.loadInit};}); \ No newline at end of file
diff --git a/lib/dojo/loadInit.js.uncompressed.js b/lib/dojo/loadInit.js.uncompressed.js
new file mode 100644
index 000000000..373931d12
--- /dev/null
+++ b/lib/dojo/loadInit.js.uncompressed.js
@@ -0,0 +1,7 @@
+define("dojo/loadInit", ["./_base/loader"], function(loader){
+ return {
+ dynamic:0,
+ normalize:function(id){return id;},
+ load:loader.loadInit
+ };
+});
diff --git a/lib/dojo/main.js b/lib/dojo/main.js
new file mode 100644
index 000000000..f1443bcf6
--- /dev/null
+++ b/lib/dojo/main.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/main",["./_base/kernel","./has","require","./_base/sniff","./_base/lang","./_base/array","./ready","./_base/declare","./_base/connect","./_base/Deferred","./_base/json","./_base/Color","./has!dojo-firebug?./_firebug/firebug","./_base/browser","./_base/loader"],function(_1,_2,_3,_4,_5,_6,_7){if(_1.config.isDebug){_3(["./_firebug/firebug"]);}true||_2.add("dojo-config-require",1);if(1){var _8=_1.config.require;if(_8){_8=_6.map(_5.isArray(_8)?_8:[_8],function(_9){return _9.replace(/\./g,"/");});if(_1.isAsync){_3(_8);}else{_7(1,function(){_3(_8);});}}}return _1;}); \ No newline at end of file
diff --git a/lib/dojo/main.js.uncompressed.js b/lib/dojo/main.js.uncompressed.js
new file mode 100644
index 000000000..18850843c
--- /dev/null
+++ b/lib/dojo/main.js.uncompressed.js
@@ -0,0 +1,50 @@
+define("dojo/main", [
+ "./_base/kernel",
+ "./has",
+ "require",
+ "./_base/sniff",
+ "./_base/lang",
+ "./_base/array",
+ "./ready",
+ "./_base/declare",
+ "./_base/connect",
+ "./_base/Deferred",
+ "./_base/json",
+ "./_base/Color",
+ "./has!dojo-firebug?./_firebug/firebug",
+ "./_base/browser",
+ "./_base/loader"], function(dojo, has, require, sniff, lang, array, ready){
+ // module:
+ // dojo/main
+ // summary:
+ // This is the package main module for the dojo package; it loads dojo base appropriate for the execution environment.
+
+ // the preferred way to load the dojo firebug console is by setting has("dojo-firebug") true in dojoConfig
+ // the isDebug config switch is for backcompat and will work fine in sync loading mode; it works in
+ // async mode too, but there's no guarantee when the module is loaded; therefore, if you need a firebug
+ // console guarnanteed at a particular spot in an app, either set config.has["dojo-firebug"] true before
+ // loading dojo.js or explicitly include dojo/_firebug/firebug in a dependency list.
+ if(dojo.config.isDebug){
+ require(["./_firebug/firebug"]);
+ }
+
+ // dojoConfig.require is deprecated; use the loader configuration property deps
+ true || has.add("dojo-config-require", 1);
+ if(1){
+ var deps= dojo.config.require;
+ if(deps){
+ // dojo.config.require may be dot notation
+ deps= array.map(lang.isArray(deps) ? deps : [deps], function(item){ return item.replace(/\./g, "/"); });
+ if(dojo.isAsync){
+ require(deps);
+ }else{
+ // this is a bit janky; in 1.6- dojo is defined before these requires are applied; but in 1.7+
+ // dojo isn't defined until returning from this module; this is only a problem in sync mode
+ // since we're in sync mode, we know we've got our loader with its priority ready queue
+ ready(1, function(){require(deps);});
+ }
+ }
+ }
+
+ return dojo;
+});
diff --git a/lib/dojo/mouse.js b/lib/dojo/mouse.js
new file mode 100644
index 000000000..397b5ee81
--- /dev/null
+++ b/lib/dojo/mouse.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/mouse",["./_base/kernel","./on","./has","./dom","./_base/window"],function(_1,on,_2,_3,_4){_2.add("dom-quirks",_4.doc&&_4.doc.compatMode=="BackCompat");_2.add("events-mouseenter",_4.doc&&"onmouseenter" in _4.doc.createElement("div"));var _5;if(_2("dom-quirks")||!_2("dom-addeventlistener")){_5={LEFT:1,MIDDLE:4,RIGHT:2,isButton:function(e,_6){return e.button&_6;},isLeft:function(e){return e.button&1;},isMiddle:function(e){return e.button&4;},isRight:function(e){return e.button&2;}};}else{_5={LEFT:0,MIDDLE:1,RIGHT:2,isButton:function(e,_7){return e.button==_7;},isLeft:function(e){return e.button==0;},isMiddle:function(e){return e.button==1;},isRight:function(e){return e.button==2;}};}_1.mouseButtons=_5;function _8(_9,_a){var _b=function(_c,_d){return on(_c,_9,function(_e){if(!_3.isDescendant(_e.relatedTarget,_a?_e.target:_c)){return _d.call(this,_e);}});};if(!_a){_b.bubble=_8(_9,true);}return _b;};return {enter:_8("mouseover"),leave:_8("mouseout"),isLeft:_5.isLeft,isMiddle:_5.isMiddle,isRight:_5.isRight};}); \ No newline at end of file
diff --git a/lib/dojo/mouse.js.uncompressed.js b/lib/dojo/mouse.js.uncompressed.js
new file mode 100644
index 000000000..c6eceb476
--- /dev/null
+++ b/lib/dojo/mouse.js.uncompressed.js
@@ -0,0 +1,127 @@
+define("dojo/mouse", ["./_base/kernel", "./on", "./has", "./dom", "./_base/window"], function(dojo, on, has, dom, win){
+
+ /*=====
+ dojo.mouse = {
+ // summary:
+ // This module provide mouse event handling utility functions and exports
+ // mouseenter and mouseleave event emulation.
+ // enter: Synthetic Event
+ // This is an extension event for the mouseenter that IE provides, emulating the
+ // behavior on other browsers.
+ // leave: Synthetic Event
+ // This is an extension event for the mouseleave that IE provides, emulating the
+ // behavior on other browsers.
+ // isLeft: Function
+ // Test an event object (from a mousedown event) to see if the left button was pressed.
+ // isMiddle: Function
+ // Test an event object (from a mousedown event) to see if the middle button was pressed.
+ // isRight: Function
+ // Test an event object (from a mousedown event) to see if the right button was pressed.
+ // example:
+ // To use these events, you register a mouseenter like this:
+ // | define(["dojo/on", dojo/mouse"], function(on, mouse){
+ // | on(targetNode, mouse.enter, function(event){
+ // | dojo.addClass(targetNode, "highlighted");
+ // | });
+ // | on(targetNode, mouse.leave, function(event){
+ // | dojo.removeClass(targetNode, "highlighted");
+ // | });
+ };
+ ======*/
+
+ has.add("dom-quirks", win.doc && win.doc.compatMode == "BackCompat");
+ has.add("events-mouseenter", win.doc && "onmouseenter" in win.doc.createElement("div"));
+
+ var mouseButtons;
+ if(has("dom-quirks") || !has("dom-addeventlistener")){
+ mouseButtons = {
+ LEFT: 1,
+ MIDDLE: 4,
+ RIGHT: 2,
+ // helper functions
+ isButton: function(e, button){ return e.button & button; },
+ isLeft: function(e){ return e.button & 1; },
+ isMiddle: function(e){ return e.button & 4; },
+ isRight: function(e){ return e.button & 2; }
+ };
+ }else{
+ mouseButtons = {
+ LEFT: 0,
+ MIDDLE: 1,
+ RIGHT: 2,
+ // helper functions
+ isButton: function(e, button){ return e.button == button; },
+ isLeft: function(e){ return e.button == 0; },
+ isMiddle: function(e){ return e.button == 1; },
+ isRight: function(e){ return e.button == 2; }
+ };
+ }
+ dojo.mouseButtons = mouseButtons;
+
+/*=====
+ dojo.mouseButtons = {
+ // LEFT: Number
+ // Numeric value of the left mouse button for the platform.
+ LEFT: 0,
+ // MIDDLE: Number
+ // Numeric value of the middle mouse button for the platform.
+ MIDDLE: 1,
+ // RIGHT: Number
+ // Numeric value of the right mouse button for the platform.
+ RIGHT: 2,
+
+ isButton: function(e, button){
+ // summary:
+ // Checks an event object for a pressed button
+ // e: Event
+ // Event object to examine
+ // button: Number
+ // The button value (example: dojo.mouseButton.LEFT)
+ return e.button == button; // Boolean
+ },
+ isLeft: function(e){
+ // summary:
+ // Checks an event object for the pressed left button
+ // e: Event
+ // Event object to examine
+ return e.button == 0; // Boolean
+ },
+ isMiddle: function(e){
+ // summary:
+ // Checks an event object for the pressed middle button
+ // e: Event
+ // Event object to examine
+ return e.button == 1; // Boolean
+ },
+ isRight: function(e){
+ // summary:
+ // Checks an event object for the pressed right button
+ // e: Event
+ // Event object to examine
+ return e.button == 2; // Boolean
+ }
+ };
+=====*/
+
+ function eventHandler(type, mustBubble){
+ // emulation of mouseenter/leave with mouseover/out using descendant checking
+ var handler = function(node, listener){
+ return on(node, type, function(evt){
+ if(!dom.isDescendant(evt.relatedTarget, mustBubble ? evt.target : node)){
+ return listener.call(this, evt);
+ }
+ });
+ };
+ if(!mustBubble){
+ handler.bubble = eventHandler(type, true);
+ }
+ return handler;
+ }
+ return {
+ enter: eventHandler("mouseover"),
+ leave: eventHandler("mouseout"),
+ isLeft: mouseButtons.isLeft,
+ isMiddle: mouseButtons.isMiddle,
+ isRight: mouseButtons.isRight
+ };
+});
diff --git a/lib/dojo/nls/ar/colors.js b/lib/dojo/nls/ar/colors.js
index 50e4a1283..a022327a9 100644
--- a/lib/dojo/nls/ar/colors.js
+++ b/lib/dojo/nls/ar/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"أزرق معدني فاتح","orangered":"أحمر مائل للبرتقالي","midnightblue":"أزرق بحري","cadetblue":"أزرق ملون بالرمادي","seashell":"أبيض مائل للأصفر فاتح","slategrey":"رمادي اردوازي","coral":"مرجاني","darkturquoise":"تركواز داكن","antiquewhite":"أبيض عتيق","mediumspringgreen":"أخضر ربيعي متوسط","salmon":"برتقالي وردي شاحب","darkgrey":"رمادي داكن","ivory":"عاجي","greenyellow":"أخضر مائل للأصفر","mistyrose":"وردي","lightsalmon":"فضي فاتح","silver":"فضي","dimgrey":"رمادي شاحب","orange":"برتقالي","white":"أبيض","navajowhite":"أبيض ملاحي","royalblue":"أزرق ملكي","deeppink":"أحمر وردي غامق","lime":"ليموني","oldlace":"برتقالي مائل للأصفر شاحب","chartreuse":"أخضر مائل للصفرة","darkcyan":"أزرق سماوي داكن","yellow":"أصفر","linen":"كتاني","olive":"أخضر زيتوني داكن","gold":"ذهبي","lawngreen":"أخضر بلون العشب","lightyellow":"أصفر فاتح","tan":"خمري","darkviolet":"بنفسجي داكن","lightslategrey":"رمادي اردوازي فاتح","grey":"رمادي","darkkhaki":"كاكي داكن","green":"أخضر","deepskyblue":"أزرق سماوي غامق","aqua":"أزرق مائي","sienna":"بني محروق","mintcream":"أصفر شاحب مائل للأخضر الزرعي","rosybrown":"بني وردي","mediumslateblue":"أزرق اردوازي متوسط","magenta":"أحمر قرمزي","lightseagreen":"أخضر مائل للأزرق فاتح","cyan":"أزرق سماوي","olivedrab":"أسود فاتح","darkgoldenrod":"أصفر ذهبي داكن","slateblue":"أزرق اردوازي","mediumaquamarine":"أزرق مائل للأخضر (زبرجد) متوسط","lavender":"أرجواني شاحب","mediumseagreen":"أخضر مائل للأزرق متوسط","maroon":"أحمر داكن","darkslategray":"رمادي اردوازي داكن","mediumturquoise":"تركواز متوسط","ghostwhite":"أبيض شفاف","darkblue":"أزرق داكن","mediumvioletred":"أحمر-بنفسجي متوسط","brown":"بني","lightgray":"رمادي فاتح","sandybrown":"بني مائل للصفرة","pink":"وردي","firebrick":"أصفر زاهي","indigo":"نيلي","snow":"أبيض ثلجي","darkorchid":"أرجواني داكن","turquoise":"تركواز","chocolate":"بني غامق","springgreen":"أخضر ربيعي","moccasin":"نحاسي أحمر","navy":"أزرق داكن","lemonchiffon":"أصفر شفاف","teal":"بترولي","floralwhite":"أبيض زهري","cornflowerblue":"أزرق عنبري","paleturquoise":"تركواز شاحب","purple":"ارجواني","gainsboro":"رمادي مائل للأزرق فاتح","plum":"أرجواني داكن","red":"أحمر","blue":"أزرق","forestgreen":"أخضر بلون أشجار الغابات","darkgreen":"أخضر داكن","honeydew":"أبيض مائل للأخضر","darkseagreen":"أخضر مائل للأزرق داكن","lightcoral":"مرجاني فاتح","palevioletred":"أحمر-بنفسجي شاحب","mediumpurple":"قرمزي متوسط","saddlebrown":"بني فاتح","darkmagenta":"قرمزي داكن","thistle":"ارجواني شاحب","whitesmoke":"دخان أبيض","wheat":"أخضر قمحي","violet":"بنفسجي","lightskyblue":"أزرق سماوي فاتح","goldenrod":"أصفر ذهبي","mediumblue":"أزرق متوسط","skyblue":"أزرق سماوي","crimson":"قرمزي","darksalmon":"فضي داكن","darkred":"أحمر داكن","darkslategrey":"رمادي اردوازي داكن","peru":"بني جملي","lightgrey":"رمادي فاتح","lightgoldenrodyellow":"أصفر ذهبي فاتح","blanchedalmond":"أخضر مائل للبياض","aliceblue":"أزرق فاتح","bisque":"أصفر برتقالي الى رمادي مصفر","slategray":"رمادي اردوازي","palegoldenrod":"أصفر ذهبي شاحب","darkorange":"برتقالي داكن","aquamarine":"أزرق مائل للأخضر (زبرجد)","lightgreen":"أخضر فاتح","burlywood":"خشبي","dodgerblue":"أزرق عنبري","darkgray":"رمادي داكن","lightcyan":"سماوي فاتح","powderblue":"أزرق مائل للأصفر","blueviolet":"أزرق-بنفسجي","orchid":"أرجواني فاتح","dimgray":"رمادي شاحب","beige":"بيج","fuchsia":"فوشيا","lavenderblush":"أحمر أرجواني","hotpink":"أحمر وردي زاهي","steelblue":"أزرق معدني","tomato":"أحمر مائل للأصفر","lightpink":"وردي فاتح","limegreen":"أخضر ليموني","indianred":"أحمر هندي","papayawhip":"خوخي فاتح","lightslategray":"رمادي اردوازي فاتح","gray":"رمادي","mediumorchid":"أرجواني متوسط","cornsilk":"حريري","black":"أسود","seagreen":"أخضر مائل للأزرق","darkslateblue":"أزرق اردوازي داكن","khaki":"كاكي","lightblue":"أزرق فاتح","palegreen":"أخضر شاحب","azure":"أزرق سماوي","peachpuff":"خوخي مائل للأصفر","darkolivegreen":"أخضر زيتوني داكن","yellowgreen":"أخضر مائل للأصفر"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/ar/colors",({aliceblue:"أزرق فاتح",antiquewhite:"أبيض عتيق",aqua:"أزرق مائي",aquamarine:"أزرق مائل للأخضر (زبرجد)",azure:"أزرق سماوي",beige:"بيج",bisque:"أصفر برتقالي الى رمادي مصفر",black:"أسود",blanchedalmond:"أخضر مائل للبياض",blue:"أزرق",blueviolet:"أزرق-بنفسجي",brown:"بني",burlywood:"خشبي",cadetblue:"أزرق ملون بالرمادي",chartreuse:"أخضر مائل للصفرة",chocolate:"بني غامق",coral:"مرجاني",cornflowerblue:"أزرق عنبري",cornsilk:"حريري",crimson:"قرمزي",cyan:"أزرق سماوي",darkblue:"أزرق داكن",darkcyan:"أزرق سماوي داكن",darkgoldenrod:"أصفر ذهبي داكن",darkgray:"رمادي داكن",darkgreen:"أخضر داكن",darkgrey:"رمادي داكن",darkkhaki:"كاكي داكن",darkmagenta:"قرمزي داكن",darkolivegreen:"أخضر زيتوني داكن",darkorange:"برتقالي داكن",darkorchid:"أرجواني داكن",darkred:"أحمر داكن",darksalmon:"فضي داكن",darkseagreen:"أخضر مائل للأزرق داكن",darkslateblue:"أزرق اردوازي داكن",darkslategray:"رمادي اردوازي داكن",darkslategrey:"رمادي اردوازي داكن",darkturquoise:"تركواز داكن",darkviolet:"بنفسجي داكن",deeppink:"أحمر وردي غامق",deepskyblue:"أزرق سماوي غامق",dimgray:"رمادي شاحب",dimgrey:"رمادي شاحب",dodgerblue:"أزرق عنبري",firebrick:"أصفر زاهي",floralwhite:"أبيض زهري",forestgreen:"أخضر بلون أشجار الغابات",fuchsia:"فوشيا",gainsboro:"رمادي مائل للأزرق فاتح",ghostwhite:"أبيض شفاف",gold:"ذهبي",goldenrod:"أصفر ذهبي",gray:"رمادي",green:"أخضر",greenyellow:"أخضر مائل للأصفر",grey:"رمادي",honeydew:"أبيض مائل للأخضر",hotpink:"أحمر وردي زاهي",indianred:"أحمر هندي",indigo:"نيلي",ivory:"عاجي",khaki:"كاكي",lavender:"أرجواني شاحب",lavenderblush:"أحمر أرجواني",lawngreen:"أخضر بلون العشب",lemonchiffon:"أصفر شفاف",lightblue:"أزرق فاتح",lightcoral:"مرجاني فاتح",lightcyan:"سماوي فاتح",lightgoldenrodyellow:"أصفر ذهبي فاتح",lightgray:"رمادي فاتح",lightgreen:"أخضر فاتح",lightgrey:"رمادي فاتح",lightpink:"وردي فاتح",lightsalmon:"فضي فاتح",lightseagreen:"أخضر مائل للأزرق فاتح",lightskyblue:"أزرق سماوي فاتح",lightslategray:"رمادي اردوازي فاتح",lightslategrey:"رمادي اردوازي فاتح",lightsteelblue:"أزرق معدني فاتح",lightyellow:"أصفر فاتح",lime:"ليموني",limegreen:"أخضر ليموني",linen:"كتاني",magenta:"أحمر قرمزي",maroon:"أحمر داكن",mediumaquamarine:"أزرق مائل للأخضر (زبرجد) متوسط",mediumblue:"أزرق متوسط",mediumorchid:"أرجواني متوسط",mediumpurple:"قرمزي متوسط",mediumseagreen:"أخضر مائل للأزرق متوسط",mediumslateblue:"أزرق اردوازي متوسط",mediumspringgreen:"أخضر ربيعي متوسط",mediumturquoise:"تركواز متوسط",mediumvioletred:"أحمر-بنفسجي متوسط",midnightblue:"أزرق بحري",mintcream:"أصفر شاحب مائل للأخضر الزرعي",mistyrose:"وردي",moccasin:"نحاسي أحمر",navajowhite:"أبيض ملاحي",navy:"أزرق داكن",oldlace:"برتقالي مائل للأصفر شاحب",olive:"أخضر زيتوني داكن",olivedrab:"أسود فاتح",orange:"برتقالي",orangered:"أحمر مائل للبرتقالي",orchid:"أرجواني فاتح",palegoldenrod:"أصفر ذهبي شاحب",palegreen:"أخضر شاحب",paleturquoise:"تركواز شاحب",palevioletred:"أحمر-بنفسجي شاحب",papayawhip:"خوخي فاتح",peachpuff:"خوخي مائل للأصفر",peru:"بني جملي",pink:"وردي",plum:"أرجواني داكن",powderblue:"أزرق مائل للأصفر",purple:"ارجواني",red:"أحمر",rosybrown:"بني وردي",royalblue:"أزرق ملكي",saddlebrown:"بني فاتح",salmon:"برتقالي وردي شاحب",sandybrown:"بني مائل للصفرة",seagreen:"أخضر مائل للأزرق",seashell:"أبيض مائل للأصفر فاتح",sienna:"بني محروق",silver:"فضي",skyblue:"أزرق سماوي",slateblue:"أزرق اردوازي",slategray:"رمادي اردوازي",slategrey:"رمادي اردوازي",snow:"أبيض ثلجي",springgreen:"أخضر ربيعي",steelblue:"أزرق معدني",tan:"خمري",teal:"بترولي",thistle:"ارجواني شاحب",tomato:"أحمر مائل للأصفر",transparent:"شفاف",turquoise:"تركواز",violet:"بنفسجي",wheat:"أخضر قمحي",white:"أبيض",whitesmoke:"دخان أبيض",yellow:"أصفر",yellowgreen:"أخضر مائل للأصفر"})); \ No newline at end of file
diff --git a/lib/dojo/nls/ar/colors.js.uncompressed.js b/lib/dojo/nls/ar/colors.js.uncompressed.js
new file mode 100644
index 000000000..0b7fa59db
--- /dev/null
+++ b/lib/dojo/nls/ar/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/ar/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "أزرق فاتح",
+ antiquewhite: "أبيض عتيق",
+ aqua: "أزرق مائي",
+ aquamarine: "أزرق مائل للأخضر (زبرجد)",
+ azure: "أزرق سماوي",
+ beige: "بيج",
+ bisque: "أصفر برتقالي الى رمادي مصفر",
+ black: "أسود",
+ blanchedalmond: "أخضر مائل للبياض",
+ blue: "أزرق",
+ blueviolet: "أزرق-بنفسجي",
+ brown: "بني",
+ burlywood: "خشبي",
+ cadetblue: "أزرق ملون بالرمادي",
+ chartreuse: "أخضر مائل للصفرة",
+ chocolate: "بني غامق",
+ coral: "مرجاني",
+ cornflowerblue: "أزرق عنبري",
+ cornsilk: "حريري",
+ crimson: "قرمزي",
+ cyan: "أزرق سماوي",
+ darkblue: "أزرق داكن",
+ darkcyan: "أزرق سماوي داكن",
+ darkgoldenrod: "أصفر ذهبي داكن",
+ darkgray: "رمادي داكن",
+ darkgreen: "أخضر داكن",
+ darkgrey: "رمادي داكن", // same as darkgray
+ darkkhaki: "كاكي داكن",
+ darkmagenta: "قرمزي داكن",
+ darkolivegreen: "أخضر زيتوني داكن",
+ darkorange: "برتقالي داكن",
+ darkorchid: "أرجواني داكن",
+ darkred: "أحمر داكن",
+ darksalmon: "فضي داكن",
+ darkseagreen: "أخضر مائل للأزرق داكن",
+ darkslateblue: "أزرق اردوازي داكن",
+ darkslategray: "رمادي اردوازي داكن",
+ darkslategrey: "رمادي اردوازي داكن", // same as darkslategray
+ darkturquoise: "تركواز داكن",
+ darkviolet: "بنفسجي داكن",
+ deeppink: "أحمر وردي غامق",
+ deepskyblue: "أزرق سماوي غامق",
+ dimgray: "رمادي شاحب",
+ dimgrey: "رمادي شاحب", // same as dimgray
+ dodgerblue: "أزرق عنبري",
+ firebrick: "أصفر زاهي",
+ floralwhite: "أبيض زهري",
+ forestgreen: "أخضر بلون أشجار الغابات",
+ fuchsia: "فوشيا",
+ gainsboro: "رمادي مائل للأزرق فاتح",
+ ghostwhite: "أبيض شفاف",
+ gold: "ذهبي",
+ goldenrod: "أصفر ذهبي",
+ gray: "رمادي",
+ green: "أخضر",
+ greenyellow: "أخضر مائل للأصفر",
+ grey: "رمادي", // same as gray
+ honeydew: "أبيض مائل للأخضر",
+ hotpink: "أحمر وردي زاهي",
+ indianred: "أحمر هندي",
+ indigo: "نيلي",
+ ivory: "عاجي",
+ khaki: "كاكي",
+ lavender: "أرجواني شاحب",
+ lavenderblush: "أحمر أرجواني",
+ lawngreen: "أخضر بلون العشب",
+ lemonchiffon: "أصفر شفاف",
+ lightblue: "أزرق فاتح",
+ lightcoral: "مرجاني فاتح",
+ lightcyan: "سماوي فاتح",
+ lightgoldenrodyellow: "أصفر ذهبي فاتح",
+ lightgray: "رمادي فاتح",
+ lightgreen: "أخضر فاتح",
+ lightgrey: "رمادي فاتح", // same as lightgray
+ lightpink: "وردي فاتح",
+ lightsalmon: "فضي فاتح",
+ lightseagreen: "أخضر مائل للأزرق فاتح",
+ lightskyblue: "أزرق سماوي فاتح",
+ lightslategray: "رمادي اردوازي فاتح",
+ lightslategrey: "رمادي اردوازي فاتح", // same as lightslategray
+ lightsteelblue: "أزرق معدني فاتح",
+ lightyellow: "أصفر فاتح",
+ lime: "ليموني",
+ limegreen: "أخضر ليموني",
+ linen: "كتاني",
+ magenta: "أحمر قرمزي",
+ maroon: "أحمر داكن",
+ mediumaquamarine: "أزرق مائل للأخضر (زبرجد) متوسط",
+ mediumblue: "أزرق متوسط",
+ mediumorchid: "أرجواني متوسط",
+ mediumpurple: "قرمزي متوسط",
+ mediumseagreen: "أخضر مائل للأزرق متوسط",
+ mediumslateblue: "أزرق اردوازي متوسط",
+ mediumspringgreen: "أخضر ربيعي متوسط",
+ mediumturquoise: "تركواز متوسط",
+ mediumvioletred: "أحمر-بنفسجي متوسط",
+ midnightblue: "أزرق بحري",
+ mintcream: "أصفر شاحب مائل للأخضر الزرعي",
+ mistyrose: "وردي",
+ moccasin: "نحاسي أحمر",
+ navajowhite: "أبيض ملاحي",
+ navy: "أزرق داكن",
+ oldlace: "برتقالي مائل للأصفر شاحب",
+ olive: "أخضر زيتوني داكن",
+ olivedrab: "أسود فاتح",
+ orange: "برتقالي",
+ orangered: "أحمر مائل للبرتقالي",
+ orchid: "أرجواني فاتح",
+ palegoldenrod: "أصفر ذهبي شاحب",
+ palegreen: "أخضر شاحب",
+ paleturquoise: "تركواز شاحب",
+ palevioletred: "أحمر-بنفسجي شاحب",
+ papayawhip: "خوخي فاتح",
+ peachpuff: "خوخي مائل للأصفر",
+ peru: "بني جملي",
+ pink: "وردي",
+ plum: "أرجواني داكن",
+ powderblue: "أزرق مائل للأصفر",
+ purple: "ارجواني",
+ red: "أحمر",
+ rosybrown: "بني وردي",
+ royalblue: "أزرق ملكي",
+ saddlebrown: "بني فاتح",
+ salmon: "برتقالي وردي شاحب",
+ sandybrown: "بني مائل للصفرة",
+ seagreen: "أخضر مائل للأزرق",
+ seashell: "أبيض مائل للأصفر فاتح",
+ sienna: "بني محروق",
+ silver: "فضي",
+ skyblue: "أزرق سماوي",
+ slateblue: "أزرق اردوازي",
+ slategray: "رمادي اردوازي",
+ slategrey: "رمادي اردوازي", // same as slategray
+ snow: "أبيض ثلجي",
+ springgreen: "أخضر ربيعي",
+ steelblue: "أزرق معدني",
+ tan: "خمري",
+ teal: "بترولي",
+ thistle: "ارجواني شاحب",
+ tomato: "أحمر مائل للأصفر",
+ transparent: "شفاف",
+ turquoise: "تركواز",
+ violet: "بنفسجي",
+ wheat: "أخضر قمحي",
+ white: "أبيض",
+ whitesmoke: "دخان أبيض",
+ yellow: "أصفر",
+ yellowgreen: "أخضر مائل للأصفر"
+})
+);
diff --git a/lib/dojo/nls/az/colors.js b/lib/dojo/nls/az/colors.js
new file mode 100644
index 000000000..592accdf0
--- /dev/null
+++ b/lib/dojo/nls/az/colors.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/az/colors",({"lightsteelblue":"açıq metal mavi","orangered":"narıncı qırmızı","midnightblue":"gecə mavisi","cadetblue":"dəniz mavisi","seashell":"dəniz səthi","slategrey":"boz şifer rəngi","coral":"mərcan","darkturquoise":"tünd firuzəyi","antiquewhite":"antik ağ","mediumspringgreen":"orta bahar yaşılı","salmon":"somon","darkgrey":"tünd boz","ivory":"fil dişi","greenyellow":"yaşıl-sarı","mistyrose":"gül qurusu","lightsalmon":"açıq somon","silver":"gümüşü","dimgrey":"açıq boz","orange":"narıncı","white":"ağ","navajowhite":"navajo ağı","royalblue":"parlaq tünd mavi","deeppink":"tünd çəhrayı","lime":"lomon yaşılı","oldlace":"köhnə krujeva","chartreuse":"chartreuse","darkcyan":"tünd firuzəyi","yellow":"sarı","linen":"kətan","olive":"zeytun","gold":"qızıl","lawngreen":"çəmən yaşılı","lightyellow":"açıq sarı","tan":"günəş yanığı","darkviolet":"tünd bənövşəyi","lightslategrey":"tünd şifer bozu","grey":"boz","darkkhaki":"tünd haki","green":"yaşıl","deepskyblue":"tünd səma mavisi","aqua":"dəniz mavisi","sienna":"tünd qəhvəyi","mintcream":"nanəli krem","rosybrown":"çəhrayımsı qəhvəyi","mediumslateblue":"orta şıfer bozu","magenta":"magenta","lightseagreen":"açıq dəniz yaşılı","cyan":"firuzəyi","olivedrab":"əsgər yaşılı","darkgoldenrod":"tünd sarı","slateblue":"şifer mavisi","mediumaquamarine":"orta akvamarin","lavender":"lavanta","mediumseagreen":"orta dəniz yaşılı","maroon":"tünd qırmızı","darkslategray":"tünd şifer bozu","mediumturquoise":"orta firuzəyi","ghostwhite":"ala","darkblue":"tünd mavi","mediumvioletred":"orta bənövşəyi-qırmızı","brown":"qəhvəyi","lightgray":"açıq boz","sandybrown":"qum rəngi","pink":"çəhrayı","firebrick":"yanmış kərpic rəngi","indigo":"indigo","snow":"qar","darkorchid":"tünd orkide","turquoise":"firuzəyi","chocolate":"şokolad","springgreen":"bahar yaşılı","moccasin":"mokosen","navy":"tünd göy","lemonchiffon":"limon rəngi","teal":"teal mavi","floralwhite":"çiçək ağı","cornflowerblue":"peyğəmbər çiçək mavisi","paleturquoise":"solğun firuzəyi","purple":"tünd qırmızı","gainsboro":"gainsboro","plum":"gavalı","red":"qırmızı","blue":"göy","forestgreen":"tünd dəniz yaşılı","darkgreen":"tünd yaşıl","honeydew":"bal saqqızı","darkseagreen":"tünd dəniz yaşılı","lightcoral":"açıq mərcan","palevioletred":"solğun bənövşəyi-qırmızı","mediumpurple":"orta tünd qırmızı","saddlebrown":"açıq qəhvəyi","darkmagenta":"tünd magenta","thistle":"dəvə tikanı","whitesmoke":"ağ duman","wheat":"buğdayı","violet":"bənövşəyi","lightskyblue":"açıq səma mavisi","goldenrod":"sapsarı","mediumblue":"orta göy","skyblue":"göy mavisi","crimson":"crimson","darksalmon":"tünd somon","darkred":"tünd qırmızı","darkslategrey":"tünd şifer bozu","peru":"peru","lightgrey":"açıq boz","lightgoldenrodyellow":"açıq qızılı","blanchedalmond":"solğun badamı","aliceblue":"alice mavisi","bisque":"biskvit","slategray":"şifer bozu","palegoldenrod":"açıq qızılı","darkorange":"tünd narıncı","aquamarine":"akvamarin","lightgreen":"açıq yaşıl","burlywood":"sarımsı qəhvə rəngi","dodgerblue":"toz mavisi","darkgray":"tünd boz","lightcyan":"açıq firuzəyi","powderblue":"pudra mavisi","blueviolet":"mavi-bənövşəyi","orchid":"orkide","dimgray":"solğun boz","beige":"bej","fuchsia":"fuşya","lavenderblush":"lavanta tünd qırmızısı","hotpink":"tünd çəhrayı","steelblue":"metal mavisi","tomato":"pomidor","lightpink":"açıq çəhrayı","limegreen":"əhəng yaşılı","indianred":"qızıldərili qırmızısı","papayawhip":"papaya qamçısı","lightslategray":"açıq şifer bozu","gray":"boz","mediumorchid":"orta orkide","cornsilk":"qarğıdalı rəngi","black":"qara","seagreen":"dəniz yaşılı","darkslateblue":"tünd şifer bozu","khaki":"haki","lightblue":"açıq mavi","palegreen":"solğun yaşıl","azure":"azur mavisi","peachpuff":"açıq şaftalı","darkolivegreen":"tünd zeytun yaşılı","yellowgreen":"sarı-yaşıl"})); \ No newline at end of file
diff --git a/lib/dojo/nls/az/colors.js.uncompressed.js b/lib/dojo/nls/az/colors.js.uncompressed.js
new file mode 100644
index 000000000..2e435f996
--- /dev/null
+++ b/lib/dojo/nls/az/colors.js.uncompressed.js
@@ -0,0 +1,153 @@
+define(
+"dojo/nls/az/colors", //begin v1.x content
+({
+ "lightsteelblue":"açıq metal mavi",
+ "orangered" :"narıncı qırmızı",
+ "midnightblue" :"gecə mavisi",
+ "cadetblue" :"dəniz mavisi" ,
+ "seashell" :"dəniz səthi",
+ "slategrey" :"boz şifer rəngi",
+ "coral" :"mərcan",
+ "darkturquoise" :"tünd firuzəyi",
+ "antiquewhite" :"antik ağ",
+ "mediumspringgreen" :"orta bahar yaşılı",
+ "salmon" :"somon",
+ "darkgrey" :"tünd boz",
+ "ivory" :"fil dişi",
+ "greenyellow" :"yaşıl-sarı",
+ "mistyrose" :"gül qurusu",
+ "lightsalmon" :"açıq somon",
+ "silver" :"gümüşü",
+ "dimgrey" :"açıq boz",
+ "orange" :"narıncı",
+ "white" :"ağ",
+ "navajowhite" :"navajo ağı",
+ "royalblue" :"parlaq tünd mavi" ,
+ "deeppink" :"tünd çəhrayı",
+ "lime" :"lomon yaşılı",
+ "oldlace" :"köhnə krujeva",
+ "chartreuse" :"chartreuse",
+ "darkcyan" :"tünd firuzəyi",
+ "yellow" :"sarı",
+ "linen" :"kətan",
+ "olive" :"zeytun",
+ "gold" :"qızıl",
+ "lawngreen" :"çəmən yaşılı",
+ "lightyellow" :"açıq sarı",
+ "tan" :"günəş yanığı",
+ "darkviolet" :"tünd bənövşəyi",
+ "lightslategrey" :"tünd şifer bozu",
+ "grey" :"boz",
+ "darkkhaki" :"tünd haki",
+ "green" :"yaşıl",
+ "deepskyblue" :"tünd səma mavisi",
+ "aqua" :"dəniz mavisi",
+ "sienna" :"tünd qəhvəyi",
+ "mintcream" :"nanəli krem",
+ "rosybrown" :"çəhrayımsı qəhvəyi",
+ "mediumslateblue" :"orta şıfer bozu",
+ "magenta" :"magenta",
+ "lightseagreen" :"açıq dəniz yaşılı",
+ "cyan" :"firuzəyi",
+ "olivedrab" :"əsgər yaşılı",
+ "darkgoldenrod" :"tünd sarı",
+ "slateblue" :"şifer mavisi",
+ "mediumaquamarine" :"orta akvamarin",
+ "lavender" :"lavanta",
+ "mediumseagreen" :"orta dəniz yaşılı",
+ "maroon" :"tünd qırmızı",
+ "darkslategray" :"tünd şifer bozu",
+ "mediumturquoise" :"orta firuzəyi",
+ "ghostwhite" :"ala",
+ "darkblue" :"tünd mavi",
+ "mediumvioletred" :"orta bənövşəyi-qırmızı",
+ "brown" :"qəhvəyi",
+ "lightgray" :"açıq boz",
+ "sandybrown" :"qum rəngi",
+ "pink" :"çəhrayı",
+ "firebrick" :"yanmış kərpic rəngi",
+ "indigo" :"indigo",
+ "snow" :"qar",
+ "darkorchid" :"tünd orkide",
+ "turquoise" :"firuzəyi",
+ "chocolate" :"şokolad",
+ "springgreen" :"bahar yaşılı",
+ "moccasin" :"mokosen",
+ "navy" :"tünd göy",
+ "lemonchiffon" :"limon rəngi",
+ "teal" :"teal mavi",
+ "floralwhite" :"çiçək ağı",
+ "cornflowerblue" :"peyğəmbər çiçək mavisi",
+ "paleturquoise" :"solğun firuzəyi",
+ "purple" :"tünd qırmızı",
+ "gainsboro" :"gainsboro",
+ "plum" :"gavalı",
+ "red" :"qırmızı",
+ "blue" :"göy",
+ "forestgreen" :"tünd dəniz yaşılı",
+ "darkgreen" :"tünd yaşıl",
+ "honeydew" :"bal saqqızı",
+ "darkseagreen" :"tünd dəniz yaşılı",
+ "lightcoral" :"açıq mərcan",
+ "palevioletred" :"solğun bənövşəyi-qırmızı",
+ "mediumpurple" :"orta tünd qırmızı",
+ "saddlebrown" :"açıq qəhvəyi",
+ "darkmagenta" :"tünd magenta",
+ "thistle" :"dəvə tikanı",
+ "whitesmoke" :"ağ duman",
+ "wheat" :"buğdayı",
+ "violet" :"bənövşəyi",
+ "lightskyblue" :"açıq səma mavisi" ,
+ "goldenrod" :"sapsarı",
+ "mediumblue" :"orta göy",
+ "skyblue" :"göy mavisi",
+ "crimson" :"crimson",
+ "darksalmon" :"tünd somon",
+ "darkred" :"tünd qırmızı",
+ "darkslategrey" :"tünd şifer bozu",
+ "peru" :"peru",
+ "lightgrey" :"açıq boz",
+ "lightgoldenrodyellow" :"açıq qızılı",
+ "blanchedalmond" :"solğun badamı",
+ "aliceblue" :"alice mavisi",
+ "bisque" :"biskvit",
+ "slategray" :"şifer bozu",
+ "palegoldenrod" :"açıq qızılı",
+ "darkorange" :"tünd narıncı",
+ "aquamarine" :"akvamarin",
+ "lightgreen" :"açıq yaşıl",
+ "burlywood" :"sarımsı qəhvə rəngi",
+ "dodgerblue" :"toz mavisi",
+ "darkgray" :"tünd boz",
+ "lightcyan" :"açıq firuzəyi",
+ "powderblue" :"pudra mavisi",
+ "blueviolet" :"mavi-bənövşəyi",
+ "orchid" :"orkide",
+ "dimgray" :"solğun boz",
+ "beige" :"bej",
+ "fuchsia" :"fuşya",
+ "lavenderblush" :"lavanta tünd qırmızısı",
+ "hotpink" :"tünd çəhrayı",
+ "steelblue" :"metal mavisi",
+ "tomato" :"pomidor",
+ "lightpink" :"açıq çəhrayı",
+ "limegreen" :"əhəng yaşılı",
+ "indianred" :"qızıldərili qırmızısı",
+ "papayawhip" :"papaya qamçısı",
+ "lightslategray" :"açıq şifer bozu",
+ "gray" :"boz",
+ "mediumorchid" :"orta orkide",
+ "cornsilk" :"qarğıdalı rəngi",
+ "black" :"qara",
+ "seagreen" :"dəniz yaşılı",
+ "darkslateblue" :"tünd şifer bozu",
+ "khaki" :"haki",
+ "lightblue" :"açıq mavi",
+ "palegreen" :"solğun yaşıl",
+ "azure" :"azur mavisi",
+ "peachpuff" :"açıq şaftalı",
+ "darkolivegreen" :"tünd zeytun yaşılı",
+ "yellowgreen" :"sarı-yaşıl"
+})
+//end v1.x content
+); \ No newline at end of file
diff --git a/lib/dojo/nls/ca/colors.js b/lib/dojo/nls/ca/colors.js
index 0f1461a83..0fafe55e9 100644
--- a/lib/dojo/nls/ca/colors.js
+++ b/lib/dojo/nls/ca/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"blau acer clar","orangered":"taronja vermellós","midnightblue":"blau mitjanit","cadetblue":"blau marí","seashell":"petxina marina","slategrey":"gris pissarra","coral":"corall","darkturquoise":"turquesa fosc","antiquewhite":"blanc antic","mediumspringgreen":"verd primavera mitjà","salmon":"salmó","darkgrey":"gris fosc","ivory":"marbre","greenyellow":"verd grogós","mistyrose":"rosa dens","lightsalmon":"salmó clar","silver":"argent","dimgrey":"gris fosc","orange":"taronja","white":"blanc","navajowhite":"blanc Navajo","royalblue":"blau marí intens","deeppink":"rosa profund","lime":"verd llimona","oldlace":"rosa cremós","chartreuse":"Llimona pàl·lid","darkcyan":"cian fosc","yellow":"groc","linen":"lli","olive":"oliva","gold":"daurat","lawngreen":"verd gespa","lightyellow":"groc clar","tan":"tan","darkviolet":"violeta fosc","lightslategrey":"gris pissarra clar","grey":"gris","darkkhaki":"caqui fosc","green":"verd","deepskyblue":"blau cel profund","aqua":"aigua","sienna":"siena","mintcream":"menta pàl·lid","rosybrown":"marró rosat","mediumslateblue":"blau pissarra mitjà","magenta":"magenta","lightseagreen":"verd marí clar","cyan":"cian","olivedrab":"gris oliva","darkgoldenrod":"ocre fosc","slateblue":"blau pissarra","mediumaquamarine":"aiguamarina mitjana","lavender":"lavanda","mediumseagreen":"verd marí mitjà","maroon":"marró vermellós","darkslategray":"gris pissarra fosc","mediumturquoise":"turquesa mitjana","ghostwhite":"blanc fantasma","darkblue":"blau fosc","mediumvioletred":"vermell violeta mitjà","brown":"marró","lightgray":"gris clar","sandybrown":"marró arenós","pink":"rosa","firebrick":"maó refractari","indigo":"índigo","snow":"neu","darkorchid":"orquídia fosc","turquoise":"turquesa","chocolate":"xocolata","springgreen":"verd de primavera","moccasin":"mocassí","navy":"blau marí","lemonchiffon":"groc brisa","teal":"verd blavós","floralwhite":"blanc floral","cornflowerblue":"blau blauet","paleturquoise":"turquesa pàl·lid","purple":"porpra","gainsboro":"gainsboro","plum":"pruna","red":"vermell","blue":"blau","forestgreen":"verd bosc","darkgreen":"verd fosc","honeydew":"rosada de mel","darkseagreen":"verd marí fosc","lightcoral":"corall clar","palevioletred":"vermell porpra pàl·lid","mediumpurple":"porpra mitjana","saddlebrown":"marró mitjà","darkmagenta":"magenta fosc","thistle":"card","whitesmoke":"blanc fumat","wheat":"blat","violet":"violeta","lightskyblue":"blau cel clar","goldenrod":"ocre","mediumblue":"blau mitjà","skyblue":"blau cel","crimson":"carmesí","darksalmon":"salmó fosc","darkred":"vermell fosc","darkslategrey":"gris pissarra fosc","peru":"Perú","lightgrey":"gris clar","lightgoldenrodyellow":"groc ocre clar","blanchedalmond":"ametlla pàl·lid","aliceblue":"blau cian clar","bisque":"crema","slategray":"gris pissarra","palegoldenrod":"ocre pàl·lid","darkorange":"taronja fosc","aquamarine":"aiguamarina","lightgreen":"verd clar","burlywood":"marró arenós","dodgerblue":"blau Dodger","darkgray":"gris fosc","lightcyan":"cian clar","powderblue":"blau grisós","blueviolet":"blau violeta","orchid":"orquídia","dimgray":"gris fosc","beige":"beix","fuchsia":"fúcsia","lavenderblush":"lavanda vermellosa","hotpink":"rosa fúcsia","steelblue":"blau acer","tomato":"tomàquet","lightpink":"rosa clar","limegreen":"verd llimona verda","indianred":"vermell indi","papayawhip":"préssec pastel","lightslategray":"gris pissarra clar","gray":"gris","mediumorchid":"orquídia mitjana","cornsilk":"cru","black":"negre","seagreen":"verd marí","darkslateblue":"blau pissarra fosc","khaki":"caqui","lightblue":"blau clar","palegreen":"verd pàl·lid","azure":"atzur","peachpuff":"préssec","darkolivegreen":"verd oliva fosc","yellowgreen":"verd grogós"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/ca/colors",({aliceblue:"blau cian clar",antiquewhite:"blanc antic",aqua:"aigua",aquamarine:"aiguamarina",azure:"atzur",beige:"beix",bisque:"crema",black:"negre",blanchedalmond:"ametlla pàl·lid",blue:"blau",blueviolet:"blau violeta",brown:"marró",burlywood:"marró arenós",cadetblue:"blau marí",chartreuse:"Llimona pàl·lid",chocolate:"xocolata",coral:"corall",cornflowerblue:"blau blauet",cornsilk:"cru",crimson:"carmesí",cyan:"cian",darkblue:"blau fosc",darkcyan:"cian fosc",darkgoldenrod:"ocre fosc",darkgray:"gris fosc",darkgreen:"verd fosc",darkgrey:"gris fosc",darkkhaki:"caqui fosc",darkmagenta:"magenta fosc",darkolivegreen:"verd oliva fosc",darkorange:"taronja fosc",darkorchid:"orquídia fosc",darkred:"vermell fosc",darksalmon:"salmó fosc",darkseagreen:"verd marí fosc",darkslateblue:"blau pissarra fosc",darkslategray:"gris pissarra fosc",darkslategrey:"gris pissarra fosc",darkturquoise:"turquesa fosc",darkviolet:"violeta fosc",deeppink:"rosa profund",deepskyblue:"blau cel profund",dimgray:"gris fosc",dimgrey:"gris fosc",dodgerblue:"blau Dodger",firebrick:"maó refractari",floralwhite:"blanc floral",forestgreen:"verd bosc",fuchsia:"fúcsia",gainsboro:"gainsboro",ghostwhite:"blanc fantasma",gold:"daurat",goldenrod:"ocre",gray:"gris",green:"verd",greenyellow:"verd grogós",grey:"gris",honeydew:"rosada de mel",hotpink:"rosa fúcsia",indianred:"vermell indi",indigo:"índigo",ivory:"marbre",khaki:"caqui",lavender:"lavanda",lavenderblush:"lavanda vermellosa",lawngreen:"verd gespa",lemonchiffon:"groc brisa",lightblue:"blau clar",lightcoral:"corall clar",lightcyan:"cian clar",lightgoldenrodyellow:"groc ocre clar",lightgray:"gris clar",lightgreen:"verd clar",lightgrey:"gris clar",lightpink:"rosa clar",lightsalmon:"salmó clar",lightseagreen:"verd marí clar",lightskyblue:"blau cel clar",lightslategray:"gris pissarra clar",lightslategrey:"gris pissarra clar",lightsteelblue:"blau acer clar",lightyellow:"groc clar",lime:"verd llimona",limegreen:"verd llimona verda",linen:"lli",magenta:"magenta",maroon:"marró vermellós",mediumaquamarine:"aiguamarina mitjana",mediumblue:"blau mitjà",mediumorchid:"orquídia mitjana",mediumpurple:"porpra mitjana",mediumseagreen:"verd marí mitjà",mediumslateblue:"blau pissarra mitjà",mediumspringgreen:"verd primavera mitjà",mediumturquoise:"turquesa mitjana",mediumvioletred:"vermell violeta mitjà",midnightblue:"blau mitjanit",mintcream:"menta pàl·lid",mistyrose:"rosa dens",moccasin:"mocassí",navajowhite:"blanc Navajo",navy:"blau marí",oldlace:"rosa cremós",olive:"oliva",olivedrab:"gris oliva",orange:"taronja",orangered:"taronja vermellós",orchid:"orquídia",palegoldenrod:"ocre pàl·lid",palegreen:"verd pàl·lid",paleturquoise:"turquesa pàl·lid",palevioletred:"vermell porpra pàl·lid",papayawhip:"préssec pastel",peachpuff:"préssec",peru:"Perú",pink:"rosa",plum:"pruna",powderblue:"blau grisós",purple:"porpra",red:"vermell",rosybrown:"marró rosat",royalblue:"blau marí intens",saddlebrown:"marró mitjà",salmon:"salmó",sandybrown:"marró arenós",seagreen:"verd marí",seashell:"petxina marina",sienna:"siena",silver:"argent",skyblue:"blau cel",slateblue:"blau pissarra",slategray:"gris pissarra",slategrey:"gris pissarra",snow:"neu",springgreen:"verd de primavera",steelblue:"blau acer",tan:"tan",teal:"verd blavós",thistle:"card",tomato:"tomàquet",transparent:"transparent",turquoise:"turquesa",violet:"violeta",wheat:"blat",white:"blanc",whitesmoke:"blanc fumat",yellow:"groc",yellowgreen:"verd grogós"})); \ No newline at end of file
diff --git a/lib/dojo/nls/ca/colors.js.uncompressed.js b/lib/dojo/nls/ca/colors.js.uncompressed.js
new file mode 100644
index 000000000..520654d94
--- /dev/null
+++ b/lib/dojo/nls/ca/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/ca/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "blau cian clar",
+ antiquewhite: "blanc antic",
+ aqua: "aigua",
+ aquamarine: "aiguamarina",
+ azure: "atzur",
+ beige: "beix",
+ bisque: "crema",
+ black: "negre",
+ blanchedalmond: "ametlla pàl·lid",
+ blue: "blau",
+ blueviolet: "blau violeta",
+ brown: "marró",
+ burlywood: "marró arenós",
+ cadetblue: "blau marí",
+ chartreuse: "Llimona pàl·lid",
+ chocolate: "xocolata",
+ coral: "corall",
+ cornflowerblue: "blau blauet",
+ cornsilk: "cru",
+ crimson: "carmesí",
+ cyan: "cian",
+ darkblue: "blau fosc",
+ darkcyan: "cian fosc",
+ darkgoldenrod: "ocre fosc",
+ darkgray: "gris fosc",
+ darkgreen: "verd fosc",
+ darkgrey: "gris fosc", // same as darkgray
+ darkkhaki: "caqui fosc",
+ darkmagenta: "magenta fosc",
+ darkolivegreen: "verd oliva fosc",
+ darkorange: "taronja fosc",
+ darkorchid: "orquídia fosc",
+ darkred: "vermell fosc",
+ darksalmon: "salmó fosc",
+ darkseagreen: "verd marí fosc",
+ darkslateblue: "blau pissarra fosc",
+ darkslategray: "gris pissarra fosc",
+ darkslategrey: "gris pissarra fosc", // same as darkslategray
+ darkturquoise: "turquesa fosc",
+ darkviolet: "violeta fosc",
+ deeppink: "rosa profund",
+ deepskyblue: "blau cel profund",
+ dimgray: "gris fosc",
+ dimgrey: "gris fosc", // same as dimgray
+ dodgerblue: "blau Dodger",
+ firebrick: "maó refractari",
+ floralwhite: "blanc floral",
+ forestgreen: "verd bosc",
+ fuchsia: "fúcsia",
+ gainsboro: "gainsboro",
+ ghostwhite: "blanc fantasma",
+ gold: "daurat",
+ goldenrod: "ocre",
+ gray: "gris",
+ green: "verd",
+ greenyellow: "verd grogós",
+ grey: "gris", // same as gray
+ honeydew: "rosada de mel",
+ hotpink: "rosa fúcsia",
+ indianred: "vermell indi",
+ indigo: "índigo",
+ ivory: "marbre",
+ khaki: "caqui",
+ lavender: "lavanda",
+ lavenderblush: "lavanda vermellosa",
+ lawngreen: "verd gespa",
+ lemonchiffon: "groc brisa",
+ lightblue: "blau clar",
+ lightcoral: "corall clar",
+ lightcyan: "cian clar",
+ lightgoldenrodyellow: "groc ocre clar",
+ lightgray: "gris clar",
+ lightgreen: "verd clar",
+ lightgrey: "gris clar", // same as lightgray
+ lightpink: "rosa clar",
+ lightsalmon: "salmó clar",
+ lightseagreen: "verd marí clar",
+ lightskyblue: "blau cel clar",
+ lightslategray: "gris pissarra clar",
+ lightslategrey: "gris pissarra clar", // same as lightslategray
+ lightsteelblue: "blau acer clar",
+ lightyellow: "groc clar",
+ lime: "verd llimona",
+ limegreen: "verd llimona verda",
+ linen: "lli",
+ magenta: "magenta",
+ maroon: "marró vermellós",
+ mediumaquamarine: "aiguamarina mitjana",
+ mediumblue: "blau mitjà",
+ mediumorchid: "orquídia mitjana",
+ mediumpurple: "porpra mitjana",
+ mediumseagreen: "verd marí mitjà",
+ mediumslateblue: "blau pissarra mitjà",
+ mediumspringgreen: "verd primavera mitjà",
+ mediumturquoise: "turquesa mitjana",
+ mediumvioletred: "vermell violeta mitjà",
+ midnightblue: "blau mitjanit",
+ mintcream: "menta pàl·lid",
+ mistyrose: "rosa dens",
+ moccasin: "mocassí",
+ navajowhite: "blanc Navajo",
+ navy: "blau marí",
+ oldlace: "rosa cremós",
+ olive: "oliva",
+ olivedrab: "gris oliva",
+ orange: "taronja",
+ orangered: "taronja vermellós",
+ orchid: "orquídia",
+ palegoldenrod: "ocre pàl·lid",
+ palegreen: "verd pàl·lid",
+ paleturquoise: "turquesa pàl·lid",
+ palevioletred: "vermell porpra pàl·lid",
+ papayawhip: "préssec pastel",
+ peachpuff: "préssec",
+ peru: "Perú",
+ pink: "rosa",
+ plum: "pruna",
+ powderblue: "blau grisós",
+ purple: "porpra",
+ red: "vermell",
+ rosybrown: "marró rosat",
+ royalblue: "blau marí intens",
+ saddlebrown: "marró mitjà",
+ salmon: "salmó",
+ sandybrown: "marró arenós",
+ seagreen: "verd marí",
+ seashell: "petxina marina",
+ sienna: "siena",
+ silver: "argent",
+ skyblue: "blau cel",
+ slateblue: "blau pissarra",
+ slategray: "gris pissarra",
+ slategrey: "gris pissarra", // same as slategray
+ snow: "neu",
+ springgreen: "verd de primavera",
+ steelblue: "blau acer",
+ tan: "tan",
+ teal: "verd blavós",
+ thistle: "card",
+ tomato: "tomàquet",
+ transparent: "transparent",
+ turquoise: "turquesa",
+ violet: "violeta",
+ wheat: "blat",
+ white: "blanc",
+ whitesmoke: "blanc fumat",
+ yellow: "groc",
+ yellowgreen: "verd grogós"
+})
+);
diff --git a/lib/dojo/nls/colors.js b/lib/dojo/nls/colors.js
index 454e644e4..2d78bab1b 100644
--- a/lib/dojo/nls/colors.js
+++ b/lib/dojo/nls/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/colors",{root:({aliceblue:"alice blue",antiquewhite:"antique white",aqua:"aqua",aquamarine:"aquamarine",azure:"azure",beige:"beige",bisque:"bisque",black:"black",blanchedalmond:"blanched almond",blue:"blue",blueviolet:"blue-violet",brown:"brown",burlywood:"burlywood",cadetblue:"cadet blue",chartreuse:"chartreuse",chocolate:"chocolate",coral:"coral",cornflowerblue:"cornflower blue",cornsilk:"cornsilk",crimson:"crimson",cyan:"cyan",darkblue:"dark blue",darkcyan:"dark cyan",darkgoldenrod:"dark goldenrod",darkgray:"dark gray",darkgreen:"dark green",darkgrey:"dark gray",darkkhaki:"dark khaki",darkmagenta:"dark magenta",darkolivegreen:"dark olive green",darkorange:"dark orange",darkorchid:"dark orchid",darkred:"dark red",darksalmon:"dark salmon",darkseagreen:"dark sea green",darkslateblue:"dark slate blue",darkslategray:"dark slate gray",darkslategrey:"dark slate gray",darkturquoise:"dark turquoise",darkviolet:"dark violet",deeppink:"deep pink",deepskyblue:"deep sky blue",dimgray:"dim gray",dimgrey:"dim gray",dodgerblue:"dodger blue",firebrick:"fire brick",floralwhite:"floral white",forestgreen:"forest green",fuchsia:"fuchsia",gainsboro:"gainsboro",ghostwhite:"ghost white",gold:"gold",goldenrod:"goldenrod",gray:"gray",green:"green",greenyellow:"green-yellow",grey:"gray",honeydew:"honeydew",hotpink:"hot pink",indianred:"indian red",indigo:"indigo",ivory:"ivory",khaki:"khaki",lavender:"lavender",lavenderblush:"lavender blush",lawngreen:"lawn green",lemonchiffon:"lemon chiffon",lightblue:"light blue",lightcoral:"light coral",lightcyan:"light cyan",lightgoldenrodyellow:"light goldenrod yellow",lightgray:"light gray",lightgreen:"light green",lightgrey:"light gray",lightpink:"light pink",lightsalmon:"light salmon",lightseagreen:"light sea green",lightskyblue:"light sky blue",lightslategray:"light slate gray",lightslategrey:"light slate gray",lightsteelblue:"light steel blue",lightyellow:"light yellow",lime:"lime",limegreen:"lime green",linen:"linen",magenta:"magenta",maroon:"maroon",mediumaquamarine:"medium aquamarine",mediumblue:"medium blue",mediumorchid:"medium orchid",mediumpurple:"medium purple",mediumseagreen:"medium sea green",mediumslateblue:"medium slate blue",mediumspringgreen:"medium spring green",mediumturquoise:"medium turquoise",mediumvioletred:"medium violet-red",midnightblue:"midnight blue",mintcream:"mint cream",mistyrose:"misty rose",moccasin:"moccasin",navajowhite:"navajo white",navy:"navy",oldlace:"old lace",olive:"olive",olivedrab:"olive drab",orange:"orange",orangered:"orange red",orchid:"orchid",palegoldenrod:"pale goldenrod",palegreen:"pale green",paleturquoise:"pale turquoise",palevioletred:"pale violet-red",papayawhip:"papaya whip",peachpuff:"peach puff",peru:"peru",pink:"pink",plum:"plum",powderblue:"powder blue",purple:"purple",red:"red",rosybrown:"rosy brown",royalblue:"royal blue",saddlebrown:"saddle brown",salmon:"salmon",sandybrown:"sandy brown",seagreen:"sea green",seashell:"seashell",sienna:"sienna",silver:"silver",skyblue:"sky blue",slateblue:"slate blue",slategray:"slate gray",slategrey:"slate gray",snow:"snow",springgreen:"spring green",steelblue:"steel blue",tan:"tan",teal:"teal",thistle:"thistle",tomato:"tomato",transparent:"transparent",turquoise:"turquoise",violet:"violet",wheat:"wheat",white:"white",whitesmoke:"white smoke",yellow:"yellow",yellowgreen:"yellow green"}),"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/dojo/nls/colors.js.uncompressed.js b/lib/dojo/nls/colors.js.uncompressed.js
new file mode 100644
index 000000000..ee619d0d8
--- /dev/null
+++ b/lib/dojo/nls/colors.js.uncompressed.js
@@ -0,0 +1,191 @@
+define("dojo/nls/colors", { root:
+//begin v1.x content
+({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+
+//Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color e.g. gray vs. gray.
+//TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+aliceblue: "alice blue",
+antiquewhite: "antique white",
+aqua: "aqua",
+aquamarine: "aquamarine",
+azure: "azure",
+beige: "beige",
+bisque: "bisque",
+black: "black",
+blanchedalmond: "blanched almond",
+blue: "blue",
+blueviolet: "blue-violet",
+brown: "brown",
+burlywood: "burlywood",
+cadetblue: "cadet blue",
+chartreuse: "chartreuse",
+chocolate: "chocolate",
+coral: "coral",
+cornflowerblue: "cornflower blue",
+cornsilk: "cornsilk",
+crimson: "crimson",
+cyan: "cyan",
+darkblue: "dark blue",
+darkcyan: "dark cyan",
+darkgoldenrod: "dark goldenrod",
+darkgray: "dark gray",
+darkgreen: "dark green",
+darkgrey: "dark gray", // same as darkgray
+darkkhaki: "dark khaki",
+darkmagenta: "dark magenta",
+darkolivegreen: "dark olive green",
+darkorange: "dark orange",
+darkorchid: "dark orchid",
+darkred: "dark red",
+darksalmon: "dark salmon",
+darkseagreen: "dark sea green",
+darkslateblue: "dark slate blue",
+darkslategray: "dark slate gray",
+darkslategrey: "dark slate gray", // same as darkslategray
+darkturquoise: "dark turquoise",
+darkviolet: "dark violet",
+deeppink: "deep pink",
+deepskyblue: "deep sky blue",
+dimgray: "dim gray",
+dimgrey: "dim gray", // same as dimgray
+dodgerblue: "dodger blue",
+firebrick: "fire brick",
+floralwhite: "floral white",
+forestgreen: "forest green",
+fuchsia: "fuchsia",
+gainsboro: "gainsboro",
+ghostwhite: "ghost white",
+gold: "gold",
+goldenrod: "goldenrod",
+gray: "gray",
+green: "green",
+greenyellow: "green-yellow",
+grey: "gray", // same as gray
+honeydew: "honeydew",
+hotpink: "hot pink",
+indianred: "indian red",
+indigo: "indigo",
+ivory: "ivory",
+khaki: "khaki",
+lavender: "lavender",
+lavenderblush: "lavender blush",
+lawngreen: "lawn green",
+lemonchiffon: "lemon chiffon",
+lightblue: "light blue",
+lightcoral: "light coral",
+lightcyan: "light cyan",
+lightgoldenrodyellow: "light goldenrod yellow",
+lightgray: "light gray",
+lightgreen: "light green",
+lightgrey: "light gray", // same as lightgray
+lightpink: "light pink",
+lightsalmon: "light salmon",
+lightseagreen: "light sea green",
+lightskyblue: "light sky blue",
+lightslategray: "light slate gray",
+lightslategrey: "light slate gray", // same as lightslategray
+lightsteelblue: "light steel blue",
+lightyellow: "light yellow",
+lime: "lime",
+limegreen: "lime green",
+linen: "linen",
+magenta: "magenta",
+maroon: "maroon",
+mediumaquamarine: "medium aquamarine",
+mediumblue: "medium blue",
+mediumorchid: "medium orchid",
+mediumpurple: "medium purple",
+mediumseagreen: "medium sea green",
+mediumslateblue: "medium slate blue",
+mediumspringgreen: "medium spring green",
+mediumturquoise: "medium turquoise",
+mediumvioletred: "medium violet-red",
+midnightblue: "midnight blue",
+mintcream: "mint cream",
+mistyrose: "misty rose",
+moccasin: "moccasin",
+navajowhite: "navajo white",
+navy: "navy",
+oldlace: "old lace",
+olive: "olive",
+olivedrab: "olive drab",
+orange: "orange",
+orangered: "orange red",
+orchid: "orchid",
+palegoldenrod: "pale goldenrod",
+palegreen: "pale green",
+paleturquoise: "pale turquoise",
+palevioletred: "pale violet-red",
+papayawhip: "papaya whip",
+peachpuff: "peach puff",
+peru: "peru",
+pink: "pink",
+plum: "plum",
+powderblue: "powder blue",
+purple: "purple",
+red: "red",
+rosybrown: "rosy brown",
+royalblue: "royal blue",
+saddlebrown: "saddle brown",
+salmon: "salmon",
+sandybrown: "sandy brown",
+seagreen: "sea green",
+seashell: "seashell",
+sienna: "sienna",
+silver: "silver",
+skyblue: "sky blue",
+slateblue: "slate blue",
+slategray: "slate gray",
+slategrey: "slate gray", // same as slategray
+snow: "snow",
+springgreen: "spring green",
+steelblue: "steel blue",
+tan: "tan",
+teal: "teal",
+thistle: "thistle",
+tomato: "tomato",
+transparent: "transparent",
+turquoise: "turquoise",
+violet: "violet",
+wheat: "wheat",
+white: "white",
+whitesmoke: "white smoke",
+yellow: "yellow",
+yellowgreen: "yellow green"
+})
+//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/dojo/nls/cs/colors.js b/lib/dojo/nls/cs/colors.js
index 7ae5d3082..1d93db9a7 100644
--- a/lib/dojo/nls/cs/colors.js
+++ b/lib/dojo/nls/cs/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"světlá ocelová modrá","orangered":"oranžovočervená","midnightblue":"temně modrá","cadetblue":"šedomodrá","seashell":"lasturová","slategrey":"břidlicová šedá","coral":"korálová červená","darkturquoise":"tmavě tyrkysová","antiquewhite":"krémově bílá","mediumspringgreen":"střední jarní zelená","salmon":"lososová","darkgrey":"tmavě šedá","ivory":"slonovinová","greenyellow":"zelenožlutá","mistyrose":"růžovobílá","lightsalmon":"světle lososová","silver":"stříbrná","dimgrey":"kouřově šedá","orange":"oranžová","white":"bílá","navajowhite":"světle krémová","royalblue":"královská modrá","deeppink":"sytě růžová","lime":"limetková","oldlace":"světle béžová","chartreuse":"chartreuska","darkcyan":"tmavě azurová","yellow":"žlutá","linen":"bledě šedobéžová","olive":"olivová","gold":"zlatá","lawngreen":"jasně zelená","lightyellow":"bledě žlutá","tan":"šedobéžová","darkviolet":"tmavě fialová","lightslategrey":"světlá břidlicová šedá","grey":"šedá","darkkhaki":"pískově hnědá","green":"zelená","deepskyblue":"sytá nebeská modrá","aqua":"azurová","sienna":"siena","mintcream":"mentolová","rosybrown":"růžovohnědá","mediumslateblue":"střední břidlicová modrá","magenta":"purpurová","lightseagreen":"světlá mořská zelená","cyan":"azurová","olivedrab":"khaki","darkgoldenrod":"tmavě béžová","slateblue":"břidlicová modrá","mediumaquamarine":"střední akvamarínová","lavender":"levandulová","mediumseagreen":"střední mořská zelená","maroon":"kaštanová","darkslategray":"tmavá břidlicová šedá","mediumturquoise":"středně tyrkysová","ghostwhite":"modravě bílá","darkblue":"tmavě modrá","mediumvioletred":"středně fialovočervená","brown":"červenohnědá","lightgray":"světle šedá","sandybrown":"oranžovohnědá","pink":"růžová","firebrick":"cihlová","indigo":"indigově modrá","snow":"sněhobílá","darkorchid":"tmavě orchidejová","turquoise":"tyrkysová","chocolate":"hnědobéžová","springgreen":"jarní zelená","moccasin":"bledě krémová","navy":"námořnická modrá","lemonchiffon":"světle citrónová","teal":"šedozelená","floralwhite":"květinově bílá","cornflowerblue":"chrpově modrá","paleturquoise":"bledě tyrkysová","purple":"nachová","gainsboro":"bledě šedá","plum":"švestková","red":"červená","blue":"modrá","forestgreen":"lesní zelená","darkgreen":"tmavě zelená","honeydew":"nazelenalá","darkseagreen":"tmavá mořská zelená","lightcoral":"světle korálová","palevioletred":"bledě fialovočervená","mediumpurple":"středně nachová","saddlebrown":"hnědá","darkmagenta":"tmavě purpurová","thistle":"bodláková","whitesmoke":"kouřově bílá","wheat":"zlatohnědá","violet":"fialová","lightskyblue":"světlá nebeská modrá","goldenrod":"béžová","mediumblue":"středně modrá","skyblue":"nebeská modrá","crimson":"karmínová","darksalmon":"tmavě lososová","darkred":"tmavě červená","darkslategrey":"tmavá břidlicová šedá","peru":"karamelová","lightgrey":"světle šedá","lightgoldenrodyellow":"světle žlutá","blanchedalmond":"mandlová","aliceblue":"modravá","bisque":"bledě oranžová","slategray":"břidlicová šedá","palegoldenrod":"bledě písková","darkorange":"tmavě oranžová","aquamarine":"akvamarínová","lightgreen":"světle zelená","burlywood":"krémová","dodgerblue":"jasně modrá","darkgray":"tmavě šedá","lightcyan":"světle azurová","powderblue":"bledě modrá","blueviolet":"modrofialová","orchid":"orchidejová","dimgray":"kouřově šedá","beige":"bledě béžová","fuchsia":"fuchsiová","lavenderblush":"levandulová růžová","hotpink":"jasně růžová","steelblue":"ocelová modrá","tomato":"tomatová","lightpink":"světle růžová","limegreen":"limetkově zelená","indianred":"indiánská červená","papayawhip":"papájová","lightslategray":"světlá břidlicová šedá","gray":"šedá","mediumorchid":"středně orchidejová","cornsilk":"režná","black":"černá","seagreen":"mořská zelená","darkslateblue":"tmavá břidlicová modrá","khaki":"písková","lightblue":"světle modrá","palegreen":"bledě zelená","azure":"bledě azurová","peachpuff":"broskvová","darkolivegreen":"tmavě olivová","yellowgreen":"žlutozelená"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/cs/colors",({aliceblue:"modravá",antiquewhite:"krémově bílá",aqua:"azurová",aquamarine:"akvamarínová",azure:"bledě azurová",beige:"bledě béžová",bisque:"bledě oranžová",black:"černá",blanchedalmond:"mandlová",blue:"modrá",blueviolet:"modrofialová",brown:"červenohnědá",burlywood:"krémová",cadetblue:"šedomodrá",chartreuse:"chartreuska",chocolate:"hnědobéžová",coral:"korálová červená",cornflowerblue:"chrpově modrá",cornsilk:"režná",crimson:"karmínová",cyan:"azurová",darkblue:"tmavě modrá",darkcyan:"tmavě azurová",darkgoldenrod:"tmavě béžová",darkgray:"tmavě šedá",darkgreen:"tmavě zelená",darkgrey:"tmavě šedá",darkkhaki:"pískově hnědá",darkmagenta:"tmavě purpurová",darkolivegreen:"tmavě olivová",darkorange:"tmavě oranžová",darkorchid:"tmavě orchidejová",darkred:"tmavě červená",darksalmon:"tmavě lososová",darkseagreen:"tmavá mořská zelená",darkslateblue:"tmavá břidlicová modrá",darkslategray:"tmavá břidlicová šedá",darkslategrey:"tmavá břidlicová šedá",darkturquoise:"tmavě tyrkysová",darkviolet:"tmavě fialová",deeppink:"sytě růžová",deepskyblue:"sytá nebeská modrá",dimgray:"kouřově šedá",dimgrey:"kouřově šedá",dodgerblue:"jasně modrá",firebrick:"cihlová",floralwhite:"květinově bílá",forestgreen:"lesní zelená",fuchsia:"fuchsiová",gainsboro:"bledě šedá",ghostwhite:"modravě bílá",gold:"zlatá",goldenrod:"béžová",gray:"šedá",green:"zelená",greenyellow:"zelenožlutá",grey:"šedá",honeydew:"nazelenalá",hotpink:"jasně růžová",indianred:"indiánská červená",indigo:"indigově modrá",ivory:"slonovinová",khaki:"písková",lavender:"levandulová",lavenderblush:"levandulová růžová",lawngreen:"jasně zelená",lemonchiffon:"světle citrónová",lightblue:"světle modrá",lightcoral:"světle korálová",lightcyan:"světle azurová",lightgoldenrodyellow:"světle žlutá",lightgray:"světle šedá",lightgreen:"světle zelená",lightgrey:"světle šedá",lightpink:"světle růžová",lightsalmon:"světle lososová",lightseagreen:"světlá mořská zelená",lightskyblue:"světlá nebeská modrá",lightslategray:"světlá břidlicová šedá",lightslategrey:"světlá břidlicová šedá",lightsteelblue:"světlá ocelová modrá",lightyellow:"bledě žlutá",lime:"limetková",limegreen:"limetkově zelená",linen:"bledě šedobéžová",magenta:"purpurová",maroon:"kaštanová",mediumaquamarine:"střední akvamarínová",mediumblue:"středně modrá",mediumorchid:"středně orchidejová",mediumpurple:"středně nachová",mediumseagreen:"střední mořská zelená",mediumslateblue:"střední břidlicová modrá",mediumspringgreen:"střední jarní zelená",mediumturquoise:"středně tyrkysová",mediumvioletred:"středně fialovočervená",midnightblue:"temně modrá",mintcream:"mentolová",mistyrose:"růžovobílá",moccasin:"bledě krémová",navajowhite:"světle krémová",navy:"námořnická modrá",oldlace:"světle béžová",olive:"olivová",olivedrab:"khaki",orange:"oranžová",orangered:"oranžovočervená",orchid:"orchidejová",palegoldenrod:"bledě písková",palegreen:"bledě zelená",paleturquoise:"bledě tyrkysová",palevioletred:"bledě fialovočervená",papayawhip:"papájová",peachpuff:"broskvová",peru:"karamelová",pink:"růžová",plum:"švestková",powderblue:"bledě modrá",purple:"nachová",red:"červená",rosybrown:"růžovohnědá",royalblue:"královská modrá",saddlebrown:"hnědá",salmon:"lososová",sandybrown:"oranžovohnědá",seagreen:"mořská zelená",seashell:"lasturová",sienna:"siena",silver:"stříbrná",skyblue:"nebeská modrá",slateblue:"břidlicová modrá",slategray:"břidlicová šedá",slategrey:"břidlicová šedá",snow:"sněhobílá",springgreen:"jarní zelená",steelblue:"ocelová modrá",tan:"šedobéžová",teal:"šedozelená",thistle:"bodláková",tomato:"tomatová",transparent:"průhledná",turquoise:"tyrkysová",violet:"fialová",wheat:"zlatohnědá",white:"bílá",whitesmoke:"kouřově bílá",yellow:"žlutá",yellowgreen:"žlutozelená"})); \ No newline at end of file
diff --git a/lib/dojo/nls/cs/colors.js.uncompressed.js b/lib/dojo/nls/cs/colors.js.uncompressed.js
new file mode 100644
index 000000000..c625f216e
--- /dev/null
+++ b/lib/dojo/nls/cs/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/cs/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "modravá",
+ antiquewhite: "krémově bílá",
+ aqua: "azurová",
+ aquamarine: "akvamarínová",
+ azure: "bledě azurová",
+ beige: "bledě béžová",
+ bisque: "bledě oranžová",
+ black: "černá",
+ blanchedalmond: "mandlová",
+ blue: "modrá",
+ blueviolet: "modrofialová",
+ brown: "červenohnědá",
+ burlywood: "krémová",
+ cadetblue: "šedomodrá",
+ chartreuse: "chartreuska",
+ chocolate: "hnědobéžová",
+ coral: "korálová červená",
+ cornflowerblue: "chrpově modrá",
+ cornsilk: "režná",
+ crimson: "karmínová",
+ cyan: "azurová",
+ darkblue: "tmavě modrá",
+ darkcyan: "tmavě azurová",
+ darkgoldenrod: "tmavě béžová",
+ darkgray: "tmavě šedá",
+ darkgreen: "tmavě zelená",
+ darkgrey: "tmavě šedá", // same as darkgray
+ darkkhaki: "pískově hnědá",
+ darkmagenta: "tmavě purpurová",
+ darkolivegreen: "tmavě olivová",
+ darkorange: "tmavě oranžová",
+ darkorchid: "tmavě orchidejová",
+ darkred: "tmavě červená",
+ darksalmon: "tmavě lososová",
+ darkseagreen: "tmavá mořská zelená",
+ darkslateblue: "tmavá břidlicová modrá",
+ darkslategray: "tmavá břidlicová šedá",
+ darkslategrey: "tmavá břidlicová šedá", // same as darkslategray
+ darkturquoise: "tmavě tyrkysová",
+ darkviolet: "tmavě fialová",
+ deeppink: "sytě růžová",
+ deepskyblue: "sytá nebeská modrá",
+ dimgray: "kouřově šedá",
+ dimgrey: "kouřově šedá", // same as dimgray
+ dodgerblue: "jasně modrá",
+ firebrick: "cihlová",
+ floralwhite: "květinově bílá",
+ forestgreen: "lesní zelená",
+ fuchsia: "fuchsiová",
+ gainsboro: "bledě šedá",
+ ghostwhite: "modravě bílá",
+ gold: "zlatá",
+ goldenrod: "béžová",
+ gray: "šedá",
+ green: "zelená",
+ greenyellow: "zelenožlutá",
+ grey: "šedá", // same as gray
+ honeydew: "nazelenalá",
+ hotpink: "jasně růžová",
+ indianred: "indiánská červená",
+ indigo: "indigově modrá",
+ ivory: "slonovinová",
+ khaki: "písková",
+ lavender: "levandulová",
+ lavenderblush: "levandulová růžová",
+ lawngreen: "jasně zelená",
+ lemonchiffon: "světle citrónová",
+ lightblue: "světle modrá",
+ lightcoral: "světle korálová",
+ lightcyan: "světle azurová",
+ lightgoldenrodyellow: "světle žlutá",
+ lightgray: "světle šedá",
+ lightgreen: "světle zelená",
+ lightgrey: "světle šedá", // same as lightgray
+ lightpink: "světle růžová",
+ lightsalmon: "světle lososová",
+ lightseagreen: "světlá mořská zelená",
+ lightskyblue: "světlá nebeská modrá",
+ lightslategray: "světlá břidlicová šedá",
+ lightslategrey: "světlá břidlicová šedá", // same as lightslategray
+ lightsteelblue: "světlá ocelová modrá",
+ lightyellow: "bledě žlutá",
+ lime: "limetková",
+ limegreen: "limetkově zelená",
+ linen: "bledě šedobéžová",
+ magenta: "purpurová",
+ maroon: "kaštanová",
+ mediumaquamarine: "střední akvamarínová",
+ mediumblue: "středně modrá",
+ mediumorchid: "středně orchidejová",
+ mediumpurple: "středně nachová",
+ mediumseagreen: "střední mořská zelená",
+ mediumslateblue: "střední břidlicová modrá",
+ mediumspringgreen: "střední jarní zelená",
+ mediumturquoise: "středně tyrkysová",
+ mediumvioletred: "středně fialovočervená",
+ midnightblue: "temně modrá",
+ mintcream: "mentolová",
+ mistyrose: "růžovobílá",
+ moccasin: "bledě krémová",
+ navajowhite: "světle krémová",
+ navy: "námořnická modrá",
+ oldlace: "světle béžová",
+ olive: "olivová",
+ olivedrab: "khaki",
+ orange: "oranžová",
+ orangered: "oranžovočervená",
+ orchid: "orchidejová",
+ palegoldenrod: "bledě písková",
+ palegreen: "bledě zelená",
+ paleturquoise: "bledě tyrkysová",
+ palevioletred: "bledě fialovočervená",
+ papayawhip: "papájová",
+ peachpuff: "broskvová",
+ peru: "karamelová",
+ pink: "růžová",
+ plum: "švestková",
+ powderblue: "bledě modrá",
+ purple: "nachová",
+ red: "červená",
+ rosybrown: "růžovohnědá",
+ royalblue: "královská modrá",
+ saddlebrown: "hnědá",
+ salmon: "lososová",
+ sandybrown: "oranžovohnědá",
+ seagreen: "mořská zelená",
+ seashell: "lasturová",
+ sienna: "siena",
+ silver: "stříbrná",
+ skyblue: "nebeská modrá",
+ slateblue: "břidlicová modrá",
+ slategray: "břidlicová šedá",
+ slategrey: "břidlicová šedá", // same as slategray
+ snow: "sněhobílá",
+ springgreen: "jarní zelená",
+ steelblue: "ocelová modrá",
+ tan: "šedobéžová",
+ teal: "šedozelená",
+ thistle: "bodláková",
+ tomato: "tomatová",
+ transparent: "průhledná",
+ turquoise: "tyrkysová",
+ violet: "fialová",
+ wheat: "zlatohnědá",
+ white: "bílá",
+ whitesmoke: "kouřově bílá",
+ yellow: "žlutá",
+ yellowgreen: "žlutozelená"
+})
+);
diff --git a/lib/dojo/nls/da/colors.js b/lib/dojo/nls/da/colors.js
index 322154f41..da3d11a2c 100644
--- a/lib/dojo/nls/da/colors.js
+++ b/lib/dojo/nls/da/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"lys stålblå","orangered":"orangerød","midnightblue":"midnatsblå","cadetblue":"kadetblå","seashell":"muslingeskal","slategrey":"skifergrå","coral":"koralrød","darkturquoise":"mørk turkis","antiquewhite":"antikhvid","mediumspringgreen":"mellemforårsgrøn","salmon":"laksefarvet","darkgrey":"mørkegrå","ivory":"elfenben","greenyellow":"grøngul","mistyrose":"blegrosa","lightsalmon":"lys laksefarvet","silver":"sølv","dimgrey":"svag grå","orange":"orange","white":"hvid","navajowhite":"navajo-hvid","royalblue":"kongeblå","deeppink":"dyb pink","lime":"lime","oldlace":"kniplingshvid","chartreuse":"chartreuse","darkcyan":"mørk cyan","yellow":"gul","linen":"lærred","olive":"olivengrøn","gold":"guld","lawngreen":"græsgrøn","lightyellow":"lysegul","tan":"tan","darkviolet":"mørkelilla","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grøn","deepskyblue":"dyb himmelblå","aqua":"akvablå","sienna":"sienna","mintcream":"pebermyntecreme","rosybrown":"rosabrun","mediumslateblue":"mellemskiferblå","magenta":"magenta","lightseagreen":"lys havgrøn","cyan":"cyan","olivedrab":"brungrøn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"mellem akvamarin","lavender":"lysviolet","mediumseagreen":"mellemhavgrøn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"mellemturkis","ghostwhite":"spøgelseshvid","darkblue":"mørkeblå","mediumvioletred":"mellemviolet","brown":"brun","lightgray":"lysegrå","sandybrown":"sandbrun","pink":"pink","firebrick":"chamottesten","indigo":"indigo","snow":"sne","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"rust","springgreen":"forårsgrøn","moccasin":"fruesko","navy":"marineblå","lemonchiffon":"citronfromage","teal":"blågrøn","floralwhite":"blomsterhvid","cornflowerblue":"kornblomstblå","paleturquoise":"bleg turkis","purple":"lilla","gainsboro":"gainsboro","plum":"blomme","red":"rød","blue":"blå","forestgreen":"skovgrøn","darkgreen":"mørkegrøn","honeydew":"honningdug","darkseagreen":"mørk havgrøn","lightcoral":"lys koralrød","palevioletred":"blegviolet","mediumpurple":"mellemlilla","saddlebrown":"saddelbrun","darkmagenta":"mørk magenta","thistle":"tidsel","whitesmoke":"hvid røg","wheat":"korngul","violet":"lilla","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellemblå","skyblue":"himmelblå","crimson":"blodrød","darksalmon":"mørk laksefarvet","darkred":"mørkerød","darkslategrey":"mørk skifergrå","peru":"peru","lightgrey":"lysegrå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"blanceret mandel","aliceblue":"babyblå","bisque":"gulgrå","slategray":"skifergrå","palegoldenrod":"bleg gyldenris","darkorange":"mørk orange","aquamarine":"akvamarin","lightgreen":"lysegrøn","burlywood":"tobak","dodgerblue":"dodgerblå","darkgray":"mørkegrå","lightcyan":"lys cyan","powderblue":"pudderblå","blueviolet":"blåviolet","orchid":"orkide","dimgray":"svag grå","beige":"beige","fuchsia":"lyslilla","lavenderblush":"lavendelrød","hotpink":"mørk rosa","steelblue":"metalblå","tomato":"tomat","lightpink":"lys pink","limegreen":"limegrøn","indianred":"lys rødbrun","papayawhip":"papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"mellem orkide","cornsilk":"majs","black":"sort","seagreen":"havgrøn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lyseblå","palegreen":"bleggrøn","azure":"azurblå","peachpuff":"fersken","darkolivegreen":"mørk olivengrøn","yellowgreen":"gulgrøn"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/da/colors",({aliceblue:"babyblå",antiquewhite:"antikhvid",aqua:"akvablå",aquamarine:"akvamarin",azure:"azurblå",beige:"beige",bisque:"gulgrå",black:"sort",blanchedalmond:"blanceret mandel",blue:"blå",blueviolet:"blåviolet",brown:"brun",burlywood:"tobak",cadetblue:"kadetblå",chartreuse:"chartreuse",chocolate:"rust",coral:"koralrød",cornflowerblue:"kornblomstblå",cornsilk:"majs",crimson:"blodrød",cyan:"cyan",darkblue:"mørkeblå",darkcyan:"mørk cyan",darkgoldenrod:"mørk gyldenris",darkgray:"mørkegrå",darkgreen:"mørkegrøn",darkgrey:"mørkegrå",darkkhaki:"mørk khaki",darkmagenta:"mørk magenta",darkolivegreen:"mørk olivengrøn",darkorange:"mørk orange",darkorchid:"mørk orkide",darkred:"mørkerød",darksalmon:"mørk laksefarvet",darkseagreen:"mørk havgrøn",darkslateblue:"mørk skiferblå",darkslategray:"mørk skifergrå",darkslategrey:"mørk skifergrå",darkturquoise:"mørk turkis",darkviolet:"mørkelilla",deeppink:"dyb pink",deepskyblue:"dyb himmelblå",dimgray:"svag grå",dimgrey:"svag grå",dodgerblue:"dodgerblå",firebrick:"chamottesten",floralwhite:"blomsterhvid",forestgreen:"skovgrøn",fuchsia:"lyslilla",gainsboro:"gainsboro",ghostwhite:"spøgelseshvid",gold:"guld",goldenrod:"gyldenris",gray:"grå",green:"grøn",greenyellow:"grøngul",grey:"grå",honeydew:"honningdug",hotpink:"mørk rosa",indianred:"lys rødbrun",indigo:"indigo",ivory:"elfenben",khaki:"khaki",lavender:"lysviolet",lavenderblush:"lavendelrød",lawngreen:"græsgrøn",lemonchiffon:"citronfromage",lightblue:"lyseblå",lightcoral:"lys koralrød",lightcyan:"lys cyan",lightgoldenrodyellow:"lys gyldenrisgul",lightgray:"lysegrå",lightgreen:"lysegrøn",lightgrey:"lysegrå",lightpink:"lys pink",lightsalmon:"lys laksefarvet",lightseagreen:"lys havgrøn",lightskyblue:"lys himmelblå",lightslategray:"lys skifergrå",lightslategrey:"lys skifergrå",lightsteelblue:"lys stålblå",lightyellow:"lysegul",lime:"lime",limegreen:"limegrøn",linen:"lærred",magenta:"magenta",maroon:"rødbrun",mediumaquamarine:"mellem akvamarin",mediumblue:"mellemblå",mediumorchid:"mellem orkide",mediumpurple:"mellemlilla",mediumseagreen:"mellemhavgrøn",mediumslateblue:"mellemskiferblå",mediumspringgreen:"mellemforårsgrøn",mediumturquoise:"mellemturkis",mediumvioletred:"mellemviolet",midnightblue:"midnatsblå",mintcream:"pebermyntecreme",mistyrose:"blegrosa",moccasin:"fruesko",navajowhite:"navajo-hvid",navy:"marineblå",oldlace:"kniplingshvid",olive:"olivengrøn",olivedrab:"brungrøn",orange:"orange",orangered:"orangerød",orchid:"orkide",palegoldenrod:"bleg gyldenris",palegreen:"bleggrøn",paleturquoise:"bleg turkis",palevioletred:"blegviolet",papayawhip:"papaya",peachpuff:"fersken",peru:"peru",pink:"pink",plum:"blomme",powderblue:"pudderblå",purple:"lilla",red:"rød",rosybrown:"rosabrun",royalblue:"kongeblå",saddlebrown:"saddelbrun",salmon:"laksefarvet",sandybrown:"sandbrun",seagreen:"havgrøn",seashell:"muslingeskal",sienna:"sienna",silver:"sølv",skyblue:"himmelblå",slateblue:"skiferblå",slategray:"skifergrå",slategrey:"skifergrå",snow:"sne",springgreen:"forårsgrøn",steelblue:"metalblå",tan:"tan",teal:"blågrøn",thistle:"tidsel",tomato:"tomat",transparent:"transparent",turquoise:"turkis",violet:"lilla",wheat:"korngul",white:"hvid",whitesmoke:"hvid røg",yellow:"gul",yellowgreen:"gulgrøn"})); \ No newline at end of file
diff --git a/lib/dojo/nls/da/colors.js.uncompressed.js b/lib/dojo/nls/da/colors.js.uncompressed.js
new file mode 100644
index 000000000..4b40f4834
--- /dev/null
+++ b/lib/dojo/nls/da/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/da/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "babyblå",
+ antiquewhite: "antikhvid",
+ aqua: "akvablå",
+ aquamarine: "akvamarin",
+ azure: "azurblå",
+ beige: "beige",
+ bisque: "gulgrå",
+ black: "sort",
+ blanchedalmond: "blanceret mandel",
+ blue: "blå",
+ blueviolet: "blåviolet",
+ brown: "brun",
+ burlywood: "tobak",
+ cadetblue: "kadetblå",
+ chartreuse: "chartreuse",
+ chocolate: "rust",
+ coral: "koralrød",
+ cornflowerblue: "kornblomstblå",
+ cornsilk: "majs",
+ crimson: "blodrød",
+ cyan: "cyan",
+ darkblue: "mørkeblå",
+ darkcyan: "mørk cyan",
+ darkgoldenrod: "mørk gyldenris",
+ darkgray: "mørkegrå",
+ darkgreen: "mørkegrøn",
+ darkgrey: "mørkegrå", // same as darkgray
+ darkkhaki: "mørk khaki",
+ darkmagenta: "mørk magenta",
+ darkolivegreen: "mørk olivengrøn",
+ darkorange: "mørk orange",
+ darkorchid: "mørk orkide",
+ darkred: "mørkerød",
+ darksalmon: "mørk laksefarvet",
+ darkseagreen: "mørk havgrøn",
+ darkslateblue: "mørk skiferblå",
+ darkslategray: "mørk skifergrå",
+ darkslategrey: "mørk skifergrå", // same as darkslategray
+ darkturquoise: "mørk turkis",
+ darkviolet: "mørkelilla",
+ deeppink: "dyb pink",
+ deepskyblue: "dyb himmelblå",
+ dimgray: "svag grå",
+ dimgrey: "svag grå", // same as dimgray
+ dodgerblue: "dodgerblå",
+ firebrick: "chamottesten",
+ floralwhite: "blomsterhvid",
+ forestgreen: "skovgrøn",
+ fuchsia: "lyslilla",
+ gainsboro: "gainsboro",
+ ghostwhite: "spøgelseshvid",
+ gold: "guld",
+ goldenrod: "gyldenris",
+ gray: "grå",
+ green: "grøn",
+ greenyellow: "grøngul",
+ grey: "grå", // same as gray
+ honeydew: "honningdug",
+ hotpink: "mørk rosa",
+ indianred: "lys rødbrun",
+ indigo: "indigo",
+ ivory: "elfenben",
+ khaki: "khaki",
+ lavender: "lysviolet",
+ lavenderblush: "lavendelrød",
+ lawngreen: "græsgrøn",
+ lemonchiffon: "citronfromage",
+ lightblue: "lyseblå",
+ lightcoral: "lys koralrød",
+ lightcyan: "lys cyan",
+ lightgoldenrodyellow: "lys gyldenrisgul",
+ lightgray: "lysegrå",
+ lightgreen: "lysegrøn",
+ lightgrey: "lysegrå", // same as lightgray
+ lightpink: "lys pink",
+ lightsalmon: "lys laksefarvet",
+ lightseagreen: "lys havgrøn",
+ lightskyblue: "lys himmelblå",
+ lightslategray: "lys skifergrå",
+ lightslategrey: "lys skifergrå", // same as lightslategray
+ lightsteelblue: "lys stålblå",
+ lightyellow: "lysegul",
+ lime: "lime",
+ limegreen: "limegrøn",
+ linen: "lærred",
+ magenta: "magenta",
+ maroon: "rødbrun",
+ mediumaquamarine: "mellem akvamarin",
+ mediumblue: "mellemblå",
+ mediumorchid: "mellem orkide",
+ mediumpurple: "mellemlilla",
+ mediumseagreen: "mellemhavgrøn",
+ mediumslateblue: "mellemskiferblå",
+ mediumspringgreen: "mellemforårsgrøn",
+ mediumturquoise: "mellemturkis",
+ mediumvioletred: "mellemviolet",
+ midnightblue: "midnatsblå",
+ mintcream: "pebermyntecreme",
+ mistyrose: "blegrosa",
+ moccasin: "fruesko",
+ navajowhite: "navajo-hvid",
+ navy: "marineblå",
+ oldlace: "kniplingshvid",
+ olive: "olivengrøn",
+ olivedrab: "brungrøn",
+ orange: "orange",
+ orangered: "orangerød",
+ orchid: "orkide",
+ palegoldenrod: "bleg gyldenris",
+ palegreen: "bleggrøn",
+ paleturquoise: "bleg turkis",
+ palevioletred: "blegviolet",
+ papayawhip: "papaya",
+ peachpuff: "fersken",
+ peru: "peru",
+ pink: "pink",
+ plum: "blomme",
+ powderblue: "pudderblå",
+ purple: "lilla",
+ red: "rød",
+ rosybrown: "rosabrun",
+ royalblue: "kongeblå",
+ saddlebrown: "saddelbrun",
+ salmon: "laksefarvet",
+ sandybrown: "sandbrun",
+ seagreen: "havgrøn",
+ seashell: "muslingeskal",
+ sienna: "sienna",
+ silver: "sølv",
+ skyblue: "himmelblå",
+ slateblue: "skiferblå",
+ slategray: "skifergrå",
+ slategrey: "skifergrå", // same as slategray
+ snow: "sne",
+ springgreen: "forårsgrøn",
+ steelblue: "metalblå",
+ tan: "tan",
+ teal: "blågrøn",
+ thistle: "tidsel",
+ tomato: "tomat",
+ transparent: "transparent",
+ turquoise: "turkis",
+ violet: "lilla",
+ wheat: "korngul",
+ white: "hvid",
+ whitesmoke: "hvid røg",
+ yellow: "gul",
+ yellowgreen: "gulgrøn"
+})
+);
diff --git a/lib/dojo/nls/de/colors.js b/lib/dojo/nls/de/colors.js
index 7ae21bf44..ea7fc0895 100644
--- a/lib/dojo/nls/de/colors.js
+++ b/lib/dojo/nls/de/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"Helles Stahlblau","orangered":"Orangerot","midnightblue":"Mitternachtblau","cadetblue":"Kadettenblau","seashell":"Muschelweiß","slategrey":"Schiefergrau","coral":"Koralle","darkturquoise":"Dunkeltürkis","antiquewhite":"Antikweiß","mediumspringgreen":"Mittelfrühlingsgrün","salmon":"Lachs","darkgrey":"Dunkelgrau","ivory":"Elfenbein","greenyellow":"Grüngelb","mistyrose":"Blassrose","lightsalmon":"Helllachs","silver":"Silbergrau","dimgrey":"Blassgrau","orange":"Orange","white":"Weiß","navajowhite":"Navajo-weiß","royalblue":"Königsblau","deeppink":"Tiefrosa","lime":"Limone","oldlace":"Alte Spitze","chartreuse":"Helles Gelbgrün","darkcyan":"Dunkelzyan","yellow":"Gelb","linen":"Leinen","olive":"Oliv","gold":"Gold","lawngreen":"Grasgrün","lightyellow":"Hellgelb","tan":"Hautfarben","darkviolet":"Dunkelviolett","lightslategrey":"Helles Schiefergrau","grey":"Grau","darkkhaki":"Dunkelkhaki","green":"Grün","deepskyblue":"Dunkles Himmelblau","aqua":"Wasserblau","sienna":"Sienna","mintcream":"Mintcreme","rosybrown":"Rosigbraun","mediumslateblue":"Mittelschieferblau ","magenta":"Magenta","lightseagreen":"Helles Meergrün","cyan":"Zyan","olivedrab":"Olivgrau","darkgoldenrod":"Dunkelgoldgelb","slateblue":"Schieferblau","mediumaquamarine":"Mittelaquamarin","lavender":"Lavendelblau","mediumseagreen":"Mittelmeeresgrün","maroon":"Kastanienbraun","darkslategray":"Dunkelschiefergrau","mediumturquoise":"Mitteltürkis ","ghostwhite":"Geisterweiß","darkblue":"Dunkelblau","mediumvioletred":"Mittelviolettrot ","brown":"Braun","lightgray":"Hellgrau","sandybrown":"Sandbraun","pink":"Rosa","firebrick":"Schamottestein","indigo":"Indigoblau","snow":"Schneeweiß","darkorchid":"Dunkelorchidee","turquoise":"Türkis","chocolate":"Schokoladenbraun","springgreen":"Frühlingsgrün","moccasin":"Mokassin","navy":"Marineblau","lemonchiffon":"Zitronenchiffon","teal":"Smaragdgrün","floralwhite":"Blütenweiß","cornflowerblue":"Kornblumenblau","paleturquoise":"Blasstürkis","purple":"Purpurrot","gainsboro":"Gainsboro","plum":"Pflaume","red":"Rot","blue":"Blau","forestgreen":"Forstgrün","darkgreen":"Dunkelgrün","honeydew":"Honigtau","darkseagreen":"Dunkles Meergrün","lightcoral":"Hellkoralle","palevioletred":"Blassviolettrot ","mediumpurple":"Mittelpurpur","saddlebrown":"Sattelbraun","darkmagenta":"Dunkelmagenta","thistle":"Distel","whitesmoke":"Rauchweiß","wheat":"Weizen","violet":"Violett","lightskyblue":"Helles Himmelblau","goldenrod":"Goldgelb","mediumblue":"Mittelblau","skyblue":"Himmelblau","crimson":"Karmesinrot","darksalmon":"Dunkellachs","darkred":"Dunkelrot","darkslategrey":"Dunkelschiefergrau","peru":"Peru","lightgrey":"Hellgrau","lightgoldenrodyellow":"Hellgoldgelb","blanchedalmond":"Mandelweiß","aliceblue":"Alice-blau","bisque":"Bisquit","slategray":"Schiefergrau","palegoldenrod":"Blassgoldgelb","darkorange":"Dunkelorange","aquamarine":"Aquamarin","lightgreen":"Hellgrün","burlywood":"Burlywood","dodgerblue":"Dodger-blau","darkgray":"Dunkelgrau","lightcyan":"Hellzyan","powderblue":"Pulverblau","blueviolet":"Blauviolett","orchid":"Orchidee","dimgray":"Blassgrau","beige":"Beige","fuchsia":"Fuchsia","lavenderblush":"Lavendelhauch","hotpink":"Knallrosa","steelblue":"Stahlblau","tomato":"Tomatenrot","lightpink":"Hellrosa","limegreen":"Limonengrün","indianred":"Indischrot","papayawhip":"Papayacreme","lightslategray":"Helles Schiefergrau","gray":"Grau","mediumorchid":"Mittelorchidee","cornsilk":"Kornseide","black":"Schwarz","seagreen":"Meeresgrün","darkslateblue":"Dunkelschieferblau","khaki":"Khaki","lightblue":"Hellblau","palegreen":"Blassgrün","azure":"Azur","peachpuff":"Pfirsich","darkolivegreen":"Dunkelolivgrün","yellowgreen":"Gelbgrün"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/de/colors",({aliceblue:"Alice-blau",antiquewhite:"Antikweiß",aqua:"Wasserblau",aquamarine:"Aquamarin",azure:"Azur",beige:"Beige",bisque:"Bisquit",black:"Schwarz",blanchedalmond:"Mandelweiß",blue:"Blau",blueviolet:"Blauviolett",brown:"Braun",burlywood:"Burlywood",cadetblue:"Kadettenblau",chartreuse:"Helles Gelbgrün",chocolate:"Schokoladenbraun",coral:"Koralle",cornflowerblue:"Kornblumenblau",cornsilk:"Kornseide",crimson:"Karmesinrot",cyan:"Zyan",darkblue:"Dunkelblau",darkcyan:"Dunkelzyan",darkgoldenrod:"Dunkelgoldgelb",darkgray:"Dunkelgrau",darkgreen:"Dunkelgrün",darkgrey:"Dunkelgrau",darkkhaki:"Dunkelkhaki",darkmagenta:"Dunkelmagenta",darkolivegreen:"Dunkelolivgrün",darkorange:"Dunkelorange",darkorchid:"Dunkelorchidee",darkred:"Dunkelrot",darksalmon:"Dunkellachs",darkseagreen:"Dunkles Meergrün",darkslateblue:"Dunkelschieferblau",darkslategray:"Dunkelschiefergrau",darkslategrey:"Dunkelschiefergrau",darkturquoise:"Dunkeltürkis",darkviolet:"Dunkelviolett",deeppink:"Tiefrosa",deepskyblue:"Dunkles Himmelblau",dimgray:"Blassgrau",dimgrey:"Blassgrau",dodgerblue:"Dodger-blau",firebrick:"Schamottestein",floralwhite:"Blütenweiß",forestgreen:"Forstgrün",fuchsia:"Fuchsia",gainsboro:"Gainsboro",ghostwhite:"Geisterweiß",gold:"Gold",goldenrod:"Goldgelb",gray:"Grau",green:"Grün",greenyellow:"Grüngelb",grey:"Grau",honeydew:"Honigtau",hotpink:"Knallrosa",indianred:"Indischrot",indigo:"Indigoblau",ivory:"Elfenbein",khaki:"Khaki",lavender:"Lavendelblau",lavenderblush:"Lavendelhauch",lawngreen:"Grasgrün",lemonchiffon:"Zitronenchiffon",lightblue:"Hellblau",lightcoral:"Hellkoralle",lightcyan:"Hellzyan",lightgoldenrodyellow:"Hellgoldgelb",lightgray:"Hellgrau",lightgreen:"Hellgrün",lightgrey:"Hellgrau",lightpink:"Hellrosa",lightsalmon:"Helllachs",lightseagreen:"Helles Meergrün",lightskyblue:"Helles Himmelblau",lightslategray:"Helles Schiefergrau",lightslategrey:"Helles Schiefergrau",lightsteelblue:"Helles Stahlblau",lightyellow:"Hellgelb",lime:"Limone",limegreen:"Limonengrün",linen:"Leinen",magenta:"Magenta",maroon:"Kastanienbraun",mediumaquamarine:"Mittelaquamarin",mediumblue:"Mittelblau",mediumorchid:"Mittelorchidee",mediumpurple:"Mittelpurpur",mediumseagreen:"Mittelmeeresgrün",mediumslateblue:"Mittelschieferblau ",mediumspringgreen:"Mittelfrühlingsgrün",mediumturquoise:"Mitteltürkis ",mediumvioletred:"Mittelviolettrot ",midnightblue:"Mitternachtblau",mintcream:"Mintcreme",mistyrose:"Blassrose",moccasin:"Mokassin",navajowhite:"Navajo-weiß",navy:"Marineblau",oldlace:"Alte Spitze",olive:"Oliv",olivedrab:"Olivgrau",orange:"Orange",orangered:"Orangerot",orchid:"Orchidee",palegoldenrod:"Blassgoldgelb",palegreen:"Blassgrün",paleturquoise:"Blasstürkis",palevioletred:"Blassviolettrot ",papayawhip:"Papayacreme",peachpuff:"Pfirsich",peru:"Peru",pink:"Rosa",plum:"Pflaume",powderblue:"Pulverblau",purple:"Purpurrot",red:"Rot",rosybrown:"Rosigbraun",royalblue:"Königsblau",saddlebrown:"Sattelbraun",salmon:"Lachs",sandybrown:"Sandbraun",seagreen:"Meeresgrün",seashell:"Muschelweiß",sienna:"Sienna",silver:"Silbergrau",skyblue:"Himmelblau",slateblue:"Schieferblau",slategray:"Schiefergrau",slategrey:"Schiefergrau",snow:"Schneeweiß",springgreen:"Frühlingsgrün",steelblue:"Stahlblau",tan:"Hautfarben",teal:"Smaragdgrün",thistle:"Distel",tomato:"Tomatenrot",transparent:"Transparent",turquoise:"Türkis",violet:"Violett",wheat:"Weizen",white:"Weiß",whitesmoke:"Rauchweiß",yellow:"Gelb",yellowgreen:"Gelbgrün"})); \ No newline at end of file
diff --git a/lib/dojo/nls/de/colors.js.uncompressed.js b/lib/dojo/nls/de/colors.js.uncompressed.js
new file mode 100644
index 000000000..8d376c49a
--- /dev/null
+++ b/lib/dojo/nls/de/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/de/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "Alice-blau",
+ antiquewhite: "Antikweiß",
+ aqua: "Wasserblau",
+ aquamarine: "Aquamarin",
+ azure: "Azur",
+ beige: "Beige",
+ bisque: "Bisquit",
+ black: "Schwarz",
+ blanchedalmond: "Mandelweiß",
+ blue: "Blau",
+ blueviolet: "Blauviolett",
+ brown: "Braun",
+ burlywood: "Burlywood",
+ cadetblue: "Kadettenblau",
+ chartreuse: "Helles Gelbgrün",
+ chocolate: "Schokoladenbraun",
+ coral: "Koralle",
+ cornflowerblue: "Kornblumenblau",
+ cornsilk: "Kornseide",
+ crimson: "Karmesinrot",
+ cyan: "Zyan",
+ darkblue: "Dunkelblau",
+ darkcyan: "Dunkelzyan",
+ darkgoldenrod: "Dunkelgoldgelb",
+ darkgray: "Dunkelgrau",
+ darkgreen: "Dunkelgrün",
+ darkgrey: "Dunkelgrau", // same as darkgray
+ darkkhaki: "Dunkelkhaki",
+ darkmagenta: "Dunkelmagenta",
+ darkolivegreen: "Dunkelolivgrün",
+ darkorange: "Dunkelorange",
+ darkorchid: "Dunkelorchidee",
+ darkred: "Dunkelrot",
+ darksalmon: "Dunkellachs",
+ darkseagreen: "Dunkles Meergrün",
+ darkslateblue: "Dunkelschieferblau",
+ darkslategray: "Dunkelschiefergrau",
+ darkslategrey: "Dunkelschiefergrau", // same as darkslategray
+ darkturquoise: "Dunkeltürkis",
+ darkviolet: "Dunkelviolett",
+ deeppink: "Tiefrosa",
+ deepskyblue: "Dunkles Himmelblau",
+ dimgray: "Blassgrau",
+ dimgrey: "Blassgrau", // same as dimgray
+ dodgerblue: "Dodger-blau",
+ firebrick: "Schamottestein",
+ floralwhite: "Blütenweiß",
+ forestgreen: "Forstgrün",
+ fuchsia: "Fuchsia",
+ gainsboro: "Gainsboro",
+ ghostwhite: "Geisterweiß",
+ gold: "Gold",
+ goldenrod: "Goldgelb",
+ gray: "Grau",
+ green: "Grün",
+ greenyellow: "Grüngelb",
+ grey: "Grau", // same as gray
+ honeydew: "Honigtau",
+ hotpink: "Knallrosa",
+ indianred: "Indischrot",
+ indigo: "Indigoblau",
+ ivory: "Elfenbein",
+ khaki: "Khaki",
+ lavender: "Lavendelblau",
+ lavenderblush: "Lavendelhauch",
+ lawngreen: "Grasgrün",
+ lemonchiffon: "Zitronenchiffon",
+ lightblue: "Hellblau",
+ lightcoral: "Hellkoralle",
+ lightcyan: "Hellzyan",
+ lightgoldenrodyellow: "Hellgoldgelb",
+ lightgray: "Hellgrau",
+ lightgreen: "Hellgrün",
+ lightgrey: "Hellgrau", // same as lightgray
+ lightpink: "Hellrosa",
+ lightsalmon: "Helllachs",
+ lightseagreen: "Helles Meergrün",
+ lightskyblue: "Helles Himmelblau",
+ lightslategray: "Helles Schiefergrau",
+ lightslategrey: "Helles Schiefergrau", // same as lightslategray
+ lightsteelblue: "Helles Stahlblau",
+ lightyellow: "Hellgelb",
+ lime: "Limone",
+ limegreen: "Limonengrün",
+ linen: "Leinen",
+ magenta: "Magenta",
+ maroon: "Kastanienbraun",
+ mediumaquamarine: "Mittelaquamarin",
+ mediumblue: "Mittelblau",
+ mediumorchid: "Mittelorchidee",
+ mediumpurple: "Mittelpurpur",
+ mediumseagreen: "Mittelmeeresgrün",
+ mediumslateblue: "Mittelschieferblau ",
+ mediumspringgreen: "Mittelfrühlingsgrün",
+ mediumturquoise: "Mitteltürkis ",
+ mediumvioletred: "Mittelviolettrot ",
+ midnightblue: "Mitternachtblau",
+ mintcream: "Mintcreme",
+ mistyrose: "Blassrose",
+ moccasin: "Mokassin",
+ navajowhite: "Navajo-weiß",
+ navy: "Marineblau",
+ oldlace: "Alte Spitze",
+ olive: "Oliv",
+ olivedrab: "Olivgrau",
+ orange: "Orange",
+ orangered: "Orangerot",
+ orchid: "Orchidee",
+ palegoldenrod: "Blassgoldgelb",
+ palegreen: "Blassgrün",
+ paleturquoise: "Blasstürkis",
+ palevioletred: "Blassviolettrot ",
+ papayawhip: "Papayacreme",
+ peachpuff: "Pfirsich",
+ peru: "Peru",
+ pink: "Rosa",
+ plum: "Pflaume",
+ powderblue: "Pulverblau",
+ purple: "Purpurrot",
+ red: "Rot",
+ rosybrown: "Rosigbraun",
+ royalblue: "Königsblau",
+ saddlebrown: "Sattelbraun",
+ salmon: "Lachs",
+ sandybrown: "Sandbraun",
+ seagreen: "Meeresgrün",
+ seashell: "Muschelweiß",
+ sienna: "Sienna",
+ silver: "Silbergrau",
+ skyblue: "Himmelblau",
+ slateblue: "Schieferblau",
+ slategray: "Schiefergrau",
+ slategrey: "Schiefergrau", // same as slategray
+ snow: "Schneeweiß",
+ springgreen: "Frühlingsgrün",
+ steelblue: "Stahlblau",
+ tan: "Hautfarben",
+ teal: "Smaragdgrün",
+ thistle: "Distel",
+ tomato: "Tomatenrot",
+ transparent: "Transparent",
+ turquoise: "Türkis",
+ violet: "Violett",
+ wheat: "Weizen",
+ white: "Weiß",
+ whitesmoke: "Rauchweiß",
+ yellow: "Gelb",
+ yellowgreen: "Gelbgrün"
+})
+);
diff --git a/lib/dojo/nls/el/colors.js b/lib/dojo/nls/el/colors.js
index a80df97be..4f398ca9f 100644
--- a/lib/dojo/nls/el/colors.js
+++ b/lib/dojo/nls/el/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"ανοιχτό μπλε ατσαλιού","orangered":"πορτοκαλοκόκκινο","midnightblue":"πολύ σκούρο μπλε","cadetblue":"μπλε του στρατού","seashell":"κοχύλι","slategrey":"μεταλλικό γκρι","coral":"κοραλί","darkturquoise":"σκούρο τυρκουάζ","antiquewhite":"ξεθωριασμένο λευκό","mediumspringgreen":"μεσαίο πράσινο της άνοιξης","salmon":"σομόν","darkgrey":"σκούρο γκρι","ivory":"ιβουάρ","greenyellow":"πρασινοκίτρινο","mistyrose":"τριανταφυλλί","lightsalmon":"ανοιχτό σομόν","silver":"ασημί","dimgrey":"αχνό γκρι","orange":"πορτοκαλί","white":"λευκό","navajowhite":"άσπρο Ναβάχο","royalblue":"έντονο μπλε","deeppink":"βαθύ ροζ","lime":"λαχανί","oldlace":"εκρού","chartreuse":"φωτεινό κιτρινοπράσινο","darkcyan":"σκούρο κυανό","yellow":"κίτρινο","linen":"σπαγγί","olive":"πράσινο λαδί","gold":"χρυσαφί","lawngreen":"σκούρο πράσινο","lightyellow":"ανοιχτό κίτρινο","tan":"ώχρα","darkviolet":"σκούρο βιολετί","lightslategrey":"ανοιχτό μεταλλικό γκρι","grey":"γκρι","darkkhaki":"σκούρο χακί","green":"πράσινο","deepskyblue":"βαθύ μπλε το ουρανού","aqua":"γαλάζιο","sienna":"καφεκίτρινο","mintcream":"βεραμάν","rosybrown":"καστανό","mediumslateblue":"μεσαίο μεταλλικό μπλε","magenta":"ματζέντα","lightseagreen":"ανοιχτό πράσινο της θάλασσας","cyan":"κυανό","olivedrab":"λαδί","darkgoldenrod":"σκούρο χρυσοκίτρινο","slateblue":"μεταλλικό μπλε","mediumaquamarine":"μεσαίο γαλαζοπράσινο","lavender":"λίλα","mediumseagreen":"μεσαίο πράσινο της θάλασσας","maroon":"βυσσινί","darkslategray":"σκούρο μεταλλικό γκρι","mediumturquoise":"μεσαίο τυρκουάζ","ghostwhite":"άσπρο","darkblue":"σκούρο μπλε","mediumvioletred":"μεσαίο κόκκινο βιολετί","brown":"καφέ","lightgray":"ανοιχτό γκρι","sandybrown":"μπεζ της άμμου","pink":"ροζ","firebrick":"κεραμιδί","indigo":"λουλακί","snow":"χιονί","darkorchid":"σκούρα ορχιδέα","turquoise":"τυρκουάζ","chocolate":"σοκολατί","springgreen":"πράσινο της άνοιξης","moccasin":"μόκα","navy":"μπλε του ναυτικού","lemonchiffon":"λεμονί","teal":"πετρόλ","floralwhite":"λευκό των ανθών","cornflowerblue":"μεσαίο μπλε","paleturquoise":"αχνό τυρκουάζ","purple":"μωβ","gainsboro":"γκρι σιέλ","plum":"δαμασκηνί","red":"κόκκινο","blue":"μπλε","forestgreen":"πράσινο του δάσους","darkgreen":"σκούρο πράσινο","honeydew":"μελί","darkseagreen":"σκούρο πράσινο της θάλασσας","lightcoral":"ανοιχτό κοραλί","palevioletred":"αχνό κόκκινο βιολετί","mediumpurple":"μεσαίο μωβ","saddlebrown":"βαθύ καφέ","darkmagenta":"σκούρο ματζέντα","thistle":"μωβ βιολετί","whitesmoke":"λευκός καπνός","wheat":"σταρένιο","violet":"βιολετί","lightskyblue":"ανοιχτό μπλε το ουρανού","goldenrod":"χρυσοκίτρινο","mediumblue":"μεσαίο μπλε","skyblue":"μπλε του ουρανού","crimson":"βαθύ κόκκινο","darksalmon":"σκούρο σομόν","darkred":"σκούρο κόκκινο","darkslategrey":"σκούρο μεταλλικό γκρι","peru":"περού","lightgrey":"ανοιχτό γκρι","lightgoldenrodyellow":"ανοιχτό χρυσοκίτρινο","blanchedalmond":"ζαχαρί","aliceblue":"σιέλ","bisque":"σκούρο κρεμ","slategray":"μεταλλικό γκρι","palegoldenrod":"αχνό χρυσοκίτρινο","darkorange":"σκούρο πορτοκαλί","aquamarine":"γαλαζοπράσινο","lightgreen":"ανοιχτό πράσινο","burlywood":"καφέ του ξύλου","dodgerblue":"σκούρο ελεκτρίκ","darkgray":"σκούρο γκρι","lightcyan":"ανοιχτό κυανό","powderblue":"αχνό μπλε","blueviolet":"βιολετί","orchid":"ορχιδέα","dimgray":"αχνό γκρι","beige":"μπεζ","fuchsia":"φούξια","lavenderblush":"μωβ λεβάντας","hotpink":"έντονο ροζ","steelblue":"μπλε ατσαλιού","tomato":"κόκκινο της ντομάτας","lightpink":"ανοιχτό ροζ","limegreen":"πράσινο λαχανί","indianred":"ινδικό κόκκινο","papayawhip":"αχνό ροζ","lightslategray":"ανοιχτό μεταλλικό γκρι","gray":"γκρι","mediumorchid":"μεσαία ορχιδέα","cornsilk":"ασημί του καλαμποκιού","black":"μαύρο","seagreen":"πράσινο της θάλασσας","darkslateblue":"σκούρο μεταλλικό μπλε","khaki":"χακί","lightblue":"ανοιχτό μπλε","palegreen":"αχνό πράσινο","azure":"μπλε του ουρανού","peachpuff":"ροδακινί","darkolivegreen":"σκούρο πράσινο λαδί","yellowgreen":"κιτρινοπράσινο"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/el/colors",({aliceblue:"σιέλ",antiquewhite:"ξεθωριασμένο λευκό",aqua:"γαλάζιο",aquamarine:"γαλαζοπράσινο",azure:"μπλε του ουρανού",beige:"μπεζ",bisque:"σκούρο κρεμ",black:"μαύρο",blanchedalmond:"ζαχαρί",blue:"μπλε",blueviolet:"βιολετί",brown:"καφέ",burlywood:"καφέ του ξύλου",cadetblue:"μπλε του στρατού",chartreuse:"φωτεινό κιτρινοπράσινο",chocolate:"σοκολατί",coral:"κοραλί",cornflowerblue:"μεσαίο μπλε",cornsilk:"ασημί του καλαμποκιού",crimson:"βαθύ κόκκινο",cyan:"κυανό",darkblue:"σκούρο μπλε",darkcyan:"σκούρο κυανό",darkgoldenrod:"σκούρο χρυσοκίτρινο",darkgray:"σκούρο γκρι",darkgreen:"σκούρο πράσινο",darkgrey:"σκούρο γκρι",darkkhaki:"σκούρο χακί",darkmagenta:"σκούρο ματζέντα",darkolivegreen:"σκούρο πράσινο λαδί",darkorange:"σκούρο πορτοκαλί",darkorchid:"σκούρα ορχιδέα",darkred:"σκούρο κόκκινο",darksalmon:"σκούρο σομόν",darkseagreen:"σκούρο πράσινο της θάλασσας",darkslateblue:"σκούρο μεταλλικό μπλε",darkslategray:"σκούρο μεταλλικό γκρι",darkslategrey:"σκούρο μεταλλικό γκρι",darkturquoise:"σκούρο τυρκουάζ",darkviolet:"σκούρο βιολετί",deeppink:"βαθύ ροζ",deepskyblue:"βαθύ μπλε το ουρανού",dimgray:"αχνό γκρι",dimgrey:"αχνό γκρι",dodgerblue:"σκούρο ελεκτρίκ",firebrick:"κεραμιδί",floralwhite:"λευκό των ανθών",forestgreen:"πράσινο του δάσους",fuchsia:"φούξια",gainsboro:"γκρι σιέλ",ghostwhite:"άσπρο",gold:"χρυσαφί",goldenrod:"χρυσοκίτρινο",gray:"γκρι",green:"πράσινο",greenyellow:"πρασινοκίτρινο",grey:"γκρι",honeydew:"μελί",hotpink:"έντονο ροζ",indianred:"ινδικό κόκκινο",indigo:"λουλακί",ivory:"ιβουάρ",khaki:"χακί",lavender:"λίλα",lavenderblush:"μωβ λεβάντας",lawngreen:"σκούρο πράσινο",lemonchiffon:"λεμονί",lightblue:"ανοιχτό μπλε",lightcoral:"ανοιχτό κοραλί",lightcyan:"ανοιχτό κυανό",lightgoldenrodyellow:"ανοιχτό χρυσοκίτρινο",lightgray:"ανοιχτό γκρι",lightgreen:"ανοιχτό πράσινο",lightgrey:"ανοιχτό γκρι",lightpink:"ανοιχτό ροζ",lightsalmon:"ανοιχτό σομόν",lightseagreen:"ανοιχτό πράσινο της θάλασσας",lightskyblue:"ανοιχτό μπλε το ουρανού",lightslategray:"ανοιχτό μεταλλικό γκρι",lightslategrey:"ανοιχτό μεταλλικό γκρι",lightsteelblue:"ανοιχτό μπλε ατσαλιού",lightyellow:"ανοιχτό κίτρινο",lime:"λαχανί",limegreen:"πράσινο λαχανί",linen:"σπαγγί",magenta:"ματζέντα",maroon:"βυσσινί",mediumaquamarine:"μεσαίο γαλαζοπράσινο",mediumblue:"μεσαίο μπλε",mediumorchid:"μεσαία ορχιδέα",mediumpurple:"μεσαίο μωβ",mediumseagreen:"μεσαίο πράσινο της θάλασσας",mediumslateblue:"μεσαίο μεταλλικό μπλε",mediumspringgreen:"μεσαίο πράσινο της άνοιξης",mediumturquoise:"μεσαίο τυρκουάζ",mediumvioletred:"μεσαίο κόκκινο βιολετί",midnightblue:"πολύ σκούρο μπλε",mintcream:"βεραμάν",mistyrose:"τριανταφυλλί",moccasin:"μόκα",navajowhite:"άσπρο Ναβάχο",navy:"μπλε του ναυτικού",oldlace:"εκρού",olive:"πράσινο λαδί",olivedrab:"λαδί",orange:"πορτοκαλί",orangered:"πορτοκαλοκόκκινο",orchid:"ορχιδέα",palegoldenrod:"αχνό χρυσοκίτρινο",palegreen:"αχνό πράσινο",paleturquoise:"αχνό τυρκουάζ",palevioletred:"αχνό κόκκινο βιολετί",papayawhip:"αχνό ροζ",peachpuff:"ροδακινί",peru:"περού",pink:"ροζ",plum:"δαμασκηνί",powderblue:"αχνό μπλε",purple:"μωβ",red:"κόκκινο",rosybrown:"καστανό",royalblue:"έντονο μπλε",saddlebrown:"βαθύ καφέ",salmon:"σομόν",sandybrown:"μπεζ της άμμου",seagreen:"πράσινο της θάλασσας",seashell:"κοχύλι",sienna:"καφεκίτρινο",silver:"ασημί",skyblue:"μπλε του ουρανού",slateblue:"μεταλλικό μπλε",slategray:"μεταλλικό γκρι",slategrey:"μεταλλικό γκρι",snow:"χιονί",springgreen:"πράσινο της άνοιξης",steelblue:"μπλε ατσαλιού",tan:"ώχρα",teal:"πετρόλ",thistle:"μωβ βιολετί",tomato:"κόκκινο της ντομάτας",transparent:"διαφανές",turquoise:"τυρκουάζ",violet:"βιολετί",wheat:"σταρένιο",white:"λευκό",whitesmoke:"λευκός καπνός",yellow:"κίτρινο",yellowgreen:"κιτρινοπράσινο"})); \ No newline at end of file
diff --git a/lib/dojo/nls/el/colors.js.uncompressed.js b/lib/dojo/nls/el/colors.js.uncompressed.js
new file mode 100644
index 000000000..8f4bc0eca
--- /dev/null
+++ b/lib/dojo/nls/el/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/el/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "σιέλ",
+ antiquewhite: "ξεθωριασμένο λευκό",
+ aqua: "γαλάζιο",
+ aquamarine: "γαλαζοπράσινο",
+ azure: "μπλε του ουρανού",
+ beige: "μπεζ",
+ bisque: "σκούρο κρεμ",
+ black: "μαύρο",
+ blanchedalmond: "ζαχαρί",
+ blue: "μπλε",
+ blueviolet: "βιολετί",
+ brown: "καφέ",
+ burlywood: "καφέ του ξύλου",
+ cadetblue: "μπλε του στρατού",
+ chartreuse: "φωτεινό κιτρινοπράσινο",
+ chocolate: "σοκολατί",
+ coral: "κοραλί",
+ cornflowerblue: "μεσαίο μπλε",
+ cornsilk: "ασημί του καλαμποκιού",
+ crimson: "βαθύ κόκκινο",
+ cyan: "κυανό",
+ darkblue: "σκούρο μπλε",
+ darkcyan: "σκούρο κυανό",
+ darkgoldenrod: "σκούρο χρυσοκίτρινο",
+ darkgray: "σκούρο γκρι",
+ darkgreen: "σκούρο πράσινο",
+ darkgrey: "σκούρο γκρι", // same as darkgray
+ darkkhaki: "σκούρο χακί",
+ darkmagenta: "σκούρο ματζέντα",
+ darkolivegreen: "σκούρο πράσινο λαδί",
+ darkorange: "σκούρο πορτοκαλί",
+ darkorchid: "σκούρα ορχιδέα",
+ darkred: "σκούρο κόκκινο",
+ darksalmon: "σκούρο σομόν",
+ darkseagreen: "σκούρο πράσινο της θάλασσας",
+ darkslateblue: "σκούρο μεταλλικό μπλε",
+ darkslategray: "σκούρο μεταλλικό γκρι",
+ darkslategrey: "σκούρο μεταλλικό γκρι", // same as darkslategray
+ darkturquoise: "σκούρο τυρκουάζ",
+ darkviolet: "σκούρο βιολετί",
+ deeppink: "βαθύ ροζ",
+ deepskyblue: "βαθύ μπλε το ουρανού",
+ dimgray: "αχνό γκρι",
+ dimgrey: "αχνό γκρι", // same as dimgray
+ dodgerblue: "σκούρο ελεκτρίκ",
+ firebrick: "κεραμιδί",
+ floralwhite: "λευκό των ανθών",
+ forestgreen: "πράσινο του δάσους",
+ fuchsia: "φούξια",
+ gainsboro: "γκρι σιέλ",
+ ghostwhite: "άσπρο",
+ gold: "χρυσαφί",
+ goldenrod: "χρυσοκίτρινο",
+ gray: "γκρι",
+ green: "πράσινο",
+ greenyellow: "πρασινοκίτρινο",
+ grey: "γκρι", // same as gray
+ honeydew: "μελί",
+ hotpink: "έντονο ροζ",
+ indianred: "ινδικό κόκκινο",
+ indigo: "λουλακί",
+ ivory: "ιβουάρ",
+ khaki: "χακί",
+ lavender: "λίλα",
+ lavenderblush: "μωβ λεβάντας",
+ lawngreen: "σκούρο πράσινο",
+ lemonchiffon: "λεμονί",
+ lightblue: "ανοιχτό μπλε",
+ lightcoral: "ανοιχτό κοραλί",
+ lightcyan: "ανοιχτό κυανό",
+ lightgoldenrodyellow: "ανοιχτό χρυσοκίτρινο",
+ lightgray: "ανοιχτό γκρι",
+ lightgreen: "ανοιχτό πράσινο",
+ lightgrey: "ανοιχτό γκρι", // same as lightgray
+ lightpink: "ανοιχτό ροζ",
+ lightsalmon: "ανοιχτό σομόν",
+ lightseagreen: "ανοιχτό πράσινο της θάλασσας",
+ lightskyblue: "ανοιχτό μπλε το ουρανού",
+ lightslategray: "ανοιχτό μεταλλικό γκρι",
+ lightslategrey: "ανοιχτό μεταλλικό γκρι", // same as lightslategray
+ lightsteelblue: "ανοιχτό μπλε ατσαλιού",
+ lightyellow: "ανοιχτό κίτρινο",
+ lime: "λαχανί",
+ limegreen: "πράσινο λαχανί",
+ linen: "σπαγγί",
+ magenta: "ματζέντα",
+ maroon: "βυσσινί",
+ mediumaquamarine: "μεσαίο γαλαζοπράσινο",
+ mediumblue: "μεσαίο μπλε",
+ mediumorchid: "μεσαία ορχιδέα",
+ mediumpurple: "μεσαίο μωβ",
+ mediumseagreen: "μεσαίο πράσινο της θάλασσας",
+ mediumslateblue: "μεσαίο μεταλλικό μπλε",
+ mediumspringgreen: "μεσαίο πράσινο της άνοιξης",
+ mediumturquoise: "μεσαίο τυρκουάζ",
+ mediumvioletred: "μεσαίο κόκκινο βιολετί",
+ midnightblue: "πολύ σκούρο μπλε",
+ mintcream: "βεραμάν",
+ mistyrose: "τριανταφυλλί",
+ moccasin: "μόκα",
+ navajowhite: "άσπρο Ναβάχο",
+ navy: "μπλε του ναυτικού",
+ oldlace: "εκρού",
+ olive: "πράσινο λαδί",
+ olivedrab: "λαδί",
+ orange: "πορτοκαλί",
+ orangered: "πορτοκαλοκόκκινο",
+ orchid: "ορχιδέα",
+ palegoldenrod: "αχνό χρυσοκίτρινο",
+ palegreen: "αχνό πράσινο",
+ paleturquoise: "αχνό τυρκουάζ",
+ palevioletred: "αχνό κόκκινο βιολετί",
+ papayawhip: "αχνό ροζ",
+ peachpuff: "ροδακινί",
+ peru: "περού",
+ pink: "ροζ",
+ plum: "δαμασκηνί",
+ powderblue: "αχνό μπλε",
+ purple: "μωβ",
+ red: "κόκκινο",
+ rosybrown: "καστανό",
+ royalblue: "έντονο μπλε",
+ saddlebrown: "βαθύ καφέ",
+ salmon: "σομόν",
+ sandybrown: "μπεζ της άμμου",
+ seagreen: "πράσινο της θάλασσας",
+ seashell: "κοχύλι",
+ sienna: "καφεκίτρινο",
+ silver: "ασημί",
+ skyblue: "μπλε του ουρανού",
+ slateblue: "μεταλλικό μπλε",
+ slategray: "μεταλλικό γκρι",
+ slategrey: "μεταλλικό γκρι", // same as slategray
+ snow: "χιονί",
+ springgreen: "πράσινο της άνοιξης",
+ steelblue: "μπλε ατσαλιού",
+ tan: "ώχρα",
+ teal: "πετρόλ",
+ thistle: "μωβ βιολετί",
+ tomato: "κόκκινο της ντομάτας",
+ transparent: "διαφανές",
+ turquoise: "τυρκουάζ",
+ violet: "βιολετί",
+ wheat: "σταρένιο",
+ white: "λευκό",
+ whitesmoke: "λευκός καπνός",
+ yellow: "κίτρινο",
+ yellowgreen: "κιτρινοπράσινο"
+})
+);
diff --git a/lib/dojo/nls/es/colors.js b/lib/dojo/nls/es/colors.js
index 95bb23e86..63338948e 100644
--- a/lib/dojo/nls/es/colors.js
+++ b/lib/dojo/nls/es/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"azul acero claro","orangered":"rojo anaranjado","midnightblue":"azul medianoche","cadetblue":"azul cadete","seashell":"blanco marfil","slategrey":"gris pizarra","coral":"coral","darkturquoise":"turquesa oscuro","antiquewhite":"blanco antiguo","mediumspringgreen":"verde primavera medio","salmon":"salmón","darkgrey":"gris oscuro","ivory":"marfil","greenyellow":"amarillo verdoso","mistyrose":"rosa difuminado","lightsalmon":"salmón claro","silver":"plateado","dimgrey":"gris marengo","orange":"naranja","white":"blanco","navajowhite":"blanco navajo","royalblue":"azul real","deeppink":"rosa fuerte","lime":"lima","oldlace":"encaje antiguo","chartreuse":"verde pálido 2","darkcyan":"cian oscuro","yellow":"amarillo","linen":"blanco arena","olive":"verde oliva","gold":"oro","lawngreen":"verde césped","lightyellow":"amarillo claro","tan":"canela","darkviolet":"violeta oscuro","lightslategrey":"gris pizarra claro","grey":"gris","darkkhaki":"caqui oscuro","green":"verde","deepskyblue":"azul cielo fuerte","aqua":"aguamarina","sienna":"siena","mintcream":"crema menta","rosybrown":"marrón rosáceo","mediumslateblue":"azul pizarra medio","magenta":"magenta","lightseagreen":"verde mar claro","cyan":"cian","olivedrab":"verde oliva pardusco","darkgoldenrod":"ocre oscuro","slateblue":"azul pizarra","mediumaquamarine":"aguamarina medio","lavender":"lavanda","mediumseagreen":"verde mar medio","maroon":"granate","darkslategray":"gris pizarra oscuro","mediumturquoise":"turquesa medio","ghostwhite":"blanco ligero","darkblue":"azul oscuro","mediumvioletred":"rojo violáceo medio","brown":"marrón","lightgray":"gris claro","sandybrown":"marrón arcilla","pink":"rosa","firebrick":"teja","indigo":"añil","snow":"nieve","darkorchid":"orquídea oscuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde fuerte","moccasin":"arena","navy":"azul marino","lemonchiffon":"amarillo pastel","teal":"verde azulado","floralwhite":"blanco manteca","cornflowerblue":"azul aciano","paleturquoise":"turquesa pálido","purple":"púrpura","gainsboro":"azul gainsboro","plum":"ciruela","red":"rojo","blue":"azul","forestgreen":"verde pino","darkgreen":"verde oscuro","honeydew":"flor de rocío","darkseagreen":"verde mar oscuro","lightcoral":"coral claro","palevioletred":"rojo violáceo pálido","mediumpurple":"púrpura medio","saddlebrown":"cuero","darkmagenta":"magenta oscuro","thistle":"cardo","whitesmoke":"blanco ahumado","wheat":"trigo","violet":"violeta","lightskyblue":"azul cielo claro","goldenrod":"ocre","mediumblue":"azul medio","skyblue":"azul cielo","crimson":"carmesí","darksalmon":"salmón oscuro","darkred":"rojo oscuro","darkslategrey":"gris pizarra oscuro","peru":"perú","lightgrey":"gris claro","lightgoldenrodyellow":"ocre claro","blanchedalmond":"almendra pálido","aliceblue":"blanco azulado","bisque":"miel","slategray":"gris pizarra","palegoldenrod":"ocre pálido","darkorange":"naranja oscuro","aquamarine":"aguamarina 2","lightgreen":"verde claro","burlywood":"madera","dodgerblue":"azul fuerte","darkgray":"gris oscuro","lightcyan":"cian claro","powderblue":"azul suave","blueviolet":"azul violáceo","orchid":"orquídea","dimgray":"gris marengo","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosácea","hotpink":"rosa oscuro","steelblue":"azul acero","tomato":"tomate","lightpink":"rosa claro","limegreen":"lima limón","indianred":"rojo teja","papayawhip":"papaya claro","lightslategray":"gris pizarra claro","gray":"gris","mediumorchid":"orquídea medio","cornsilk":"crudo","black":"negro","seagreen":"verde mar","darkslateblue":"azul pizarra oscuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"blanco cielo","peachpuff":"melocotón","darkolivegreen":"verde oliva oscuro","yellowgreen":"verde amarillento"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/es/colors",({aliceblue:"blanco azulado",antiquewhite:"blanco antiguo",aqua:"aguamarina",aquamarine:"aguamarina 2",azure:"blanco cielo",beige:"beige",bisque:"miel",black:"negro",blanchedalmond:"almendra pálido",blue:"azul",blueviolet:"azul violáceo",brown:"marrón",burlywood:"madera",cadetblue:"azul cadete",chartreuse:"verde pálido 2",chocolate:"chocolate",coral:"coral",cornflowerblue:"azul aciano",cornsilk:"crudo",crimson:"carmesí",cyan:"cian",darkblue:"azul oscuro",darkcyan:"cian oscuro",darkgoldenrod:"ocre oscuro",darkgray:"gris oscuro",darkgreen:"verde oscuro",darkgrey:"gris oscuro",darkkhaki:"caqui oscuro",darkmagenta:"magenta oscuro",darkolivegreen:"verde oliva oscuro",darkorange:"naranja oscuro",darkorchid:"orquídea oscuro",darkred:"rojo oscuro",darksalmon:"salmón oscuro",darkseagreen:"verde mar oscuro",darkslateblue:"azul pizarra oscuro",darkslategray:"gris pizarra oscuro",darkslategrey:"gris pizarra oscuro",darkturquoise:"turquesa oscuro",darkviolet:"violeta oscuro",deeppink:"rosa fuerte",deepskyblue:"azul cielo fuerte",dimgray:"gris marengo",dimgrey:"gris marengo",dodgerblue:"azul fuerte",firebrick:"teja",floralwhite:"blanco manteca",forestgreen:"verde pino",fuchsia:"fucsia",gainsboro:"azul gainsboro",ghostwhite:"blanco ligero",gold:"oro",goldenrod:"ocre",gray:"gris",green:"verde",greenyellow:"amarillo verdoso",grey:"gris",honeydew:"flor de rocío",hotpink:"rosa oscuro",indianred:"rojo teja",indigo:"añil",ivory:"marfil",khaki:"caqui",lavender:"lavanda",lavenderblush:"lavanda rosácea",lawngreen:"verde césped",lemonchiffon:"amarillo pastel",lightblue:"azul claro",lightcoral:"coral claro",lightcyan:"cian claro",lightgoldenrodyellow:"ocre claro",lightgray:"gris claro",lightgreen:"verde claro",lightgrey:"gris claro",lightpink:"rosa claro",lightsalmon:"salmón claro",lightseagreen:"verde mar claro",lightskyblue:"azul cielo claro",lightslategray:"gris pizarra claro",lightslategrey:"gris pizarra claro",lightsteelblue:"azul acero claro",lightyellow:"amarillo claro",lime:"lima",limegreen:"lima limón",linen:"blanco arena",magenta:"magenta",maroon:"granate",mediumaquamarine:"aguamarina medio",mediumblue:"azul medio",mediumorchid:"orquídea medio",mediumpurple:"púrpura medio",mediumseagreen:"verde mar medio",mediumslateblue:"azul pizarra medio",mediumspringgreen:"verde primavera medio",mediumturquoise:"turquesa medio",mediumvioletred:"rojo violáceo medio",midnightblue:"azul medianoche",mintcream:"crema menta",mistyrose:"rosa difuminado",moccasin:"arena",navajowhite:"blanco navajo",navy:"azul marino",oldlace:"encaje antiguo",olive:"verde oliva",olivedrab:"verde oliva pardusco",orange:"naranja",orangered:"rojo anaranjado",orchid:"orquídea",palegoldenrod:"ocre pálido",palegreen:"verde pálido",paleturquoise:"turquesa pálido",palevioletred:"rojo violáceo pálido",papayawhip:"papaya claro",peachpuff:"melocotón",peru:"perú",pink:"rosa",plum:"ciruela",powderblue:"azul suave",purple:"púrpura",red:"rojo",rosybrown:"marrón rosáceo",royalblue:"azul real",saddlebrown:"cuero",salmon:"salmón",sandybrown:"marrón arcilla",seagreen:"verde mar",seashell:"blanco marfil",sienna:"siena",silver:"plateado",skyblue:"azul cielo",slateblue:"azul pizarra",slategray:"gris pizarra",slategrey:"gris pizarra",snow:"nieve",springgreen:"verde fuerte",steelblue:"azul acero",tan:"canela",teal:"verde azulado",thistle:"cardo",tomato:"tomate",transparent:"transparente",turquoise:"turquesa",violet:"violeta",wheat:"trigo",white:"blanco",whitesmoke:"blanco ahumado",yellow:"amarillo",yellowgreen:"verde amarillento"})); \ No newline at end of file
diff --git a/lib/dojo/nls/es/colors.js.uncompressed.js b/lib/dojo/nls/es/colors.js.uncompressed.js
new file mode 100644
index 000000000..121f3510a
--- /dev/null
+++ b/lib/dojo/nls/es/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/es/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "blanco azulado",
+ antiquewhite: "blanco antiguo",
+ aqua: "aguamarina",
+ aquamarine: "aguamarina 2",
+ azure: "blanco cielo",
+ beige: "beige",
+ bisque: "miel",
+ black: "negro",
+ blanchedalmond: "almendra pálido",
+ blue: "azul",
+ blueviolet: "azul violáceo",
+ brown: "marrón",
+ burlywood: "madera",
+ cadetblue: "azul cadete",
+ chartreuse: "verde pálido 2",
+ chocolate: "chocolate",
+ coral: "coral",
+ cornflowerblue: "azul aciano",
+ cornsilk: "crudo",
+ crimson: "carmesí",
+ cyan: "cian",
+ darkblue: "azul oscuro",
+ darkcyan: "cian oscuro",
+ darkgoldenrod: "ocre oscuro",
+ darkgray: "gris oscuro",
+ darkgreen: "verde oscuro",
+ darkgrey: "gris oscuro", // same as darkgray
+ darkkhaki: "caqui oscuro",
+ darkmagenta: "magenta oscuro",
+ darkolivegreen: "verde oliva oscuro",
+ darkorange: "naranja oscuro",
+ darkorchid: "orquídea oscuro",
+ darkred: "rojo oscuro",
+ darksalmon: "salmón oscuro",
+ darkseagreen: "verde mar oscuro",
+ darkslateblue: "azul pizarra oscuro",
+ darkslategray: "gris pizarra oscuro",
+ darkslategrey: "gris pizarra oscuro", // same as darkslategray
+ darkturquoise: "turquesa oscuro",
+ darkviolet: "violeta oscuro",
+ deeppink: "rosa fuerte",
+ deepskyblue: "azul cielo fuerte",
+ dimgray: "gris marengo",
+ dimgrey: "gris marengo", // same as dimgray
+ dodgerblue: "azul fuerte",
+ firebrick: "teja",
+ floralwhite: "blanco manteca",
+ forestgreen: "verde pino",
+ fuchsia: "fucsia",
+ gainsboro: "azul gainsboro",
+ ghostwhite: "blanco ligero",
+ gold: "oro",
+ goldenrod: "ocre",
+ gray: "gris",
+ green: "verde",
+ greenyellow: "amarillo verdoso",
+ grey: "gris", // same as gray
+ honeydew: "flor de rocío",
+ hotpink: "rosa oscuro",
+ indianred: "rojo teja",
+ indigo: "añil",
+ ivory: "marfil",
+ khaki: "caqui",
+ lavender: "lavanda",
+ lavenderblush: "lavanda rosácea",
+ lawngreen: "verde césped",
+ lemonchiffon: "amarillo pastel",
+ lightblue: "azul claro",
+ lightcoral: "coral claro",
+ lightcyan: "cian claro",
+ lightgoldenrodyellow: "ocre claro",
+ lightgray: "gris claro",
+ lightgreen: "verde claro",
+ lightgrey: "gris claro", // same as lightgray
+ lightpink: "rosa claro",
+ lightsalmon: "salmón claro",
+ lightseagreen: "verde mar claro",
+ lightskyblue: "azul cielo claro",
+ lightslategray: "gris pizarra claro",
+ lightslategrey: "gris pizarra claro", // same as lightslategray
+ lightsteelblue: "azul acero claro",
+ lightyellow: "amarillo claro",
+ lime: "lima",
+ limegreen: "lima limón",
+ linen: "blanco arena",
+ magenta: "magenta",
+ maroon: "granate",
+ mediumaquamarine: "aguamarina medio",
+ mediumblue: "azul medio",
+ mediumorchid: "orquídea medio",
+ mediumpurple: "púrpura medio",
+ mediumseagreen: "verde mar medio",
+ mediumslateblue: "azul pizarra medio",
+ mediumspringgreen: "verde primavera medio",
+ mediumturquoise: "turquesa medio",
+ mediumvioletred: "rojo violáceo medio",
+ midnightblue: "azul medianoche",
+ mintcream: "crema menta",
+ mistyrose: "rosa difuminado",
+ moccasin: "arena",
+ navajowhite: "blanco navajo",
+ navy: "azul marino",
+ oldlace: "encaje antiguo",
+ olive: "verde oliva",
+ olivedrab: "verde oliva pardusco",
+ orange: "naranja",
+ orangered: "rojo anaranjado",
+ orchid: "orquídea",
+ palegoldenrod: "ocre pálido",
+ palegreen: "verde pálido",
+ paleturquoise: "turquesa pálido",
+ palevioletred: "rojo violáceo pálido",
+ papayawhip: "papaya claro",
+ peachpuff: "melocotón",
+ peru: "perú",
+ pink: "rosa",
+ plum: "ciruela",
+ powderblue: "azul suave",
+ purple: "púrpura",
+ red: "rojo",
+ rosybrown: "marrón rosáceo",
+ royalblue: "azul real",
+ saddlebrown: "cuero",
+ salmon: "salmón",
+ sandybrown: "marrón arcilla",
+ seagreen: "verde mar",
+ seashell: "blanco marfil",
+ sienna: "siena",
+ silver: "plateado",
+ skyblue: "azul cielo",
+ slateblue: "azul pizarra",
+ slategray: "gris pizarra",
+ slategrey: "gris pizarra", // same as slategray
+ snow: "nieve",
+ springgreen: "verde fuerte",
+ steelblue: "azul acero",
+ tan: "canela",
+ teal: "verde azulado",
+ thistle: "cardo",
+ tomato: "tomate",
+ transparent: "transparente",
+ turquoise: "turquesa",
+ violet: "violeta",
+ wheat: "trigo",
+ white: "blanco",
+ whitesmoke: "blanco ahumado",
+ yellow: "amarillo",
+ yellowgreen: "verde amarillento"
+})
+);
diff --git a/lib/dojo/nls/fi/colors.js b/lib/dojo/nls/fi/colors.js
index 17cdf1684..93383f462 100644
--- a/lib/dojo/nls/fi/colors.js
+++ b/lib/dojo/nls/fi/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"vaalea teräksensininen","orangered":"oranssinpunainen","midnightblue":"yönsininen","cadetblue":"meren vihreä","seashell":"simpukankuori","slategrey":"savenharmaa","coral":"koralli","darkturquoise":"tumma turkoosi","antiquewhite":"antiikinvalkoinen","mediumspringgreen":"keskivaalea keväänvihreä","salmon":"lohenpunainen","darkgrey":"tummanharmaa","ivory":"norsunluu","greenyellow":"vihreänkeltainen","mistyrose":"utuinen ruusu","lightsalmon":"vaalea lohenpunainen","silver":"hopea","dimgrey":"himmeänharmaa","orange":"oranssi","white":"valkoinen","navajowhite":"navajonvalkoinen","royalblue":"syvänsininen","deeppink":"syvä vaaleanpunainen","lime":"vaaleanvihreä","oldlace":"vanha pitsi","chartreuse":"kellanvihreä","darkcyan":"tumma turkoosi","yellow":"keltainen","linen":"pellavanvaalea","olive":"oliivinvihreä","gold":"kulta","lawngreen":"ruohonvihreä","lightyellow":"vaaleankeltainen","tan":"kellanruskea","darkviolet":"tummanvioletti","lightslategrey":"vaaleanharmaa","grey":"harmaa","darkkhaki":"tumma khaki","green":"vihreä","deepskyblue":"tumma taivaansininen","aqua":"sinivihreä","sienna":"siena","mintcream":"minttukreemi","rosybrown":"punertavanruskea","mediumslateblue":"keskivaalea siniharmaa","magenta":"magenta","lightseagreen":"vaalea merenvihreä","cyan":"syaani","olivedrab":"oliivinruskea","darkgoldenrod":"tumma kultapiisku","slateblue":"savensininen","mediumaquamarine":"keskivaalea vedenvihreä","lavender":"laventeli","mediumseagreen":"keskivaalea merenvihreä","maroon":"kastanjanruskea","darkslategray":"tummanharmaa","mediumturquoise":"keskivaalea turkoosi","ghostwhite":"lakananvalkoinen","darkblue":"tummansininen","mediumvioletred":"keskivaalea lila","brown":"ruskea","lightgray":"vaaleanharmaa","sandybrown":"hiekanruskea","pink":"vaaleanpunainen","firebrick":"poltetun tiilen punainen","indigo":"indigo","snow":"lumivalkoinen","darkorchid":"tumma orkidea","turquoise":"turkoosi","chocolate":"suklaanruskea","springgreen":"keväänvihreä","moccasin":"nahanruskea","navy":"laivastonsininen","lemonchiffon":"sitruunankeltainen","teal":"sinivihreä","floralwhite":"kukanvalkoinen","cornflowerblue":"syvänsininen","paleturquoise":"haalea turkoosi","purple":"violetti","gainsboro":"gainsboro","plum":"luumunpunainen","red":"punainen","blue":"sininen","forestgreen":"metsänvihreä","darkgreen":"tummanvihreä","honeydew":"hunajameloninvihreä","darkseagreen":"tumma merenvihreä","lightcoral":"vaalea koralli","palevioletred":"haalea lila","mediumpurple":"keskivaalea violetti","saddlebrown":"satulanruskea","darkmagenta":"tumma magenta","thistle":"ohdake","whitesmoke":"savunvalkea","wheat":"vehnänkeltainen","violet":"violetti","lightskyblue":"vaalea taivaansininen","goldenrod":"kullanruskea","mediumblue":"keskisininen","skyblue":"taivaansininen","crimson":"karmiininpunainen","darksalmon":"tumma lohenpunainen","darkred":"tummanpunainen","darkslategrey":"tummanharmaa","peru":"peru","lightgrey":"vaaleanharmaa","lightgoldenrodyellow":"vaalea kultapiiskunkeltainen","blanchedalmond":"kuorittu manteli","aliceblue":"vaaleanharmaansininen","bisque":"vaaleanruskea","slategray":"savenharmaa","palegoldenrod":"haalea kultapiisku","darkorange":"tummanoranssi","aquamarine":"vedenvihreä","lightgreen":"vaaleanvihreä","burlywood":"puunruskea","dodgerblue":"Dodger-sininen","darkgray":"tummanharmaa","lightcyan":"vaalea syaani","powderblue":"harmaansininen","blueviolet":"sinivioletti","orchid":"orkidea","dimgray":"himmeänharmaa","beige":"vaaleanruskea","fuchsia":"purppura","lavenderblush":"laventelinpunainen","hotpink":"pinkki","steelblue":"teräksensininen","tomato":"tomaatinpunainen","lightpink":"vaaleanpunainen","limegreen":"limetinvihreä","indianred":"kirkkaanpunainen","papayawhip":"papaijavaahto","lightslategray":"vaaleanharmaa","gray":"harmaa","mediumorchid":"keskivaalea orkidea","cornsilk":"maissinkeltainen","black":"musta","seagreen":"merenvihreä","darkslateblue":"tumma siniharmaa","khaki":"khaki","lightblue":"vaaleansininen","palegreen":"haalea vihreä","azure":"taivaansininen","peachpuff":"persikka","darkolivegreen":"tummanoliivinvihreä","yellowgreen":"kellanvihreä"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/fi/colors",({aliceblue:"vaaleanharmaansininen",antiquewhite:"antiikinvalkoinen",aqua:"sinivihreä",aquamarine:"vedenvihreä",azure:"taivaansininen",beige:"vaaleanruskea",bisque:"vaaleanruskea",black:"musta",blanchedalmond:"kuorittu manteli",blue:"sininen",blueviolet:"sinivioletti",brown:"ruskea",burlywood:"puunruskea",cadetblue:"meren vihreä",chartreuse:"kellanvihreä",chocolate:"suklaanruskea",coral:"koralli",cornflowerblue:"syvänsininen",cornsilk:"maissinkeltainen",crimson:"karmiininpunainen",cyan:"syaani",darkblue:"tummansininen",darkcyan:"tumma turkoosi",darkgoldenrod:"tumma kultapiisku",darkgray:"tummanharmaa",darkgreen:"tummanvihreä",darkgrey:"tummanharmaa",darkkhaki:"tumma khaki",darkmagenta:"tumma magenta",darkolivegreen:"tummanoliivinvihreä",darkorange:"tummanoranssi",darkorchid:"tumma orkidea",darkred:"tummanpunainen",darksalmon:"tumma lohenpunainen",darkseagreen:"tumma merenvihreä",darkslateblue:"tumma siniharmaa",darkslategray:"tummanharmaa",darkslategrey:"tummanharmaa",darkturquoise:"tumma turkoosi",darkviolet:"tummanvioletti",deeppink:"syvä vaaleanpunainen",deepskyblue:"tumma taivaansininen",dimgray:"himmeänharmaa",dimgrey:"himmeänharmaa",dodgerblue:"Dodger-sininen",firebrick:"poltetun tiilen punainen",floralwhite:"kukanvalkoinen",forestgreen:"metsänvihreä",fuchsia:"purppura",gainsboro:"gainsboro",ghostwhite:"lakananvalkoinen",gold:"kulta",goldenrod:"kullanruskea",gray:"harmaa",green:"vihreä",greenyellow:"vihreänkeltainen",grey:"harmaa",honeydew:"hunajameloninvihreä",hotpink:"pinkki",indianred:"kirkkaanpunainen",indigo:"indigo",ivory:"norsunluu",khaki:"khaki",lavender:"laventeli",lavenderblush:"laventelinpunainen",lawngreen:"ruohonvihreä",lemonchiffon:"sitruunankeltainen",lightblue:"vaaleansininen",lightcoral:"vaalea koralli",lightcyan:"vaalea syaani",lightgoldenrodyellow:"vaalea kultapiiskunkeltainen",lightgray:"vaaleanharmaa",lightgreen:"vaaleanvihreä",lightgrey:"vaaleanharmaa",lightpink:"vaaleanpunainen",lightsalmon:"vaalea lohenpunainen",lightseagreen:"vaalea merenvihreä",lightskyblue:"vaalea taivaansininen",lightslategray:"vaaleanharmaa",lightslategrey:"vaaleanharmaa",lightsteelblue:"vaalea teräksensininen",lightyellow:"vaaleankeltainen",lime:"vaaleanvihreä",limegreen:"limetinvihreä",linen:"pellavanvaalea",magenta:"magenta",maroon:"kastanjanruskea",mediumaquamarine:"keskivaalea vedenvihreä",mediumblue:"keskisininen",mediumorchid:"keskivaalea orkidea",mediumpurple:"keskivaalea violetti",mediumseagreen:"keskivaalea merenvihreä",mediumslateblue:"keskivaalea siniharmaa",mediumspringgreen:"keskivaalea keväänvihreä",mediumturquoise:"keskivaalea turkoosi",mediumvioletred:"keskivaalea lila",midnightblue:"yönsininen",mintcream:"minttukreemi",mistyrose:"utuinen ruusu",moccasin:"nahanruskea",navajowhite:"navajonvalkoinen",navy:"laivastonsininen",oldlace:"vanha pitsi",olive:"oliivinvihreä",olivedrab:"oliivinruskea",orange:"oranssi",orangered:"oranssinpunainen",orchid:"orkidea",palegoldenrod:"haalea kultapiisku",palegreen:"haalea vihreä",paleturquoise:"haalea turkoosi",palevioletred:"haalea lila",papayawhip:"papaijavaahto",peachpuff:"persikka",peru:"peru",pink:"vaaleanpunainen",plum:"luumunpunainen",powderblue:"harmaansininen",purple:"violetti",red:"punainen",rosybrown:"punertavanruskea",royalblue:"syvänsininen",saddlebrown:"satulanruskea",salmon:"lohenpunainen",sandybrown:"hiekanruskea",seagreen:"merenvihreä",seashell:"simpukankuori",sienna:"siena",silver:"hopea",skyblue:"taivaansininen",slateblue:"savensininen",slategray:"savenharmaa",slategrey:"savenharmaa",snow:"lumivalkoinen",springgreen:"keväänvihreä",steelblue:"teräksensininen",tan:"kellanruskea",teal:"sinivihreä",thistle:"ohdake",tomato:"tomaatinpunainen",transparent:"läpinäkyvä",turquoise:"turkoosi",violet:"violetti",wheat:"vehnänkeltainen",white:"valkoinen",whitesmoke:"savunvalkea",yellow:"keltainen",yellowgreen:"kellanvihreä"})); \ No newline at end of file
diff --git a/lib/dojo/nls/fi/colors.js.uncompressed.js b/lib/dojo/nls/fi/colors.js.uncompressed.js
new file mode 100644
index 000000000..935c23b31
--- /dev/null
+++ b/lib/dojo/nls/fi/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/fi/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "vaaleanharmaansininen",
+ antiquewhite: "antiikinvalkoinen",
+ aqua: "sinivihreä",
+ aquamarine: "vedenvihreä",
+ azure: "taivaansininen",
+ beige: "vaaleanruskea",
+ bisque: "vaaleanruskea",
+ black: "musta",
+ blanchedalmond: "kuorittu manteli",
+ blue: "sininen",
+ blueviolet: "sinivioletti",
+ brown: "ruskea",
+ burlywood: "puunruskea",
+ cadetblue: "meren vihreä",
+ chartreuse: "kellanvihreä",
+ chocolate: "suklaanruskea",
+ coral: "koralli",
+ cornflowerblue: "syvänsininen",
+ cornsilk: "maissinkeltainen",
+ crimson: "karmiininpunainen",
+ cyan: "syaani",
+ darkblue: "tummansininen",
+ darkcyan: "tumma turkoosi",
+ darkgoldenrod: "tumma kultapiisku",
+ darkgray: "tummanharmaa",
+ darkgreen: "tummanvihreä",
+ darkgrey: "tummanharmaa", // same as darkgray
+ darkkhaki: "tumma khaki",
+ darkmagenta: "tumma magenta",
+ darkolivegreen: "tummanoliivinvihreä",
+ darkorange: "tummanoranssi",
+ darkorchid: "tumma orkidea",
+ darkred: "tummanpunainen",
+ darksalmon: "tumma lohenpunainen",
+ darkseagreen: "tumma merenvihreä",
+ darkslateblue: "tumma siniharmaa",
+ darkslategray: "tummanharmaa",
+ darkslategrey: "tummanharmaa", // same as darkslategray
+ darkturquoise: "tumma turkoosi",
+ darkviolet: "tummanvioletti",
+ deeppink: "syvä vaaleanpunainen",
+ deepskyblue: "tumma taivaansininen",
+ dimgray: "himmeänharmaa",
+ dimgrey: "himmeänharmaa", // same as dimgray
+ dodgerblue: "Dodger-sininen",
+ firebrick: "poltetun tiilen punainen",
+ floralwhite: "kukanvalkoinen",
+ forestgreen: "metsänvihreä",
+ fuchsia: "purppura",
+ gainsboro: "gainsboro",
+ ghostwhite: "lakananvalkoinen",
+ gold: "kulta",
+ goldenrod: "kullanruskea",
+ gray: "harmaa",
+ green: "vihreä",
+ greenyellow: "vihreänkeltainen",
+ grey: "harmaa", // same as gray
+ honeydew: "hunajameloninvihreä",
+ hotpink: "pinkki",
+ indianred: "kirkkaanpunainen",
+ indigo: "indigo",
+ ivory: "norsunluu",
+ khaki: "khaki",
+ lavender: "laventeli",
+ lavenderblush: "laventelinpunainen",
+ lawngreen: "ruohonvihreä",
+ lemonchiffon: "sitruunankeltainen",
+ lightblue: "vaaleansininen",
+ lightcoral: "vaalea koralli",
+ lightcyan: "vaalea syaani",
+ lightgoldenrodyellow: "vaalea kultapiiskunkeltainen",
+ lightgray: "vaaleanharmaa",
+ lightgreen: "vaaleanvihreä",
+ lightgrey: "vaaleanharmaa", // same as lightgray
+ lightpink: "vaaleanpunainen",
+ lightsalmon: "vaalea lohenpunainen",
+ lightseagreen: "vaalea merenvihreä",
+ lightskyblue: "vaalea taivaansininen",
+ lightslategray: "vaaleanharmaa",
+ lightslategrey: "vaaleanharmaa", // same as lightslategray
+ lightsteelblue: "vaalea teräksensininen",
+ lightyellow: "vaaleankeltainen",
+ lime: "vaaleanvihreä",
+ limegreen: "limetinvihreä",
+ linen: "pellavanvaalea",
+ magenta: "magenta",
+ maroon: "kastanjanruskea",
+ mediumaquamarine: "keskivaalea vedenvihreä",
+ mediumblue: "keskisininen",
+ mediumorchid: "keskivaalea orkidea",
+ mediumpurple: "keskivaalea violetti",
+ mediumseagreen: "keskivaalea merenvihreä",
+ mediumslateblue: "keskivaalea siniharmaa",
+ mediumspringgreen: "keskivaalea keväänvihreä",
+ mediumturquoise: "keskivaalea turkoosi",
+ mediumvioletred: "keskivaalea lila",
+ midnightblue: "yönsininen",
+ mintcream: "minttukreemi",
+ mistyrose: "utuinen ruusu",
+ moccasin: "nahanruskea",
+ navajowhite: "navajonvalkoinen",
+ navy: "laivastonsininen",
+ oldlace: "vanha pitsi",
+ olive: "oliivinvihreä",
+ olivedrab: "oliivinruskea",
+ orange: "oranssi",
+ orangered: "oranssinpunainen",
+ orchid: "orkidea",
+ palegoldenrod: "haalea kultapiisku",
+ palegreen: "haalea vihreä",
+ paleturquoise: "haalea turkoosi",
+ palevioletred: "haalea lila",
+ papayawhip: "papaijavaahto",
+ peachpuff: "persikka",
+ peru: "peru",
+ pink: "vaaleanpunainen",
+ plum: "luumunpunainen",
+ powderblue: "harmaansininen",
+ purple: "violetti",
+ red: "punainen",
+ rosybrown: "punertavanruskea",
+ royalblue: "syvänsininen",
+ saddlebrown: "satulanruskea",
+ salmon: "lohenpunainen",
+ sandybrown: "hiekanruskea",
+ seagreen: "merenvihreä",
+ seashell: "simpukankuori",
+ sienna: "siena",
+ silver: "hopea",
+ skyblue: "taivaansininen",
+ slateblue: "savensininen",
+ slategray: "savenharmaa",
+ slategrey: "savenharmaa", // same as slategray
+ snow: "lumivalkoinen",
+ springgreen: "keväänvihreä",
+ steelblue: "teräksensininen",
+ tan: "kellanruskea",
+ teal: "sinivihreä",
+ thistle: "ohdake",
+ tomato: "tomaatinpunainen",
+ transparent: "läpinäkyvä",
+ turquoise: "turkoosi",
+ violet: "violetti",
+ wheat: "vehnänkeltainen",
+ white: "valkoinen",
+ whitesmoke: "savunvalkea",
+ yellow: "keltainen",
+ yellowgreen: "kellanvihreä"
+})
+);
diff --git a/lib/dojo/nls/fr/colors.js b/lib/dojo/nls/fr/colors.js
index cf1e7e90c..2ff1710e2 100644
--- a/lib/dojo/nls/fr/colors.js
+++ b/lib/dojo/nls/fr/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"bleu acier clair","orangered":"rouge orangé","midnightblue":"bleu nuit","cadetblue":"bleu pétrole","seashell":"coquillage","slategrey":"gris ardoise","coral":"corail","darkturquoise":"turquoise foncé","antiquewhite":"blanc antique","mediumspringgreen":"vert printemps moyen","salmon":"saumon","darkgrey":"gris foncé","ivory":"ivoire","greenyellow":"vert-jaune","mistyrose":"rose pâle","lightsalmon":"saumon clair","silver":"argent","dimgrey":"gris soutenu","orange":"orange","white":"blanc","navajowhite":"chair","royalblue":"bleu roi","deeppink":"rose soutenu","lime":"vert citron","oldlace":"blanc cassé","chartreuse":"vert vif","darkcyan":"cyan foncé","yellow":"jaune","linen":"écru","olive":"olive","gold":"or","lawngreen":"vert prairie","lightyellow":"jaune clair","tan":"grège","darkviolet":"violet foncé","lightslategrey":"gris ardoise clair","grey":"gris","darkkhaki":"kaki foncé","green":"vert","deepskyblue":"bleu ciel soutenu","aqua":"bleu-vert","sienna":"terre de sienne","mintcream":"crème de menthe","rosybrown":"vieux rose","mediumslateblue":"bleu ardoise moyen","magenta":"magenta","lightseagreen":"vert d'eau clair","cyan":"cyan","olivedrab":"brun verdâtre","darkgoldenrod":"jaune paille foncé","slateblue":"bleu ardoise","mediumaquamarine":"aigue-marine moyen","lavender":"lavande","mediumseagreen":"vert d'eau moyen","maroon":"marron","darkslategray":"gris ardoise foncé","mediumturquoise":"turquoise moyen","ghostwhite":"blanc laiteux","darkblue":"bleu foncé","mediumvioletred":"rouge violacé moyen","brown":"brun","lightgray":"gris clair","sandybrown":"sable","pink":"rose","firebrick":"rouge brique","indigo":"indigo","snow":"neige","darkorchid":"lilas foncé","turquoise":"turquoise","chocolate":"chocolat","springgreen":"vert printemps","moccasin":"chamois","navy":"bleu marine","lemonchiffon":"mousse de citron","teal":"sarcelle","floralwhite":"lys","cornflowerblue":"bleuet","paleturquoise":"turquoise pâle","purple":"pourpre","gainsboro":"gris souris","plum":"prune","red":"rouge","blue":"bleu","forestgreen":"vert sapin","darkgreen":"vert foncé","honeydew":"opalin","darkseagreen":"vert d'eau foncé","lightcoral":"corail clair","palevioletred":"rouge violacé pâle","mediumpurple":"pourpre moyen","saddlebrown":"brun cuir","darkmagenta":"magenta foncé","thistle":"chardon","whitesmoke":"blanc cendré","wheat":"blé","violet":"violet","lightskyblue":"bleu ciel clair","goldenrod":"jaune paille","mediumblue":"bleu moyen","skyblue":"bleu ciel","crimson":"cramoisi","darksalmon":"saumon foncé","darkred":"rouge foncé","darkslategrey":"gris ardoise foncé","peru":"caramel","lightgrey":"gris clair","lightgoldenrodyellow":"jaune paille clair","blanchedalmond":"coquille d'oeuf","aliceblue":"bleu gris","bisque":"beige rosé","slategray":"gris ardoise","palegoldenrod":"jaune paille pâle","darkorange":"orange foncé","aquamarine":"aigue-marine","lightgreen":"vert clair","burlywood":"bois précieux","dodgerblue":"bleu France","darkgray":"gris foncé","lightcyan":"cyan clair","powderblue":"bleu de smalt","blueviolet":"bleu-violet","orchid":"lilas","dimgray":"gris soutenu","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavandin","hotpink":"rose intense","steelblue":"bleu acier","tomato":"tomate","lightpink":"rose clair","limegreen":"citron vert","indianred":"rose indien","papayawhip":"crème de papaye","lightslategray":"gris ardoise clair","gray":"gris","mediumorchid":"lilas moyen","cornsilk":"vanille","black":"noir","seagreen":"vert d'eau","darkslateblue":"bleu ardoise foncé","khaki":"kaki","lightblue":"bleu clair","palegreen":"vert pâle","azure":"bleu azur","peachpuff":"pêche","darkolivegreen":"olive foncé","yellowgreen":"vert jaunâtre"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/fr/colors",({aliceblue:"bleu gris",antiquewhite:"blanc antique",aqua:"bleu-vert",aquamarine:"aigue-marine",azure:"bleu azur",beige:"beige",bisque:"beige rosé",black:"noir",blanchedalmond:"coquille d'œuf",blue:"bleu",blueviolet:"bleu-violet",brown:"brun",burlywood:"bois précieux",cadetblue:"bleu pétrole",chartreuse:"vert vif",chocolate:"chocolat",coral:"corail",cornflowerblue:"bleuet",cornsilk:"vanille",crimson:"cramoisi",cyan:"cyan",darkblue:"bleu foncé",darkcyan:"cyan foncé",darkgoldenrod:"jaune paille foncé",darkgray:"gris foncé",darkgreen:"vert foncé",darkgrey:"gris foncé",darkkhaki:"kaki foncé",darkmagenta:"magenta foncé",darkolivegreen:"olive foncé",darkorange:"orange foncé",darkorchid:"lilas foncé",darkred:"rouge foncé",darksalmon:"saumon foncé",darkseagreen:"vert d'eau foncé",darkslateblue:"bleu ardoise foncé",darkslategray:"gris ardoise foncé",darkslategrey:"gris ardoise foncé",darkturquoise:"turquoise foncé",darkviolet:"violet foncé",deeppink:"rose soutenu",deepskyblue:"bleu ciel soutenu",dimgray:"gris soutenu",dimgrey:"gris soutenu",dodgerblue:"bleu France",firebrick:"rouge brique",floralwhite:"lys",forestgreen:"vert sapin",fuchsia:"fuchsia",gainsboro:"gris souris",ghostwhite:"blanc laiteux",gold:"or",goldenrod:"jaune paille",gray:"gris",green:"vert",greenyellow:"vert-jaune",grey:"gris",honeydew:"opalin",hotpink:"rose intense",indianred:"rose indien",indigo:"indigo",ivory:"ivoire",khaki:"kaki",lavender:"lavande",lavenderblush:"lavandin",lawngreen:"vert prairie",lemonchiffon:"mousse de citron",lightblue:"bleu clair",lightcoral:"corail clair",lightcyan:"cyan clair",lightgoldenrodyellow:"jaune paille clair",lightgray:"gris clair",lightgreen:"vert clair",lightgrey:"gris clair",lightpink:"rose clair",lightsalmon:"saumon clair",lightseagreen:"vert d'eau clair",lightskyblue:"bleu ciel clair",lightslategray:"gris ardoise clair",lightslategrey:"gris ardoise clair",lightsteelblue:"bleu acier clair",lightyellow:"jaune clair",lime:"vert citron",limegreen:"citron vert",linen:"écru",magenta:"magenta",maroon:"marron",mediumaquamarine:"aigue-marine moyen",mediumblue:"bleu moyen",mediumorchid:"lilas moyen",mediumpurple:"pourpre moyen",mediumseagreen:"vert d'eau moyen",mediumslateblue:"bleu ardoise moyen",mediumspringgreen:"vert printemps moyen",mediumturquoise:"turquoise moyen",mediumvioletred:"rouge violacé moyen",midnightblue:"bleu nuit",mintcream:"crème de menthe",mistyrose:"rose pâle",moccasin:"chamois",navajowhite:"chair",navy:"bleu marine",oldlace:"blanc cassé",olive:"olive",olivedrab:"brun verdâtre",orange:"orange",orangered:"rouge orangé",orchid:"lilas",palegoldenrod:"jaune paille pâle",palegreen:"vert pâle",paleturquoise:"turquoise pâle",palevioletred:"rouge violacé pâle",papayawhip:"crème de papaye",peachpuff:"pêche",peru:"caramel",pink:"rose",plum:"prune",powderblue:"bleu de smalt",purple:"pourpre",red:"rouge",rosybrown:"vieux rose",royalblue:"bleu roi",saddlebrown:"brun cuir",salmon:"saumon",sandybrown:"sable",seagreen:"vert d'eau",seashell:"coquillage",sienna:"terre de sienne",silver:"argent",skyblue:"bleu ciel",slateblue:"bleu ardoise",slategray:"gris ardoise",slategrey:"gris ardoise",snow:"neige",springgreen:"vert printemps",steelblue:"bleu acier",tan:"grège",teal:"sarcelle",thistle:"chardon",tomato:"tomate",transparent:"transparent",turquoise:"turquoise",violet:"violet",wheat:"blé",white:"blanc",whitesmoke:"blanc cendré",yellow:"jaune",yellowgreen:"vert jaunâtre"})); \ No newline at end of file
diff --git a/lib/dojo/nls/fr/colors.js.uncompressed.js b/lib/dojo/nls/fr/colors.js.uncompressed.js
new file mode 100644
index 000000000..e04b51271
--- /dev/null
+++ b/lib/dojo/nls/fr/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/fr/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "bleu gris",
+ antiquewhite: "blanc antique",
+ aqua: "bleu-vert",
+ aquamarine: "aigue-marine",
+ azure: "bleu azur",
+ beige: "beige",
+ bisque: "beige rosé",
+ black: "noir",
+ blanchedalmond: "coquille d'œuf",
+ blue: "bleu",
+ blueviolet: "bleu-violet",
+ brown: "brun",
+ burlywood: "bois précieux",
+ cadetblue: "bleu pétrole",
+ chartreuse: "vert vif",
+ chocolate: "chocolat",
+ coral: "corail",
+ cornflowerblue: "bleuet",
+ cornsilk: "vanille",
+ crimson: "cramoisi",
+ cyan: "cyan",
+ darkblue: "bleu foncé",
+ darkcyan: "cyan foncé",
+ darkgoldenrod: "jaune paille foncé",
+ darkgray: "gris foncé",
+ darkgreen: "vert foncé",
+ darkgrey: "gris foncé", // same as darkgray
+ darkkhaki: "kaki foncé",
+ darkmagenta: "magenta foncé",
+ darkolivegreen: "olive foncé",
+ darkorange: "orange foncé",
+ darkorchid: "lilas foncé",
+ darkred: "rouge foncé",
+ darksalmon: "saumon foncé",
+ darkseagreen: "vert d'eau foncé",
+ darkslateblue: "bleu ardoise foncé",
+ darkslategray: "gris ardoise foncé",
+ darkslategrey: "gris ardoise foncé", // same as darkslategray
+ darkturquoise: "turquoise foncé",
+ darkviolet: "violet foncé",
+ deeppink: "rose soutenu",
+ deepskyblue: "bleu ciel soutenu",
+ dimgray: "gris soutenu",
+ dimgrey: "gris soutenu", // same as dimgray
+ dodgerblue: "bleu France",
+ firebrick: "rouge brique",
+ floralwhite: "lys",
+ forestgreen: "vert sapin",
+ fuchsia: "fuchsia",
+ gainsboro: "gris souris",
+ ghostwhite: "blanc laiteux",
+ gold: "or",
+ goldenrod: "jaune paille",
+ gray: "gris",
+ green: "vert",
+ greenyellow: "vert-jaune",
+ grey: "gris", // same as gray
+ honeydew: "opalin",
+ hotpink: "rose intense",
+ indianred: "rose indien",
+ indigo: "indigo",
+ ivory: "ivoire",
+ khaki: "kaki",
+ lavender: "lavande",
+ lavenderblush: "lavandin",
+ lawngreen: "vert prairie",
+ lemonchiffon: "mousse de citron",
+ lightblue: "bleu clair",
+ lightcoral: "corail clair",
+ lightcyan: "cyan clair",
+ lightgoldenrodyellow: "jaune paille clair",
+ lightgray: "gris clair",
+ lightgreen: "vert clair",
+ lightgrey: "gris clair", // same as lightgray
+ lightpink: "rose clair",
+ lightsalmon: "saumon clair",
+ lightseagreen: "vert d'eau clair",
+ lightskyblue: "bleu ciel clair",
+ lightslategray: "gris ardoise clair",
+ lightslategrey: "gris ardoise clair", // same as lightslategray
+ lightsteelblue: "bleu acier clair",
+ lightyellow: "jaune clair",
+ lime: "vert citron",
+ limegreen: "citron vert",
+ linen: "écru",
+ magenta: "magenta",
+ maroon: "marron",
+ mediumaquamarine: "aigue-marine moyen",
+ mediumblue: "bleu moyen",
+ mediumorchid: "lilas moyen",
+ mediumpurple: "pourpre moyen",
+ mediumseagreen: "vert d'eau moyen",
+ mediumslateblue: "bleu ardoise moyen",
+ mediumspringgreen: "vert printemps moyen",
+ mediumturquoise: "turquoise moyen",
+ mediumvioletred: "rouge violacé moyen",
+ midnightblue: "bleu nuit",
+ mintcream: "crème de menthe",
+ mistyrose: "rose pâle",
+ moccasin: "chamois",
+ navajowhite: "chair",
+ navy: "bleu marine",
+ oldlace: "blanc cassé",
+ olive: "olive",
+ olivedrab: "brun verdâtre",
+ orange: "orange",
+ orangered: "rouge orangé",
+ orchid: "lilas",
+ palegoldenrod: "jaune paille pâle",
+ palegreen: "vert pâle",
+ paleturquoise: "turquoise pâle",
+ palevioletred: "rouge violacé pâle",
+ papayawhip: "crème de papaye",
+ peachpuff: "pêche",
+ peru: "caramel",
+ pink: "rose",
+ plum: "prune",
+ powderblue: "bleu de smalt",
+ purple: "pourpre",
+ red: "rouge",
+ rosybrown: "vieux rose",
+ royalblue: "bleu roi",
+ saddlebrown: "brun cuir",
+ salmon: "saumon",
+ sandybrown: "sable",
+ seagreen: "vert d'eau",
+ seashell: "coquillage",
+ sienna: "terre de sienne",
+ silver: "argent",
+ skyblue: "bleu ciel",
+ slateblue: "bleu ardoise",
+ slategray: "gris ardoise",
+ slategrey: "gris ardoise", // same as slategray
+ snow: "neige",
+ springgreen: "vert printemps",
+ steelblue: "bleu acier",
+ tan: "grège",
+ teal: "sarcelle",
+ thistle: "chardon",
+ tomato: "tomate",
+ transparent: "transparent",
+ turquoise: "turquoise",
+ violet: "violet",
+ wheat: "blé",
+ white: "blanc",
+ whitesmoke: "blanc cendré",
+ yellow: "jaune",
+ yellowgreen: "vert jaunâtre"
+})
+);
diff --git a/lib/dojo/nls/he/colors.js b/lib/dojo/nls/he/colors.js
index a689ec623..5ec2f42e2 100644
--- a/lib/dojo/nls/he/colors.js
+++ b/lib/dojo/nls/he/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"כחול פלדה בהיר","orangered":"כתום אדום","midnightblue":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב","mistyrose":"ורוד מעורפל","lightsalmon":"סלמון בהיר","silver":"כסף","dimgrey":"אפור עמום","orange":"כתום","white":"לבן","navajowhite":"לבן נוואחו","royalblue":"כחול מלכותי","deeppink":"ורוד עמוק","lime":"לימון","oldlace":"תחרה עתיקה","chartreuse":"ירוק-צהוב","darkcyan":"טורקיז כהה","yellow":"צהוב","linen":"פשתן","olive":"זית","gold":"זהב","lawngreen":"ירוק דשא","lightyellow":"צהוב בהיר","tan":"חום אדמדם","darkviolet":"סגול כהה","lightslategrey":"אפור צפחה בהיר","grey":"אפור","darkkhaki":"חאקי כהה","green":"ירוק","deepskyblue":"כחול שמיים עמוק","aqua":"אקווה","sienna":"סיינה","mintcream":"קרם מנטה","rosybrown":"חום ורדרד","mediumslateblue":"כחול צפחה בינוני","magenta":"בורדו","lightseagreen":"ירוק ים בהיר","cyan":"טורקיז","olivedrab":"זית עמום","darkgoldenrod":"זהוב כהה","slateblue":"כחול צפחה","mediumaquamarine":"כחול בינוני","lavender":"לבנדר","mediumseagreen":"ירוק ים בינוני","maroon":"חום אדמדם","darkslategray":"אפור צפחה כהה","mediumturquoise":"טורקיז בינוני","ghostwhite":"לבן רפאים","darkblue":"כחול כהה","mediumvioletred":"סגול-אדום בינוני","brown":"חום","lightgray":"אפור בהיר","sandybrown":"חום חולי","pink":"ורוד","firebrick":"לבנה שרופה","indigo":"אינדיגו","snow":"שלג","darkorchid":"סחלב כהה","turquoise":"טורקיז","chocolate":"שוקולד","springgreen":"ירוק אביב","moccasin":"מוקסין","navy":"כחול כהה","lemonchiffon":"ירוק לימון","teal":"כחול-ירוק כהה","floralwhite":"לבן פרחוני","cornflowerblue":"כחול דרדר","paleturquoise":"טורקיז בהיר","purple":"סגול","gainsboro":"גיינסבורו","plum":"שזיף","red":"אדום","blue":"כחול","forestgreen":"ירוק יער","darkgreen":"ירוק כהה","honeydew":"ירקרק","darkseagreen":"ירוק ים כהה","lightcoral":"אלמוג בהיר","palevioletred":"סגול-אדום בהיר","mediumpurple":"סגול בינוני","saddlebrown":"חום דהוי","darkmagenta":"בורדו כהה","thistle":"דרדר","whitesmoke":"עשן לבן","wheat":"חיוט","violet":"סגול","lightskyblue":"כחול שמיים בהיר","goldenrod":"זהוב","mediumblue":"תכלת בינוני","skyblue":"כחול שמיים","crimson":"ארגמן","darksalmon":"סלמון כהה","darkred":"אדום כהה","darkslategrey":"אפור צפחה כהה","peru":"פרו","lightgrey":"אפור בהיר","lightgoldenrodyellow":"צהוב בהיר","blanchedalmond":"שקד","aliceblue":"כחול פלדה","bisque":"לבן שקד","slategray":"אפור צפחה","palegoldenrod":"זהוב בהיר","darkorange":"כתום כהה","aquamarine":"אקוומארין","lightgreen":"ירוק בהיר","burlywood":"חום דהוי","dodgerblue":"כחול","darkgray":"אפור כהה","lightcyan":"טורקיז בהיר","powderblue":"כחול חיוור","blueviolet":"כחול-סגול","orchid":"סחלב","dimgray":"אפור עמום","beige":"בז'","fuchsia":"ורוד בהיר","lavenderblush":"סומק לבנדר","hotpink":"ורוד לוהט","steelblue":"כחול פלדה","tomato":"עגבניה","lightpink":"ורוד בהיר","limegreen":"ירוק לימוני","indianred":"אדום דהוי","papayawhip":"פפאיה","lightslategray":"אפור צפחה בהיר","gray":"אפור","mediumorchid":"סחלב בינוני","cornsilk":"צהבהב","black":"שחור","seagreen":"ירוק ים","darkslateblue":"כחול צפחה כהה","khaki":"חאקי","lightblue":"תכלת","palegreen":"ירוק בהיר","azure":"תכלת עז","peachpuff":"קציפת אפרסק","darkolivegreen":"ירוק זית כהה","yellowgreen":"ירוק צהוב"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/he/colors",({aliceblue:"כחול פלדה",antiquewhite:"לבן עתיק",aqua:"אקווה",aquamarine:"אקוומארין",azure:"תכלת עז",beige:"בז'",bisque:"לבן שקד",black:"שחור",blanchedalmond:"שקד",blue:"כחול",blueviolet:"כחול-סגול",brown:"חום",burlywood:"חום דהוי",cadetblue:"כחול ים",chartreuse:"ירוק-צהוב",chocolate:"שוקולד",coral:"אלמוג",cornflowerblue:"כחול דרדר",cornsilk:"צהבהב",crimson:"ארגמן",cyan:"טורקיז",darkblue:"כחול כהה",darkcyan:"טורקיז כהה",darkgoldenrod:"זהוב כהה",darkgray:"אפור כהה",darkgreen:"ירוק כהה",darkgrey:"אפור כהה",darkkhaki:"חאקי כהה",darkmagenta:"בורדו כהה",darkolivegreen:"ירוק זית כהה",darkorange:"כתום כהה",darkorchid:"סחלב כהה",darkred:"אדום כהה",darksalmon:"סלמון כהה",darkseagreen:"ירוק ים כהה",darkslateblue:"כחול צפחה כהה",darkslategray:"אפור צפחה כהה",darkslategrey:"אפור צפחה כהה",darkturquoise:"טורקיז כהה",darkviolet:"סגול כהה",deeppink:"ורוד עמוק",deepskyblue:"כחול שמיים עמוק",dimgray:"אפור עמום",dimgrey:"אפור עמום",dodgerblue:"כחול",firebrick:"לבנה שרופה",floralwhite:"לבן פרחוני",forestgreen:"ירוק יער",fuchsia:"ורוד בהיר",gainsboro:"גיינסבורו",ghostwhite:"לבן רפאים",gold:"זהב",goldenrod:"זהוב",gray:"אפור",green:"ירוק",greenyellow:"ירוק-צהוב",grey:"אפור",honeydew:"ירקרק",hotpink:"ורוד לוהט",indianred:"אדום דהוי",indigo:"אינדיגו",ivory:"שנהב",khaki:"חאקי",lavender:"לבנדר",lavenderblush:"סומק לבנדר",lawngreen:"ירוק דשא",lemonchiffon:"ירוק לימון",lightblue:"תכלת",lightcoral:"אלמוג בהיר",lightcyan:"טורקיז בהיר",lightgoldenrodyellow:"צהוב בהיר",lightgray:"אפור בהיר",lightgreen:"ירוק בהיר",lightgrey:"אפור בהיר",lightpink:"ורוד בהיר",lightsalmon:"סלמון בהיר",lightseagreen:"ירוק ים בהיר",lightskyblue:"כחול שמיים בהיר",lightslategray:"אפור צפחה בהיר",lightslategrey:"אפור צפחה בהיר",lightsteelblue:"כחול פלדה בהיר",lightyellow:"צהוב בהיר",lime:"לימון",limegreen:"ירוק לימוני",linen:"פשתן",magenta:"בורדו",maroon:"חום אדמדם",mediumaquamarine:"כחול בינוני",mediumblue:"תכלת בינוני",mediumorchid:"סחלב בינוני",mediumpurple:"סגול בינוני",mediumseagreen:"ירוק ים בינוני",mediumslateblue:"כחול צפחה בינוני",mediumspringgreen:"ירוק אביב בינוני",mediumturquoise:"טורקיז בינוני",mediumvioletred:"סגול-אדום בינוני",midnightblue:"כחול כהה",mintcream:"קרם מנטה",mistyrose:"ורוד מעורפל",moccasin:"מוקסין",navajowhite:"לבן נוואחו",navy:"כחול כהה",oldlace:"תחרה עתיקה",olive:"זית",olivedrab:"זית עמום",orange:"כתום",orangered:"כתום אדום",orchid:"סחלב",palegoldenrod:"זהוב בהיר",palegreen:"ירוק בהיר",paleturquoise:"טורקיז בהיר",palevioletred:"סגול-אדום בהיר",papayawhip:"פפאיה",peachpuff:"קציפת אפרסק",peru:"פרו",pink:"ורוד",plum:"שזיף",powderblue:"כחול חיוור",purple:"סגול",red:"אדום",rosybrown:"חום ורדרד",royalblue:"כחול מלכותי",saddlebrown:"חום דהוי",salmon:"סלמון",sandybrown:"חום חולי",seagreen:"ירוק ים",seashell:"צדף",sienna:"סיינה",silver:"כסף",skyblue:"כחול שמיים",slateblue:"כחול צפחה",slategray:"אפור צפחה",slategrey:"אפור צפחה",snow:"שלג",springgreen:"ירוק אביב",steelblue:"כחול פלדה",tan:"חום אדמדם",teal:"כחול-ירוק כהה",thistle:"דרדר",tomato:"עגבניה",turquoise:"טורקיז",violet:"סגול",wheat:"חיוט",white:"לבן",whitesmoke:"עשן לבן",yellow:"צהוב",yellowgreen:"ירוק צהוב"})); \ No newline at end of file
diff --git a/lib/dojo/nls/he/colors.js.uncompressed.js b/lib/dojo/nls/he/colors.js.uncompressed.js
new file mode 100644
index 000000000..e986b09c9
--- /dev/null
+++ b/lib/dojo/nls/he/colors.js.uncompressed.js
@@ -0,0 +1,158 @@
+define(
+"dojo/nls/he/colors", //begin v1.x content
+({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+
+//Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color e.g. gray vs. gray.
+//TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+aliceblue: "כחול פלדה",
+antiquewhite: "לבן עתיק",
+aqua: "אקווה",
+aquamarine: "אקוומארין",
+azure: "תכלת עז",
+beige: "בז'",
+bisque: "לבן שקד",
+black: "שחור",
+blanchedalmond: "שקד",
+blue: "כחול",
+blueviolet: "כחול-סגול",
+brown: "חום",
+burlywood: "חום דהוי",
+cadetblue: "כחול ים",
+chartreuse: "ירוק-צהוב",
+chocolate: "שוקולד",
+coral: "אלמוג",
+cornflowerblue: "כחול דרדר",
+cornsilk: "צהבהב",
+crimson: "ארגמן",
+cyan: "טורקיז",
+darkblue: "כחול כהה",
+darkcyan: "טורקיז כהה",
+darkgoldenrod: "זהוב כהה",
+darkgray: "אפור כהה",
+darkgreen: "ירוק כהה",
+darkgrey: "אפור כהה", // same as darkgray
+darkkhaki: "חאקי כהה",
+darkmagenta: "בורדו כהה",
+darkolivegreen: "ירוק זית כהה",
+darkorange: "כתום כהה",
+darkorchid: "סחלב כהה",
+darkred: "אדום כהה",
+darksalmon: "סלמון כהה",
+darkseagreen: "ירוק ים כהה",
+darkslateblue: "כחול צפחה כהה",
+darkslategray: "אפור צפחה כהה",
+darkslategrey: "אפור צפחה כהה", // same as darkslategray
+darkturquoise: "טורקיז כהה",
+darkviolet: "סגול כהה",
+deeppink: "ורוד עמוק",
+deepskyblue: "כחול שמיים עמוק",
+dimgray: "אפור עמום",
+dimgrey: "אפור עמום", // same as dimgray
+dodgerblue: "כחול",
+firebrick: "לבנה שרופה",
+floralwhite: "לבן פרחוני",
+forestgreen: "ירוק יער",
+fuchsia: "ורוד בהיר",
+gainsboro: "גיינסבורו",
+ghostwhite: "לבן רפאים",
+gold: "זהב",
+goldenrod: "זהוב",
+gray: "אפור",
+green: "ירוק",
+greenyellow: "ירוק-צהוב",
+grey: "אפור", // same as gray
+honeydew: "ירקרק",
+hotpink: "ורוד לוהט",
+indianred: "אדום דהוי",
+indigo: "אינדיגו",
+ivory: "שנהב",
+khaki: "חאקי",
+lavender: "לבנדר",
+lavenderblush: "סומק לבנדר",
+lawngreen: "ירוק דשא",
+lemonchiffon: "ירוק לימון",
+lightblue: "תכלת",
+lightcoral: "אלמוג בהיר",
+lightcyan: "טורקיז בהיר",
+lightgoldenrodyellow: "צהוב בהיר",
+lightgray: "אפור בהיר",
+lightgreen: "ירוק בהיר",
+lightgrey: "אפור בהיר", // same as lightgray
+lightpink: "ורוד בהיר",
+lightsalmon: "סלמון בהיר",
+lightseagreen: "ירוק ים בהיר",
+lightskyblue: "כחול שמיים בהיר",
+lightslategray: "אפור צפחה בהיר",
+lightslategrey: "אפור צפחה בהיר", // same as lightslategray
+lightsteelblue: "כחול פלדה בהיר",
+lightyellow: "צהוב בהיר",
+lime: "לימון",
+limegreen: "ירוק לימוני",
+linen: "פשתן",
+magenta: "בורדו",
+maroon: "חום אדמדם",
+mediumaquamarine: "כחול בינוני",
+mediumblue: "תכלת בינוני",
+mediumorchid: "סחלב בינוני",
+mediumpurple: "סגול בינוני",
+mediumseagreen: "ירוק ים בינוני",
+mediumslateblue: "כחול צפחה בינוני",
+mediumspringgreen: "ירוק אביב בינוני",
+mediumturquoise: "טורקיז בינוני",
+mediumvioletred: "סגול-אדום בינוני",
+midnightblue: "כחול כהה",
+mintcream: "קרם מנטה",
+mistyrose: "ורוד מעורפל",
+moccasin: "מוקסין",
+navajowhite: "לבן נוואחו",
+navy: "כחול כהה",
+oldlace: "תחרה עתיקה",
+olive: "זית",
+olivedrab: "זית עמום",
+orange: "כתום",
+orangered: "כתום אדום",
+orchid: "סחלב",
+palegoldenrod: "זהוב בהיר",
+palegreen: "ירוק בהיר",
+paleturquoise: "טורקיז בהיר",
+palevioletred: "סגול-אדום בהיר",
+papayawhip: "פפאיה",
+peachpuff: "קציפת אפרסק",
+peru: "פרו",
+pink: "ורוד",
+plum: "שזיף",
+powderblue: "כחול חיוור",
+purple: "סגול",
+red: "אדום",
+rosybrown: "חום ורדרד",
+royalblue: "כחול מלכותי",
+saddlebrown: "חום דהוי",
+salmon: "סלמון",
+sandybrown: "חום חולי",
+seagreen: "ירוק ים",
+seashell: "צדף",
+sienna: "סיינה",
+silver: "כסף",
+skyblue: "כחול שמיים",
+slateblue: "כחול צפחה",
+slategray: "אפור צפחה",
+slategrey: "אפור צפחה", // same as slategray
+snow: "שלג",
+springgreen: "ירוק אביב",
+steelblue: "כחול פלדה",
+tan: "חום אדמדם",
+teal: "כחול-ירוק כהה",
+thistle: "דרדר",
+tomato: "עגבניה",
+turquoise: "טורקיז",
+violet: "סגול",
+wheat: "חיוט",
+white: "לבן",
+whitesmoke: "עשן לבן",
+yellow: "צהוב",
+yellowgreen: "ירוק צהוב"
+})
+//end v1.x content
+);
diff --git a/lib/dojo/nls/hr/colors.js b/lib/dojo/nls/hr/colors.js
new file mode 100644
index 000000000..91b9c6ce4
--- /dev/null
+++ b/lib/dojo/nls/hr/colors.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/hr/colors",({aliceblue:"alice plava",antiquewhite:"antique bijela",aqua:"aqua",aquamarine:"akvamarin",azure:"azurna",beige:"bež",bisque:"svjetlo smeđe ružičasta",black:"crna",blanchedalmond:"slonovača",blue:"plava",blueviolet:"plavo ljubičasta",brown:"smeđa",burlywood:"pješčano smeđa",cadetblue:"plavo siva",chartreuse:"chartreuse",chocolate:"čokoladna",coral:"koraljna",cornflowerblue:"različak plava",cornsilk:"cornsilk",crimson:"rumena",cyan:"cijan",darkblue:"tamno plava",darkcyan:"tamno cijan",darkgoldenrod:"tamno zlatno žuta",darkgray:"tamno siva",darkgreen:"tamno zelena",darkgrey:"tamno siva",darkkhaki:"tamno sivo smeđa",darkmagenta:"tamno grimizna",darkolivegreen:"tamno maslinasto zelena",darkorange:"tamno narančasta",darkorchid:"tamno ružičasta",darkred:"tamno crvena",darksalmon:"tamno žuto ružičasta",darkseagreen:"tamno plavo zelena",darkslateblue:"tamno sivo plava",darkslategray:"tamno plavo siva",darkslategrey:"tamno plavo siva",darkturquoise:"tamno tirkizna",darkviolet:"tamno ljubičasta",deeppink:"intenzivno ružičasta",deepskyblue:"intenzivno nebesko plava",dimgray:"mutno siva",dimgrey:"mutno siva",dodgerblue:"dodger plava",firebrick:"žarko crvena",floralwhite:"cvjetno bijela",forestgreen:"tamno zelena",fuchsia:"fuksija",gainsboro:"gainsboro",ghostwhite:"sivo bijela",gold:"zlatna",goldenrod:"zlatno žuta",gray:"siva",green:"zelena",greenyellow:"zeleno-žuta",grey:"siva",honeydew:"honeydew",hotpink:"žarko ružičasta",indianred:"indijski crveno",indigo:"indigo",ivory:"slonovača",khaki:"sivo smeđa",lavender:"lavanda",lavenderblush:"lavanda",lawngreen:"livadno zelena",lemonchiffon:"nježno žuta",lightblue:"svjetlo plava",lightcoral:"svjetlo koraljna",lightcyan:"svjetlo cijan",lightgoldenrodyellow:"svjetlo zlatno žuta",lightgray:"svjetlo siva",lightgreen:"svjetlo zelena",lightgrey:"svjetlo siva",lightpink:"svjetlo ružičasta",lightsalmon:"svjetlo žuto ružičasta",lightseagreen:"svjetlo plavo zelena",lightskyblue:"svjetlo nebesko plava",lightslategray:"svjetlo plavo siva",lightslategrey:"svjetlo plavo siva",lightsteelblue:"svjetlo čelično plava",lightyellow:"svjetlo žuta",lime:"limeta",limegreen:"limeta zelena",linen:"platno",magenta:"grimizna",maroon:"kestenjasta",mediumaquamarine:"srednje akvamarin",mediumblue:"srednje plava",mediumorchid:"srednje ružičasta",mediumpurple:"srednje purpurna",mediumseagreen:"srednje plavo zelena",mediumslateblue:"srednje sivo plava",mediumspringgreen:"srednje proljetno zelena",mediumturquoise:"srednje tirkizna",mediumvioletred:"srednje ljubičasto-crvena",midnightblue:"ponoćno plava",mintcream:"blijedo zelena",mistyrose:"mutno ružičasta",moccasin:"moccasin",navajowhite:"krem bijela",navy:"mornarsko plava",oldlace:"old lace",olive:"maslinasta",olivedrab:"maslinasta",orange:"narančasta",orangered:"narančasto crvena",orchid:"ružičasta",palegoldenrod:"blijedo zlatno žuta",palegreen:"svjetlo zelena",paleturquoise:"blijedo tirkizna",palevioletred:"blijedo ljubičasto crvena",papayawhip:"blijedo narančasta",peachpuff:"breskva",peru:"peru",pink:"ružičasta",plum:"šljiva",powderblue:"blijedo plava",purple:"purpurna",red:"crvena",rosybrown:"ružičasto smeđa",royalblue:"kraljevski plava",saddlebrown:"srednje smeđa",salmon:"ružičasta",sandybrown:"pješčano smeđa",seagreen:"plavo zelena",seashell:"nježno ružičasta",sienna:"sjena",silver:"srebrna",skyblue:"nebesko plava",slateblue:"sivo plava",slategray:"plavo siva",slategrey:"plavo siva",snow:"snijeg",springgreen:"proljetno zeleno",steelblue:"čelično plava",tan:"ten",teal:"teal",thistle:"čičak",tomato:"rajčica",transparent:"prozirno",turquoise:"tirkizna",violet:"ljubičasta",wheat:"pšenica",white:"bijela",whitesmoke:"bijeli dim",yellow:"žuta",yellowgreen:"žuto zelena"})); \ No newline at end of file
diff --git a/lib/dojo/nls/hr/colors.js.uncompressed.js b/lib/dojo/nls/hr/colors.js.uncompressed.js
new file mode 100644
index 000000000..2928d26ed
--- /dev/null
+++ b/lib/dojo/nls/hr/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/hr/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+//Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color e.g. gray vs. gray.
+//TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+aliceblue: "alice plava",
+antiquewhite: "antique bijela",
+aqua: "aqua",
+aquamarine: "akvamarin",
+azure: "azurna",
+beige: "bež",
+bisque: "svjetlo smeđe ružičasta",
+black: "crna",
+blanchedalmond: "slonovača",
+blue: "plava",
+blueviolet: "plavo ljubičasta",
+brown: "smeđa",
+burlywood: "pješčano smeđa",
+cadetblue: "plavo siva",
+chartreuse: "chartreuse",
+chocolate: "čokoladna",
+coral: "koraljna",
+cornflowerblue: "različak plava",
+cornsilk: "cornsilk",
+crimson: "rumena",
+cyan: "cijan",
+darkblue: "tamno plava",
+darkcyan: "tamno cijan",
+darkgoldenrod: "tamno zlatno žuta",
+darkgray: "tamno siva",
+darkgreen: "tamno zelena",
+darkgrey: "tamno siva", // same as darkgray
+darkkhaki: "tamno sivo smeđa",
+darkmagenta: "tamno grimizna",
+darkolivegreen: "tamno maslinasto zelena",
+darkorange: "tamno narančasta",
+darkorchid: "tamno ružičasta",
+darkred: "tamno crvena",
+darksalmon: "tamno žuto ružičasta",
+darkseagreen: "tamno plavo zelena",
+darkslateblue: "tamno sivo plava",
+darkslategray: "tamno plavo siva",
+darkslategrey: "tamno plavo siva", // same as darkslategray
+darkturquoise: "tamno tirkizna",
+darkviolet: "tamno ljubičasta",
+deeppink: "intenzivno ružičasta",
+deepskyblue: "intenzivno nebesko plava",
+dimgray: "mutno siva",
+dimgrey: "mutno siva", // same as dimgray
+dodgerblue: "dodger plava",
+firebrick: "žarko crvena",
+floralwhite: "cvjetno bijela",
+forestgreen: "tamno zelena",
+fuchsia: "fuksija",
+gainsboro: "gainsboro",
+ghostwhite: "sivo bijela",
+gold: "zlatna",
+goldenrod: "zlatno žuta",
+gray: "siva",
+green: "zelena",
+greenyellow: "zeleno-žuta",
+grey: "siva", // same as gray
+honeydew: "honeydew",
+hotpink: "žarko ružičasta",
+indianred: "indijski crveno",
+indigo: "indigo",
+ivory: "slonovača",
+khaki: "sivo smeđa",
+lavender: "lavanda",
+lavenderblush: "lavanda",
+lawngreen: "livadno zelena",
+lemonchiffon: "nježno žuta",
+lightblue: "svjetlo plava",
+lightcoral: "svjetlo koraljna",
+lightcyan: "svjetlo cijan",
+lightgoldenrodyellow: "svjetlo zlatno žuta",
+lightgray: "svjetlo siva",
+lightgreen: "svjetlo zelena",
+lightgrey: "svjetlo siva", // same as lightgray
+lightpink: "svjetlo ružičasta",
+lightsalmon: "svjetlo žuto ružičasta",
+lightseagreen: "svjetlo plavo zelena",
+lightskyblue: "svjetlo nebesko plava",
+lightslategray: "svjetlo plavo siva",
+lightslategrey: "svjetlo plavo siva", // same as lightslategray
+lightsteelblue: "svjetlo čelično plava",
+lightyellow: "svjetlo žuta",
+lime: "limeta",
+limegreen: "limeta zelena",
+linen: "platno",
+magenta: "grimizna",
+maroon: "kestenjasta",
+mediumaquamarine: "srednje akvamarin",
+mediumblue: "srednje plava",
+mediumorchid: "srednje ružičasta",
+mediumpurple: "srednje purpurna",
+mediumseagreen: "srednje plavo zelena",
+mediumslateblue: "srednje sivo plava",
+mediumspringgreen: "srednje proljetno zelena",
+mediumturquoise: "srednje tirkizna",
+mediumvioletred: "srednje ljubičasto-crvena",
+midnightblue: "ponoćno plava",
+mintcream: "blijedo zelena",
+mistyrose: "mutno ružičasta",
+moccasin: "moccasin",
+navajowhite: "krem bijela",
+navy: "mornarsko plava",
+oldlace: "old lace",
+olive: "maslinasta",
+olivedrab: "maslinasta",
+orange: "narančasta",
+orangered: "narančasto crvena",
+orchid: "ružičasta",
+palegoldenrod: "blijedo zlatno žuta",
+palegreen: "svjetlo zelena",
+paleturquoise: "blijedo tirkizna",
+palevioletred: "blijedo ljubičasto crvena",
+papayawhip: "blijedo narančasta",
+peachpuff: "breskva",
+peru: "peru",
+pink: "ružičasta",
+plum: "šljiva",
+powderblue: "blijedo plava",
+purple: "purpurna",
+red: "crvena",
+rosybrown: "ružičasto smeđa",
+royalblue: "kraljevski plava",
+saddlebrown: "srednje smeđa",
+salmon: "ružičasta",
+sandybrown: "pješčano smeđa",
+seagreen: "plavo zelena",
+seashell: "nježno ružičasta",
+sienna: "sjena",
+silver: "srebrna",
+skyblue: "nebesko plava",
+slateblue: "sivo plava",
+slategray: "plavo siva",
+slategrey: "plavo siva", // same as slategray
+snow: "snijeg",
+springgreen: "proljetno zeleno",
+steelblue: "čelično plava",
+tan: "ten",
+teal: "teal",
+thistle: "čičak",
+tomato: "rajčica",
+transparent: "prozirno",
+turquoise: "tirkizna",
+violet: "ljubičasta",
+wheat: "pšenica",
+white: "bijela",
+whitesmoke: "bijeli dim",
+yellow: "žuta",
+yellowgreen: "žuto zelena"
+})
+);
diff --git a/lib/dojo/nls/hu/colors.js b/lib/dojo/nls/hu/colors.js
index c0bce74c7..6c4fd09a2 100644
--- a/lib/dojo/nls/hu/colors.js
+++ b/lib/dojo/nls/hu/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"világos acélkék","orangered":"narancsvörös","midnightblue":"éjkék","cadetblue":"kadétkék","seashell":"kagyló","slategrey":"palaszürke","coral":"korall","darkturquoise":"sötét türkizkék","antiquewhite":"antik fehér","mediumspringgreen":"közepes tavaszzöld","salmon":"lazacszín","darkgrey":"sötétszürke","ivory":"elefántcsont","greenyellow":"zöldessárga","mistyrose":"halvány rózsaszín","lightsalmon":"világos lazacszín","silver":"ezüst","dimgrey":"halványszürke","orange":"narancssárga","white":"fehér","navajowhite":"navajo fehér","royalblue":"királykék","deeppink":"sötétrózsaszín","lime":"lime","oldlace":"régi csipke","chartreuse":"chartreuse","darkcyan":"sötét ciánkék","yellow":"sárga","linen":"vászonfehér","olive":"olajzöld","gold":"arany","lawngreen":"fűzöld","lightyellow":"világossárga","tan":"rozsdabarna","darkviolet":"sötét ibolyaszín","lightslategrey":"világos palaszürke","grey":"szürke","darkkhaki":"sötét khakiszín","green":"zöld","deepskyblue":"sötét égszínkék","aqua":"vízszín","sienna":"vörösesbarna","mintcream":"mentaszósz","rosybrown":"barnásrózsaszín","mediumslateblue":"közepes palakék","magenta":"bíbor","lightseagreen":"világos tengerzöld","cyan":"ciánkék","olivedrab":"olajzöld drapp","darkgoldenrod":"sötét aranyvessző","slateblue":"palakék","mediumaquamarine":"közepes akvamarin","lavender":"levendula","mediumseagreen":"közepes tengerzöld","maroon":"gesztenyebarna","darkslategray":"sötét palaszürke","mediumturquoise":"közepes türkizkék","ghostwhite":"szellemfehér","darkblue":"sötétkék","mediumvioletred":"közepes ibolyavörös","brown":"barna","lightgray":"világosszürke","sandybrown":"homokbarna","pink":"rózsaszín","firebrick":"téglavörös","indigo":"indigó","snow":"hó","darkorchid":"sötét orchidea","turquoise":"türkizkék","chocolate":"csokoládé","springgreen":"tavaszzöld","moccasin":"mokkaszín","navy":"tengerészkék","lemonchiffon":"sárga műselyem","teal":"pávakék","floralwhite":"virágfehér","cornflowerblue":"búzavirágkék","paleturquoise":"halvány türkizkék","purple":"lila","gainsboro":"gainsboro","plum":"szilvakék","red":"vörös","blue":"kék","forestgreen":"erdőzöld","darkgreen":"sötétzöld","honeydew":"mézharmat","darkseagreen":"sötét tengerzöld","lightcoral":"világos korall","palevioletred":"halvány ibolyavörös","mediumpurple":"közepes lila","saddlebrown":"nyeregbarna","darkmagenta":"sötétbíbor","thistle":"bogáncs","whitesmoke":"fehér füst","wheat":"búza","violet":"ibolyaszín","lightskyblue":"világos égszínkék","goldenrod":"aranyvessző","mediumblue":"közepes kék","skyblue":"égszínkék","crimson":"karmazsinvörös","darksalmon":"sötét lazacszín","darkred":"sötétvörös","darkslategrey":"sötét palaszürke","peru":"peru","lightgrey":"világosszürke","lightgoldenrodyellow":"világos aranyvessző sárga","blanchedalmond":"hámozott mandula","aliceblue":"Alice kék","bisque":"porcelán","slategray":"palaszürke","palegoldenrod":"halvány aranyvessző","darkorange":"sötét narancssárga","aquamarine":"akvamarin","lightgreen":"világoszöld","burlywood":"nyersfa","dodgerblue":"dodger kék","darkgray":"sötétszürke","lightcyan":"világos ciánkék","powderblue":"púderkék","blueviolet":"ibolyakék","orchid":"orchidea","dimgray":"halványszürke","beige":"bézs","fuchsia":"fukszia","lavenderblush":"pirosas levendula","hotpink":"meleg rózsaszín","steelblue":"acélkék","tomato":"paradicsom","lightpink":"világos rózsaszín","limegreen":"limezöld","indianred":"indiánvörös","papayawhip":"papayahab","lightslategray":"világos palaszürke","gray":"szürke","mediumorchid":"közepes orchidea","cornsilk":"kukoricahaj","black":"fekete","seagreen":"tengerzöld","darkslateblue":"sötét palakék","khaki":"khakiszín","lightblue":"világoskék","palegreen":"halványzöld","azure":"azúrkék","peachpuff":"barackszín","darkolivegreen":"sötét olajzöld","yellowgreen":"sárgászöld"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/hu/colors",({aliceblue:"Alice kék",antiquewhite:"antik fehér",aqua:"vízszín",aquamarine:"akvamarin",azure:"azúrkék",beige:"bézs",bisque:"porcelán",black:"fekete",blanchedalmond:"hámozott mandula",blue:"kék",blueviolet:"ibolyakék",brown:"barna",burlywood:"nyersfa",cadetblue:"kadétkék",chartreuse:"chartreuse",chocolate:"csokoládé",coral:"korall",cornflowerblue:"búzavirágkék",cornsilk:"kukoricahaj",crimson:"karmazsinvörös",cyan:"ciánkék",darkblue:"sötétkék",darkcyan:"sötét ciánkék",darkgoldenrod:"sötét aranyvessző",darkgray:"sötétszürke",darkgreen:"sötétzöld",darkgrey:"sötétszürke",darkkhaki:"sötét khakiszín",darkmagenta:"sötétbíbor",darkolivegreen:"sötét olajzöld",darkorange:"sötét narancssárga",darkorchid:"sötét orchidea",darkred:"sötétvörös",darksalmon:"sötét lazacszín",darkseagreen:"sötét tengerzöld",darkslateblue:"sötét palakék",darkslategray:"sötét palaszürke",darkslategrey:"sötét palaszürke",darkturquoise:"sötét türkizkék",darkviolet:"sötét ibolyaszín",deeppink:"sötétrózsaszín",deepskyblue:"sötét égszínkék",dimgray:"halványszürke",dimgrey:"halványszürke",dodgerblue:"dodger kék",firebrick:"téglavörös",floralwhite:"virágfehér",forestgreen:"erdőzöld",fuchsia:"fukszia",gainsboro:"gainsboro",ghostwhite:"szellemfehér",gold:"arany",goldenrod:"aranyvessző",gray:"szürke",green:"zöld",greenyellow:"zöldessárga",grey:"szürke",honeydew:"mézharmat",hotpink:"meleg rózsaszín",indianred:"indiánvörös",indigo:"indigó",ivory:"elefántcsont",khaki:"khakiszín",lavender:"levendula",lavenderblush:"pirosas levendula",lawngreen:"fűzöld",lemonchiffon:"sárga műselyem",lightblue:"világoskék",lightcoral:"világos korall",lightcyan:"világos ciánkék",lightgoldenrodyellow:"világos aranyvessző sárga",lightgray:"világosszürke",lightgreen:"világoszöld",lightgrey:"világosszürke",lightpink:"világos rózsaszín",lightsalmon:"világos lazacszín",lightseagreen:"világos tengerzöld",lightskyblue:"világos égszínkék",lightslategray:"világos palaszürke",lightslategrey:"világos palaszürke",lightsteelblue:"világos acélkék",lightyellow:"világossárga",lime:"lime",limegreen:"limezöld",linen:"vászonfehér",magenta:"bíbor",maroon:"gesztenyebarna",mediumaquamarine:"közepes akvamarin",mediumblue:"közepes kék",mediumorchid:"közepes orchidea",mediumpurple:"közepes lila",mediumseagreen:"közepes tengerzöld",mediumslateblue:"közepes palakék",mediumspringgreen:"közepes tavaszzöld",mediumturquoise:"közepes türkizkék",mediumvioletred:"közepes ibolyavörös",midnightblue:"éjkék",mintcream:"mentaszósz",mistyrose:"halvány rózsaszín",moccasin:"mokkaszín",navajowhite:"navajo fehér",navy:"tengerészkék",oldlace:"régi csipke",olive:"olajzöld",olivedrab:"olajzöld drapp",orange:"narancssárga",orangered:"narancsvörös",orchid:"orchidea",palegoldenrod:"halvány aranyvessző",palegreen:"halványzöld",paleturquoise:"halvány türkizkék",palevioletred:"halvány ibolyavörös",papayawhip:"papayahab",peachpuff:"barackszín",peru:"peru",pink:"rózsaszín",plum:"szilvakék",powderblue:"púderkék",purple:"lila",red:"vörös",rosybrown:"barnásrózsaszín",royalblue:"királykék",saddlebrown:"nyeregbarna",salmon:"lazacszín",sandybrown:"homokbarna",seagreen:"tengerzöld",seashell:"kagyló",sienna:"vörösesbarna",silver:"ezüst",skyblue:"égszínkék",slateblue:"palakék",slategray:"palaszürke",slategrey:"palaszürke",snow:"hó",springgreen:"tavaszzöld",steelblue:"acélkék",tan:"rozsdabarna",teal:"pávakék",thistle:"bogáncs",tomato:"paradicsom",transparent:"átlátszó",turquoise:"türkizkék",violet:"ibolyaszín",wheat:"búza",white:"fehér",whitesmoke:"fehér füst",yellow:"sárga",yellowgreen:"sárgászöld"})); \ No newline at end of file
diff --git a/lib/dojo/nls/hu/colors.js.uncompressed.js b/lib/dojo/nls/hu/colors.js.uncompressed.js
new file mode 100644
index 000000000..92773aeab
--- /dev/null
+++ b/lib/dojo/nls/hu/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/hu/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "Alice kék",
+ antiquewhite: "antik fehér",
+ aqua: "vízszín",
+ aquamarine: "akvamarin",
+ azure: "azúrkék",
+ beige: "bézs",
+ bisque: "porcelán",
+ black: "fekete",
+ blanchedalmond: "hámozott mandula",
+ blue: "kék",
+ blueviolet: "ibolyakék",
+ brown: "barna",
+ burlywood: "nyersfa",
+ cadetblue: "kadétkék",
+ chartreuse: "chartreuse",
+ chocolate: "csokoládé",
+ coral: "korall",
+ cornflowerblue: "búzavirágkék",
+ cornsilk: "kukoricahaj",
+ crimson: "karmazsinvörös",
+ cyan: "ciánkék",
+ darkblue: "sötétkék",
+ darkcyan: "sötét ciánkék",
+ darkgoldenrod: "sötét aranyvessző",
+ darkgray: "sötétszürke",
+ darkgreen: "sötétzöld",
+ darkgrey: "sötétszürke", // same as darkgray
+ darkkhaki: "sötét khakiszín",
+ darkmagenta: "sötétbíbor",
+ darkolivegreen: "sötét olajzöld",
+ darkorange: "sötét narancssárga",
+ darkorchid: "sötét orchidea",
+ darkred: "sötétvörös",
+ darksalmon: "sötét lazacszín",
+ darkseagreen: "sötét tengerzöld",
+ darkslateblue: "sötét palakék",
+ darkslategray: "sötét palaszürke",
+ darkslategrey: "sötét palaszürke", // same as darkslategray
+ darkturquoise: "sötét türkizkék",
+ darkviolet: "sötét ibolyaszín",
+ deeppink: "sötétrózsaszín",
+ deepskyblue: "sötét égszínkék",
+ dimgray: "halványszürke",
+ dimgrey: "halványszürke", // same as dimgray
+ dodgerblue: "dodger kék",
+ firebrick: "téglavörös",
+ floralwhite: "virágfehér",
+ forestgreen: "erdőzöld",
+ fuchsia: "fukszia",
+ gainsboro: "gainsboro",
+ ghostwhite: "szellemfehér",
+ gold: "arany",
+ goldenrod: "aranyvessző",
+ gray: "szürke",
+ green: "zöld",
+ greenyellow: "zöldessárga",
+ grey: "szürke", // same as gray
+ honeydew: "mézharmat",
+ hotpink: "meleg rózsaszín",
+ indianred: "indiánvörös",
+ indigo: "indigó",
+ ivory: "elefántcsont",
+ khaki: "khakiszín",
+ lavender: "levendula",
+ lavenderblush: "pirosas levendula",
+ lawngreen: "fűzöld",
+ lemonchiffon: "sárga műselyem",
+ lightblue: "világoskék",
+ lightcoral: "világos korall",
+ lightcyan: "világos ciánkék",
+ lightgoldenrodyellow: "világos aranyvessző sárga",
+ lightgray: "világosszürke",
+ lightgreen: "világoszöld",
+ lightgrey: "világosszürke", // same as lightgray
+ lightpink: "világos rózsaszín",
+ lightsalmon: "világos lazacszín",
+ lightseagreen: "világos tengerzöld",
+ lightskyblue: "világos égszínkék",
+ lightslategray: "világos palaszürke",
+ lightslategrey: "világos palaszürke", // same as lightslategray
+ lightsteelblue: "világos acélkék",
+ lightyellow: "világossárga",
+ lime: "lime",
+ limegreen: "limezöld",
+ linen: "vászonfehér",
+ magenta: "bíbor",
+ maroon: "gesztenyebarna",
+ mediumaquamarine: "közepes akvamarin",
+ mediumblue: "közepes kék",
+ mediumorchid: "közepes orchidea",
+ mediumpurple: "közepes lila",
+ mediumseagreen: "közepes tengerzöld",
+ mediumslateblue: "közepes palakék",
+ mediumspringgreen: "közepes tavaszzöld",
+ mediumturquoise: "közepes türkizkék",
+ mediumvioletred: "közepes ibolyavörös",
+ midnightblue: "éjkék",
+ mintcream: "mentaszósz",
+ mistyrose: "halvány rózsaszín",
+ moccasin: "mokkaszín",
+ navajowhite: "navajo fehér",
+ navy: "tengerészkék",
+ oldlace: "régi csipke",
+ olive: "olajzöld",
+ olivedrab: "olajzöld drapp",
+ orange: "narancssárga",
+ orangered: "narancsvörös",
+ orchid: "orchidea",
+ palegoldenrod: "halvány aranyvessző",
+ palegreen: "halványzöld",
+ paleturquoise: "halvány türkizkék",
+ palevioletred: "halvány ibolyavörös",
+ papayawhip: "papayahab",
+ peachpuff: "barackszín",
+ peru: "peru",
+ pink: "rózsaszín",
+ plum: "szilvakék",
+ powderblue: "púderkék",
+ purple: "lila",
+ red: "vörös",
+ rosybrown: "barnásrózsaszín",
+ royalblue: "királykék",
+ saddlebrown: "nyeregbarna",
+ salmon: "lazacszín",
+ sandybrown: "homokbarna",
+ seagreen: "tengerzöld",
+ seashell: "kagyló",
+ sienna: "vörösesbarna",
+ silver: "ezüst",
+ skyblue: "égszínkék",
+ slateblue: "palakék",
+ slategray: "palaszürke",
+ slategrey: "palaszürke", // same as slategray
+ snow: "hó",
+ springgreen: "tavaszzöld",
+ steelblue: "acélkék",
+ tan: "rozsdabarna",
+ teal: "pávakék",
+ thistle: "bogáncs",
+ tomato: "paradicsom",
+ transparent: "átlátszó",
+ turquoise: "türkizkék",
+ violet: "ibolyaszín",
+ wheat: "búza",
+ white: "fehér",
+ whitesmoke: "fehér füst",
+ yellow: "sárga",
+ yellowgreen: "sárgászöld"
+})
+);
diff --git a/lib/dojo/nls/it/colors.js b/lib/dojo/nls/it/colors.js
index 8a5300702..e941c63d5 100644
--- a/lib/dojo/nls/it/colors.js
+++ b/lib/dojo/nls/it/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"blu acciao chiaro","orangered":"vermiglio","midnightblue":"blu melanzana scuro","cadetblue":"verde acqua","seashell":"sabbia rosa","slategrey":"grigio ardesia","coral":"corallo","darkturquoise":"turchese scuro","antiquewhite":"bianco antico","mediumspringgreen":"verde primavera medio","salmon":"salmone","darkgrey":"grigio scuro","ivory":"avorio","greenyellow":"giallo verde","mistyrose":"rosa pallido","lightsalmon":"salmone chiaro","silver":"grigio 25%","dimgrey":"grigio 80%","orange":"arancione","white":"bianco","navajowhite":"pesca chiaro","royalblue":"blu reale","deeppink":"ciclamino","lime":"verde fluorescente","oldlace":"mandorla","chartreuse":"verde brillante","darkcyan":"ciano scuro","yellow":"giallo","linen":"lino","olive":"verde oliva","gold":"oro","lawngreen":"verde prato","lightyellow":"giallo chiaro","tan":"grigio bruno","darkviolet":"viola scuro","lightslategrey":"grigio ardesia chiaro","grey":"grigio","darkkhaki":"kaki scuro","green":"verde","deepskyblue":"azzurro cielo scuro","aqua":"acqua","sienna":"cuoio","mintcream":"bianco nuvola","rosybrown":"marrone rosato","mediumslateblue":"blu ardesia medio","magenta":"magenta","lightseagreen":"verde mare chiaro","cyan":"ciano","olivedrab":"marrone oliva","darkgoldenrod":"ocra scuro","slateblue":"blu ardesia","mediumaquamarine":"acquamarina medio","lavender":"lavanda","mediumseagreen":"verde mare medio","maroon":"scarlatto","darkslategray":"grigio ardesia scuro","mediumturquoise":"turchese medio","ghostwhite":"bianco gesso","darkblue":"blu scuro","mediumvioletred":"vinaccia","brown":"marrone","lightgray":"grigio chiaro","sandybrown":"marrone sabbia","pink":"rosa","firebrick":"rosso mattone","indigo":"indaco","snow":"neve","darkorchid":"orchidea scuro","turquoise":"turchese","chocolate":"cioccolato","springgreen":"verde primavera","moccasin":"mocassino","navy":"blu notte","lemonchiffon":"caffelatte chiaro","teal":"verde turchese","floralwhite":"bianco giglio","cornflowerblue":"blu fiordaliso","paleturquoise":"turchese pallido","purple":"porpora","gainsboro":"grigio 10%","plum":"prugna","red":"rosso","blue":"blu","forestgreen":"verde foresta","darkgreen":"verde scuro","honeydew":"bianco germoglio","darkseagreen":"verde mare scuro","lightcoral":"rosa corallo","palevioletred":"vinaccia chiaro","mediumpurple":"porpora medio","saddlebrown":"cacao","darkmagenta":"magenta scuro","thistle":"rosa cenere","whitesmoke":"bianco fumo","wheat":"sabbia","violet":"viola","lightskyblue":"azzurro cielo chiaro","goldenrod":"ocra gialla","mediumblue":"blu medio","skyblue":"azzurro cielo","crimson":"cremisi","darksalmon":"salmone scuro","darkred":"rosso scuro","darkslategrey":"grigio ardesia scuro","peru":"marrone terra bruciata","lightgrey":"grigio chiaro","lightgoldenrodyellow":"giallo tenue","blanchedalmond":"mandorla chiaro","aliceblue":"blu alice","bisque":"incarnato","slategray":"grigio ardesia","palegoldenrod":"giallo zolfo chiaro","darkorange":"arancione scuro","aquamarine":"acquamarina","lightgreen":"verde chiaro","burlywood":"tabacco","dodgerblue":"blu d'oriente","darkgray":"grigio scuro","lightcyan":"ciano chiaro","powderblue":"azzurro polvere","blueviolet":"blu violetto","orchid":"orchidea","dimgray":"grigio 80%","beige":"beige","fuchsia":"fucsia","lavenderblush":"bianco rosato","hotpink":"rosa acceso","steelblue":"blu acciao","tomato":"pomodoro","lightpink":"rosa chiaro","limegreen":"verde lime","indianred":"terra indiana","papayawhip":"cipria","lightslategray":"grigio ardesia chiaro","gray":"grigio","mediumorchid":"orchidea medio","cornsilk":"crema","black":"nero","seagreen":"verde mare","darkslateblue":"blu ardesia scuro","khaki":"kaki","lightblue":"azzurro","palegreen":"verde pallido","azure":"azzurro ghiaccio","peachpuff":"pesca","darkolivegreen":"verde oliva scuro","yellowgreen":"giallo verde"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/it/colors",({aliceblue:"bianco ghiaccio",antiquewhite:"rosa antico",aqua:"verde acqua",aquamarine:"acquamarina",azure:"azure",beige:"beige",bisque:"terracotta",black:"nero",blanchedalmond:"beige 2",blue:"blu",blueviolet:"violetto bluastro",brown:"marrone",burlywood:"legno massiccio",cadetblue:"verde petrolio",chartreuse:"verde brillante",chocolate:"cioccolato",coral:"corallo",cornflowerblue:"blu fiordaliso",cornsilk:"crema",crimson:"rosso scarlatto",cyan:"ciano",darkblue:"blu scuro",darkcyan:"celeste scuro",darkgoldenrod:"ocra scuro",darkgray:"grigio scuro",darkgreen:"verde scuro",darkgrey:"grigio scuro",darkkhaki:"cachi scuro",darkmagenta:"magenta scuro",darkolivegreen:"verde oliva scuro",darkorange:"arancione scuro",darkorchid:"orchidea scuro",darkred:"rosso scuro",darksalmon:"salmone scuro",darkseagreen:"verde acqua scuro",darkslateblue:"blu ardesia scuro",darkslategray:"grigio ardesia scuro",darkslategrey:"grigio ardesia scuro",darkturquoise:"turchese scuro",darkviolet:"viola scuro",deeppink:"ciclamino",deepskyblue:"azzurro intenso",dimgray:"grigio tenue",dimgrey:"grigio tenue",dodgerblue:"dodger blue",firebrick:"mattone",floralwhite:"bianco grigio",forestgreen:"verde pino scuro",fuchsia:"fucsia",gainsboro:"gainsboro",ghostwhite:"bianco gesso",gold:"oro",goldenrod:"dorato",gray:"grigio",green:"verde",greenyellow:"verde-giallo",grey:"grigio",honeydew:"miele",hotpink:"rosa acceso",indianred:"terra indiana",indigo:"indaco",ivory:"avorio",khaki:"cachi",lavender:"lavanda",lavenderblush:"lavanda rosa",lawngreen:"verde brillante chiaro",lemonchiffon:"lemon chiffon",lightblue:"blu chiaro",lightcoral:"corallo chiaro",lightcyan:"ciano chiaro",lightgoldenrodyellow:"giallo dorato chiaro",lightgray:"grigio chiaro",lightgreen:"verde chiaro",lightgrey:"grigio chiaro",lightpink:"rosa chiaro",lightsalmon:"salmone chiaro",lightseagreen:"verde acqua chiaro",lightskyblue:"azzurro chiaro",lightslategray:"grigio ardesia chiaro",lightslategrey:"grigio ardesia chiaro",lightsteelblue:"blu acciaio chiaro",lightyellow:"giallo chiaro",lime:"lime",limegreen:"verde lime",linen:"lino",magenta:"magenta",maroon:"Bordeaux",mediumaquamarine:"acquamarina medio",mediumblue:"blu medio",mediumorchid:"orchidea medio",mediumpurple:"viola medio",mediumseagreen:"verde acqua medio",mediumslateblue:"blu ardesia medio",mediumspringgreen:"verde brillante medio",mediumturquoise:"turchese medio",mediumvioletred:"violetto rosso medio",midnightblue:"blu notte",mintcream:"bianco nuvola",mistyrose:"rosa pallido",moccasin:"mocassino",navajowhite:"sabbia",navy:"blu scuro",oldlace:"mandorla",olive:"verde oliva",olivedrab:"verde bottiglia",orange:"arancione",orangered:"vermiglio",orchid:"orchidea",palegoldenrod:"dorato pallido",palegreen:"verde pallido",paleturquoise:"turchese pallido",palevioletred:"violetto rosso pallido",papayawhip:"papaya",peachpuff:"pesche",peru:"perù",pink:"rosa",plum:"prugna",powderblue:"azzurro polvere",purple:"viola",red:"rosso",rosybrown:"caffè latte",royalblue:"royal blue",saddlebrown:"cacao",salmon:"salmone",sandybrown:"argilla",seagreen:"verde acqua",seashell:"sabbia rosa",sienna:"terra di siena",silver:"argento",skyblue:"azzurro",slateblue:"blu ardesia",slategray:"grigio ardesia",slategrey:"grigio ardesia",snow:"neve",springgreen:"verde brillante",steelblue:"blu brillante",tan:"tan",teal:"verde acqua",thistle:"rosa cenere",tomato:"pomodoro",transparent:"trasparente",turquoise:"turchese",violet:"violetto",wheat:"tabacco",white:"bianco",whitesmoke:"bianco fumo",yellow:"giallo",yellowgreen:"giallo verde"})); \ No newline at end of file
diff --git a/lib/dojo/nls/it/colors.js.uncompressed.js b/lib/dojo/nls/it/colors.js.uncompressed.js
new file mode 100644
index 000000000..aafbb2d79
--- /dev/null
+++ b/lib/dojo/nls/it/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/it/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "bianco ghiaccio",
+ antiquewhite: "rosa antico",
+ aqua: "verde acqua",
+ aquamarine: "acquamarina",
+ azure: "azure",
+ beige: "beige",
+ bisque: "terracotta",
+ black: "nero",
+ blanchedalmond: "beige 2",
+ blue: "blu",
+ blueviolet: "violetto bluastro",
+ brown: "marrone",
+ burlywood: "legno massiccio",
+ cadetblue: "verde petrolio",
+ chartreuse: "verde brillante",
+ chocolate: "cioccolato",
+ coral: "corallo",
+ cornflowerblue: "blu fiordaliso",
+ cornsilk: "crema",
+ crimson: "rosso scarlatto",
+ cyan: "ciano",
+ darkblue: "blu scuro",
+ darkcyan: "celeste scuro",
+ darkgoldenrod: "ocra scuro",
+ darkgray: "grigio scuro",
+ darkgreen: "verde scuro",
+ darkgrey: "grigio scuro", // same as darkgray
+ darkkhaki: "cachi scuro",
+ darkmagenta: "magenta scuro",
+ darkolivegreen: "verde oliva scuro",
+ darkorange: "arancione scuro",
+ darkorchid: "orchidea scuro",
+ darkred: "rosso scuro",
+ darksalmon: "salmone scuro",
+ darkseagreen: "verde acqua scuro",
+ darkslateblue: "blu ardesia scuro",
+ darkslategray: "grigio ardesia scuro",
+ darkslategrey: "grigio ardesia scuro", // same as darkslategray
+ darkturquoise: "turchese scuro",
+ darkviolet: "viola scuro",
+ deeppink: "ciclamino",
+ deepskyblue: "azzurro intenso",
+ dimgray: "grigio tenue",
+ dimgrey: "grigio tenue", // same as dimgray
+ dodgerblue: "dodger blue",
+ firebrick: "mattone",
+ floralwhite: "bianco grigio",
+ forestgreen: "verde pino scuro",
+ fuchsia: "fucsia",
+ gainsboro: "gainsboro",
+ ghostwhite: "bianco gesso",
+ gold: "oro",
+ goldenrod: "dorato",
+ gray: "grigio",
+ green: "verde",
+ greenyellow: "verde-giallo",
+ grey: "grigio", // same as gray
+ honeydew: "miele",
+ hotpink: "rosa acceso",
+ indianred: "terra indiana",
+ indigo: "indaco",
+ ivory: "avorio",
+ khaki: "cachi",
+ lavender: "lavanda",
+ lavenderblush: "lavanda rosa",
+ lawngreen: "verde brillante chiaro",
+ lemonchiffon: "lemon chiffon",
+ lightblue: "blu chiaro",
+ lightcoral: "corallo chiaro",
+ lightcyan: "ciano chiaro",
+ lightgoldenrodyellow: "giallo dorato chiaro",
+ lightgray: "grigio chiaro",
+ lightgreen: "verde chiaro",
+ lightgrey: "grigio chiaro", // same as lightgray
+ lightpink: "rosa chiaro",
+ lightsalmon: "salmone chiaro",
+ lightseagreen: "verde acqua chiaro",
+ lightskyblue: "azzurro chiaro",
+ lightslategray: "grigio ardesia chiaro",
+ lightslategrey: "grigio ardesia chiaro", // same as lightslategray
+ lightsteelblue: "blu acciaio chiaro",
+ lightyellow: "giallo chiaro",
+ lime: "lime",
+ limegreen: "verde lime",
+ linen: "lino",
+ magenta: "magenta",
+ maroon: "Bordeaux",
+ mediumaquamarine: "acquamarina medio",
+ mediumblue: "blu medio",
+ mediumorchid: "orchidea medio",
+ mediumpurple: "viola medio",
+ mediumseagreen: "verde acqua medio",
+ mediumslateblue: "blu ardesia medio",
+ mediumspringgreen: "verde brillante medio",
+ mediumturquoise: "turchese medio",
+ mediumvioletred: "violetto rosso medio",
+ midnightblue: "blu notte",
+ mintcream: "bianco nuvola",
+ mistyrose: "rosa pallido",
+ moccasin: "mocassino",
+ navajowhite: "sabbia",
+ navy: "blu scuro",
+ oldlace: "mandorla",
+ olive: "verde oliva",
+ olivedrab: "verde bottiglia",
+ orange: "arancione",
+ orangered: "vermiglio",
+ orchid: "orchidea",
+ palegoldenrod: "dorato pallido",
+ palegreen: "verde pallido",
+ paleturquoise: "turchese pallido",
+ palevioletred: "violetto rosso pallido",
+ papayawhip: "papaya",
+ peachpuff: "pesche",
+ peru: "perù",
+ pink: "rosa",
+ plum: "prugna",
+ powderblue: "azzurro polvere",
+ purple: "viola",
+ red: "rosso",
+ rosybrown: "caffè latte",
+ royalblue: "royal blue",
+ saddlebrown: "cacao",
+ salmon: "salmone",
+ sandybrown: "argilla",
+ seagreen: "verde acqua",
+ seashell: "sabbia rosa",
+ sienna: "terra di siena",
+ silver: "argento",
+ skyblue: "azzurro",
+ slateblue: "blu ardesia",
+ slategray: "grigio ardesia",
+ slategrey: "grigio ardesia", // same as slategray
+ snow: "neve",
+ springgreen: "verde brillante",
+ steelblue: "blu brillante",
+ tan: "tan",
+ teal: "verde acqua",
+ thistle: "rosa cenere",
+ tomato: "pomodoro",
+ transparent: "trasparente",
+ turquoise: "turchese",
+ violet: "violetto",
+ wheat: "tabacco",
+ white: "bianco",
+ whitesmoke: "bianco fumo",
+ yellow: "giallo",
+ yellowgreen: "giallo verde"
+})
+);
diff --git a/lib/dojo/nls/ja/colors.js b/lib/dojo/nls/ja/colors.js
index 46aa1f25c..4b5591ea2 100644
--- a/lib/dojo/nls/ja/colors.js
+++ b/lib/dojo/nls/ja/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"ライト・スチール・ブルー","orangered":"オレンジ・レッド","midnightblue":"ミッドナイト・ブルー","cadetblue":"くすんだ青","seashell":"シーシェル","slategrey":"スレート・グレイ","coral":"珊瑚","darkturquoise":"ダーク・ターコイズ","antiquewhite":"アンティーク・ホワイト","mediumspringgreen":"ミディアム・スプリング・グリーン","salmon":"サーモン","darkgrey":"ダーク・グレイ","ivory":"アイボリー","greenyellow":"緑黄色","mistyrose":"ミスティ・ローズ","lightsalmon":"ライト・サーモン","silver":"銀","dimgrey":"くすんだグレイ","orange":"オレンジ","white":"白","navajowhite":"ナバホ・ホワイト","royalblue":"藤色","deeppink":"濃いピンク","lime":"ライム","oldlace":"オールド・レイス","chartreuse":"淡黄緑","darkcyan":"ダーク・シアン・ブルー","yellow":"黄","linen":"亜麻色","olive":"オリーブ","gold":"金","lawngreen":"ローン・グリーン","lightyellow":"ライト・イエロー","tan":"茶褐色","darkviolet":"ダーク・バイオレット","lightslategrey":"ライト・スレート・グレイ","grey":"グレイ","darkkhaki":"ダーク・カーキー","green":"緑","deepskyblue":"濃い空色","aqua":"アクア","sienna":"黄褐色","mintcream":"ミント・クリーム","rosybrown":"ロージー・ブラウン","mediumslateblue":"ミディアム・スレート・ブルー","magenta":"赤紫","lightseagreen":"ライト・シー・グリーン","cyan":"シアン・ブルー","olivedrab":"濃黄緑","darkgoldenrod":"ダーク・ゴールデン・ロッド","slateblue":"スレート・ブルー","mediumaquamarine":"ミディアム・アクアマリーン","lavender":"ラベンダー","mediumseagreen":"ミディアム・シー・グリーン","maroon":"えび茶","darkslategray":"ダーク・スレート・グレイ","mediumturquoise":"ミディアム・ターコイズ","ghostwhite":"ゴースト・ホワイト","darkblue":"ダーク・ブルー","mediumvioletred":"ミディアム・バイオレット・レッド","brown":"茶","lightgray":"ライト・グレイ","sandybrown":"砂褐色","pink":"ピンク","firebrick":"赤煉瓦色","indigo":"藍色","snow":"雪色","darkorchid":"ダーク・オーキッド","turquoise":"ターコイズ","chocolate":"チョコレート","springgreen":"スプリング・グリーン","moccasin":"モカシン","navy":"濃紺","lemonchiffon":"レモン・シフォン","teal":"ティール","floralwhite":"フローラル・ホワイト","cornflowerblue":"コーンフラワー・ブルー","paleturquoise":"ペイル・ターコイズ","purple":"紫","gainsboro":"ゲインズボーロ","plum":"深紫","red":"赤","blue":"青","forestgreen":"フォレスト・グリーン","darkgreen":"ダーク・グリーン","honeydew":"ハニーデュー","darkseagreen":"ダーク・シー・グリーン","lightcoral":"ライト・コーラル","palevioletred":"ペイル・バイオレット・レッド","mediumpurple":"ミディアム・パープル","saddlebrown":"サドル・ブラウン","darkmagenta":"ダーク・マジェンタ","thistle":"シスル","whitesmoke":"ホワイト・スモーク","wheat":"小麦色","violet":"すみれ色","lightskyblue":"ライト・スカイ・ブルー","goldenrod":"ゴールデン・ロッド","mediumblue":"ミディアム・ブルー","skyblue":"スカイ・ブルー","crimson":"深紅","darksalmon":"ダーク・サーモン","darkred":"ダーク・レッド","darkslategrey":"ダーク・スレート・グレイ","peru":"ペルー","lightgrey":"ライト・グレイ","lightgoldenrodyellow":"ライト・ゴールデン・ロッド・イエロー","blanchedalmond":"皮なしアーモンド","aliceblue":"アリス・ブルー","bisque":"ビスク","slategray":"スレート・グレイ","palegoldenrod":"ペイル・ゴールデン・ロッド","darkorange":"ダーク・オレンジ","aquamarine":"碧緑","lightgreen":"ライト・グリーン","burlywood":"バーリーウッド","dodgerblue":"ドッジャー・ブルー","darkgray":"ダーク・グレイ","lightcyan":"ライト・シアン","powderblue":"淡青","blueviolet":"青紫","orchid":"薄紫","dimgray":"くすんだグレイ","beige":"ベージュ","fuchsia":"紫紅色","lavenderblush":"ラベンダー・ブラッシ","hotpink":"ホット・ピンク","steelblue":"鋼色","tomato":"トマト色","lightpink":"ライト・ピンク","limegreen":"ライム・グリーン","indianred":"インディアン・レッド","papayawhip":"パパイア・ホイップ","lightslategray":"ライト・スレート・グレイ","gray":"グレイ","mediumorchid":"ミディアム・オーキッド","cornsilk":"コーンシルク","black":"黒","seagreen":"シー・グリーン","darkslateblue":"ダーク・スレート・ブルー","khaki":"カーキー","lightblue":"ライト・ブルー","palegreen":"ペイル・グリーン","azure":"薄い空色","peachpuff":"ピーチ・パフ","darkolivegreen":"ダーク・オリーブ・グリーン","yellowgreen":"黄緑"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/ja/colors",({aliceblue:"アリスブルー",antiquewhite:"アンティークホワイト",aqua:"アクア",aquamarine:"碧緑",azure:"薄い空色",beige:"ベージュ",bisque:"ビスク",black:"黒",blanchedalmond:"皮なしアーモンド",blue:"青",blueviolet:"青紫",brown:"茶",burlywood:"バーリーウッド",cadetblue:"くすんだ青",chartreuse:"淡黄緑",chocolate:"チョコレート",coral:"珊瑚",cornflowerblue:"コーンフラワーブルー",cornsilk:"コーンシルク",crimson:"深紅",cyan:"シアンブルー",darkblue:"ダークブルー",darkcyan:"ダークシアンブルー",darkgoldenrod:"ダークゴールデンロッド",darkgray:"ダークグレイ",darkgreen:"ダークグリーン",darkgrey:"ダークグレイ",darkkhaki:"ダークカーキ",darkmagenta:"ダークマジェンタ",darkolivegreen:"ダークオリーブグリーン",darkorange:"ダークオレンジ",darkorchid:"ダークオーキッド",darkred:"ダークレッド",darksalmon:"ダークサーモン",darkseagreen:"ダークシーグリーン",darkslateblue:"ダークスレートブルー",darkslategray:"ダークスレートグレイ",darkslategrey:"ダークスレートグレイ",darkturquoise:"ダークターコイズ",darkviolet:"ダークバイオレット",deeppink:"濃いピンク",deepskyblue:"濃い空色",dimgray:"くすんだグレイ",dimgrey:"くすんだグレイ",dodgerblue:"ドッジャーブルー",firebrick:"赤煉瓦色",floralwhite:"フローラルホワイト",forestgreen:"フォレストグリーン",fuchsia:"紫紅色",gainsboro:"ゲインズボーロ",ghostwhite:"ゴーストホワイト",gold:"金",goldenrod:"ゴールデンロッド",gray:"グレイ",green:"緑",greenyellow:"緑黄色",grey:"グレイ",honeydew:"ハニーデュー",hotpink:"ホットピンク",indianred:"インディアンレッド",indigo:"藍色",ivory:"アイボリー",khaki:"カーキ",lavender:"ラベンダー",lavenderblush:"ラベンダーブラッシ",lawngreen:"ローングリーン",lemonchiffon:"レモンシフォン",lightblue:"ライトブルー",lightcoral:"ライトコーラル",lightcyan:"ライトシアン",lightgoldenrodyellow:"ライトゴールデンロッドイエロー",lightgray:"ライトグレイ",lightgreen:"ライトグリーン",lightgrey:"ライトグレイ",lightpink:"ライトピンク",lightsalmon:"ライトサーモン",lightseagreen:"ライトシーグリーン",lightskyblue:"ライトスカイブルー",lightslategray:"ライトスレートグレイ",lightslategrey:"ライトスレートグレイ",lightsteelblue:"ライトスチールブルー",lightyellow:"ライトイエロー",lime:"ライム",limegreen:"ライムグリーン",linen:"亜麻色",magenta:"赤紫",maroon:"えび茶",mediumaquamarine:"ミディアムアクアマリーン",mediumblue:"ミディアムブルー",mediumorchid:"ミディアムオーキッド",mediumpurple:"ミディアムパープル",mediumseagreen:"ミディアムシーグリーン",mediumslateblue:"ミディアムスレートブルー",mediumspringgreen:"ミディアムスプリンググリーン",mediumturquoise:"ミディアムターコイズ",mediumvioletred:"ミディアムバイオレットレッド",midnightblue:"ミッドナイトブルー",mintcream:"ミントクリーム",mistyrose:"ミスティローズ",moccasin:"モカシン",navajowhite:"ナバホホワイト",navy:"濃紺",oldlace:"オールドレイス",olive:"オリーブ",olivedrab:"濃黄緑",orange:"オレンジ",orangered:"オレンジレッド",orchid:"薄紫",palegoldenrod:"ペイルゴールデンロッド",palegreen:"ペイルグリーン",paleturquoise:"ペイルターコイズ",palevioletred:"ペイルバイオレットレッド",papayawhip:"パパイアホイップ",peachpuff:"ピーチパフ",peru:"ペルー",pink:"ピンク",plum:"深紫",powderblue:"淡青",purple:"紫",red:"赤",rosybrown:"ロージーブラウン",royalblue:"藤色",saddlebrown:"サドルブラウン",salmon:"サーモン",sandybrown:"砂褐色",seagreen:"シーグリーン",seashell:"シーシェル",sienna:"黄褐色",silver:"銀",skyblue:"スカイブルー",slateblue:"スレートブルー",slategray:"スレートグレイ",slategrey:"スレートグレイ",snow:"雪色",springgreen:"スプリンググリーン",steelblue:"鋼色",tan:"茶褐色",teal:"ティール",thistle:"シスル",tomato:"トマト色",transparent:"透明",turquoise:"ターコイズ",violet:"すみれ色",wheat:"小麦色",white:"白",whitesmoke:"ホワイトスモーク",yellow:"黄",yellowgreen:"黄緑"})); \ No newline at end of file
diff --git a/lib/dojo/nls/ja/colors.js.uncompressed.js b/lib/dojo/nls/ja/colors.js.uncompressed.js
new file mode 100644
index 000000000..7051d786b
--- /dev/null
+++ b/lib/dojo/nls/ja/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/ja/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "アリスブルー",
+ antiquewhite: "アンティークホワイト",
+ aqua: "アクア",
+ aquamarine: "碧緑",
+ azure: "薄い空色",
+ beige: "ベージュ",
+ bisque: "ビスク",
+ black: "黒",
+ blanchedalmond: "皮なしアーモンド",
+ blue: "青",
+ blueviolet: "青紫",
+ brown: "茶",
+ burlywood: "バーリーウッド",
+ cadetblue: "くすんだ青",
+ chartreuse: "淡黄緑",
+ chocolate: "チョコレート",
+ coral: "珊瑚",
+ cornflowerblue: "コーンフラワーブルー",
+ cornsilk: "コーンシルク",
+ crimson: "深紅",
+ cyan: "シアンブルー",
+ darkblue: "ダークブルー",
+ darkcyan: "ダークシアンブルー",
+ darkgoldenrod: "ダークゴールデンロッド",
+ darkgray: "ダークグレイ",
+ darkgreen: "ダークグリーン",
+ darkgrey: "ダークグレイ", // same as darkgray
+ darkkhaki: "ダークカーキ",
+ darkmagenta: "ダークマジェンタ",
+ darkolivegreen: "ダークオリーブグリーン",
+ darkorange: "ダークオレンジ",
+ darkorchid: "ダークオーキッド",
+ darkred: "ダークレッド",
+ darksalmon: "ダークサーモン",
+ darkseagreen: "ダークシーグリーン",
+ darkslateblue: "ダークスレートブルー",
+ darkslategray: "ダークスレートグレイ",
+ darkslategrey: "ダークスレートグレイ", // same as darkslategray
+ darkturquoise: "ダークターコイズ",
+ darkviolet: "ダークバイオレット",
+ deeppink: "濃いピンク",
+ deepskyblue: "濃い空色",
+ dimgray: "くすんだグレイ",
+ dimgrey: "くすんだグレイ", // same as dimgray
+ dodgerblue: "ドッジャーブルー",
+ firebrick: "赤煉瓦色",
+ floralwhite: "フローラルホワイト",
+ forestgreen: "フォレストグリーン",
+ fuchsia: "紫紅色",
+ gainsboro: "ゲインズボーロ",
+ ghostwhite: "ゴーストホワイト",
+ gold: "金",
+ goldenrod: "ゴールデンロッド",
+ gray: "グレイ",
+ green: "緑",
+ greenyellow: "緑黄色",
+ grey: "グレイ", // same as gray
+ honeydew: "ハニーデュー",
+ hotpink: "ホットピンク",
+ indianred: "インディアンレッド",
+ indigo: "藍色",
+ ivory: "アイボリー",
+ khaki: "カーキ",
+ lavender: "ラベンダー",
+ lavenderblush: "ラベンダーブラッシ",
+ lawngreen: "ローングリーン",
+ lemonchiffon: "レモンシフォン",
+ lightblue: "ライトブルー",
+ lightcoral: "ライトコーラル",
+ lightcyan: "ライトシアン",
+ lightgoldenrodyellow: "ライトゴールデンロッドイエロー",
+ lightgray: "ライトグレイ",
+ lightgreen: "ライトグリーン",
+ lightgrey: "ライトグレイ", // same as lightgray
+ lightpink: "ライトピンク",
+ lightsalmon: "ライトサーモン",
+ lightseagreen: "ライトシーグリーン",
+ lightskyblue: "ライトスカイブルー",
+ lightslategray: "ライトスレートグレイ",
+ lightslategrey: "ライトスレートグレイ", // same as lightslategray
+ lightsteelblue: "ライトスチールブルー",
+ lightyellow: "ライトイエロー",
+ lime: "ライム",
+ limegreen: "ライムグリーン",
+ linen: "亜麻色",
+ magenta: "赤紫",
+ maroon: "えび茶",
+ mediumaquamarine: "ミディアムアクアマリーン",
+ mediumblue: "ミディアムブルー",
+ mediumorchid: "ミディアムオーキッド",
+ mediumpurple: "ミディアムパープル",
+ mediumseagreen: "ミディアムシーグリーン",
+ mediumslateblue: "ミディアムスレートブルー",
+ mediumspringgreen: "ミディアムスプリンググリーン",
+ mediumturquoise: "ミディアムターコイズ",
+ mediumvioletred: "ミディアムバイオレットレッド",
+ midnightblue: "ミッドナイトブルー",
+ mintcream: "ミントクリーム",
+ mistyrose: "ミスティローズ",
+ moccasin: "モカシン",
+ navajowhite: "ナバホホワイト",
+ navy: "濃紺",
+ oldlace: "オールドレイス",
+ olive: "オリーブ",
+ olivedrab: "濃黄緑",
+ orange: "オレンジ",
+ orangered: "オレンジレッド",
+ orchid: "薄紫",
+ palegoldenrod: "ペイルゴールデンロッド",
+ palegreen: "ペイルグリーン",
+ paleturquoise: "ペイルターコイズ",
+ palevioletred: "ペイルバイオレットレッド",
+ papayawhip: "パパイアホイップ",
+ peachpuff: "ピーチパフ",
+ peru: "ペルー",
+ pink: "ピンク",
+ plum: "深紫",
+ powderblue: "淡青",
+ purple: "紫",
+ red: "赤",
+ rosybrown: "ロージーブラウン",
+ royalblue: "藤色",
+ saddlebrown: "サドルブラウン",
+ salmon: "サーモン",
+ sandybrown: "砂褐色",
+ seagreen: "シーグリーン",
+ seashell: "シーシェル",
+ sienna: "黄褐色",
+ silver: "銀",
+ skyblue: "スカイブルー",
+ slateblue: "スレートブルー",
+ slategray: "スレートグレイ",
+ slategrey: "スレートグレイ", // same as slategray
+ snow: "雪色",
+ springgreen: "スプリンググリーン",
+ steelblue: "鋼色",
+ tan: "茶褐色",
+ teal: "ティール",
+ thistle: "シスル",
+ tomato: "トマト色",
+ transparent: "透明",
+ turquoise: "ターコイズ",
+ violet: "すみれ色",
+ wheat: "小麦色",
+ white: "白",
+ whitesmoke: "ホワイトスモーク",
+ yellow: "黄",
+ yellowgreen: "黄緑"
+})
+);
diff --git a/lib/dojo/nls/kk/colors.js b/lib/dojo/nls/kk/colors.js
index 19b90679d..924da788f 100644
--- a/lib/dojo/nls/kk/colors.js
+++ b/lib/dojo/nls/kk/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"ашық сұрғылт көк","orangered":"қызғылт сары қызыл","midnightblue":"түн ортасы көк","cadetblue":"кадет көк","seashell":"теңіз қабыршағы","slategrey":"көкшіл сұры","coral":"коралл","darkturquoise":"күңгірт көгілдір","antiquewhite":"ақ антик","mediumspringgreen":"орташа ашық жасыл","salmon":"сомон","darkgrey":"қою сұры","ivory":"піл сүйег","greenyellow":"жасыл-сары","mistyrose":"көмескі қызғылт","lightsalmon":"ашық сарғыш қызғылт","silver":"күміс түстес","dimgrey":"күңгірт сұры","orange":"қызғылт сары","white":"ақ","navajowhite":"навахо ақ","royalblue":"патша көк","deeppink":"қою қызғылт","lime":"әк","oldlace":"ескі бау","chartreuse":"жасылдау-сары","darkcyan":"күңгірт циан","yellow":"сары","linen":"зығыр","olive":"зәйтүнді","gold":"сары түсті","lawngreen":"көгал жасыл","lightyellow":"ашық сары","tan":"сарғыш қоңыр","darkviolet":"күңгірт күлгін","lightslategrey":"ашық көкшіл сұры","grey":"сұры","darkkhaki":"қою хаки","green":"жасыл","deepskyblue":"қою аспан көк","aqua":"су түсі","sienna":"сиенна","mintcream":"жалбыз майы","rosybrown":"қызғылт қоңыр","mediumslateblue":"орташа көкшіл сұры","magenta":"фуксин","lightseagreen":"ашық теңіз толқыны","cyan":"циан","olivedrab":"жасылдау сары","darkgoldenrod":"қара алтын","slateblue":"грифель көк","mediumaquamarine":"орташа жасылдау көк","lavender":"бозғылт ақшыл көк","mediumseagreen":"орташа теңіз толқыны","maroon":"сарғылт","darkslategray":"күңгірт көкшіл сұры","mediumturquoise":"орташа көгілдір","ghostwhite":"елесті ақ","darkblue":"күңгірт көк","mediumvioletred":"орташа ақшыл көк-қызыл","brown":"қоңыр","lightgray":"ашық сұры","sandybrown":"құмды қоңыр","pink":"қызғылт","firebrick":"қызыл кірпіш","indigo":"индиго","snow":"қар","darkorchid":"күңгірт орсель","turquoise":"көгілдір","chocolate":"шоколад","springgreen":"көктем жасыл","moccasin":"мокасин","navy":"қара-көк","lemonchiffon":"лимон шиффон","teal":"шүрегей","floralwhite":"гүлді ақ","cornflowerblue":"көктікен көк","paleturquoise":"бозғылт көгілдір","purple":"күлгін","gainsboro":"gainsboro","plum":"алхоры","red":"қызыл","blue":"көк","forestgreen":"шөпті жасыл","darkgreen":"қою жасыл","honeydew":"балдай","darkseagreen":"қою теңіз толқыны","lightcoral":"ашық коралл","palevioletred":"бозғылт ақшыл көк-қызыл","mediumpurple":"орташа күлгін","saddlebrown":"тоқым қоңыр","darkmagenta":"қою күлгін","thistle":"артишок","whitesmoke":"ақ түтін","wheat":"бидай","violet":"күлгін","lightskyblue":"ашық аспан көк","goldenrod":"алтын","mediumblue":"орташа көк","skyblue":"аспан көк","crimson":"таңқұрай","darksalmon":"қою сарылау қызғылт","darkred":"күңгірт қызыл","darkslategrey":"күңгірт көкшіл сұры","peru":"перу","lightgrey":"ашық сұры","lightgoldenrodyellow":"ашық сары түсті сары","blanchedalmond":"ағартылған бадам","aliceblue":"бозғылт көк","bisque":"бисквит","slategray":"көкшіл сұры","palegoldenrod":"бозғылт алтын","darkorange":"қою қызғылт сары","aquamarine":"жасылдау-көк","lightgreen":"ақшыл жасыл","burlywood":"ағаш тамыры","dodgerblue":"көк доджер","darkgray":"қою сұры","lightcyan":"ашық көгілдір","powderblue":"жасылдау көк","blueviolet":"көк-ақшыл көк","orchid":"орхидея","dimgray":"күңгірт сұры","beige":"сарғыш","fuchsia":"фуксия","lavenderblush":"күңгірт ақшыл қызыл","hotpink":"ашық қызғылт","steelblue":"көкшіл сұрғылт","tomato":"қызанақ","lightpink":"ақшыл қызғылт","limegreen":"әк жасыл","indianred":"үнділік қызыл","papayawhip":"папайя қамшысы","lightslategray":"ашық көкшіл сұры","gray":"сұры","mediumorchid":"орташа ақшыл","cornsilk":"жібек","black":"қара","seagreen":"теңіз толқыны","darkslateblue":"күңгірт грифель көк","khaki":"хаки","lightblue":"ақшыл көк","palegreen":"бозғылт жасыл","azure":"көкшіл","peachpuff":"шабдалы","darkolivegreen":"қою қоңырлау жасыл","yellowgreen":"сарғыш жасыл"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/kk/colors",({aliceblue:"бозғылт көк",antiquewhite:"ақ антик",aqua:"су түсі",aquamarine:"жасылдау-көк",azure:"көкшіл",beige:"сарғыш",bisque:"бисквит",black:"қара",blanchedalmond:"ағартылған бадам",blue:"көк",blueviolet:"көк-ақшыл көк",brown:"қоңыр",burlywood:"ағаш тамыры",cadetblue:"кадет көк",chartreuse:"жасылдау-сары",chocolate:"шоколад",coral:"коралл",cornflowerblue:"көктікен көк",cornsilk:"жібек",crimson:"таңқұрай",cyan:"циан",darkblue:"күңгірт көк",darkcyan:"күңгірт циан",darkgoldenrod:"қара алтын",darkgray:"қою сұры",darkgreen:"қою жасыл",darkgrey:"қою сұры",darkkhaki:"қою хаки",darkmagenta:"қою қызыл күрең",darkolivegreen:"қою қоңырлау жасыл",darkorange:"қою қызғылт сары",darkorchid:"күңгірт орсель",darkred:"күңгірт қызыл",darksalmon:"қою сарылау қызғылт",darkseagreen:"қою теңіз толқыны",darkslateblue:"күңгірт грифель көк",darkslategray:"күңгірт көкшіл сұры",darkslategrey:"күңгірт көкшіл сұры",darkturquoise:"күңгірт көгілдір",darkviolet:"күңгірт қызыл күрең",deeppink:"қою қызғылт",deepskyblue:"қою аспан көк",dimgray:"күңгірт сұры",dimgrey:"күңгірт сұры",dodgerblue:"көк доджер",firebrick:"қызыл кірпіш",floralwhite:"гүлді ақ",forestgreen:"шөпті жасыл",fuchsia:"фуксия",gainsboro:"gainsboro",ghostwhite:"елесті ақ",gold:"алтындай",goldenrod:"алтын",gray:"сұры",green:"жасыл",greenyellow:"жасыл-сары",grey:"сұры",honeydew:"балдай",hotpink:"ашық қызғылт",indianred:"үнділік қызыл",indigo:"индиго",ivory:"піл сүйег",khaki:"хаки",lavender:"бозғылт ақшыл көк",lavenderblush:"күңгірт ақшыл қызыл",lawngreen:"көгал жасыл",lemonchiffon:"лимон шиффон",lightblue:"ақшыл көк",lightcoral:"ашық коралл",lightcyan:"ашық көгілдір",lightgoldenrodyellow:"ашық алтындай сары",lightgray:"ашық сұры",lightgreen:"ақшыл жасыл",lightgrey:"ашық сұры",lightpink:"ақшыл қызғылт",lightsalmon:"ашық сарғыш қызғылт",lightseagreen:"ашық теңіз толқыны",lightskyblue:"ашық аспан көк",lightslategray:"ашық көкшіл сұры",lightslategrey:"ашық көкшіл сұры",lightsteelblue:"ашық сұрғылт көк",lightyellow:"ашық сары",lime:"әк",limegreen:"әк жасыл",linen:"зығыр",magenta:"фуксин",maroon:"сарғылт",mediumaquamarine:"орташа жасылдау көк",mediumblue:"орташа көк",mediumorchid:"орташа ақшыл",mediumpurple:"орташа қызыл күрең",mediumseagreen:"орташа теңіз толқыны",mediumslateblue:"орташа көкшіл сұры",mediumspringgreen:"орташа ашық жасыл",mediumturquoise:"орташа көгілдір",mediumvioletred:"орташа ақшыл көк-қызыл",midnightblue:"түн ортасы көк",mintcream:"жалбыз майы",mistyrose:"көмескі қызғылт",moccasin:"мокасин",navajowhite:"навахо ақ",navy:"теңіз көк",oldlace:"ескі бау",olive:"зәйтүнді",olivedrab:"жасылдау сары",orange:"қызғылт сары",orangered:"қызғылт сары қызыл",orchid:"орхидея",palegoldenrod:"бозғылт алтын",palegreen:"бозғылт жасыл",paleturquoise:"бозғылт көгілдір",palevioletred:"бозғылт ақшыл көк-қызыл",papayawhip:"папайя қамшысы",peachpuff:"шабдалы",peru:"перу",pink:"қызғылт",plum:"алхоры",powderblue:"жасылдау көк",purple:"қызыл күрең",red:"қызыл",rosybrown:"қызғылт қоңыр",royalblue:"патша көк",saddlebrown:"тоқым қоңыр",salmon:"сомон",sandybrown:"құмды қоңыр",seagreen:"теңіз толқыны",seashell:"теңіз қабыршағы",sienna:"сиенна",silver:"күмістей",skyblue:"аспан көк",slateblue:"грифель көк",slategray:"көкшіл сұры",slategrey:"көкшіл сұры",snow:"қар",springgreen:"көктем жасыл",steelblue:"көкшіл сұрғылт",tan:"сарғыш қоңыр",teal:"шүрегей",thistle:"артишок",tomato:"қызанақ",transparent:"мөлдір",turquoise:"көгілдір",violet:"күлгін",wheat:"бидай",white:"ақ",whitesmoke:"ақ түтін",yellow:"сары",yellowgreen:"сарғыш жасыл"})); \ No newline at end of file
diff --git a/lib/dojo/nls/kk/colors.js.uncompressed.js b/lib/dojo/nls/kk/colors.js.uncompressed.js
new file mode 100644
index 000000000..d7aa08c4c
--- /dev/null
+++ b/lib/dojo/nls/kk/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/kk/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "бозғылт көк",
+ antiquewhite: "ақ антик",
+ aqua: "су түсі",
+ aquamarine: "жасылдау-көк",
+ azure: "көкшіл",
+ beige: "сарғыш",
+ bisque: "бисквит",
+ black: "қара",
+ blanchedalmond: "ағартылған бадам",
+ blue: "көк",
+ blueviolet: "көк-ақшыл көк",
+ brown: "қоңыр",
+ burlywood: "ағаш тамыры",
+ cadetblue: "кадет көк",
+ chartreuse: "жасылдау-сары",
+ chocolate: "шоколад",
+ coral: "коралл",
+ cornflowerblue: "көктікен көк",
+ cornsilk: "жібек",
+ crimson: "таңқұрай",
+ cyan: "циан",
+ darkblue: "күңгірт көк",
+ darkcyan: "күңгірт циан",
+ darkgoldenrod: "қара алтын",
+ darkgray: "қою сұры",
+ darkgreen: "қою жасыл",
+ darkgrey: "қою сұры", // same as darkgray
+ darkkhaki: "қою хаки",
+ darkmagenta: "қою қызыл күрең",
+ darkolivegreen: "қою қоңырлау жасыл",
+ darkorange: "қою қызғылт сары",
+ darkorchid: "күңгірт орсель",
+ darkred: "күңгірт қызыл",
+ darksalmon: "қою сарылау қызғылт",
+ darkseagreen: "қою теңіз толқыны",
+ darkslateblue: "күңгірт грифель көк",
+ darkslategray: "күңгірт көкшіл сұры",
+ darkslategrey: "күңгірт көкшіл сұры", // same as darkslategray
+ darkturquoise: "күңгірт көгілдір",
+ darkviolet: "күңгірт қызыл күрең",
+ deeppink: "қою қызғылт",
+ deepskyblue: "қою аспан көк",
+ dimgray: "күңгірт сұры",
+ dimgrey: "күңгірт сұры", // same as dimgray
+ dodgerblue: "көк доджер",
+ firebrick: "қызыл кірпіш",
+ floralwhite: "гүлді ақ",
+ forestgreen: "шөпті жасыл",
+ fuchsia: "фуксия",
+ gainsboro: "gainsboro",
+ ghostwhite: "елесті ақ",
+ gold: "алтындай",
+ goldenrod: "алтын",
+ gray: "сұры",
+ green: "жасыл",
+ greenyellow: "жасыл-сары",
+ grey: "сұры", // same as gray
+ honeydew: "балдай",
+ hotpink: "ашық қызғылт",
+ indianred: "үнділік қызыл",
+ indigo: "индиго",
+ ivory: "піл сүйег",
+ khaki: "хаки",
+ lavender: "бозғылт ақшыл көк",
+ lavenderblush: "күңгірт ақшыл қызыл",
+ lawngreen: "көгал жасыл",
+ lemonchiffon: "лимон шиффон",
+ lightblue: "ақшыл көк",
+ lightcoral: "ашық коралл",
+ lightcyan: "ашық көгілдір",
+ lightgoldenrodyellow: "ашық алтындай сары",
+ lightgray: "ашық сұры",
+ lightgreen: "ақшыл жасыл",
+ lightgrey: "ашық сұры", // same as lightgray
+ lightpink: "ақшыл қызғылт",
+ lightsalmon: "ашық сарғыш қызғылт",
+ lightseagreen: "ашық теңіз толқыны",
+ lightskyblue: "ашық аспан көк",
+ lightslategray: "ашық көкшіл сұры",
+ lightslategrey: "ашық көкшіл сұры", // same as lightslategray
+ lightsteelblue: "ашық сұрғылт көк",
+ lightyellow: "ашық сары",
+ lime: "әк",
+ limegreen: "әк жасыл",
+ linen: "зығыр",
+ magenta: "фуксин",
+ maroon: "сарғылт",
+ mediumaquamarine: "орташа жасылдау көк",
+ mediumblue: "орташа көк",
+ mediumorchid: "орташа ақшыл",
+ mediumpurple: "орташа қызыл күрең",
+ mediumseagreen: "орташа теңіз толқыны",
+ mediumslateblue: "орташа көкшіл сұры",
+ mediumspringgreen: "орташа ашық жасыл",
+ mediumturquoise: "орташа көгілдір",
+ mediumvioletred: "орташа ақшыл көк-қызыл",
+ midnightblue: "түн ортасы көк",
+ mintcream: "жалбыз майы",
+ mistyrose: "көмескі қызғылт",
+ moccasin: "мокасин",
+ navajowhite: "навахо ақ",
+ navy: "теңіз көк",
+ oldlace: "ескі бау",
+ olive: "зәйтүнді",
+ olivedrab: "жасылдау сары",
+ orange: "қызғылт сары",
+ orangered: "қызғылт сары қызыл",
+ orchid: "орхидея",
+ palegoldenrod: "бозғылт алтын",
+ palegreen: "бозғылт жасыл",
+ paleturquoise: "бозғылт көгілдір",
+ palevioletred: "бозғылт ақшыл көк-қызыл",
+ papayawhip: "папайя қамшысы",
+ peachpuff: "шабдалы",
+ peru: "перу",
+ pink: "қызғылт",
+ plum: "алхоры",
+ powderblue: "жасылдау көк",
+ purple: "қызыл күрең",
+ red: "қызыл",
+ rosybrown: "қызғылт қоңыр",
+ royalblue: "патша көк",
+ saddlebrown: "тоқым қоңыр",
+ salmon: "сомон",
+ sandybrown: "құмды қоңыр",
+ seagreen: "теңіз толқыны",
+ seashell: "теңіз қабыршағы",
+ sienna: "сиенна",
+ silver: "күмістей",
+ skyblue: "аспан көк",
+ slateblue: "грифель көк",
+ slategray: "көкшіл сұры",
+ slategrey: "көкшіл сұры", // same as slategray
+ snow: "қар",
+ springgreen: "көктем жасыл",
+ steelblue: "көкшіл сұрғылт",
+ tan: "сарғыш қоңыр",
+ teal: "шүрегей",
+ thistle: "артишок",
+ tomato: "қызанақ",
+ transparent: "мөлдір",
+ turquoise: "көгілдір",
+ violet: "күлгін",
+ wheat: "бидай",
+ white: "ақ",
+ whitesmoke: "ақ түтін",
+ yellow: "сары",
+ yellowgreen: "сарғыш жасыл"
+})
+);
diff --git a/lib/dojo/nls/ko/colors.js b/lib/dojo/nls/ko/colors.js
index 0c6576b12..4dba16c5e 100644
--- a/lib/dojo/nls/ko/colors.js
+++ b/lib/dojo/nls/ko/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"라이트 스틸 블루(light steel blue)","orangered":"오렌지 레드(orange red)","midnightblue":"미드나잇 블루(midnight blue)","cadetblue":"카뎃 블루(cadet blue)","seashell":"씨쉘(seashell)","slategrey":"슬레이트 그레이(slate gray)","coral":"코랄(coral)","darkturquoise":"다크 터콰즈(dark turquoise)","antiquewhite":"앤틱 화이트(antique white)","mediumspringgreen":"미디엄 스프링 그린(medium spring green)","salmon":"샐몬(salmon)","darkgrey":"다크 그레이(dark gray)","ivory":"아이보리(ivory)","greenyellow":"그린 옐로우(green-yellow)","mistyrose":"미스티 로즈(misty rose)","lightsalmon":"라이트 샐몬(light salmon)","silver":"실버(silver)","dimgrey":"딤 그레이(dim gray)","orange":"오렌지(orange)","white":"화이트(white)","navajowhite":"나바호 화이트(navajo white)","royalblue":"로얄 블루(royal blue)","deeppink":"딥 핑크(deep pink)","lime":"라임(lime)","oldlace":"올드 레이스(old lace)","chartreuse":"샤르트뢰즈(chartreuse)","darkcyan":"다크 시안(dark cyan)","yellow":"옐로우(yellow)","linen":"리넨(linen)","olive":"올리브(olive)","gold":"골드(gold)","lawngreen":"론 그린(lawn green)","lightyellow":"라이트 옐로우(light yellow)","tan":"탠(tan)","darkviolet":"다크 바이올렛(dark violet)","lightslategrey":"라이트 슬레이트 그레이(light slate gray)","grey":"그레이(gray)","darkkhaki":"다크 카키(dark khaki)","green":"그린(green)","deepskyblue":"딥 스카이 블루(deep sky blue)","aqua":"아쿠아(aqua)","sienna":"시에나(sienna)","mintcream":"민트 크림(mint cream)","rosybrown":"로지 브라운(rosy brown)","mediumslateblue":"미디엄 슬레이트 블루(medium slate blue)","magenta":"마젠타(magenta)","lightseagreen":"라이트 씨 그린(light sea green)","cyan":"시안(cyan)","olivedrab":"올리브 드랩(olive drab)","darkgoldenrod":"다크 골든로드(dark goldenrod)","slateblue":"슬레이트 블루(slate blue)","mediumaquamarine":"미디엄 아쿠아마린(medium aquamarine)","lavender":"라벤더(lavender)","mediumseagreen":"미디엄 씨 그린(medium sea green)","maroon":"마룬(maroon)","darkslategray":"다크 슬레이트 그레이(dark slate gray)","mediumturquoise":"미디엄 터콰즈(medium turquoise)","ghostwhite":"고스트 화이트(ghost white)","darkblue":"다크 블루(dark blue)","mediumvioletred":"미디엄 바이올렛 레드(medium violet-red)","brown":"브라운(brown)","lightgray":"라이트 그레이(light gray)","sandybrown":"샌디 브라운(sandy brown)","pink":"핑크(pink)","firebrick":"파이어 브릭(fire brick)","indigo":"인디고(indigo)","snow":"스노우(snow)","darkorchid":"다크 오키드(dark orchid)","turquoise":"터콰즈(turquoise)","chocolate":"초콜렛(chocolate)","springgreen":"스프링 그린(spring green)","moccasin":"모카신(moccasin)","navy":"네이비(navy)","lemonchiffon":"레몬 쉬폰(lemon chiffon)","teal":"틸(teal)","floralwhite":"플로랄 화이트(floral white)","cornflowerblue":"콘플라워 블루(cornflower blue)","paleturquoise":"페일 터콰즈(pale turquoise)","purple":"퍼플(purple)","gainsboro":"게인스브로(gainsboro)","plum":"플럼(plum)","red":"레드(red)","blue":"블루(blue)","forestgreen":"포레스트 그린(forest green)","darkgreen":"다크 그린(dark green)","honeydew":"허니듀(honeydew)","darkseagreen":"다크 씨 그린(dark sea green)","lightcoral":"라이트 코랄(light coral)","palevioletred":"페일 바이올렛 레드(pale violet-red)","mediumpurple":"미디엄 퍼플(medium purple)","saddlebrown":"새들 브라운(saddle brown)","darkmagenta":"다크 마젠타(dark magenta)","thistle":"시슬(thistle)","whitesmoke":"화이트 스모크(white smoke)","wheat":"휘트(wheat)","violet":"바이올렛(violet)","lightskyblue":"라이트 스카이 블루(light sky blue)","goldenrod":"골든로드(goldenrod)","mediumblue":"미디엄 블루(medium blue)","skyblue":"스카이 블루(sky blue)","crimson":"크림슨(crimson)","darksalmon":"다크 샐몬(dark salmon)","darkred":"다크 레드(dark red)","darkslategrey":"다크 슬레이트 그레이(dark slate gray)","peru":"페루(peru)","lightgrey":"라이트 그레이(light gray)","lightgoldenrodyellow":"라이트 골든로드 옐로우(light goldenrod yellow)","blanchedalmond":"블랜치 아몬드(blanched almond)","aliceblue":"앨리스 블루(alice blue)","bisque":"비스크(bisque)","slategray":"슬레이트 그레이(slate gray)","palegoldenrod":"페일 골든로드(pale goldenrod)","darkorange":"다크 오렌지(dark orange)","aquamarine":"아쿠아마린(aquamarine)","lightgreen":"라이트 그린(light green)","burlywood":"벌리우드(burlywood)","dodgerblue":"다저 블루(dodger blue)","darkgray":"다크 그레이(dark gray)","lightcyan":"라이트 시안(light cyan)","powderblue":"파우더 블루(powder blue)","blueviolet":"블루 바이올렛(blue-violet)","orchid":"오키드(orchid)","dimgray":"딤 그레이(dim gray)","beige":"베이지(beige)","fuchsia":"후크샤(fuchsia)","lavenderblush":"라벤더 블러쉬(lavender blush)","hotpink":"핫 핑크(hot pink)","steelblue":"스틸 블루(steel blue)","tomato":"토마토(tomato)","lightpink":"라이트 핑크(light pink)","limegreen":"라임 그린(lime green)","indianred":"인디안 레드(indian red)","papayawhip":"파파야 휩(papaya whip)","lightslategray":"라이트 슬레이트 그레이(light slate gray)","gray":"그레이(gray)","mediumorchid":"미디엄 오키드(medium orchid)","cornsilk":"콘실크(cornsilk)","black":"블랙(black)","seagreen":"씨 그린(sea green)","darkslateblue":"다크 슬레이트 블루(dark slate blue)","khaki":"카키(khaki)","lightblue":"라이트 블루(light blue)","palegreen":"페일 그린(pale green)","azure":"애쥬어(azure)","peachpuff":"피치 퍼프(peach puff)","darkolivegreen":"다크 올리브 그린(dark olive green)","yellowgreen":"옐로우 그린(yellow green)"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/ko/colors",({aliceblue:"앨리스 블루(alice blue)",antiquewhite:"앤틱 화이트(antique white)",aqua:"아쿠아(aqua)",aquamarine:"아쿠아마린(aquamarine)",azure:"애쥬어(azure)",beige:"베이지(beige)",bisque:"비스크(bisque)",black:"블랙(black)",blanchedalmond:"블랜치 아몬드(blanched almond)",blue:"블루(blue)",blueviolet:"블루 바이올렛(blue-violet)",brown:"브라운(brown)",burlywood:"벌리우드(burlywood)",cadetblue:"카뎃 블루(cadet blue)",chartreuse:"샤르트뢰즈(chartreuse)",chocolate:"초콜렛(chocolate)",coral:"코랄(coral)",cornflowerblue:"콘플라워 블루(cornflower blue)",cornsilk:"콘실크(cornsilk)",crimson:"크림슨(crimson)",cyan:"시안(cyan)",darkblue:"다크 블루(dark blue)",darkcyan:"다크 시안(dark cyan)",darkgoldenrod:"다크 골든로드(dark goldenrod)",darkgray:"다크 그레이(dark gray)",darkgreen:"다크 그린(dark green)",darkgrey:"다크 그레이(dark gray)",darkkhaki:"다크 카키(dark khaki)",darkmagenta:"다크 마젠타(dark magenta)",darkolivegreen:"다크 올리브 그린(dark olive green)",darkorange:"다크 오렌지(dark orange)",darkorchid:"다크 오키드(dark orchid)",darkred:"다크 레드(dark red)",darksalmon:"다크 샐몬(dark salmon)",darkseagreen:"다크 씨 그린(dark sea green)",darkslateblue:"다크 슬레이트 블루(dark slate blue)",darkslategray:"다크 슬레이트 그레이(dark slate gray)",darkslategrey:"다크 슬레이트 그레이(dark slate gray)",darkturquoise:"다크 터콰즈(dark turquoise)",darkviolet:"다크 바이올렛(dark violet)",deeppink:"딥 핑크(deep pink)",deepskyblue:"딥 스카이 블루(deep sky blue)",dimgray:"딤 그레이(dim gray)",dimgrey:"딤 그레이(dim gray)",dodgerblue:"다저 블루(dodger blue)",firebrick:"파이어 브릭(fire brick)",floralwhite:"플로랄 화이트(floral white)",forestgreen:"포레스트 그린(forest green)",fuchsia:"후크샤(fuchsia)",gainsboro:"게인스브로(gainsboro)",ghostwhite:"고스트 화이트(ghost white)",gold:"골드(gold)",goldenrod:"골든로드(goldenrod)",gray:"그레이(gray)",green:"그린(green)",greenyellow:"그린 옐로우(green-yellow)",grey:"그레이(gray)",honeydew:"허니듀(honeydew)",hotpink:"핫 핑크(hot pink)",indianred:"인디안 레드(indian red)",indigo:"인디고(indigo)",ivory:"아이보리(ivory)",khaki:"카키(khaki)",lavender:"라벤더(lavender)",lavenderblush:"라벤더 블러쉬(lavender blush)",lawngreen:"론 그린(lawn green)",lemonchiffon:"레몬 쉬폰(lemon chiffon)",lightblue:"라이트 블루(light blue)",lightcoral:"라이트 코랄(light coral)",lightcyan:"라이트 시안(light cyan)",lightgoldenrodyellow:"라이트 골든로드 옐로우(light goldenrod yellow)",lightgray:"라이트 그레이(light gray)",lightgreen:"라이트 그린(light green)",lightgrey:"라이트 그레이(light gray)",lightpink:"라이트 핑크(light pink)",lightsalmon:"라이트 샐몬(light salmon)",lightseagreen:"라이트 씨 그린(light sea green)",lightskyblue:"라이트 스카이 블루(light sky blue)",lightslategray:"라이트 슬레이트 그레이(light slate gray)",lightslategrey:"라이트 슬레이트 그레이(light slate gray)",lightsteelblue:"라이트 스틸 블루(light steel blue)",lightyellow:"라이트 옐로우(light yellow)",lime:"라임(lime)",limegreen:"라임 그린(lime green)",linen:"리넨(linen)",magenta:"마젠타(magenta)",maroon:"마룬(maroon)",mediumaquamarine:"미디엄 아쿠아마린(medium aquamarine)",mediumblue:"미디엄 블루(medium blue)",mediumorchid:"미디엄 오키드(medium orchid)",mediumpurple:"미디엄 퍼플(medium purple)",mediumseagreen:"미디엄 씨 그린(medium sea green)",mediumslateblue:"미디엄 슬레이트 블루(medium slate blue)",mediumspringgreen:"미디엄 스프링 그린(medium spring green)",mediumturquoise:"미디엄 터콰즈(medium turquoise)",mediumvioletred:"미디엄 바이올렛 레드(medium violet-red)",midnightblue:"미드나잇 블루(midnight blue)",mintcream:"민트 크림(mint cream)",mistyrose:"미스티 로즈(misty rose)",moccasin:"모카신(moccasin)",navajowhite:"나바호 화이트(navajo white)",navy:"네이비(navy)",oldlace:"올드 레이스(old lace)",olive:"올리브(olive)",olivedrab:"올리브 드랩(olive drab)",orange:"오렌지(orange)",orangered:"오렌지 레드(orange red)",orchid:"오키드(orchid)",palegoldenrod:"페일 골든로드(pale goldenrod)",palegreen:"페일 그린(pale green)",paleturquoise:"페일 터콰즈(pale turquoise)",palevioletred:"페일 바이올렛 레드(pale violet-red)",papayawhip:"파파야 휩(papaya whip)",peachpuff:"피치 퍼프(peach puff)",peru:"페루(peru)",pink:"핑크(pink)",plum:"플럼(plum)",powderblue:"파우더 블루(powder blue)",purple:"퍼플(purple)",red:"레드(red)",rosybrown:"로지 브라운(rosy brown)",royalblue:"로얄 블루(royal blue)",saddlebrown:"새들 브라운(saddle brown)",salmon:"샐몬(salmon)",sandybrown:"샌디 브라운(sandy brown)",seagreen:"씨 그린(sea green)",seashell:"씨쉘(seashell)",sienna:"시에나(sienna)",silver:"실버(silver)",skyblue:"스카이 블루(sky blue)",slateblue:"슬레이트 블루(slate blue)",slategray:"슬레이트 그레이(slate gray)",slategrey:"슬레이트 그레이(slate gray)",snow:"스노우(snow)",springgreen:"스프링 그린(spring green)",steelblue:"스틸 블루(steel blue)",tan:"탠(tan)",teal:"틸(teal)",thistle:"시슬(thistle)",tomato:"토마토(tomato)",transparent:"투명(transparent)",turquoise:"터콰즈(turquoise)",violet:"바이올렛(violet)",wheat:"휘트(wheat)",white:"화이트(white)",whitesmoke:"화이트 스모크(white smoke)",yellow:"옐로우(yellow)",yellowgreen:"옐로우 그린(yellow green)"})); \ No newline at end of file
diff --git a/lib/dojo/nls/ko/colors.js.uncompressed.js b/lib/dojo/nls/ko/colors.js.uncompressed.js
new file mode 100644
index 000000000..901b3c9db
--- /dev/null
+++ b/lib/dojo/nls/ko/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/ko/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "앨리스 블루(alice blue)",
+ antiquewhite: "앤틱 화이트(antique white)",
+ aqua: "아쿠아(aqua)",
+ aquamarine: "아쿠아마린(aquamarine)",
+ azure: "애쥬어(azure)",
+ beige: "베이지(beige)",
+ bisque: "비스크(bisque)",
+ black: "블랙(black)",
+ blanchedalmond: "블랜치 아몬드(blanched almond)",
+ blue: "블루(blue)",
+ blueviolet: "블루 바이올렛(blue-violet)",
+ brown: "브라운(brown)",
+ burlywood: "벌리우드(burlywood)",
+ cadetblue: "카뎃 블루(cadet blue)",
+ chartreuse: "샤르트뢰즈(chartreuse)",
+ chocolate: "초콜렛(chocolate)",
+ coral: "코랄(coral)",
+ cornflowerblue: "콘플라워 블루(cornflower blue)",
+ cornsilk: "콘실크(cornsilk)",
+ crimson: "크림슨(crimson)",
+ cyan: "시안(cyan)",
+ darkblue: "다크 블루(dark blue)",
+ darkcyan: "다크 시안(dark cyan)",
+ darkgoldenrod: "다크 골든로드(dark goldenrod)",
+ darkgray: "다크 그레이(dark gray)",
+ darkgreen: "다크 그린(dark green)",
+ darkgrey: "다크 그레이(dark gray)", // same as darkgray
+ darkkhaki: "다크 카키(dark khaki)",
+ darkmagenta: "다크 마젠타(dark magenta)",
+ darkolivegreen: "다크 올리브 그린(dark olive green)",
+ darkorange: "다크 오렌지(dark orange)",
+ darkorchid: "다크 오키드(dark orchid)",
+ darkred: "다크 레드(dark red)",
+ darksalmon: "다크 샐몬(dark salmon)",
+ darkseagreen: "다크 씨 그린(dark sea green)",
+ darkslateblue: "다크 슬레이트 블루(dark slate blue)",
+ darkslategray: "다크 슬레이트 그레이(dark slate gray)",
+ darkslategrey: "다크 슬레이트 그레이(dark slate gray)", // same as darkslategray
+ darkturquoise: "다크 터콰즈(dark turquoise)",
+ darkviolet: "다크 바이올렛(dark violet)",
+ deeppink: "딥 핑크(deep pink)",
+ deepskyblue: "딥 스카이 블루(deep sky blue)",
+ dimgray: "딤 그레이(dim gray)",
+ dimgrey: "딤 그레이(dim gray)", // same as dimgray
+ dodgerblue: "다저 블루(dodger blue)",
+ firebrick: "파이어 브릭(fire brick)",
+ floralwhite: "플로랄 화이트(floral white)",
+ forestgreen: "포레스트 그린(forest green)",
+ fuchsia: "후크샤(fuchsia)",
+ gainsboro: "게인스브로(gainsboro)",
+ ghostwhite: "고스트 화이트(ghost white)",
+ gold: "골드(gold)",
+ goldenrod: "골든로드(goldenrod)",
+ gray: "그레이(gray)",
+ green: "그린(green)",
+ greenyellow: "그린 옐로우(green-yellow)",
+ grey: "그레이(gray)", // same as gray
+ honeydew: "허니듀(honeydew)",
+ hotpink: "핫 핑크(hot pink)",
+ indianred: "인디안 레드(indian red)",
+ indigo: "인디고(indigo)",
+ ivory: "아이보리(ivory)",
+ khaki: "카키(khaki)",
+ lavender: "라벤더(lavender)",
+ lavenderblush: "라벤더 블러쉬(lavender blush)",
+ lawngreen: "론 그린(lawn green)",
+ lemonchiffon: "레몬 쉬폰(lemon chiffon)",
+ lightblue: "라이트 블루(light blue)",
+ lightcoral: "라이트 코랄(light coral)",
+ lightcyan: "라이트 시안(light cyan)",
+ lightgoldenrodyellow: "라이트 골든로드 옐로우(light goldenrod yellow)",
+ lightgray: "라이트 그레이(light gray)",
+ lightgreen: "라이트 그린(light green)",
+ lightgrey: "라이트 그레이(light gray)", // same as lightgray
+ lightpink: "라이트 핑크(light pink)",
+ lightsalmon: "라이트 샐몬(light salmon)",
+ lightseagreen: "라이트 씨 그린(light sea green)",
+ lightskyblue: "라이트 스카이 블루(light sky blue)",
+ lightslategray: "라이트 슬레이트 그레이(light slate gray)",
+ lightslategrey: "라이트 슬레이트 그레이(light slate gray)", // same as lightslategray
+ lightsteelblue: "라이트 스틸 블루(light steel blue)",
+ lightyellow: "라이트 옐로우(light yellow)",
+ lime: "라임(lime)",
+ limegreen: "라임 그린(lime green)",
+ linen: "리넨(linen)",
+ magenta: "마젠타(magenta)",
+ maroon: "마룬(maroon)",
+ mediumaquamarine: "미디엄 아쿠아마린(medium aquamarine)",
+ mediumblue: "미디엄 블루(medium blue)",
+ mediumorchid: "미디엄 오키드(medium orchid)",
+ mediumpurple: "미디엄 퍼플(medium purple)",
+ mediumseagreen: "미디엄 씨 그린(medium sea green)",
+ mediumslateblue: "미디엄 슬레이트 블루(medium slate blue)",
+ mediumspringgreen: "미디엄 스프링 그린(medium spring green)",
+ mediumturquoise: "미디엄 터콰즈(medium turquoise)",
+ mediumvioletred: "미디엄 바이올렛 레드(medium violet-red)",
+ midnightblue: "미드나잇 블루(midnight blue)",
+ mintcream: "민트 크림(mint cream)",
+ mistyrose: "미스티 로즈(misty rose)",
+ moccasin: "모카신(moccasin)",
+ navajowhite: "나바호 화이트(navajo white)",
+ navy: "네이비(navy)",
+ oldlace: "올드 레이스(old lace)",
+ olive: "올리브(olive)",
+ olivedrab: "올리브 드랩(olive drab)",
+ orange: "오렌지(orange)",
+ orangered: "오렌지 레드(orange red)",
+ orchid: "오키드(orchid)",
+ palegoldenrod: "페일 골든로드(pale goldenrod)",
+ palegreen: "페일 그린(pale green)",
+ paleturquoise: "페일 터콰즈(pale turquoise)",
+ palevioletred: "페일 바이올렛 레드(pale violet-red)",
+ papayawhip: "파파야 휩(papaya whip)",
+ peachpuff: "피치 퍼프(peach puff)",
+ peru: "페루(peru)",
+ pink: "핑크(pink)",
+ plum: "플럼(plum)",
+ powderblue: "파우더 블루(powder blue)",
+ purple: "퍼플(purple)",
+ red: "레드(red)",
+ rosybrown: "로지 브라운(rosy brown)",
+ royalblue: "로얄 블루(royal blue)",
+ saddlebrown: "새들 브라운(saddle brown)",
+ salmon: "샐몬(salmon)",
+ sandybrown: "샌디 브라운(sandy brown)",
+ seagreen: "씨 그린(sea green)",
+ seashell: "씨쉘(seashell)",
+ sienna: "시에나(sienna)",
+ silver: "실버(silver)",
+ skyblue: "스카이 블루(sky blue)",
+ slateblue: "슬레이트 블루(slate blue)",
+ slategray: "슬레이트 그레이(slate gray)",
+ slategrey: "슬레이트 그레이(slate gray)", // same as slategray
+ snow: "스노우(snow)",
+ springgreen: "스프링 그린(spring green)",
+ steelblue: "스틸 블루(steel blue)",
+ tan: "탠(tan)",
+ teal: "틸(teal)",
+ thistle: "시슬(thistle)",
+ tomato: "토마토(tomato)",
+ transparent: "투명(transparent)",
+ turquoise: "터콰즈(turquoise)",
+ violet: "바이올렛(violet)",
+ wheat: "휘트(wheat)",
+ white: "화이트(white)",
+ whitesmoke: "화이트 스모크(white smoke)",
+ yellow: "옐로우(yellow)",
+ yellowgreen: "옐로우 그린(yellow green)"
+})
+);
diff --git a/lib/dojo/nls/nb/colors.js b/lib/dojo/nls/nb/colors.js
index 15770a404..eb382badf 100644
--- a/lib/dojo/nls/nb/colors.js
+++ b/lib/dojo/nls/nb/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"lys stålblå","orangered":"rødoransje","midnightblue":"midnattsblå","cadetblue":"mørk grønnblå","seashell":"skjellhvit","slategrey":"skifergrå","coral":"korall","darkturquoise":"mørk turkis","antiquewhite":"antikk hvit","mediumspringgreen":"middels vårgrønn","salmon":"lakserosa","darkgrey":"mørk grå","ivory":"elfenbenshvit","greenyellow":"gulgrønn","mistyrose":"lys rosenrød","lightsalmon":"lys lakserosa","silver":"sølvfarget","dimgrey":"mørk mørkegrå","orange":"oransje","white":"hvit","navajowhite":"gulbrun","royalblue":"kongeblå","deeppink":"dyp rosa","lime":"lime","oldlace":"kniplingshvit","chartreuse":"løvgrønn","darkcyan":"mørk cyan","yellow":"gul","linen":"lin","olive":"oliven","gold":"gull","lawngreen":"plengrønn","lightyellow":"lys gul","tan":"matt mellombrun","darkviolet":"mørk fiolett","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grønn","deepskyblue":"dyp himmelblå","aqua":"akva","sienna":"nøttebrun","mintcream":"mintkrem","rosybrown":"brunlilla","mediumslateblue":"middels skiferblå","magenta":"magenta","lightseagreen":"lys sjøgrønn","cyan":"cyan","olivedrab":"middels olivengrønn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"middels akvamarin","lavender":"lavendel","mediumseagreen":"middels sjøgrønn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"middels turkis","ghostwhite":"egghvit","darkblue":"mørk blå","mediumvioletred":"middels fiolettrød","brown":"brun","lightgray":"lys grå","sandybrown":"sandbrun","pink":"rosa","firebrick":"mursteinsrød","indigo":"indigo","snow":"snøhvit","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"sjokolade","springgreen":"vårgrønn","moccasin":"lys gulbrun","navy":"marineblå","lemonchiffon":"ferskenfarget","teal":"mørk grønnblå","floralwhite":"blomsterhvit","cornflowerblue":"kornblå","paleturquoise":"svak turkis","purple":"purpur","gainsboro":"lys lys grå","plum":"plommefarget","red":"rød","blue":"blå","forestgreen":"skoggrønn","darkgreen":"mørk grønn","honeydew":"grønnhvit","darkseagreen":"mørk sjøgrønn","lightcoral":"lys korall","palevioletred":"svak fiolettrød","mediumpurple":"middels purpur","saddlebrown":"mørk nøttebrun","darkmagenta":"mørk magenta","thistle":"lys grålilla","whitesmoke":"røykhvit","wheat":"varm sienna","violet":"fiolett","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellomblå","skyblue":"himmelblå","crimson":"karmosinrødt","darksalmon":"mørk lakserosa","darkred":"mørk rød","darkslategrey":"mørk skifergrå","peru":"lys nøttebrun","lightgrey":"lys grå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"lys mandel","aliceblue":"blåhvit","bisque":"gulrosa","slategray":"skifergrå","palegoldenrod":"svak gyldenris","darkorange":"mørk oransje","aquamarine":"akvamarin","lightgreen":"lys grønn","burlywood":"matt mellombrun","dodgerblue":"lys havblå","darkgray":"mørk grå","lightcyan":"lys cyan","powderblue":"lys grønnblå","blueviolet":"blåfiolett","orchid":"orkide","dimgray":"mørk mørkegrå","beige":"beige","fuchsia":"fuksia","lavenderblush":"lillahvit","hotpink":"halvmørk rosa","steelblue":"stålblå","tomato":"tomatrød","lightpink":"lys rosa","limegreen":"limegrønn","indianred":"rustrød","papayawhip":"lys papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"middels orkide","cornsilk":"cornsilk","black":"svart","seagreen":"sjøgrønn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lys blå","palegreen":"svak grønn","azure":"asur","peachpuff":"brunrosa","darkolivegreen":"mørk olivengrønn","yellowgreen":"gulgrønn"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/nb/colors",({aliceblue:"blåhvit",antiquewhite:"antikk hvit",aqua:"akva",aquamarine:"akvamarin",azure:"asur",beige:"beige",bisque:"gulrosa",black:"svart",blanchedalmond:"lys mandel",blue:"blå",blueviolet:"blåfiolett",brown:"brun",burlywood:"matt mellombrun",cadetblue:"mørk grønnblå",chartreuse:"løvgrønn",chocolate:"sjokolade",coral:"korall",cornflowerblue:"kornblå",cornsilk:"cornsilk",crimson:"karmosinrødt",cyan:"cyan",darkblue:"mørk blå",darkcyan:"mørk cyan",darkgoldenrod:"mørk gyldenris",darkgray:"mørk grå",darkgreen:"mørk grønn",darkgrey:"mørk grå",darkkhaki:"mørk khaki",darkmagenta:"mørk magenta",darkolivegreen:"mørk olivengrønn",darkorange:"mørk oransje",darkorchid:"mørk orkide",darkred:"mørk rød",darksalmon:"mørk lakserosa",darkseagreen:"mørk sjøgrønn",darkslateblue:"mørk skiferblå",darkslategray:"mørk skifergrå",darkslategrey:"mørk skifergrå",darkturquoise:"mørk turkis",darkviolet:"mørk fiolett",deeppink:"dyp rosa",deepskyblue:"dyp himmelblå",dimgray:"mørk mørkegrå",dimgrey:"mørk mørkegrå",dodgerblue:"lys havblå",firebrick:"mursteinsrød",floralwhite:"blomsterhvit",forestgreen:"skoggrønn",fuchsia:"fuksia",gainsboro:"lys lys grå",ghostwhite:"egghvit",gold:"gull",goldenrod:"gyldenris",gray:"grå",green:"grønn",greenyellow:"gulgrønn",grey:"grå",honeydew:"grønnhvit",hotpink:"halvmørk rosa",indianred:"rustrød",indigo:"indigo",ivory:"elfenbenshvit",khaki:"khaki",lavender:"lavendel",lavenderblush:"lillahvit",lawngreen:"plengrønn",lemonchiffon:"ferskenfarget",lightblue:"lys blå",lightcoral:"lys korall",lightcyan:"lys cyan",lightgoldenrodyellow:"lys gyldenrisgul",lightgray:"lys grå",lightgreen:"lys grønn",lightgrey:"lys grå",lightpink:"lys rosa",lightsalmon:"lys lakserosa",lightseagreen:"lys sjøgrønn",lightskyblue:"lys himmelblå",lightslategray:"lys skifergrå",lightslategrey:"lys skifergrå",lightsteelblue:"lys stålblå",lightyellow:"lys gul",lime:"lime",limegreen:"limegrønn",linen:"lin",magenta:"magenta",maroon:"rødbrun",mediumaquamarine:"middels akvamarin",mediumblue:"mellomblå",mediumorchid:"middels orkide",mediumpurple:"middels purpur",mediumseagreen:"middels sjøgrønn",mediumslateblue:"middels skiferblå",mediumspringgreen:"middels vårgrønn",mediumturquoise:"middels turkis",mediumvioletred:"middels fiolettrød",midnightblue:"midnattsblå",mintcream:"mintkrem",mistyrose:"lys rosenrød",moccasin:"lys gulbrun",navajowhite:"gulbrun",navy:"marineblå",oldlace:"kniplingshvit",olive:"oliven",olivedrab:"middels olivengrønn",orange:"oransje",orangered:"rødoransje",orchid:"orkide",palegoldenrod:"svak gyldenris",palegreen:"svak grønn",paleturquoise:"svak turkis",palevioletred:"svak fiolettrød",papayawhip:"lys papaya",peachpuff:"brunrosa",peru:"lys nøttebrun",pink:"rosa",plum:"plommefarget",powderblue:"lys grønnblå",purple:"purpur",red:"rød",rosybrown:"brunlilla",royalblue:"kongeblå",saddlebrown:"mørk nøttebrun",salmon:"lakserosa",sandybrown:"sandbrun",seagreen:"sjøgrønn",seashell:"skjellhvit",sienna:"nøttebrun",silver:"sølvfarget",skyblue:"himmelblå",slateblue:"skiferblå",slategray:"skifergrå",slategrey:"skifergrå",snow:"snøhvit",springgreen:"vårgrønn",steelblue:"stålblå",tan:"matt mellombrun",teal:"mørk grønnblå",thistle:"lys grålilla",tomato:"tomatrød",transparent:"gjennomsiktig",turquoise:"turkis",violet:"fiolett",wheat:"varm sienna",white:"hvit",whitesmoke:"røykhvit",yellow:"gul",yellowgreen:"gulgrønn"})); \ No newline at end of file
diff --git a/lib/dojo/nls/nb/colors.js.uncompressed.js b/lib/dojo/nls/nb/colors.js.uncompressed.js
new file mode 100644
index 000000000..8345bbbea
--- /dev/null
+++ b/lib/dojo/nls/nb/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/nb/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "blåhvit",
+ antiquewhite: "antikk hvit",
+ aqua: "akva",
+ aquamarine: "akvamarin",
+ azure: "asur",
+ beige: "beige",
+ bisque: "gulrosa",
+ black: "svart",
+ blanchedalmond: "lys mandel",
+ blue: "blå",
+ blueviolet: "blåfiolett",
+ brown: "brun",
+ burlywood: "matt mellombrun",
+ cadetblue: "mørk grønnblå",
+ chartreuse: "løvgrønn",
+ chocolate: "sjokolade",
+ coral: "korall",
+ cornflowerblue: "kornblå",
+ cornsilk: "cornsilk",
+ crimson: "karmosinrødt",
+ cyan: "cyan",
+ darkblue: "mørk blå",
+ darkcyan: "mørk cyan",
+ darkgoldenrod: "mørk gyldenris",
+ darkgray: "mørk grå",
+ darkgreen: "mørk grønn",
+ darkgrey: "mørk grå", // same as darkgray
+ darkkhaki: "mørk khaki",
+ darkmagenta: "mørk magenta",
+ darkolivegreen: "mørk olivengrønn",
+ darkorange: "mørk oransje",
+ darkorchid: "mørk orkide",
+ darkred: "mørk rød",
+ darksalmon: "mørk lakserosa",
+ darkseagreen: "mørk sjøgrønn",
+ darkslateblue: "mørk skiferblå",
+ darkslategray: "mørk skifergrå",
+ darkslategrey: "mørk skifergrå", // same as darkslategray
+ darkturquoise: "mørk turkis",
+ darkviolet: "mørk fiolett",
+ deeppink: "dyp rosa",
+ deepskyblue: "dyp himmelblå",
+ dimgray: "mørk mørkegrå",
+ dimgrey: "mørk mørkegrå", // same as dimgray
+ dodgerblue: "lys havblå",
+ firebrick: "mursteinsrød",
+ floralwhite: "blomsterhvit",
+ forestgreen: "skoggrønn",
+ fuchsia: "fuksia",
+ gainsboro: "lys lys grå",
+ ghostwhite: "egghvit",
+ gold: "gull",
+ goldenrod: "gyldenris",
+ gray: "grå",
+ green: "grønn",
+ greenyellow: "gulgrønn",
+ grey: "grå", // same as gray
+ honeydew: "grønnhvit",
+ hotpink: "halvmørk rosa",
+ indianred: "rustrød",
+ indigo: "indigo",
+ ivory: "elfenbenshvit",
+ khaki: "khaki",
+ lavender: "lavendel",
+ lavenderblush: "lillahvit",
+ lawngreen: "plengrønn",
+ lemonchiffon: "ferskenfarget",
+ lightblue: "lys blå",
+ lightcoral: "lys korall",
+ lightcyan: "lys cyan",
+ lightgoldenrodyellow: "lys gyldenrisgul",
+ lightgray: "lys grå",
+ lightgreen: "lys grønn",
+ lightgrey: "lys grå", // same as lightgray
+ lightpink: "lys rosa",
+ lightsalmon: "lys lakserosa",
+ lightseagreen: "lys sjøgrønn",
+ lightskyblue: "lys himmelblå",
+ lightslategray: "lys skifergrå",
+ lightslategrey: "lys skifergrå", // same as lightslategray
+ lightsteelblue: "lys stålblå",
+ lightyellow: "lys gul",
+ lime: "lime",
+ limegreen: "limegrønn",
+ linen: "lin",
+ magenta: "magenta",
+ maroon: "rødbrun",
+ mediumaquamarine: "middels akvamarin",
+ mediumblue: "mellomblå",
+ mediumorchid: "middels orkide",
+ mediumpurple: "middels purpur",
+ mediumseagreen: "middels sjøgrønn",
+ mediumslateblue: "middels skiferblå",
+ mediumspringgreen: "middels vårgrønn",
+ mediumturquoise: "middels turkis",
+ mediumvioletred: "middels fiolettrød",
+ midnightblue: "midnattsblå",
+ mintcream: "mintkrem",
+ mistyrose: "lys rosenrød",
+ moccasin: "lys gulbrun",
+ navajowhite: "gulbrun",
+ navy: "marineblå",
+ oldlace: "kniplingshvit",
+ olive: "oliven",
+ olivedrab: "middels olivengrønn",
+ orange: "oransje",
+ orangered: "rødoransje",
+ orchid: "orkide",
+ palegoldenrod: "svak gyldenris",
+ palegreen: "svak grønn",
+ paleturquoise: "svak turkis",
+ palevioletred: "svak fiolettrød",
+ papayawhip: "lys papaya",
+ peachpuff: "brunrosa",
+ peru: "lys nøttebrun",
+ pink: "rosa",
+ plum: "plommefarget",
+ powderblue: "lys grønnblå",
+ purple: "purpur",
+ red: "rød",
+ rosybrown: "brunlilla",
+ royalblue: "kongeblå",
+ saddlebrown: "mørk nøttebrun",
+ salmon: "lakserosa",
+ sandybrown: "sandbrun",
+ seagreen: "sjøgrønn",
+ seashell: "skjellhvit",
+ sienna: "nøttebrun",
+ silver: "sølvfarget",
+ skyblue: "himmelblå",
+ slateblue: "skiferblå",
+ slategray: "skifergrå",
+ slategrey: "skifergrå", // same as slategray
+ snow: "snøhvit",
+ springgreen: "vårgrønn",
+ steelblue: "stålblå",
+ tan: "matt mellombrun",
+ teal: "mørk grønnblå",
+ thistle: "lys grålilla",
+ tomato: "tomatrød",
+ transparent: "gjennomsiktig",
+ turquoise: "turkis",
+ violet: "fiolett",
+ wheat: "varm sienna",
+ white: "hvit",
+ whitesmoke: "røykhvit",
+ yellow: "gul",
+ yellowgreen: "gulgrønn"
+})
+);
diff --git a/lib/dojo/nls/nl/colors.js b/lib/dojo/nls/nl/colors.js
index ae0ccbf3f..6ce975069 100644
--- a/lib/dojo/nls/nl/colors.js
+++ b/lib/dojo/nls/nl/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"lichtstaalblauw","orangered":"oranjerood","midnightblue":"nachtblauw","cadetblue":"donkerstaalblauw","seashell":"schelp","slategrey":"leigrijs","coral":"koraalrood","darkturquoise":"donkerturquoise","antiquewhite":"antiekwit","mediumspringgreen":"midlentegroen","salmon":"zalm","darkgrey":"donkergrijs","ivory":"ivoorwit","greenyellow":"groengeel","mistyrose":"matroze","lightsalmon":"lichtzalm","silver":"zilvergrijs","dimgrey":"dofgrijs","orange":"oranje","white":"wit","navajowhite":"navajowit","royalblue":"koningsblauw","deeppink":"donkerroze","lime":"limoen","oldlace":"kant","chartreuse":"groengeel","darkcyan":"donkercyaan","yellow":"geel","linen":"linnen","olive":"olijfgroen","gold":"goud","lawngreen":"grasgroen","lightyellow":"lichtgeel","tan":"geelbruin","darkviolet":"donkerviolet","lightslategrey":"lichtblauwgrijs","grey":"grijs","darkkhaki":"donkerkaki","green":"groen","deepskyblue":"diephemelblauw","aqua":"aqua","sienna":"sienna","mintcream":"mintroomgeel","rosybrown":"roodbruin","mediumslateblue":"midgrijsblauw","magenta":"magenta","lightseagreen":"lichtzeegroen","cyan":"cyaan","olivedrab":"grijsbruin","darkgoldenrod":"donkergoud","slateblue":"leiblauw","mediumaquamarine":"midaquamarijn","lavender":"lavendelblauw","mediumseagreen":"midzeegroen","maroon":"kastanjebruin","darkslategray":"donkerblauwgrijs","mediumturquoise":"midturquoise","ghostwhite":"spierwit","darkblue":"donkerblauw","mediumvioletred":"midvioletrood","brown":"bruin","lightgray":"lichtgrijs","sandybrown":"zandbruin","pink":"roze","firebrick":"vuursteenrood","indigo":"indigo","snow":"sneeuwwit","darkorchid":"donkerorchidee","turquoise":"turquoise","chocolate":"chocoladebruin","springgreen":"lentegroen","moccasin":"moccasin","navy":"marineblauw","lemonchiffon":"citroengeel","teal":"grijsblauw","floralwhite":"rozewit","cornflowerblue":"korenbloemblauw","paleturquoise":"bleekturquoise","purple":"purper","gainsboro":"lichtblauwgrijs","plum":"pruim","red":"rood","blue":"blauw","forestgreen":"bosgroen","darkgreen":"donkergroen","honeydew":"meloen","darkseagreen":"donkerzeegroen","lightcoral":"lichtkoraal","palevioletred":"bleekvioletrood","mediumpurple":"midpurper","saddlebrown":"leerbruin","darkmagenta":"donkermagenta","thistle":"distel","whitesmoke":"rookwit","wheat":"tarwebruin","violet":"violet","lightskyblue":"lichthemelsblauw","goldenrod":"goudbruin","mediumblue":"midblauw","skyblue":"hemelsblauw","crimson":"karmozijnrood","darksalmon":"donkerzalm","darkred":"donkerrood","darkslategrey":"donkerblauwgrijs","peru":"bruin","lightgrey":"lichtgrijs","lightgoldenrodyellow":"lichtgoudgeel","blanchedalmond":"amandel","aliceblue":"lichtblauw","bisque":"oranjegeel","slategray":"leigrijs","palegoldenrod":"bleekgeel","darkorange":"donkeroranje","aquamarine":"aquamarijn","lightgreen":"lichtgroen","burlywood":"lichtbruin","dodgerblue":"helderblauw","darkgray":"donkergrijs","lightcyan":"lichtcyaan","powderblue":"lichtblauw-wit","blueviolet":"violet","orchid":"orchidee","dimgray":"dofgrijs","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelblos","hotpink":"acaciaroze","steelblue":"staalblauw","tomato":"tomaat","lightpink":"lichtroze","limegreen":"limoengroen","indianred":"indisch rood","papayawhip":"papajaroze","lightslategray":"lichtblauwgrijs","gray":"grijs","mediumorchid":"midorchidee","cornsilk":"maïsgeel","black":"zwart","seagreen":"zeegroen","darkslateblue":"donkergrijsblauw","khaki":"kaki","lightblue":"lichtblauw","palegreen":"bleekgroen","azure":"azuur","peachpuff":"perzikroze","darkolivegreen":"donkerolijfgroen","yellowgreen":"geelgroen"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/nl/colors",({aliceblue:"lichtblauw",antiquewhite:"antiekwit",aqua:"aqua",aquamarine:"aquamarijn",azure:"azuur",beige:"beige",bisque:"oranjegeel",black:"zwart",blanchedalmond:"amandel",blue:"blauw",blueviolet:"violet",brown:"bruin",burlywood:"lichtbruin",cadetblue:"donkerstaalblauw",chartreuse:"groengeel",chocolate:"chocoladebruin",coral:"koraalrood",cornflowerblue:"korenbloemblauw",cornsilk:"maïsgeel",crimson:"karmozijnrood",cyan:"cyaan",darkblue:"donkerblauw",darkcyan:"donkercyaan",darkgoldenrod:"donkergoud",darkgray:"donkergrijs",darkgreen:"donkergroen",darkgrey:"donkergrijs",darkkhaki:"donkerkaki",darkmagenta:"donkermagenta",darkolivegreen:"donkerolijfgroen",darkorange:"donkeroranje",darkorchid:"donkerorchidee",darkred:"donkerrood",darksalmon:"donkerzalm",darkseagreen:"donkerzeegroen",darkslateblue:"donkergrijsblauw",darkslategray:"donkerblauwgrijs",darkslategrey:"donkerblauwgrijs",darkturquoise:"donkerturquoise",darkviolet:"donkerviolet",deeppink:"donkerroze",deepskyblue:"diephemelblauw",dimgray:"dofgrijs",dimgrey:"dofgrijs",dodgerblue:"helderblauw",firebrick:"vuursteenrood",floralwhite:"rozewit",forestgreen:"bosgroen",fuchsia:"fuchsia",gainsboro:"lichtblauwgrijs",ghostwhite:"spierwit",gold:"goud",goldenrod:"goudbruin",gray:"grijs",green:"groen",greenyellow:"groengeel",grey:"grijs",honeydew:"meloen",hotpink:"acaciaroze",indianred:"indisch rood",indigo:"indigo",ivory:"ivoorwit",khaki:"kaki",lavender:"lavendelblauw",lavenderblush:"lavendelblos",lawngreen:"grasgroen",lemonchiffon:"citroengeel",lightblue:"lichtblauw",lightcoral:"lichtkoraal",lightcyan:"lichtcyaan",lightgoldenrodyellow:"lichtgoudgeel",lightgray:"lichtgrijs",lightgreen:"lichtgroen",lightgrey:"lichtgrijs",lightpink:"lichtroze",lightsalmon:"lichtzalm",lightseagreen:"lichtzeegroen",lightskyblue:"lichthemelsblauw",lightslategray:"lichtblauwgrijs",lightslategrey:"lichtblauwgrijs",lightsteelblue:"lichtstaalblauw",lightyellow:"lichtgeel",lime:"limoen",limegreen:"limoengroen",linen:"linnen",magenta:"magenta",maroon:"kastanjebruin",mediumaquamarine:"midaquamarijn",mediumblue:"midblauw",mediumorchid:"midorchidee",mediumpurple:"midpurper",mediumseagreen:"midzeegroen",mediumslateblue:"midgrijsblauw",mediumspringgreen:"midlentegroen",mediumturquoise:"midturquoise",mediumvioletred:"midvioletrood",midnightblue:"nachtblauw",mintcream:"mintroomgeel",mistyrose:"matroze",moccasin:"moccasin",navajowhite:"navajowit",navy:"marineblauw",oldlace:"kant",olive:"olijfgroen",olivedrab:"grijsbruin",orange:"oranje",orangered:"oranjerood",orchid:"orchidee",palegoldenrod:"bleekgeel",palegreen:"bleekgroen",paleturquoise:"bleekturquoise",palevioletred:"bleekvioletrood",papayawhip:"papajaroze",peachpuff:"perzikroze",peru:"bruin",pink:"roze",plum:"pruim",powderblue:"lichtblauw-wit",purple:"purper",red:"rood",rosybrown:"roodbruin",royalblue:"koningsblauw",saddlebrown:"leerbruin",salmon:"zalm",sandybrown:"zandbruin",seagreen:"zeegroen",seashell:"schelp",sienna:"sienna",silver:"zilvergrijs",skyblue:"hemelsblauw",slateblue:"leiblauw",slategray:"leigrijs",slategrey:"leigrijs",snow:"sneeuwwit",springgreen:"lentegroen",steelblue:"staalblauw",tan:"geelbruin",teal:"grijsblauw",thistle:"distel",tomato:"tomaat",transparent:"transparant",turquoise:"turquoise",violet:"violet",wheat:"tarwebruin",white:"wit",whitesmoke:"rookwit",yellow:"geel",yellowgreen:"geelgroen"})); \ No newline at end of file
diff --git a/lib/dojo/nls/nl/colors.js.uncompressed.js b/lib/dojo/nls/nl/colors.js.uncompressed.js
new file mode 100644
index 000000000..d4fa3d981
--- /dev/null
+++ b/lib/dojo/nls/nl/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/nl/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "lichtblauw",
+ antiquewhite: "antiekwit",
+ aqua: "aqua",
+ aquamarine: "aquamarijn",
+ azure: "azuur",
+ beige: "beige",
+ bisque: "oranjegeel",
+ black: "zwart",
+ blanchedalmond: "amandel",
+ blue: "blauw",
+ blueviolet: "violet",
+ brown: "bruin",
+ burlywood: "lichtbruin",
+ cadetblue: "donkerstaalblauw",
+ chartreuse: "groengeel",
+ chocolate: "chocoladebruin",
+ coral: "koraalrood",
+ cornflowerblue: "korenbloemblauw",
+ cornsilk: "maïsgeel",
+ crimson: "karmozijnrood",
+ cyan: "cyaan",
+ darkblue: "donkerblauw",
+ darkcyan: "donkercyaan",
+ darkgoldenrod: "donkergoud",
+ darkgray: "donkergrijs",
+ darkgreen: "donkergroen",
+ darkgrey: "donkergrijs", // same as darkgray
+ darkkhaki: "donkerkaki",
+ darkmagenta: "donkermagenta",
+ darkolivegreen: "donkerolijfgroen",
+ darkorange: "donkeroranje",
+ darkorchid: "donkerorchidee",
+ darkred: "donkerrood",
+ darksalmon: "donkerzalm",
+ darkseagreen: "donkerzeegroen",
+ darkslateblue: "donkergrijsblauw",
+ darkslategray: "donkerblauwgrijs",
+ darkslategrey: "donkerblauwgrijs", // same as darkslategray
+ darkturquoise: "donkerturquoise",
+ darkviolet: "donkerviolet",
+ deeppink: "donkerroze",
+ deepskyblue: "diephemelblauw",
+ dimgray: "dofgrijs",
+ dimgrey: "dofgrijs", // same as dimgray
+ dodgerblue: "helderblauw",
+ firebrick: "vuursteenrood",
+ floralwhite: "rozewit",
+ forestgreen: "bosgroen",
+ fuchsia: "fuchsia",
+ gainsboro: "lichtblauwgrijs",
+ ghostwhite: "spierwit",
+ gold: "goud",
+ goldenrod: "goudbruin",
+ gray: "grijs",
+ green: "groen",
+ greenyellow: "groengeel",
+ grey: "grijs", // same as gray
+ honeydew: "meloen",
+ hotpink: "acaciaroze",
+ indianred: "indisch rood",
+ indigo: "indigo",
+ ivory: "ivoorwit",
+ khaki: "kaki",
+ lavender: "lavendelblauw",
+ lavenderblush: "lavendelblos",
+ lawngreen: "grasgroen",
+ lemonchiffon: "citroengeel",
+ lightblue: "lichtblauw",
+ lightcoral: "lichtkoraal",
+ lightcyan: "lichtcyaan",
+ lightgoldenrodyellow: "lichtgoudgeel",
+ lightgray: "lichtgrijs",
+ lightgreen: "lichtgroen",
+ lightgrey: "lichtgrijs", // same as lightgray
+ lightpink: "lichtroze",
+ lightsalmon: "lichtzalm",
+ lightseagreen: "lichtzeegroen",
+ lightskyblue: "lichthemelsblauw",
+ lightslategray: "lichtblauwgrijs",
+ lightslategrey: "lichtblauwgrijs", // same as lightslategray
+ lightsteelblue: "lichtstaalblauw",
+ lightyellow: "lichtgeel",
+ lime: "limoen",
+ limegreen: "limoengroen",
+ linen: "linnen",
+ magenta: "magenta",
+ maroon: "kastanjebruin",
+ mediumaquamarine: "midaquamarijn",
+ mediumblue: "midblauw",
+ mediumorchid: "midorchidee",
+ mediumpurple: "midpurper",
+ mediumseagreen: "midzeegroen",
+ mediumslateblue: "midgrijsblauw",
+ mediumspringgreen: "midlentegroen",
+ mediumturquoise: "midturquoise",
+ mediumvioletred: "midvioletrood",
+ midnightblue: "nachtblauw",
+ mintcream: "mintroomgeel",
+ mistyrose: "matroze",
+ moccasin: "moccasin",
+ navajowhite: "navajowit",
+ navy: "marineblauw",
+ oldlace: "kant",
+ olive: "olijfgroen",
+ olivedrab: "grijsbruin",
+ orange: "oranje",
+ orangered: "oranjerood",
+ orchid: "orchidee",
+ palegoldenrod: "bleekgeel",
+ palegreen: "bleekgroen",
+ paleturquoise: "bleekturquoise",
+ palevioletred: "bleekvioletrood",
+ papayawhip: "papajaroze",
+ peachpuff: "perzikroze",
+ peru: "bruin",
+ pink: "roze",
+ plum: "pruim",
+ powderblue: "lichtblauw-wit",
+ purple: "purper",
+ red: "rood",
+ rosybrown: "roodbruin",
+ royalblue: "koningsblauw",
+ saddlebrown: "leerbruin",
+ salmon: "zalm",
+ sandybrown: "zandbruin",
+ seagreen: "zeegroen",
+ seashell: "schelp",
+ sienna: "sienna",
+ silver: "zilvergrijs",
+ skyblue: "hemelsblauw",
+ slateblue: "leiblauw",
+ slategray: "leigrijs",
+ slategrey: "leigrijs", // same as slategray
+ snow: "sneeuwwit",
+ springgreen: "lentegroen",
+ steelblue: "staalblauw",
+ tan: "geelbruin",
+ teal: "grijsblauw",
+ thistle: "distel",
+ tomato: "tomaat",
+ transparent: "transparant",
+ turquoise: "turquoise",
+ violet: "violet",
+ wheat: "tarwebruin",
+ white: "wit",
+ whitesmoke: "rookwit",
+ yellow: "geel",
+ yellowgreen: "geelgroen"
+})
+);
diff --git a/lib/dojo/nls/pl/colors.js b/lib/dojo/nls/pl/colors.js
index 2fa71bd1b..f685b4957 100644
--- a/lib/dojo/nls/pl/colors.js
+++ b/lib/dojo/nls/pl/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"jasnostalowoniebieski","orangered":"pomarańczowoczerwony","midnightblue":"granatowoczarny","cadetblue":"niebieskoszary","seashell":"matowoliliowy","slategrey":"mysi","coral":"koralowy","darkturquoise":"mlecznoturkusowy","antiquewhite":"biel antyczna","mediumspringgreen":"średnia wiosenna zieleń","salmon":"łososiowy","darkgrey":"ciemnoszary","ivory":"kość słoniowa","greenyellow":"zielonożółty","mistyrose":"bladoróżany","lightsalmon":"jasnołososiowy","silver":"srebrny","dimgrey":"przyciemniony szary","orange":"pomarańczowy","white":"biały","navajowhite":"piaskowy","royalblue":"królewski błękit","deeppink":"głęboki różowy","lime":"limonkowy","oldlace":"bladopomarańczowy","chartreuse":"żółtooliwkowy","darkcyan":"ciemnoniebieskozielony","yellow":"żółty","linen":"lniany","olive":"oliwkowy","gold":"złoty","lawngreen":"trawiasty","lightyellow":"jasnożółty","tan":"śniady","darkviolet":"ciemnofiołkowy","lightslategrey":"jasny mysi","grey":"szary","darkkhaki":"ciemny khaki","green":"zielony","deepskyblue":"intensywny błękit nieba","aqua":"morski","sienna":"siena","mintcream":"jasnomiętowy","rosybrown":"różowobrązowy","mediumslateblue":"średni gołębi","magenta":"amarantowy","lightseagreen":"jasna zieleń morska","cyan":"niebieskozielony","olivedrab":"oliwkowa zieleń","darkgoldenrod":"ciemne stare złoto","slateblue":"gołębi","mediumaquamarine":"średnia akwamaryna","lavender":"lawendowy","mediumseagreen":"średnia zieleń morska","maroon":"kasztanowy","darkslategray":"ciemny mysi","mediumturquoise":"średni turkusowy","ghostwhite":"bladobiały","darkblue":"ciemnoniebieski","mediumvioletred":"średni fiołkowowoczerwony","brown":"brązowy","lightgray":"jasnoszary","sandybrown":"piaskowy brąz","pink":"różowy","firebrick":"ceglasty","indigo":"indygo","snow":"śnieżny","darkorchid":"ciemna orchidea","turquoise":"turkusowy","chocolate":"czekoladowy","springgreen":"wiosenna zieleń","moccasin":"mokasynowy","navy":"granatowy","lemonchiffon":"cytrynowy","teal":"zielonomodry","floralwhite":"kwiatowa biel","cornflowerblue":"chabrowy","paleturquoise":"bladoturkusowy","purple":"fioletowy","gainsboro":"bladoszary","plum":"śliwkowy","red":"czerwony","blue":"niebieski","forestgreen":"leśna zieleń","darkgreen":"ciemnozielony","honeydew":"miodowy","darkseagreen":"ciemna zieleń morska","lightcoral":"jasnokoralowy","palevioletred":"blady fiołkowoczerwony","mediumpurple":"średni fioletowy","saddlebrown":"brąz skórzany","darkmagenta":"ciemnoamarantowy","thistle":"bladofioletowy","whitesmoke":"przydymiony biały","wheat":"pszeniczny","violet":"fiołkowy","lightskyblue":"jasny błękit nieba","goldenrod":"stare złoto","mediumblue":"ciemnochabrowy","skyblue":"błękit nieba","crimson":"karmazynowy","darksalmon":"ciemnołososiowy","darkred":"ciemnoczerwony","darkslategrey":"ciemny mysi","peru":"jasnobrązowy","lightgrey":"jasnoszary","lightgoldenrodyellow":"jasnożółte stare złoto","blanchedalmond":"migdałowy","aliceblue":"bladoniebieski","bisque":"biszkoptowy","slategray":"mysi","palegoldenrod":"blade stare złoto","darkorange":"ciemnopomarańczowy","aquamarine":"akwamaryna","lightgreen":"jasnozielony","burlywood":"kolor drewna","dodgerblue":"błękit Dodgers","darkgray":"ciemnoszary","lightcyan":"jasnoniebieskozielony","powderblue":"jasnobladobłękitny","blueviolet":"błękitnofiołkowy","orchid":"orchidea","dimgray":"przyciemniony szary","beige":"beżowy","fuchsia":"fuksjowy","lavenderblush":"lawendowocielisty","hotpink":"odblaskoworóżowy","steelblue":"stalowoniebieski","tomato":"pomidorowy","lightpink":"jasnoróżowy","limegreen":"zielony limonkowy","indianred":"kasztanowy","papayawhip":"papaja","lightslategray":"jasny mysi","gray":"szary","mediumorchid":"średnia orchidea","cornsilk":"kukurydziany","black":"czarny","seagreen":"zieleń morska","darkslateblue":"ciemny gołębi","khaki":"khaki","lightblue":"jasnoniebieski","palegreen":"bladozielony","azure":"lazurowy","peachpuff":"brzoskwiniowy","darkolivegreen":"ciemnooliwkowy","yellowgreen":"żółtozielony"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/pl/colors",({aliceblue:"bladoniebieski",antiquewhite:"biel antyczna",aqua:"morski",aquamarine:"akwamaryna",azure:"lazurowy",beige:"beżowy",bisque:"cielistobeżowy",black:"czarny",blanchedalmond:"obrany migdał",blue:"niebieski",blueviolet:"błękitnofiołkowy",brown:"brązowy",burlywood:"piaskowobeżowy",cadetblue:"szaroniebieski",chartreuse:"żółtooliwkowy",chocolate:"czekoladowy",coral:"koralowy",cornflowerblue:"niebieskochabrowy",cornsilk:"białożółty",crimson:"karmazynowy",cyan:"niebieskozielony",darkblue:"ciemnoniebieski",darkcyan:"ciemnoniebieskozielony",darkgoldenrod:"ciemne stare złoto",darkgray:"ciemnoszary",darkgreen:"ciemnozielony",darkgrey:"ciemnoszary",darkkhaki:"ciemny khaki",darkmagenta:"ciemnoamarantowy",darkolivegreen:"ciemnooliwkowozielony",darkorange:"ciemnopomarańczowy",darkorchid:"ciemna orchidea",darkred:"ciemnoczerwony",darksalmon:"ciemnołososiowy",darkseagreen:"ciemna zieleń morska",darkslateblue:"ciemny gołębi",darkslategray:"ciemny mysi",darkslategrey:"ciemny mysi",darkturquoise:"ciemnoturkusowy",darkviolet:"ciemnofiołkowy",deeppink:"głęboki róż",deepskyblue:"intensywny błękit nieba",dimgray:"przyciemniony szary",dimgrey:"przyciemniony szary",dodgerblue:"niebieski Dodgersów",firebrick:"podpalana cegła",floralwhite:"złamana biel",forestgreen:"leśna zieleń",fuchsia:"fuksjowy",gainsboro:"jasnoniebieskawoszary",ghostwhite:"sina biel",gold:"złoty",goldenrod:"stare złoto",gray:"szary",green:"zielony",greenyellow:"zielonożółty",grey:"szary",honeydew:"miodowy",hotpink:"odblaskoworóżowy",indianred:"kasztanowy",indigo:"indygo",ivory:"kość słoniowa",khaki:"khaki",lavender:"lawendowy",lavenderblush:"lawendoworóżowy",lawngreen:"trawiasty",lemonchiffon:"babka cytrynowa",lightblue:"jasnoniebieski",lightcoral:"jasnokoralowy",lightcyan:"jasnoniebieskozielony",lightgoldenrodyellow:"jasne stare złoto",lightgray:"jasnoszary",lightgreen:"jasnozielony",lightgrey:"jasnoszary",lightpink:"jasnoróżowy",lightsalmon:"jasnołososiowy",lightseagreen:"jasna zieleń morska",lightskyblue:"jasny błękit nieba",lightslategray:"jasny mysi",lightslategrey:"jasny mysi",lightsteelblue:"jasnostalowoniebieski",lightyellow:"jasnożółty",lime:"limonkowy",limegreen:"limonkowozielony",linen:"lniany",magenta:"amarantowy",maroon:"rdzawoczerwony",mediumaquamarine:"średnia akwamaryna",mediumblue:"średni niebieski",mediumorchid:"średnia orchidea",mediumpurple:"średni fioletowy",mediumseagreen:"średnia zieleń morska",mediumslateblue:"średni gołębi",mediumspringgreen:"średnia wiosenna zieleń",mediumturquoise:"średni turkusowy",mediumvioletred:"średni fiołkowowoczerwony",midnightblue:"atramentowoniebieski",mintcream:"miętowokremowy",mistyrose:"mglistoróżany",moccasin:"mokasynowy",navajowhite:"biel Nawaho",navy:"granatowy",oldlace:"ecru",olive:"oliwkowy",olivedrab:"oliwkowozielony",orange:"pomarańczowy",orangered:"czerwona pomarańcza",orchid:"orchidea",palegoldenrod:"blade stare złoto",palegreen:"bladozielony",paleturquoise:"bladoturkusowy",palevioletred:"bladofiołkowoczerwony",papayawhip:"kremowa papaja",peachpuff:"cielisty brzoskwiniowy",peru:"palona glina",pink:"różowy",plum:"śliwkowy",powderblue:"jasnobladobłękitny",purple:"fioletowy",red:"czerwony",rosybrown:"różanobrązowy",royalblue:"królewska purpura",saddlebrown:"brąz skórzany",salmon:"łososiowy",sandybrown:"piaskowobrązowy",seagreen:"zieleń morska",seashell:"matowoliliowy",sienna:"sjena",silver:"srebrny",skyblue:"błękit nieba",slateblue:"gołębi",slategray:"mysi",slategrey:"mysi",snow:"śnieżny",springgreen:"wiosenna zieleń",steelblue:"stalowoniebieski",tan:"śniady",teal:"zielonomodry",thistle:"kwiat ostu",tomato:"pomidorowy",transparent:"przezroczysty",turquoise:"turkusowy",violet:"fiołkowy",wheat:"pszeniczny",white:"biały",whitesmoke:"siwy",yellow:"żółty",yellowgreen:"żółtozielony"})); \ No newline at end of file
diff --git a/lib/dojo/nls/pl/colors.js.uncompressed.js b/lib/dojo/nls/pl/colors.js.uncompressed.js
new file mode 100644
index 000000000..ad95f626a
--- /dev/null
+++ b/lib/dojo/nls/pl/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/pl/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "bladoniebieski",
+ antiquewhite: "biel antyczna",
+ aqua: "morski",
+ aquamarine: "akwamaryna",
+ azure: "lazurowy",
+ beige: "beżowy",
+ bisque: "cielistobeżowy",
+ black: "czarny",
+ blanchedalmond: "obrany migdał",
+ blue: "niebieski",
+ blueviolet: "błękitnofiołkowy",
+ brown: "brązowy",
+ burlywood: "piaskowobeżowy",
+ cadetblue: "szaroniebieski",
+ chartreuse: "żółtooliwkowy",
+ chocolate: "czekoladowy",
+ coral: "koralowy",
+ cornflowerblue: "niebieskochabrowy",
+ cornsilk: "białożółty",
+ crimson: "karmazynowy",
+ cyan: "niebieskozielony",
+ darkblue: "ciemnoniebieski",
+ darkcyan: "ciemnoniebieskozielony",
+ darkgoldenrod: "ciemne stare złoto",
+ darkgray: "ciemnoszary",
+ darkgreen: "ciemnozielony",
+ darkgrey: "ciemnoszary", // same as darkgray
+ darkkhaki: "ciemny khaki",
+ darkmagenta: "ciemnoamarantowy",
+ darkolivegreen: "ciemnooliwkowozielony",
+ darkorange: "ciemnopomarańczowy",
+ darkorchid: "ciemna orchidea",
+ darkred: "ciemnoczerwony",
+ darksalmon: "ciemnołososiowy",
+ darkseagreen: "ciemna zieleń morska",
+ darkslateblue: "ciemny gołębi",
+ darkslategray: "ciemny mysi",
+ darkslategrey: "ciemny mysi", // same as darkslategray
+ darkturquoise: "ciemnoturkusowy",
+ darkviolet: "ciemnofiołkowy",
+ deeppink: "głęboki róż",
+ deepskyblue: "intensywny błękit nieba",
+ dimgray: "przyciemniony szary",
+ dimgrey: "przyciemniony szary", // same as dimgray
+ dodgerblue: "niebieski Dodgersów",
+ firebrick: "podpalana cegła",
+ floralwhite: "złamana biel",
+ forestgreen: "leśna zieleń",
+ fuchsia: "fuksjowy",
+ gainsboro: "jasnoniebieskawoszary",
+ ghostwhite: "sina biel",
+ gold: "złoty",
+ goldenrod: "stare złoto",
+ gray: "szary",
+ green: "zielony",
+ greenyellow: "zielonożółty",
+ grey: "szary", // same as gray
+ honeydew: "miodowy",
+ hotpink: "odblaskoworóżowy",
+ indianred: "kasztanowy",
+ indigo: "indygo",
+ ivory: "kość słoniowa",
+ khaki: "khaki",
+ lavender: "lawendowy",
+ lavenderblush: "lawendoworóżowy",
+ lawngreen: "trawiasty",
+ lemonchiffon: "babka cytrynowa",
+ lightblue: "jasnoniebieski",
+ lightcoral: "jasnokoralowy",
+ lightcyan: "jasnoniebieskozielony",
+ lightgoldenrodyellow: "jasne stare złoto",
+ lightgray: "jasnoszary",
+ lightgreen: "jasnozielony",
+ lightgrey: "jasnoszary", // same as lightgray
+ lightpink: "jasnoróżowy",
+ lightsalmon: "jasnołososiowy",
+ lightseagreen: "jasna zieleń morska",
+ lightskyblue: "jasny błękit nieba",
+ lightslategray: "jasny mysi",
+ lightslategrey: "jasny mysi", // same as lightslategray
+ lightsteelblue: "jasnostalowoniebieski",
+ lightyellow: "jasnożółty",
+ lime: "limonkowy",
+ limegreen: "limonkowozielony",
+ linen: "lniany",
+ magenta: "amarantowy",
+ maroon: "rdzawoczerwony",
+ mediumaquamarine: "średnia akwamaryna",
+ mediumblue: "średni niebieski",
+ mediumorchid: "średnia orchidea",
+ mediumpurple: "średni fioletowy",
+ mediumseagreen: "średnia zieleń morska",
+ mediumslateblue: "średni gołębi",
+ mediumspringgreen: "średnia wiosenna zieleń",
+ mediumturquoise: "średni turkusowy",
+ mediumvioletred: "średni fiołkowowoczerwony",
+ midnightblue: "atramentowoniebieski",
+ mintcream: "miętowokremowy",
+ mistyrose: "mglistoróżany",
+ moccasin: "mokasynowy",
+ navajowhite: "biel Nawaho",
+ navy: "granatowy",
+ oldlace: "ecru",
+ olive: "oliwkowy",
+ olivedrab: "oliwkowozielony",
+ orange: "pomarańczowy",
+ orangered: "czerwona pomarańcza",
+ orchid: "orchidea",
+ palegoldenrod: "blade stare złoto",
+ palegreen: "bladozielony",
+ paleturquoise: "bladoturkusowy",
+ palevioletred: "bladofiołkowoczerwony",
+ papayawhip: "kremowa papaja",
+ peachpuff: "cielisty brzoskwiniowy",
+ peru: "palona glina",
+ pink: "różowy",
+ plum: "śliwkowy",
+ powderblue: "jasnobladobłękitny",
+ purple: "fioletowy",
+ red: "czerwony",
+ rosybrown: "różanobrązowy",
+ royalblue: "królewska purpura",
+ saddlebrown: "brąz skórzany",
+ salmon: "łososiowy",
+ sandybrown: "piaskowobrązowy",
+ seagreen: "zieleń morska",
+ seashell: "matowoliliowy",
+ sienna: "sjena",
+ silver: "srebrny",
+ skyblue: "błękit nieba",
+ slateblue: "gołębi",
+ slategray: "mysi",
+ slategrey: "mysi", // same as slategray
+ snow: "śnieżny",
+ springgreen: "wiosenna zieleń",
+ steelblue: "stalowoniebieski",
+ tan: "śniady",
+ teal: "zielonomodry",
+ thistle: "kwiat ostu",
+ tomato: "pomidorowy",
+ transparent: "przezroczysty",
+ turquoise: "turkusowy",
+ violet: "fiołkowy",
+ wheat: "pszeniczny",
+ white: "biały",
+ whitesmoke: "siwy",
+ yellow: "żółty",
+ yellowgreen: "żółtozielony"
+})
+);
diff --git a/lib/dojo/nls/pt-pt/colors.js b/lib/dojo/nls/pt-pt/colors.js
index 5038b537e..484fe5b09 100644
--- a/lib/dojo/nls/pt-pt/colors.js
+++ b/lib/dojo/nls/pt-pt/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"azul-aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadete","seashell":"concha","slategrey":"cinzento ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","salmon":"salmão","darkgrey":"cinzento escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa pálido","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinzento esbatido","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul real","deeppink":"rosa profundo","lime":"lima","oldlace":"renda antiga","chartreuse":"amarelo esverdeado","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"azeitona","gold":"dourado","lawngreen":"verde relva","lightyellow":"amarelo claro","tan":"castanho claro","darkviolet":"violeta escuro","lightslategrey":"cinzento ardósia claro","grey":"cinzento","darkkhaki":"caqui escuro","green":"verde","deepskyblue":"azul céu profundo","aqua":"verde-água","sienna":"castanho-avermelhado","mintcream":"creme de menta","rosybrown":"castanho rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"azeitona claro","darkgoldenrod":"ouro velho escuro","slateblue":"azul ardósia","mediumaquamarine":"verde-azulado médio","lavender":"alfazema","mediumseagreen":"verde marinho médio","maroon":"bordeaux","darkslategray":"cinzento ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco sombreado","darkblue":"azul escuro","mediumvioletred":"violeta avermelhado médio","brown":"castanho","lightgray":"cinzento claro","sandybrown":"castanho areia","pink":"rosa","firebrick":"tijolo fogo","indigo":"índigo","snow":"branco-neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"mocassim","navy":"azul marinho","lemonchiffon":"limão chiffon","teal":"verde-azulado","floralwhite":"branco floral","cornflowerblue":"azul-violáceo","paleturquoise":"turquesa pálido","purple":"roxo","gainsboro":"cinzento azulado claro","plum":"cor-de-ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"mel","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"violeta avermelhado pálido","mediumpurple":"roxo médio","saddlebrown":"castanho sela","darkmagenta":"magenta escuro","thistle":"cardo","whitesmoke":"fumo branco","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"ouro velho","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinzento ardósia escuro","peru":"peru","lightgrey":"cinzento claro","lightgoldenrodyellow":"ouro velho amarelado claro","blanchedalmond":"amêndoa claro","aliceblue":"azul alice","bisque":"rosa-velho","slategray":"cinzento ardósia","palegoldenrod":"ouro velho pálido","darkorange":"laranja escuro","aquamarine":"verde-azulado","lightgreen":"verde claro","burlywood":"castanho pinho","dodgerblue":"azul furtivo","darkgray":"cinzento escuro","lightcyan":"ciano claro","powderblue":"azul de esmalte","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinzento esbatido","beige":"bege","fuchsia":"fúcsia","lavenderblush":"alfazema rosado","hotpink":"rosa forte","steelblue":"azul-aço","tomato":"vermelho tomate","lightpink":"rosa claro","limegreen":"verde-lima","indianred":"almagre","papayawhip":"creme de papaia","lightslategray":"cinzento ardósia claro","gray":"cinzento","mediumorchid":"orquídea médio","cornsilk":"branco seda","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"azul-celeste","peachpuff":"pêssego","darkolivegreen":"verde-azeitona escuro","yellowgreen":"verde amarelado"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/pt-pt/colors",({aliceblue:"azul alice",antiquewhite:"branco antigo",aqua:"verde-água",aquamarine:"verde-azulado",azure:"azul-celeste",beige:"bege",bisque:"rosa-velho",black:"preto",blanchedalmond:"amêndoa claro",blue:"azul",blueviolet:"azul violeta",brown:"castanho",burlywood:"castanho pinho",cadetblue:"azul cadete",chartreuse:"amarelo esverdeado",chocolate:"chocolate",coral:"coral",cornflowerblue:"azul-violáceo",cornsilk:"branco seda",crimson:"carmesim",cyan:"ciano",darkblue:"azul escuro",darkcyan:"ciano escuro",darkgoldenrod:"ouro velho escuro",darkgray:"cinzento escuro",darkgreen:"verde escuro",darkgrey:"cinzento escuro",darkkhaki:"caqui escuro",darkmagenta:"magenta escuro",darkolivegreen:"verde-azeitona escuro",darkorange:"laranja escuro",darkorchid:"orquídea escuro",darkred:"vermelho escuro",darksalmon:"salmão escuro",darkseagreen:"verde marinho escuro",darkslateblue:"azul ardósia escuro",darkslategray:"cinzento ardósia escuro",darkslategrey:"cinzento ardósia escuro",darkturquoise:"turquesa escuro",darkviolet:"violeta escuro",deeppink:"rosa profundo",deepskyblue:"azul céu profundo",dimgray:"cinzento esbatido",dimgrey:"cinzento esbatido",dodgerblue:"azul furtivo",firebrick:"tijolo fogo",floralwhite:"branco floral",forestgreen:"verde floresta",fuchsia:"fúcsia",gainsboro:"cinzento azulado claro",ghostwhite:"branco sombreado",gold:"dourado",goldenrod:"ouro velho",gray:"cinzento",green:"verde",greenyellow:"amarelo esverdeado",grey:"cinzento",honeydew:"mel",hotpink:"rosa forte",indianred:"almagre",indigo:"índigo",ivory:"marfim",khaki:"caqui",lavender:"alfazema",lavenderblush:"alfazema rosado",lawngreen:"verde relva",lemonchiffon:"limão chiffon",lightblue:"azul claro",lightcoral:"coral claro",lightcyan:"ciano claro",lightgoldenrodyellow:"ouro velho amarelado claro",lightgray:"cinzento claro",lightgreen:"verde claro",lightgrey:"cinzento claro",lightpink:"rosa claro",lightsalmon:"salmão claro",lightseagreen:"verde marinho claro",lightskyblue:"azul céu claro",lightslategray:"cinzento ardósia claro",lightslategrey:"cinzento ardósia claro",lightsteelblue:"azul-aço claro",lightyellow:"amarelo claro",lime:"lima",limegreen:"verde-lima",linen:"linho",magenta:"magenta",maroon:"bordeaux",mediumaquamarine:"verde-azulado médio",mediumblue:"azul médio",mediumorchid:"orquídea médio",mediumpurple:"roxo médio",mediumseagreen:"verde marinho médio",mediumslateblue:"azul ardósia médio",mediumspringgreen:"verde primavera médio",mediumturquoise:"turquesa médio",mediumvioletred:"violeta avermelhado médio",midnightblue:"azul meia-noite",mintcream:"creme de menta",mistyrose:"rosa pálido",moccasin:"mocassim",navajowhite:"branco navajo",navy:"azul marinho",oldlace:"renda antiga",olive:"azeitona",olivedrab:"azeitona claro",orange:"laranja",orangered:"vermelho alaranjado",orchid:"orquídea",palegoldenrod:"ouro velho pálido",palegreen:"verde pálido",paleturquoise:"turquesa pálido",palevioletred:"violeta avermelhado pálido",papayawhip:"creme de papaia",peachpuff:"pêssego",peru:"peru",pink:"rosa",plum:"cor-de-ameixa",powderblue:"azul de esmalte",purple:"roxo",red:"vermelho",rosybrown:"castanho rosado",royalblue:"azul real",saddlebrown:"castanho sela",salmon:"salmão",sandybrown:"castanho areia",seagreen:"verde marinho",seashell:"concha",sienna:"castanho-avermelhado",silver:"prateado",skyblue:"azul céu",slateblue:"azul ardósia",slategray:"cinzento ardósia",slategrey:"cinzento ardósia",snow:"branco-neve",springgreen:"verde primavera",steelblue:"azul-aço",tan:"castanho claro",teal:"verde-azulado",thistle:"cardo",tomato:"vermelho tomate",transparent:"transparente",turquoise:"turquesa",violet:"violeta",wheat:"trigo",white:"branco",whitesmoke:"fumo branco",yellow:"amarelo",yellowgreen:"verde amarelado"})); \ No newline at end of file
diff --git a/lib/dojo/nls/pt-pt/colors.js.uncompressed.js b/lib/dojo/nls/pt-pt/colors.js.uncompressed.js
new file mode 100644
index 000000000..542b7a101
--- /dev/null
+++ b/lib/dojo/nls/pt-pt/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/pt-pt/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "azul alice",
+ antiquewhite: "branco antigo",
+ aqua: "verde-água",
+ aquamarine: "verde-azulado",
+ azure: "azul-celeste",
+ beige: "bege",
+ bisque: "rosa-velho",
+ black: "preto",
+ blanchedalmond: "amêndoa claro",
+ blue: "azul",
+ blueviolet: "azul violeta",
+ brown: "castanho",
+ burlywood: "castanho pinho",
+ cadetblue: "azul cadete",
+ chartreuse: "amarelo esverdeado",
+ chocolate: "chocolate",
+ coral: "coral",
+ cornflowerblue: "azul-violáceo",
+ cornsilk: "branco seda",
+ crimson: "carmesim",
+ cyan: "ciano",
+ darkblue: "azul escuro",
+ darkcyan: "ciano escuro",
+ darkgoldenrod: "ouro velho escuro",
+ darkgray: "cinzento escuro",
+ darkgreen: "verde escuro",
+ darkgrey: "cinzento escuro", // same as darkgray
+ darkkhaki: "caqui escuro",
+ darkmagenta: "magenta escuro",
+ darkolivegreen: "verde-azeitona escuro",
+ darkorange: "laranja escuro",
+ darkorchid: "orquídea escuro",
+ darkred: "vermelho escuro",
+ darksalmon: "salmão escuro",
+ darkseagreen: "verde marinho escuro",
+ darkslateblue: "azul ardósia escuro",
+ darkslategray: "cinzento ardósia escuro",
+ darkslategrey: "cinzento ardósia escuro", // same as darkslategray
+ darkturquoise: "turquesa escuro",
+ darkviolet: "violeta escuro",
+ deeppink: "rosa profundo",
+ deepskyblue: "azul céu profundo",
+ dimgray: "cinzento esbatido",
+ dimgrey: "cinzento esbatido", // same as dimgray
+ dodgerblue: "azul furtivo",
+ firebrick: "tijolo fogo",
+ floralwhite: "branco floral",
+ forestgreen: "verde floresta",
+ fuchsia: "fúcsia",
+ gainsboro: "cinzento azulado claro",
+ ghostwhite: "branco sombreado",
+ gold: "dourado",
+ goldenrod: "ouro velho",
+ gray: "cinzento",
+ green: "verde",
+ greenyellow: "amarelo esverdeado",
+ grey: "cinzento", // same as gray
+ honeydew: "mel",
+ hotpink: "rosa forte",
+ indianred: "almagre",
+ indigo: "índigo",
+ ivory: "marfim",
+ khaki: "caqui",
+ lavender: "alfazema",
+ lavenderblush: "alfazema rosado",
+ lawngreen: "verde relva",
+ lemonchiffon: "limão chiffon",
+ lightblue: "azul claro",
+ lightcoral: "coral claro",
+ lightcyan: "ciano claro",
+ lightgoldenrodyellow: "ouro velho amarelado claro",
+ lightgray: "cinzento claro",
+ lightgreen: "verde claro",
+ lightgrey: "cinzento claro", // same as lightgray
+ lightpink: "rosa claro",
+ lightsalmon: "salmão claro",
+ lightseagreen: "verde marinho claro",
+ lightskyblue: "azul céu claro",
+ lightslategray: "cinzento ardósia claro",
+ lightslategrey: "cinzento ardósia claro", // same as lightslategray
+ lightsteelblue: "azul-aço claro",
+ lightyellow: "amarelo claro",
+ lime: "lima",
+ limegreen: "verde-lima",
+ linen: "linho",
+ magenta: "magenta",
+ maroon: "bordeaux",
+ mediumaquamarine: "verde-azulado médio",
+ mediumblue: "azul médio",
+ mediumorchid: "orquídea médio",
+ mediumpurple: "roxo médio",
+ mediumseagreen: "verde marinho médio",
+ mediumslateblue: "azul ardósia médio",
+ mediumspringgreen: "verde primavera médio",
+ mediumturquoise: "turquesa médio",
+ mediumvioletred: "violeta avermelhado médio",
+ midnightblue: "azul meia-noite",
+ mintcream: "creme de menta",
+ mistyrose: "rosa pálido",
+ moccasin: "mocassim",
+ navajowhite: "branco navajo",
+ navy: "azul marinho",
+ oldlace: "renda antiga",
+ olive: "azeitona",
+ olivedrab: "azeitona claro",
+ orange: "laranja",
+ orangered: "vermelho alaranjado",
+ orchid: "orquídea",
+ palegoldenrod: "ouro velho pálido",
+ palegreen: "verde pálido",
+ paleturquoise: "turquesa pálido",
+ palevioletred: "violeta avermelhado pálido",
+ papayawhip: "creme de papaia",
+ peachpuff: "pêssego",
+ peru: "peru",
+ pink: "rosa",
+ plum: "cor-de-ameixa",
+ powderblue: "azul de esmalte",
+ purple: "roxo",
+ red: "vermelho",
+ rosybrown: "castanho rosado",
+ royalblue: "azul real",
+ saddlebrown: "castanho sela",
+ salmon: "salmão",
+ sandybrown: "castanho areia",
+ seagreen: "verde marinho",
+ seashell: "concha",
+ sienna: "castanho-avermelhado",
+ silver: "prateado",
+ skyblue: "azul céu",
+ slateblue: "azul ardósia",
+ slategray: "cinzento ardósia",
+ slategrey: "cinzento ardósia", // same as slategray
+ snow: "branco-neve",
+ springgreen: "verde primavera",
+ steelblue: "azul-aço",
+ tan: "castanho claro",
+ teal: "verde-azulado",
+ thistle: "cardo",
+ tomato: "vermelho tomate",
+ transparent: "transparente",
+ turquoise: "turquesa",
+ violet: "violeta",
+ wheat: "trigo",
+ white: "branco",
+ whitesmoke: "fumo branco",
+ yellow: "amarelo",
+ yellowgreen: "verde amarelado"
+})
+);
diff --git a/lib/dojo/nls/pt/colors.js b/lib/dojo/nls/pt/colors.js
index 0695a0ff6..71c34682e 100644
--- a/lib/dojo/nls/pt/colors.js
+++ b/lib/dojo/nls/pt/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"azul aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","salmon":"salmão","darkgrey":"cinza escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa enevoado","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinza turvo","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul royal","deeppink":"rosa profundo","lime":"lima","oldlace":"cadarço velho","chartreuse":"chartreuse","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"oliva","gold":"dourado","lawngreen":"verde grama","lightyellow":"amarelo claro","tan":"tan","darkviolet":"violeta escuro","lightslategrey":"cinza ardósia claro","grey":"cinza","darkkhaki":"cáqui escuro","green":"verde","deepskyblue":"azul céu intenso","aqua":"aqua","sienna":"sienna","mintcream":"creme de menta","rosybrown":"marrom rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"verde oliva","darkgoldenrod":"goldenrod escuro","slateblue":"azul ardósia","mediumaquamarine":"água marinha médio","lavender":"lavanda","mediumseagreen":"verde marinho médio","maroon":"castanho","darkslategray":"cinza ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco ghost","darkblue":"azul escuro","mediumvioletred":"vermelho violeta médio","brown":"marrom","lightgray":"cinza claro","sandybrown":"marrom cor de areia","pink":"rosa","firebrick":"firebrick","indigo":"índigo","snow":"branco neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"moccasin","navy":"marinho","lemonchiffon":"limão chiffon","teal":"azul esverdeado","floralwhite":"branco floral","cornflowerblue":"azul centaurea","paleturquoise":"turquesa esbranquiçado","purple":"roxo","gainsboro":"gainsboro","plum":"ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"honeydew","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"vermelho violeta esbranquiçado","mediumpurple":"roxo médio","saddlebrown":"marrom saddle","darkmagenta":"magenta escuro","thistle":"thistle","whitesmoke":"fumaça branca","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"goldenrod","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinza ardósia escuro","peru":"peru","lightgrey":"cinza claro","lightgoldenrodyellow":"amarelo goldenrod claro","blanchedalmond":"amêndoa pelada","aliceblue":"azul alice","bisque":"bisque","slategray":"cinza ardósia","palegoldenrod":"goldenrod esbranquiçado","darkorange":"laranja escuro","aquamarine":"água marinha","lightgreen":"verde claro","burlywood":"burlywood","dodgerblue":"azul dodger","darkgray":"cinza escuro","lightcyan":"ciano claro","powderblue":"azul talco","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinza turvo","beige":"bege","fuchsia":"fúcsia","lavenderblush":"lavanda avermelhada","hotpink":"rosa quente","steelblue":"azul aço","tomato":"tomate","lightpink":"rosa claro","limegreen":"verde lima","indianred":"vermelho indiano","papayawhip":"creme de papaya","lightslategray":"cinza ardósia claro","gray":"cinza","mediumorchid":"orquídea médio","cornsilk":"cornsilk","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"cáqui","lightblue":"azul claro","palegreen":"verde esbranquiçado","azure":"azul celeste","peachpuff":"peach puff","darkolivegreen":"verde oliva escuro","yellowgreen":"verde amarelado"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/pt/colors",({aliceblue:"azul alice",antiquewhite:"branco antigo",aqua:"aqua",aquamarine:"água marinha",azure:"azul celeste",beige:"bege",bisque:"bisque",black:"preto",blanchedalmond:"amêndoa pelada",blue:"azul",blueviolet:"azul violeta",brown:"marrom",burlywood:"burlywood",cadetblue:"azul cadet",chartreuse:"chartreuse",chocolate:"chocolate",coral:"coral",cornflowerblue:"azul centaurea",cornsilk:"cornsilk",crimson:"carmesim",cyan:"ciano",darkblue:"azul escuro",darkcyan:"ciano escuro",darkgoldenrod:"goldenrod escuro",darkgray:"cinza escuro",darkgreen:"verde escuro",darkgrey:"cinza escuro",darkkhaki:"cáqui escuro",darkmagenta:"magenta escuro",darkolivegreen:"verde oliva escuro",darkorange:"laranja escuro",darkorchid:"orquídea escuro",darkred:"vermelho escuro",darksalmon:"salmão escuro",darkseagreen:"verde marinho escuro",darkslateblue:"azul ardósia escuro",darkslategray:"cinza ardósia escuro",darkslategrey:"cinza ardósia escuro",darkturquoise:"turquesa escuro",darkviolet:"violeta escuro",deeppink:"rosa profundo",deepskyblue:"azul céu intenso",dimgray:"cinza turvo",dimgrey:"cinza turvo",dodgerblue:"azul dodger",firebrick:"firebrick",floralwhite:"branco floral",forestgreen:"verde floresta",fuchsia:"fúcsia",gainsboro:"gainsboro",ghostwhite:"branco ghost",gold:"dourado",goldenrod:"goldenrod",gray:"cinza",green:"verde",greenyellow:"amarelo esverdeado",grey:"cinza",honeydew:"honeydew",hotpink:"rosa quente",indianred:"vermelho indiano",indigo:"índigo",ivory:"marfim",khaki:"cáqui",lavender:"lavanda",lavenderblush:"lavanda avermelhada",lawngreen:"verde grama",lemonchiffon:"limão chiffon",lightblue:"azul claro",lightcoral:"coral claro",lightcyan:"ciano claro",lightgoldenrodyellow:"amarelo goldenrod claro",lightgray:"cinza claro",lightgreen:"verde claro",lightgrey:"cinza claro",lightpink:"rosa claro",lightsalmon:"salmão claro",lightseagreen:"verde marinho claro",lightskyblue:"azul céu claro",lightslategray:"cinza ardósia claro",lightslategrey:"cinza ardósia claro",lightsteelblue:"azul aço claro",lightyellow:"amarelo claro",lime:"lima",limegreen:"verde lima",linen:"linho",magenta:"magenta",maroon:"castanho",mediumaquamarine:"água marinha médio",mediumblue:"azul médio",mediumorchid:"orquídea médio",mediumpurple:"roxo médio",mediumseagreen:"verde marinho médio",mediumslateblue:"azul ardósia médio",mediumspringgreen:"verde primavera médio",mediumturquoise:"turquesa médio",mediumvioletred:"vermelho violeta médio",midnightblue:"azul meia-noite",mintcream:"creme de menta",mistyrose:"rosa enevoado",moccasin:"moccasin",navajowhite:"branco navajo",navy:"marinho",oldlace:"cadarço velho",olive:"oliva",olivedrab:"verde oliva",orange:"laranja",orangered:"vermelho alaranjado",orchid:"orquídea",palegoldenrod:"goldenrod esbranquiçado",palegreen:"verde esbranquiçado",paleturquoise:"turquesa esbranquiçado",palevioletred:"vermelho violeta esbranquiçado",papayawhip:"creme de papaya",peachpuff:"peach puff",peru:"peru",pink:"rosa",plum:"ameixa",powderblue:"azul talco",purple:"roxo",red:"vermelho",rosybrown:"marrom rosado",royalblue:"azul royal",saddlebrown:"marrom saddle",salmon:"salmão",sandybrown:"marrom cor de areia",seagreen:"verde marinho",seashell:"seashell",sienna:"sienna",silver:"prateado",skyblue:"azul céu",slateblue:"azul ardósia",slategray:"cinza ardósia",slategrey:"cinza ardósia",snow:"branco neve",springgreen:"verde primavera",steelblue:"azul aço",tan:"tan",teal:"azul esverdeado",thistle:"thistle",tomato:"tomate",transparent:"transparente",turquoise:"turquesa",violet:"violeta",wheat:"trigo",white:"branco",whitesmoke:"fumaça branca",yellow:"amarelo",yellowgreen:"verde amarelado"})); \ No newline at end of file
diff --git a/lib/dojo/nls/pt/colors.js.uncompressed.js b/lib/dojo/nls/pt/colors.js.uncompressed.js
new file mode 100644
index 000000000..02893b563
--- /dev/null
+++ b/lib/dojo/nls/pt/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/pt/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "azul alice",
+ antiquewhite: "branco antigo",
+ aqua: "aqua",
+ aquamarine: "água marinha",
+ azure: "azul celeste",
+ beige: "bege",
+ bisque: "bisque",
+ black: "preto",
+ blanchedalmond: "amêndoa pelada",
+ blue: "azul",
+ blueviolet: "azul violeta",
+ brown: "marrom",
+ burlywood: "burlywood",
+ cadetblue: "azul cadet",
+ chartreuse: "chartreuse",
+ chocolate: "chocolate",
+ coral: "coral",
+ cornflowerblue: "azul centaurea",
+ cornsilk: "cornsilk",
+ crimson: "carmesim",
+ cyan: "ciano",
+ darkblue: "azul escuro",
+ darkcyan: "ciano escuro",
+ darkgoldenrod: "goldenrod escuro",
+ darkgray: "cinza escuro",
+ darkgreen: "verde escuro",
+ darkgrey: "cinza escuro", // same as darkgray
+ darkkhaki: "cáqui escuro",
+ darkmagenta: "magenta escuro",
+ darkolivegreen: "verde oliva escuro",
+ darkorange: "laranja escuro",
+ darkorchid: "orquídea escuro",
+ darkred: "vermelho escuro",
+ darksalmon: "salmão escuro",
+ darkseagreen: "verde marinho escuro",
+ darkslateblue: "azul ardósia escuro",
+ darkslategray: "cinza ardósia escuro",
+ darkslategrey: "cinza ardósia escuro", // same as darkslategray
+ darkturquoise: "turquesa escuro",
+ darkviolet: "violeta escuro",
+ deeppink: "rosa profundo",
+ deepskyblue: "azul céu intenso",
+ dimgray: "cinza turvo",
+ dimgrey: "cinza turvo", // same as dimgray
+ dodgerblue: "azul dodger",
+ firebrick: "firebrick",
+ floralwhite: "branco floral",
+ forestgreen: "verde floresta",
+ fuchsia: "fúcsia",
+ gainsboro: "gainsboro",
+ ghostwhite: "branco ghost",
+ gold: "dourado",
+ goldenrod: "goldenrod",
+ gray: "cinza",
+ green: "verde",
+ greenyellow: "amarelo esverdeado",
+ grey: "cinza", // same as gray
+ honeydew: "honeydew",
+ hotpink: "rosa quente",
+ indianred: "vermelho indiano",
+ indigo: "índigo",
+ ivory: "marfim",
+ khaki: "cáqui",
+ lavender: "lavanda",
+ lavenderblush: "lavanda avermelhada",
+ lawngreen: "verde grama",
+ lemonchiffon: "limão chiffon",
+ lightblue: "azul claro",
+ lightcoral: "coral claro",
+ lightcyan: "ciano claro",
+ lightgoldenrodyellow: "amarelo goldenrod claro",
+ lightgray: "cinza claro",
+ lightgreen: "verde claro",
+ lightgrey: "cinza claro", // same as lightgray
+ lightpink: "rosa claro",
+ lightsalmon: "salmão claro",
+ lightseagreen: "verde marinho claro",
+ lightskyblue: "azul céu claro",
+ lightslategray: "cinza ardósia claro",
+ lightslategrey: "cinza ardósia claro", // same as lightslategray
+ lightsteelblue: "azul aço claro",
+ lightyellow: "amarelo claro",
+ lime: "lima",
+ limegreen: "verde lima",
+ linen: "linho",
+ magenta: "magenta",
+ maroon: "castanho",
+ mediumaquamarine: "água marinha médio",
+ mediumblue: "azul médio",
+ mediumorchid: "orquídea médio",
+ mediumpurple: "roxo médio",
+ mediumseagreen: "verde marinho médio",
+ mediumslateblue: "azul ardósia médio",
+ mediumspringgreen: "verde primavera médio",
+ mediumturquoise: "turquesa médio",
+ mediumvioletred: "vermelho violeta médio",
+ midnightblue: "azul meia-noite",
+ mintcream: "creme de menta",
+ mistyrose: "rosa enevoado",
+ moccasin: "moccasin",
+ navajowhite: "branco navajo",
+ navy: "marinho",
+ oldlace: "cadarço velho",
+ olive: "oliva",
+ olivedrab: "verde oliva",
+ orange: "laranja",
+ orangered: "vermelho alaranjado",
+ orchid: "orquídea",
+ palegoldenrod: "goldenrod esbranquiçado",
+ palegreen: "verde esbranquiçado",
+ paleturquoise: "turquesa esbranquiçado",
+ palevioletred: "vermelho violeta esbranquiçado",
+ papayawhip: "creme de papaya",
+ peachpuff: "peach puff",
+ peru: "peru",
+ pink: "rosa",
+ plum: "ameixa",
+ powderblue: "azul talco",
+ purple: "roxo",
+ red: "vermelho",
+ rosybrown: "marrom rosado",
+ royalblue: "azul royal",
+ saddlebrown: "marrom saddle",
+ salmon: "salmão",
+ sandybrown: "marrom cor de areia",
+ seagreen: "verde marinho",
+ seashell: "seashell",
+ sienna: "sienna",
+ silver: "prateado",
+ skyblue: "azul céu",
+ slateblue: "azul ardósia",
+ slategray: "cinza ardósia",
+ slategrey: "cinza ardósia", // same as slategray
+ snow: "branco neve",
+ springgreen: "verde primavera",
+ steelblue: "azul aço",
+ tan: "tan",
+ teal: "azul esverdeado",
+ thistle: "thistle",
+ tomato: "tomate",
+ transparent: "transparente",
+ turquoise: "turquesa",
+ violet: "violeta",
+ wheat: "trigo",
+ white: "branco",
+ whitesmoke: "fumaça branca",
+ yellow: "amarelo",
+ yellowgreen: "verde amarelado"
+})
+);
diff --git a/lib/dojo/nls/ro/colors.js b/lib/dojo/nls/ro/colors.js
index 9652ce590..87e6682c0 100644
--- a/lib/dojo/nls/ro/colors.js
+++ b/lib/dojo/nls/ro/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"light steel blue","orangered":"roşu portocaliu","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"cochilie","slategrey":"gri ardezie","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"somon","darkgrey":"gri închis","ivory":"ivoriu","greenyellow":"verde-galben","mistyrose":"trandafiriu obscur","lightsalmon":"somon deschis","silver":"argintiu","dimgrey":"dim gray","orange":"portocaliu","white":"alb","navajowhite":"navajo white","royalblue":"albastru regal","deeppink":"roz închis","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"cyan închis","yellow":"galben","linen":"linen","olive":"oliv","gold":"auriu","lawngreen":"lawn green","lightyellow":"galben deschis","tan":"tan","darkviolet":"violet închis","lightslategrey":"light slate gray","grey":"gri","darkkhaki":"kaki închis","green":"verde","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"maro trandafiriu","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"verde marin deschis","cyan":"cyan","olivedrab":"maron-gălbui oliv","darkgoldenrod":"goldenrod închis","slateblue":"albastru ardezie","mediumaquamarine":"medium aquamarine","lavender":"levănţică","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"albastru închis","mediumvioletred":"medium violet-red","brown":"maro","lightgray":"gri deschis","sandybrown":"maro nisipiu","pink":"roz","firebrick":"fire brick","indigo":"indigo","snow":"zăpadă","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"ciocolată","springgreen":"verde de primăvară","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"lişiţă","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"turquoise pal","purple":"purpură","gainsboro":"gainsboro","plum":"prună","red":"roşu","blue":"albastru","forestgreen":"verde pădure","darkgreen":"verde închis","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"coral deschis","palevioletred":"roşu violet pal","mediumpurple":"medium purple","saddlebrown":"maro de şa","darkmagenta":"magenta închis","thistle":"ciulin","whitesmoke":"fum alb","wheat":"grâu","violet":"violet","lightskyblue":"albastru cer deschis","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"albastru de cer","crimson":"crimson","darksalmon":"dark salmon","darkred":"roşu închis","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"gri deschis","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"gri ardezie","palegoldenrod":"solidago pal","darkorange":"portocaliu închis","aquamarine":"aquamarine","lightgreen":"verde deschis","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"cenuşiu închis","lightcyan":"cyan deschis","powderblue":"albastru pudră","blueviolet":"albastru-violet","orchid":"orhidee","dimgray":"dim gray","beige":"bej","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"roz aprins","steelblue":"albastru metalic","tomato":"roşie","lightpink":"roz deschis","limegreen":"verde lime","indianred":"roşu indian","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"cenuşiu","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"negru","seagreen":"verde marin","darkslateblue":"dark slate blue","khaki":"kaki","lightblue":"albastru deschis","palegreen":"verde pal","azure":"azuriu","peachpuff":"puf de piersică","darkolivegreen":"verde oliv închis","yellowgreen":"verde galben"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/ro/colors",({aliceblue:"alice blue",antiquewhite:"antique white",aqua:"aqua",aquamarine:"aquamarine",azure:"azuriu",beige:"bej",bisque:"bisque",black:"negru",blanchedalmond:"blanched almond",blue:"albastru",blueviolet:"albastru-violet",brown:"brun",burlywood:"burlywood",cadetblue:"albastru cadet",chartreuse:"chartreuse",chocolate:"ciocolată",coral:"coral",cornflowerblue:"cornflower blue",cornsilk:"cornsilk",crimson:"stacojiu",cyan:"cyan",darkblue:"albastru închis",darkcyan:"cyan închis",darkgoldenrod:"goldenrod închis",darkgray:"gri închis",darkgreen:"verde închis",darkgrey:"gri închis",darkkhaki:"kaki închis",darkmagenta:"magenta închis",darkolivegreen:"verde măslină închis",darkorange:"portocaliu închis",darkorchid:"orchid închis",darkred:"roşu închis",darksalmon:"somon închis",darkseagreen:"verde marin închis",darkslateblue:"albastru ardezie închis",darkslategray:"gri ardezie închis",darkslategrey:"gri ardezie închis",darkturquoise:"turcoaz închis",darkviolet:"violet închis",deeppink:"roz profund",deepskyblue:"albastru cer profund",dimgray:"dim gray",dimgrey:"dim gray",dodgerblue:"dodger blue",firebrick:"cărămiziu aprins",floralwhite:"floral white",forestgreen:"forest green",fuchsia:"fuchsia",gainsboro:"gainsboro",ghostwhite:"ghost white",gold:"auriu",goldenrod:"goldenrod",gray:"gri",green:"verde",greenyellow:"verde-gălbui",grey:"gri",honeydew:"honeydew",hotpink:"roz aprins",indianred:"roşu indian",indigo:"indigo",ivory:"ivoriu",khaki:"kaki",lavender:"lavandă",lavenderblush:"lavender blush",lawngreen:"lawn green",lemonchiffon:"lemon chiffon",lightblue:"albastru deschis",lightcoral:"coral deschis",lightcyan:"cyan deschis",lightgoldenrodyellow:"goldenrod gălbui deschis",lightgray:"gri deschis",lightgreen:"verde dschis",lightgrey:"gri deschis",lightpink:"roz deschis",lightsalmon:"somon deschis",lightseagreen:"verde marin deschis",lightskyblue:"albastru cer deschis",lightslategray:"gri ardezie deschis",lightslategrey:"gri ardezie deschis",lightsteelblue:"albastru metalic deschis",lightyellow:"galben deschis",lime:"lime",limegreen:"verde lime",linen:"linen",magenta:"magenta",maroon:"maro",mediumaquamarine:"aquamarin mediu",mediumblue:"albastru mediu",mediumorchid:"orchid mediu",mediumpurple:"purpuriu mediu",mediumseagreen:"verde marin mediu",mediumslateblue:"albastru ardezie mediu",mediumspringgreen:"verde primăvară mediu",mediumturquoise:"turcoaz mediu",mediumvioletred:"roşu-violet mediu",midnightblue:"midnight blue",mintcream:"mint cream",mistyrose:"misty rose",moccasin:"moccasin",navajowhite:"navajo white",navy:"navy",oldlace:"old lace",olive:"oliv",olivedrab:"oliv şters",orange:"portocaliu",orangered:"roşu portocaliu",orchid:"orchid",palegoldenrod:"goldenrod pal",palegreen:"verde pal",paleturquoise:"turcoaz pal",palevioletred:"roşu-violet pal",papayawhip:"papaya whip",peachpuff:"peach puff",peru:"peru",pink:"roz",plum:"plum",powderblue:"powder blue",purple:"purpuriu",red:"roşu",rosybrown:"rosy brown",royalblue:"albastru regal",saddlebrown:"saddle brown",salmon:"somon",sandybrown:"sandy brown",seagreen:"verde marin",seashell:"seashell",sienna:"sienna",silver:"argintiu",skyblue:"albastru cer",slateblue:"albastru ardezie",slategray:"gri ardezie",slategrey:"gri ardezie",snow:"zăpadă",springgreen:"verde primăvară",steelblue:"albastru metalic",tan:"tan",teal:"teal",thistle:"thistle",tomato:"tomato",transparent:"transparent",turquoise:"turcoaz",violet:"violet",wheat:"wheat",white:"alb",whitesmoke:"white smoke",yellow:"galben",yellowgreen:"verde gălbui"})); \ No newline at end of file
diff --git a/lib/dojo/nls/ro/colors.js.uncompressed.js b/lib/dojo/nls/ro/colors.js.uncompressed.js
new file mode 100644
index 000000000..5b0d11b64
--- /dev/null
+++ b/lib/dojo/nls/ro/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/ro/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "alice blue",
+ antiquewhite: "antique white",
+ aqua: "aqua",
+ aquamarine: "aquamarine",
+ azure: "azuriu",
+ beige: "bej",
+ bisque: "bisque",
+ black: "negru",
+ blanchedalmond: "blanched almond",
+ blue: "albastru",
+ blueviolet: "albastru-violet",
+ brown: "brun",
+ burlywood: "burlywood",
+ cadetblue: "albastru cadet",
+ chartreuse: "chartreuse",
+ chocolate: "ciocolată",
+ coral: "coral",
+ cornflowerblue: "cornflower blue",
+ cornsilk: "cornsilk",
+ crimson: "stacojiu",
+ cyan: "cyan",
+ darkblue: "albastru închis",
+ darkcyan: "cyan închis",
+ darkgoldenrod: "goldenrod închis",
+ darkgray: "gri închis",
+ darkgreen: "verde închis",
+ darkgrey: "gri închis", // same as darkgray
+ darkkhaki: "kaki închis",
+ darkmagenta: "magenta închis",
+ darkolivegreen: "verde măslină închis",
+ darkorange: "portocaliu închis",
+ darkorchid: "orchid închis",
+ darkred: "roşu închis",
+ darksalmon: "somon închis",
+ darkseagreen: "verde marin închis",
+ darkslateblue: "albastru ardezie închis",
+ darkslategray: "gri ardezie închis",
+ darkslategrey: "gri ardezie închis", // same as darkslategray
+ darkturquoise: "turcoaz închis",
+ darkviolet: "violet închis",
+ deeppink: "roz profund",
+ deepskyblue: "albastru cer profund",
+ dimgray: "dim gray",
+ dimgrey: "dim gray", // same as dimgray
+ dodgerblue: "dodger blue",
+ firebrick: "cărămiziu aprins",
+ floralwhite: "floral white",
+ forestgreen: "forest green",
+ fuchsia: "fuchsia",
+ gainsboro: "gainsboro",
+ ghostwhite: "ghost white",
+ gold: "auriu",
+ goldenrod: "goldenrod",
+ gray: "gri",
+ green: "verde",
+ greenyellow: "verde-gălbui",
+ grey: "gri", // same as gray
+ honeydew: "honeydew",
+ hotpink: "roz aprins",
+ indianred: "roşu indian",
+ indigo: "indigo",
+ ivory: "ivoriu",
+ khaki: "kaki",
+ lavender: "lavandă",
+ lavenderblush: "lavender blush",
+ lawngreen: "lawn green",
+ lemonchiffon: "lemon chiffon",
+ lightblue: "albastru deschis",
+ lightcoral: "coral deschis",
+ lightcyan: "cyan deschis",
+ lightgoldenrodyellow: "goldenrod gălbui deschis",
+ lightgray: "gri deschis",
+ lightgreen: "verde dschis",
+ lightgrey: "gri deschis", // same as lightgray
+ lightpink: "roz deschis",
+ lightsalmon: "somon deschis",
+ lightseagreen: "verde marin deschis",
+ lightskyblue: "albastru cer deschis",
+ lightslategray: "gri ardezie deschis",
+ lightslategrey: "gri ardezie deschis", // same as lightslategray
+ lightsteelblue: "albastru metalic deschis",
+ lightyellow: "galben deschis",
+ lime: "lime",
+ limegreen: "verde lime",
+ linen: "linen",
+ magenta: "magenta",
+ maroon: "maro",
+ mediumaquamarine: "aquamarin mediu",
+ mediumblue: "albastru mediu",
+ mediumorchid: "orchid mediu",
+ mediumpurple: "purpuriu mediu",
+ mediumseagreen: "verde marin mediu",
+ mediumslateblue: "albastru ardezie mediu",
+ mediumspringgreen: "verde primăvară mediu",
+ mediumturquoise: "turcoaz mediu",
+ mediumvioletred: "roşu-violet mediu",
+ midnightblue: "midnight blue",
+ mintcream: "mint cream",
+ mistyrose: "misty rose",
+ moccasin: "moccasin",
+ navajowhite: "navajo white",
+ navy: "navy",
+ oldlace: "old lace",
+ olive: "oliv",
+ olivedrab: "oliv şters",
+ orange: "portocaliu",
+ orangered: "roşu portocaliu",
+ orchid: "orchid",
+ palegoldenrod: "goldenrod pal",
+ palegreen: "verde pal",
+ paleturquoise: "turcoaz pal",
+ palevioletred: "roşu-violet pal",
+ papayawhip: "papaya whip",
+ peachpuff: "peach puff",
+ peru: "peru",
+ pink: "roz",
+ plum: "plum",
+ powderblue: "powder blue",
+ purple: "purpuriu",
+ red: "roşu",
+ rosybrown: "rosy brown",
+ royalblue: "albastru regal",
+ saddlebrown: "saddle brown",
+ salmon: "somon",
+ sandybrown: "sandy brown",
+ seagreen: "verde marin",
+ seashell: "seashell",
+ sienna: "sienna",
+ silver: "argintiu",
+ skyblue: "albastru cer",
+ slateblue: "albastru ardezie",
+ slategray: "gri ardezie",
+ slategrey: "gri ardezie", // same as slategray
+ snow: "zăpadă",
+ springgreen: "verde primăvară",
+ steelblue: "albastru metalic",
+ tan: "tan",
+ teal: "teal",
+ thistle: "thistle",
+ tomato: "tomato",
+ transparent: "transparent",
+ turquoise: "turcoaz",
+ violet: "violet",
+ wheat: "wheat",
+ white: "alb",
+ whitesmoke: "white smoke",
+ yellow: "galben",
+ yellowgreen: "verde gălbui"
+})
+);
diff --git a/lib/dojo/nls/ru/colors.js b/lib/dojo/nls/ru/colors.js
index 4b67053d9..a0e7ce753 100644
--- a/lib/dojo/nls/ru/colors.js
+++ b/lib/dojo/nls/ru/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"светлый стальной","orangered":"оранжево-красный","midnightblue":"полуночно-синий","cadetblue":"серо-синий","seashell":"морская раковина","slategrey":"грифельно-серый","coral":"коралловый","darkturquoise":"темный бирюзовый","antiquewhite":"белый антик","mediumspringgreen":"нейтральный весенне-зеленый","salmon":"лососевый","darkgrey":"темно-серый","ivory":"слоновой кости","greenyellow":"зелено-желтый","mistyrose":"блекло-розовый","lightsalmon":"светло-лососевый","silver":"серебристый","dimgrey":"тускло-серый","orange":"оранжевый","white":"белый","navajowhite":"белый навахо","royalblue":"королевский голубой","deeppink":"темно-розовый","lime":"лайм","oldlace":"матово-белый","chartreuse":"желто-салатный","darkcyan":"темный циан","yellow":"желтый","linen":"хлопковый","olive":"оливковый","gold":"золотой","lawngreen":"зеленая лужайка","lightyellow":"светло-желтый","tan":"рыжевато-коричневый","darkviolet":"темно-фиолетовый","lightslategrey":"светлый грифельно-серый","grey":"серый","darkkhaki":"темный хаки","green":"зеленый","deepskyblue":"темный небесно-голубой","aqua":"зеленовато-голубой","sienna":"охра","mintcream":"мятно-кремовый","rosybrown":"розово-коричневый","mediumslateblue":"нейтральный грифельно-синий","magenta":"пурпурный","lightseagreen":"светлый морской волны","cyan":"циан","olivedrab":"желтовато-серый","darkgoldenrod":"темно-золотистый","slateblue":"грифельно-синий","mediumaquamarine":"нейтральный аквамарин","lavender":"бледно-лиловый","mediumseagreen":"нейтральный морской волны","maroon":"темно-бордовый","darkslategray":"темный грифельно-серый","mediumturquoise":"нейтральный бирюзовый","ghostwhite":"призрачно-белый","darkblue":"темно-синий","mediumvioletred":"нейтральный фиолетово-красный","brown":"коричневый","lightgray":"светло-серый","sandybrown":"коричнево-песчаный","pink":"розовый","firebrick":"кирпичный","indigo":"индиго","snow":"белоснежный","darkorchid":"темный орсель","turquoise":"бирюзовый","chocolate":"шоколадный","springgreen":"весенний зеленый","moccasin":"мокасин","navy":"темно-синий","lemonchiffon":"бледно-лимонный","teal":"чирок","floralwhite":"цветочно-белый","cornflowerblue":"фиолетово-синий","paleturquoise":"бледно-бирюзовый","purple":"фиолетовый","gainsboro":"бледно-серый","plum":"сливовый","red":"красный","blue":"синий","forestgreen":"зеленый лесной","darkgreen":"темно-зеленый","honeydew":"медовый","darkseagreen":"темный морской волны","lightcoral":"светло-коралловый","palevioletred":"бледный фиолетово-красный","mediumpurple":"нейтральный фиолетовый","saddlebrown":"кожано-коричневый","darkmagenta":"темно-пурпурный","thistle":"чертополох","whitesmoke":"дымчато-белый","wheat":"пшеница","violet":"фиолетовый","lightskyblue":"светлый небесно-голубой","goldenrod":"золотистый","mediumblue":"нейтральный синий","skyblue":"небесно-голубой","crimson":"малиновый","darksalmon":"темно-лососевый","darkred":"темно-красный","darkslategrey":"темный грифельно-серый","peru":"перу","lightgrey":"светло-серый","lightgoldenrodyellow":"светло-золотистый","blanchedalmond":"светло-миндальный","aliceblue":"серо-голубой","bisque":"бисквитный","slategray":"грифельно-серый","palegoldenrod":"бледно-золотистый","darkorange":"темно-оранжевый","aquamarine":"аквамарин","lightgreen":"светло-зеленый","burlywood":"светло-коричневый","dodgerblue":"бледно-синий","darkgray":"темно-серый","lightcyan":"светлый циан","powderblue":"пороховой","blueviolet":"сине-фиолетовый","orchid":"орсель","dimgray":"тускло-серый","beige":"бежевый","fuchsia":"фуксин","lavenderblush":"розовато-лиловый","hotpink":"красно-розовый","steelblue":"стальной","tomato":"помидор","lightpink":"светло-розовый","limegreen":"зеленый лайм","indianred":"индийский красный","papayawhip":"черенок папайи","lightslategray":"светлый грифельно-серый","gray":"серый","mediumorchid":"нейтральный орсель","cornsilk":"шелковый оттенок","black":"черный","seagreen":"морской волны","darkslateblue":"темный грифельно-синий","khaki":"хаки","lightblue":"светло-синий","palegreen":"бледно-зеленый","azure":"лазурный","peachpuff":"персиковый","darkolivegreen":"темно-оливковый","yellowgreen":"желто-зеленый"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/ru/colors",({aliceblue:"серо-голубой",antiquewhite:"белый антик",aqua:"зеленовато-голубой",aquamarine:"аквамарин",azure:"лазурный",beige:"бежевый",bisque:"бисквитный",black:"черный",blanchedalmond:"светло-миндальный",blue:"синий",blueviolet:"сине-фиолетовый",brown:"коричневый",burlywood:"светло-коричневый",cadetblue:"серо-синий",chartreuse:"желто-салатный",chocolate:"шоколадный",coral:"коралловый",cornflowerblue:"фиолетово-синий",cornsilk:"шелковый оттенок",crimson:"малиновый",cyan:"циан",darkblue:"темно-синий",darkcyan:"темный циан",darkgoldenrod:"темно-золотистый",darkgray:"темно-серый",darkgreen:"темно-зеленый",darkgrey:"темно-серый",darkkhaki:"темный хаки",darkmagenta:"темно-пурпурный",darkolivegreen:"темно-оливковый",darkorange:"темно-оранжевый",darkorchid:"темный орсель",darkred:"темно-красный",darksalmon:"темно-лососевый",darkseagreen:"темный морской волны",darkslateblue:"темный грифельно-синий",darkslategray:"темный грифельно-серый",darkslategrey:"темный грифельно-серый",darkturquoise:"темный бирюзовый",darkviolet:"темно-фиолетовый",deeppink:"темно-розовый",deepskyblue:"темный небесно-голубой",dimgray:"тускло-серый",dimgrey:"тускло-серый",dodgerblue:"бледно-синий",firebrick:"кирпичный",floralwhite:"цветочно-белый",forestgreen:"зеленый лесной",fuchsia:"фуксин",gainsboro:"бледно-серый",ghostwhite:"призрачно-белый",gold:"золотой",goldenrod:"золотистый",gray:"серый",green:"зеленый",greenyellow:"зелено-желтый",grey:"серый",honeydew:"медовый",hotpink:"красно-розовый",indianred:"индийский красный",indigo:"индиго",ivory:"слоновой кости",khaki:"хаки",lavender:"бледно-лиловый",lavenderblush:"розовато-лиловый",lawngreen:"зеленая лужайка",lemonchiffon:"бледно-лимонный",lightblue:"светло-синий",lightcoral:"светло-коралловый",lightcyan:"светлый циан",lightgoldenrodyellow:"светло-золотистый",lightgray:"светло-серый",lightgreen:"светло-зеленый",lightgrey:"светло-серый",lightpink:"светло-розовый",lightsalmon:"светло-лососевый",lightseagreen:"светлый морской волны",lightskyblue:"светлый небесно-голубой",lightslategray:"светлый грифельно-серый",lightslategrey:"светлый грифельно-серый",lightsteelblue:"светлый стальной",lightyellow:"светло-желтый",lime:"лайм",limegreen:"зеленый лайм",linen:"хлопковый",magenta:"пурпурный",maroon:"темно-бордовый",mediumaquamarine:"нейтральный аквамарин",mediumblue:"нейтральный синий",mediumorchid:"нейтральный орсель",mediumpurple:"нейтральный фиолетовый",mediumseagreen:"нейтральный морской волны",mediumslateblue:"нейтральный грифельно-синий",mediumspringgreen:"нейтральный весенне-зеленый",mediumturquoise:"нейтральный бирюзовый",mediumvioletred:"нейтральный фиолетово-красный",midnightblue:"полуночно-синий",mintcream:"мятно-кремовый",mistyrose:"блекло-розовый",moccasin:"мокасин",navajowhite:"белый навахо",navy:"темно-синий",oldlace:"матово-белый",olive:"оливковый",olivedrab:"желтовато-серый",orange:"оранжевый",orangered:"оранжево-красный",orchid:"орсель",palegoldenrod:"бледно-золотистый",palegreen:"бледно-зеленый",paleturquoise:"бледно-бирюзовый",palevioletred:"бледный фиолетово-красный",papayawhip:"черенок папайи",peachpuff:"персиковый",peru:"перу",pink:"розовый",plum:"сливовый",powderblue:"пороховой",purple:"фиолетовый",red:"красный",rosybrown:"розово-коричневый",royalblue:"королевский голубой",saddlebrown:"кожано-коричневый",salmon:"лососевый",sandybrown:"коричнево-песчаный",seagreen:"морской волны",seashell:"морская раковина",sienna:"охра",silver:"серебристый",skyblue:"небесно-голубой",slateblue:"грифельно-синий",slategray:"грифельно-серый",slategrey:"грифельно-серый",snow:"белоснежный",springgreen:"весенний зеленый",steelblue:"стальной",tan:"рыжевато-коричневый",teal:"чирок",thistle:"чертополох",tomato:"помидор",transparent:"прозрачный",turquoise:"бирюзовый",violet:"фиолетовый",wheat:"пшеница",white:"белый",whitesmoke:"дымчато-белый",yellow:"желтый",yellowgreen:"желто-зеленый"})); \ No newline at end of file
diff --git a/lib/dojo/nls/ru/colors.js.uncompressed.js b/lib/dojo/nls/ru/colors.js.uncompressed.js
new file mode 100644
index 000000000..902d07baf
--- /dev/null
+++ b/lib/dojo/nls/ru/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/ru/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "серо-голубой",
+ antiquewhite: "белый антик",
+ aqua: "зеленовато-голубой",
+ aquamarine: "аквамарин",
+ azure: "лазурный",
+ beige: "бежевый",
+ bisque: "бисквитный",
+ black: "черный",
+ blanchedalmond: "светло-миндальный",
+ blue: "синий",
+ blueviolet: "сине-фиолетовый",
+ brown: "коричневый",
+ burlywood: "светло-коричневый",
+ cadetblue: "серо-синий",
+ chartreuse: "желто-салатный",
+ chocolate: "шоколадный",
+ coral: "коралловый",
+ cornflowerblue: "фиолетово-синий",
+ cornsilk: "шелковый оттенок",
+ crimson: "малиновый",
+ cyan: "циан",
+ darkblue: "темно-синий",
+ darkcyan: "темный циан",
+ darkgoldenrod: "темно-золотистый",
+ darkgray: "темно-серый",
+ darkgreen: "темно-зеленый",
+ darkgrey: "темно-серый", // same as darkgray
+ darkkhaki: "темный хаки",
+ darkmagenta: "темно-пурпурный",
+ darkolivegreen: "темно-оливковый",
+ darkorange: "темно-оранжевый",
+ darkorchid: "темный орсель",
+ darkred: "темно-красный",
+ darksalmon: "темно-лососевый",
+ darkseagreen: "темный морской волны",
+ darkslateblue: "темный грифельно-синий",
+ darkslategray: "темный грифельно-серый",
+ darkslategrey: "темный грифельно-серый", // same as darkslategray
+ darkturquoise: "темный бирюзовый",
+ darkviolet: "темно-фиолетовый",
+ deeppink: "темно-розовый",
+ deepskyblue: "темный небесно-голубой",
+ dimgray: "тускло-серый",
+ dimgrey: "тускло-серый", // same as dimgray
+ dodgerblue: "бледно-синий",
+ firebrick: "кирпичный",
+ floralwhite: "цветочно-белый",
+ forestgreen: "зеленый лесной",
+ fuchsia: "фуксин",
+ gainsboro: "бледно-серый",
+ ghostwhite: "призрачно-белый",
+ gold: "золотой",
+ goldenrod: "золотистый",
+ gray: "серый",
+ green: "зеленый",
+ greenyellow: "зелено-желтый",
+ grey: "серый", // same as gray
+ honeydew: "медовый",
+ hotpink: "красно-розовый",
+ indianred: "индийский красный",
+ indigo: "индиго",
+ ivory: "слоновой кости",
+ khaki: "хаки",
+ lavender: "бледно-лиловый",
+ lavenderblush: "розовато-лиловый",
+ lawngreen: "зеленая лужайка",
+ lemonchiffon: "бледно-лимонный",
+ lightblue: "светло-синий",
+ lightcoral: "светло-коралловый",
+ lightcyan: "светлый циан",
+ lightgoldenrodyellow: "светло-золотистый",
+ lightgray: "светло-серый",
+ lightgreen: "светло-зеленый",
+ lightgrey: "светло-серый", // same as lightgray
+ lightpink: "светло-розовый",
+ lightsalmon: "светло-лососевый",
+ lightseagreen: "светлый морской волны",
+ lightskyblue: "светлый небесно-голубой",
+ lightslategray: "светлый грифельно-серый",
+ lightslategrey: "светлый грифельно-серый", // same as lightslategray
+ lightsteelblue: "светлый стальной",
+ lightyellow: "светло-желтый",
+ lime: "лайм",
+ limegreen: "зеленый лайм",
+ linen: "хлопковый",
+ magenta: "пурпурный",
+ maroon: "темно-бордовый",
+ mediumaquamarine: "нейтральный аквамарин",
+ mediumblue: "нейтральный синий",
+ mediumorchid: "нейтральный орсель",
+ mediumpurple: "нейтральный фиолетовый",
+ mediumseagreen: "нейтральный морской волны",
+ mediumslateblue: "нейтральный грифельно-синий",
+ mediumspringgreen: "нейтральный весенне-зеленый",
+ mediumturquoise: "нейтральный бирюзовый",
+ mediumvioletred: "нейтральный фиолетово-красный",
+ midnightblue: "полуночно-синий",
+ mintcream: "мятно-кремовый",
+ mistyrose: "блекло-розовый",
+ moccasin: "мокасин",
+ navajowhite: "белый навахо",
+ navy: "темно-синий",
+ oldlace: "матово-белый",
+ olive: "оливковый",
+ olivedrab: "желтовато-серый",
+ orange: "оранжевый",
+ orangered: "оранжево-красный",
+ orchid: "орсель",
+ palegoldenrod: "бледно-золотистый",
+ palegreen: "бледно-зеленый",
+ paleturquoise: "бледно-бирюзовый",
+ palevioletred: "бледный фиолетово-красный",
+ papayawhip: "черенок папайи",
+ peachpuff: "персиковый",
+ peru: "перу",
+ pink: "розовый",
+ plum: "сливовый",
+ powderblue: "пороховой",
+ purple: "фиолетовый",
+ red: "красный",
+ rosybrown: "розово-коричневый",
+ royalblue: "королевский голубой",
+ saddlebrown: "кожано-коричневый",
+ salmon: "лососевый",
+ sandybrown: "коричнево-песчаный",
+ seagreen: "морской волны",
+ seashell: "морская раковина",
+ sienna: "охра",
+ silver: "серебристый",
+ skyblue: "небесно-голубой",
+ slateblue: "грифельно-синий",
+ slategray: "грифельно-серый",
+ slategrey: "грифельно-серый", // same as slategray
+ snow: "белоснежный",
+ springgreen: "весенний зеленый",
+ steelblue: "стальной",
+ tan: "рыжевато-коричневый",
+ teal: "чирок",
+ thistle: "чертополох",
+ tomato: "помидор",
+ transparent: "прозрачный",
+ turquoise: "бирюзовый",
+ violet: "фиолетовый",
+ wheat: "пшеница",
+ white: "белый",
+ whitesmoke: "дымчато-белый",
+ yellow: "желтый",
+ yellowgreen: "желто-зеленый"
+})
+);
diff --git a/lib/dojo/nls/sk/colors.js b/lib/dojo/nls/sk/colors.js
index 9dbd8e602..709aaff3e 100644
--- a/lib/dojo/nls/sk/colors.js
+++ b/lib/dojo/nls/sk/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"oceľovo modrá svetlá","orangered":"oranžovo červená","midnightblue":"nočná modrá","cadetblue":"sivomodrá","seashell":"lastúrová","slategrey":"bridlicová sivá","coral":"koralová","darkturquoise":"tyrkysová tmavá","antiquewhite":"antická biela","mediumspringgreen":"jarná zelená stredná","salmon":"lososovo ružová","darkgrey":"tmavosivá","ivory":"slonovinová","greenyellow":"žltozelená","mistyrose":"zahmlená ruža","lightsalmon":"lososovo ružová svetlá","silver":"strieborná","dimgrey":"sivá matná","orange":"oranžová","white":"biela","navajowhite":"navajská biela","royalblue":"kráľovská modrá","deeppink":"hlboká ružová","lime":"lipová","oldlace":"stará čipka","chartreuse":"kartúza","darkcyan":"tmavozelenomodrá","yellow":"žltá","linen":"ľan","olive":"olivovo zelená","gold":"zlatá","lawngreen":"zelená tráva","lightyellow":"svetložltá","tan":"žltohnedá","darkviolet":"tmavofialová","lightslategrey":"bridlicová sivá svetlá","grey":"sivá","darkkhaki":"žltohnedá tmavá","green":"zelená","deepskyblue":"hlboká blankytná modrá","aqua":"svetlá zelenomodrá","sienna":"sienská","mintcream":"mätová krémová","rosybrown":"ružovo hnedá","mediumslateblue":"bridlicová modrá stredná","magenta":"purpurová","lightseagreen":"morská zelená svetlá","cyan":"zelenomodrá","olivedrab":"olivovo zelená fádna","darkgoldenrod":"zlatobyľová tmavá","slateblue":"bridlicová modrá","mediumaquamarine":"akvamarínová stredná","lavender":"levanduľová","mediumseagreen":"morská zelená stredná","maroon":"gaštanovo hnedá","darkslategray":"bridlicová sivá tmavá","mediumturquoise":"tyrkysová stredná","ghostwhite":"biely tieň","darkblue":"tmavomodrá","mediumvioletred":"fialovočervená stredná","brown":"hnedá","lightgray":"svetlosivá","sandybrown":"pieskovo hnedá","pink":"ružová","firebrick":"pálená tehla","indigo":"fialovo modrá","snow":"snehobiela","darkorchid":"orchideovo ružová tmavá","turquoise":"tyrkysová","chocolate":"čokoládovo hnedá","springgreen":"jarná zelená","moccasin":"črievičníková","navy":"vojenská zelená","lemonchiffon":"citrónový šifón","teal":"tyrkysová","floralwhite":"kvetinová biela","cornflowerblue":"nevädzovo modrá","paleturquoise":"bledo tyrkysová","purple":"purpurová","gainsboro":"sivomodrá svetlá","plum":"slivková","red":"červená","blue":"modrá","forestgreen":"lesná zelená","darkgreen":"tmavozelená","honeydew":"ambrózia","darkseagreen":"morská zelená tmavá","lightcoral":"koralová svetlá","palevioletred":"bledá fialovo červená","mediumpurple":"purpurová stredná","saddlebrown":"sedlová hnedá","darkmagenta":"tmavopurpurová","thistle":"bodliaková fialová","whitesmoke":"biely dym","wheat":"pšeničná","violet":"fialová","lightskyblue":"blankytná modrá svetlá","goldenrod":"zlatobyľ","mediumblue":"stredne modrá","skyblue":"blankytná modrá","crimson":"karmínová","darksalmon":"lososovo ružová tmavá","darkred":"tmavočervená","darkslategrey":"bridlicová sivá tmavá","peru":"peru","lightgrey":"svetlosivá","lightgoldenrodyellow":"zlatobyľová svetlá","blanchedalmond":"lúpané mandle","aliceblue":"modrá alice","bisque":"biskvitová","slategray":"bridlicová sivá","palegoldenrod":"bledá zlatobyľová","darkorange":"tmavooranžová","aquamarine":"akvamarínová","lightgreen":"svetlozelená","burlywood":"pieskovo hnedá","dodgerblue":"modrá dodger","darkgray":"tmavosivá","lightcyan":"zelenomodrá svetlá","powderblue":"prášková modrá","blueviolet":"modrofialová","orchid":"orchideovo ružová","dimgray":"sivá matná","beige":"béžová","fuchsia":"purpurová","lavenderblush":"levanduľový rumenec","hotpink":"teplá ružová","steelblue":"oceľovo modrá","tomato":"paradajková červená","lightpink":"svetloružová","limegreen":"lipová zelená","indianred":"indická červená","papayawhip":"papájový krém","lightslategray":"bridlicová sivá svetlá","gray":"sivá","mediumorchid":"orchideovo ružová stredná","cornsilk":"hodvábna žltá","black":"čierna","seagreen":"morská zelená","darkslateblue":"bridlicová modrá tmavá","khaki":"khaki","lightblue":"svetlomodrá","palegreen":"bledozelená","azure":"azúrová","peachpuff":"broskyňová pena","darkolivegreen":"olivovozelená tmavá","yellowgreen":"žltozelená"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/sk/colors",({aliceblue:"modrá (alice)",antiquewhite:"antická biela",aqua:"vodová",aquamarine:"akvamarínová",azure:"azúrová",beige:"béžová",bisque:"porcelánová",black:"čierna",blanchedalmond:"bledá mandľová",blue:"modrá",blueviolet:"modro-fialová",brown:"hnedá",burlywood:"drevená hnedá",cadetblue:"červeno modrá",chartreuse:"kartúzska",chocolate:"čokoládová",coral:"koralová",cornflowerblue:"nevädzová modrá",cornsilk:"ôstie kukurice",crimson:"karmínová",cyan:"zelenomodrá",darkblue:"tmavomodrá",darkcyan:"tmavá zelenomodrá",darkgoldenrod:"tmavá zlatobyľ",darkgray:"tmavosivá",darkgreen:"tmavozelená",darkgrey:"tmavosivá",darkkhaki:"tmavá žltohnedá",darkmagenta:"tmavá purpurová",darkolivegreen:"tmavá olivovo zelená",darkorange:"tmavá oranžová",darkorchid:"tmavá orchidea",darkred:"tmavočervená",darksalmon:"tmavá lososová",darkseagreen:"tmavá morská zelená",darkslateblue:"tmavá bridlicová modrá",darkslategray:"tmavá bridlicová sivá",darkslategrey:"tmavá bridlicová sivá",darkturquoise:"tmavá tyrkysová",darkviolet:"tmavofialová",deeppink:"hlboká ružová",deepskyblue:"hlboká modrá obloha",dimgray:"matná sivá",dimgrey:"matná sivá",dodgerblue:"modrá (dodger)",firebrick:"pálená tehla",floralwhite:"biely kvet",forestgreen:"lesná zelená",fuchsia:"fuchsia",gainsboro:"sivá - gainsboro",ghostwhite:"biela (ghost white)",gold:"zlatá",goldenrod:"zlatobyľ",gray:"sivá",green:"zelená",greenyellow:"zelenožltá",grey:"sivá",honeydew:"ambrózia",hotpink:"horúca ružová",indianred:"indiánska červená",indigo:"indigo",ivory:"slonovina",khaki:"kaki",lavender:"levanduľa",lavenderblush:"rumencová levanduľa",lawngreen:"trávová zelená",lemonchiffon:"citrónový šifón",lightblue:"svetlomodrá",lightcoral:"svetlá koralová",lightcyan:"svetlá zelenomodrá",lightgoldenrodyellow:"svetlá zlatobyľová žltá",lightgray:"svetlosivá",lightgreen:"svetlozelená",lightgrey:"svetlosivá",lightpink:"svetloružová",lightsalmon:"svetlá lososová",lightseagreen:"svetlá morská zelená",lightskyblue:"svetlá modrá obloha",lightslategray:"svetlá bridlicová sivá",lightslategrey:"svetlá bridlicová sivá",lightsteelblue:"svetlá oceľovomodrá",lightyellow:"svetložltá",lime:"limetková",limegreen:"limetková zelená",linen:"ľan",magenta:"purpurová",maroon:"gaštanová hnedá",mediumaquamarine:"stredná akvamarínová",mediumblue:"stredná modrá",mediumorchid:"stredná orchideová",mediumpurple:"stredná purpurová",mediumseagreen:"stredná morská zelená",mediumslateblue:"stredná bridlicová modrá",mediumspringgreen:"stredná jarná zelená",mediumturquoise:"stredná tyrkysová",mediumvioletred:"stredná fialovočervená",midnightblue:"polnočná modrá",mintcream:"mätová krémová",mistyrose:"zahmlená ruža",moccasin:"mokasínová",navajowhite:"navajská biela",navy:"námornícka",oldlace:"stará čipka",olive:"olivová",olivedrab:"fádna olivová",orange:"oranžová",orangered:"oranžovo červená",orchid:"orchideová",palegoldenrod:"bledá zlatobyľová",palegreen:"bledá zelená",paleturquoise:"bledá tyrkysová",palevioletred:"bledá fialovo červená",papayawhip:"papájový krém",peachpuff:"broskyňový nádych",peru:"peru",pink:"ružová",plum:"slivková",powderblue:"prášková modrá",purple:"purpurová",red:"červená",rosybrown:"ružovo hnedá",royalblue:"kráľovská modrá",saddlebrown:"sedlová hnedá",salmon:"lososová",sandybrown:"piesková hnedá",seagreen:"morská zelená",seashell:"lastúrová",sienna:"sienská",silver:"strieborná",skyblue:"modré nebo",slateblue:"bridlicová modrá",slategray:"bridlicová sivá",slategrey:"bridlicová sivá",snow:"snehová",springgreen:"jarná zelená",steelblue:"oceľovomodrá",tan:"žltohnedá",teal:"zelenomodrá",thistle:"bodliaková",tomato:"paradajková",transparent:"priesvitná",turquoise:"tyrkysová",violet:"fialová",wheat:"pšeničná",white:"biela",whitesmoke:"biely dym",yellow:"žltá",yellowgreen:"žltozelená"})); \ No newline at end of file
diff --git a/lib/dojo/nls/sk/colors.js.uncompressed.js b/lib/dojo/nls/sk/colors.js.uncompressed.js
new file mode 100644
index 000000000..700f727ab
--- /dev/null
+++ b/lib/dojo/nls/sk/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/sk/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "modrá (alice)",
+ antiquewhite: "antická biela",
+ aqua: "vodová",
+ aquamarine: "akvamarínová",
+ azure: "azúrová",
+ beige: "béžová",
+ bisque: "porcelánová",
+ black: "čierna",
+ blanchedalmond: "bledá mandľová",
+ blue: "modrá",
+ blueviolet: "modro-fialová",
+ brown: "hnedá",
+ burlywood: "drevená hnedá",
+ cadetblue: "červeno modrá",
+ chartreuse: "kartúzska",
+ chocolate: "čokoládová",
+ coral: "koralová",
+ cornflowerblue: "nevädzová modrá",
+ cornsilk: "ôstie kukurice",
+ crimson: "karmínová",
+ cyan: "zelenomodrá",
+ darkblue: "tmavomodrá",
+ darkcyan: "tmavá zelenomodrá",
+ darkgoldenrod: "tmavá zlatobyľ",
+ darkgray: "tmavosivá",
+ darkgreen: "tmavozelená",
+ darkgrey: "tmavosivá", // same as darkgray
+ darkkhaki: "tmavá žltohnedá",
+ darkmagenta: "tmavá purpurová",
+ darkolivegreen: "tmavá olivovo zelená",
+ darkorange: "tmavá oranžová",
+ darkorchid: "tmavá orchidea",
+ darkred: "tmavočervená",
+ darksalmon: "tmavá lososová",
+ darkseagreen: "tmavá morská zelená",
+ darkslateblue: "tmavá bridlicová modrá",
+ darkslategray: "tmavá bridlicová sivá",
+ darkslategrey: "tmavá bridlicová sivá", // same as darkslategray
+ darkturquoise: "tmavá tyrkysová",
+ darkviolet: "tmavofialová",
+ deeppink: "hlboká ružová",
+ deepskyblue: "hlboká modrá obloha",
+ dimgray: "matná sivá",
+ dimgrey: "matná sivá", // same as dimgray
+ dodgerblue: "modrá (dodger)",
+ firebrick: "pálená tehla",
+ floralwhite: "biely kvet",
+ forestgreen: "lesná zelená",
+ fuchsia: "fuchsia",
+ gainsboro: "sivá - gainsboro",
+ ghostwhite: "biela (ghost white)",
+ gold: "zlatá",
+ goldenrod: "zlatobyľ",
+ gray: "sivá",
+ green: "zelená",
+ greenyellow: "zelenožltá",
+ grey: "sivá", // same as gray
+ honeydew: "ambrózia",
+ hotpink: "horúca ružová",
+ indianred: "indiánska červená",
+ indigo: "indigo",
+ ivory: "slonovina",
+ khaki: "kaki",
+ lavender: "levanduľa",
+ lavenderblush: "rumencová levanduľa",
+ lawngreen: "trávová zelená",
+ lemonchiffon: "citrónový šifón",
+ lightblue: "svetlomodrá",
+ lightcoral: "svetlá koralová",
+ lightcyan: "svetlá zelenomodrá",
+ lightgoldenrodyellow: "svetlá zlatobyľová žltá",
+ lightgray: "svetlosivá",
+ lightgreen: "svetlozelená",
+ lightgrey: "svetlosivá", // same as lightgray
+ lightpink: "svetloružová",
+ lightsalmon: "svetlá lososová",
+ lightseagreen: "svetlá morská zelená",
+ lightskyblue: "svetlá modrá obloha",
+ lightslategray: "svetlá bridlicová sivá",
+ lightslategrey: "svetlá bridlicová sivá", // same as lightslategray
+ lightsteelblue: "svetlá oceľovomodrá",
+ lightyellow: "svetložltá",
+ lime: "limetková",
+ limegreen: "limetková zelená",
+ linen: "ľan",
+ magenta: "purpurová",
+ maroon: "gaštanová hnedá",
+ mediumaquamarine: "stredná akvamarínová",
+ mediumblue: "stredná modrá",
+ mediumorchid: "stredná orchideová",
+ mediumpurple: "stredná purpurová",
+ mediumseagreen: "stredná morská zelená",
+ mediumslateblue: "stredná bridlicová modrá",
+ mediumspringgreen: "stredná jarná zelená",
+ mediumturquoise: "stredná tyrkysová",
+ mediumvioletred: "stredná fialovočervená",
+ midnightblue: "polnočná modrá",
+ mintcream: "mätová krémová",
+ mistyrose: "zahmlená ruža",
+ moccasin: "mokasínová",
+ navajowhite: "navajská biela",
+ navy: "námornícka",
+ oldlace: "stará čipka",
+ olive: "olivová",
+ olivedrab: "fádna olivová",
+ orange: "oranžová",
+ orangered: "oranžovo červená",
+ orchid: "orchideová",
+ palegoldenrod: "bledá zlatobyľová",
+ palegreen: "bledá zelená",
+ paleturquoise: "bledá tyrkysová",
+ palevioletred: "bledá fialovo červená",
+ papayawhip: "papájový krém",
+ peachpuff: "broskyňový nádych",
+ peru: "peru",
+ pink: "ružová",
+ plum: "slivková",
+ powderblue: "prášková modrá",
+ purple: "purpurová",
+ red: "červená",
+ rosybrown: "ružovo hnedá",
+ royalblue: "kráľovská modrá",
+ saddlebrown: "sedlová hnedá",
+ salmon: "lososová",
+ sandybrown: "piesková hnedá",
+ seagreen: "morská zelená",
+ seashell: "lastúrová",
+ sienna: "sienská",
+ silver: "strieborná",
+ skyblue: "modré nebo",
+ slateblue: "bridlicová modrá",
+ slategray: "bridlicová sivá",
+ slategrey: "bridlicová sivá", // same as slategray
+ snow: "snehová",
+ springgreen: "jarná zelená",
+ steelblue: "oceľovomodrá",
+ tan: "žltohnedá",
+ teal: "zelenomodrá",
+ thistle: "bodliaková",
+ tomato: "paradajková",
+ transparent: "priesvitná",
+ turquoise: "tyrkysová",
+ violet: "fialová",
+ wheat: "pšeničná",
+ white: "biela",
+ whitesmoke: "biely dym",
+ yellow: "žltá",
+ yellowgreen: "žltozelená"
+})
+);
diff --git a/lib/dojo/nls/sl/colors.js b/lib/dojo/nls/sl/colors.js
index 15d3ac7ba..4f2f19e0b 100644
--- a/lib/dojo/nls/sl/colors.js
+++ b/lib/dojo/nls/sl/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"svetlo kovinsko modra","orangered":"oranžno-rdeča","midnightblue":"polnočno modra","cadetblue":"kadetsko modra","seashell":"morska lupina","slategrey":"skrilasto siva","coral":"koralna","darkturquoise":"temno turkizna","antiquewhite":"antično bela","mediumspringgreen":"srednje pomladno zelena","salmon":"lososova","darkgrey":"temno siva","ivory":"slonokoščena","greenyellow":"zeleno-rumena","mistyrose":"megleno rožnata","lightsalmon":"svetlo lososova","silver":"srebrna","dimgrey":"pepelnato siva","orange":"oranžna","white":"bela","navajowhite":"navajo bela","royalblue":"kraljevsko modra","deeppink":"temno rožnata","lime":"limetasta","oldlace":"stara čipka","chartreuse":"chartreuse","darkcyan":"temno cijan","yellow":"rumena","linen":"lanena","olive":"olivna","gold":"zlata","lawngreen":"travniško zelena","lightyellow":"svetlo rumena","tan":"rumeno-rjava","darkviolet":"temno vijolična","lightslategrey":"svetlo skrilasto siva","grey":"siva","darkkhaki":"temno kaki","green":"zelena","deepskyblue":"temno nebeško modra","aqua":"akva","sienna":"sienna","mintcream":"metina krema","rosybrown":"rožnato rjava","mediumslateblue":"srednje skrilasto modra","magenta":"magenta","lightseagreen":"svetlo morsko zelena","cyan":"cijan","olivedrab":"umazano olivna","darkgoldenrod":"temna zlata rozga","slateblue":"skrilasto modra","mediumaquamarine":"srednji akvamarin","lavender":"sivka","mediumseagreen":"srednje morsko zelena","maroon":"kostanjeva","darkslategray":"temno skrilasto siva","mediumturquoise":"srednje turkizna","ghostwhite":"senčnato bela","darkblue":"temno modra","mediumvioletred":"srednje vijolično rdeča","brown":"rjava","lightgray":"svetlo siva","sandybrown":"peščeno rjava","pink":"rožnata","firebrick":"opečnata","indigo":"indigo","snow":"snežena","darkorchid":"temno orhidejasta","turquoise":"turkizna","chocolate":"čokoladna","springgreen":"pomladno zelena","moccasin":"mokasinasta","navy":"mornarska","lemonchiffon":"limonast šifon","teal":"modrozelena","floralwhite":"cvetno bela","cornflowerblue":"plavičasto modra","paleturquoise":"bledo turkizna","purple":"škrlatna","gainsboro":"gainsboro","plum":"slivova","red":"rdeča","blue":"modra","forestgreen":"gozdno zelena","darkgreen":"temno zelena","honeydew":"medena rosa","darkseagreen":"temno morsko zelena","lightcoral":"svetlo koralna","palevioletred":"bledo vijolično-rdeča","mediumpurple":"srednje škrlatna","saddlebrown":"sedlasto rjava","darkmagenta":"temna magenta","thistle":"osatna","whitesmoke":"megleno bela","wheat":"pšenična","violet":"vijolična","lightskyblue":"svetlo nebeško modra","goldenrod":"zlata rozga","mediumblue":"srednje modra","skyblue":"nebeško modra","crimson":"karminasta","darksalmon":"temno lososova","darkred":"temno rdeča","darkslategrey":"temno skrilasto siva","peru":"perujska","lightgrey":"svetlo siva","lightgoldenrodyellow":"svetlo rumena zlata rozga","blanchedalmond":"obledelo mandljeva","aliceblue":"alice blue modra","bisque":"porcelanasta","slategray":"skrilasto siva","palegoldenrod":"bleda zlata rozga","darkorange":"temno oranžna","aquamarine":"akvamarin","lightgreen":"svetlo zelena","burlywood":"peščeno sivo-rjava","dodgerblue":"dodgersko modra","darkgray":"temno siva","lightcyan":"svetlo cijan","powderblue":"kobaltovo modra","blueviolet":"modro vijolična","orchid":"orhidejasta","dimgray":"pepelnato siva","beige":"bež","fuchsia":"fuksija","lavenderblush":"rožnato sivka","hotpink":"kričeče rožnata","steelblue":"kovinsko modra","tomato":"paradižnikova","lightpink":"svetlo rožnata","limegreen":"apneno zelena","indianred":"indijansko rdeča","papayawhip":"papaja","lightslategray":"svetlo skrilasto siva","gray":"siva","mediumorchid":"srednje orhidejasta","cornsilk":"koruzna","black":"črna","seagreen":"morsko zelena","darkslateblue":"temno skrilasto modra","khaki":"kaki","lightblue":"svetlo modra","palegreen":"bledo zelena","azure":"azurno modra","peachpuff":"breskova","darkolivegreen":"temna olivno zelena","yellowgreen":"rumeno-zelena"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/sl/colors",({aliceblue:"alice blue modra",antiquewhite:"antično bela",aqua:"akva",aquamarine:"akvamarin",azure:"azurno modra",beige:"bež",bisque:"porcelanasta",black:"črna",blanchedalmond:"obledelo mandljeva",blue:"modra",blueviolet:"modro vijolična",brown:"rjava",burlywood:"peščeno sivo-rjava",cadetblue:"kadetsko modra",chartreuse:"chartreuse",chocolate:"čokoladna",coral:"koralna",cornflowerblue:"plavičasto modra",cornsilk:"koruzna",crimson:"karminasta",cyan:"cijan",darkblue:"temno modra",darkcyan:"temno cijan",darkgoldenrod:"temna zlata rozga",darkgray:"temno siva",darkgreen:"temno zelena",darkgrey:"temno siva",darkkhaki:"temno kaki",darkmagenta:"temna magenta",darkolivegreen:"temna olivno zelena",darkorange:"temno oranžna",darkorchid:"temno orhidejasta",darkred:"temno rdeča",darksalmon:"temno lososova",darkseagreen:"temno morsko zelena",darkslateblue:"temno skrilasto modra",darkslategray:"temno skrilasto siva",darkslategrey:"temno skrilasto siva",darkturquoise:"temno turkizna",darkviolet:"temno vijolična",deeppink:"temno rožnata",deepskyblue:"temno nebeško modra",dimgray:"pepelnato siva",dimgrey:"pepelnato siva",dodgerblue:"dodgersko modra",firebrick:"opečnata",floralwhite:"cvetno bela",forestgreen:"gozdno zelena",fuchsia:"fuksija",gainsboro:"gainsboro",ghostwhite:"senčnato bela",gold:"zlata",goldenrod:"zlata rozga",gray:"siva",green:"zelena",greenyellow:"zeleno-rumena",grey:"siva",honeydew:"medena rosa",hotpink:"kričeče rožnata",indianred:"indijansko rdeča",indigo:"indigo",ivory:"slonokoščena",khaki:"kaki",lavender:"sivka",lavenderblush:"rožnato sivka",lawngreen:"travniško zelena",lemonchiffon:"limonast šifon",lightblue:"svetlo modra",lightcoral:"svetlo koralna",lightcyan:"svetlo cijan",lightgoldenrodyellow:"svetlo rumena zlata rozga",lightgray:"svetlo siva",lightgreen:"svetlo zelena",lightgrey:"svetlo siva",lightpink:"svetlo rožnata",lightsalmon:"svetlo lososova",lightseagreen:"svetlo morsko zelena",lightskyblue:"svetlo nebeško modra",lightslategray:"svetlo skrilasto siva",lightslategrey:"svetlo skrilasto siva",lightsteelblue:"svetlo kovinsko modra",lightyellow:"svetlo rumena",lime:"limetasta",limegreen:"apneno zelena",linen:"lanena",magenta:"magenta",maroon:"kostanjeva",mediumaquamarine:"srednji akvamarin",mediumblue:"srednje modra",mediumorchid:"srednje orhidejasta",mediumpurple:"srednje škrlatna",mediumseagreen:"srednje morsko zelena",mediumslateblue:"srednje skrilasto modra",mediumspringgreen:"srednje pomladno zelena",mediumturquoise:"srednje turkizna",mediumvioletred:"srednje vijolično rdeča",midnightblue:"polnočno modra",mintcream:"metina krema",mistyrose:"megleno rožnata",moccasin:"mokasinasta",navajowhite:"navajo bela",navy:"mornarska",oldlace:"stara čipka",olive:"olivna",olivedrab:"umazano olivna",orange:"oranžna",orangered:"oranžno-rdeča",orchid:"orhidejasta",palegoldenrod:"bleda zlata rozga",palegreen:"bledo zelena",paleturquoise:"bledo turkizna",palevioletred:"bledo vijolično-rdeča",papayawhip:"papaja",peachpuff:"breskova",peru:"perujska",pink:"rožnata",plum:"slivova",powderblue:"kobaltovo modra",purple:"škrlatna",red:"rdeča",rosybrown:"rožnato rjava",royalblue:"kraljevsko modra",saddlebrown:"sedlasto rjava",salmon:"lososova",sandybrown:"peščeno rjava",seagreen:"morsko zelena",seashell:"morska lupina",sienna:"sienna",silver:"srebrna",skyblue:"nebeško modra",slateblue:"skrilasto modra",slategray:"skrilasto siva",slategrey:"skrilasto siva",snow:"snežena",springgreen:"pomladno zelena",steelblue:"kovinsko modra",tan:"rumeno-rjava",teal:"modrozelena",thistle:"osatna",tomato:"paradižnikova",transparent:"prosojno",turquoise:"turkizna",violet:"vijolična",wheat:"pšenična",white:"bela",whitesmoke:"megleno bela",yellow:"rumena",yellowgreen:"rumeno-zelena"})); \ No newline at end of file
diff --git a/lib/dojo/nls/sl/colors.js.uncompressed.js b/lib/dojo/nls/sl/colors.js.uncompressed.js
new file mode 100644
index 000000000..74b0547ca
--- /dev/null
+++ b/lib/dojo/nls/sl/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/sl/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "alice blue modra",
+ antiquewhite: "antično bela",
+ aqua: "akva",
+ aquamarine: "akvamarin",
+ azure: "azurno modra",
+ beige: "bež",
+ bisque: "porcelanasta",
+ black: "črna",
+ blanchedalmond: "obledelo mandljeva",
+ blue: "modra",
+ blueviolet: "modro vijolična",
+ brown: "rjava",
+ burlywood: "peščeno sivo-rjava",
+ cadetblue: "kadetsko modra",
+ chartreuse: "chartreuse",
+ chocolate: "čokoladna",
+ coral: "koralna",
+ cornflowerblue: "plavičasto modra",
+ cornsilk: "koruzna",
+ crimson: "karminasta",
+ cyan: "cijan",
+ darkblue: "temno modra",
+ darkcyan: "temno cijan",
+ darkgoldenrod: "temna zlata rozga",
+ darkgray: "temno siva",
+ darkgreen: "temno zelena",
+ darkgrey: "temno siva", // same as darkgray
+ darkkhaki: "temno kaki",
+ darkmagenta: "temna magenta",
+ darkolivegreen: "temna olivno zelena",
+ darkorange: "temno oranžna",
+ darkorchid: "temno orhidejasta",
+ darkred: "temno rdeča",
+ darksalmon: "temno lososova",
+ darkseagreen: "temno morsko zelena",
+ darkslateblue: "temno skrilasto modra",
+ darkslategray: "temno skrilasto siva",
+ darkslategrey: "temno skrilasto siva", // same as darkslategray
+ darkturquoise: "temno turkizna",
+ darkviolet: "temno vijolična",
+ deeppink: "temno rožnata",
+ deepskyblue: "temno nebeško modra",
+ dimgray: "pepelnato siva",
+ dimgrey: "pepelnato siva", // same as dimgray
+ dodgerblue: "dodgersko modra",
+ firebrick: "opečnata",
+ floralwhite: "cvetno bela",
+ forestgreen: "gozdno zelena",
+ fuchsia: "fuksija",
+ gainsboro: "gainsboro",
+ ghostwhite: "senčnato bela",
+ gold: "zlata",
+ goldenrod: "zlata rozga",
+ gray: "siva",
+ green: "zelena",
+ greenyellow: "zeleno-rumena",
+ grey: "siva", // same as gray
+ honeydew: "medena rosa",
+ hotpink: "kričeče rožnata",
+ indianred: "indijansko rdeča",
+ indigo: "indigo",
+ ivory: "slonokoščena",
+ khaki: "kaki",
+ lavender: "sivka",
+ lavenderblush: "rožnato sivka",
+ lawngreen: "travniško zelena",
+ lemonchiffon: "limonast šifon",
+ lightblue: "svetlo modra",
+ lightcoral: "svetlo koralna",
+ lightcyan: "svetlo cijan",
+ lightgoldenrodyellow: "svetlo rumena zlata rozga",
+ lightgray: "svetlo siva",
+ lightgreen: "svetlo zelena",
+ lightgrey: "svetlo siva", // same as lightgray
+ lightpink: "svetlo rožnata",
+ lightsalmon: "svetlo lososova",
+ lightseagreen: "svetlo morsko zelena",
+ lightskyblue: "svetlo nebeško modra",
+ lightslategray: "svetlo skrilasto siva",
+ lightslategrey: "svetlo skrilasto siva", // same as lightslategray
+ lightsteelblue: "svetlo kovinsko modra",
+ lightyellow: "svetlo rumena",
+ lime: "limetasta",
+ limegreen: "apneno zelena",
+ linen: "lanena",
+ magenta: "magenta",
+ maroon: "kostanjeva",
+ mediumaquamarine: "srednji akvamarin",
+ mediumblue: "srednje modra",
+ mediumorchid: "srednje orhidejasta",
+ mediumpurple: "srednje škrlatna",
+ mediumseagreen: "srednje morsko zelena",
+ mediumslateblue: "srednje skrilasto modra",
+ mediumspringgreen: "srednje pomladno zelena",
+ mediumturquoise: "srednje turkizna",
+ mediumvioletred: "srednje vijolično rdeča",
+ midnightblue: "polnočno modra",
+ mintcream: "metina krema",
+ mistyrose: "megleno rožnata",
+ moccasin: "mokasinasta",
+ navajowhite: "navajo bela",
+ navy: "mornarska",
+ oldlace: "stara čipka",
+ olive: "olivna",
+ olivedrab: "umazano olivna",
+ orange: "oranžna",
+ orangered: "oranžno-rdeča",
+ orchid: "orhidejasta",
+ palegoldenrod: "bleda zlata rozga",
+ palegreen: "bledo zelena",
+ paleturquoise: "bledo turkizna",
+ palevioletred: "bledo vijolično-rdeča",
+ papayawhip: "papaja",
+ peachpuff: "breskova",
+ peru: "perujska",
+ pink: "rožnata",
+ plum: "slivova",
+ powderblue: "kobaltovo modra",
+ purple: "škrlatna",
+ red: "rdeča",
+ rosybrown: "rožnato rjava",
+ royalblue: "kraljevsko modra",
+ saddlebrown: "sedlasto rjava",
+ salmon: "lososova",
+ sandybrown: "peščeno rjava",
+ seagreen: "morsko zelena",
+ seashell: "morska lupina",
+ sienna: "sienna",
+ silver: "srebrna",
+ skyblue: "nebeško modra",
+ slateblue: "skrilasto modra",
+ slategray: "skrilasto siva",
+ slategrey: "skrilasto siva", // same as slategray
+ snow: "snežena",
+ springgreen: "pomladno zelena",
+ steelblue: "kovinsko modra",
+ tan: "rumeno-rjava",
+ teal: "modrozelena",
+ thistle: "osatna",
+ tomato: "paradižnikova",
+ transparent: "prosojno",
+ turquoise: "turkizna",
+ violet: "vijolična",
+ wheat: "pšenična",
+ white: "bela",
+ whitesmoke: "megleno bela",
+ yellow: "rumena",
+ yellowgreen: "rumeno-zelena"
+})
+);
diff --git a/lib/dojo/nls/sv/colors.js b/lib/dojo/nls/sv/colors.js
index 269e85c93..2269abbd0 100644
--- a/lib/dojo/nls/sv/colors.js
+++ b/lib/dojo/nls/sv/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"ljust stålblått","orangered":"orangerött","midnightblue":"midnattsblått","cadetblue":"kadettblått","seashell":"snäckskal","slategrey":"skiffergrått","coral":"korall","darkturquoise":"mörkturkost","antiquewhite":"antikvitt","mediumspringgreen":"mellanvårgrönt","salmon":"laxfärgat","darkgrey":"mörkgrått","ivory":"elfenbensvitt","greenyellow":"gröngult","mistyrose":"dunkelrosa","lightsalmon":"ljust laxfärgat","silver":"silver","dimgrey":"smutsgrått","orange":"orange","white":"vitt","navajowhite":"navajovitt","royalblue":"kungligt blått","deeppink":"djuprosa","lime":"lime","oldlace":"spetsvitt","chartreuse":"chartreuse","darkcyan":"mörkt cyan","yellow":"gult","linen":"linne","olive":"olivfärgat","gold":"guld","lawngreen":"gräsmattegrönt","lightyellow":"ljusgult","tan":"mellanbrunt","darkviolet":"mörkviolett","lightslategrey":"ljust skiffergrått","grey":"grått","darkkhaki":"mörkt kaki","green":"grönt","deepskyblue":"mörkt himmelsblått","aqua":"akvamarin","sienna":"sienna","mintcream":"mintgrädde","rosybrown":"rosenbrunt","mediumslateblue":"mellanskifferblått","magenta":"magenta","lightseagreen":"ljust havsgrönt","cyan":"cyan","olivedrab":"olivsmutsgult","darkgoldenrod":"mörkt gullris","slateblue":"skifferblått","mediumaquamarine":"mellanakvamarin","lavender":"lavendel","mediumseagreen":"mellanhavsgrönt","maroon":"rödbrunt","darkslategray":"mörkt skiffergrått","mediumturquoise":"mellanturkost","ghostwhite":"spökvitt","darkblue":"mörkblått","mediumvioletred":"mellanviolettrött","brown":"brunt","lightgray":"ljusgrått","sandybrown":"sandbrunt","pink":"rosa","firebrick":"tegelstensrött","indigo":"indigo","snow":"snö","darkorchid":"mörkt orkidé","turquoise":"turkost","chocolate":"choklad","springgreen":"vårgrönt","moccasin":"mockasin","navy":"marinblått","lemonchiffon":"citronchiffong","teal":"blågrönt","floralwhite":"blomvitt","cornflowerblue":"kornblått","paleturquoise":"blekturkost","purple":"lila","gainsboro":"gainsboro","plum":"plommon","red":"rött","blue":"blått","forestgreen":"skogsgrönt","darkgreen":"mörkgrönt","honeydew":"honungsdagg","darkseagreen":"mörkt havsgrönt","lightcoral":"ljuskorall","palevioletred":"blekviolettrött","mediumpurple":"mellanlila","saddlebrown":"sadelbrunt","darkmagenta":"mörk magenta","thistle":"tistel","whitesmoke":"vit rök","wheat":"vete","violet":"violett","lightskyblue":"ljust himmelsblått","goldenrod":"gullris","mediumblue":"mellanblått","skyblue":"himmelsblått","crimson":"karmosinrött","darksalmon":"mörkt laxfärgat","darkred":"mörkrött","darkslategrey":"mörkt skiffergrått","peru":"peru","lightgrey":"ljusgrått","lightgoldenrodyellow":"ljust gullrisgult","blanchedalmond":"skållad mandel","aliceblue":"aliceblå","bisque":"biskvi","slategray":"skiffergrått","palegoldenrod":"blekt gullris","darkorange":"mörkorange","aquamarine":"akvamarin","lightgreen":"ljusgrönt","burlywood":"träfärgat","dodgerblue":"dodgerblått","darkgray":"mörkgrått","lightcyan":"ljust cyan","powderblue":"pulverblått","blueviolet":"blåviolett","orchid":"orkidé","dimgray":"smutsgrått","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelskimrande","hotpink":"varmrosa","steelblue":"stålblått","tomato":"tomatrött","lightpink":"ljusrosa","limegreen":"limegrönt","indianred":"indianrött","papayawhip":"papayaröra","lightslategray":"ljust skiffergrått","gray":"grått","mediumorchid":"mellanorkidé","cornsilk":"gulvitt","black":"svart","seagreen":"havsgrönt","darkslateblue":"mörkt skifferblått","khaki":"kaki","lightblue":"ljusblått","palegreen":"blekgrönt","azure":"azurblått","peachpuff":"persika","darkolivegreen":"mörkt olivgrönt","yellowgreen":"gulgrönt"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/sv/colors",({aliceblue:"aliceblå",antiquewhite:"antikvitt",aqua:"akvamarin",aquamarine:"akvamarin",azure:"azurblått",beige:"beige",bisque:"biskvi",black:"svart",blanchedalmond:"skållad mandel",blue:"blått",blueviolet:"blåviolett",brown:"brunt",burlywood:"träfärgat",cadetblue:"kadettblått",chartreuse:"chartreuse",chocolate:"choklad",coral:"korall",cornflowerblue:"kornblått",cornsilk:"gulvitt",crimson:"karmosinrött",cyan:"cyan",darkblue:"mörkblått",darkcyan:"mörkt cyan",darkgoldenrod:"mörkt gullris",darkgray:"mörkgrått",darkgreen:"mörkgrönt",darkgrey:"mörkgrått",darkkhaki:"mörkt kaki",darkmagenta:"mörk magenta",darkolivegreen:"mörkt olivgrönt",darkorange:"mörkorange",darkorchid:"mörkt orkidé",darkred:"mörkrött",darksalmon:"mörkt laxfärgat",darkseagreen:"mörkt havsgrönt",darkslateblue:"mörkt skifferblått",darkslategray:"mörkt skiffergrått",darkslategrey:"mörkt skiffergrått",darkturquoise:"mörkturkost",darkviolet:"mörkviolett",deeppink:"djuprosa",deepskyblue:"mörkt himmelsblått",dimgray:"smutsgrått",dimgrey:"smutsgrått",dodgerblue:"dodgerblått",firebrick:"tegelstensrött",floralwhite:"blomvitt",forestgreen:"skogsgrönt",fuchsia:"fuchsia",gainsboro:"gainsboro",ghostwhite:"spökvitt",gold:"guld",goldenrod:"gullris",gray:"grått",green:"grönt",greenyellow:"gröngult",grey:"grått",honeydew:"honungsdagg",hotpink:"varmrosa",indianred:"indianrött",indigo:"indigo",ivory:"elfenbensvitt",khaki:"kaki",lavender:"lavendel",lavenderblush:"lavendelskimrande",lawngreen:"gräsmattegrönt",lemonchiffon:"citronchiffong",lightblue:"ljusblått",lightcoral:"ljuskorall",lightcyan:"ljust cyan",lightgoldenrodyellow:"ljust gullrisgult",lightgray:"ljusgrått",lightgreen:"ljusgrönt",lightgrey:"ljusgrått",lightpink:"ljusrosa",lightsalmon:"ljust laxfärgat",lightseagreen:"ljust havsgrönt",lightskyblue:"ljust himmelsblått",lightslategray:"ljust skiffergrått",lightslategrey:"ljust skiffergrått",lightsteelblue:"ljust stålblått",lightyellow:"ljusgult",lime:"lime",limegreen:"limegrönt",linen:"linne",magenta:"magenta",maroon:"rödbrunt",mediumaquamarine:"mellanakvamarin",mediumblue:"mellanblått",mediumorchid:"mellanorkidé",mediumpurple:"mellanlila",mediumseagreen:"mellanhavsgrönt",mediumslateblue:"mellanskifferblått",mediumspringgreen:"mellanvårgrönt",mediumturquoise:"mellanturkost",mediumvioletred:"mellanviolettrött",midnightblue:"midnattsblått",mintcream:"mintgrädde",mistyrose:"dunkelrosa",moccasin:"mockasin",navajowhite:"navajovitt",navy:"marinblått",oldlace:"spetsvitt",olive:"olivfärgat",olivedrab:"olivsmutsgult",orange:"orange",orangered:"orangerött",orchid:"orkidé",palegoldenrod:"blekt gullris",palegreen:"blekgrönt",paleturquoise:"blekturkost",palevioletred:"blekviolettrött",papayawhip:"papayaröra",peachpuff:"persika",peru:"peru",pink:"rosa",plum:"plommon",powderblue:"pulverblått",purple:"lila",red:"rött",rosybrown:"rosenbrunt",royalblue:"kungligt blått",saddlebrown:"sadelbrunt",salmon:"laxfärgat",sandybrown:"sandbrunt",seagreen:"havsgrönt",seashell:"snäckskal",sienna:"sienna",silver:"silver",skyblue:"himmelsblått",slateblue:"skifferblått",slategray:"skiffergrått",slategrey:"skiffergrått",snow:"snö",springgreen:"vårgrönt",steelblue:"stålblått",tan:"mellanbrunt",teal:"blågrönt",thistle:"tistel",tomato:"tomatrött",transparent:"transparent",turquoise:"turkost",violet:"violett",wheat:"vete",white:"vitt",whitesmoke:"vit rök",yellow:"gult",yellowgreen:"gulgrönt"})); \ No newline at end of file
diff --git a/lib/dojo/nls/sv/colors.js.uncompressed.js b/lib/dojo/nls/sv/colors.js.uncompressed.js
new file mode 100644
index 000000000..2aba2e334
--- /dev/null
+++ b/lib/dojo/nls/sv/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/sv/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "aliceblå",
+ antiquewhite: "antikvitt",
+ aqua: "akvamarin",
+ aquamarine: "akvamarin",
+ azure: "azurblått",
+ beige: "beige",
+ bisque: "biskvi",
+ black: "svart",
+ blanchedalmond: "skållad mandel",
+ blue: "blått",
+ blueviolet: "blåviolett",
+ brown: "brunt",
+ burlywood: "träfärgat",
+ cadetblue: "kadettblått",
+ chartreuse: "chartreuse",
+ chocolate: "choklad",
+ coral: "korall",
+ cornflowerblue: "kornblått",
+ cornsilk: "gulvitt",
+ crimson: "karmosinrött",
+ cyan: "cyan",
+ darkblue: "mörkblått",
+ darkcyan: "mörkt cyan",
+ darkgoldenrod: "mörkt gullris",
+ darkgray: "mörkgrått",
+ darkgreen: "mörkgrönt",
+ darkgrey: "mörkgrått", // same as darkgray
+ darkkhaki: "mörkt kaki",
+ darkmagenta: "mörk magenta",
+ darkolivegreen: "mörkt olivgrönt",
+ darkorange: "mörkorange",
+ darkorchid: "mörkt orkidé",
+ darkred: "mörkrött",
+ darksalmon: "mörkt laxfärgat",
+ darkseagreen: "mörkt havsgrönt",
+ darkslateblue: "mörkt skifferblått",
+ darkslategray: "mörkt skiffergrått",
+ darkslategrey: "mörkt skiffergrått", // same as darkslategray
+ darkturquoise: "mörkturkost",
+ darkviolet: "mörkviolett",
+ deeppink: "djuprosa",
+ deepskyblue: "mörkt himmelsblått",
+ dimgray: "smutsgrått",
+ dimgrey: "smutsgrått", // same as dimgray
+ dodgerblue: "dodgerblått",
+ firebrick: "tegelstensrött",
+ floralwhite: "blomvitt",
+ forestgreen: "skogsgrönt",
+ fuchsia: "fuchsia",
+ gainsboro: "gainsboro",
+ ghostwhite: "spökvitt",
+ gold: "guld",
+ goldenrod: "gullris",
+ gray: "grått",
+ green: "grönt",
+ greenyellow: "gröngult",
+ grey: "grått", // same as gray
+ honeydew: "honungsdagg",
+ hotpink: "varmrosa",
+ indianred: "indianrött",
+ indigo: "indigo",
+ ivory: "elfenbensvitt",
+ khaki: "kaki",
+ lavender: "lavendel",
+ lavenderblush: "lavendelskimrande",
+ lawngreen: "gräsmattegrönt",
+ lemonchiffon: "citronchiffong",
+ lightblue: "ljusblått",
+ lightcoral: "ljuskorall",
+ lightcyan: "ljust cyan",
+ lightgoldenrodyellow: "ljust gullrisgult",
+ lightgray: "ljusgrått",
+ lightgreen: "ljusgrönt",
+ lightgrey: "ljusgrått", // same as lightgray
+ lightpink: "ljusrosa",
+ lightsalmon: "ljust laxfärgat",
+ lightseagreen: "ljust havsgrönt",
+ lightskyblue: "ljust himmelsblått",
+ lightslategray: "ljust skiffergrått",
+ lightslategrey: "ljust skiffergrått", // same as lightslategray
+ lightsteelblue: "ljust stålblått",
+ lightyellow: "ljusgult",
+ lime: "lime",
+ limegreen: "limegrönt",
+ linen: "linne",
+ magenta: "magenta",
+ maroon: "rödbrunt",
+ mediumaquamarine: "mellanakvamarin",
+ mediumblue: "mellanblått",
+ mediumorchid: "mellanorkidé",
+ mediumpurple: "mellanlila",
+ mediumseagreen: "mellanhavsgrönt",
+ mediumslateblue: "mellanskifferblått",
+ mediumspringgreen: "mellanvårgrönt",
+ mediumturquoise: "mellanturkost",
+ mediumvioletred: "mellanviolettrött",
+ midnightblue: "midnattsblått",
+ mintcream: "mintgrädde",
+ mistyrose: "dunkelrosa",
+ moccasin: "mockasin",
+ navajowhite: "navajovitt",
+ navy: "marinblått",
+ oldlace: "spetsvitt",
+ olive: "olivfärgat",
+ olivedrab: "olivsmutsgult",
+ orange: "orange",
+ orangered: "orangerött",
+ orchid: "orkidé",
+ palegoldenrod: "blekt gullris",
+ palegreen: "blekgrönt",
+ paleturquoise: "blekturkost",
+ palevioletred: "blekviolettrött",
+ papayawhip: "papayaröra",
+ peachpuff: "persika",
+ peru: "peru",
+ pink: "rosa",
+ plum: "plommon",
+ powderblue: "pulverblått",
+ purple: "lila",
+ red: "rött",
+ rosybrown: "rosenbrunt",
+ royalblue: "kungligt blått",
+ saddlebrown: "sadelbrunt",
+ salmon: "laxfärgat",
+ sandybrown: "sandbrunt",
+ seagreen: "havsgrönt",
+ seashell: "snäckskal",
+ sienna: "sienna",
+ silver: "silver",
+ skyblue: "himmelsblått",
+ slateblue: "skifferblått",
+ slategray: "skiffergrått",
+ slategrey: "skiffergrått", // same as slategray
+ snow: "snö",
+ springgreen: "vårgrönt",
+ steelblue: "stålblått",
+ tan: "mellanbrunt",
+ teal: "blågrönt",
+ thistle: "tistel",
+ tomato: "tomatrött",
+ transparent: "transparent",
+ turquoise: "turkost",
+ violet: "violett",
+ wheat: "vete",
+ white: "vitt",
+ whitesmoke: "vit rök",
+ yellow: "gult",
+ yellowgreen: "gulgrönt"
+})
+);
diff --git a/lib/dojo/nls/th/colors.js b/lib/dojo/nls/th/colors.js
index 706ed8a65..be239a3b2 100644
--- a/lib/dojo/nls/th/colors.js
+++ b/lib/dojo/nls/th/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"light steel blue","orangered":"ส้มแกมแดง","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"เทาเข้ม","ivory":"งาช้าง","greenyellow":"เขียวแกมเหลือง","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"เงิน","dimgrey":"dim gray","orange":"ส้ม","white":"ขาว","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"ชมพูเข้ม","lime":"เหลืองมะนาว","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"เขียวแกมน้ำเงินเข้ม","yellow":"เหลือง","linen":"linen","olive":"โอลีฟ","gold":"ทอง","lawngreen":"lawn green","lightyellow":"เหลืองอ่อน","tan":"tan","darkviolet":"ม่วงเข้ม","lightslategrey":"light slate gray","grey":"เทา","darkkhaki":"dark khaki","green":"เขียว","deepskyblue":"deep sky blue","aqua":"ฟ้าน้ำทะเล","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"แดงแกมม่วง","lightseagreen":"light sea green","cyan":"เขียวแกมน้ำเงิน","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"ม่วงลาเวนเดอร์","mediumseagreen":"medium sea green","maroon":"น้ำตาลแดง","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"น้ำเงินเข้ม","mediumvioletred":"medium violet-red","brown":"น้ำตาล","lightgray":"เทาอ่อน","sandybrown":"sandy brown","pink":"ชมพู","firebrick":"สีอิฐ","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"ช็อกโกแลต","springgreen":"spring green","moccasin":"ม็อคค่า","navy":"น้ำเงินเข้ม","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"ม่วง","gainsboro":"gainsboro","plum":"plum","red":"แดง","blue":"น้ำเงิน","forestgreen":"forest green","darkgreen":"เขียวเข้ม","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"แดงแกมม่วงเข้ม","thistle":"thistle","whitesmoke":"ขาวควัน","wheat":"wheat","violet":"ม่วง","lightskyblue":"ฟ้าอ่อน","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"แดงเลือดหมู","darksalmon":"dark salmon","darkred":"แดงเข้ม","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"เทาอ่อน","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"ส้มเข้ม","aquamarine":"aquamarine","lightgreen":"เขียวอ่อน","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"เทาเข้ม","lightcyan":"เขียวแกมน้ำเงินอ่อน","powderblue":"powder blue","blueviolet":"น้ำเงินม่วง","orchid":"orchid","dimgray":"dim gray","beige":"น้ำตาลเบจ","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"ชมพูอ่อน","limegreen":"เขียวมะนาว","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"เทา","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"ดำ","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"น้ำเงินอ่อน","palegreen":"pale green","azure":"น้ำเงินฟ้า","peachpuff":"peach puff","darkolivegreen":"เขียวโอลีฟเข้ม","yellowgreen":"เหลืองแกมเขียว"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/th/colors",({aliceblue:"alice blue",antiquewhite:"antique white",aqua:"ฟ้าน้ำทะเล",aquamarine:"aquamarine",azure:"น้ำเงินฟ้า",beige:"น้ำตาลเบจ",bisque:"bisque",black:"ดำ",blanchedalmond:"blanched almond",blue:"น้ำเงิน",blueviolet:"น้ำเงินม่วง",brown:"น้ำตาล",burlywood:"burlywood",cadetblue:"cadet blue",chartreuse:"chartreuse",chocolate:"ช็อกโกแลต",coral:"coral",cornflowerblue:"cornflower blue",cornsilk:"cornsilk",crimson:"แดงเลือดหมู",cyan:"เขียวแกมน้ำเงิน",darkblue:"น้ำเงินเข้ม",darkcyan:"เขียวแกมน้ำเงินเข้ม",darkgoldenrod:"dark goldenrod",darkgray:"เทาเข้ม",darkgreen:"เขียวเข้ม",darkgrey:"เทาเข้ม",darkkhaki:"dark khaki",darkmagenta:"แดงแกมม่วงเข้ม",darkolivegreen:"เขียวโอลีฟเข้ม",darkorange:"ส้มเข้ม",darkorchid:"dark orchid",darkred:"แดงเข้ม",darksalmon:"dark salmon",darkseagreen:"dark sea green",darkslateblue:"dark slate blue",darkslategray:"dark slate gray",darkslategrey:"dark slate gray",darkturquoise:"dark turquoise",darkviolet:"ม่วงเข้ม",deeppink:"ชมพูเข้ม",deepskyblue:"deep sky blue",dimgray:"dim gray",dimgrey:"dim gray",dodgerblue:"dodger blue",firebrick:"สีอิฐ",floralwhite:"floral white",forestgreen:"forest green",fuchsia:"fuchsia",gainsboro:"gainsboro",ghostwhite:"ghost white",gold:"ทอง",goldenrod:"goldenrod",gray:"เทา",green:"เขียว",greenyellow:"เขียวแกมเหลือง",grey:"เทา",honeydew:"honeydew",hotpink:"hot pink",indianred:"indian red",indigo:"indigo",ivory:"งาช้าง",khaki:"khaki",lavender:"ม่วงลาเวนเดอร์",lavenderblush:"lavender blush",lawngreen:"lawn green",lemonchiffon:"lemon chiffon",lightblue:"น้ำเงินอ่อน",lightcoral:"light coral",lightcyan:"เขียวแกมน้ำเงินอ่อน",lightgoldenrodyellow:"light goldenrod yellow",lightgray:"เทาอ่อน",lightgreen:"เขียวอ่อน",lightgrey:"เทาอ่อน",lightpink:"ชมพูอ่อน",lightsalmon:"light salmon",lightseagreen:"light sea green",lightskyblue:"ฟ้าอ่อน",lightslategray:"light slate gray",lightslategrey:"light slate gray",lightsteelblue:"light steel blue",lightyellow:"เหลืองอ่อน",lime:"เหลืองมะนาว",limegreen:"เขียวมะนาว",linen:"linen",magenta:"แดงแกมม่วง",maroon:"น้ำตาลแดง",mediumaquamarine:"medium aquamarine",mediumblue:"medium blue",mediumorchid:"medium orchid",mediumpurple:"medium purple",mediumseagreen:"medium sea green",mediumslateblue:"medium slate blue",mediumspringgreen:"medium spring green",mediumturquoise:"medium turquoise",mediumvioletred:"medium violet-red",midnightblue:"midnight blue",mintcream:"mint cream",mistyrose:"misty rose",moccasin:"ม็อคค่า",navajowhite:"navajo white",navy:"น้ำเงินเข้ม",oldlace:"old lace",olive:"โอลีฟ",olivedrab:"olive drab",orange:"ส้ม",orangered:"ส้มแกมแดง",orchid:"orchid",palegoldenrod:"pale goldenrod",palegreen:"pale green",paleturquoise:"pale turquoise",palevioletred:"pale violet-red",papayawhip:"papaya whip",peachpuff:"peach puff",peru:"peru",pink:"ชมพู",plum:"plum",powderblue:"powder blue",purple:"ม่วง",red:"แดง",rosybrown:"rosy brown",royalblue:"royal blue",saddlebrown:"saddle brown",salmon:"salmon",sandybrown:"sandy brown",seagreen:"sea green",seashell:"seashell",sienna:"sienna",silver:"เงิน",skyblue:"sky blue",slateblue:"slate blue",slategray:"slate gray",slategrey:"slate gray",snow:"snow",springgreen:"spring green",steelblue:"steel blue",tan:"tan",teal:"teal",thistle:"thistle",tomato:"tomato",transparent:"สีใส",turquoise:"turquoise",violet:"ม่วง",wheat:"wheat",white:"ขาว",whitesmoke:"ขาวควัน",yellow:"เหลือง",yellowgreen:"เหลืองแกมเขียว"})); \ No newline at end of file
diff --git a/lib/dojo/nls/th/colors.js.uncompressed.js b/lib/dojo/nls/th/colors.js.uncompressed.js
new file mode 100644
index 000000000..3159be889
--- /dev/null
+++ b/lib/dojo/nls/th/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/th/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "alice blue",
+ antiquewhite: "antique white",
+ aqua: "ฟ้าน้ำทะเล",
+ aquamarine: "aquamarine",
+ azure: "น้ำเงินฟ้า",
+ beige: "น้ำตาลเบจ",
+ bisque: "bisque",
+ black: "ดำ",
+ blanchedalmond: "blanched almond",
+ blue: "น้ำเงิน",
+ blueviolet: "น้ำเงินม่วง",
+ brown: "น้ำตาล",
+ burlywood: "burlywood",
+ cadetblue: "cadet blue",
+ chartreuse: "chartreuse",
+ chocolate: "ช็อกโกแลต",
+ coral: "coral",
+ cornflowerblue: "cornflower blue",
+ cornsilk: "cornsilk",
+ crimson: "แดงเลือดหมู",
+ cyan: "เขียวแกมน้ำเงิน",
+ darkblue: "น้ำเงินเข้ม",
+ darkcyan: "เขียวแกมน้ำเงินเข้ม",
+ darkgoldenrod: "dark goldenrod",
+ darkgray: "เทาเข้ม",
+ darkgreen: "เขียวเข้ม",
+ darkgrey: "เทาเข้ม", // same as darkgray
+ darkkhaki: "dark khaki",
+ darkmagenta: "แดงแกมม่วงเข้ม",
+ darkolivegreen: "เขียวโอลีฟเข้ม",
+ darkorange: "ส้มเข้ม",
+ darkorchid: "dark orchid",
+ darkred: "แดงเข้ม",
+ darksalmon: "dark salmon",
+ darkseagreen: "dark sea green",
+ darkslateblue: "dark slate blue",
+ darkslategray: "dark slate gray",
+ darkslategrey: "dark slate gray", // same as darkslategray
+ darkturquoise: "dark turquoise",
+ darkviolet: "ม่วงเข้ม",
+ deeppink: "ชมพูเข้ม",
+ deepskyblue: "deep sky blue",
+ dimgray: "dim gray",
+ dimgrey: "dim gray", // same as dimgray
+ dodgerblue: "dodger blue",
+ firebrick: "สีอิฐ",
+ floralwhite: "floral white",
+ forestgreen: "forest green",
+ fuchsia: "fuchsia",
+ gainsboro: "gainsboro",
+ ghostwhite: "ghost white",
+ gold: "ทอง",
+ goldenrod: "goldenrod",
+ gray: "เทา",
+ green: "เขียว",
+ greenyellow: "เขียวแกมเหลือง",
+ grey: "เทา", // same as gray
+ honeydew: "honeydew",
+ hotpink: "hot pink",
+ indianred: "indian red",
+ indigo: "indigo",
+ ivory: "งาช้าง",
+ khaki: "khaki",
+ lavender: "ม่วงลาเวนเดอร์",
+ lavenderblush: "lavender blush",
+ lawngreen: "lawn green",
+ lemonchiffon: "lemon chiffon",
+ lightblue: "น้ำเงินอ่อน",
+ lightcoral: "light coral",
+ lightcyan: "เขียวแกมน้ำเงินอ่อน",
+ lightgoldenrodyellow: "light goldenrod yellow",
+ lightgray: "เทาอ่อน",
+ lightgreen: "เขียวอ่อน",
+ lightgrey: "เทาอ่อน", // same as lightgray
+ lightpink: "ชมพูอ่อน",
+ lightsalmon: "light salmon",
+ lightseagreen: "light sea green",
+ lightskyblue: "ฟ้าอ่อน",
+ lightslategray: "light slate gray",
+ lightslategrey: "light slate gray", // same as lightslategray
+ lightsteelblue: "light steel blue",
+ lightyellow: "เหลืองอ่อน",
+ lime: "เหลืองมะนาว",
+ limegreen: "เขียวมะนาว",
+ linen: "linen",
+ magenta: "แดงแกมม่วง",
+ maroon: "น้ำตาลแดง",
+ mediumaquamarine: "medium aquamarine",
+ mediumblue: "medium blue",
+ mediumorchid: "medium orchid",
+ mediumpurple: "medium purple",
+ mediumseagreen: "medium sea green",
+ mediumslateblue: "medium slate blue",
+ mediumspringgreen: "medium spring green",
+ mediumturquoise: "medium turquoise",
+ mediumvioletred: "medium violet-red",
+ midnightblue: "midnight blue",
+ mintcream: "mint cream",
+ mistyrose: "misty rose",
+ moccasin: "ม็อคค่า",
+ navajowhite: "navajo white",
+ navy: "น้ำเงินเข้ม",
+ oldlace: "old lace",
+ olive: "โอลีฟ",
+ olivedrab: "olive drab",
+ orange: "ส้ม",
+ orangered: "ส้มแกมแดง",
+ orchid: "orchid",
+ palegoldenrod: "pale goldenrod",
+ palegreen: "pale green",
+ paleturquoise: "pale turquoise",
+ palevioletred: "pale violet-red",
+ papayawhip: "papaya whip",
+ peachpuff: "peach puff",
+ peru: "peru",
+ pink: "ชมพู",
+ plum: "plum",
+ powderblue: "powder blue",
+ purple: "ม่วง",
+ red: "แดง",
+ rosybrown: "rosy brown",
+ royalblue: "royal blue",
+ saddlebrown: "saddle brown",
+ salmon: "salmon",
+ sandybrown: "sandy brown",
+ seagreen: "sea green",
+ seashell: "seashell",
+ sienna: "sienna",
+ silver: "เงิน",
+ skyblue: "sky blue",
+ slateblue: "slate blue",
+ slategray: "slate gray",
+ slategrey: "slate gray", // same as slategray
+ snow: "snow",
+ springgreen: "spring green",
+ steelblue: "steel blue",
+ tan: "tan",
+ teal: "teal",
+ thistle: "thistle",
+ tomato: "tomato",
+ transparent: "สีใส",
+ turquoise: "turquoise",
+ violet: "ม่วง",
+ wheat: "wheat",
+ white: "ขาว",
+ whitesmoke: "ขาวควัน",
+ yellow: "เหลือง",
+ yellowgreen: "เหลืองแกมเขียว"
+})
+);
diff --git a/lib/dojo/nls/tr/colors.js b/lib/dojo/nls/tr/colors.js
index a75f12ff9..83ec98fda 100644
--- a/lib/dojo/nls/tr/colors.js
+++ b/lib/dojo/nls/tr/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"açık metalik mavi","orangered":"turuncu kırmızı","midnightblue":"gece mavisi","cadetblue":"denizci mavisi","seashell":"deniz kabuğu","slategrey":"arduvaz grisi","coral":"mercan","darkturquoise":"koyu turkuaz","antiquewhite":"antik beyaz","mediumspringgreen":"orta bahar yeşili","salmon":"somon","darkgrey":"koyu gri","ivory":"fildişi","greenyellow":"yeşil-sarı","mistyrose":"gülkurusu","lightsalmon":"açık somon","silver":"gümüş","dimgrey":"soluk gri","orange":"turuncu","white":"beyaz","navajowhite":"navajo beyazı","royalblue":"parlak koyu mavi","deeppink":"koyu pembe","lime":"limon yeşili","oldlace":"eski dantel","chartreuse":"chartreuse","darkcyan":"koyu camgöbeği","yellow":"sarı","linen":"keten","olive":"zeytin","gold":"altın","lawngreen":"çimen yeşili","lightyellow":"açık sarı","tan":"güneş yanığı","darkviolet":"koyu eflatun","lightslategrey":"açık arduvaz grisi","grey":"gri","darkkhaki":"koyu haki","green":"yeşil","deepskyblue":"koyu gök mavisi","aqua":"deniz mavisi","sienna":"koyu kahve","mintcream":"naneli krem","rosybrown":"pembemsi kahverengi","mediumslateblue":"orta arduvaz mavisi","magenta":"macenta","lightseagreen":"açık deniz yeşili","cyan":"camgöbeği","olivedrab":"asker yeşili","darkgoldenrod":"koyu sarı","slateblue":"arduvaz mavisi","mediumaquamarine":"orta akuamarin","lavender":"lavanta","mediumseagreen":"orta deniz yeşili","maroon":"kestane","darkslategray":"koyu arduvaz grisi","mediumturquoise":"orta turkuaz","ghostwhite":"silik beyaz","darkblue":"koyu mavi","mediumvioletred":"orta menekşe kırmızısı","brown":"kahverengi","lightgray":"açık gri","sandybrown":"kum rengi","pink":"pembe","firebrick":"canlı kiremit","indigo":"çivit mavisi","snow":"kar","darkorchid":"koyu orkide","turquoise":"turkuaz","chocolate":"çikolata","springgreen":"bahar yeşili","moccasin":"mokosen","navy":"lacivert","lemonchiffon":"limoni","teal":"Teal mavi","floralwhite":"çiçek beyazı","cornflowerblue":"peygamber çiçeği mavisi","paleturquoise":"soluk turkuaz","purple":"mor","gainsboro":"gainsboro","plum":"erik","red":"kırmızı","blue":"mavi","forestgreen":"koyu deniz yeşili","darkgreen":"koyu yeşil","honeydew":"çam sakızı","darkseagreen":"koyu deniz yeşili","lightcoral":"açık mercan","palevioletred":"soluk menekşe kırmızısı","mediumpurple":"orta mor","saddlebrown":"açık kahve","darkmagenta":"koyu mor","thistle":"devedikeni","whitesmoke":"beyaz duman","wheat":"buğday","violet":"eflatun","lightskyblue":"açık gök mavisi","goldenrod":"sarısabır","mediumblue":"orta mavi","skyblue":"gök mavisi","crimson":"crimson","darksalmon":"koyu somon","darkred":"koyu kırmızı","darkslategrey":"koyu arduvaz grisi","peru":"peru","lightgrey":"açık gri","lightgoldenrodyellow":"açık sarısabır","blanchedalmond":"soluk badem","aliceblue":"alice mavisi","bisque":"bisküvi","slategray":"arduvaz grisi","palegoldenrod":"soluk sarısabır","darkorange":"koyu turuncu","aquamarine":"akuamarin","lightgreen":"açık yeşil","burlywood":"sarımsı kahverengi","dodgerblue":"toz mavisi","darkgray":"koyu gri","lightcyan":"açık camgöbeği","powderblue":"pudra mavisi","blueviolet":"mavi-mor","orchid":"orkide","dimgray":"soluk gri","beige":"bej","fuchsia":"fuşya","lavenderblush":"lavanta pembesi","hotpink":"sıcak pembe","steelblue":"metalik mavi","tomato":"domates","lightpink":"açık pembe","limegreen":"küf yeşili","indianred":"kızılderili kırmızısı","papayawhip":"papaya sapı","lightslategray":"açık arduvaz grisi","gray":"gri","mediumorchid":"orta orkide","cornsilk":"mısır rengi","black":"siyah","seagreen":"deniz yeşili","darkslateblue":"koyu arduvaz mavisi","khaki":"haki","lightblue":"açık mavi","palegreen":"soluk yeşil","azure":"azur mavisi","peachpuff":"açık şeftali","darkolivegreen":"koyu zeytin yeşili","yellowgreen":"sarı yeşil"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tr/colors",({aliceblue:"alice mavisi",antiquewhite:"antik beyaz",aqua:"deniz mavisi",aquamarine:"akuamarin",azure:"azur mavisi",beige:"bej",bisque:"bisküvi",black:"siyah",blanchedalmond:"soluk badem",blue:"mavi",blueviolet:"mavi-mor",brown:"kahverengi",burlywood:"sarımsı kahverengi",cadetblue:"denizci mavisi",chartreuse:"chartreuse",chocolate:"çikolata",coral:"mercan",cornflowerblue:"peygamber çiçeği mavisi",cornsilk:"mısır rengi",crimson:"crimson",cyan:"camgöbeği",darkblue:"koyu mavi",darkcyan:"koyu camgöbeği",darkgoldenrod:"koyu sarı",darkgray:"koyu gri",darkgreen:"koyu yeşil",darkgrey:"koyu gri",darkkhaki:"koyu haki",darkmagenta:"koyu mor",darkolivegreen:"koyu zeytin yeşili",darkorange:"koyu turuncu",darkorchid:"koyu orkide",darkred:"koyu kırmızı",darksalmon:"koyu somon",darkseagreen:"koyu deniz yeşili",darkslateblue:"koyu arduvaz mavisi",darkslategray:"koyu arduvaz grisi",darkslategrey:"koyu arduvaz grisi",darkturquoise:"koyu turkuaz",darkviolet:"koyu eflatun",deeppink:"koyu pembe",deepskyblue:"koyu gök mavisi",dimgray:"soluk gri",dimgrey:"soluk gri",dodgerblue:"toz mavisi",firebrick:"canlı kiremit",floralwhite:"çiçek beyazı",forestgreen:"koyu deniz yeşili",fuchsia:"fuşya",gainsboro:"gainsboro",ghostwhite:"silik beyaz",gold:"altın",goldenrod:"sarısabır",gray:"gri",green:"yeşil",greenyellow:"yeşil-sarı",grey:"gri",honeydew:"çam sakızı",hotpink:"sıcak pembe",indianred:"kızılderili kırmızısı",indigo:"çivit mavisi",ivory:"fildişi",khaki:"haki",lavender:"lavanta",lavenderblush:"lavanta pembesi",lawngreen:"çimen yeşili",lemonchiffon:"limoni",lightblue:"açık mavi",lightcoral:"açık mercan",lightcyan:"açık camgöbeği",lightgoldenrodyellow:"açık sarısabır",lightgray:"açık gri",lightgreen:"açık yeşil",lightgrey:"açık gri",lightpink:"açık pembe",lightsalmon:"açık somon",lightseagreen:"açık deniz yeşili",lightskyblue:"açık gök mavisi",lightslategray:"açık arduvaz grisi",lightslategrey:"açık arduvaz grisi",lightsteelblue:"açık metalik mavi",lightyellow:"açık sarı",lime:"limon yeşili",limegreen:"küf yeşili",linen:"keten",magenta:"macenta",maroon:"kestane",mediumaquamarine:"orta akuamarin",mediumblue:"orta mavi",mediumorchid:"orta orkide",mediumpurple:"orta mor",mediumseagreen:"orta deniz yeşili",mediumslateblue:"orta arduvaz mavisi",mediumspringgreen:"orta bahar yeşili",mediumturquoise:"orta turkuaz",mediumvioletred:"orta menekşe kırmızısı",midnightblue:"gece mavisi",mintcream:"naneli krem",mistyrose:"gülkurusu",moccasin:"mokosen",navajowhite:"navajo beyazı",navy:"lacivert",oldlace:"eski dantel",olive:"zeytin",olivedrab:"asker yeşili",orange:"turuncu",orangered:"turuncu kırmızı",orchid:"orkide",palegoldenrod:"soluk sarısabır",palegreen:"soluk yeşil",paleturquoise:"soluk turkuaz",palevioletred:"soluk menekşe kırmızısı",papayawhip:"papaya sapı",peachpuff:"açık şeftali",peru:"peru",pink:"pembe",plum:"erik",powderblue:"pudra mavisi",purple:"mor",red:"kırmızı",rosybrown:"pembemsi kahverengi",royalblue:"parlak koyu mavi",saddlebrown:"açık kahve",salmon:"somon",sandybrown:"kum rengi",seagreen:"deniz yeşili",seashell:"deniz kabuğu",sienna:"koyu kahve",silver:"gümüş",skyblue:"gök mavisi",slateblue:"arduvaz mavisi",slategray:"arduvaz grisi",slategrey:"arduvaz grisi",snow:"kar",springgreen:"bahar yeşili",steelblue:"metalik mavi",tan:"güneş yanığı",teal:"Teal mavi",thistle:"devedikeni",tomato:"domates",transparent:"saydam",turquoise:"turkuaz",violet:"eflatun",wheat:"buğday",white:"beyaz",whitesmoke:"beyaz duman",yellow:"sarı",yellowgreen:"sarı yeşil"})); \ No newline at end of file
diff --git a/lib/dojo/nls/tr/colors.js.uncompressed.js b/lib/dojo/nls/tr/colors.js.uncompressed.js
new file mode 100644
index 000000000..8b9020f06
--- /dev/null
+++ b/lib/dojo/nls/tr/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/tr/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "alice mavisi",
+ antiquewhite: "antik beyaz",
+ aqua: "deniz mavisi",
+ aquamarine: "akuamarin",
+ azure: "azur mavisi",
+ beige: "bej",
+ bisque: "bisküvi",
+ black: "siyah",
+ blanchedalmond: "soluk badem",
+ blue: "mavi",
+ blueviolet: "mavi-mor",
+ brown: "kahverengi",
+ burlywood: "sarımsı kahverengi",
+ cadetblue: "denizci mavisi",
+ chartreuse: "chartreuse",
+ chocolate: "çikolata",
+ coral: "mercan",
+ cornflowerblue: "peygamber çiçeği mavisi",
+ cornsilk: "mısır rengi",
+ crimson: "crimson",
+ cyan: "camgöbeği",
+ darkblue: "koyu mavi",
+ darkcyan: "koyu camgöbeği",
+ darkgoldenrod: "koyu sarı",
+ darkgray: "koyu gri",
+ darkgreen: "koyu yeşil",
+ darkgrey: "koyu gri", // same as darkgray
+ darkkhaki: "koyu haki",
+ darkmagenta: "koyu mor",
+ darkolivegreen: "koyu zeytin yeşili",
+ darkorange: "koyu turuncu",
+ darkorchid: "koyu orkide",
+ darkred: "koyu kırmızı",
+ darksalmon: "koyu somon",
+ darkseagreen: "koyu deniz yeşili",
+ darkslateblue: "koyu arduvaz mavisi",
+ darkslategray: "koyu arduvaz grisi",
+ darkslategrey: "koyu arduvaz grisi", // same as darkslategray
+ darkturquoise: "koyu turkuaz",
+ darkviolet: "koyu eflatun",
+ deeppink: "koyu pembe",
+ deepskyblue: "koyu gök mavisi",
+ dimgray: "soluk gri",
+ dimgrey: "soluk gri", // same as dimgray
+ dodgerblue: "toz mavisi",
+ firebrick: "canlı kiremit",
+ floralwhite: "çiçek beyazı",
+ forestgreen: "koyu deniz yeşili",
+ fuchsia: "fuşya",
+ gainsboro: "gainsboro",
+ ghostwhite: "silik beyaz",
+ gold: "altın",
+ goldenrod: "sarısabır",
+ gray: "gri",
+ green: "yeşil",
+ greenyellow: "yeşil-sarı",
+ grey: "gri", // same as gray
+ honeydew: "çam sakızı",
+ hotpink: "sıcak pembe",
+ indianred: "kızılderili kırmızısı",
+ indigo: "çivit mavisi",
+ ivory: "fildişi",
+ khaki: "haki",
+ lavender: "lavanta",
+ lavenderblush: "lavanta pembesi",
+ lawngreen: "çimen yeşili",
+ lemonchiffon: "limoni",
+ lightblue: "açık mavi",
+ lightcoral: "açık mercan",
+ lightcyan: "açık camgöbeği",
+ lightgoldenrodyellow: "açık sarısabır",
+ lightgray: "açık gri",
+ lightgreen: "açık yeşil",
+ lightgrey: "açık gri", // same as lightgray
+ lightpink: "açık pembe",
+ lightsalmon: "açık somon",
+ lightseagreen: "açık deniz yeşili",
+ lightskyblue: "açık gök mavisi",
+ lightslategray: "açık arduvaz grisi",
+ lightslategrey: "açık arduvaz grisi", // same as lightslategray
+ lightsteelblue: "açık metalik mavi",
+ lightyellow: "açık sarı",
+ lime: "limon yeşili",
+ limegreen: "küf yeşili",
+ linen: "keten",
+ magenta: "macenta",
+ maroon: "kestane",
+ mediumaquamarine: "orta akuamarin",
+ mediumblue: "orta mavi",
+ mediumorchid: "orta orkide",
+ mediumpurple: "orta mor",
+ mediumseagreen: "orta deniz yeşili",
+ mediumslateblue: "orta arduvaz mavisi",
+ mediumspringgreen: "orta bahar yeşili",
+ mediumturquoise: "orta turkuaz",
+ mediumvioletred: "orta menekşe kırmızısı",
+ midnightblue: "gece mavisi",
+ mintcream: "naneli krem",
+ mistyrose: "gülkurusu",
+ moccasin: "mokosen",
+ navajowhite: "navajo beyazı",
+ navy: "lacivert",
+ oldlace: "eski dantel",
+ olive: "zeytin",
+ olivedrab: "asker yeşili",
+ orange: "turuncu",
+ orangered: "turuncu kırmızı",
+ orchid: "orkide",
+ palegoldenrod: "soluk sarısabır",
+ palegreen: "soluk yeşil",
+ paleturquoise: "soluk turkuaz",
+ palevioletred: "soluk menekşe kırmızısı",
+ papayawhip: "papaya sapı",
+ peachpuff: "açık şeftali",
+ peru: "peru",
+ pink: "pembe",
+ plum: "erik",
+ powderblue: "pudra mavisi",
+ purple: "mor",
+ red: "kırmızı",
+ rosybrown: "pembemsi kahverengi",
+ royalblue: "parlak koyu mavi",
+ saddlebrown: "açık kahve",
+ salmon: "somon",
+ sandybrown: "kum rengi",
+ seagreen: "deniz yeşili",
+ seashell: "deniz kabuğu",
+ sienna: "koyu kahve",
+ silver: "gümüş",
+ skyblue: "gök mavisi",
+ slateblue: "arduvaz mavisi",
+ slategray: "arduvaz grisi",
+ slategrey: "arduvaz grisi", // same as slategray
+ snow: "kar",
+ springgreen: "bahar yeşili",
+ steelblue: "metalik mavi",
+ tan: "güneş yanığı",
+ teal: "Teal mavi",
+ thistle: "devedikeni",
+ tomato: "domates",
+ transparent: "saydam",
+ turquoise: "turkuaz",
+ violet: "eflatun",
+ wheat: "buğday",
+ white: "beyaz",
+ whitesmoke: "beyaz duman",
+ yellow: "sarı",
+ yellowgreen: "sarı yeşil"
+})
+);
diff --git a/lib/dojo/nls/tt-rss-layer_ROOT.js b/lib/dojo/nls/tt-rss-layer_ROOT.js
index 5cd71420f..ebad6b976 100644
--- a/lib/dojo/nls/tt-rss-layer_ROOT.js
+++ b/lib/dojo/nls/tt-rss-layer_ROOT.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_ROOT");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ROOT");dojo.nls.colors.ROOT={"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ROOT");dijit.nls.loading.ROOT={"loadingState":"Loading...","errorState":"Sorry, an error occurred"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ROOT");dijit.nls.common.ROOT={"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ROOT");dijit.form.nls.validate.ROOT={"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ROOT");dijit.form.nls.ComboBox.ROOT={"previousMessage":"Previous choices","nextMessage":"More choices"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ROOT");dojo.cldr.nls.number.ROOT={"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_ROOT",{"dijit/form/nls/validate":{"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."},"dijit/nls/loading":{"loadingState":"Loading...","errorState":"Sorry, an error occurred"},"dojo/nls/colors":{"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"transparent","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Previous choices","nextMessage":"More choices"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_ROOT.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_ROOT.js.uncompressed.js
new file mode 100644
index 000000000..2ba5f2ac4
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_ROOT.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_ROOT',{
+'dijit/form/nls/validate':{"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."}
+,
+'dijit/nls/loading':{"loadingState":"Loading...","errorState":"Sorry, an error occurred"}
+,
+'dojo/nls/colors':{"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"transparent","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Previous choices","nextMessage":"More choices"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_ar.js b/lib/dojo/nls/tt-rss-layer_ar.js
index 464e31646..727ea2bb5 100644
--- a/lib/dojo/nls/tt-rss-layer_ar.js
+++ b/lib/dojo/nls/tt-rss-layer_ar.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_ar");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ar");dojo.nls.colors.ar={"lightsteelblue":"أزرق معدني فاتح","orangered":"أحمر مائل للبرتقالي","midnightblue":"أزرق بحري","cadetblue":"أزرق ملون بالرمادي","seashell":"أبيض مائل للأصفر فاتح","slategrey":"رمادي اردوازي","coral":"مرجاني","darkturquoise":"تركواز داكن","antiquewhite":"أبيض عتيق","mediumspringgreen":"أخضر ربيعي متوسط","salmon":"برتقالي وردي شاحب","darkgrey":"رمادي داكن","ivory":"عاجي","greenyellow":"أخضر مائل للأصفر","mistyrose":"وردي","lightsalmon":"فضي فاتح","silver":"فضي","dimgrey":"رمادي شاحب","orange":"برتقالي","white":"أبيض","navajowhite":"أبيض ملاحي","royalblue":"أزرق ملكي","deeppink":"أحمر وردي غامق","lime":"ليموني","oldlace":"برتقالي مائل للأصفر شاحب","chartreuse":"أخضر مائل للصفرة","darkcyan":"أزرق سماوي داكن","yellow":"أصفر","linen":"كتاني","olive":"أخضر زيتوني داكن","gold":"ذهبي","lawngreen":"أخضر بلون العشب","lightyellow":"أصفر فاتح","tan":"خمري","darkviolet":"بنفسجي داكن","lightslategrey":"رمادي اردوازي فاتح","grey":"رمادي","darkkhaki":"كاكي داكن","green":"أخضر","deepskyblue":"أزرق سماوي غامق","aqua":"أزرق مائي","sienna":"بني محروق","mintcream":"أصفر شاحب مائل للأخضر الزرعي","rosybrown":"بني وردي","mediumslateblue":"أزرق اردوازي متوسط","magenta":"أحمر قرمزي","lightseagreen":"أخضر مائل للأزرق فاتح","cyan":"أزرق سماوي","olivedrab":"أسود فاتح","darkgoldenrod":"أصفر ذهبي داكن","slateblue":"أزرق اردوازي","mediumaquamarine":"أزرق مائل للأخضر (زبرجد) متوسط","lavender":"أرجواني شاحب","mediumseagreen":"أخضر مائل للأزرق متوسط","maroon":"أحمر داكن","darkslategray":"رمادي اردوازي داكن","mediumturquoise":"تركواز متوسط","ghostwhite":"أبيض شفاف","darkblue":"أزرق داكن","mediumvioletred":"أحمر-بنفسجي متوسط","brown":"بني","lightgray":"رمادي فاتح","sandybrown":"بني مائل للصفرة","pink":"وردي","firebrick":"أصفر زاهي","indigo":"نيلي","snow":"أبيض ثلجي","darkorchid":"أرجواني داكن","turquoise":"تركواز","chocolate":"بني غامق","springgreen":"أخضر ربيعي","moccasin":"نحاسي أحمر","navy":"أزرق داكن","lemonchiffon":"أصفر شفاف","teal":"بترولي","floralwhite":"أبيض زهري","cornflowerblue":"أزرق عنبري","paleturquoise":"تركواز شاحب","purple":"ارجواني","gainsboro":"رمادي مائل للأزرق فاتح","plum":"أرجواني داكن","red":"أحمر","blue":"أزرق","forestgreen":"أخضر بلون أشجار الغابات","darkgreen":"أخضر داكن","honeydew":"أبيض مائل للأخضر","darkseagreen":"أخضر مائل للأزرق داكن","lightcoral":"مرجاني فاتح","palevioletred":"أحمر-بنفسجي شاحب","mediumpurple":"قرمزي متوسط","saddlebrown":"بني فاتح","darkmagenta":"قرمزي داكن","thistle":"ارجواني شاحب","whitesmoke":"دخان أبيض","wheat":"أخضر قمحي","violet":"بنفسجي","lightskyblue":"أزرق سماوي فاتح","goldenrod":"أصفر ذهبي","mediumblue":"أزرق متوسط","skyblue":"أزرق سماوي","crimson":"قرمزي","darksalmon":"فضي داكن","darkred":"أحمر داكن","darkslategrey":"رمادي اردوازي داكن","peru":"بني جملي","lightgrey":"رمادي فاتح","lightgoldenrodyellow":"أصفر ذهبي فاتح","blanchedalmond":"أخضر مائل للبياض","aliceblue":"أزرق فاتح","bisque":"أصفر برتقالي الى رمادي مصفر","slategray":"رمادي اردوازي","palegoldenrod":"أصفر ذهبي شاحب","darkorange":"برتقالي داكن","aquamarine":"أزرق مائل للأخضر (زبرجد)","lightgreen":"أخضر فاتح","burlywood":"خشبي","dodgerblue":"أزرق عنبري","darkgray":"رمادي داكن","lightcyan":"سماوي فاتح","powderblue":"أزرق مائل للأصفر","blueviolet":"أزرق-بنفسجي","orchid":"أرجواني فاتح","dimgray":"رمادي شاحب","beige":"بيج","fuchsia":"فوشيا","lavenderblush":"أحمر أرجواني","hotpink":"أحمر وردي زاهي","steelblue":"أزرق معدني","tomato":"أحمر مائل للأصفر","lightpink":"وردي فاتح","limegreen":"أخضر ليموني","indianred":"أحمر هندي","papayawhip":"خوخي فاتح","lightslategray":"رمادي اردوازي فاتح","gray":"رمادي","mediumorchid":"أرجواني متوسط","cornsilk":"حريري","black":"أسود","seagreen":"أخضر مائل للأزرق","darkslateblue":"أزرق اردوازي داكن","khaki":"كاكي","lightblue":"أزرق فاتح","palegreen":"أخضر شاحب","azure":"أزرق سماوي","peachpuff":"خوخي مائل للأصفر","darkolivegreen":"أخضر زيتوني داكن","yellowgreen":"أخضر مائل للأصفر"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ar");dijit.nls.loading.ar={"loadingState":"جاري التحميل...","errorState":"عفوا، حدث خطأ"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ar");dijit.nls.common.ar={"buttonOk":"حسنا","buttonCancel":"الغاء","buttonSave":"حفظ","itemClose":"اغلاق"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ar");dijit.form.nls.validate.ar={"rangeMessage":"هذه القيمة ليس بالمدى الصحيح.","invalidMessage":"القيمة التي تم ادخالها غير صحيحة.","missingMessage":"يجب ادخال هذه القيمة."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ar");dijit.form.nls.ComboBox.ar={"previousMessage":"الاختيارات السابقة","nextMessage":"مزيد من الاختيارات"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ar");dojo.cldr.nls.number.ar={"group":"٬","percentSign":"٪","exponential":"اس","list":"؛","infinity":"∞","minusSign":"-","decimal":"٫","nan":"ليس رقم","perMille":"؉","decimalFormat":"#,##0.###;#,##0.###-","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nativeZeroDigit":"0","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","percentFormat":"#,##0%","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_ar",{"dijit/form/nls/validate":{"rangeMessage":"هذه القيمة ليس بالمدى الصحيح.","invalidMessage":"القيمة التي تم ادخالها غير صحيحة.","missingMessage":"يجب ادخال هذه القيمة."},"dijit/nls/loading":{"loadingState":"جاري التحميل...","errorState":"عفوا، حدث خطأ"},"dojo/nls/colors":{"lightsteelblue":"أزرق معدني فاتح","orangered":"أحمر مائل للبرتقالي","midnightblue":"أزرق بحري","cadetblue":"أزرق ملون بالرمادي","seashell":"أبيض مائل للأصفر فاتح","slategrey":"رمادي اردوازي","coral":"مرجاني","darkturquoise":"تركواز داكن","antiquewhite":"أبيض عتيق","mediumspringgreen":"أخضر ربيعي متوسط","transparent":"شفاف","salmon":"برتقالي وردي شاحب","darkgrey":"رمادي داكن","ivory":"عاجي","greenyellow":"أخضر مائل للأصفر","mistyrose":"وردي","lightsalmon":"فضي فاتح","silver":"فضي","dimgrey":"رمادي شاحب","orange":"برتقالي","white":"أبيض","navajowhite":"أبيض ملاحي","royalblue":"أزرق ملكي","deeppink":"أحمر وردي غامق","lime":"ليموني","oldlace":"برتقالي مائل للأصفر شاحب","chartreuse":"أخضر مائل للصفرة","darkcyan":"أزرق سماوي داكن","yellow":"أصفر","linen":"كتاني","olive":"أخضر زيتوني داكن","gold":"ذهبي","lawngreen":"أخضر بلون العشب","lightyellow":"أصفر فاتح","tan":"خمري","darkviolet":"بنفسجي داكن","lightslategrey":"رمادي اردوازي فاتح","grey":"رمادي","darkkhaki":"كاكي داكن","green":"أخضر","deepskyblue":"أزرق سماوي غامق","aqua":"أزرق مائي","sienna":"بني محروق","mintcream":"أصفر شاحب مائل للأخضر الزرعي","rosybrown":"بني وردي","mediumslateblue":"أزرق اردوازي متوسط","magenta":"أحمر قرمزي","lightseagreen":"أخضر مائل للأزرق فاتح","cyan":"أزرق سماوي","olivedrab":"أسود فاتح","darkgoldenrod":"أصفر ذهبي داكن","slateblue":"أزرق اردوازي","mediumaquamarine":"أزرق مائل للأخضر (زبرجد) متوسط","lavender":"أرجواني شاحب","mediumseagreen":"أخضر مائل للأزرق متوسط","maroon":"أحمر داكن","darkslategray":"رمادي اردوازي داكن","mediumturquoise":"تركواز متوسط","ghostwhite":"أبيض شفاف","darkblue":"أزرق داكن","mediumvioletred":"أحمر-بنفسجي متوسط","brown":"بني","lightgray":"رمادي فاتح","sandybrown":"بني مائل للصفرة","pink":"وردي","firebrick":"أصفر زاهي","indigo":"نيلي","snow":"أبيض ثلجي","darkorchid":"أرجواني داكن","turquoise":"تركواز","chocolate":"بني غامق","springgreen":"أخضر ربيعي","moccasin":"نحاسي أحمر","navy":"أزرق داكن","lemonchiffon":"أصفر شفاف","teal":"بترولي","floralwhite":"أبيض زهري","cornflowerblue":"أزرق عنبري","paleturquoise":"تركواز شاحب","purple":"ارجواني","gainsboro":"رمادي مائل للأزرق فاتح","plum":"أرجواني داكن","red":"أحمر","blue":"أزرق","forestgreen":"أخضر بلون أشجار الغابات","darkgreen":"أخضر داكن","honeydew":"أبيض مائل للأخضر","darkseagreen":"أخضر مائل للأزرق داكن","lightcoral":"مرجاني فاتح","palevioletred":"أحمر-بنفسجي شاحب","mediumpurple":"قرمزي متوسط","saddlebrown":"بني فاتح","darkmagenta":"قرمزي داكن","thistle":"ارجواني شاحب","whitesmoke":"دخان أبيض","wheat":"أخضر قمحي","violet":"بنفسجي","lightskyblue":"أزرق سماوي فاتح","goldenrod":"أصفر ذهبي","mediumblue":"أزرق متوسط","skyblue":"أزرق سماوي","crimson":"قرمزي","darksalmon":"فضي داكن","darkred":"أحمر داكن","darkslategrey":"رمادي اردوازي داكن","peru":"بني جملي","lightgrey":"رمادي فاتح","lightgoldenrodyellow":"أصفر ذهبي فاتح","blanchedalmond":"أخضر مائل للبياض","aliceblue":"أزرق فاتح","bisque":"أصفر برتقالي الى رمادي مصفر","slategray":"رمادي اردوازي","palegoldenrod":"أصفر ذهبي شاحب","darkorange":"برتقالي داكن","aquamarine":"أزرق مائل للأخضر (زبرجد)","lightgreen":"أخضر فاتح","burlywood":"خشبي","dodgerblue":"أزرق عنبري","darkgray":"رمادي داكن","lightcyan":"سماوي فاتح","powderblue":"أزرق مائل للأصفر","blueviolet":"أزرق-بنفسجي","orchid":"أرجواني فاتح","dimgray":"رمادي شاحب","beige":"بيج","fuchsia":"فوشيا","lavenderblush":"أحمر أرجواني","hotpink":"أحمر وردي زاهي","steelblue":"أزرق معدني","tomato":"أحمر مائل للأصفر","lightpink":"وردي فاتح","limegreen":"أخضر ليموني","indianred":"أحمر هندي","papayawhip":"خوخي فاتح","lightslategray":"رمادي اردوازي فاتح","gray":"رمادي","mediumorchid":"أرجواني متوسط","cornsilk":"حريري","black":"أسود","seagreen":"أخضر مائل للأزرق","darkslateblue":"أزرق اردوازي داكن","khaki":"كاكي","lightblue":"أزرق فاتح","palegreen":"أخضر شاحب","azure":"أزرق سماوي","peachpuff":"خوخي مائل للأصفر","darkolivegreen":"أخضر زيتوني داكن","yellowgreen":"أخضر مائل للأصفر"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":"؛","percentSign":"٪","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"ليس رقم","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"؉","group":"٬","percentFormat":"#,##0%","decimalFormat":"#,##0.###;#,##0.###-","decimal":"٫","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"اس"},"dijit/form/nls/ComboBox":{"previousMessage":"الاختيارات السابقة","nextMessage":"مزيد من الاختيارات"},"dijit/nls/common":{"buttonOk":"حسنا","buttonCancel":"الغاء","buttonSave":"حفظ","itemClose":"اغلاق"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_ar.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_ar.js.uncompressed.js
new file mode 100644
index 000000000..10b2df03b
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_ar.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_ar',{
+'dijit/form/nls/validate':{"rangeMessage":"هذه القيمة ليس بالمدى الصحيح.","invalidMessage":"القيمة التي تم ادخالها غير صحيحة.","missingMessage":"يجب ادخال هذه القيمة."}
+,
+'dijit/nls/loading':{"loadingState":"جاري التحميل...","errorState":"عفوا، حدث خطأ"}
+,
+'dojo/nls/colors':{"lightsteelblue":"أزرق معدني فاتح","orangered":"أحمر مائل للبرتقالي","midnightblue":"أزرق بحري","cadetblue":"أزرق ملون بالرمادي","seashell":"أبيض مائل للأصفر فاتح","slategrey":"رمادي اردوازي","coral":"مرجاني","darkturquoise":"تركواز داكن","antiquewhite":"أبيض عتيق","mediumspringgreen":"أخضر ربيعي متوسط","transparent":"شفاف","salmon":"برتقالي وردي شاحب","darkgrey":"رمادي داكن","ivory":"عاجي","greenyellow":"أخضر مائل للأصفر","mistyrose":"وردي","lightsalmon":"فضي فاتح","silver":"فضي","dimgrey":"رمادي شاحب","orange":"برتقالي","white":"أبيض","navajowhite":"أبيض ملاحي","royalblue":"أزرق ملكي","deeppink":"أحمر وردي غامق","lime":"ليموني","oldlace":"برتقالي مائل للأصفر شاحب","chartreuse":"أخضر مائل للصفرة","darkcyan":"أزرق سماوي داكن","yellow":"أصفر","linen":"كتاني","olive":"أخضر زيتوني داكن","gold":"ذهبي","lawngreen":"أخضر بلون العشب","lightyellow":"أصفر فاتح","tan":"خمري","darkviolet":"بنفسجي داكن","lightslategrey":"رمادي اردوازي فاتح","grey":"رمادي","darkkhaki":"كاكي داكن","green":"أخضر","deepskyblue":"أزرق سماوي غامق","aqua":"أزرق مائي","sienna":"بني محروق","mintcream":"أصفر شاحب مائل للأخضر الزرعي","rosybrown":"بني وردي","mediumslateblue":"أزرق اردوازي متوسط","magenta":"أحمر قرمزي","lightseagreen":"أخضر مائل للأزرق فاتح","cyan":"أزرق سماوي","olivedrab":"أسود فاتح","darkgoldenrod":"أصفر ذهبي داكن","slateblue":"أزرق اردوازي","mediumaquamarine":"أزرق مائل للأخضر (زبرجد) متوسط","lavender":"أرجواني شاحب","mediumseagreen":"أخضر مائل للأزرق متوسط","maroon":"أحمر داكن","darkslategray":"رمادي اردوازي داكن","mediumturquoise":"تركواز متوسط","ghostwhite":"أبيض شفاف","darkblue":"أزرق داكن","mediumvioletred":"أحمر-بنفسجي متوسط","brown":"بني","lightgray":"رمادي فاتح","sandybrown":"بني مائل للصفرة","pink":"وردي","firebrick":"أصفر زاهي","indigo":"نيلي","snow":"أبيض ثلجي","darkorchid":"أرجواني داكن","turquoise":"تركواز","chocolate":"بني غامق","springgreen":"أخضر ربيعي","moccasin":"نحاسي أحمر","navy":"أزرق داكن","lemonchiffon":"أصفر شفاف","teal":"بترولي","floralwhite":"أبيض زهري","cornflowerblue":"أزرق عنبري","paleturquoise":"تركواز شاحب","purple":"ارجواني","gainsboro":"رمادي مائل للأزرق فاتح","plum":"أرجواني داكن","red":"أحمر","blue":"أزرق","forestgreen":"أخضر بلون أشجار الغابات","darkgreen":"أخضر داكن","honeydew":"أبيض مائل للأخضر","darkseagreen":"أخضر مائل للأزرق داكن","lightcoral":"مرجاني فاتح","palevioletred":"أحمر-بنفسجي شاحب","mediumpurple":"قرمزي متوسط","saddlebrown":"بني فاتح","darkmagenta":"قرمزي داكن","thistle":"ارجواني شاحب","whitesmoke":"دخان أبيض","wheat":"أخضر قمحي","violet":"بنفسجي","lightskyblue":"أزرق سماوي فاتح","goldenrod":"أصفر ذهبي","mediumblue":"أزرق متوسط","skyblue":"أزرق سماوي","crimson":"قرمزي","darksalmon":"فضي داكن","darkred":"أحمر داكن","darkslategrey":"رمادي اردوازي داكن","peru":"بني جملي","lightgrey":"رمادي فاتح","lightgoldenrodyellow":"أصفر ذهبي فاتح","blanchedalmond":"أخضر مائل للبياض","aliceblue":"أزرق فاتح","bisque":"أصفر برتقالي الى رمادي مصفر","slategray":"رمادي اردوازي","palegoldenrod":"أصفر ذهبي شاحب","darkorange":"برتقالي داكن","aquamarine":"أزرق مائل للأخضر (زبرجد)","lightgreen":"أخضر فاتح","burlywood":"خشبي","dodgerblue":"أزرق عنبري","darkgray":"رمادي داكن","lightcyan":"سماوي فاتح","powderblue":"أزرق مائل للأصفر","blueviolet":"أزرق-بنفسجي","orchid":"أرجواني فاتح","dimgray":"رمادي شاحب","beige":"بيج","fuchsia":"فوشيا","lavenderblush":"أحمر أرجواني","hotpink":"أحمر وردي زاهي","steelblue":"أزرق معدني","tomato":"أحمر مائل للأصفر","lightpink":"وردي فاتح","limegreen":"أخضر ليموني","indianred":"أحمر هندي","papayawhip":"خوخي فاتح","lightslategray":"رمادي اردوازي فاتح","gray":"رمادي","mediumorchid":"أرجواني متوسط","cornsilk":"حريري","black":"أسود","seagreen":"أخضر مائل للأزرق","darkslateblue":"أزرق اردوازي داكن","khaki":"كاكي","lightblue":"أزرق فاتح","palegreen":"أخضر شاحب","azure":"أزرق سماوي","peachpuff":"خوخي مائل للأصفر","darkolivegreen":"أخضر زيتوني داكن","yellowgreen":"أخضر مائل للأصفر"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":"؛","percentSign":"٪","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"ليس رقم","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"؉","group":"٬","percentFormat":"#,##0%","decimalFormat":"#,##0.###;#,##0.###-","decimal":"٫","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"اس"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"الاختيارات السابقة","nextMessage":"مزيد من الاختيارات"}
+,
+'dijit/nls/common':{"buttonOk":"حسنا","buttonCancel":"الغاء","buttonSave":"حفظ","itemClose":"اغلاق"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_ca.js b/lib/dojo/nls/tt-rss-layer_ca.js
index 4cc759041..434506914 100644
--- a/lib/dojo/nls/tt-rss-layer_ca.js
+++ b/lib/dojo/nls/tt-rss-layer_ca.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_ca");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ca");dojo.nls.colors.ca={"lightsteelblue":"blau acer clar","orangered":"taronja vermellós","midnightblue":"blau mitjanit","cadetblue":"blau marí","seashell":"petxina marina","slategrey":"gris pissarra","coral":"corall","darkturquoise":"turquesa fosc","antiquewhite":"blanc antic","mediumspringgreen":"verd primavera mitjà","salmon":"salmó","darkgrey":"gris fosc","ivory":"marbre","greenyellow":"verd grogós","mistyrose":"rosa dens","lightsalmon":"salmó clar","silver":"argent","dimgrey":"gris fosc","orange":"taronja","white":"blanc","navajowhite":"blanc Navajo","royalblue":"blau marí intens","deeppink":"rosa profund","lime":"verd llimona","oldlace":"rosa cremós","chartreuse":"Llimona pàl·lid","darkcyan":"cian fosc","yellow":"groc","linen":"lli","olive":"oliva","gold":"daurat","lawngreen":"verd gespa","lightyellow":"groc clar","tan":"tan","darkviolet":"violeta fosc","lightslategrey":"gris pissarra clar","grey":"gris","darkkhaki":"caqui fosc","green":"verd","deepskyblue":"blau cel profund","aqua":"aigua","sienna":"siena","mintcream":"menta pàl·lid","rosybrown":"marró rosat","mediumslateblue":"blau pissarra mitjà","magenta":"magenta","lightseagreen":"verd marí clar","cyan":"cian","olivedrab":"gris oliva","darkgoldenrod":"ocre fosc","slateblue":"blau pissarra","mediumaquamarine":"aiguamarina mitjana","lavender":"lavanda","mediumseagreen":"verd marí mitjà","maroon":"marró vermellós","darkslategray":"gris pissarra fosc","mediumturquoise":"turquesa mitjana","ghostwhite":"blanc fantasma","darkblue":"blau fosc","mediumvioletred":"vermell violeta mitjà","brown":"marró","lightgray":"gris clar","sandybrown":"marró arenós","pink":"rosa","firebrick":"maó refractari","indigo":"índigo","snow":"neu","darkorchid":"orquídia fosc","turquoise":"turquesa","chocolate":"xocolata","springgreen":"verd de primavera","moccasin":"mocassí","navy":"blau marí","lemonchiffon":"groc brisa","teal":"verd blavós","floralwhite":"blanc floral","cornflowerblue":"blau blauet","paleturquoise":"turquesa pàl·lid","purple":"porpra","gainsboro":"gainsboro","plum":"pruna","red":"vermell","blue":"blau","forestgreen":"verd bosc","darkgreen":"verd fosc","honeydew":"rosada de mel","darkseagreen":"verd marí fosc","lightcoral":"corall clar","palevioletred":"vermell porpra pàl·lid","mediumpurple":"porpra mitjana","saddlebrown":"marró mitjà","darkmagenta":"magenta fosc","thistle":"card","whitesmoke":"blanc fumat","wheat":"blat","violet":"violeta","lightskyblue":"blau cel clar","goldenrod":"ocre","mediumblue":"blau mitjà","skyblue":"blau cel","crimson":"carmesí","darksalmon":"salmó fosc","darkred":"vermell fosc","darkslategrey":"gris pissarra fosc","peru":"Perú","lightgrey":"gris clar","lightgoldenrodyellow":"groc ocre clar","blanchedalmond":"ametlla pàl·lid","aliceblue":"blau cian clar","bisque":"crema","slategray":"gris pissarra","palegoldenrod":"ocre pàl·lid","darkorange":"taronja fosc","aquamarine":"aiguamarina","lightgreen":"verd clar","burlywood":"marró arenós","dodgerblue":"blau Dodger","darkgray":"gris fosc","lightcyan":"cian clar","powderblue":"blau grisós","blueviolet":"blau violeta","orchid":"orquídia","dimgray":"gris fosc","beige":"beix","fuchsia":"fúcsia","lavenderblush":"lavanda vermellosa","hotpink":"rosa fúcsia","steelblue":"blau acer","tomato":"tomàquet","lightpink":"rosa clar","limegreen":"verd llimona verda","indianred":"vermell indi","papayawhip":"préssec pastel","lightslategray":"gris pissarra clar","gray":"gris","mediumorchid":"orquídia mitjana","cornsilk":"cru","black":"negre","seagreen":"verd marí","darkslateblue":"blau pissarra fosc","khaki":"caqui","lightblue":"blau clar","palegreen":"verd pàl·lid","azure":"atzur","peachpuff":"préssec","darkolivegreen":"verd oliva fosc","yellowgreen":"verd grogós"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ca");dijit.nls.loading.ca={"loadingState":"S'està carregant...","errorState":"Ens sap greu. S'ha produït un error."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ca");dijit.nls.common.ca={"buttonOk":"D'acord","buttonCancel":"Cancel·la","buttonSave":"Desa","itemClose":"Tanca"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ca");dijit.form.nls.validate.ca={"rangeMessage":"Aquest valor és fora de l'interval","invalidMessage":"El valor introduït no és vàlid","missingMessage":"Aquest valor és necessari"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ca");dijit.form.nls.ComboBox.ca={"previousMessage":"Opcions anteriors","nextMessage":"Més opcions"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ca");dojo.cldr.nls.number.ca={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_ca",{"dijit/form/nls/validate":{"rangeMessage":"Aquest valor és fora de l'interval","invalidMessage":"El valor introduït no és vàlid","missingMessage":"Aquest valor és necessari"},"dijit/nls/loading":{"loadingState":"S'està carregant...","errorState":"Ens sap greu. S'ha produït un error."},"dojo/nls/colors":{"lightsteelblue":"blau acer clar","orangered":"taronja vermellós","midnightblue":"blau mitjanit","cadetblue":"blau marí","seashell":"petxina marina","slategrey":"gris pissarra","coral":"corall","darkturquoise":"turquesa fosc","antiquewhite":"blanc antic","mediumspringgreen":"verd primavera mitjà","transparent":"transparent","salmon":"salmó","darkgrey":"gris fosc","ivory":"marbre","greenyellow":"verd grogós","mistyrose":"rosa dens","lightsalmon":"salmó clar","silver":"argent","dimgrey":"gris fosc","orange":"taronja","white":"blanc","navajowhite":"blanc Navajo","royalblue":"blau marí intens","deeppink":"rosa profund","lime":"verd llimona","oldlace":"rosa cremós","chartreuse":"Llimona pàl·lid","darkcyan":"cian fosc","yellow":"groc","linen":"lli","olive":"oliva","gold":"daurat","lawngreen":"verd gespa","lightyellow":"groc clar","tan":"tan","darkviolet":"violeta fosc","lightslategrey":"gris pissarra clar","grey":"gris","darkkhaki":"caqui fosc","green":"verd","deepskyblue":"blau cel profund","aqua":"aigua","sienna":"siena","mintcream":"menta pàl·lid","rosybrown":"marró rosat","mediumslateblue":"blau pissarra mitjà","magenta":"magenta","lightseagreen":"verd marí clar","cyan":"cian","olivedrab":"gris oliva","darkgoldenrod":"ocre fosc","slateblue":"blau pissarra","mediumaquamarine":"aiguamarina mitjana","lavender":"lavanda","mediumseagreen":"verd marí mitjà","maroon":"marró vermellós","darkslategray":"gris pissarra fosc","mediumturquoise":"turquesa mitjana","ghostwhite":"blanc fantasma","darkblue":"blau fosc","mediumvioletred":"vermell violeta mitjà","brown":"marró","lightgray":"gris clar","sandybrown":"marró arenós","pink":"rosa","firebrick":"maó refractari","indigo":"índigo","snow":"neu","darkorchid":"orquídia fosc","turquoise":"turquesa","chocolate":"xocolata","springgreen":"verd de primavera","moccasin":"mocassí","navy":"blau marí","lemonchiffon":"groc brisa","teal":"verd blavós","floralwhite":"blanc floral","cornflowerblue":"blau blauet","paleturquoise":"turquesa pàl·lid","purple":"porpra","gainsboro":"gainsboro","plum":"pruna","red":"vermell","blue":"blau","forestgreen":"verd bosc","darkgreen":"verd fosc","honeydew":"rosada de mel","darkseagreen":"verd marí fosc","lightcoral":"corall clar","palevioletred":"vermell porpra pàl·lid","mediumpurple":"porpra mitjana","saddlebrown":"marró mitjà","darkmagenta":"magenta fosc","thistle":"card","whitesmoke":"blanc fumat","wheat":"blat","violet":"violeta","lightskyblue":"blau cel clar","goldenrod":"ocre","mediumblue":"blau mitjà","skyblue":"blau cel","crimson":"carmesí","darksalmon":"salmó fosc","darkred":"vermell fosc","darkslategrey":"gris pissarra fosc","peru":"Perú","lightgrey":"gris clar","lightgoldenrodyellow":"groc ocre clar","blanchedalmond":"ametlla pàl·lid","aliceblue":"blau cian clar","bisque":"crema","slategray":"gris pissarra","palegoldenrod":"ocre pàl·lid","darkorange":"taronja fosc","aquamarine":"aiguamarina","lightgreen":"verd clar","burlywood":"marró arenós","dodgerblue":"blau Dodger","darkgray":"gris fosc","lightcyan":"cian clar","powderblue":"blau grisós","blueviolet":"blau violeta","orchid":"orquídia","dimgray":"gris fosc","beige":"beix","fuchsia":"fúcsia","lavenderblush":"lavanda vermellosa","hotpink":"rosa fúcsia","steelblue":"blau acer","tomato":"tomàquet","lightpink":"rosa clar","limegreen":"verd llimona verda","indianred":"vermell indi","papayawhip":"préssec pastel","lightslategray":"gris pissarra clar","gray":"gris","mediumorchid":"orquídia mitjana","cornsilk":"cru","black":"negre","seagreen":"verd marí","darkslateblue":"blau pissarra fosc","khaki":"caqui","lightblue":"blau clar","palegreen":"verd pàl·lid","azure":"atzur","peachpuff":"préssec","darkolivegreen":"verd oliva fosc","yellowgreen":"verd grogós"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Opcions anteriors","nextMessage":"Més opcions"},"dijit/nls/common":{"buttonOk":"D'acord","buttonCancel":"Cancel·la","buttonSave":"Desa","itemClose":"Tanca"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_ca.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_ca.js.uncompressed.js
new file mode 100644
index 000000000..b12869c82
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_ca.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_ca',{
+'dijit/form/nls/validate':{"rangeMessage":"Aquest valor és fora de l'interval","invalidMessage":"El valor introduït no és vàlid","missingMessage":"Aquest valor és necessari"}
+,
+'dijit/nls/loading':{"loadingState":"S'està carregant...","errorState":"Ens sap greu. S'ha produït un error."}
+,
+'dojo/nls/colors':{"lightsteelblue":"blau acer clar","orangered":"taronja vermellós","midnightblue":"blau mitjanit","cadetblue":"blau marí","seashell":"petxina marina","slategrey":"gris pissarra","coral":"corall","darkturquoise":"turquesa fosc","antiquewhite":"blanc antic","mediumspringgreen":"verd primavera mitjà","transparent":"transparent","salmon":"salmó","darkgrey":"gris fosc","ivory":"marbre","greenyellow":"verd grogós","mistyrose":"rosa dens","lightsalmon":"salmó clar","silver":"argent","dimgrey":"gris fosc","orange":"taronja","white":"blanc","navajowhite":"blanc Navajo","royalblue":"blau marí intens","deeppink":"rosa profund","lime":"verd llimona","oldlace":"rosa cremós","chartreuse":"Llimona pàl·lid","darkcyan":"cian fosc","yellow":"groc","linen":"lli","olive":"oliva","gold":"daurat","lawngreen":"verd gespa","lightyellow":"groc clar","tan":"tan","darkviolet":"violeta fosc","lightslategrey":"gris pissarra clar","grey":"gris","darkkhaki":"caqui fosc","green":"verd","deepskyblue":"blau cel profund","aqua":"aigua","sienna":"siena","mintcream":"menta pàl·lid","rosybrown":"marró rosat","mediumslateblue":"blau pissarra mitjà","magenta":"magenta","lightseagreen":"verd marí clar","cyan":"cian","olivedrab":"gris oliva","darkgoldenrod":"ocre fosc","slateblue":"blau pissarra","mediumaquamarine":"aiguamarina mitjana","lavender":"lavanda","mediumseagreen":"verd marí mitjà","maroon":"marró vermellós","darkslategray":"gris pissarra fosc","mediumturquoise":"turquesa mitjana","ghostwhite":"blanc fantasma","darkblue":"blau fosc","mediumvioletred":"vermell violeta mitjà","brown":"marró","lightgray":"gris clar","sandybrown":"marró arenós","pink":"rosa","firebrick":"maó refractari","indigo":"índigo","snow":"neu","darkorchid":"orquídia fosc","turquoise":"turquesa","chocolate":"xocolata","springgreen":"verd de primavera","moccasin":"mocassí","navy":"blau marí","lemonchiffon":"groc brisa","teal":"verd blavós","floralwhite":"blanc floral","cornflowerblue":"blau blauet","paleturquoise":"turquesa pàl·lid","purple":"porpra","gainsboro":"gainsboro","plum":"pruna","red":"vermell","blue":"blau","forestgreen":"verd bosc","darkgreen":"verd fosc","honeydew":"rosada de mel","darkseagreen":"verd marí fosc","lightcoral":"corall clar","palevioletred":"vermell porpra pàl·lid","mediumpurple":"porpra mitjana","saddlebrown":"marró mitjà","darkmagenta":"magenta fosc","thistle":"card","whitesmoke":"blanc fumat","wheat":"blat","violet":"violeta","lightskyblue":"blau cel clar","goldenrod":"ocre","mediumblue":"blau mitjà","skyblue":"blau cel","crimson":"carmesí","darksalmon":"salmó fosc","darkred":"vermell fosc","darkslategrey":"gris pissarra fosc","peru":"Perú","lightgrey":"gris clar","lightgoldenrodyellow":"groc ocre clar","blanchedalmond":"ametlla pàl·lid","aliceblue":"blau cian clar","bisque":"crema","slategray":"gris pissarra","palegoldenrod":"ocre pàl·lid","darkorange":"taronja fosc","aquamarine":"aiguamarina","lightgreen":"verd clar","burlywood":"marró arenós","dodgerblue":"blau Dodger","darkgray":"gris fosc","lightcyan":"cian clar","powderblue":"blau grisós","blueviolet":"blau violeta","orchid":"orquídia","dimgray":"gris fosc","beige":"beix","fuchsia":"fúcsia","lavenderblush":"lavanda vermellosa","hotpink":"rosa fúcsia","steelblue":"blau acer","tomato":"tomàquet","lightpink":"rosa clar","limegreen":"verd llimona verda","indianred":"vermell indi","papayawhip":"préssec pastel","lightslategray":"gris pissarra clar","gray":"gris","mediumorchid":"orquídia mitjana","cornsilk":"cru","black":"negre","seagreen":"verd marí","darkslateblue":"blau pissarra fosc","khaki":"caqui","lightblue":"blau clar","palegreen":"verd pàl·lid","azure":"atzur","peachpuff":"préssec","darkolivegreen":"verd oliva fosc","yellowgreen":"verd grogós"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Opcions anteriors","nextMessage":"Més opcions"}
+,
+'dijit/nls/common':{"buttonOk":"D'acord","buttonCancel":"Cancel·la","buttonSave":"Desa","itemClose":"Tanca"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_cs.js b/lib/dojo/nls/tt-rss-layer_cs.js
index 8c008a467..be91c7d70 100644
--- a/lib/dojo/nls/tt-rss-layer_cs.js
+++ b/lib/dojo/nls/tt-rss-layer_cs.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_cs");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.cs");dojo.nls.colors.cs={"lightsteelblue":"světlá ocelová modrá","orangered":"oranžovočervená","midnightblue":"temně modrá","cadetblue":"šedomodrá","seashell":"lasturová","slategrey":"břidlicová šedá","coral":"korálová červená","darkturquoise":"tmavě tyrkysová","antiquewhite":"krémově bílá","mediumspringgreen":"střední jarní zelená","salmon":"lososová","darkgrey":"tmavě šedá","ivory":"slonovinová","greenyellow":"zelenožlutá","mistyrose":"růžovobílá","lightsalmon":"světle lososová","silver":"stříbrná","dimgrey":"kouřově šedá","orange":"oranžová","white":"bílá","navajowhite":"světle krémová","royalblue":"královská modrá","deeppink":"sytě růžová","lime":"limetková","oldlace":"světle béžová","chartreuse":"chartreuska","darkcyan":"tmavě azurová","yellow":"žlutá","linen":"bledě šedobéžová","olive":"olivová","gold":"zlatá","lawngreen":"jasně zelená","lightyellow":"bledě žlutá","tan":"šedobéžová","darkviolet":"tmavě fialová","lightslategrey":"světlá břidlicová šedá","grey":"šedá","darkkhaki":"pískově hnědá","green":"zelená","deepskyblue":"sytá nebeská modrá","aqua":"azurová","sienna":"siena","mintcream":"mentolová","rosybrown":"růžovohnědá","mediumslateblue":"střední břidlicová modrá","magenta":"purpurová","lightseagreen":"světlá mořská zelená","cyan":"azurová","olivedrab":"khaki","darkgoldenrod":"tmavě béžová","slateblue":"břidlicová modrá","mediumaquamarine":"střední akvamarínová","lavender":"levandulová","mediumseagreen":"střední mořská zelená","maroon":"kaštanová","darkslategray":"tmavá břidlicová šedá","mediumturquoise":"středně tyrkysová","ghostwhite":"modravě bílá","darkblue":"tmavě modrá","mediumvioletred":"středně fialovočervená","brown":"červenohnědá","lightgray":"světle šedá","sandybrown":"oranžovohnědá","pink":"růžová","firebrick":"cihlová","indigo":"indigově modrá","snow":"sněhobílá","darkorchid":"tmavě orchidejová","turquoise":"tyrkysová","chocolate":"hnědobéžová","springgreen":"jarní zelená","moccasin":"bledě krémová","navy":"námořnická modrá","lemonchiffon":"světle citrónová","teal":"šedozelená","floralwhite":"květinově bílá","cornflowerblue":"chrpově modrá","paleturquoise":"bledě tyrkysová","purple":"nachová","gainsboro":"bledě šedá","plum":"švestková","red":"červená","blue":"modrá","forestgreen":"lesní zelená","darkgreen":"tmavě zelená","honeydew":"nazelenalá","darkseagreen":"tmavá mořská zelená","lightcoral":"světle korálová","palevioletred":"bledě fialovočervená","mediumpurple":"středně nachová","saddlebrown":"hnědá","darkmagenta":"tmavě purpurová","thistle":"bodláková","whitesmoke":"kouřově bílá","wheat":"zlatohnědá","violet":"fialová","lightskyblue":"světlá nebeská modrá","goldenrod":"béžová","mediumblue":"středně modrá","skyblue":"nebeská modrá","crimson":"karmínová","darksalmon":"tmavě lososová","darkred":"tmavě červená","darkslategrey":"tmavá břidlicová šedá","peru":"karamelová","lightgrey":"světle šedá","lightgoldenrodyellow":"světle žlutá","blanchedalmond":"mandlová","aliceblue":"modravá","bisque":"bledě oranžová","slategray":"břidlicová šedá","palegoldenrod":"bledě písková","darkorange":"tmavě oranžová","aquamarine":"akvamarínová","lightgreen":"světle zelená","burlywood":"krémová","dodgerblue":"jasně modrá","darkgray":"tmavě šedá","lightcyan":"světle azurová","powderblue":"bledě modrá","blueviolet":"modrofialová","orchid":"orchidejová","dimgray":"kouřově šedá","beige":"bledě béžová","fuchsia":"fuchsiová","lavenderblush":"levandulová růžová","hotpink":"jasně růžová","steelblue":"ocelová modrá","tomato":"tomatová","lightpink":"světle růžová","limegreen":"limetkově zelená","indianred":"indiánská červená","papayawhip":"papájová","lightslategray":"světlá břidlicová šedá","gray":"šedá","mediumorchid":"středně orchidejová","cornsilk":"režná","black":"černá","seagreen":"mořská zelená","darkslateblue":"tmavá břidlicová modrá","khaki":"písková","lightblue":"světle modrá","palegreen":"bledě zelená","azure":"bledě azurová","peachpuff":"broskvová","darkolivegreen":"tmavě olivová","yellowgreen":"žlutozelená"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.cs");dijit.nls.loading.cs={"loadingState":"Probíhá načítání...","errorState":"Omlouváme se, došlo k chybě"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.cs");dijit.nls.common.cs={"buttonOk":"OK","buttonCancel":"Storno","buttonSave":"Uložit","itemClose":"Zavřít"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.cs");dijit.form.nls.validate.cs={"rangeMessage":"Tato hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota není platná.","missingMessage":"Tato hodnota je vyžadována."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.cs");dijit.form.nls.ComboBox.cs={"previousMessage":"Předchozí volby","nextMessage":"Další volby"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.cs");dojo.cldr.nls.number.cs={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_cs",{"dijit/form/nls/validate":{"rangeMessage":"Tato hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota není platná.","missingMessage":"Tato hodnota je vyžadována."},"dijit/nls/loading":{"loadingState":"Probíhá načítání...","errorState":"Omlouváme se, došlo k chybě"},"dojo/nls/colors":{"lightsteelblue":"světlá ocelová modrá","orangered":"oranžovočervená","midnightblue":"temně modrá","cadetblue":"šedomodrá","seashell":"lasturová","slategrey":"břidlicová šedá","coral":"korálová červená","darkturquoise":"tmavě tyrkysová","antiquewhite":"krémově bílá","mediumspringgreen":"střední jarní zelená","transparent":"průhledná","salmon":"lososová","darkgrey":"tmavě šedá","ivory":"slonovinová","greenyellow":"zelenožlutá","mistyrose":"růžovobílá","lightsalmon":"světle lososová","silver":"stříbrná","dimgrey":"kouřově šedá","orange":"oranžová","white":"bílá","navajowhite":"světle krémová","royalblue":"královská modrá","deeppink":"sytě růžová","lime":"limetková","oldlace":"světle béžová","chartreuse":"chartreuska","darkcyan":"tmavě azurová","yellow":"žlutá","linen":"bledě šedobéžová","olive":"olivová","gold":"zlatá","lawngreen":"jasně zelená","lightyellow":"bledě žlutá","tan":"šedobéžová","darkviolet":"tmavě fialová","lightslategrey":"světlá břidlicová šedá","grey":"šedá","darkkhaki":"pískově hnědá","green":"zelená","deepskyblue":"sytá nebeská modrá","aqua":"azurová","sienna":"siena","mintcream":"mentolová","rosybrown":"růžovohnědá","mediumslateblue":"střední břidlicová modrá","magenta":"purpurová","lightseagreen":"světlá mořská zelená","cyan":"azurová","olivedrab":"khaki","darkgoldenrod":"tmavě béžová","slateblue":"břidlicová modrá","mediumaquamarine":"střední akvamarínová","lavender":"levandulová","mediumseagreen":"střední mořská zelená","maroon":"kaštanová","darkslategray":"tmavá břidlicová šedá","mediumturquoise":"středně tyrkysová","ghostwhite":"modravě bílá","darkblue":"tmavě modrá","mediumvioletred":"středně fialovočervená","brown":"červenohnědá","lightgray":"světle šedá","sandybrown":"oranžovohnědá","pink":"růžová","firebrick":"cihlová","indigo":"indigově modrá","snow":"sněhobílá","darkorchid":"tmavě orchidejová","turquoise":"tyrkysová","chocolate":"hnědobéžová","springgreen":"jarní zelená","moccasin":"bledě krémová","navy":"námořnická modrá","lemonchiffon":"světle citrónová","teal":"šedozelená","floralwhite":"květinově bílá","cornflowerblue":"chrpově modrá","paleturquoise":"bledě tyrkysová","purple":"nachová","gainsboro":"bledě šedá","plum":"švestková","red":"červená","blue":"modrá","forestgreen":"lesní zelená","darkgreen":"tmavě zelená","honeydew":"nazelenalá","darkseagreen":"tmavá mořská zelená","lightcoral":"světle korálová","palevioletred":"bledě fialovočervená","mediumpurple":"středně nachová","saddlebrown":"hnědá","darkmagenta":"tmavě purpurová","thistle":"bodláková","whitesmoke":"kouřově bílá","wheat":"zlatohnědá","violet":"fialová","lightskyblue":"světlá nebeská modrá","goldenrod":"béžová","mediumblue":"středně modrá","skyblue":"nebeská modrá","crimson":"karmínová","darksalmon":"tmavě lososová","darkred":"tmavě červená","darkslategrey":"tmavá břidlicová šedá","peru":"karamelová","lightgrey":"světle šedá","lightgoldenrodyellow":"světle žlutá","blanchedalmond":"mandlová","aliceblue":"modravá","bisque":"bledě oranžová","slategray":"břidlicová šedá","palegoldenrod":"bledě písková","darkorange":"tmavě oranžová","aquamarine":"akvamarínová","lightgreen":"světle zelená","burlywood":"krémová","dodgerblue":"jasně modrá","darkgray":"tmavě šedá","lightcyan":"světle azurová","powderblue":"bledě modrá","blueviolet":"modrofialová","orchid":"orchidejová","dimgray":"kouřově šedá","beige":"bledě béžová","fuchsia":"fuchsiová","lavenderblush":"levandulová růžová","hotpink":"jasně růžová","steelblue":"ocelová modrá","tomato":"tomatová","lightpink":"světle růžová","limegreen":"limetkově zelená","indianred":"indiánská červená","papayawhip":"papájová","lightslategray":"světlá břidlicová šedá","gray":"šedá","mediumorchid":"středně orchidejová","cornsilk":"režná","black":"černá","seagreen":"mořská zelená","darkslateblue":"tmavá břidlicová modrá","khaki":"písková","lightblue":"světle modrá","palegreen":"bledě zelená","azure":"bledě azurová","peachpuff":"broskvová","darkolivegreen":"tmavě olivová","yellowgreen":"žlutozelená"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Předchozí volby","nextMessage":"Další volby"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Storno","buttonSave":"Uložit","itemClose":"Zavřít"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_cs.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_cs.js.uncompressed.js
new file mode 100644
index 000000000..35ef92bae
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_cs.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_cs',{
+'dijit/form/nls/validate':{"rangeMessage":"Tato hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota není platná.","missingMessage":"Tato hodnota je vyžadována."}
+,
+'dijit/nls/loading':{"loadingState":"Probíhá načítání...","errorState":"Omlouváme se, došlo k chybě"}
+,
+'dojo/nls/colors':{"lightsteelblue":"světlá ocelová modrá","orangered":"oranžovočervená","midnightblue":"temně modrá","cadetblue":"šedomodrá","seashell":"lasturová","slategrey":"břidlicová šedá","coral":"korálová červená","darkturquoise":"tmavě tyrkysová","antiquewhite":"krémově bílá","mediumspringgreen":"střední jarní zelená","transparent":"průhledná","salmon":"lososová","darkgrey":"tmavě šedá","ivory":"slonovinová","greenyellow":"zelenožlutá","mistyrose":"růžovobílá","lightsalmon":"světle lososová","silver":"stříbrná","dimgrey":"kouřově šedá","orange":"oranžová","white":"bílá","navajowhite":"světle krémová","royalblue":"královská modrá","deeppink":"sytě růžová","lime":"limetková","oldlace":"světle béžová","chartreuse":"chartreuska","darkcyan":"tmavě azurová","yellow":"žlutá","linen":"bledě šedobéžová","olive":"olivová","gold":"zlatá","lawngreen":"jasně zelená","lightyellow":"bledě žlutá","tan":"šedobéžová","darkviolet":"tmavě fialová","lightslategrey":"světlá břidlicová šedá","grey":"šedá","darkkhaki":"pískově hnědá","green":"zelená","deepskyblue":"sytá nebeská modrá","aqua":"azurová","sienna":"siena","mintcream":"mentolová","rosybrown":"růžovohnědá","mediumslateblue":"střední břidlicová modrá","magenta":"purpurová","lightseagreen":"světlá mořská zelená","cyan":"azurová","olivedrab":"khaki","darkgoldenrod":"tmavě béžová","slateblue":"břidlicová modrá","mediumaquamarine":"střední akvamarínová","lavender":"levandulová","mediumseagreen":"střední mořská zelená","maroon":"kaštanová","darkslategray":"tmavá břidlicová šedá","mediumturquoise":"středně tyrkysová","ghostwhite":"modravě bílá","darkblue":"tmavě modrá","mediumvioletred":"středně fialovočervená","brown":"červenohnědá","lightgray":"světle šedá","sandybrown":"oranžovohnědá","pink":"růžová","firebrick":"cihlová","indigo":"indigově modrá","snow":"sněhobílá","darkorchid":"tmavě orchidejová","turquoise":"tyrkysová","chocolate":"hnědobéžová","springgreen":"jarní zelená","moccasin":"bledě krémová","navy":"námořnická modrá","lemonchiffon":"světle citrónová","teal":"šedozelená","floralwhite":"květinově bílá","cornflowerblue":"chrpově modrá","paleturquoise":"bledě tyrkysová","purple":"nachová","gainsboro":"bledě šedá","plum":"švestková","red":"červená","blue":"modrá","forestgreen":"lesní zelená","darkgreen":"tmavě zelená","honeydew":"nazelenalá","darkseagreen":"tmavá mořská zelená","lightcoral":"světle korálová","palevioletred":"bledě fialovočervená","mediumpurple":"středně nachová","saddlebrown":"hnědá","darkmagenta":"tmavě purpurová","thistle":"bodláková","whitesmoke":"kouřově bílá","wheat":"zlatohnědá","violet":"fialová","lightskyblue":"světlá nebeská modrá","goldenrod":"béžová","mediumblue":"středně modrá","skyblue":"nebeská modrá","crimson":"karmínová","darksalmon":"tmavě lososová","darkred":"tmavě červená","darkslategrey":"tmavá břidlicová šedá","peru":"karamelová","lightgrey":"světle šedá","lightgoldenrodyellow":"světle žlutá","blanchedalmond":"mandlová","aliceblue":"modravá","bisque":"bledě oranžová","slategray":"břidlicová šedá","palegoldenrod":"bledě písková","darkorange":"tmavě oranžová","aquamarine":"akvamarínová","lightgreen":"světle zelená","burlywood":"krémová","dodgerblue":"jasně modrá","darkgray":"tmavě šedá","lightcyan":"světle azurová","powderblue":"bledě modrá","blueviolet":"modrofialová","orchid":"orchidejová","dimgray":"kouřově šedá","beige":"bledě béžová","fuchsia":"fuchsiová","lavenderblush":"levandulová růžová","hotpink":"jasně růžová","steelblue":"ocelová modrá","tomato":"tomatová","lightpink":"světle růžová","limegreen":"limetkově zelená","indianred":"indiánská červená","papayawhip":"papájová","lightslategray":"světlá břidlicová šedá","gray":"šedá","mediumorchid":"středně orchidejová","cornsilk":"režná","black":"černá","seagreen":"mořská zelená","darkslateblue":"tmavá břidlicová modrá","khaki":"písková","lightblue":"světle modrá","palegreen":"bledě zelená","azure":"bledě azurová","peachpuff":"broskvová","darkolivegreen":"tmavě olivová","yellowgreen":"žlutozelená"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Předchozí volby","nextMessage":"Další volby"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Storno","buttonSave":"Uložit","itemClose":"Zavřít"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_da.js b/lib/dojo/nls/tt-rss-layer_da.js
index 365eb98da..39661f674 100644
--- a/lib/dojo/nls/tt-rss-layer_da.js
+++ b/lib/dojo/nls/tt-rss-layer_da.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_da");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.da");dojo.nls.colors.da={"lightsteelblue":"lys stålblå","orangered":"orangerød","midnightblue":"midnatsblå","cadetblue":"kadetblå","seashell":"muslingeskal","slategrey":"skifergrå","coral":"koralrød","darkturquoise":"mørk turkis","antiquewhite":"antikhvid","mediumspringgreen":"mellemforårsgrøn","salmon":"laksefarvet","darkgrey":"mørkegrå","ivory":"elfenben","greenyellow":"grøngul","mistyrose":"blegrosa","lightsalmon":"lys laksefarvet","silver":"sølv","dimgrey":"svag grå","orange":"orange","white":"hvid","navajowhite":"navajo-hvid","royalblue":"kongeblå","deeppink":"dyb pink","lime":"lime","oldlace":"kniplingshvid","chartreuse":"chartreuse","darkcyan":"mørk cyan","yellow":"gul","linen":"lærred","olive":"olivengrøn","gold":"guld","lawngreen":"græsgrøn","lightyellow":"lysegul","tan":"tan","darkviolet":"mørkelilla","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grøn","deepskyblue":"dyb himmelblå","aqua":"akvablå","sienna":"sienna","mintcream":"pebermyntecreme","rosybrown":"rosabrun","mediumslateblue":"mellemskiferblå","magenta":"magenta","lightseagreen":"lys havgrøn","cyan":"cyan","olivedrab":"brungrøn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"mellem akvamarin","lavender":"lysviolet","mediumseagreen":"mellemhavgrøn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"mellemturkis","ghostwhite":"spøgelseshvid","darkblue":"mørkeblå","mediumvioletred":"mellemviolet","brown":"brun","lightgray":"lysegrå","sandybrown":"sandbrun","pink":"pink","firebrick":"chamottesten","indigo":"indigo","snow":"sne","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"rust","springgreen":"forårsgrøn","moccasin":"fruesko","navy":"marineblå","lemonchiffon":"citronfromage","teal":"blågrøn","floralwhite":"blomsterhvid","cornflowerblue":"kornblomstblå","paleturquoise":"bleg turkis","purple":"lilla","gainsboro":"gainsboro","plum":"blomme","red":"rød","blue":"blå","forestgreen":"skovgrøn","darkgreen":"mørkegrøn","honeydew":"honningdug","darkseagreen":"mørk havgrøn","lightcoral":"lys koralrød","palevioletred":"blegviolet","mediumpurple":"mellemlilla","saddlebrown":"saddelbrun","darkmagenta":"mørk magenta","thistle":"tidsel","whitesmoke":"hvid røg","wheat":"korngul","violet":"lilla","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellemblå","skyblue":"himmelblå","crimson":"blodrød","darksalmon":"mørk laksefarvet","darkred":"mørkerød","darkslategrey":"mørk skifergrå","peru":"peru","lightgrey":"lysegrå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"blanceret mandel","aliceblue":"babyblå","bisque":"gulgrå","slategray":"skifergrå","palegoldenrod":"bleg gyldenris","darkorange":"mørk orange","aquamarine":"akvamarin","lightgreen":"lysegrøn","burlywood":"tobak","dodgerblue":"dodgerblå","darkgray":"mørkegrå","lightcyan":"lys cyan","powderblue":"pudderblå","blueviolet":"blåviolet","orchid":"orkide","dimgray":"svag grå","beige":"beige","fuchsia":"lyslilla","lavenderblush":"lavendelrød","hotpink":"mørk rosa","steelblue":"metalblå","tomato":"tomat","lightpink":"lys pink","limegreen":"limegrøn","indianred":"lys rødbrun","papayawhip":"papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"mellem orkide","cornsilk":"majs","black":"sort","seagreen":"havgrøn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lyseblå","palegreen":"bleggrøn","azure":"azurblå","peachpuff":"fersken","darkolivegreen":"mørk olivengrøn","yellowgreen":"gulgrøn"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.da");dijit.nls.loading.da={"loadingState":"Indlæser...","errorState":"Der er opstået en fejl"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.da");dijit.nls.common.da={"buttonOk":"OK","buttonCancel":"Annullér","buttonSave":"Gem","itemClose":"Luk"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.da");dijit.form.nls.validate.da={"rangeMessage":"Værdien er uden for intervallet.","invalidMessage":"Den angivne værdi er ikke gyldig.","missingMessage":"Værdien er påkrævet."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.da");dijit.form.nls.ComboBox.da={"previousMessage":"Forrige valg","nextMessage":"Flere valg"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.da");dojo.cldr.nls.number.da={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":",","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_da",{"dijit/form/nls/validate":{"rangeMessage":"Værdien er uden for intervallet.","invalidMessage":"Den angivne værdi er ikke gyldig.","missingMessage":"Værdien er påkrævet."},"dijit/nls/loading":{"loadingState":"Indlæser...","errorState":"Der er opstået en fejl"},"dojo/nls/colors":{"lightsteelblue":"lys stålblå","orangered":"orangerød","midnightblue":"midnatsblå","cadetblue":"kadetblå","seashell":"muslingeskal","slategrey":"skifergrå","coral":"koralrød","darkturquoise":"mørk turkis","antiquewhite":"antikhvid","mediumspringgreen":"mellemforårsgrøn","transparent":"transparent","salmon":"laksefarvet","darkgrey":"mørkegrå","ivory":"elfenben","greenyellow":"grøngul","mistyrose":"blegrosa","lightsalmon":"lys laksefarvet","silver":"sølv","dimgrey":"svag grå","orange":"orange","white":"hvid","navajowhite":"navajo-hvid","royalblue":"kongeblå","deeppink":"dyb pink","lime":"lime","oldlace":"kniplingshvid","chartreuse":"chartreuse","darkcyan":"mørk cyan","yellow":"gul","linen":"lærred","olive":"olivengrøn","gold":"guld","lawngreen":"græsgrøn","lightyellow":"lysegul","tan":"tan","darkviolet":"mørkelilla","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grøn","deepskyblue":"dyb himmelblå","aqua":"akvablå","sienna":"sienna","mintcream":"pebermyntecreme","rosybrown":"rosabrun","mediumslateblue":"mellemskiferblå","magenta":"magenta","lightseagreen":"lys havgrøn","cyan":"cyan","olivedrab":"brungrøn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"mellem akvamarin","lavender":"lysviolet","mediumseagreen":"mellemhavgrøn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"mellemturkis","ghostwhite":"spøgelseshvid","darkblue":"mørkeblå","mediumvioletred":"mellemviolet","brown":"brun","lightgray":"lysegrå","sandybrown":"sandbrun","pink":"pink","firebrick":"chamottesten","indigo":"indigo","snow":"sne","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"rust","springgreen":"forårsgrøn","moccasin":"fruesko","navy":"marineblå","lemonchiffon":"citronfromage","teal":"blågrøn","floralwhite":"blomsterhvid","cornflowerblue":"kornblomstblå","paleturquoise":"bleg turkis","purple":"lilla","gainsboro":"gainsboro","plum":"blomme","red":"rød","blue":"blå","forestgreen":"skovgrøn","darkgreen":"mørkegrøn","honeydew":"honningdug","darkseagreen":"mørk havgrøn","lightcoral":"lys koralrød","palevioletred":"blegviolet","mediumpurple":"mellemlilla","saddlebrown":"saddelbrun","darkmagenta":"mørk magenta","thistle":"tidsel","whitesmoke":"hvid røg","wheat":"korngul","violet":"lilla","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellemblå","skyblue":"himmelblå","crimson":"blodrød","darksalmon":"mørk laksefarvet","darkred":"mørkerød","darkslategrey":"mørk skifergrå","peru":"peru","lightgrey":"lysegrå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"blanceret mandel","aliceblue":"babyblå","bisque":"gulgrå","slategray":"skifergrå","palegoldenrod":"bleg gyldenris","darkorange":"mørk orange","aquamarine":"akvamarin","lightgreen":"lysegrøn","burlywood":"tobak","dodgerblue":"dodgerblå","darkgray":"mørkegrå","lightcyan":"lys cyan","powderblue":"pudderblå","blueviolet":"blåviolet","orchid":"orkide","dimgray":"svag grå","beige":"beige","fuchsia":"lyslilla","lavenderblush":"lavendelrød","hotpink":"mørk rosa","steelblue":"metalblå","tomato":"tomat","lightpink":"lys pink","limegreen":"limegrøn","indianred":"lys rødbrun","papayawhip":"papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"mellem orkide","cornsilk":"majs","black":"sort","seagreen":"havgrøn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lyseblå","palegreen":"bleggrøn","azure":"azurblå","peachpuff":"fersken","darkolivegreen":"mørk olivengrøn","yellowgreen":"gulgrøn"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":",","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Forrige valg","nextMessage":"Flere valg"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Annullér","buttonSave":"Gem","itemClose":"Luk"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_da.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_da.js.uncompressed.js
new file mode 100644
index 000000000..cfe00a014
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_da.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_da',{
+'dijit/form/nls/validate':{"rangeMessage":"Værdien er uden for intervallet.","invalidMessage":"Den angivne værdi er ikke gyldig.","missingMessage":"Værdien er påkrævet."}
+,
+'dijit/nls/loading':{"loadingState":"Indlæser...","errorState":"Der er opstået en fejl"}
+,
+'dojo/nls/colors':{"lightsteelblue":"lys stålblå","orangered":"orangerød","midnightblue":"midnatsblå","cadetblue":"kadetblå","seashell":"muslingeskal","slategrey":"skifergrå","coral":"koralrød","darkturquoise":"mørk turkis","antiquewhite":"antikhvid","mediumspringgreen":"mellemforårsgrøn","transparent":"transparent","salmon":"laksefarvet","darkgrey":"mørkegrå","ivory":"elfenben","greenyellow":"grøngul","mistyrose":"blegrosa","lightsalmon":"lys laksefarvet","silver":"sølv","dimgrey":"svag grå","orange":"orange","white":"hvid","navajowhite":"navajo-hvid","royalblue":"kongeblå","deeppink":"dyb pink","lime":"lime","oldlace":"kniplingshvid","chartreuse":"chartreuse","darkcyan":"mørk cyan","yellow":"gul","linen":"lærred","olive":"olivengrøn","gold":"guld","lawngreen":"græsgrøn","lightyellow":"lysegul","tan":"tan","darkviolet":"mørkelilla","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grøn","deepskyblue":"dyb himmelblå","aqua":"akvablå","sienna":"sienna","mintcream":"pebermyntecreme","rosybrown":"rosabrun","mediumslateblue":"mellemskiferblå","magenta":"magenta","lightseagreen":"lys havgrøn","cyan":"cyan","olivedrab":"brungrøn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"mellem akvamarin","lavender":"lysviolet","mediumseagreen":"mellemhavgrøn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"mellemturkis","ghostwhite":"spøgelseshvid","darkblue":"mørkeblå","mediumvioletred":"mellemviolet","brown":"brun","lightgray":"lysegrå","sandybrown":"sandbrun","pink":"pink","firebrick":"chamottesten","indigo":"indigo","snow":"sne","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"rust","springgreen":"forårsgrøn","moccasin":"fruesko","navy":"marineblå","lemonchiffon":"citronfromage","teal":"blågrøn","floralwhite":"blomsterhvid","cornflowerblue":"kornblomstblå","paleturquoise":"bleg turkis","purple":"lilla","gainsboro":"gainsboro","plum":"blomme","red":"rød","blue":"blå","forestgreen":"skovgrøn","darkgreen":"mørkegrøn","honeydew":"honningdug","darkseagreen":"mørk havgrøn","lightcoral":"lys koralrød","palevioletred":"blegviolet","mediumpurple":"mellemlilla","saddlebrown":"saddelbrun","darkmagenta":"mørk magenta","thistle":"tidsel","whitesmoke":"hvid røg","wheat":"korngul","violet":"lilla","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellemblå","skyblue":"himmelblå","crimson":"blodrød","darksalmon":"mørk laksefarvet","darkred":"mørkerød","darkslategrey":"mørk skifergrå","peru":"peru","lightgrey":"lysegrå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"blanceret mandel","aliceblue":"babyblå","bisque":"gulgrå","slategray":"skifergrå","palegoldenrod":"bleg gyldenris","darkorange":"mørk orange","aquamarine":"akvamarin","lightgreen":"lysegrøn","burlywood":"tobak","dodgerblue":"dodgerblå","darkgray":"mørkegrå","lightcyan":"lys cyan","powderblue":"pudderblå","blueviolet":"blåviolet","orchid":"orkide","dimgray":"svag grå","beige":"beige","fuchsia":"lyslilla","lavenderblush":"lavendelrød","hotpink":"mørk rosa","steelblue":"metalblå","tomato":"tomat","lightpink":"lys pink","limegreen":"limegrøn","indianred":"lys rødbrun","papayawhip":"papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"mellem orkide","cornsilk":"majs","black":"sort","seagreen":"havgrøn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lyseblå","palegreen":"bleggrøn","azure":"azurblå","peachpuff":"fersken","darkolivegreen":"mørk olivengrøn","yellowgreen":"gulgrøn"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":",","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Forrige valg","nextMessage":"Flere valg"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Annullér","buttonSave":"Gem","itemClose":"Luk"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_de-de.js b/lib/dojo/nls/tt-rss-layer_de-de.js
index f43af10d1..f29ec7ce4 100644
--- a/lib/dojo/nls/tt-rss-layer_de-de.js
+++ b/lib/dojo/nls/tt-rss-layer_de-de.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_de-de");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.de_de");dojo.nls.colors.de_de={"lightsteelblue":"Helles Stahlblau","orangered":"Orangerot","midnightblue":"Mitternachtblau","cadetblue":"Kadettenblau","seashell":"Muschelweiß","slategrey":"Schiefergrau","coral":"Koralle","darkturquoise":"Dunkeltürkis","antiquewhite":"Antikweiß","mediumspringgreen":"Mittelfrühlingsgrün","salmon":"Lachs","darkgrey":"Dunkelgrau","ivory":"Elfenbein","greenyellow":"Grüngelb","mistyrose":"Blassrose","lightsalmon":"Helllachs","silver":"Silbergrau","dimgrey":"Blassgrau","orange":"Orange","white":"Weiß","navajowhite":"Navajo-weiß","royalblue":"Königsblau","deeppink":"Tiefrosa","lime":"Limone","oldlace":"Alte Spitze","chartreuse":"Helles Gelbgrün","darkcyan":"Dunkelzyan","yellow":"Gelb","linen":"Leinen","olive":"Oliv","gold":"Gold","lawngreen":"Grasgrün","lightyellow":"Hellgelb","tan":"Hautfarben","darkviolet":"Dunkelviolett","lightslategrey":"Helles Schiefergrau","grey":"Grau","darkkhaki":"Dunkelkhaki","green":"Grün","deepskyblue":"Dunkles Himmelblau","aqua":"Wasserblau","sienna":"Sienna","mintcream":"Mintcreme","rosybrown":"Rosigbraun","mediumslateblue":"Mittelschieferblau ","magenta":"Magenta","lightseagreen":"Helles Meergrün","cyan":"Zyan","olivedrab":"Olivgrau","darkgoldenrod":"Dunkelgoldgelb","slateblue":"Schieferblau","mediumaquamarine":"Mittelaquamarin","lavender":"Lavendelblau","mediumseagreen":"Mittelmeeresgrün","maroon":"Kastanienbraun","darkslategray":"Dunkelschiefergrau","mediumturquoise":"Mitteltürkis ","ghostwhite":"Geisterweiß","darkblue":"Dunkelblau","mediumvioletred":"Mittelviolettrot ","brown":"Braun","lightgray":"Hellgrau","sandybrown":"Sandbraun","pink":"Rosa","firebrick":"Schamottestein","indigo":"Indigoblau","snow":"Schneeweiß","darkorchid":"Dunkelorchidee","turquoise":"Türkis","chocolate":"Schokoladenbraun","springgreen":"Frühlingsgrün","moccasin":"Mokassin","navy":"Marineblau","lemonchiffon":"Zitronenchiffon","teal":"Smaragdgrün","floralwhite":"Blütenweiß","cornflowerblue":"Kornblumenblau","paleturquoise":"Blasstürkis","purple":"Purpurrot","gainsboro":"Gainsboro","plum":"Pflaume","red":"Rot","blue":"Blau","forestgreen":"Forstgrün","darkgreen":"Dunkelgrün","honeydew":"Honigtau","darkseagreen":"Dunkles Meergrün","lightcoral":"Hellkoralle","palevioletred":"Blassviolettrot ","mediumpurple":"Mittelpurpur","saddlebrown":"Sattelbraun","darkmagenta":"Dunkelmagenta","thistle":"Distel","whitesmoke":"Rauchweiß","wheat":"Weizen","violet":"Violett","lightskyblue":"Helles Himmelblau","goldenrod":"Goldgelb","mediumblue":"Mittelblau","skyblue":"Himmelblau","crimson":"Karmesinrot","darksalmon":"Dunkellachs","darkred":"Dunkelrot","darkslategrey":"Dunkelschiefergrau","peru":"Peru","lightgrey":"Hellgrau","lightgoldenrodyellow":"Hellgoldgelb","blanchedalmond":"Mandelweiß","aliceblue":"Alice-blau","bisque":"Bisquit","slategray":"Schiefergrau","palegoldenrod":"Blassgoldgelb","darkorange":"Dunkelorange","aquamarine":"Aquamarin","lightgreen":"Hellgrün","burlywood":"Burlywood","dodgerblue":"Dodger-blau","darkgray":"Dunkelgrau","lightcyan":"Hellzyan","powderblue":"Pulverblau","blueviolet":"Blauviolett","orchid":"Orchidee","dimgray":"Blassgrau","beige":"Beige","fuchsia":"Fuchsia","lavenderblush":"Lavendelhauch","hotpink":"Knallrosa","steelblue":"Stahlblau","tomato":"Tomatenrot","lightpink":"Hellrosa","limegreen":"Limonengrün","indianred":"Indischrot","papayawhip":"Papayacreme","lightslategray":"Helles Schiefergrau","gray":"Grau","mediumorchid":"Mittelorchidee","cornsilk":"Kornseide","black":"Schwarz","seagreen":"Meeresgrün","darkslateblue":"Dunkelschieferblau","khaki":"Khaki","lightblue":"Hellblau","palegreen":"Blassgrün","azure":"Azur","peachpuff":"Pfirsich","darkolivegreen":"Dunkelolivgrün","yellowgreen":"Gelbgrün"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.de_de");dijit.nls.loading.de_de={"loadingState":"Wird geladen...","errorState":"Es ist ein Fehler aufgetreten."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.de_de");dijit.nls.common.de_de={"buttonOk":"OK","buttonCancel":"Abbrechen","buttonSave":"Speichern","itemClose":"Schließen"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.de_de");dijit.form.nls.validate.de_de={"rangeMessage":"Dieser Wert liegt außerhalb des gültigen Bereichs. ","invalidMessage":"Der eingegebene Wert ist ungültig. ","missingMessage":"Dieser Wert ist erforderlich."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.de_de");dijit.form.nls.ComboBox.de_de={"previousMessage":"Vorherige Auswahl","nextMessage":"Weitere Auswahlmöglichkeiten"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.de_de");dojo.cldr.nls.number.de_de={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_de-de",{"dijit/form/nls/validate":{"rangeMessage":"Dieser Wert liegt außerhalb des gültigen Bereichs. ","invalidMessage":"Der eingegebene Wert ist ungültig. ","missingMessage":"Dieser Wert ist erforderlich."},"dijit/nls/loading":{"loadingState":"Wird geladen...","errorState":"Es ist ein Fehler aufgetreten."},"dojo/nls/colors":{"lightsteelblue":"Helles Stahlblau","orangered":"Orangerot","midnightblue":"Mitternachtblau","cadetblue":"Kadettenblau","seashell":"Muschelweiß","slategrey":"Schiefergrau","coral":"Koralle","darkturquoise":"Dunkeltürkis","antiquewhite":"Antikweiß","mediumspringgreen":"Mittelfrühlingsgrün","transparent":"Transparent","salmon":"Lachs","darkgrey":"Dunkelgrau","ivory":"Elfenbein","greenyellow":"Grüngelb","mistyrose":"Blassrose","lightsalmon":"Helllachs","silver":"Silbergrau","dimgrey":"Blassgrau","orange":"Orange","white":"Weiß","navajowhite":"Navajo-weiß","royalblue":"Königsblau","deeppink":"Tiefrosa","lime":"Limone","oldlace":"Alte Spitze","chartreuse":"Helles Gelbgrün","darkcyan":"Dunkelzyan","yellow":"Gelb","linen":"Leinen","olive":"Oliv","gold":"Gold","lawngreen":"Grasgrün","lightyellow":"Hellgelb","tan":"Hautfarben","darkviolet":"Dunkelviolett","lightslategrey":"Helles Schiefergrau","grey":"Grau","darkkhaki":"Dunkelkhaki","green":"Grün","deepskyblue":"Dunkles Himmelblau","aqua":"Wasserblau","sienna":"Sienna","mintcream":"Mintcreme","rosybrown":"Rosigbraun","mediumslateblue":"Mittelschieferblau ","magenta":"Magenta","lightseagreen":"Helles Meergrün","cyan":"Zyan","olivedrab":"Olivgrau","darkgoldenrod":"Dunkelgoldgelb","slateblue":"Schieferblau","mediumaquamarine":"Mittelaquamarin","lavender":"Lavendelblau","mediumseagreen":"Mittelmeeresgrün","maroon":"Kastanienbraun","darkslategray":"Dunkelschiefergrau","mediumturquoise":"Mitteltürkis ","ghostwhite":"Geisterweiß","darkblue":"Dunkelblau","mediumvioletred":"Mittelviolettrot ","brown":"Braun","lightgray":"Hellgrau","sandybrown":"Sandbraun","pink":"Rosa","firebrick":"Schamottestein","indigo":"Indigoblau","snow":"Schneeweiß","darkorchid":"Dunkelorchidee","turquoise":"Türkis","chocolate":"Schokoladenbraun","springgreen":"Frühlingsgrün","moccasin":"Mokassin","navy":"Marineblau","lemonchiffon":"Zitronenchiffon","teal":"Smaragdgrün","floralwhite":"Blütenweiß","cornflowerblue":"Kornblumenblau","paleturquoise":"Blasstürkis","purple":"Purpurrot","gainsboro":"Gainsboro","plum":"Pflaume","red":"Rot","blue":"Blau","forestgreen":"Forstgrün","darkgreen":"Dunkelgrün","honeydew":"Honigtau","darkseagreen":"Dunkles Meergrün","lightcoral":"Hellkoralle","palevioletred":"Blassviolettrot ","mediumpurple":"Mittelpurpur","saddlebrown":"Sattelbraun","darkmagenta":"Dunkelmagenta","thistle":"Distel","whitesmoke":"Rauchweiß","wheat":"Weizen","violet":"Violett","lightskyblue":"Helles Himmelblau","goldenrod":"Goldgelb","mediumblue":"Mittelblau","skyblue":"Himmelblau","crimson":"Karmesinrot","darksalmon":"Dunkellachs","darkred":"Dunkelrot","darkslategrey":"Dunkelschiefergrau","peru":"Peru","lightgrey":"Hellgrau","lightgoldenrodyellow":"Hellgoldgelb","blanchedalmond":"Mandelweiß","aliceblue":"Alice-blau","bisque":"Bisquit","slategray":"Schiefergrau","palegoldenrod":"Blassgoldgelb","darkorange":"Dunkelorange","aquamarine":"Aquamarin","lightgreen":"Hellgrün","burlywood":"Burlywood","dodgerblue":"Dodger-blau","darkgray":"Dunkelgrau","lightcyan":"Hellzyan","powderblue":"Pulverblau","blueviolet":"Blauviolett","orchid":"Orchidee","dimgray":"Blassgrau","beige":"Beige","fuchsia":"Fuchsia","lavenderblush":"Lavendelhauch","hotpink":"Knallrosa","steelblue":"Stahlblau","tomato":"Tomatenrot","lightpink":"Hellrosa","limegreen":"Limonengrün","indianred":"Indischrot","papayawhip":"Papayacreme","lightslategray":"Helles Schiefergrau","gray":"Grau","mediumorchid":"Mittelorchidee","cornsilk":"Kornseide","black":"Schwarz","seagreen":"Meeresgrün","darkslateblue":"Dunkelschieferblau","khaki":"Khaki","lightblue":"Hellblau","palegreen":"Blassgrün","azure":"Azur","peachpuff":"Pfirsich","darkolivegreen":"Dunkelolivgrün","yellowgreen":"Gelbgrün"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Vorherige Auswahl","nextMessage":"Weitere Auswahlmöglichkeiten"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Abbrechen","buttonSave":"Speichern","itemClose":"Schließen"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_de-de.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_de-de.js.uncompressed.js
new file mode 100644
index 000000000..dda51bad5
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_de-de.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_de-de',{
+'dijit/form/nls/validate':{"rangeMessage":"Dieser Wert liegt außerhalb des gültigen Bereichs. ","invalidMessage":"Der eingegebene Wert ist ungültig. ","missingMessage":"Dieser Wert ist erforderlich."}
+,
+'dijit/nls/loading':{"loadingState":"Wird geladen...","errorState":"Es ist ein Fehler aufgetreten."}
+,
+'dojo/nls/colors':{"lightsteelblue":"Helles Stahlblau","orangered":"Orangerot","midnightblue":"Mitternachtblau","cadetblue":"Kadettenblau","seashell":"Muschelweiß","slategrey":"Schiefergrau","coral":"Koralle","darkturquoise":"Dunkeltürkis","antiquewhite":"Antikweiß","mediumspringgreen":"Mittelfrühlingsgrün","transparent":"Transparent","salmon":"Lachs","darkgrey":"Dunkelgrau","ivory":"Elfenbein","greenyellow":"Grüngelb","mistyrose":"Blassrose","lightsalmon":"Helllachs","silver":"Silbergrau","dimgrey":"Blassgrau","orange":"Orange","white":"Weiß","navajowhite":"Navajo-weiß","royalblue":"Königsblau","deeppink":"Tiefrosa","lime":"Limone","oldlace":"Alte Spitze","chartreuse":"Helles Gelbgrün","darkcyan":"Dunkelzyan","yellow":"Gelb","linen":"Leinen","olive":"Oliv","gold":"Gold","lawngreen":"Grasgrün","lightyellow":"Hellgelb","tan":"Hautfarben","darkviolet":"Dunkelviolett","lightslategrey":"Helles Schiefergrau","grey":"Grau","darkkhaki":"Dunkelkhaki","green":"Grün","deepskyblue":"Dunkles Himmelblau","aqua":"Wasserblau","sienna":"Sienna","mintcream":"Mintcreme","rosybrown":"Rosigbraun","mediumslateblue":"Mittelschieferblau ","magenta":"Magenta","lightseagreen":"Helles Meergrün","cyan":"Zyan","olivedrab":"Olivgrau","darkgoldenrod":"Dunkelgoldgelb","slateblue":"Schieferblau","mediumaquamarine":"Mittelaquamarin","lavender":"Lavendelblau","mediumseagreen":"Mittelmeeresgrün","maroon":"Kastanienbraun","darkslategray":"Dunkelschiefergrau","mediumturquoise":"Mitteltürkis ","ghostwhite":"Geisterweiß","darkblue":"Dunkelblau","mediumvioletred":"Mittelviolettrot ","brown":"Braun","lightgray":"Hellgrau","sandybrown":"Sandbraun","pink":"Rosa","firebrick":"Schamottestein","indigo":"Indigoblau","snow":"Schneeweiß","darkorchid":"Dunkelorchidee","turquoise":"Türkis","chocolate":"Schokoladenbraun","springgreen":"Frühlingsgrün","moccasin":"Mokassin","navy":"Marineblau","lemonchiffon":"Zitronenchiffon","teal":"Smaragdgrün","floralwhite":"Blütenweiß","cornflowerblue":"Kornblumenblau","paleturquoise":"Blasstürkis","purple":"Purpurrot","gainsboro":"Gainsboro","plum":"Pflaume","red":"Rot","blue":"Blau","forestgreen":"Forstgrün","darkgreen":"Dunkelgrün","honeydew":"Honigtau","darkseagreen":"Dunkles Meergrün","lightcoral":"Hellkoralle","palevioletred":"Blassviolettrot ","mediumpurple":"Mittelpurpur","saddlebrown":"Sattelbraun","darkmagenta":"Dunkelmagenta","thistle":"Distel","whitesmoke":"Rauchweiß","wheat":"Weizen","violet":"Violett","lightskyblue":"Helles Himmelblau","goldenrod":"Goldgelb","mediumblue":"Mittelblau","skyblue":"Himmelblau","crimson":"Karmesinrot","darksalmon":"Dunkellachs","darkred":"Dunkelrot","darkslategrey":"Dunkelschiefergrau","peru":"Peru","lightgrey":"Hellgrau","lightgoldenrodyellow":"Hellgoldgelb","blanchedalmond":"Mandelweiß","aliceblue":"Alice-blau","bisque":"Bisquit","slategray":"Schiefergrau","palegoldenrod":"Blassgoldgelb","darkorange":"Dunkelorange","aquamarine":"Aquamarin","lightgreen":"Hellgrün","burlywood":"Burlywood","dodgerblue":"Dodger-blau","darkgray":"Dunkelgrau","lightcyan":"Hellzyan","powderblue":"Pulverblau","blueviolet":"Blauviolett","orchid":"Orchidee","dimgray":"Blassgrau","beige":"Beige","fuchsia":"Fuchsia","lavenderblush":"Lavendelhauch","hotpink":"Knallrosa","steelblue":"Stahlblau","tomato":"Tomatenrot","lightpink":"Hellrosa","limegreen":"Limonengrün","indianred":"Indischrot","papayawhip":"Papayacreme","lightslategray":"Helles Schiefergrau","gray":"Grau","mediumorchid":"Mittelorchidee","cornsilk":"Kornseide","black":"Schwarz","seagreen":"Meeresgrün","darkslateblue":"Dunkelschieferblau","khaki":"Khaki","lightblue":"Hellblau","palegreen":"Blassgrün","azure":"Azur","peachpuff":"Pfirsich","darkolivegreen":"Dunkelolivgrün","yellowgreen":"Gelbgrün"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Vorherige Auswahl","nextMessage":"Weitere Auswahlmöglichkeiten"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Abbrechen","buttonSave":"Speichern","itemClose":"Schließen"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_de.js b/lib/dojo/nls/tt-rss-layer_de.js
deleted file mode 100644
index 9d0939e4a..000000000
--- a/lib/dojo/nls/tt-rss-layer_de.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dojo.nls.tt-rss-layer_de");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.de");dojo.nls.colors.de={"lightsteelblue":"Helles Stahlblau","orangered":"Orangerot","midnightblue":"Mitternachtblau","cadetblue":"Kadettenblau","seashell":"Muschelweiß","slategrey":"Schiefergrau","coral":"Koralle","darkturquoise":"Dunkeltürkis","antiquewhite":"Antikweiß","mediumspringgreen":"Mittelfrühlingsgrün","salmon":"Lachs","darkgrey":"Dunkelgrau","ivory":"Elfenbein","greenyellow":"Grüngelb","mistyrose":"Blassrose","lightsalmon":"Helllachs","silver":"Silbergrau","dimgrey":"Blassgrau","orange":"Orange","white":"Weiß","navajowhite":"Navajo-weiß","royalblue":"Königsblau","deeppink":"Tiefrosa","lime":"Limone","oldlace":"Alte Spitze","chartreuse":"Helles Gelbgrün","darkcyan":"Dunkelzyan","yellow":"Gelb","linen":"Leinen","olive":"Oliv","gold":"Gold","lawngreen":"Grasgrün","lightyellow":"Hellgelb","tan":"Hautfarben","darkviolet":"Dunkelviolett","lightslategrey":"Helles Schiefergrau","grey":"Grau","darkkhaki":"Dunkelkhaki","green":"Grün","deepskyblue":"Dunkles Himmelblau","aqua":"Wasserblau","sienna":"Sienna","mintcream":"Mintcreme","rosybrown":"Rosigbraun","mediumslateblue":"Mittelschieferblau ","magenta":"Magenta","lightseagreen":"Helles Meergrün","cyan":"Zyan","olivedrab":"Olivgrau","darkgoldenrod":"Dunkelgoldgelb","slateblue":"Schieferblau","mediumaquamarine":"Mittelaquamarin","lavender":"Lavendelblau","mediumseagreen":"Mittelmeeresgrün","maroon":"Kastanienbraun","darkslategray":"Dunkelschiefergrau","mediumturquoise":"Mitteltürkis ","ghostwhite":"Geisterweiß","darkblue":"Dunkelblau","mediumvioletred":"Mittelviolettrot ","brown":"Braun","lightgray":"Hellgrau","sandybrown":"Sandbraun","pink":"Rosa","firebrick":"Schamottestein","indigo":"Indigoblau","snow":"Schneeweiß","darkorchid":"Dunkelorchidee","turquoise":"Türkis","chocolate":"Schokoladenbraun","springgreen":"Frühlingsgrün","moccasin":"Mokassin","navy":"Marineblau","lemonchiffon":"Zitronenchiffon","teal":"Smaragdgrün","floralwhite":"Blütenweiß","cornflowerblue":"Kornblumenblau","paleturquoise":"Blasstürkis","purple":"Purpurrot","gainsboro":"Gainsboro","plum":"Pflaume","red":"Rot","blue":"Blau","forestgreen":"Forstgrün","darkgreen":"Dunkelgrün","honeydew":"Honigtau","darkseagreen":"Dunkles Meergrün","lightcoral":"Hellkoralle","palevioletred":"Blassviolettrot ","mediumpurple":"Mittelpurpur","saddlebrown":"Sattelbraun","darkmagenta":"Dunkelmagenta","thistle":"Distel","whitesmoke":"Rauchweiß","wheat":"Weizen","violet":"Violett","lightskyblue":"Helles Himmelblau","goldenrod":"Goldgelb","mediumblue":"Mittelblau","skyblue":"Himmelblau","crimson":"Karmesinrot","darksalmon":"Dunkellachs","darkred":"Dunkelrot","darkslategrey":"Dunkelschiefergrau","peru":"Peru","lightgrey":"Hellgrau","lightgoldenrodyellow":"Hellgoldgelb","blanchedalmond":"Mandelweiß","aliceblue":"Alice-blau","bisque":"Bisquit","slategray":"Schiefergrau","palegoldenrod":"Blassgoldgelb","darkorange":"Dunkelorange","aquamarine":"Aquamarin","lightgreen":"Hellgrün","burlywood":"Burlywood","dodgerblue":"Dodger-blau","darkgray":"Dunkelgrau","lightcyan":"Hellzyan","powderblue":"Pulverblau","blueviolet":"Blauviolett","orchid":"Orchidee","dimgray":"Blassgrau","beige":"Beige","fuchsia":"Fuchsia","lavenderblush":"Lavendelhauch","hotpink":"Knallrosa","steelblue":"Stahlblau","tomato":"Tomatenrot","lightpink":"Hellrosa","limegreen":"Limonengrün","indianred":"Indischrot","papayawhip":"Papayacreme","lightslategray":"Helles Schiefergrau","gray":"Grau","mediumorchid":"Mittelorchidee","cornsilk":"Kornseide","black":"Schwarz","seagreen":"Meeresgrün","darkslateblue":"Dunkelschieferblau","khaki":"Khaki","lightblue":"Hellblau","palegreen":"Blassgrün","azure":"Azur","peachpuff":"Pfirsich","darkolivegreen":"Dunkelolivgrün","yellowgreen":"Gelbgrün"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.de");dijit.nls.loading.de={"loadingState":"Wird geladen...","errorState":"Es ist ein Fehler aufgetreten."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.de");dijit.nls.common.de={"buttonOk":"OK","buttonCancel":"Abbrechen","buttonSave":"Speichern","itemClose":"Schließen"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.de");dijit.form.nls.validate.de={"rangeMessage":"Dieser Wert liegt außerhalb des gültigen Bereichs. ","invalidMessage":"Der eingegebene Wert ist ungültig. ","missingMessage":"Dieser Wert ist erforderlich."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.de");dijit.form.nls.ComboBox.de={"previousMessage":"Vorherige Auswahl","nextMessage":"Weitere Auswahlmöglichkeiten"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.de");dojo.cldr.nls.number.de={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_el.js b/lib/dojo/nls/tt-rss-layer_el.js
index 379759746..7279885ad 100644
--- a/lib/dojo/nls/tt-rss-layer_el.js
+++ b/lib/dojo/nls/tt-rss-layer_el.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_el");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.el");dojo.nls.colors.el={"lightsteelblue":"ανοιχτό μπλε ατσαλιού","orangered":"πορτοκαλοκόκκινο","midnightblue":"πολύ σκούρο μπλε","cadetblue":"μπλε του στρατού","seashell":"κοχύλι","slategrey":"μεταλλικό γκρι","coral":"κοραλί","darkturquoise":"σκούρο τυρκουάζ","antiquewhite":"ξεθωριασμένο λευκό","mediumspringgreen":"μεσαίο πράσινο της άνοιξης","salmon":"σομόν","darkgrey":"σκούρο γκρι","ivory":"ιβουάρ","greenyellow":"πρασινοκίτρινο","mistyrose":"τριανταφυλλί","lightsalmon":"ανοιχτό σομόν","silver":"ασημί","dimgrey":"αχνό γκρι","orange":"πορτοκαλί","white":"λευκό","navajowhite":"άσπρο Ναβάχο","royalblue":"έντονο μπλε","deeppink":"βαθύ ροζ","lime":"λαχανί","oldlace":"εκρού","chartreuse":"φωτεινό κιτρινοπράσινο","darkcyan":"σκούρο κυανό","yellow":"κίτρινο","linen":"σπαγγί","olive":"πράσινο λαδί","gold":"χρυσαφί","lawngreen":"σκούρο πράσινο","lightyellow":"ανοιχτό κίτρινο","tan":"ώχρα","darkviolet":"σκούρο βιολετί","lightslategrey":"ανοιχτό μεταλλικό γκρι","grey":"γκρι","darkkhaki":"σκούρο χακί","green":"πράσινο","deepskyblue":"βαθύ μπλε το ουρανού","aqua":"γαλάζιο","sienna":"καφεκίτρινο","mintcream":"βεραμάν","rosybrown":"καστανό","mediumslateblue":"μεσαίο μεταλλικό μπλε","magenta":"ματζέντα","lightseagreen":"ανοιχτό πράσινο της θάλασσας","cyan":"κυανό","olivedrab":"λαδί","darkgoldenrod":"σκούρο χρυσοκίτρινο","slateblue":"μεταλλικό μπλε","mediumaquamarine":"μεσαίο γαλαζοπράσινο","lavender":"λίλα","mediumseagreen":"μεσαίο πράσινο της θάλασσας","maroon":"βυσσινί","darkslategray":"σκούρο μεταλλικό γκρι","mediumturquoise":"μεσαίο τυρκουάζ","ghostwhite":"άσπρο","darkblue":"σκούρο μπλε","mediumvioletred":"μεσαίο κόκκινο βιολετί","brown":"καφέ","lightgray":"ανοιχτό γκρι","sandybrown":"μπεζ της άμμου","pink":"ροζ","firebrick":"κεραμιδί","indigo":"λουλακί","snow":"χιονί","darkorchid":"σκούρα ορχιδέα","turquoise":"τυρκουάζ","chocolate":"σοκολατί","springgreen":"πράσινο της άνοιξης","moccasin":"μόκα","navy":"μπλε του ναυτικού","lemonchiffon":"λεμονί","teal":"πετρόλ","floralwhite":"λευκό των ανθών","cornflowerblue":"μεσαίο μπλε","paleturquoise":"αχνό τυρκουάζ","purple":"μωβ","gainsboro":"γκρι σιέλ","plum":"δαμασκηνί","red":"κόκκινο","blue":"μπλε","forestgreen":"πράσινο του δάσους","darkgreen":"σκούρο πράσινο","honeydew":"μελί","darkseagreen":"σκούρο πράσινο της θάλασσας","lightcoral":"ανοιχτό κοραλί","palevioletred":"αχνό κόκκινο βιολετί","mediumpurple":"μεσαίο μωβ","saddlebrown":"βαθύ καφέ","darkmagenta":"σκούρο ματζέντα","thistle":"μωβ βιολετί","whitesmoke":"λευκός καπνός","wheat":"σταρένιο","violet":"βιολετί","lightskyblue":"ανοιχτό μπλε το ουρανού","goldenrod":"χρυσοκίτρινο","mediumblue":"μεσαίο μπλε","skyblue":"μπλε του ουρανού","crimson":"βαθύ κόκκινο","darksalmon":"σκούρο σομόν","darkred":"σκούρο κόκκινο","darkslategrey":"σκούρο μεταλλικό γκρι","peru":"περού","lightgrey":"ανοιχτό γκρι","lightgoldenrodyellow":"ανοιχτό χρυσοκίτρινο","blanchedalmond":"ζαχαρί","aliceblue":"σιέλ","bisque":"σκούρο κρεμ","slategray":"μεταλλικό γκρι","palegoldenrod":"αχνό χρυσοκίτρινο","darkorange":"σκούρο πορτοκαλί","aquamarine":"γαλαζοπράσινο","lightgreen":"ανοιχτό πράσινο","burlywood":"καφέ του ξύλου","dodgerblue":"σκούρο ελεκτρίκ","darkgray":"σκούρο γκρι","lightcyan":"ανοιχτό κυανό","powderblue":"αχνό μπλε","blueviolet":"βιολετί","orchid":"ορχιδέα","dimgray":"αχνό γκρι","beige":"μπεζ","fuchsia":"φούξια","lavenderblush":"μωβ λεβάντας","hotpink":"έντονο ροζ","steelblue":"μπλε ατσαλιού","tomato":"κόκκινο της ντομάτας","lightpink":"ανοιχτό ροζ","limegreen":"πράσινο λαχανί","indianred":"ινδικό κόκκινο","papayawhip":"αχνό ροζ","lightslategray":"ανοιχτό μεταλλικό γκρι","gray":"γκρι","mediumorchid":"μεσαία ορχιδέα","cornsilk":"ασημί του καλαμποκιού","black":"μαύρο","seagreen":"πράσινο της θάλασσας","darkslateblue":"σκούρο μεταλλικό μπλε","khaki":"χακί","lightblue":"ανοιχτό μπλε","palegreen":"αχνό πράσινο","azure":"μπλε του ουρανού","peachpuff":"ροδακινί","darkolivegreen":"σκούρο πράσινο λαδί","yellowgreen":"κιτρινοπράσινο"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.el");dijit.nls.loading.el={"loadingState":"Φόρτωση...","errorState":"Σας ζητούμε συγνώμη, παρουσιάστηκε σφάλμα"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.el");dijit.nls.common.el={"buttonOk":"ΟΚ","buttonCancel":"Ακύρωση","buttonSave":"Αποθήκευση","itemClose":"Κλείσιμο"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.el");dijit.form.nls.validate.el={"rangeMessage":"Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών.","invalidMessage":"Η τιμή που καταχωρήσατε δεν είναι έγκυρη.","missingMessage":"Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.el");dijit.form.nls.ComboBox.el={"previousMessage":"Προηγούμενες επιλογές","nextMessage":"Περισσότερες επιλογές"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.el");dojo.cldr.nls.number.el={"group":".","percentSign":"%","exponential":"e","percentFormat":"#,##0%","list":",","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","currencyFormat":"#,##0.00 ¤","plusSign":"+","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","decimalFormat":"#,##0.###","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_el",{"dijit/form/nls/validate":{"rangeMessage":"Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών.","invalidMessage":"Η τιμή που καταχωρήσατε δεν είναι έγκυρη.","missingMessage":"Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί."},"dijit/nls/loading":{"loadingState":"Φόρτωση...","errorState":"Σας ζητούμε συγνώμη, παρουσιάστηκε σφάλμα"},"dojo/nls/colors":{"lightsteelblue":"ανοιχτό μπλε ατσαλιού","orangered":"πορτοκαλοκόκκινο","midnightblue":"πολύ σκούρο μπλε","cadetblue":"μπλε του στρατού","seashell":"κοχύλι","slategrey":"μεταλλικό γκρι","coral":"κοραλί","darkturquoise":"σκούρο τυρκουάζ","antiquewhite":"ξεθωριασμένο λευκό","mediumspringgreen":"μεσαίο πράσινο της άνοιξης","transparent":"διαφανές","salmon":"σομόν","darkgrey":"σκούρο γκρι","ivory":"ιβουάρ","greenyellow":"πρασινοκίτρινο","mistyrose":"τριανταφυλλί","lightsalmon":"ανοιχτό σομόν","silver":"ασημί","dimgrey":"αχνό γκρι","orange":"πορτοκαλί","white":"λευκό","navajowhite":"άσπρο Ναβάχο","royalblue":"έντονο μπλε","deeppink":"βαθύ ροζ","lime":"λαχανί","oldlace":"εκρού","chartreuse":"φωτεινό κιτρινοπράσινο","darkcyan":"σκούρο κυανό","yellow":"κίτρινο","linen":"σπαγγί","olive":"πράσινο λαδί","gold":"χρυσαφί","lawngreen":"σκούρο πράσινο","lightyellow":"ανοιχτό κίτρινο","tan":"ώχρα","darkviolet":"σκούρο βιολετί","lightslategrey":"ανοιχτό μεταλλικό γκρι","grey":"γκρι","darkkhaki":"σκούρο χακί","green":"πράσινο","deepskyblue":"βαθύ μπλε το ουρανού","aqua":"γαλάζιο","sienna":"καφεκίτρινο","mintcream":"βεραμάν","rosybrown":"καστανό","mediumslateblue":"μεσαίο μεταλλικό μπλε","magenta":"ματζέντα","lightseagreen":"ανοιχτό πράσινο της θάλασσας","cyan":"κυανό","olivedrab":"λαδί","darkgoldenrod":"σκούρο χρυσοκίτρινο","slateblue":"μεταλλικό μπλε","mediumaquamarine":"μεσαίο γαλαζοπράσινο","lavender":"λίλα","mediumseagreen":"μεσαίο πράσινο της θάλασσας","maroon":"βυσσινί","darkslategray":"σκούρο μεταλλικό γκρι","mediumturquoise":"μεσαίο τυρκουάζ","ghostwhite":"άσπρο","darkblue":"σκούρο μπλε","mediumvioletred":"μεσαίο κόκκινο βιολετί","brown":"καφέ","lightgray":"ανοιχτό γκρι","sandybrown":"μπεζ της άμμου","pink":"ροζ","firebrick":"κεραμιδί","indigo":"λουλακί","snow":"χιονί","darkorchid":"σκούρα ορχιδέα","turquoise":"τυρκουάζ","chocolate":"σοκολατί","springgreen":"πράσινο της άνοιξης","moccasin":"μόκα","navy":"μπλε του ναυτικού","lemonchiffon":"λεμονί","teal":"πετρόλ","floralwhite":"λευκό των ανθών","cornflowerblue":"μεσαίο μπλε","paleturquoise":"αχνό τυρκουάζ","purple":"μωβ","gainsboro":"γκρι σιέλ","plum":"δαμασκηνί","red":"κόκκινο","blue":"μπλε","forestgreen":"πράσινο του δάσους","darkgreen":"σκούρο πράσινο","honeydew":"μελί","darkseagreen":"σκούρο πράσινο της θάλασσας","lightcoral":"ανοιχτό κοραλί","palevioletred":"αχνό κόκκινο βιολετί","mediumpurple":"μεσαίο μωβ","saddlebrown":"βαθύ καφέ","darkmagenta":"σκούρο ματζέντα","thistle":"μωβ βιολετί","whitesmoke":"λευκός καπνός","wheat":"σταρένιο","violet":"βιολετί","lightskyblue":"ανοιχτό μπλε το ουρανού","goldenrod":"χρυσοκίτρινο","mediumblue":"μεσαίο μπλε","skyblue":"μπλε του ουρανού","crimson":"βαθύ κόκκινο","darksalmon":"σκούρο σομόν","darkred":"σκούρο κόκκινο","darkslategrey":"σκούρο μεταλλικό γκρι","peru":"περού","lightgrey":"ανοιχτό γκρι","lightgoldenrodyellow":"ανοιχτό χρυσοκίτρινο","blanchedalmond":"ζαχαρί","aliceblue":"σιέλ","bisque":"σκούρο κρεμ","slategray":"μεταλλικό γκρι","palegoldenrod":"αχνό χρυσοκίτρινο","darkorange":"σκούρο πορτοκαλί","aquamarine":"γαλαζοπράσινο","lightgreen":"ανοιχτό πράσινο","burlywood":"καφέ του ξύλου","dodgerblue":"σκούρο ελεκτρίκ","darkgray":"σκούρο γκρι","lightcyan":"ανοιχτό κυανό","powderblue":"αχνό μπλε","blueviolet":"βιολετί","orchid":"ορχιδέα","dimgray":"αχνό γκρι","beige":"μπεζ","fuchsia":"φούξια","lavenderblush":"μωβ λεβάντας","hotpink":"έντονο ροζ","steelblue":"μπλε ατσαλιού","tomato":"κόκκινο της ντομάτας","lightpink":"ανοιχτό ροζ","limegreen":"πράσινο λαχανί","indianred":"ινδικό κόκκινο","papayawhip":"αχνό ροζ","lightslategray":"ανοιχτό μεταλλικό γκρι","gray":"γκρι","mediumorchid":"μεσαία ορχιδέα","cornsilk":"ασημί του καλαμποκιού","black":"μαύρο","seagreen":"πράσινο της θάλασσας","darkslateblue":"σκούρο μεταλλικό μπλε","khaki":"χακί","lightblue":"ανοιχτό μπλε","palegreen":"αχνό πράσινο","azure":"μπλε του ουρανού","peachpuff":"ροδακινί","darkolivegreen":"σκούρο πράσινο λαδί","yellowgreen":"κιτρινοπράσινο"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":",","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"e"},"dijit/form/nls/ComboBox":{"previousMessage":"Προηγούμενες επιλογές","nextMessage":"Περισσότερες επιλογές"},"dijit/nls/common":{"buttonOk":"ΟΚ","buttonCancel":"Ακύρωση","buttonSave":"Αποθήκευση","itemClose":"Κλείσιμο"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_el.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_el.js.uncompressed.js
new file mode 100644
index 000000000..98ddc6572
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_el.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_el',{
+'dijit/form/nls/validate':{"rangeMessage":"Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών.","invalidMessage":"Η τιμή που καταχωρήσατε δεν είναι έγκυρη.","missingMessage":"Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί."}
+,
+'dijit/nls/loading':{"loadingState":"Φόρτωση...","errorState":"Σας ζητούμε συγνώμη, παρουσιάστηκε σφάλμα"}
+,
+'dojo/nls/colors':{"lightsteelblue":"ανοιχτό μπλε ατσαλιού","orangered":"πορτοκαλοκόκκινο","midnightblue":"πολύ σκούρο μπλε","cadetblue":"μπλε του στρατού","seashell":"κοχύλι","slategrey":"μεταλλικό γκρι","coral":"κοραλί","darkturquoise":"σκούρο τυρκουάζ","antiquewhite":"ξεθωριασμένο λευκό","mediumspringgreen":"μεσαίο πράσινο της άνοιξης","transparent":"διαφανές","salmon":"σομόν","darkgrey":"σκούρο γκρι","ivory":"ιβουάρ","greenyellow":"πρασινοκίτρινο","mistyrose":"τριανταφυλλί","lightsalmon":"ανοιχτό σομόν","silver":"ασημί","dimgrey":"αχνό γκρι","orange":"πορτοκαλί","white":"λευκό","navajowhite":"άσπρο Ναβάχο","royalblue":"έντονο μπλε","deeppink":"βαθύ ροζ","lime":"λαχανί","oldlace":"εκρού","chartreuse":"φωτεινό κιτρινοπράσινο","darkcyan":"σκούρο κυανό","yellow":"κίτρινο","linen":"σπαγγί","olive":"πράσινο λαδί","gold":"χρυσαφί","lawngreen":"σκούρο πράσινο","lightyellow":"ανοιχτό κίτρινο","tan":"ώχρα","darkviolet":"σκούρο βιολετί","lightslategrey":"ανοιχτό μεταλλικό γκρι","grey":"γκρι","darkkhaki":"σκούρο χακί","green":"πράσινο","deepskyblue":"βαθύ μπλε το ουρανού","aqua":"γαλάζιο","sienna":"καφεκίτρινο","mintcream":"βεραμάν","rosybrown":"καστανό","mediumslateblue":"μεσαίο μεταλλικό μπλε","magenta":"ματζέντα","lightseagreen":"ανοιχτό πράσινο της θάλασσας","cyan":"κυανό","olivedrab":"λαδί","darkgoldenrod":"σκούρο χρυσοκίτρινο","slateblue":"μεταλλικό μπλε","mediumaquamarine":"μεσαίο γαλαζοπράσινο","lavender":"λίλα","mediumseagreen":"μεσαίο πράσινο της θάλασσας","maroon":"βυσσινί","darkslategray":"σκούρο μεταλλικό γκρι","mediumturquoise":"μεσαίο τυρκουάζ","ghostwhite":"άσπρο","darkblue":"σκούρο μπλε","mediumvioletred":"μεσαίο κόκκινο βιολετί","brown":"καφέ","lightgray":"ανοιχτό γκρι","sandybrown":"μπεζ της άμμου","pink":"ροζ","firebrick":"κεραμιδί","indigo":"λουλακί","snow":"χιονί","darkorchid":"σκούρα ορχιδέα","turquoise":"τυρκουάζ","chocolate":"σοκολατί","springgreen":"πράσινο της άνοιξης","moccasin":"μόκα","navy":"μπλε του ναυτικού","lemonchiffon":"λεμονί","teal":"πετρόλ","floralwhite":"λευκό των ανθών","cornflowerblue":"μεσαίο μπλε","paleturquoise":"αχνό τυρκουάζ","purple":"μωβ","gainsboro":"γκρι σιέλ","plum":"δαμασκηνί","red":"κόκκινο","blue":"μπλε","forestgreen":"πράσινο του δάσους","darkgreen":"σκούρο πράσινο","honeydew":"μελί","darkseagreen":"σκούρο πράσινο της θάλασσας","lightcoral":"ανοιχτό κοραλί","palevioletred":"αχνό κόκκινο βιολετί","mediumpurple":"μεσαίο μωβ","saddlebrown":"βαθύ καφέ","darkmagenta":"σκούρο ματζέντα","thistle":"μωβ βιολετί","whitesmoke":"λευκός καπνός","wheat":"σταρένιο","violet":"βιολετί","lightskyblue":"ανοιχτό μπλε το ουρανού","goldenrod":"χρυσοκίτρινο","mediumblue":"μεσαίο μπλε","skyblue":"μπλε του ουρανού","crimson":"βαθύ κόκκινο","darksalmon":"σκούρο σομόν","darkred":"σκούρο κόκκινο","darkslategrey":"σκούρο μεταλλικό γκρι","peru":"περού","lightgrey":"ανοιχτό γκρι","lightgoldenrodyellow":"ανοιχτό χρυσοκίτρινο","blanchedalmond":"ζαχαρί","aliceblue":"σιέλ","bisque":"σκούρο κρεμ","slategray":"μεταλλικό γκρι","palegoldenrod":"αχνό χρυσοκίτρινο","darkorange":"σκούρο πορτοκαλί","aquamarine":"γαλαζοπράσινο","lightgreen":"ανοιχτό πράσινο","burlywood":"καφέ του ξύλου","dodgerblue":"σκούρο ελεκτρίκ","darkgray":"σκούρο γκρι","lightcyan":"ανοιχτό κυανό","powderblue":"αχνό μπλε","blueviolet":"βιολετί","orchid":"ορχιδέα","dimgray":"αχνό γκρι","beige":"μπεζ","fuchsia":"φούξια","lavenderblush":"μωβ λεβάντας","hotpink":"έντονο ροζ","steelblue":"μπλε ατσαλιού","tomato":"κόκκινο της ντομάτας","lightpink":"ανοιχτό ροζ","limegreen":"πράσινο λαχανί","indianred":"ινδικό κόκκινο","papayawhip":"αχνό ροζ","lightslategray":"ανοιχτό μεταλλικό γκρι","gray":"γκρι","mediumorchid":"μεσαία ορχιδέα","cornsilk":"ασημί του καλαμποκιού","black":"μαύρο","seagreen":"πράσινο της θάλασσας","darkslateblue":"σκούρο μεταλλικό μπλε","khaki":"χακί","lightblue":"ανοιχτό μπλε","palegreen":"αχνό πράσινο","azure":"μπλε του ουρανού","peachpuff":"ροδακινί","darkolivegreen":"σκούρο πράσινο λαδί","yellowgreen":"κιτρινοπράσινο"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":",","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"e"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Προηγούμενες επιλογές","nextMessage":"Περισσότερες επιλογές"}
+,
+'dijit/nls/common':{"buttonOk":"ΟΚ","buttonCancel":"Ακύρωση","buttonSave":"Αποθήκευση","itemClose":"Κλείσιμο"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_en-gb.js b/lib/dojo/nls/tt-rss-layer_en-gb.js
index 729bd63b5..72844ccc5 100644
--- a/lib/dojo/nls/tt-rss-layer_en-gb.js
+++ b/lib/dojo/nls/tt-rss-layer_en-gb.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_en-gb");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.en_gb");dojo.nls.colors.en_gb={"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.en_gb");dijit.nls.loading.en_gb={"loadingState":"Loading...","errorState":"Sorry, an error occurred"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.en_gb");dijit.nls.common.en_gb={"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.en_gb");dijit.form.nls.validate.en_gb={"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.en_gb");dijit.form.nls.ComboBox.en_gb={"previousMessage":"Previous choices","nextMessage":"More choices"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.en_gb");dojo.cldr.nls.number.en_gb={"currencyFormat":"¤#,##0.00","group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","plusSign":"+","decimalFormat-short":"000T","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_en-gb",{"dijit/form/nls/validate":{"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."},"dijit/nls/loading":{"loadingState":"Loading...","errorState":"Sorry, an error occurred"},"dojo/nls/colors":{"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"transparent","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Previous choices","nextMessage":"More choices"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_en-gb.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_en-gb.js.uncompressed.js
new file mode 100644
index 000000000..ac3132c3e
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_en-gb.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_en-gb',{
+'dijit/form/nls/validate':{"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."}
+,
+'dijit/nls/loading':{"loadingState":"Loading...","errorState":"Sorry, an error occurred"}
+,
+'dojo/nls/colors':{"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"transparent","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Previous choices","nextMessage":"More choices"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_en-us.js b/lib/dojo/nls/tt-rss-layer_en-us.js
index d8be077fe..741517bf0 100644
--- a/lib/dojo/nls/tt-rss-layer_en-us.js
+++ b/lib/dojo/nls/tt-rss-layer_en-us.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_en-us");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.en_us");dojo.nls.colors.en_us={"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.en_us");dijit.nls.loading.en_us={"loadingState":"Loading...","errorState":"Sorry, an error occurred"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.en_us");dijit.nls.common.en_us={"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.en_us");dijit.form.nls.validate.en_us={"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.en_us");dijit.form.nls.ComboBox.en_us={"previousMessage":"Previous choices","nextMessage":"More choices"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.en_us");dojo.cldr.nls.number.en_us={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;(¤#,##0.00)","plusSign":"+","decimalFormat-short":"000T","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_en-us",{"dijit/form/nls/validate":{"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."},"dijit/nls/loading":{"loadingState":"Loading...","errorState":"Sorry, an error occurred"},"dojo/nls/colors":{"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"transparent","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00;(¤#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Previous choices","nextMessage":"More choices"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_en-us.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_en-us.js.uncompressed.js
new file mode 100644
index 000000000..c951cbd36
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_en-us.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_en-us',{
+'dijit/form/nls/validate':{"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."}
+,
+'dijit/nls/loading':{"loadingState":"Loading...","errorState":"Sorry, an error occurred"}
+,
+'dojo/nls/colors':{"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"transparent","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00;(¤#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Previous choices","nextMessage":"More choices"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_en.js b/lib/dojo/nls/tt-rss-layer_en.js
deleted file mode 100644
index 2cb4b5732..000000000
--- a/lib/dojo/nls/tt-rss-layer_en.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dojo.nls.tt-rss-layer_en");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.en");dojo.nls.colors.en={"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.en");dijit.nls.loading.en={"loadingState":"Loading...","errorState":"Sorry, an error occurred"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.en");dijit.nls.common.en={"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.en");dijit.form.nls.validate.en={"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.en");dijit.form.nls.ComboBox.en={"previousMessage":"Previous choices","nextMessage":"More choices"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.en");dojo.cldr.nls.number.en={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;(¤#,##0.00)","plusSign":"+","decimalFormat-short":"000T","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_es-es.js b/lib/dojo/nls/tt-rss-layer_es-es.js
index 832d1fbba..df857f927 100644
--- a/lib/dojo/nls/tt-rss-layer_es-es.js
+++ b/lib/dojo/nls/tt-rss-layer_es-es.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_es-es");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.es_es");dojo.nls.colors.es_es={"lightsteelblue":"azul acero claro","orangered":"rojo anaranjado","midnightblue":"azul medianoche","cadetblue":"azul cadete","seashell":"blanco marfil","slategrey":"gris pizarra","coral":"coral","darkturquoise":"turquesa oscuro","antiquewhite":"blanco antiguo","mediumspringgreen":"verde primavera medio","salmon":"salmón","darkgrey":"gris oscuro","ivory":"marfil","greenyellow":"amarillo verdoso","mistyrose":"rosa difuminado","lightsalmon":"salmón claro","silver":"plateado","dimgrey":"gris marengo","orange":"naranja","white":"blanco","navajowhite":"blanco navajo","royalblue":"azul real","deeppink":"rosa fuerte","lime":"lima","oldlace":"encaje antiguo","chartreuse":"verde pálido 2","darkcyan":"cian oscuro","yellow":"amarillo","linen":"blanco arena","olive":"verde oliva","gold":"oro","lawngreen":"verde césped","lightyellow":"amarillo claro","tan":"canela","darkviolet":"violeta oscuro","lightslategrey":"gris pizarra claro","grey":"gris","darkkhaki":"caqui oscuro","green":"verde","deepskyblue":"azul cielo fuerte","aqua":"aguamarina","sienna":"siena","mintcream":"crema menta","rosybrown":"marrón rosáceo","mediumslateblue":"azul pizarra medio","magenta":"magenta","lightseagreen":"verde mar claro","cyan":"cian","olivedrab":"verde oliva pardusco","darkgoldenrod":"ocre oscuro","slateblue":"azul pizarra","mediumaquamarine":"aguamarina medio","lavender":"lavanda","mediumseagreen":"verde mar medio","maroon":"granate","darkslategray":"gris pizarra oscuro","mediumturquoise":"turquesa medio","ghostwhite":"blanco ligero","darkblue":"azul oscuro","mediumvioletred":"rojo violáceo medio","brown":"marrón","lightgray":"gris claro","sandybrown":"marrón arcilla","pink":"rosa","firebrick":"teja","indigo":"añil","snow":"nieve","darkorchid":"orquídea oscuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde fuerte","moccasin":"arena","navy":"azul marino","lemonchiffon":"amarillo pastel","teal":"verde azulado","floralwhite":"blanco manteca","cornflowerblue":"azul aciano","paleturquoise":"turquesa pálido","purple":"púrpura","gainsboro":"azul gainsboro","plum":"ciruela","red":"rojo","blue":"azul","forestgreen":"verde pino","darkgreen":"verde oscuro","honeydew":"flor de rocío","darkseagreen":"verde mar oscuro","lightcoral":"coral claro","palevioletred":"rojo violáceo pálido","mediumpurple":"púrpura medio","saddlebrown":"cuero","darkmagenta":"magenta oscuro","thistle":"cardo","whitesmoke":"blanco ahumado","wheat":"trigo","violet":"violeta","lightskyblue":"azul cielo claro","goldenrod":"ocre","mediumblue":"azul medio","skyblue":"azul cielo","crimson":"carmesí","darksalmon":"salmón oscuro","darkred":"rojo oscuro","darkslategrey":"gris pizarra oscuro","peru":"perú","lightgrey":"gris claro","lightgoldenrodyellow":"ocre claro","blanchedalmond":"almendra pálido","aliceblue":"blanco azulado","bisque":"miel","slategray":"gris pizarra","palegoldenrod":"ocre pálido","darkorange":"naranja oscuro","aquamarine":"aguamarina 2","lightgreen":"verde claro","burlywood":"madera","dodgerblue":"azul fuerte","darkgray":"gris oscuro","lightcyan":"cian claro","powderblue":"azul suave","blueviolet":"azul violáceo","orchid":"orquídea","dimgray":"gris marengo","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosácea","hotpink":"rosa oscuro","steelblue":"azul acero","tomato":"tomate","lightpink":"rosa claro","limegreen":"lima limón","indianred":"rojo teja","papayawhip":"papaya claro","lightslategray":"gris pizarra claro","gray":"gris","mediumorchid":"orquídea medio","cornsilk":"crudo","black":"negro","seagreen":"verde mar","darkslateblue":"azul pizarra oscuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"blanco cielo","peachpuff":"melocotón","darkolivegreen":"verde oliva oscuro","yellowgreen":"verde amarillento"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.es_es");dijit.nls.loading.es_es={"loadingState":"Cargando...","errorState":"Lo siento, se ha producido un error"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.es_es");dijit.nls.common.es_es={"buttonOk":"Aceptar","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Cerrar"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.es_es");dijit.form.nls.validate.es_es={"rangeMessage":"Este valor está fuera del intervalo.","invalidMessage":"El valor especificado no es válido.","missingMessage":"Este valor es necesario."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.es_es");dijit.form.nls.ComboBox.es_es={"previousMessage":"Opciones anteriores","nextMessage":"Más opciones"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.es_es");dojo.cldr.nls.number.es_es={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_es-es",{"dijit/form/nls/validate":{"rangeMessage":"Este valor está fuera del intervalo.","invalidMessage":"El valor especificado no es válido.","missingMessage":"Este valor es necesario."},"dijit/nls/loading":{"loadingState":"Cargando...","errorState":"Lo siento, se ha producido un error"},"dojo/nls/colors":{"lightsteelblue":"azul acero claro","orangered":"rojo anaranjado","midnightblue":"azul medianoche","cadetblue":"azul cadete","seashell":"blanco marfil","slategrey":"gris pizarra","coral":"coral","darkturquoise":"turquesa oscuro","antiquewhite":"blanco antiguo","mediumspringgreen":"verde primavera medio","transparent":"transparente","salmon":"salmón","darkgrey":"gris oscuro","ivory":"marfil","greenyellow":"amarillo verdoso","mistyrose":"rosa difuminado","lightsalmon":"salmón claro","silver":"plateado","dimgrey":"gris marengo","orange":"naranja","white":"blanco","navajowhite":"blanco navajo","royalblue":"azul real","deeppink":"rosa fuerte","lime":"lima","oldlace":"encaje antiguo","chartreuse":"verde pálido 2","darkcyan":"cian oscuro","yellow":"amarillo","linen":"blanco arena","olive":"verde oliva","gold":"oro","lawngreen":"verde césped","lightyellow":"amarillo claro","tan":"canela","darkviolet":"violeta oscuro","lightslategrey":"gris pizarra claro","grey":"gris","darkkhaki":"caqui oscuro","green":"verde","deepskyblue":"azul cielo fuerte","aqua":"aguamarina","sienna":"siena","mintcream":"crema menta","rosybrown":"marrón rosáceo","mediumslateblue":"azul pizarra medio","magenta":"magenta","lightseagreen":"verde mar claro","cyan":"cian","olivedrab":"verde oliva pardusco","darkgoldenrod":"ocre oscuro","slateblue":"azul pizarra","mediumaquamarine":"aguamarina medio","lavender":"lavanda","mediumseagreen":"verde mar medio","maroon":"granate","darkslategray":"gris pizarra oscuro","mediumturquoise":"turquesa medio","ghostwhite":"blanco ligero","darkblue":"azul oscuro","mediumvioletred":"rojo violáceo medio","brown":"marrón","lightgray":"gris claro","sandybrown":"marrón arcilla","pink":"rosa","firebrick":"teja","indigo":"añil","snow":"nieve","darkorchid":"orquídea oscuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde fuerte","moccasin":"arena","navy":"azul marino","lemonchiffon":"amarillo pastel","teal":"verde azulado","floralwhite":"blanco manteca","cornflowerblue":"azul aciano","paleturquoise":"turquesa pálido","purple":"púrpura","gainsboro":"azul gainsboro","plum":"ciruela","red":"rojo","blue":"azul","forestgreen":"verde pino","darkgreen":"verde oscuro","honeydew":"flor de rocío","darkseagreen":"verde mar oscuro","lightcoral":"coral claro","palevioletred":"rojo violáceo pálido","mediumpurple":"púrpura medio","saddlebrown":"cuero","darkmagenta":"magenta oscuro","thistle":"cardo","whitesmoke":"blanco ahumado","wheat":"trigo","violet":"violeta","lightskyblue":"azul cielo claro","goldenrod":"ocre","mediumblue":"azul medio","skyblue":"azul cielo","crimson":"carmesí","darksalmon":"salmón oscuro","darkred":"rojo oscuro","darkslategrey":"gris pizarra oscuro","peru":"perú","lightgrey":"gris claro","lightgoldenrodyellow":"ocre claro","blanchedalmond":"almendra pálido","aliceblue":"blanco azulado","bisque":"miel","slategray":"gris pizarra","palegoldenrod":"ocre pálido","darkorange":"naranja oscuro","aquamarine":"aguamarina 2","lightgreen":"verde claro","burlywood":"madera","dodgerblue":"azul fuerte","darkgray":"gris oscuro","lightcyan":"cian claro","powderblue":"azul suave","blueviolet":"azul violáceo","orchid":"orquídea","dimgray":"gris marengo","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosácea","hotpink":"rosa oscuro","steelblue":"azul acero","tomato":"tomate","lightpink":"rosa claro","limegreen":"lima limón","indianred":"rojo teja","papayawhip":"papaya claro","lightslategray":"gris pizarra claro","gray":"gris","mediumorchid":"orquídea medio","cornsilk":"crudo","black":"negro","seagreen":"verde mar","darkslateblue":"azul pizarra oscuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"blanco cielo","peachpuff":"melocotón","darkolivegreen":"verde oliva oscuro","yellowgreen":"verde amarillento"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Opciones anteriores","nextMessage":"Más opciones"},"dijit/nls/common":{"buttonOk":"Aceptar","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Cerrar"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_es-es.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_es-es.js.uncompressed.js
new file mode 100644
index 000000000..e81ac1c37
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_es-es.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_es-es',{
+'dijit/form/nls/validate':{"rangeMessage":"Este valor está fuera del intervalo.","invalidMessage":"El valor especificado no es válido.","missingMessage":"Este valor es necesario."}
+,
+'dijit/nls/loading':{"loadingState":"Cargando...","errorState":"Lo siento, se ha producido un error"}
+,
+'dojo/nls/colors':{"lightsteelblue":"azul acero claro","orangered":"rojo anaranjado","midnightblue":"azul medianoche","cadetblue":"azul cadete","seashell":"blanco marfil","slategrey":"gris pizarra","coral":"coral","darkturquoise":"turquesa oscuro","antiquewhite":"blanco antiguo","mediumspringgreen":"verde primavera medio","transparent":"transparente","salmon":"salmón","darkgrey":"gris oscuro","ivory":"marfil","greenyellow":"amarillo verdoso","mistyrose":"rosa difuminado","lightsalmon":"salmón claro","silver":"plateado","dimgrey":"gris marengo","orange":"naranja","white":"blanco","navajowhite":"blanco navajo","royalblue":"azul real","deeppink":"rosa fuerte","lime":"lima","oldlace":"encaje antiguo","chartreuse":"verde pálido 2","darkcyan":"cian oscuro","yellow":"amarillo","linen":"blanco arena","olive":"verde oliva","gold":"oro","lawngreen":"verde césped","lightyellow":"amarillo claro","tan":"canela","darkviolet":"violeta oscuro","lightslategrey":"gris pizarra claro","grey":"gris","darkkhaki":"caqui oscuro","green":"verde","deepskyblue":"azul cielo fuerte","aqua":"aguamarina","sienna":"siena","mintcream":"crema menta","rosybrown":"marrón rosáceo","mediumslateblue":"azul pizarra medio","magenta":"magenta","lightseagreen":"verde mar claro","cyan":"cian","olivedrab":"verde oliva pardusco","darkgoldenrod":"ocre oscuro","slateblue":"azul pizarra","mediumaquamarine":"aguamarina medio","lavender":"lavanda","mediumseagreen":"verde mar medio","maroon":"granate","darkslategray":"gris pizarra oscuro","mediumturquoise":"turquesa medio","ghostwhite":"blanco ligero","darkblue":"azul oscuro","mediumvioletred":"rojo violáceo medio","brown":"marrón","lightgray":"gris claro","sandybrown":"marrón arcilla","pink":"rosa","firebrick":"teja","indigo":"añil","snow":"nieve","darkorchid":"orquídea oscuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde fuerte","moccasin":"arena","navy":"azul marino","lemonchiffon":"amarillo pastel","teal":"verde azulado","floralwhite":"blanco manteca","cornflowerblue":"azul aciano","paleturquoise":"turquesa pálido","purple":"púrpura","gainsboro":"azul gainsboro","plum":"ciruela","red":"rojo","blue":"azul","forestgreen":"verde pino","darkgreen":"verde oscuro","honeydew":"flor de rocío","darkseagreen":"verde mar oscuro","lightcoral":"coral claro","palevioletred":"rojo violáceo pálido","mediumpurple":"púrpura medio","saddlebrown":"cuero","darkmagenta":"magenta oscuro","thistle":"cardo","whitesmoke":"blanco ahumado","wheat":"trigo","violet":"violeta","lightskyblue":"azul cielo claro","goldenrod":"ocre","mediumblue":"azul medio","skyblue":"azul cielo","crimson":"carmesí","darksalmon":"salmón oscuro","darkred":"rojo oscuro","darkslategrey":"gris pizarra oscuro","peru":"perú","lightgrey":"gris claro","lightgoldenrodyellow":"ocre claro","blanchedalmond":"almendra pálido","aliceblue":"blanco azulado","bisque":"miel","slategray":"gris pizarra","palegoldenrod":"ocre pálido","darkorange":"naranja oscuro","aquamarine":"aguamarina 2","lightgreen":"verde claro","burlywood":"madera","dodgerblue":"azul fuerte","darkgray":"gris oscuro","lightcyan":"cian claro","powderblue":"azul suave","blueviolet":"azul violáceo","orchid":"orquídea","dimgray":"gris marengo","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosácea","hotpink":"rosa oscuro","steelblue":"azul acero","tomato":"tomate","lightpink":"rosa claro","limegreen":"lima limón","indianred":"rojo teja","papayawhip":"papaya claro","lightslategray":"gris pizarra claro","gray":"gris","mediumorchid":"orquídea medio","cornsilk":"crudo","black":"negro","seagreen":"verde mar","darkslateblue":"azul pizarra oscuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"blanco cielo","peachpuff":"melocotón","darkolivegreen":"verde oliva oscuro","yellowgreen":"verde amarillento"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Opciones anteriores","nextMessage":"Más opciones"}
+,
+'dijit/nls/common':{"buttonOk":"Aceptar","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Cerrar"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_es.js b/lib/dojo/nls/tt-rss-layer_es.js
deleted file mode 100644
index daec5d53d..000000000
--- a/lib/dojo/nls/tt-rss-layer_es.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dojo.nls.tt-rss-layer_es");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.es");dojo.nls.colors.es={"lightsteelblue":"azul acero claro","orangered":"rojo anaranjado","midnightblue":"azul medianoche","cadetblue":"azul cadete","seashell":"blanco marfil","slategrey":"gris pizarra","coral":"coral","darkturquoise":"turquesa oscuro","antiquewhite":"blanco antiguo","mediumspringgreen":"verde primavera medio","salmon":"salmón","darkgrey":"gris oscuro","ivory":"marfil","greenyellow":"amarillo verdoso","mistyrose":"rosa difuminado","lightsalmon":"salmón claro","silver":"plateado","dimgrey":"gris marengo","orange":"naranja","white":"blanco","navajowhite":"blanco navajo","royalblue":"azul real","deeppink":"rosa fuerte","lime":"lima","oldlace":"encaje antiguo","chartreuse":"verde pálido 2","darkcyan":"cian oscuro","yellow":"amarillo","linen":"blanco arena","olive":"verde oliva","gold":"oro","lawngreen":"verde césped","lightyellow":"amarillo claro","tan":"canela","darkviolet":"violeta oscuro","lightslategrey":"gris pizarra claro","grey":"gris","darkkhaki":"caqui oscuro","green":"verde","deepskyblue":"azul cielo fuerte","aqua":"aguamarina","sienna":"siena","mintcream":"crema menta","rosybrown":"marrón rosáceo","mediumslateblue":"azul pizarra medio","magenta":"magenta","lightseagreen":"verde mar claro","cyan":"cian","olivedrab":"verde oliva pardusco","darkgoldenrod":"ocre oscuro","slateblue":"azul pizarra","mediumaquamarine":"aguamarina medio","lavender":"lavanda","mediumseagreen":"verde mar medio","maroon":"granate","darkslategray":"gris pizarra oscuro","mediumturquoise":"turquesa medio","ghostwhite":"blanco ligero","darkblue":"azul oscuro","mediumvioletred":"rojo violáceo medio","brown":"marrón","lightgray":"gris claro","sandybrown":"marrón arcilla","pink":"rosa","firebrick":"teja","indigo":"añil","snow":"nieve","darkorchid":"orquídea oscuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde fuerte","moccasin":"arena","navy":"azul marino","lemonchiffon":"amarillo pastel","teal":"verde azulado","floralwhite":"blanco manteca","cornflowerblue":"azul aciano","paleturquoise":"turquesa pálido","purple":"púrpura","gainsboro":"azul gainsboro","plum":"ciruela","red":"rojo","blue":"azul","forestgreen":"verde pino","darkgreen":"verde oscuro","honeydew":"flor de rocío","darkseagreen":"verde mar oscuro","lightcoral":"coral claro","palevioletred":"rojo violáceo pálido","mediumpurple":"púrpura medio","saddlebrown":"cuero","darkmagenta":"magenta oscuro","thistle":"cardo","whitesmoke":"blanco ahumado","wheat":"trigo","violet":"violeta","lightskyblue":"azul cielo claro","goldenrod":"ocre","mediumblue":"azul medio","skyblue":"azul cielo","crimson":"carmesí","darksalmon":"salmón oscuro","darkred":"rojo oscuro","darkslategrey":"gris pizarra oscuro","peru":"perú","lightgrey":"gris claro","lightgoldenrodyellow":"ocre claro","blanchedalmond":"almendra pálido","aliceblue":"blanco azulado","bisque":"miel","slategray":"gris pizarra","palegoldenrod":"ocre pálido","darkorange":"naranja oscuro","aquamarine":"aguamarina 2","lightgreen":"verde claro","burlywood":"madera","dodgerblue":"azul fuerte","darkgray":"gris oscuro","lightcyan":"cian claro","powderblue":"azul suave","blueviolet":"azul violáceo","orchid":"orquídea","dimgray":"gris marengo","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosácea","hotpink":"rosa oscuro","steelblue":"azul acero","tomato":"tomate","lightpink":"rosa claro","limegreen":"lima limón","indianred":"rojo teja","papayawhip":"papaya claro","lightslategray":"gris pizarra claro","gray":"gris","mediumorchid":"orquídea medio","cornsilk":"crudo","black":"negro","seagreen":"verde mar","darkslateblue":"azul pizarra oscuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"blanco cielo","peachpuff":"melocotón","darkolivegreen":"verde oliva oscuro","yellowgreen":"verde amarillento"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.es");dijit.nls.loading.es={"loadingState":"Cargando...","errorState":"Lo siento, se ha producido un error"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.es");dijit.nls.common.es={"buttonOk":"Aceptar","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Cerrar"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.es");dijit.form.nls.validate.es={"rangeMessage":"Este valor está fuera del intervalo.","invalidMessage":"El valor especificado no es válido.","missingMessage":"Este valor es necesario."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.es");dijit.form.nls.ComboBox.es={"previousMessage":"Opciones anteriores","nextMessage":"Más opciones"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.es");dojo.cldr.nls.number.es={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_fi-fi.js b/lib/dojo/nls/tt-rss-layer_fi-fi.js
index 29f0b1a40..c84831892 100644
--- a/lib/dojo/nls/tt-rss-layer_fi-fi.js
+++ b/lib/dojo/nls/tt-rss-layer_fi-fi.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_fi-fi");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.fi_fi");dojo.nls.colors.fi_fi={"lightsteelblue":"vaalea teräksensininen","orangered":"oranssinpunainen","midnightblue":"yönsininen","cadetblue":"meren vihreä","seashell":"simpukankuori","slategrey":"savenharmaa","coral":"koralli","darkturquoise":"tumma turkoosi","antiquewhite":"antiikinvalkoinen","mediumspringgreen":"keskivaalea keväänvihreä","salmon":"lohenpunainen","darkgrey":"tummanharmaa","ivory":"norsunluu","greenyellow":"vihreänkeltainen","mistyrose":"utuinen ruusu","lightsalmon":"vaalea lohenpunainen","silver":"hopea","dimgrey":"himmeänharmaa","orange":"oranssi","white":"valkoinen","navajowhite":"navajonvalkoinen","royalblue":"syvänsininen","deeppink":"syvä vaaleanpunainen","lime":"vaaleanvihreä","oldlace":"vanha pitsi","chartreuse":"kellanvihreä","darkcyan":"tumma turkoosi","yellow":"keltainen","linen":"pellavanvaalea","olive":"oliivinvihreä","gold":"kulta","lawngreen":"ruohonvihreä","lightyellow":"vaaleankeltainen","tan":"kellanruskea","darkviolet":"tummanvioletti","lightslategrey":"vaaleanharmaa","grey":"harmaa","darkkhaki":"tumma khaki","green":"vihreä","deepskyblue":"tumma taivaansininen","aqua":"sinivihreä","sienna":"siena","mintcream":"minttukreemi","rosybrown":"punertavanruskea","mediumslateblue":"keskivaalea siniharmaa","magenta":"magenta","lightseagreen":"vaalea merenvihreä","cyan":"syaani","olivedrab":"oliivinruskea","darkgoldenrod":"tumma kultapiisku","slateblue":"savensininen","mediumaquamarine":"keskivaalea vedenvihreä","lavender":"laventeli","mediumseagreen":"keskivaalea merenvihreä","maroon":"kastanjanruskea","darkslategray":"tummanharmaa","mediumturquoise":"keskivaalea turkoosi","ghostwhite":"lakananvalkoinen","darkblue":"tummansininen","mediumvioletred":"keskivaalea lila","brown":"ruskea","lightgray":"vaaleanharmaa","sandybrown":"hiekanruskea","pink":"vaaleanpunainen","firebrick":"poltetun tiilen punainen","indigo":"indigo","snow":"lumivalkoinen","darkorchid":"tumma orkidea","turquoise":"turkoosi","chocolate":"suklaanruskea","springgreen":"keväänvihreä","moccasin":"nahanruskea","navy":"laivastonsininen","lemonchiffon":"sitruunankeltainen","teal":"sinivihreä","floralwhite":"kukanvalkoinen","cornflowerblue":"syvänsininen","paleturquoise":"haalea turkoosi","purple":"violetti","gainsboro":"gainsboro","plum":"luumunpunainen","red":"punainen","blue":"sininen","forestgreen":"metsänvihreä","darkgreen":"tummanvihreä","honeydew":"hunajameloninvihreä","darkseagreen":"tumma merenvihreä","lightcoral":"vaalea koralli","palevioletred":"haalea lila","mediumpurple":"keskivaalea violetti","saddlebrown":"satulanruskea","darkmagenta":"tumma magenta","thistle":"ohdake","whitesmoke":"savunvalkea","wheat":"vehnänkeltainen","violet":"violetti","lightskyblue":"vaalea taivaansininen","goldenrod":"kullanruskea","mediumblue":"keskisininen","skyblue":"taivaansininen","crimson":"karmiininpunainen","darksalmon":"tumma lohenpunainen","darkred":"tummanpunainen","darkslategrey":"tummanharmaa","peru":"peru","lightgrey":"vaaleanharmaa","lightgoldenrodyellow":"vaalea kultapiiskunkeltainen","blanchedalmond":"kuorittu manteli","aliceblue":"vaaleanharmaansininen","bisque":"vaaleanruskea","slategray":"savenharmaa","palegoldenrod":"haalea kultapiisku","darkorange":"tummanoranssi","aquamarine":"vedenvihreä","lightgreen":"vaaleanvihreä","burlywood":"puunruskea","dodgerblue":"Dodger-sininen","darkgray":"tummanharmaa","lightcyan":"vaalea syaani","powderblue":"harmaansininen","blueviolet":"sinivioletti","orchid":"orkidea","dimgray":"himmeänharmaa","beige":"vaaleanruskea","fuchsia":"purppura","lavenderblush":"laventelinpunainen","hotpink":"pinkki","steelblue":"teräksensininen","tomato":"tomaatinpunainen","lightpink":"vaaleanpunainen","limegreen":"limetinvihreä","indianred":"kirkkaanpunainen","papayawhip":"papaijavaahto","lightslategray":"vaaleanharmaa","gray":"harmaa","mediumorchid":"keskivaalea orkidea","cornsilk":"maissinkeltainen","black":"musta","seagreen":"merenvihreä","darkslateblue":"tumma siniharmaa","khaki":"khaki","lightblue":"vaaleansininen","palegreen":"haalea vihreä","azure":"taivaansininen","peachpuff":"persikka","darkolivegreen":"tummanoliivinvihreä","yellowgreen":"kellanvihreä"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.fi_fi");dijit.nls.loading.fi_fi={"loadingState":"Lataus on meneillään...","errorState":"On ilmennyt virhe."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.fi_fi");dijit.nls.common.fi_fi={"buttonOk":"OK","buttonCancel":"Peruuta","buttonSave":"Tallenna","itemClose":"Sulje"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.fi_fi");dijit.form.nls.validate.fi_fi={"rangeMessage":"Tämä arvo on sallitun alueen ulkopuolella.","invalidMessage":"Annettu arvo ei kelpaa.","missingMessage":"Tämä arvo on pakollinen."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.fi_fi");dijit.form.nls.ComboBox.fi_fi={"previousMessage":"Edelliset valinnat","nextMessage":"Lisää valintoja"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.fi_fi");dojo.cldr.nls.number.fi_fi={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"epäluku","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_fi-fi",{"dijit/form/nls/validate":{"rangeMessage":"Tämä arvo on sallitun alueen ulkopuolella.","invalidMessage":"Annettu arvo ei kelpaa.","missingMessage":"Tämä arvo on pakollinen."},"dijit/nls/loading":{"loadingState":"Lataus on meneillään...","errorState":"On ilmennyt virhe."},"dojo/nls/colors":{"lightsteelblue":"vaalea teräksensininen","orangered":"oranssinpunainen","midnightblue":"yönsininen","cadetblue":"meren vihreä","seashell":"simpukankuori","slategrey":"savenharmaa","coral":"koralli","darkturquoise":"tumma turkoosi","antiquewhite":"antiikinvalkoinen","mediumspringgreen":"keskivaalea keväänvihreä","transparent":"läpinäkyvä","salmon":"lohenpunainen","darkgrey":"tummanharmaa","ivory":"norsunluu","greenyellow":"vihreänkeltainen","mistyrose":"utuinen ruusu","lightsalmon":"vaalea lohenpunainen","silver":"hopea","dimgrey":"himmeänharmaa","orange":"oranssi","white":"valkoinen","navajowhite":"navajonvalkoinen","royalblue":"syvänsininen","deeppink":"syvä vaaleanpunainen","lime":"vaaleanvihreä","oldlace":"vanha pitsi","chartreuse":"kellanvihreä","darkcyan":"tumma turkoosi","yellow":"keltainen","linen":"pellavanvaalea","olive":"oliivinvihreä","gold":"kulta","lawngreen":"ruohonvihreä","lightyellow":"vaaleankeltainen","tan":"kellanruskea","darkviolet":"tummanvioletti","lightslategrey":"vaaleanharmaa","grey":"harmaa","darkkhaki":"tumma khaki","green":"vihreä","deepskyblue":"tumma taivaansininen","aqua":"sinivihreä","sienna":"siena","mintcream":"minttukreemi","rosybrown":"punertavanruskea","mediumslateblue":"keskivaalea siniharmaa","magenta":"magenta","lightseagreen":"vaalea merenvihreä","cyan":"syaani","olivedrab":"oliivinruskea","darkgoldenrod":"tumma kultapiisku","slateblue":"savensininen","mediumaquamarine":"keskivaalea vedenvihreä","lavender":"laventeli","mediumseagreen":"keskivaalea merenvihreä","maroon":"kastanjanruskea","darkslategray":"tummanharmaa","mediumturquoise":"keskivaalea turkoosi","ghostwhite":"lakananvalkoinen","darkblue":"tummansininen","mediumvioletred":"keskivaalea lila","brown":"ruskea","lightgray":"vaaleanharmaa","sandybrown":"hiekanruskea","pink":"vaaleanpunainen","firebrick":"poltetun tiilen punainen","indigo":"indigo","snow":"lumivalkoinen","darkorchid":"tumma orkidea","turquoise":"turkoosi","chocolate":"suklaanruskea","springgreen":"keväänvihreä","moccasin":"nahanruskea","navy":"laivastonsininen","lemonchiffon":"sitruunankeltainen","teal":"sinivihreä","floralwhite":"kukanvalkoinen","cornflowerblue":"syvänsininen","paleturquoise":"haalea turkoosi","purple":"violetti","gainsboro":"gainsboro","plum":"luumunpunainen","red":"punainen","blue":"sininen","forestgreen":"metsänvihreä","darkgreen":"tummanvihreä","honeydew":"hunajameloninvihreä","darkseagreen":"tumma merenvihreä","lightcoral":"vaalea koralli","palevioletred":"haalea lila","mediumpurple":"keskivaalea violetti","saddlebrown":"satulanruskea","darkmagenta":"tumma magenta","thistle":"ohdake","whitesmoke":"savunvalkea","wheat":"vehnänkeltainen","violet":"violetti","lightskyblue":"vaalea taivaansininen","goldenrod":"kullanruskea","mediumblue":"keskisininen","skyblue":"taivaansininen","crimson":"karmiininpunainen","darksalmon":"tumma lohenpunainen","darkred":"tummanpunainen","darkslategrey":"tummanharmaa","peru":"peru","lightgrey":"vaaleanharmaa","lightgoldenrodyellow":"vaalea kultapiiskunkeltainen","blanchedalmond":"kuorittu manteli","aliceblue":"vaaleanharmaansininen","bisque":"vaaleanruskea","slategray":"savenharmaa","palegoldenrod":"haalea kultapiisku","darkorange":"tummanoranssi","aquamarine":"vedenvihreä","lightgreen":"vaaleanvihreä","burlywood":"puunruskea","dodgerblue":"Dodger-sininen","darkgray":"tummanharmaa","lightcyan":"vaalea syaani","powderblue":"harmaansininen","blueviolet":"sinivioletti","orchid":"orkidea","dimgray":"himmeänharmaa","beige":"vaaleanruskea","fuchsia":"purppura","lavenderblush":"laventelinpunainen","hotpink":"pinkki","steelblue":"teräksensininen","tomato":"tomaatinpunainen","lightpink":"vaaleanpunainen","limegreen":"limetinvihreä","indianred":"kirkkaanpunainen","papayawhip":"papaijavaahto","lightslategray":"vaaleanharmaa","gray":"harmaa","mediumorchid":"keskivaalea orkidea","cornsilk":"maissinkeltainen","black":"musta","seagreen":"merenvihreä","darkslateblue":"tumma siniharmaa","khaki":"khaki","lightblue":"vaaleansininen","palegreen":"haalea vihreä","azure":"taivaansininen","peachpuff":"persikka","darkolivegreen":"tummanoliivinvihreä","yellowgreen":"kellanvihreä"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"epäluku","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Edelliset valinnat","nextMessage":"Lisää valintoja"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Peruuta","buttonSave":"Tallenna","itemClose":"Sulje"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_fi-fi.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_fi-fi.js.uncompressed.js
new file mode 100644
index 000000000..0426c20e7
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_fi-fi.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_fi-fi',{
+'dijit/form/nls/validate':{"rangeMessage":"Tämä arvo on sallitun alueen ulkopuolella.","invalidMessage":"Annettu arvo ei kelpaa.","missingMessage":"Tämä arvo on pakollinen."}
+,
+'dijit/nls/loading':{"loadingState":"Lataus on meneillään...","errorState":"On ilmennyt virhe."}
+,
+'dojo/nls/colors':{"lightsteelblue":"vaalea teräksensininen","orangered":"oranssinpunainen","midnightblue":"yönsininen","cadetblue":"meren vihreä","seashell":"simpukankuori","slategrey":"savenharmaa","coral":"koralli","darkturquoise":"tumma turkoosi","antiquewhite":"antiikinvalkoinen","mediumspringgreen":"keskivaalea keväänvihreä","transparent":"läpinäkyvä","salmon":"lohenpunainen","darkgrey":"tummanharmaa","ivory":"norsunluu","greenyellow":"vihreänkeltainen","mistyrose":"utuinen ruusu","lightsalmon":"vaalea lohenpunainen","silver":"hopea","dimgrey":"himmeänharmaa","orange":"oranssi","white":"valkoinen","navajowhite":"navajonvalkoinen","royalblue":"syvänsininen","deeppink":"syvä vaaleanpunainen","lime":"vaaleanvihreä","oldlace":"vanha pitsi","chartreuse":"kellanvihreä","darkcyan":"tumma turkoosi","yellow":"keltainen","linen":"pellavanvaalea","olive":"oliivinvihreä","gold":"kulta","lawngreen":"ruohonvihreä","lightyellow":"vaaleankeltainen","tan":"kellanruskea","darkviolet":"tummanvioletti","lightslategrey":"vaaleanharmaa","grey":"harmaa","darkkhaki":"tumma khaki","green":"vihreä","deepskyblue":"tumma taivaansininen","aqua":"sinivihreä","sienna":"siena","mintcream":"minttukreemi","rosybrown":"punertavanruskea","mediumslateblue":"keskivaalea siniharmaa","magenta":"magenta","lightseagreen":"vaalea merenvihreä","cyan":"syaani","olivedrab":"oliivinruskea","darkgoldenrod":"tumma kultapiisku","slateblue":"savensininen","mediumaquamarine":"keskivaalea vedenvihreä","lavender":"laventeli","mediumseagreen":"keskivaalea merenvihreä","maroon":"kastanjanruskea","darkslategray":"tummanharmaa","mediumturquoise":"keskivaalea turkoosi","ghostwhite":"lakananvalkoinen","darkblue":"tummansininen","mediumvioletred":"keskivaalea lila","brown":"ruskea","lightgray":"vaaleanharmaa","sandybrown":"hiekanruskea","pink":"vaaleanpunainen","firebrick":"poltetun tiilen punainen","indigo":"indigo","snow":"lumivalkoinen","darkorchid":"tumma orkidea","turquoise":"turkoosi","chocolate":"suklaanruskea","springgreen":"keväänvihreä","moccasin":"nahanruskea","navy":"laivastonsininen","lemonchiffon":"sitruunankeltainen","teal":"sinivihreä","floralwhite":"kukanvalkoinen","cornflowerblue":"syvänsininen","paleturquoise":"haalea turkoosi","purple":"violetti","gainsboro":"gainsboro","plum":"luumunpunainen","red":"punainen","blue":"sininen","forestgreen":"metsänvihreä","darkgreen":"tummanvihreä","honeydew":"hunajameloninvihreä","darkseagreen":"tumma merenvihreä","lightcoral":"vaalea koralli","palevioletred":"haalea lila","mediumpurple":"keskivaalea violetti","saddlebrown":"satulanruskea","darkmagenta":"tumma magenta","thistle":"ohdake","whitesmoke":"savunvalkea","wheat":"vehnänkeltainen","violet":"violetti","lightskyblue":"vaalea taivaansininen","goldenrod":"kullanruskea","mediumblue":"keskisininen","skyblue":"taivaansininen","crimson":"karmiininpunainen","darksalmon":"tumma lohenpunainen","darkred":"tummanpunainen","darkslategrey":"tummanharmaa","peru":"peru","lightgrey":"vaaleanharmaa","lightgoldenrodyellow":"vaalea kultapiiskunkeltainen","blanchedalmond":"kuorittu manteli","aliceblue":"vaaleanharmaansininen","bisque":"vaaleanruskea","slategray":"savenharmaa","palegoldenrod":"haalea kultapiisku","darkorange":"tummanoranssi","aquamarine":"vedenvihreä","lightgreen":"vaaleanvihreä","burlywood":"puunruskea","dodgerblue":"Dodger-sininen","darkgray":"tummanharmaa","lightcyan":"vaalea syaani","powderblue":"harmaansininen","blueviolet":"sinivioletti","orchid":"orkidea","dimgray":"himmeänharmaa","beige":"vaaleanruskea","fuchsia":"purppura","lavenderblush":"laventelinpunainen","hotpink":"pinkki","steelblue":"teräksensininen","tomato":"tomaatinpunainen","lightpink":"vaaleanpunainen","limegreen":"limetinvihreä","indianred":"kirkkaanpunainen","papayawhip":"papaijavaahto","lightslategray":"vaaleanharmaa","gray":"harmaa","mediumorchid":"keskivaalea orkidea","cornsilk":"maissinkeltainen","black":"musta","seagreen":"merenvihreä","darkslateblue":"tumma siniharmaa","khaki":"khaki","lightblue":"vaaleansininen","palegreen":"haalea vihreä","azure":"taivaansininen","peachpuff":"persikka","darkolivegreen":"tummanoliivinvihreä","yellowgreen":"kellanvihreä"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"epäluku","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Edelliset valinnat","nextMessage":"Lisää valintoja"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Peruuta","buttonSave":"Tallenna","itemClose":"Sulje"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_fi.js b/lib/dojo/nls/tt-rss-layer_fi.js
deleted file mode 100644
index 86fc0bcb7..000000000
--- a/lib/dojo/nls/tt-rss-layer_fi.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dojo.nls.tt-rss-layer_fi");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.fi");dojo.nls.colors.fi={"lightsteelblue":"vaalea teräksensininen","orangered":"oranssinpunainen","midnightblue":"yönsininen","cadetblue":"meren vihreä","seashell":"simpukankuori","slategrey":"savenharmaa","coral":"koralli","darkturquoise":"tumma turkoosi","antiquewhite":"antiikinvalkoinen","mediumspringgreen":"keskivaalea keväänvihreä","salmon":"lohenpunainen","darkgrey":"tummanharmaa","ivory":"norsunluu","greenyellow":"vihreänkeltainen","mistyrose":"utuinen ruusu","lightsalmon":"vaalea lohenpunainen","silver":"hopea","dimgrey":"himmeänharmaa","orange":"oranssi","white":"valkoinen","navajowhite":"navajonvalkoinen","royalblue":"syvänsininen","deeppink":"syvä vaaleanpunainen","lime":"vaaleanvihreä","oldlace":"vanha pitsi","chartreuse":"kellanvihreä","darkcyan":"tumma turkoosi","yellow":"keltainen","linen":"pellavanvaalea","olive":"oliivinvihreä","gold":"kulta","lawngreen":"ruohonvihreä","lightyellow":"vaaleankeltainen","tan":"kellanruskea","darkviolet":"tummanvioletti","lightslategrey":"vaaleanharmaa","grey":"harmaa","darkkhaki":"tumma khaki","green":"vihreä","deepskyblue":"tumma taivaansininen","aqua":"sinivihreä","sienna":"siena","mintcream":"minttukreemi","rosybrown":"punertavanruskea","mediumslateblue":"keskivaalea siniharmaa","magenta":"magenta","lightseagreen":"vaalea merenvihreä","cyan":"syaani","olivedrab":"oliivinruskea","darkgoldenrod":"tumma kultapiisku","slateblue":"savensininen","mediumaquamarine":"keskivaalea vedenvihreä","lavender":"laventeli","mediumseagreen":"keskivaalea merenvihreä","maroon":"kastanjanruskea","darkslategray":"tummanharmaa","mediumturquoise":"keskivaalea turkoosi","ghostwhite":"lakananvalkoinen","darkblue":"tummansininen","mediumvioletred":"keskivaalea lila","brown":"ruskea","lightgray":"vaaleanharmaa","sandybrown":"hiekanruskea","pink":"vaaleanpunainen","firebrick":"poltetun tiilen punainen","indigo":"indigo","snow":"lumivalkoinen","darkorchid":"tumma orkidea","turquoise":"turkoosi","chocolate":"suklaanruskea","springgreen":"keväänvihreä","moccasin":"nahanruskea","navy":"laivastonsininen","lemonchiffon":"sitruunankeltainen","teal":"sinivihreä","floralwhite":"kukanvalkoinen","cornflowerblue":"syvänsininen","paleturquoise":"haalea turkoosi","purple":"violetti","gainsboro":"gainsboro","plum":"luumunpunainen","red":"punainen","blue":"sininen","forestgreen":"metsänvihreä","darkgreen":"tummanvihreä","honeydew":"hunajameloninvihreä","darkseagreen":"tumma merenvihreä","lightcoral":"vaalea koralli","palevioletred":"haalea lila","mediumpurple":"keskivaalea violetti","saddlebrown":"satulanruskea","darkmagenta":"tumma magenta","thistle":"ohdake","whitesmoke":"savunvalkea","wheat":"vehnänkeltainen","violet":"violetti","lightskyblue":"vaalea taivaansininen","goldenrod":"kullanruskea","mediumblue":"keskisininen","skyblue":"taivaansininen","crimson":"karmiininpunainen","darksalmon":"tumma lohenpunainen","darkred":"tummanpunainen","darkslategrey":"tummanharmaa","peru":"peru","lightgrey":"vaaleanharmaa","lightgoldenrodyellow":"vaalea kultapiiskunkeltainen","blanchedalmond":"kuorittu manteli","aliceblue":"vaaleanharmaansininen","bisque":"vaaleanruskea","slategray":"savenharmaa","palegoldenrod":"haalea kultapiisku","darkorange":"tummanoranssi","aquamarine":"vedenvihreä","lightgreen":"vaaleanvihreä","burlywood":"puunruskea","dodgerblue":"Dodger-sininen","darkgray":"tummanharmaa","lightcyan":"vaalea syaani","powderblue":"harmaansininen","blueviolet":"sinivioletti","orchid":"orkidea","dimgray":"himmeänharmaa","beige":"vaaleanruskea","fuchsia":"purppura","lavenderblush":"laventelinpunainen","hotpink":"pinkki","steelblue":"teräksensininen","tomato":"tomaatinpunainen","lightpink":"vaaleanpunainen","limegreen":"limetinvihreä","indianred":"kirkkaanpunainen","papayawhip":"papaijavaahto","lightslategray":"vaaleanharmaa","gray":"harmaa","mediumorchid":"keskivaalea orkidea","cornsilk":"maissinkeltainen","black":"musta","seagreen":"merenvihreä","darkslateblue":"tumma siniharmaa","khaki":"khaki","lightblue":"vaaleansininen","palegreen":"haalea vihreä","azure":"taivaansininen","peachpuff":"persikka","darkolivegreen":"tummanoliivinvihreä","yellowgreen":"kellanvihreä"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.fi");dijit.nls.loading.fi={"loadingState":"Lataus on meneillään...","errorState":"On ilmennyt virhe."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.fi");dijit.nls.common.fi={"buttonOk":"OK","buttonCancel":"Peruuta","buttonSave":"Tallenna","itemClose":"Sulje"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.fi");dijit.form.nls.validate.fi={"rangeMessage":"Tämä arvo on sallitun alueen ulkopuolella.","invalidMessage":"Annettu arvo ei kelpaa.","missingMessage":"Tämä arvo on pakollinen."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.fi");dijit.form.nls.ComboBox.fi={"previousMessage":"Edelliset valinnat","nextMessage":"Lisää valintoja"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.fi");dojo.cldr.nls.number.fi={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"epäluku","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_fr-fr.js b/lib/dojo/nls/tt-rss-layer_fr-fr.js
index 1fba0709c..44815b56d 100644
--- a/lib/dojo/nls/tt-rss-layer_fr-fr.js
+++ b/lib/dojo/nls/tt-rss-layer_fr-fr.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_fr-fr");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.fr_fr");dojo.nls.colors.fr_fr={"lightsteelblue":"bleu acier clair","orangered":"rouge orangé","midnightblue":"bleu nuit","cadetblue":"bleu pétrole","seashell":"coquillage","slategrey":"gris ardoise","coral":"corail","darkturquoise":"turquoise foncé","antiquewhite":"blanc antique","mediumspringgreen":"vert printemps moyen","salmon":"saumon","darkgrey":"gris foncé","ivory":"ivoire","greenyellow":"vert-jaune","mistyrose":"rose pâle","lightsalmon":"saumon clair","silver":"argent","dimgrey":"gris soutenu","orange":"orange","white":"blanc","navajowhite":"chair","royalblue":"bleu roi","deeppink":"rose soutenu","lime":"vert citron","oldlace":"blanc cassé","chartreuse":"vert vif","darkcyan":"cyan foncé","yellow":"jaune","linen":"écru","olive":"olive","gold":"or","lawngreen":"vert prairie","lightyellow":"jaune clair","tan":"grège","darkviolet":"violet foncé","lightslategrey":"gris ardoise clair","grey":"gris","darkkhaki":"kaki foncé","green":"vert","deepskyblue":"bleu ciel soutenu","aqua":"bleu-vert","sienna":"terre de sienne","mintcream":"crème de menthe","rosybrown":"vieux rose","mediumslateblue":"bleu ardoise moyen","magenta":"magenta","lightseagreen":"vert d'eau clair","cyan":"cyan","olivedrab":"brun verdâtre","darkgoldenrod":"jaune paille foncé","slateblue":"bleu ardoise","mediumaquamarine":"aigue-marine moyen","lavender":"lavande","mediumseagreen":"vert d'eau moyen","maroon":"marron","darkslategray":"gris ardoise foncé","mediumturquoise":"turquoise moyen","ghostwhite":"blanc laiteux","darkblue":"bleu foncé","mediumvioletred":"rouge violacé moyen","brown":"brun","lightgray":"gris clair","sandybrown":"sable","pink":"rose","firebrick":"rouge brique","indigo":"indigo","snow":"neige","darkorchid":"lilas foncé","turquoise":"turquoise","chocolate":"chocolat","springgreen":"vert printemps","moccasin":"chamois","navy":"bleu marine","lemonchiffon":"mousse de citron","teal":"sarcelle","floralwhite":"lys","cornflowerblue":"bleuet","paleturquoise":"turquoise pâle","purple":"pourpre","gainsboro":"gris souris","plum":"prune","red":"rouge","blue":"bleu","forestgreen":"vert sapin","darkgreen":"vert foncé","honeydew":"opalin","darkseagreen":"vert d'eau foncé","lightcoral":"corail clair","palevioletred":"rouge violacé pâle","mediumpurple":"pourpre moyen","saddlebrown":"brun cuir","darkmagenta":"magenta foncé","thistle":"chardon","whitesmoke":"blanc cendré","wheat":"blé","violet":"violet","lightskyblue":"bleu ciel clair","goldenrod":"jaune paille","mediumblue":"bleu moyen","skyblue":"bleu ciel","crimson":"cramoisi","darksalmon":"saumon foncé","darkred":"rouge foncé","darkslategrey":"gris ardoise foncé","peru":"caramel","lightgrey":"gris clair","lightgoldenrodyellow":"jaune paille clair","blanchedalmond":"coquille d'oeuf","aliceblue":"bleu gris","bisque":"beige rosé","slategray":"gris ardoise","palegoldenrod":"jaune paille pâle","darkorange":"orange foncé","aquamarine":"aigue-marine","lightgreen":"vert clair","burlywood":"bois précieux","dodgerblue":"bleu France","darkgray":"gris foncé","lightcyan":"cyan clair","powderblue":"bleu de smalt","blueviolet":"bleu-violet","orchid":"lilas","dimgray":"gris soutenu","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavandin","hotpink":"rose intense","steelblue":"bleu acier","tomato":"tomate","lightpink":"rose clair","limegreen":"citron vert","indianred":"rose indien","papayawhip":"crème de papaye","lightslategray":"gris ardoise clair","gray":"gris","mediumorchid":"lilas moyen","cornsilk":"vanille","black":"noir","seagreen":"vert d'eau","darkslateblue":"bleu ardoise foncé","khaki":"kaki","lightblue":"bleu clair","palegreen":"vert pâle","azure":"bleu azur","peachpuff":"pêche","darkolivegreen":"olive foncé","yellowgreen":"vert jaunâtre"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.fr_fr");dijit.nls.loading.fr_fr={"loadingState":"Chargement...","errorState":"Une erreur est survenue"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.fr_fr");dijit.nls.common.fr_fr={"buttonOk":"OK","buttonCancel":"Annuler","buttonSave":"Sauvegarder","itemClose":"Fermer"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.fr_fr");dijit.form.nls.validate.fr_fr={"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."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.fr_fr");dijit.form.nls.ComboBox.fr_fr={"previousMessage":"Choix précédents","nextMessage":"Plus de choix"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.fr_fr");dojo.cldr.nls.number.fr_fr={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_fr-fr",{"dijit/form/nls/validate":{"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."},"dijit/nls/loading":{"loadingState":"Chargement...","errorState":"Une erreur est survenue"},"dojo/nls/colors":{"lightsteelblue":"bleu acier clair","orangered":"rouge orangé","midnightblue":"bleu nuit","cadetblue":"bleu pétrole","seashell":"coquillage","slategrey":"gris ardoise","coral":"corail","darkturquoise":"turquoise foncé","antiquewhite":"blanc antique","mediumspringgreen":"vert printemps moyen","transparent":"transparent","salmon":"saumon","darkgrey":"gris foncé","ivory":"ivoire","greenyellow":"vert-jaune","mistyrose":"rose pâle","lightsalmon":"saumon clair","silver":"argent","dimgrey":"gris soutenu","orange":"orange","white":"blanc","navajowhite":"chair","royalblue":"bleu roi","deeppink":"rose soutenu","lime":"vert citron","oldlace":"blanc cassé","chartreuse":"vert vif","darkcyan":"cyan foncé","yellow":"jaune","linen":"écru","olive":"olive","gold":"or","lawngreen":"vert prairie","lightyellow":"jaune clair","tan":"grège","darkviolet":"violet foncé","lightslategrey":"gris ardoise clair","grey":"gris","darkkhaki":"kaki foncé","green":"vert","deepskyblue":"bleu ciel soutenu","aqua":"bleu-vert","sienna":"terre de sienne","mintcream":"crème de menthe","rosybrown":"vieux rose","mediumslateblue":"bleu ardoise moyen","magenta":"magenta","lightseagreen":"vert d'eau clair","cyan":"cyan","olivedrab":"brun verdâtre","darkgoldenrod":"jaune paille foncé","slateblue":"bleu ardoise","mediumaquamarine":"aigue-marine moyen","lavender":"lavande","mediumseagreen":"vert d'eau moyen","maroon":"marron","darkslategray":"gris ardoise foncé","mediumturquoise":"turquoise moyen","ghostwhite":"blanc laiteux","darkblue":"bleu foncé","mediumvioletred":"rouge violacé moyen","brown":"brun","lightgray":"gris clair","sandybrown":"sable","pink":"rose","firebrick":"rouge brique","indigo":"indigo","snow":"neige","darkorchid":"lilas foncé","turquoise":"turquoise","chocolate":"chocolat","springgreen":"vert printemps","moccasin":"chamois","navy":"bleu marine","lemonchiffon":"mousse de citron","teal":"sarcelle","floralwhite":"lys","cornflowerblue":"bleuet","paleturquoise":"turquoise pâle","purple":"pourpre","gainsboro":"gris souris","plum":"prune","red":"rouge","blue":"bleu","forestgreen":"vert sapin","darkgreen":"vert foncé","honeydew":"opalin","darkseagreen":"vert d'eau foncé","lightcoral":"corail clair","palevioletred":"rouge violacé pâle","mediumpurple":"pourpre moyen","saddlebrown":"brun cuir","darkmagenta":"magenta foncé","thistle":"chardon","whitesmoke":"blanc cendré","wheat":"blé","violet":"violet","lightskyblue":"bleu ciel clair","goldenrod":"jaune paille","mediumblue":"bleu moyen","skyblue":"bleu ciel","crimson":"cramoisi","darksalmon":"saumon foncé","darkred":"rouge foncé","darkslategrey":"gris ardoise foncé","peru":"caramel","lightgrey":"gris clair","lightgoldenrodyellow":"jaune paille clair","blanchedalmond":"coquille d'œuf","aliceblue":"bleu gris","bisque":"beige rosé","slategray":"gris ardoise","palegoldenrod":"jaune paille pâle","darkorange":"orange foncé","aquamarine":"aigue-marine","lightgreen":"vert clair","burlywood":"bois précieux","dodgerblue":"bleu France","darkgray":"gris foncé","lightcyan":"cyan clair","powderblue":"bleu de smalt","blueviolet":"bleu-violet","orchid":"lilas","dimgray":"gris soutenu","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavandin","hotpink":"rose intense","steelblue":"bleu acier","tomato":"tomate","lightpink":"rose clair","limegreen":"citron vert","indianred":"rose indien","papayawhip":"crème de papaye","lightslategray":"gris ardoise clair","gray":"gris","mediumorchid":"lilas moyen","cornsilk":"vanille","black":"noir","seagreen":"vert d'eau","darkslateblue":"bleu ardoise foncé","khaki":"kaki","lightblue":"bleu clair","palegreen":"vert pâle","azure":"bleu azur","peachpuff":"pêche","darkolivegreen":"olive foncé","yellowgreen":"vert jaunâtre"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Choix précédents","nextMessage":"Plus de choix"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Annuler","buttonSave":"Sauvegarder","itemClose":"Fermer"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_fr-fr.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_fr-fr.js.uncompressed.js
new file mode 100644
index 000000000..67072dd7c
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_fr-fr.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_fr-fr',{
+'dijit/form/nls/validate':{"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."}
+,
+'dijit/nls/loading':{"loadingState":"Chargement...","errorState":"Une erreur est survenue"}
+,
+'dojo/nls/colors':{"lightsteelblue":"bleu acier clair","orangered":"rouge orangé","midnightblue":"bleu nuit","cadetblue":"bleu pétrole","seashell":"coquillage","slategrey":"gris ardoise","coral":"corail","darkturquoise":"turquoise foncé","antiquewhite":"blanc antique","mediumspringgreen":"vert printemps moyen","transparent":"transparent","salmon":"saumon","darkgrey":"gris foncé","ivory":"ivoire","greenyellow":"vert-jaune","mistyrose":"rose pâle","lightsalmon":"saumon clair","silver":"argent","dimgrey":"gris soutenu","orange":"orange","white":"blanc","navajowhite":"chair","royalblue":"bleu roi","deeppink":"rose soutenu","lime":"vert citron","oldlace":"blanc cassé","chartreuse":"vert vif","darkcyan":"cyan foncé","yellow":"jaune","linen":"écru","olive":"olive","gold":"or","lawngreen":"vert prairie","lightyellow":"jaune clair","tan":"grège","darkviolet":"violet foncé","lightslategrey":"gris ardoise clair","grey":"gris","darkkhaki":"kaki foncé","green":"vert","deepskyblue":"bleu ciel soutenu","aqua":"bleu-vert","sienna":"terre de sienne","mintcream":"crème de menthe","rosybrown":"vieux rose","mediumslateblue":"bleu ardoise moyen","magenta":"magenta","lightseagreen":"vert d'eau clair","cyan":"cyan","olivedrab":"brun verdâtre","darkgoldenrod":"jaune paille foncé","slateblue":"bleu ardoise","mediumaquamarine":"aigue-marine moyen","lavender":"lavande","mediumseagreen":"vert d'eau moyen","maroon":"marron","darkslategray":"gris ardoise foncé","mediumturquoise":"turquoise moyen","ghostwhite":"blanc laiteux","darkblue":"bleu foncé","mediumvioletred":"rouge violacé moyen","brown":"brun","lightgray":"gris clair","sandybrown":"sable","pink":"rose","firebrick":"rouge brique","indigo":"indigo","snow":"neige","darkorchid":"lilas foncé","turquoise":"turquoise","chocolate":"chocolat","springgreen":"vert printemps","moccasin":"chamois","navy":"bleu marine","lemonchiffon":"mousse de citron","teal":"sarcelle","floralwhite":"lys","cornflowerblue":"bleuet","paleturquoise":"turquoise pâle","purple":"pourpre","gainsboro":"gris souris","plum":"prune","red":"rouge","blue":"bleu","forestgreen":"vert sapin","darkgreen":"vert foncé","honeydew":"opalin","darkseagreen":"vert d'eau foncé","lightcoral":"corail clair","palevioletred":"rouge violacé pâle","mediumpurple":"pourpre moyen","saddlebrown":"brun cuir","darkmagenta":"magenta foncé","thistle":"chardon","whitesmoke":"blanc cendré","wheat":"blé","violet":"violet","lightskyblue":"bleu ciel clair","goldenrod":"jaune paille","mediumblue":"bleu moyen","skyblue":"bleu ciel","crimson":"cramoisi","darksalmon":"saumon foncé","darkred":"rouge foncé","darkslategrey":"gris ardoise foncé","peru":"caramel","lightgrey":"gris clair","lightgoldenrodyellow":"jaune paille clair","blanchedalmond":"coquille d'œuf","aliceblue":"bleu gris","bisque":"beige rosé","slategray":"gris ardoise","palegoldenrod":"jaune paille pâle","darkorange":"orange foncé","aquamarine":"aigue-marine","lightgreen":"vert clair","burlywood":"bois précieux","dodgerblue":"bleu France","darkgray":"gris foncé","lightcyan":"cyan clair","powderblue":"bleu de smalt","blueviolet":"bleu-violet","orchid":"lilas","dimgray":"gris soutenu","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavandin","hotpink":"rose intense","steelblue":"bleu acier","tomato":"tomate","lightpink":"rose clair","limegreen":"citron vert","indianred":"rose indien","papayawhip":"crème de papaye","lightslategray":"gris ardoise clair","gray":"gris","mediumorchid":"lilas moyen","cornsilk":"vanille","black":"noir","seagreen":"vert d'eau","darkslateblue":"bleu ardoise foncé","khaki":"kaki","lightblue":"bleu clair","palegreen":"vert pâle","azure":"bleu azur","peachpuff":"pêche","darkolivegreen":"olive foncé","yellowgreen":"vert jaunâtre"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Choix précédents","nextMessage":"Plus de choix"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Annuler","buttonSave":"Sauvegarder","itemClose":"Fermer"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_fr.js b/lib/dojo/nls/tt-rss-layer_fr.js
deleted file mode 100644
index 7d5f281e2..000000000
--- a/lib/dojo/nls/tt-rss-layer_fr.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dojo.nls.tt-rss-layer_fr");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.fr");dojo.nls.colors.fr={"lightsteelblue":"bleu acier clair","orangered":"rouge orangé","midnightblue":"bleu nuit","cadetblue":"bleu pétrole","seashell":"coquillage","slategrey":"gris ardoise","coral":"corail","darkturquoise":"turquoise foncé","antiquewhite":"blanc antique","mediumspringgreen":"vert printemps moyen","salmon":"saumon","darkgrey":"gris foncé","ivory":"ivoire","greenyellow":"vert-jaune","mistyrose":"rose pâle","lightsalmon":"saumon clair","silver":"argent","dimgrey":"gris soutenu","orange":"orange","white":"blanc","navajowhite":"chair","royalblue":"bleu roi","deeppink":"rose soutenu","lime":"vert citron","oldlace":"blanc cassé","chartreuse":"vert vif","darkcyan":"cyan foncé","yellow":"jaune","linen":"écru","olive":"olive","gold":"or","lawngreen":"vert prairie","lightyellow":"jaune clair","tan":"grège","darkviolet":"violet foncé","lightslategrey":"gris ardoise clair","grey":"gris","darkkhaki":"kaki foncé","green":"vert","deepskyblue":"bleu ciel soutenu","aqua":"bleu-vert","sienna":"terre de sienne","mintcream":"crème de menthe","rosybrown":"vieux rose","mediumslateblue":"bleu ardoise moyen","magenta":"magenta","lightseagreen":"vert d'eau clair","cyan":"cyan","olivedrab":"brun verdâtre","darkgoldenrod":"jaune paille foncé","slateblue":"bleu ardoise","mediumaquamarine":"aigue-marine moyen","lavender":"lavande","mediumseagreen":"vert d'eau moyen","maroon":"marron","darkslategray":"gris ardoise foncé","mediumturquoise":"turquoise moyen","ghostwhite":"blanc laiteux","darkblue":"bleu foncé","mediumvioletred":"rouge violacé moyen","brown":"brun","lightgray":"gris clair","sandybrown":"sable","pink":"rose","firebrick":"rouge brique","indigo":"indigo","snow":"neige","darkorchid":"lilas foncé","turquoise":"turquoise","chocolate":"chocolat","springgreen":"vert printemps","moccasin":"chamois","navy":"bleu marine","lemonchiffon":"mousse de citron","teal":"sarcelle","floralwhite":"lys","cornflowerblue":"bleuet","paleturquoise":"turquoise pâle","purple":"pourpre","gainsboro":"gris souris","plum":"prune","red":"rouge","blue":"bleu","forestgreen":"vert sapin","darkgreen":"vert foncé","honeydew":"opalin","darkseagreen":"vert d'eau foncé","lightcoral":"corail clair","palevioletred":"rouge violacé pâle","mediumpurple":"pourpre moyen","saddlebrown":"brun cuir","darkmagenta":"magenta foncé","thistle":"chardon","whitesmoke":"blanc cendré","wheat":"blé","violet":"violet","lightskyblue":"bleu ciel clair","goldenrod":"jaune paille","mediumblue":"bleu moyen","skyblue":"bleu ciel","crimson":"cramoisi","darksalmon":"saumon foncé","darkred":"rouge foncé","darkslategrey":"gris ardoise foncé","peru":"caramel","lightgrey":"gris clair","lightgoldenrodyellow":"jaune paille clair","blanchedalmond":"coquille d'oeuf","aliceblue":"bleu gris","bisque":"beige rosé","slategray":"gris ardoise","palegoldenrod":"jaune paille pâle","darkorange":"orange foncé","aquamarine":"aigue-marine","lightgreen":"vert clair","burlywood":"bois précieux","dodgerblue":"bleu France","darkgray":"gris foncé","lightcyan":"cyan clair","powderblue":"bleu de smalt","blueviolet":"bleu-violet","orchid":"lilas","dimgray":"gris soutenu","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavandin","hotpink":"rose intense","steelblue":"bleu acier","tomato":"tomate","lightpink":"rose clair","limegreen":"citron vert","indianred":"rose indien","papayawhip":"crème de papaye","lightslategray":"gris ardoise clair","gray":"gris","mediumorchid":"lilas moyen","cornsilk":"vanille","black":"noir","seagreen":"vert d'eau","darkslateblue":"bleu ardoise foncé","khaki":"kaki","lightblue":"bleu clair","palegreen":"vert pâle","azure":"bleu azur","peachpuff":"pêche","darkolivegreen":"olive foncé","yellowgreen":"vert jaunâtre"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.fr");dijit.nls.loading.fr={"loadingState":"Chargement...","errorState":"Une erreur est survenue"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.fr");dijit.nls.common.fr={"buttonOk":"OK","buttonCancel":"Annuler","buttonSave":"Sauvegarder","itemClose":"Fermer"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.fr");dijit.form.nls.validate.fr={"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."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.fr");dijit.form.nls.ComboBox.fr={"previousMessage":"Choix précédents","nextMessage":"Plus de choix"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.fr");dojo.cldr.nls.number.fr={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_he-il.js b/lib/dojo/nls/tt-rss-layer_he-il.js
index bc4572cc2..f651b8768 100644
--- a/lib/dojo/nls/tt-rss-layer_he-il.js
+++ b/lib/dojo/nls/tt-rss-layer_he-il.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_he-il");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.he_il");dojo.nls.colors.he_il={"lightsteelblue":"כחול פלדה בהיר","orangered":"כתום אדום","midnightblue":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב","mistyrose":"ורוד מעורפל","lightsalmon":"סלמון בהיר","silver":"כסף","dimgrey":"אפור עמום","orange":"כתום","white":"לבן","navajowhite":"לבן נוואחו","royalblue":"כחול מלכותי","deeppink":"ורוד עמוק","lime":"לימון","oldlace":"תחרה עתיקה","chartreuse":"ירוק-צהוב","darkcyan":"טורקיז כהה","yellow":"צהוב","linen":"פשתן","olive":"זית","gold":"זהב","lawngreen":"ירוק דשא","lightyellow":"צהוב בהיר","tan":"חום אדמדם","darkviolet":"סגול כהה","lightslategrey":"אפור צפחה בהיר","grey":"אפור","darkkhaki":"חאקי כהה","green":"ירוק","deepskyblue":"כחול שמיים עמוק","aqua":"אקווה","sienna":"סיינה","mintcream":"קרם מנטה","rosybrown":"חום ורדרד","mediumslateblue":"כחול צפחה בינוני","magenta":"בורדו","lightseagreen":"ירוק ים בהיר","cyan":"טורקיז","olivedrab":"זית עמום","darkgoldenrod":"זהוב כהה","slateblue":"כחול צפחה","mediumaquamarine":"כחול בינוני","lavender":"לבנדר","mediumseagreen":"ירוק ים בינוני","maroon":"חום אדמדם","darkslategray":"אפור צפחה כהה","mediumturquoise":"טורקיז בינוני","ghostwhite":"לבן רפאים","darkblue":"כחול כהה","mediumvioletred":"סגול-אדום בינוני","brown":"חום","lightgray":"אפור בהיר","sandybrown":"חום חולי","pink":"ורוד","firebrick":"לבנה שרופה","indigo":"אינדיגו","snow":"שלג","darkorchid":"סחלב כהה","turquoise":"טורקיז","chocolate":"שוקולד","springgreen":"ירוק אביב","moccasin":"מוקסין","navy":"כחול כהה","lemonchiffon":"ירוק לימון","teal":"כחול-ירוק כהה","floralwhite":"לבן פרחוני","cornflowerblue":"כחול דרדר","paleturquoise":"טורקיז בהיר","purple":"סגול","gainsboro":"גיינסבורו","plum":"שזיף","red":"אדום","blue":"כחול","forestgreen":"ירוק יער","darkgreen":"ירוק כהה","honeydew":"ירקרק","darkseagreen":"ירוק ים כהה","lightcoral":"אלמוג בהיר","palevioletred":"סגול-אדום בהיר","mediumpurple":"סגול בינוני","saddlebrown":"חום דהוי","darkmagenta":"בורדו כהה","thistle":"דרדר","whitesmoke":"עשן לבן","wheat":"חיוט","violet":"סגול","lightskyblue":"כחול שמיים בהיר","goldenrod":"זהוב","mediumblue":"תכלת בינוני","skyblue":"כחול שמיים","crimson":"ארגמן","darksalmon":"סלמון כהה","darkred":"אדום כהה","darkslategrey":"אפור צפחה כהה","peru":"פרו","lightgrey":"אפור בהיר","lightgoldenrodyellow":"צהוב בהיר","blanchedalmond":"שקד","aliceblue":"כחול פלדה","bisque":"לבן שקד","slategray":"אפור צפחה","palegoldenrod":"זהוב בהיר","darkorange":"כתום כהה","aquamarine":"אקוומארין","lightgreen":"ירוק בהיר","burlywood":"חום דהוי","dodgerblue":"כחול","darkgray":"אפור כהה","lightcyan":"טורקיז בהיר","powderblue":"כחול חיוור","blueviolet":"כחול-סגול","orchid":"סחלב","dimgray":"אפור עמום","beige":"בז'","fuchsia":"ורוד בהיר","lavenderblush":"סומק לבנדר","hotpink":"ורוד לוהט","steelblue":"כחול פלדה","tomato":"עגבניה","lightpink":"ורוד בהיר","limegreen":"ירוק לימוני","indianred":"אדום דהוי","papayawhip":"פפאיה","lightslategray":"אפור צפחה בהיר","gray":"אפור","mediumorchid":"סחלב בינוני","cornsilk":"צהבהב","black":"שחור","seagreen":"ירוק ים","darkslateblue":"כחול צפחה כהה","khaki":"חאקי","lightblue":"תכלת","palegreen":"ירוק בהיר","azure":"תכלת עז","peachpuff":"קציפת אפרסק","darkolivegreen":"ירוק זית כהה","yellowgreen":"ירוק צהוב"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.he_il");dijit.nls.loading.he_il={"loadingState":"טעינה...‏","errorState":"אירעה שגיאה"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.he_il");dijit.nls.common.he_il={"buttonOk":"אישור","buttonCancel":"ביטול","buttonSave":"שמירה","itemClose":"סגירה"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.he_il");dijit.form.nls.validate.he_il={"rangeMessage":"הערך מחוץ לטווח.","invalidMessage":"הערך שצוין אינו חוקי.","missingMessage":"זהו ערך דרוש."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.he_il");dijit.form.nls.ComboBox.he_il={"previousMessage":"האפשרויות הקודמות","nextMessage":"אפשרויות נוספות"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.he_il");dojo.cldr.nls.number.he_il={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_he-il",{"dijit/form/nls/validate":{"rangeMessage":"הערך מחוץ לטווח.","invalidMessage":"הערך שצוין אינו חוקי.","missingMessage":"זהו ערך דרוש."},"dijit/nls/loading":{"loadingState":"טעינה...","errorState":"אירעה שגיאה"},"dojo/nls/colors":{"lightsteelblue":"כחול פלדה בהיר","orangered":"כתום אדום","midnightblue":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","transparent":"transparent","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב","mistyrose":"ורוד מעורפל","lightsalmon":"סלמון בהיר","silver":"כסף","dimgrey":"אפור עמום","orange":"כתום","white":"לבן","navajowhite":"לבן נוואחו","royalblue":"כחול מלכותי","deeppink":"ורוד עמוק","lime":"לימון","oldlace":"תחרה עתיקה","chartreuse":"ירוק-צהוב","darkcyan":"טורקיז כהה","yellow":"צהוב","linen":"פשתן","olive":"זית","gold":"זהב","lawngreen":"ירוק דשא","lightyellow":"צהוב בהיר","tan":"חום אדמדם","darkviolet":"סגול כהה","lightslategrey":"אפור צפחה בהיר","grey":"אפור","darkkhaki":"חאקי כהה","green":"ירוק","deepskyblue":"כחול שמיים עמוק","aqua":"אקווה","sienna":"סיינה","mintcream":"קרם מנטה","rosybrown":"חום ורדרד","mediumslateblue":"כחול צפחה בינוני","magenta":"בורדו","lightseagreen":"ירוק ים בהיר","cyan":"טורקיז","olivedrab":"זית עמום","darkgoldenrod":"זהוב כהה","slateblue":"כחול צפחה","mediumaquamarine":"כחול בינוני","lavender":"לבנדר","mediumseagreen":"ירוק ים בינוני","maroon":"חום אדמדם","darkslategray":"אפור צפחה כהה","mediumturquoise":"טורקיז בינוני","ghostwhite":"לבן רפאים","darkblue":"כחול כהה","mediumvioletred":"סגול-אדום בינוני","brown":"חום","lightgray":"אפור בהיר","sandybrown":"חום חולי","pink":"ורוד","firebrick":"לבנה שרופה","indigo":"אינדיגו","snow":"שלג","darkorchid":"סחלב כהה","turquoise":"טורקיז","chocolate":"שוקולד","springgreen":"ירוק אביב","moccasin":"מוקסין","navy":"כחול כהה","lemonchiffon":"ירוק לימון","teal":"כחול-ירוק כהה","floralwhite":"לבן פרחוני","cornflowerblue":"כחול דרדר","paleturquoise":"טורקיז בהיר","purple":"סגול","gainsboro":"גיינסבורו","plum":"שזיף","red":"אדום","blue":"כחול","forestgreen":"ירוק יער","darkgreen":"ירוק כהה","honeydew":"ירקרק","darkseagreen":"ירוק ים כהה","lightcoral":"אלמוג בהיר","palevioletred":"סגול-אדום בהיר","mediumpurple":"סגול בינוני","saddlebrown":"חום דהוי","darkmagenta":"בורדו כהה","thistle":"דרדר","whitesmoke":"עשן לבן","wheat":"חיוט","violet":"סגול","lightskyblue":"כחול שמיים בהיר","goldenrod":"זהוב","mediumblue":"תכלת בינוני","skyblue":"כחול שמיים","crimson":"ארגמן","darksalmon":"סלמון כהה","darkred":"אדום כהה","darkslategrey":"אפור צפחה כהה","peru":"פרו","lightgrey":"אפור בהיר","lightgoldenrodyellow":"צהוב בהיר","blanchedalmond":"שקד","aliceblue":"כחול פלדה","bisque":"לבן שקד","slategray":"אפור צפחה","palegoldenrod":"זהוב בהיר","darkorange":"כתום כהה","aquamarine":"אקוומארין","lightgreen":"ירוק בהיר","burlywood":"חום דהוי","dodgerblue":"כחול","darkgray":"אפור כהה","lightcyan":"טורקיז בהיר","powderblue":"כחול חיוור","blueviolet":"כחול-סגול","orchid":"סחלב","dimgray":"אפור עמום","beige":"בז'","fuchsia":"ורוד בהיר","lavenderblush":"סומק לבנדר","hotpink":"ורוד לוהט","steelblue":"כחול פלדה","tomato":"עגבניה","lightpink":"ורוד בהיר","limegreen":"ירוק לימוני","indianred":"אדום דהוי","papayawhip":"פפאיה","lightslategray":"אפור צפחה בהיר","gray":"אפור","mediumorchid":"סחלב בינוני","cornsilk":"צהבהב","black":"שחור","seagreen":"ירוק ים","darkslateblue":"כחול צפחה כהה","khaki":"חאקי","lightblue":"תכלת","palegreen":"ירוק בהיר","azure":"תכלת עז","peachpuff":"קציפת אפרסק","darkolivegreen":"ירוק זית כהה","yellowgreen":"ירוק צהוב"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"האפשרויות הקודמות","nextMessage":"אפשרויות נוספות"},"dijit/nls/common":{"buttonOk":"אישור","buttonCancel":"ביטול","buttonSave":"שמירה","itemClose":"סגירה"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_he-il.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_he-il.js.uncompressed.js
new file mode 100644
index 000000000..aaba5dede
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_he-il.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_he-il',{
+'dijit/form/nls/validate':{"rangeMessage":"הערך מחוץ לטווח.","invalidMessage":"הערך שצוין אינו חוקי.","missingMessage":"זהו ערך דרוש."}
+,
+'dijit/nls/loading':{"loadingState":"טעינה...","errorState":"אירעה שגיאה"}
+,
+'dojo/nls/colors':{"lightsteelblue":"כחול פלדה בהיר","orangered":"כתום אדום","midnightblue":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","transparent":"transparent","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב","mistyrose":"ורוד מעורפל","lightsalmon":"סלמון בהיר","silver":"כסף","dimgrey":"אפור עמום","orange":"כתום","white":"לבן","navajowhite":"לבן נוואחו","royalblue":"כחול מלכותי","deeppink":"ורוד עמוק","lime":"לימון","oldlace":"תחרה עתיקה","chartreuse":"ירוק-צהוב","darkcyan":"טורקיז כהה","yellow":"צהוב","linen":"פשתן","olive":"זית","gold":"זהב","lawngreen":"ירוק דשא","lightyellow":"צהוב בהיר","tan":"חום אדמדם","darkviolet":"סגול כהה","lightslategrey":"אפור צפחה בהיר","grey":"אפור","darkkhaki":"חאקי כהה","green":"ירוק","deepskyblue":"כחול שמיים עמוק","aqua":"אקווה","sienna":"סיינה","mintcream":"קרם מנטה","rosybrown":"חום ורדרד","mediumslateblue":"כחול צפחה בינוני","magenta":"בורדו","lightseagreen":"ירוק ים בהיר","cyan":"טורקיז","olivedrab":"זית עמום","darkgoldenrod":"זהוב כהה","slateblue":"כחול צפחה","mediumaquamarine":"כחול בינוני","lavender":"לבנדר","mediumseagreen":"ירוק ים בינוני","maroon":"חום אדמדם","darkslategray":"אפור צפחה כהה","mediumturquoise":"טורקיז בינוני","ghostwhite":"לבן רפאים","darkblue":"כחול כהה","mediumvioletred":"סגול-אדום בינוני","brown":"חום","lightgray":"אפור בהיר","sandybrown":"חום חולי","pink":"ורוד","firebrick":"לבנה שרופה","indigo":"אינדיגו","snow":"שלג","darkorchid":"סחלב כהה","turquoise":"טורקיז","chocolate":"שוקולד","springgreen":"ירוק אביב","moccasin":"מוקסין","navy":"כחול כהה","lemonchiffon":"ירוק לימון","teal":"כחול-ירוק כהה","floralwhite":"לבן פרחוני","cornflowerblue":"כחול דרדר","paleturquoise":"טורקיז בהיר","purple":"סגול","gainsboro":"גיינסבורו","plum":"שזיף","red":"אדום","blue":"כחול","forestgreen":"ירוק יער","darkgreen":"ירוק כהה","honeydew":"ירקרק","darkseagreen":"ירוק ים כהה","lightcoral":"אלמוג בהיר","palevioletred":"סגול-אדום בהיר","mediumpurple":"סגול בינוני","saddlebrown":"חום דהוי","darkmagenta":"בורדו כהה","thistle":"דרדר","whitesmoke":"עשן לבן","wheat":"חיוט","violet":"סגול","lightskyblue":"כחול שמיים בהיר","goldenrod":"זהוב","mediumblue":"תכלת בינוני","skyblue":"כחול שמיים","crimson":"ארגמן","darksalmon":"סלמון כהה","darkred":"אדום כהה","darkslategrey":"אפור צפחה כהה","peru":"פרו","lightgrey":"אפור בהיר","lightgoldenrodyellow":"צהוב בהיר","blanchedalmond":"שקד","aliceblue":"כחול פלדה","bisque":"לבן שקד","slategray":"אפור צפחה","palegoldenrod":"זהוב בהיר","darkorange":"כתום כהה","aquamarine":"אקוומארין","lightgreen":"ירוק בהיר","burlywood":"חום דהוי","dodgerblue":"כחול","darkgray":"אפור כהה","lightcyan":"טורקיז בהיר","powderblue":"כחול חיוור","blueviolet":"כחול-סגול","orchid":"סחלב","dimgray":"אפור עמום","beige":"בז'","fuchsia":"ורוד בהיר","lavenderblush":"סומק לבנדר","hotpink":"ורוד לוהט","steelblue":"כחול פלדה","tomato":"עגבניה","lightpink":"ורוד בהיר","limegreen":"ירוק לימוני","indianred":"אדום דהוי","papayawhip":"פפאיה","lightslategray":"אפור צפחה בהיר","gray":"אפור","mediumorchid":"סחלב בינוני","cornsilk":"צהבהב","black":"שחור","seagreen":"ירוק ים","darkslateblue":"כחול צפחה כהה","khaki":"חאקי","lightblue":"תכלת","palegreen":"ירוק בהיר","azure":"תכלת עז","peachpuff":"קציפת אפרסק","darkolivegreen":"ירוק זית כהה","yellowgreen":"ירוק צהוב"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"האפשרויות הקודמות","nextMessage":"אפשרויות נוספות"}
+,
+'dijit/nls/common':{"buttonOk":"אישור","buttonCancel":"ביטול","buttonSave":"שמירה","itemClose":"סגירה"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_he.js b/lib/dojo/nls/tt-rss-layer_he.js
deleted file mode 100644
index 3efc22fc5..000000000
--- a/lib/dojo/nls/tt-rss-layer_he.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dojo.nls.tt-rss-layer_he");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.he");dojo.nls.colors.he={"lightsteelblue":"כחול פלדה בהיר","orangered":"כתום אדום","midnightblue":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב","mistyrose":"ורוד מעורפל","lightsalmon":"סלמון בהיר","silver":"כסף","dimgrey":"אפור עמום","orange":"כתום","white":"לבן","navajowhite":"לבן נוואחו","royalblue":"כחול מלכותי","deeppink":"ורוד עמוק","lime":"לימון","oldlace":"תחרה עתיקה","chartreuse":"ירוק-צהוב","darkcyan":"טורקיז כהה","yellow":"צהוב","linen":"פשתן","olive":"זית","gold":"זהב","lawngreen":"ירוק דשא","lightyellow":"צהוב בהיר","tan":"חום אדמדם","darkviolet":"סגול כהה","lightslategrey":"אפור צפחה בהיר","grey":"אפור","darkkhaki":"חאקי כהה","green":"ירוק","deepskyblue":"כחול שמיים עמוק","aqua":"אקווה","sienna":"סיינה","mintcream":"קרם מנטה","rosybrown":"חום ורדרד","mediumslateblue":"כחול צפחה בינוני","magenta":"בורדו","lightseagreen":"ירוק ים בהיר","cyan":"טורקיז","olivedrab":"זית עמום","darkgoldenrod":"זהוב כהה","slateblue":"כחול צפחה","mediumaquamarine":"כחול בינוני","lavender":"לבנדר","mediumseagreen":"ירוק ים בינוני","maroon":"חום אדמדם","darkslategray":"אפור צפחה כהה","mediumturquoise":"טורקיז בינוני","ghostwhite":"לבן רפאים","darkblue":"כחול כהה","mediumvioletred":"סגול-אדום בינוני","brown":"חום","lightgray":"אפור בהיר","sandybrown":"חום חולי","pink":"ורוד","firebrick":"לבנה שרופה","indigo":"אינדיגו","snow":"שלג","darkorchid":"סחלב כהה","turquoise":"טורקיז","chocolate":"שוקולד","springgreen":"ירוק אביב","moccasin":"מוקסין","navy":"כחול כהה","lemonchiffon":"ירוק לימון","teal":"כחול-ירוק כהה","floralwhite":"לבן פרחוני","cornflowerblue":"כחול דרדר","paleturquoise":"טורקיז בהיר","purple":"סגול","gainsboro":"גיינסבורו","plum":"שזיף","red":"אדום","blue":"כחול","forestgreen":"ירוק יער","darkgreen":"ירוק כהה","honeydew":"ירקרק","darkseagreen":"ירוק ים כהה","lightcoral":"אלמוג בהיר","palevioletred":"סגול-אדום בהיר","mediumpurple":"סגול בינוני","saddlebrown":"חום דהוי","darkmagenta":"בורדו כהה","thistle":"דרדר","whitesmoke":"עשן לבן","wheat":"חיוט","violet":"סגול","lightskyblue":"כחול שמיים בהיר","goldenrod":"זהוב","mediumblue":"תכלת בינוני","skyblue":"כחול שמיים","crimson":"ארגמן","darksalmon":"סלמון כהה","darkred":"אדום כהה","darkslategrey":"אפור צפחה כהה","peru":"פרו","lightgrey":"אפור בהיר","lightgoldenrodyellow":"צהוב בהיר","blanchedalmond":"שקד","aliceblue":"כחול פלדה","bisque":"לבן שקד","slategray":"אפור צפחה","palegoldenrod":"זהוב בהיר","darkorange":"כתום כהה","aquamarine":"אקוומארין","lightgreen":"ירוק בהיר","burlywood":"חום דהוי","dodgerblue":"כחול","darkgray":"אפור כהה","lightcyan":"טורקיז בהיר","powderblue":"כחול חיוור","blueviolet":"כחול-סגול","orchid":"סחלב","dimgray":"אפור עמום","beige":"בז'","fuchsia":"ורוד בהיר","lavenderblush":"סומק לבנדר","hotpink":"ורוד לוהט","steelblue":"כחול פלדה","tomato":"עגבניה","lightpink":"ורוד בהיר","limegreen":"ירוק לימוני","indianred":"אדום דהוי","papayawhip":"פפאיה","lightslategray":"אפור צפחה בהיר","gray":"אפור","mediumorchid":"סחלב בינוני","cornsilk":"צהבהב","black":"שחור","seagreen":"ירוק ים","darkslateblue":"כחול צפחה כהה","khaki":"חאקי","lightblue":"תכלת","palegreen":"ירוק בהיר","azure":"תכלת עז","peachpuff":"קציפת אפרסק","darkolivegreen":"ירוק זית כהה","yellowgreen":"ירוק צהוב"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.he");dijit.nls.loading.he={"loadingState":"טעינה...‏","errorState":"אירעה שגיאה"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.he");dijit.nls.common.he={"buttonOk":"אישור","buttonCancel":"ביטול","buttonSave":"שמירה","itemClose":"סגירה"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.he");dijit.form.nls.validate.he={"rangeMessage":"הערך מחוץ לטווח.","invalidMessage":"הערך שצוין אינו חוקי.","missingMessage":"זהו ערך דרוש."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.he");dijit.form.nls.ComboBox.he={"previousMessage":"האפשרויות הקודמות","nextMessage":"אפשרויות נוספות"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.he");dojo.cldr.nls.number.he={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_hu.js b/lib/dojo/nls/tt-rss-layer_hu.js
index 2567d6834..ff8685773 100644
--- a/lib/dojo/nls/tt-rss-layer_hu.js
+++ b/lib/dojo/nls/tt-rss-layer_hu.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_hu");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.hu");dojo.nls.colors.hu={"lightsteelblue":"világos acélkék","orangered":"narancsvörös","midnightblue":"éjkék","cadetblue":"kadétkék","seashell":"kagyló","slategrey":"palaszürke","coral":"korall","darkturquoise":"sötét türkizkék","antiquewhite":"antik fehér","mediumspringgreen":"közepes tavaszzöld","salmon":"lazacszín","darkgrey":"sötétszürke","ivory":"elefántcsont","greenyellow":"zöldessárga","mistyrose":"halvány rózsaszín","lightsalmon":"világos lazacszín","silver":"ezüst","dimgrey":"halványszürke","orange":"narancssárga","white":"fehér","navajowhite":"navajo fehér","royalblue":"királykék","deeppink":"sötétrózsaszín","lime":"lime","oldlace":"régi csipke","chartreuse":"chartreuse","darkcyan":"sötét ciánkék","yellow":"sárga","linen":"vászonfehér","olive":"olajzöld","gold":"arany","lawngreen":"fűzöld","lightyellow":"világossárga","tan":"rozsdabarna","darkviolet":"sötét ibolyaszín","lightslategrey":"világos palaszürke","grey":"szürke","darkkhaki":"sötét khakiszín","green":"zöld","deepskyblue":"sötét égszínkék","aqua":"vízszín","sienna":"vörösesbarna","mintcream":"mentaszósz","rosybrown":"barnásrózsaszín","mediumslateblue":"közepes palakék","magenta":"bíbor","lightseagreen":"világos tengerzöld","cyan":"ciánkék","olivedrab":"olajzöld drapp","darkgoldenrod":"sötét aranyvessző","slateblue":"palakék","mediumaquamarine":"közepes akvamarin","lavender":"levendula","mediumseagreen":"közepes tengerzöld","maroon":"gesztenyebarna","darkslategray":"sötét palaszürke","mediumturquoise":"közepes türkizkék","ghostwhite":"szellemfehér","darkblue":"sötétkék","mediumvioletred":"közepes ibolyavörös","brown":"barna","lightgray":"világosszürke","sandybrown":"homokbarna","pink":"rózsaszín","firebrick":"téglavörös","indigo":"indigó","snow":"hó","darkorchid":"sötét orchidea","turquoise":"türkizkék","chocolate":"csokoládé","springgreen":"tavaszzöld","moccasin":"mokkaszín","navy":"tengerészkék","lemonchiffon":"sárga műselyem","teal":"pávakék","floralwhite":"virágfehér","cornflowerblue":"búzavirágkék","paleturquoise":"halvány türkizkék","purple":"lila","gainsboro":"gainsboro","plum":"szilvakék","red":"vörös","blue":"kék","forestgreen":"erdőzöld","darkgreen":"sötétzöld","honeydew":"mézharmat","darkseagreen":"sötét tengerzöld","lightcoral":"világos korall","palevioletred":"halvány ibolyavörös","mediumpurple":"közepes lila","saddlebrown":"nyeregbarna","darkmagenta":"sötétbíbor","thistle":"bogáncs","whitesmoke":"fehér füst","wheat":"búza","violet":"ibolyaszín","lightskyblue":"világos égszínkék","goldenrod":"aranyvessző","mediumblue":"közepes kék","skyblue":"égszínkék","crimson":"karmazsinvörös","darksalmon":"sötét lazacszín","darkred":"sötétvörös","darkslategrey":"sötét palaszürke","peru":"peru","lightgrey":"világosszürke","lightgoldenrodyellow":"világos aranyvessző sárga","blanchedalmond":"hámozott mandula","aliceblue":"Alice kék","bisque":"porcelán","slategray":"palaszürke","palegoldenrod":"halvány aranyvessző","darkorange":"sötét narancssárga","aquamarine":"akvamarin","lightgreen":"világoszöld","burlywood":"nyersfa","dodgerblue":"dodger kék","darkgray":"sötétszürke","lightcyan":"világos ciánkék","powderblue":"púderkék","blueviolet":"ibolyakék","orchid":"orchidea","dimgray":"halványszürke","beige":"bézs","fuchsia":"fukszia","lavenderblush":"pirosas levendula","hotpink":"meleg rózsaszín","steelblue":"acélkék","tomato":"paradicsom","lightpink":"világos rózsaszín","limegreen":"limezöld","indianred":"indiánvörös","papayawhip":"papayahab","lightslategray":"világos palaszürke","gray":"szürke","mediumorchid":"közepes orchidea","cornsilk":"kukoricahaj","black":"fekete","seagreen":"tengerzöld","darkslateblue":"sötét palakék","khaki":"khakiszín","lightblue":"világoskék","palegreen":"halványzöld","azure":"azúrkék","peachpuff":"barackszín","darkolivegreen":"sötét olajzöld","yellowgreen":"sárgászöld"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.hu");dijit.nls.loading.hu={"loadingState":"Betöltés...","errorState":"Sajnálom, hiba történt"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.hu");dijit.nls.common.hu={"buttonOk":"OK","buttonCancel":"Mégse","buttonSave":"Mentés","itemClose":"Bezárás"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.hu");dijit.form.nls.validate.hu={"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."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.hu");dijit.form.nls.ComboBox.hu={"previousMessage":"Előző menüpontok","nextMessage":"További menüpontok"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.hu");dojo.cldr.nls.number.hu={"group":" ","percentSign":"%","exponential":"E","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","percentFormat":"#,##0%","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_hu",{"dijit/form/nls/validate":{"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."},"dijit/nls/loading":{"loadingState":"Betöltés...","errorState":"Sajnálom, hiba történt"},"dojo/nls/colors":{"lightsteelblue":"világos acélkék","orangered":"narancsvörös","midnightblue":"éjkék","cadetblue":"kadétkék","seashell":"kagyló","slategrey":"palaszürke","coral":"korall","darkturquoise":"sötét türkizkék","antiquewhite":"antik fehér","mediumspringgreen":"közepes tavaszzöld","transparent":"átlátszó","salmon":"lazacszín","darkgrey":"sötétszürke","ivory":"elefántcsont","greenyellow":"zöldessárga","mistyrose":"halvány rózsaszín","lightsalmon":"világos lazacszín","silver":"ezüst","dimgrey":"halványszürke","orange":"narancssárga","white":"fehér","navajowhite":"navajo fehér","royalblue":"királykék","deeppink":"sötétrózsaszín","lime":"lime","oldlace":"régi csipke","chartreuse":"chartreuse","darkcyan":"sötét ciánkék","yellow":"sárga","linen":"vászonfehér","olive":"olajzöld","gold":"arany","lawngreen":"fűzöld","lightyellow":"világossárga","tan":"rozsdabarna","darkviolet":"sötét ibolyaszín","lightslategrey":"világos palaszürke","grey":"szürke","darkkhaki":"sötét khakiszín","green":"zöld","deepskyblue":"sötét égszínkék","aqua":"vízszín","sienna":"vörösesbarna","mintcream":"mentaszósz","rosybrown":"barnásrózsaszín","mediumslateblue":"közepes palakék","magenta":"bíbor","lightseagreen":"világos tengerzöld","cyan":"ciánkék","olivedrab":"olajzöld drapp","darkgoldenrod":"sötét aranyvessző","slateblue":"palakék","mediumaquamarine":"közepes akvamarin","lavender":"levendula","mediumseagreen":"közepes tengerzöld","maroon":"gesztenyebarna","darkslategray":"sötét palaszürke","mediumturquoise":"közepes türkizkék","ghostwhite":"szellemfehér","darkblue":"sötétkék","mediumvioletred":"közepes ibolyavörös","brown":"barna","lightgray":"világosszürke","sandybrown":"homokbarna","pink":"rózsaszín","firebrick":"téglavörös","indigo":"indigó","snow":"hó","darkorchid":"sötét orchidea","turquoise":"türkizkék","chocolate":"csokoládé","springgreen":"tavaszzöld","moccasin":"mokkaszín","navy":"tengerészkék","lemonchiffon":"sárga műselyem","teal":"pávakék","floralwhite":"virágfehér","cornflowerblue":"búzavirágkék","paleturquoise":"halvány türkizkék","purple":"lila","gainsboro":"gainsboro","plum":"szilvakék","red":"vörös","blue":"kék","forestgreen":"erdőzöld","darkgreen":"sötétzöld","honeydew":"mézharmat","darkseagreen":"sötét tengerzöld","lightcoral":"világos korall","palevioletred":"halvány ibolyavörös","mediumpurple":"közepes lila","saddlebrown":"nyeregbarna","darkmagenta":"sötétbíbor","thistle":"bogáncs","whitesmoke":"fehér füst","wheat":"búza","violet":"ibolyaszín","lightskyblue":"világos égszínkék","goldenrod":"aranyvessző","mediumblue":"közepes kék","skyblue":"égszínkék","crimson":"karmazsinvörös","darksalmon":"sötét lazacszín","darkred":"sötétvörös","darkslategrey":"sötét palaszürke","peru":"peru","lightgrey":"világosszürke","lightgoldenrodyellow":"világos aranyvessző sárga","blanchedalmond":"hámozott mandula","aliceblue":"Alice kék","bisque":"porcelán","slategray":"palaszürke","palegoldenrod":"halvány aranyvessző","darkorange":"sötét narancssárga","aquamarine":"akvamarin","lightgreen":"világoszöld","burlywood":"nyersfa","dodgerblue":"dodger kék","darkgray":"sötétszürke","lightcyan":"világos ciánkék","powderblue":"púderkék","blueviolet":"ibolyakék","orchid":"orchidea","dimgray":"halványszürke","beige":"bézs","fuchsia":"fukszia","lavenderblush":"pirosas levendula","hotpink":"meleg rózsaszín","steelblue":"acélkék","tomato":"paradicsom","lightpink":"világos rózsaszín","limegreen":"limezöld","indianred":"indiánvörös","papayawhip":"papayahab","lightslategray":"világos palaszürke","gray":"szürke","mediumorchid":"közepes orchidea","cornsilk":"kukoricahaj","black":"fekete","seagreen":"tengerzöld","darkslateblue":"sötét palakék","khaki":"khakiszín","lightblue":"világoskék","palegreen":"halványzöld","azure":"azúrkék","peachpuff":"barackszín","darkolivegreen":"sötét olajzöld","yellowgreen":"sárgászöld"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Előző menüpontok","nextMessage":"További menüpontok"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Mégse","buttonSave":"Mentés","itemClose":"Bezárás"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_hu.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_hu.js.uncompressed.js
new file mode 100644
index 000000000..a41af2788
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_hu.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_hu',{
+'dijit/form/nls/validate':{"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."}
+,
+'dijit/nls/loading':{"loadingState":"Betöltés...","errorState":"Sajnálom, hiba történt"}
+,
+'dojo/nls/colors':{"lightsteelblue":"világos acélkék","orangered":"narancsvörös","midnightblue":"éjkék","cadetblue":"kadétkék","seashell":"kagyló","slategrey":"palaszürke","coral":"korall","darkturquoise":"sötét türkizkék","antiquewhite":"antik fehér","mediumspringgreen":"közepes tavaszzöld","transparent":"átlátszó","salmon":"lazacszín","darkgrey":"sötétszürke","ivory":"elefántcsont","greenyellow":"zöldessárga","mistyrose":"halvány rózsaszín","lightsalmon":"világos lazacszín","silver":"ezüst","dimgrey":"halványszürke","orange":"narancssárga","white":"fehér","navajowhite":"navajo fehér","royalblue":"királykék","deeppink":"sötétrózsaszín","lime":"lime","oldlace":"régi csipke","chartreuse":"chartreuse","darkcyan":"sötét ciánkék","yellow":"sárga","linen":"vászonfehér","olive":"olajzöld","gold":"arany","lawngreen":"fűzöld","lightyellow":"világossárga","tan":"rozsdabarna","darkviolet":"sötét ibolyaszín","lightslategrey":"világos palaszürke","grey":"szürke","darkkhaki":"sötét khakiszín","green":"zöld","deepskyblue":"sötét égszínkék","aqua":"vízszín","sienna":"vörösesbarna","mintcream":"mentaszósz","rosybrown":"barnásrózsaszín","mediumslateblue":"közepes palakék","magenta":"bíbor","lightseagreen":"világos tengerzöld","cyan":"ciánkék","olivedrab":"olajzöld drapp","darkgoldenrod":"sötét aranyvessző","slateblue":"palakék","mediumaquamarine":"közepes akvamarin","lavender":"levendula","mediumseagreen":"közepes tengerzöld","maroon":"gesztenyebarna","darkslategray":"sötét palaszürke","mediumturquoise":"közepes türkizkék","ghostwhite":"szellemfehér","darkblue":"sötétkék","mediumvioletred":"közepes ibolyavörös","brown":"barna","lightgray":"világosszürke","sandybrown":"homokbarna","pink":"rózsaszín","firebrick":"téglavörös","indigo":"indigó","snow":"hó","darkorchid":"sötét orchidea","turquoise":"türkizkék","chocolate":"csokoládé","springgreen":"tavaszzöld","moccasin":"mokkaszín","navy":"tengerészkék","lemonchiffon":"sárga műselyem","teal":"pávakék","floralwhite":"virágfehér","cornflowerblue":"búzavirágkék","paleturquoise":"halvány türkizkék","purple":"lila","gainsboro":"gainsboro","plum":"szilvakék","red":"vörös","blue":"kék","forestgreen":"erdőzöld","darkgreen":"sötétzöld","honeydew":"mézharmat","darkseagreen":"sötét tengerzöld","lightcoral":"világos korall","palevioletred":"halvány ibolyavörös","mediumpurple":"közepes lila","saddlebrown":"nyeregbarna","darkmagenta":"sötétbíbor","thistle":"bogáncs","whitesmoke":"fehér füst","wheat":"búza","violet":"ibolyaszín","lightskyblue":"világos égszínkék","goldenrod":"aranyvessző","mediumblue":"közepes kék","skyblue":"égszínkék","crimson":"karmazsinvörös","darksalmon":"sötét lazacszín","darkred":"sötétvörös","darkslategrey":"sötét palaszürke","peru":"peru","lightgrey":"világosszürke","lightgoldenrodyellow":"világos aranyvessző sárga","blanchedalmond":"hámozott mandula","aliceblue":"Alice kék","bisque":"porcelán","slategray":"palaszürke","palegoldenrod":"halvány aranyvessző","darkorange":"sötét narancssárga","aquamarine":"akvamarin","lightgreen":"világoszöld","burlywood":"nyersfa","dodgerblue":"dodger kék","darkgray":"sötétszürke","lightcyan":"világos ciánkék","powderblue":"púderkék","blueviolet":"ibolyakék","orchid":"orchidea","dimgray":"halványszürke","beige":"bézs","fuchsia":"fukszia","lavenderblush":"pirosas levendula","hotpink":"meleg rózsaszín","steelblue":"acélkék","tomato":"paradicsom","lightpink":"világos rózsaszín","limegreen":"limezöld","indianred":"indiánvörös","papayawhip":"papayahab","lightslategray":"világos palaszürke","gray":"szürke","mediumorchid":"közepes orchidea","cornsilk":"kukoricahaj","black":"fekete","seagreen":"tengerzöld","darkslateblue":"sötét palakék","khaki":"khakiszín","lightblue":"világoskék","palegreen":"halványzöld","azure":"azúrkék","peachpuff":"barackszín","darkolivegreen":"sötét olajzöld","yellowgreen":"sárgászöld"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Előző menüpontok","nextMessage":"További menüpontok"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Mégse","buttonSave":"Mentés","itemClose":"Bezárás"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_it-it.js b/lib/dojo/nls/tt-rss-layer_it-it.js
index d2df8f60a..280e60c15 100644
--- a/lib/dojo/nls/tt-rss-layer_it-it.js
+++ b/lib/dojo/nls/tt-rss-layer_it-it.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_it-it");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.it_it");dojo.nls.colors.it_it={"lightsteelblue":"blu acciao chiaro","orangered":"vermiglio","midnightblue":"blu melanzana scuro","cadetblue":"verde acqua","seashell":"sabbia rosa","slategrey":"grigio ardesia","coral":"corallo","darkturquoise":"turchese scuro","antiquewhite":"bianco antico","mediumspringgreen":"verde primavera medio","salmon":"salmone","darkgrey":"grigio scuro","ivory":"avorio","greenyellow":"giallo verde","mistyrose":"rosa pallido","lightsalmon":"salmone chiaro","silver":"grigio 25%","dimgrey":"grigio 80%","orange":"arancione","white":"bianco","navajowhite":"pesca chiaro","royalblue":"blu reale","deeppink":"ciclamino","lime":"verde fluorescente","oldlace":"mandorla","chartreuse":"verde brillante","darkcyan":"ciano scuro","yellow":"giallo","linen":"lino","olive":"verde oliva","gold":"oro","lawngreen":"verde prato","lightyellow":"giallo chiaro","tan":"grigio bruno","darkviolet":"viola scuro","lightslategrey":"grigio ardesia chiaro","grey":"grigio","darkkhaki":"kaki scuro","green":"verde","deepskyblue":"azzurro cielo scuro","aqua":"acqua","sienna":"cuoio","mintcream":"bianco nuvola","rosybrown":"marrone rosato","mediumslateblue":"blu ardesia medio","magenta":"magenta","lightseagreen":"verde mare chiaro","cyan":"ciano","olivedrab":"marrone oliva","darkgoldenrod":"ocra scuro","slateblue":"blu ardesia","mediumaquamarine":"acquamarina medio","lavender":"lavanda","mediumseagreen":"verde mare medio","maroon":"scarlatto","darkslategray":"grigio ardesia scuro","mediumturquoise":"turchese medio","ghostwhite":"bianco gesso","darkblue":"blu scuro","mediumvioletred":"vinaccia","brown":"marrone","lightgray":"grigio chiaro","sandybrown":"marrone sabbia","pink":"rosa","firebrick":"rosso mattone","indigo":"indaco","snow":"neve","darkorchid":"orchidea scuro","turquoise":"turchese","chocolate":"cioccolato","springgreen":"verde primavera","moccasin":"mocassino","navy":"blu notte","lemonchiffon":"caffelatte chiaro","teal":"verde turchese","floralwhite":"bianco giglio","cornflowerblue":"blu fiordaliso","paleturquoise":"turchese pallido","purple":"porpora","gainsboro":"grigio 10%","plum":"prugna","red":"rosso","blue":"blu","forestgreen":"verde foresta","darkgreen":"verde scuro","honeydew":"bianco germoglio","darkseagreen":"verde mare scuro","lightcoral":"rosa corallo","palevioletred":"vinaccia chiaro","mediumpurple":"porpora medio","saddlebrown":"cacao","darkmagenta":"magenta scuro","thistle":"rosa cenere","whitesmoke":"bianco fumo","wheat":"sabbia","violet":"viola","lightskyblue":"azzurro cielo chiaro","goldenrod":"ocra gialla","mediumblue":"blu medio","skyblue":"azzurro cielo","crimson":"cremisi","darksalmon":"salmone scuro","darkred":"rosso scuro","darkslategrey":"grigio ardesia scuro","peru":"marrone terra bruciata","lightgrey":"grigio chiaro","lightgoldenrodyellow":"giallo tenue","blanchedalmond":"mandorla chiaro","aliceblue":"blu alice","bisque":"incarnato","slategray":"grigio ardesia","palegoldenrod":"giallo zolfo chiaro","darkorange":"arancione scuro","aquamarine":"acquamarina","lightgreen":"verde chiaro","burlywood":"tabacco","dodgerblue":"blu d'oriente","darkgray":"grigio scuro","lightcyan":"ciano chiaro","powderblue":"azzurro polvere","blueviolet":"blu violetto","orchid":"orchidea","dimgray":"grigio 80%","beige":"beige","fuchsia":"fucsia","lavenderblush":"bianco rosato","hotpink":"rosa acceso","steelblue":"blu acciao","tomato":"pomodoro","lightpink":"rosa chiaro","limegreen":"verde lime","indianred":"terra indiana","papayawhip":"cipria","lightslategray":"grigio ardesia chiaro","gray":"grigio","mediumorchid":"orchidea medio","cornsilk":"crema","black":"nero","seagreen":"verde mare","darkslateblue":"blu ardesia scuro","khaki":"kaki","lightblue":"azzurro","palegreen":"verde pallido","azure":"azzurro ghiaccio","peachpuff":"pesca","darkolivegreen":"verde oliva scuro","yellowgreen":"giallo verde"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.it_it");dijit.nls.loading.it_it={"loadingState":"Caricamento in corso...","errorState":"Si è verificato un errore"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.it_it");dijit.nls.common.it_it={"buttonOk":"OK","buttonCancel":"Annulla","buttonSave":"Salva","itemClose":"Chiudi"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.it_it");dijit.form.nls.validate.it_it={"rangeMessage":"Questo valore non è compreso nell'intervallo.","invalidMessage":"Il valore immesso non è valido.","missingMessage":"Questo valore è obbligatorio."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.it_it");dijit.form.nls.ComboBox.it_it={"previousMessage":"Scelte precedenti","nextMessage":"Altre scelte"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.it_it");dojo.cldr.nls.number.it_it={"decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤ #,##0.00","decimal":",","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_it-it",{"dijit/form/nls/validate":{"rangeMessage":"Questo valore non è compreso nell'intervallo.","invalidMessage":"Il valore immesso non è valido.","missingMessage":"Questo valore è obbligatorio."},"dijit/nls/loading":{"loadingState":"Caricamento in corso...","errorState":"Si è verificato un errore"},"dojo/nls/colors":{"lightsteelblue":"blu acciaio chiaro","orangered":"vermiglio","midnightblue":"blu notte","cadetblue":"verde petrolio","seashell":"sabbia rosa","slategrey":"grigio ardesia","coral":"corallo","darkturquoise":"turchese scuro","antiquewhite":"rosa antico","mediumspringgreen":"verde brillante medio","transparent":"trasparente","salmon":"salmone","darkgrey":"grigio scuro","ivory":"avorio","greenyellow":"verde-giallo","mistyrose":"rosa pallido","lightsalmon":"salmone chiaro","silver":"argento","dimgrey":"grigio tenue","orange":"arancione","white":"bianco","navajowhite":"sabbia","royalblue":"royal blue","deeppink":"ciclamino","lime":"lime","oldlace":"mandorla","chartreuse":"verde brillante","darkcyan":"celeste scuro","yellow":"giallo","linen":"lino","olive":"verde oliva","gold":"oro","lawngreen":"verde brillante chiaro","lightyellow":"giallo chiaro","tan":"tan","darkviolet":"viola scuro","lightslategrey":"grigio ardesia chiaro","grey":"grigio","darkkhaki":"cachi scuro","green":"verde","deepskyblue":"azzurro intenso","aqua":"verde acqua","sienna":"terra di siena","mintcream":"bianco nuvola","rosybrown":"caffè latte","mediumslateblue":"blu ardesia medio","magenta":"magenta","lightseagreen":"verde acqua chiaro","cyan":"ciano","olivedrab":"verde bottiglia","darkgoldenrod":"ocra scuro","slateblue":"blu ardesia","mediumaquamarine":"acquamarina medio","lavender":"lavanda","mediumseagreen":"verde acqua medio","maroon":"Bordeaux","darkslategray":"grigio ardesia scuro","mediumturquoise":"turchese medio","ghostwhite":"bianco gesso","darkblue":"blu scuro","mediumvioletred":"violetto rosso medio","brown":"marrone","lightgray":"grigio chiaro","sandybrown":"argilla","pink":"rosa","firebrick":"mattone","indigo":"indaco","snow":"neve","darkorchid":"orchidea scuro","turquoise":"turchese","chocolate":"cioccolato","springgreen":"verde brillante","moccasin":"mocassino","navy":"blu scuro","lemonchiffon":"lemon chiffon","teal":"verde acqua","floralwhite":"bianco grigio","cornflowerblue":"blu fiordaliso","paleturquoise":"turchese pallido","purple":"viola","gainsboro":"gainsboro","plum":"prugna","red":"rosso","blue":"blu","forestgreen":"verde pino scuro","darkgreen":"verde scuro","honeydew":"miele","darkseagreen":"verde acqua scuro","lightcoral":"corallo chiaro","palevioletred":"violetto rosso pallido","mediumpurple":"viola medio","saddlebrown":"cacao","darkmagenta":"magenta scuro","thistle":"rosa cenere","whitesmoke":"bianco fumo","wheat":"tabacco","violet":"violetto","lightskyblue":"azzurro chiaro","goldenrod":"dorato","mediumblue":"blu medio","skyblue":"azzurro","crimson":"rosso scarlatto","darksalmon":"salmone scuro","darkred":"rosso scuro","darkslategrey":"grigio ardesia scuro","peru":"perù","lightgrey":"grigio chiaro","lightgoldenrodyellow":"giallo dorato chiaro","blanchedalmond":"beige 2","aliceblue":"bianco ghiaccio","bisque":"terracotta","slategray":"grigio ardesia","palegoldenrod":"dorato pallido","darkorange":"arancione scuro","aquamarine":"acquamarina","lightgreen":"verde chiaro","burlywood":"legno massiccio","dodgerblue":"dodger blue","darkgray":"grigio scuro","lightcyan":"ciano chiaro","powderblue":"azzurro polvere","blueviolet":"violetto bluastro","orchid":"orchidea","dimgray":"grigio tenue","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosa","hotpink":"rosa acceso","steelblue":"blu brillante","tomato":"pomodoro","lightpink":"rosa chiaro","limegreen":"verde lime","indianred":"terra indiana","papayawhip":"papaya","lightslategray":"grigio ardesia chiaro","gray":"grigio","mediumorchid":"orchidea medio","cornsilk":"crema","black":"nero","seagreen":"verde acqua","darkslateblue":"blu ardesia scuro","khaki":"cachi","lightblue":"blu chiaro","palegreen":"verde pallido","azure":"azure","peachpuff":"pesche","darkolivegreen":"verde oliva scuro","yellowgreen":"giallo verde"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Scelte precedenti","nextMessage":"Altre scelte"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Annulla","buttonSave":"Salva","itemClose":"Chiudi"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_it-it.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_it-it.js.uncompressed.js
new file mode 100644
index 000000000..7017f1736
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_it-it.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_it-it',{
+'dijit/form/nls/validate':{"rangeMessage":"Questo valore non è compreso nell'intervallo.","invalidMessage":"Il valore immesso non è valido.","missingMessage":"Questo valore è obbligatorio."}
+,
+'dijit/nls/loading':{"loadingState":"Caricamento in corso...","errorState":"Si è verificato un errore"}
+,
+'dojo/nls/colors':{"lightsteelblue":"blu acciaio chiaro","orangered":"vermiglio","midnightblue":"blu notte","cadetblue":"verde petrolio","seashell":"sabbia rosa","slategrey":"grigio ardesia","coral":"corallo","darkturquoise":"turchese scuro","antiquewhite":"rosa antico","mediumspringgreen":"verde brillante medio","transparent":"trasparente","salmon":"salmone","darkgrey":"grigio scuro","ivory":"avorio","greenyellow":"verde-giallo","mistyrose":"rosa pallido","lightsalmon":"salmone chiaro","silver":"argento","dimgrey":"grigio tenue","orange":"arancione","white":"bianco","navajowhite":"sabbia","royalblue":"royal blue","deeppink":"ciclamino","lime":"lime","oldlace":"mandorla","chartreuse":"verde brillante","darkcyan":"celeste scuro","yellow":"giallo","linen":"lino","olive":"verde oliva","gold":"oro","lawngreen":"verde brillante chiaro","lightyellow":"giallo chiaro","tan":"tan","darkviolet":"viola scuro","lightslategrey":"grigio ardesia chiaro","grey":"grigio","darkkhaki":"cachi scuro","green":"verde","deepskyblue":"azzurro intenso","aqua":"verde acqua","sienna":"terra di siena","mintcream":"bianco nuvola","rosybrown":"caffè latte","mediumslateblue":"blu ardesia medio","magenta":"magenta","lightseagreen":"verde acqua chiaro","cyan":"ciano","olivedrab":"verde bottiglia","darkgoldenrod":"ocra scuro","slateblue":"blu ardesia","mediumaquamarine":"acquamarina medio","lavender":"lavanda","mediumseagreen":"verde acqua medio","maroon":"Bordeaux","darkslategray":"grigio ardesia scuro","mediumturquoise":"turchese medio","ghostwhite":"bianco gesso","darkblue":"blu scuro","mediumvioletred":"violetto rosso medio","brown":"marrone","lightgray":"grigio chiaro","sandybrown":"argilla","pink":"rosa","firebrick":"mattone","indigo":"indaco","snow":"neve","darkorchid":"orchidea scuro","turquoise":"turchese","chocolate":"cioccolato","springgreen":"verde brillante","moccasin":"mocassino","navy":"blu scuro","lemonchiffon":"lemon chiffon","teal":"verde acqua","floralwhite":"bianco grigio","cornflowerblue":"blu fiordaliso","paleturquoise":"turchese pallido","purple":"viola","gainsboro":"gainsboro","plum":"prugna","red":"rosso","blue":"blu","forestgreen":"verde pino scuro","darkgreen":"verde scuro","honeydew":"miele","darkseagreen":"verde acqua scuro","lightcoral":"corallo chiaro","palevioletred":"violetto rosso pallido","mediumpurple":"viola medio","saddlebrown":"cacao","darkmagenta":"magenta scuro","thistle":"rosa cenere","whitesmoke":"bianco fumo","wheat":"tabacco","violet":"violetto","lightskyblue":"azzurro chiaro","goldenrod":"dorato","mediumblue":"blu medio","skyblue":"azzurro","crimson":"rosso scarlatto","darksalmon":"salmone scuro","darkred":"rosso scuro","darkslategrey":"grigio ardesia scuro","peru":"perù","lightgrey":"grigio chiaro","lightgoldenrodyellow":"giallo dorato chiaro","blanchedalmond":"beige 2","aliceblue":"bianco ghiaccio","bisque":"terracotta","slategray":"grigio ardesia","palegoldenrod":"dorato pallido","darkorange":"arancione scuro","aquamarine":"acquamarina","lightgreen":"verde chiaro","burlywood":"legno massiccio","dodgerblue":"dodger blue","darkgray":"grigio scuro","lightcyan":"ciano chiaro","powderblue":"azzurro polvere","blueviolet":"violetto bluastro","orchid":"orchidea","dimgray":"grigio tenue","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosa","hotpink":"rosa acceso","steelblue":"blu brillante","tomato":"pomodoro","lightpink":"rosa chiaro","limegreen":"verde lime","indianred":"terra indiana","papayawhip":"papaya","lightslategray":"grigio ardesia chiaro","gray":"grigio","mediumorchid":"orchidea medio","cornsilk":"crema","black":"nero","seagreen":"verde acqua","darkslateblue":"blu ardesia scuro","khaki":"cachi","lightblue":"blu chiaro","palegreen":"verde pallido","azure":"azure","peachpuff":"pesche","darkolivegreen":"verde oliva scuro","yellowgreen":"giallo verde"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Scelte precedenti","nextMessage":"Altre scelte"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Annulla","buttonSave":"Salva","itemClose":"Chiudi"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_it.js b/lib/dojo/nls/tt-rss-layer_it.js
deleted file mode 100644
index e34368d15..000000000
--- a/lib/dojo/nls/tt-rss-layer_it.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dojo.nls.tt-rss-layer_it");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.it");dojo.nls.colors.it={"lightsteelblue":"blu acciao chiaro","orangered":"vermiglio","midnightblue":"blu melanzana scuro","cadetblue":"verde acqua","seashell":"sabbia rosa","slategrey":"grigio ardesia","coral":"corallo","darkturquoise":"turchese scuro","antiquewhite":"bianco antico","mediumspringgreen":"verde primavera medio","salmon":"salmone","darkgrey":"grigio scuro","ivory":"avorio","greenyellow":"giallo verde","mistyrose":"rosa pallido","lightsalmon":"salmone chiaro","silver":"grigio 25%","dimgrey":"grigio 80%","orange":"arancione","white":"bianco","navajowhite":"pesca chiaro","royalblue":"blu reale","deeppink":"ciclamino","lime":"verde fluorescente","oldlace":"mandorla","chartreuse":"verde brillante","darkcyan":"ciano scuro","yellow":"giallo","linen":"lino","olive":"verde oliva","gold":"oro","lawngreen":"verde prato","lightyellow":"giallo chiaro","tan":"grigio bruno","darkviolet":"viola scuro","lightslategrey":"grigio ardesia chiaro","grey":"grigio","darkkhaki":"kaki scuro","green":"verde","deepskyblue":"azzurro cielo scuro","aqua":"acqua","sienna":"cuoio","mintcream":"bianco nuvola","rosybrown":"marrone rosato","mediumslateblue":"blu ardesia medio","magenta":"magenta","lightseagreen":"verde mare chiaro","cyan":"ciano","olivedrab":"marrone oliva","darkgoldenrod":"ocra scuro","slateblue":"blu ardesia","mediumaquamarine":"acquamarina medio","lavender":"lavanda","mediumseagreen":"verde mare medio","maroon":"scarlatto","darkslategray":"grigio ardesia scuro","mediumturquoise":"turchese medio","ghostwhite":"bianco gesso","darkblue":"blu scuro","mediumvioletred":"vinaccia","brown":"marrone","lightgray":"grigio chiaro","sandybrown":"marrone sabbia","pink":"rosa","firebrick":"rosso mattone","indigo":"indaco","snow":"neve","darkorchid":"orchidea scuro","turquoise":"turchese","chocolate":"cioccolato","springgreen":"verde primavera","moccasin":"mocassino","navy":"blu notte","lemonchiffon":"caffelatte chiaro","teal":"verde turchese","floralwhite":"bianco giglio","cornflowerblue":"blu fiordaliso","paleturquoise":"turchese pallido","purple":"porpora","gainsboro":"grigio 10%","plum":"prugna","red":"rosso","blue":"blu","forestgreen":"verde foresta","darkgreen":"verde scuro","honeydew":"bianco germoglio","darkseagreen":"verde mare scuro","lightcoral":"rosa corallo","palevioletred":"vinaccia chiaro","mediumpurple":"porpora medio","saddlebrown":"cacao","darkmagenta":"magenta scuro","thistle":"rosa cenere","whitesmoke":"bianco fumo","wheat":"sabbia","violet":"viola","lightskyblue":"azzurro cielo chiaro","goldenrod":"ocra gialla","mediumblue":"blu medio","skyblue":"azzurro cielo","crimson":"cremisi","darksalmon":"salmone scuro","darkred":"rosso scuro","darkslategrey":"grigio ardesia scuro","peru":"marrone terra bruciata","lightgrey":"grigio chiaro","lightgoldenrodyellow":"giallo tenue","blanchedalmond":"mandorla chiaro","aliceblue":"blu alice","bisque":"incarnato","slategray":"grigio ardesia","palegoldenrod":"giallo zolfo chiaro","darkorange":"arancione scuro","aquamarine":"acquamarina","lightgreen":"verde chiaro","burlywood":"tabacco","dodgerblue":"blu d'oriente","darkgray":"grigio scuro","lightcyan":"ciano chiaro","powderblue":"azzurro polvere","blueviolet":"blu violetto","orchid":"orchidea","dimgray":"grigio 80%","beige":"beige","fuchsia":"fucsia","lavenderblush":"bianco rosato","hotpink":"rosa acceso","steelblue":"blu acciao","tomato":"pomodoro","lightpink":"rosa chiaro","limegreen":"verde lime","indianred":"terra indiana","papayawhip":"cipria","lightslategray":"grigio ardesia chiaro","gray":"grigio","mediumorchid":"orchidea medio","cornsilk":"crema","black":"nero","seagreen":"verde mare","darkslateblue":"blu ardesia scuro","khaki":"kaki","lightblue":"azzurro","palegreen":"verde pallido","azure":"azzurro ghiaccio","peachpuff":"pesca","darkolivegreen":"verde oliva scuro","yellowgreen":"giallo verde"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.it");dijit.nls.loading.it={"loadingState":"Caricamento in corso...","errorState":"Si è verificato un errore"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.it");dijit.nls.common.it={"buttonOk":"OK","buttonCancel":"Annulla","buttonSave":"Salva","itemClose":"Chiudi"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.it");dijit.form.nls.validate.it={"rangeMessage":"Questo valore non è compreso nell'intervallo.","invalidMessage":"Il valore immesso non è valido.","missingMessage":"Questo valore è obbligatorio."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.it");dijit.form.nls.ComboBox.it={"previousMessage":"Scelte precedenti","nextMessage":"Altre scelte"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.it");dojo.cldr.nls.number.it={"decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤ #,##0.00","decimal":",","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
diff --git a/lib/dojo/nls/tt-rss-layer_ja-jp.js b/lib/dojo/nls/tt-rss-layer_ja-jp.js
index 016cf5d5c..a16c85f20 100644
--- a/lib/dojo/nls/tt-rss-layer_ja-jp.js
+++ b/lib/dojo/nls/tt-rss-layer_ja-jp.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_ja-jp");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ja_jp");dojo.nls.colors.ja_jp={"lightsteelblue":"ライト・スチール・ブルー","orangered":"オレンジ・レッド","midnightblue":"ミッドナイト・ブルー","cadetblue":"くすんだ青","seashell":"シーシェル","slategrey":"スレート・グレイ","coral":"珊瑚","darkturquoise":"ダーク・ターコイズ","antiquewhite":"アンティーク・ホワイト","mediumspringgreen":"ミディアム・スプリング・グリーン","salmon":"サーモン","darkgrey":"ダーク・グレイ","ivory":"アイボリー","greenyellow":"緑黄色","mistyrose":"ミスティ・ローズ","lightsalmon":"ライト・サーモン","silver":"銀","dimgrey":"くすんだグレイ","orange":"オレンジ","white":"白","navajowhite":"ナバホ・ホワイト","royalblue":"藤色","deeppink":"濃いピンク","lime":"ライム","oldlace":"オールド・レイス","chartreuse":"淡黄緑","darkcyan":"ダーク・シアン・ブルー","yellow":"黄","linen":"亜麻色","olive":"オリーブ","gold":"金","lawngreen":"ローン・グリーン","lightyellow":"ライト・イエロー","tan":"茶褐色","darkviolet":"ダーク・バイオレット","lightslategrey":"ライト・スレート・グレイ","grey":"グレイ","darkkhaki":"ダーク・カーキー","green":"緑","deepskyblue":"濃い空色","aqua":"アクア","sienna":"黄褐色","mintcream":"ミント・クリーム","rosybrown":"ロージー・ブラウン","mediumslateblue":"ミディアム・スレート・ブルー","magenta":"赤紫","lightseagreen":"ライト・シー・グリーン","cyan":"シアン・ブルー","olivedrab":"濃黄緑","darkgoldenrod":"ダーク・ゴールデン・ロッド","slateblue":"スレート・ブルー","mediumaquamarine":"ミディアム・アクアマリーン","lavender":"ラベンダー","mediumseagreen":"ミディアム・シー・グリーン","maroon":"えび茶","darkslategray":"ダーク・スレート・グレイ","mediumturquoise":"ミディアム・ターコイズ","ghostwhite":"ゴースト・ホワイト","darkblue":"ダーク・ブルー","mediumvioletred":"ミディアム・バイオレット・レッド","brown":"茶","lightgray":"ライト・グレイ","sandybrown":"砂褐色","pink":"ピンク","firebrick":"赤煉瓦色","indigo":"藍色","snow":"雪色","darkorchid":"ダーク・オーキッド","turquoise":"ターコイズ","chocolate":"チョコレート","springgreen":"スプリング・グリーン","moccasin":"モカシン","navy":"濃紺","lemonchiffon":"レモン・シフォン","teal":"ティール","floralwhite":"フローラル・ホワイト","cornflowerblue":"コーンフラワー・ブルー","paleturquoise":"ペイル・ターコイズ","purple":"紫","gainsboro":"ゲインズボーロ","plum":"深紫","red":"赤","blue":"青","forestgreen":"フォレスト・グリーン","darkgreen":"ダーク・グリーン","honeydew":"ハニーデュー","darkseagreen":"ダーク・シー・グリーン","lightcoral":"ライト・コーラル","palevioletred":"ペイル・バイオレット・レッド","mediumpurple":"ミディアム・パープル","saddlebrown":"サドル・ブラウン","darkmagenta":"ダーク・マジェンタ","thistle":"シスル","whitesmoke":"ホワイト・スモーク","wheat":"小麦色","violet":"すみれ色","lightskyblue":"ライト・スカイ・ブルー","goldenrod":"ゴールデン・ロッド","mediumblue":"ミディアム・ブルー","skyblue":"スカイ・ブルー","crimson":"深紅","darksalmon":"ダーク・サーモン","darkred":"ダーク・レッド","darkslategrey":"ダーク・スレート・グレイ","peru":"ペルー","lightgrey":"ライト・グレイ","lightgoldenrodyellow":"ライト・ゴールデン・ロッド・イエロー","blanchedalmond":"皮なしアーモンド","aliceblue":"アリス・ブルー","bisque":"ビスク","slategray":"スレート・グレイ","palegoldenrod":"ペイル・ゴールデン・ロッド","darkorange":"ダーク・オレンジ","aquamarine":"碧緑","lightgreen":"ライト・グリーン","burlywood":"バーリーウッド","dodgerblue":"ドッジャー・ブルー","darkgray":"ダーク・グレイ","lightcyan":"ライト・シアン","powderblue":"淡青","blueviolet":"青紫","orchid":"薄紫","dimgray":"くすんだグレイ","beige":"ベージュ","fuchsia":"紫紅色","lavenderblush":"ラベンダー・ブラッシ","hotpink":"ホット・ピンク","steelblue":"鋼色","tomato":"トマト色","lightpink":"ライト・ピンク","limegreen":"ライム・グリーン","indianred":"インディアン・レッド","papayawhip":"パパイア・ホイップ","lightslategray":"ライト・スレート・グレイ","gray":"グレイ","mediumorchid":"ミディアム・オーキッド","cornsilk":"コーンシルク","black":"黒","seagreen":"シー・グリーン","darkslateblue":"ダーク・スレート・ブルー","khaki":"カーキー","lightblue":"ライト・ブルー","palegreen":"ペイル・グリーン","azure":"薄い空色","peachpuff":"ピーチ・パフ","darkolivegreen":"ダーク・オリーブ・グリーン","yellowgreen":"黄緑"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ja_jp");dijit.nls.loading.ja_jp={"loadingState":"ロード中...","errorState":"エラーが発生しました。"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ja_jp");dijit.nls.common.ja_jp={"buttonOk":"OK","buttonCancel":"キャンセル","buttonSave":"保存","itemClose":"閉じる"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ja_jp");dijit.form.nls.validate.ja_jp={"rangeMessage":"この値は範囲外です。","invalidMessage":"入力した値は無効です。","missingMessage":"この値は必須です。"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ja_jp");dijit.form.nls.ComboBox.ja_jp={"previousMessage":"以前の選択項目","nextMessage":"追加の選択項目"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ja_jp");dojo.cldr.nls.number.ja_jp={"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_ja-jp",{"dijit/form/nls/validate":{"rangeMessage":"この値は範囲外です。","invalidMessage":"入力した値は無効です。","missingMessage":"この値は必須です。"},"dijit/nls/loading":{"loadingState":"ロード中...","errorState":"エラーが発生しました。"},"dojo/nls/colors":{"lightsteelblue":"ライトスチールブルー","orangered":"オレンジレッド","midnightblue":"ミッドナイトブルー","cadetblue":"くすんだ青","seashell":"シーシェル","slategrey":"スレートグレイ","coral":"珊瑚","darkturquoise":"ダークターコイズ","antiquewhite":"アンティークホワイト","mediumspringgreen":"ミディアムスプリンググリーン","transparent":"透明","salmon":"サーモン","darkgrey":"ダークグレイ","ivory":"アイボリー","greenyellow":"緑黄色","mistyrose":"ミスティローズ","lightsalmon":"ライトサーモン","silver":"銀","dimgrey":"くすんだグレイ","orange":"オレンジ","white":"白","navajowhite":"ナバホホワイト","royalblue":"藤色","deeppink":"濃いピンク","lime":"ライム","oldlace":"オールドレイス","chartreuse":"淡黄緑","darkcyan":"ダークシアンブルー","yellow":"黄","linen":"亜麻色","olive":"オリーブ","gold":"金","lawngreen":"ローングリーン","lightyellow":"ライトイエロー","tan":"茶褐色","darkviolet":"ダークバイオレット","lightslategrey":"ライトスレートグレイ","grey":"グレイ","darkkhaki":"ダークカーキ","green":"緑","deepskyblue":"濃い空色","aqua":"アクア","sienna":"黄褐色","mintcream":"ミントクリーム","rosybrown":"ロージーブラウン","mediumslateblue":"ミディアムスレートブルー","magenta":"赤紫","lightseagreen":"ライトシーグリーン","cyan":"シアンブルー","olivedrab":"濃黄緑","darkgoldenrod":"ダークゴールデンロッド","slateblue":"スレートブルー","mediumaquamarine":"ミディアムアクアマリーン","lavender":"ラベンダー","mediumseagreen":"ミディアムシーグリーン","maroon":"えび茶","darkslategray":"ダークスレートグレイ","mediumturquoise":"ミディアムターコイズ","ghostwhite":"ゴーストホワイト","darkblue":"ダークブルー","mediumvioletred":"ミディアムバイオレットレッド","brown":"茶","lightgray":"ライトグレイ","sandybrown":"砂褐色","pink":"ピンク","firebrick":"赤煉瓦色","indigo":"藍色","snow":"雪色","darkorchid":"ダークオーキッド","turquoise":"ターコイズ","chocolate":"チョコレート","springgreen":"スプリンググリーン","moccasin":"モカシン","navy":"濃紺","lemonchiffon":"レモンシフォン","teal":"ティール","floralwhite":"フローラルホワイト","cornflowerblue":"コーンフラワーブルー","paleturquoise":"ペイルターコイズ","purple":"紫","gainsboro":"ゲインズボーロ","plum":"深紫","red":"赤","blue":"青","forestgreen":"フォレストグリーン","darkgreen":"ダークグリーン","honeydew":"ハニーデュー","darkseagreen":"ダークシーグリーン","lightcoral":"ライトコーラル","palevioletred":"ペイルバイオレットレッド","mediumpurple":"ミディアムパープル","saddlebrown":"サドルブラウン","darkmagenta":"ダークマジェンタ","thistle":"シスル","whitesmoke":"ホワイトスモーク","wheat":"小麦色","violet":"すみれ色","lightskyblue":"ライトスカイブルー","goldenrod":"ゴールデンロッド","mediumblue":"ミディアムブルー","skyblue":"スカイブルー","crimson":"深紅","darksalmon":"ダークサーモン","darkred":"ダークレッド","darkslategrey":"ダークスレートグレイ","peru":"ペルー","lightgrey":"ライトグレイ","lightgoldenrodyellow":"ライトゴールデンロッドイエロー","blanchedalmond":"皮なしアーモンド","aliceblue":"アリスブルー","bisque":"ビスク","slategray":"スレートグレイ","palegoldenrod":"ペイルゴールデンロッド","darkorange":"ダークオレンジ","aquamarine":"碧緑","lightgreen":"ライトグリーン","burlywood":"バーリーウッド","dodgerblue":"ドッジャーブルー","darkgray":"ダークグレイ","lightcyan":"ライトシアン","powderblue":"淡青","blueviolet":"青紫","orchid":"薄紫","dimgray":"くすんだグレイ","beige":"ベージュ","fuchsia":"紫紅色","lavenderblush":"ラベンダーブラッシ","hotpink":"ホットピンク","steelblue":"鋼色","tomato":"トマト色","lightpink":"ライトピンク","limegreen":"ライムグリーン","indianred":"インディアンレッド","papayawhip":"パパイアホイップ","lightslategray":"ライトスレートグレイ","gray":"グレイ","mediumorchid":"ミディアムオーキッド","cornsilk":"コーンシルク","black":"黒","seagreen":"シーグリーン","darkslateblue":"ダークスレートブルー","khaki":"カーキ","lightblue":"ライトブルー","palegreen":"ペイルグリーン","azure":"薄い空色","peachpuff":"ピーチパフ","darkolivegreen":"ダークオリーブグリーン","yellowgreen":"黄緑"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"以前の選択項目","nextMessage":"追加の選択項目"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"キャンセル","buttonSave":"保存","itemClose":"閉じる"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_ja-jp.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_ja-jp.js.uncompressed.js
new file mode 100644
index 000000000..8b0a245e6
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_ja-jp.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_ja-jp',{
+'dijit/form/nls/validate':{"rangeMessage":"この値は範囲外です。","invalidMessage":"入力した値は無効です。","missingMessage":"この値は必須です。"}
+,
+'dijit/nls/loading':{"loadingState":"ロード中...","errorState":"エラーが発生しました。"}
+,
+'dojo/nls/colors':{"lightsteelblue":"ライトスチールブルー","orangered":"オレンジレッド","midnightblue":"ミッドナイトブルー","cadetblue":"くすんだ青","seashell":"シーシェル","slategrey":"スレートグレイ","coral":"珊瑚","darkturquoise":"ダークターコイズ","antiquewhite":"アンティークホワイト","mediumspringgreen":"ミディアムスプリンググリーン","transparent":"透明","salmon":"サーモン","darkgrey":"ダークグレイ","ivory":"アイボリー","greenyellow":"緑黄色","mistyrose":"ミスティローズ","lightsalmon":"ライトサーモン","silver":"銀","dimgrey":"くすんだグレイ","orange":"オレンジ","white":"白","navajowhite":"ナバホホワイト","royalblue":"藤色","deeppink":"濃いピンク","lime":"ライム","oldlace":"オールドレイス","chartreuse":"淡黄緑","darkcyan":"ダークシアンブルー","yellow":"黄","linen":"亜麻色","olive":"オリーブ","gold":"金","lawngreen":"ローングリーン","lightyellow":"ライトイエロー","tan":"茶褐色","darkviolet":"ダークバイオレット","lightslategrey":"ライトスレートグレイ","grey":"グレイ","darkkhaki":"ダークカーキ","green":"緑","deepskyblue":"濃い空色","aqua":"アクア","sienna":"黄褐色","mintcream":"ミントクリーム","rosybrown":"ロージーブラウン","mediumslateblue":"ミディアムスレートブルー","magenta":"赤紫","lightseagreen":"ライトシーグリーン","cyan":"シアンブルー","olivedrab":"濃黄緑","darkgoldenrod":"ダークゴールデンロッド","slateblue":"スレートブルー","mediumaquamarine":"ミディアムアクアマリーン","lavender":"ラベンダー","mediumseagreen":"ミディアムシーグリーン","maroon":"えび茶","darkslategray":"ダークスレートグレイ","mediumturquoise":"ミディアムターコイズ","ghostwhite":"ゴーストホワイト","darkblue":"ダークブルー","mediumvioletred":"ミディアムバイオレットレッド","brown":"茶","lightgray":"ライトグレイ","sandybrown":"砂褐色","pink":"ピンク","firebrick":"赤煉瓦色","indigo":"藍色","snow":"雪色","darkorchid":"ダークオーキッド","turquoise":"ターコイズ","chocolate":"チョコレート","springgreen":"スプリンググリーン","moccasin":"モカシン","navy":"濃紺","lemonchiffon":"レモンシフォン","teal":"ティール","floralwhite":"フローラルホワイト","cornflowerblue":"コーンフラワーブルー","paleturquoise":"ペイルターコイズ","purple":"紫","gainsboro":"ゲインズボーロ","plum":"深紫","red":"赤","blue":"青","forestgreen":"フォレストグリーン","darkgreen":"ダークグリーン","honeydew":"ハニーデュー","darkseagreen":"ダークシーグリーン","lightcoral":"ライトコーラル","palevioletred":"ペイルバイオレットレッド","mediumpurple":"ミディアムパープル","saddlebrown":"サドルブラウン","darkmagenta":"ダークマジェンタ","thistle":"シスル","whitesmoke":"ホワイトスモーク","wheat":"小麦色","violet":"すみれ色","lightskyblue":"ライトスカイブルー","goldenrod":"ゴールデンロッド","mediumblue":"ミディアムブルー","skyblue":"スカイブルー","crimson":"深紅","darksalmon":"ダークサーモン","darkred":"ダークレッド","darkslategrey":"ダークスレートグレイ","peru":"ペルー","lightgrey":"ライトグレイ","lightgoldenrodyellow":"ライトゴールデンロッドイエロー","blanchedalmond":"皮なしアーモンド","aliceblue":"アリスブルー","bisque":"ビスク","slategray":"スレートグレイ","palegoldenrod":"ペイルゴールデンロッド","darkorange":"ダークオレンジ","aquamarine":"碧緑","lightgreen":"ライトグリーン","burlywood":"バーリーウッド","dodgerblue":"ドッジャーブルー","darkgray":"ダークグレイ","lightcyan":"ライトシアン","powderblue":"淡青","blueviolet":"青紫","orchid":"薄紫","dimgray":"くすんだグレイ","beige":"ベージュ","fuchsia":"紫紅色","lavenderblush":"ラベンダーブラッシ","hotpink":"ホットピンク","steelblue":"鋼色","tomato":"トマト色","lightpink":"ライトピンク","limegreen":"ライムグリーン","indianred":"インディアンレッド","papayawhip":"パパイアホイップ","lightslategray":"ライトスレートグレイ","gray":"グレイ","mediumorchid":"ミディアムオーキッド","cornsilk":"コーンシルク","black":"黒","seagreen":"シーグリーン","darkslateblue":"ダークスレートブルー","khaki":"カーキ","lightblue":"ライトブルー","palegreen":"ペイルグリーン","azure":"薄い空色","peachpuff":"ピーチパフ","darkolivegreen":"ダークオリーブグリーン","yellowgreen":"黄緑"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"以前の選択項目","nextMessage":"追加の選択項目"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"キャンセル","buttonSave":"保存","itemClose":"閉じる"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_ja.js b/lib/dojo/nls/tt-rss-layer_ja.js
deleted file mode 100644
index 13da053da..000000000
--- a/lib/dojo/nls/tt-rss-layer_ja.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dojo.nls.tt-rss-layer_ja");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ja");dojo.nls.colors.ja={"lightsteelblue":"ライト・スチール・ブルー","orangered":"オレンジ・レッド","midnightblue":"ミッドナイト・ブルー","cadetblue":"くすんだ青","seashell":"シーシェル","slategrey":"スレート・グレイ","coral":"珊瑚","darkturquoise":"ダーク・ターコイズ","antiquewhite":"アンティーク・ホワイト","mediumspringgreen":"ミディアム・スプリング・グリーン","salmon":"サーモン","darkgrey":"ダーク・グレイ","ivory":"アイボリー","greenyellow":"緑黄色","mistyrose":"ミスティ・ローズ","lightsalmon":"ライト・サーモン","silver":"銀","dimgrey":"くすんだグレイ","orange":"オレンジ","white":"白","navajowhite":"ナバホ・ホワイト","royalblue":"藤色","deeppink":"濃いピンク","lime":"ライム","oldlace":"オールド・レイス","chartreuse":"淡黄緑","darkcyan":"ダーク・シアン・ブルー","yellow":"黄","linen":"亜麻色","olive":"オリーブ","gold":"金","lawngreen":"ローン・グリーン","lightyellow":"ライト・イエロー","tan":"茶褐色","darkviolet":"ダーク・バイオレット","lightslategrey":"ライト・スレート・グレイ","grey":"グレイ","darkkhaki":"ダーク・カーキー","green":"緑","deepskyblue":"濃い空色","aqua":"アクア","sienna":"黄褐色","mintcream":"ミント・クリーム","rosybrown":"ロージー・ブラウン","mediumslateblue":"ミディアム・スレート・ブルー","magenta":"赤紫","lightseagreen":"ライト・シー・グリーン","cyan":"シアン・ブルー","olivedrab":"濃黄緑","darkgoldenrod":"ダーク・ゴールデン・ロッド","slateblue":"スレート・ブルー","mediumaquamarine":"ミディアム・アクアマリーン","lavender":"ラベンダー","mediumseagreen":"ミディアム・シー・グリーン","maroon":"えび茶","darkslategray":"ダーク・スレート・グレイ","mediumturquoise":"ミディアム・ターコイズ","ghostwhite":"ゴースト・ホワイト","darkblue":"ダーク・ブルー","mediumvioletred":"ミディアム・バイオレット・レッド","brown":"茶","lightgray":"ライト・グレイ","sandybrown":"砂褐色","pink":"ピンク","firebrick":"赤煉瓦色","indigo":"藍色","snow":"雪色","darkorchid":"ダーク・オーキッド","turquoise":"ターコイズ","chocolate":"チョコレート","springgreen":"スプリング・グリーン","moccasin":"モカシン","navy":"濃紺","lemonchiffon":"レモン・シフォン","teal":"ティール","floralwhite":"フローラル・ホワイト","cornflowerblue":"コーンフラワー・ブルー","paleturquoise":"ペイル・ターコイズ","purple":"紫","gainsboro":"ゲインズボーロ","plum":"深紫","red":"赤","blue":"青","forestgreen":"フォレスト・グリーン","darkgreen":"ダーク・グリーン","honeydew":"ハニーデュー","darkseagreen":"ダーク・シー・グリーン","lightcoral":"ライト・コーラル","palevioletred":"ペイル・バイオレット・レッド","mediumpurple":"ミディアム・パープル","saddlebrown":"サドル・ブラウン","darkmagenta":"ダーク・マジェンタ","thistle":"シスル","whitesmoke":"ホワイト・スモーク","wheat":"小麦色","violet":"すみれ色","lightskyblue":"ライト・スカイ・ブルー","goldenrod":"ゴールデン・ロッド","mediumblue":"ミディアム・ブルー","skyblue":"スカイ・ブルー","crimson":"深紅","darksalmon":"ダーク・サーモン","darkred":"ダーク・レッド","darkslategrey":"ダーク・スレート・グレイ","peru":"ペルー","lightgrey":"ライト・グレイ","lightgoldenrodyellow":"ライト・ゴールデン・ロッド・イエロー","blanchedalmond":"皮なしアーモンド","aliceblue":"アリス・ブルー","bisque":"ビスク","slategray":"スレート・グレイ","palegoldenrod":"ペイル・ゴールデン・ロッド","darkorange":"ダーク・オレンジ","aquamarine":"碧緑","lightgreen":"ライト・グリーン","burlywood":"バーリーウッド","dodgerblue":"ドッジャー・ブルー","darkgray":"ダーク・グレイ","lightcyan":"ライト・シアン","powderblue":"淡青","blueviolet":"青紫","orchid":"薄紫","dimgray":"くすんだグレイ","beige":"ベージュ","fuchsia":"紫紅色","lavenderblush":"ラベンダー・ブラッシ","hotpink":"ホット・ピンク","steelblue":"鋼色","tomato":"トマト色","lightpink":"ライト・ピンク","limegreen":"ライム・グリーン","indianred":"インディアン・レッド","papayawhip":"パパイア・ホイップ","lightslategray":"ライト・スレート・グレイ","gray":"グレイ","mediumorchid":"ミディアム・オーキッド","cornsilk":"コーンシルク","black":"黒","seagreen":"シー・グリーン","darkslateblue":"ダーク・スレート・ブルー","khaki":"カーキー","lightblue":"ライト・ブルー","palegreen":"ペイル・グリーン","azure":"薄い空色","peachpuff":"ピーチ・パフ","darkolivegreen":"ダーク・オリーブ・グリーン","yellowgreen":"黄緑"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ja");dijit.nls.loading.ja={"loadingState":"ロード中...","errorState":"エラーが発生しました。"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ja");dijit.nls.common.ja={"buttonOk":"OK","buttonCancel":"キャンセル","buttonSave":"保存","itemClose":"閉じる"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ja");dijit.form.nls.validate.ja={"rangeMessage":"この値は範囲外です。","invalidMessage":"入力した値は無効です。","missingMessage":"この値は必須です。"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ja");dijit.form.nls.ComboBox.ja={"previousMessage":"以前の選択項目","nextMessage":"追加の選択項目"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ja");dojo.cldr.nls.number.ja={"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
diff --git a/lib/dojo/nls/tt-rss-layer_ko-kr.js b/lib/dojo/nls/tt-rss-layer_ko-kr.js
index 36e6ab5bf..80f3f6b60 100644
--- a/lib/dojo/nls/tt-rss-layer_ko-kr.js
+++ b/lib/dojo/nls/tt-rss-layer_ko-kr.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_ko-kr");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ko_kr");dojo.nls.colors.ko_kr={"lightsteelblue":"라이트 스틸 블루(light steel blue)","orangered":"오렌지 레드(orange red)","midnightblue":"미드나잇 블루(midnight blue)","cadetblue":"카뎃 블루(cadet blue)","seashell":"씨쉘(seashell)","slategrey":"슬레이트 그레이(slate gray)","coral":"코랄(coral)","darkturquoise":"다크 터콰즈(dark turquoise)","antiquewhite":"앤틱 화이트(antique white)","mediumspringgreen":"미디엄 스프링 그린(medium spring green)","salmon":"샐몬(salmon)","darkgrey":"다크 그레이(dark gray)","ivory":"아이보리(ivory)","greenyellow":"그린 옐로우(green-yellow)","mistyrose":"미스티 로즈(misty rose)","lightsalmon":"라이트 샐몬(light salmon)","silver":"실버(silver)","dimgrey":"딤 그레이(dim gray)","orange":"오렌지(orange)","white":"화이트(white)","navajowhite":"나바호 화이트(navajo white)","royalblue":"로얄 블루(royal blue)","deeppink":"딥 핑크(deep pink)","lime":"라임(lime)","oldlace":"올드 레이스(old lace)","chartreuse":"샤르트뢰즈(chartreuse)","darkcyan":"다크 시안(dark cyan)","yellow":"옐로우(yellow)","linen":"리넨(linen)","olive":"올리브(olive)","gold":"골드(gold)","lawngreen":"론 그린(lawn green)","lightyellow":"라이트 옐로우(light yellow)","tan":"탠(tan)","darkviolet":"다크 바이올렛(dark violet)","lightslategrey":"라이트 슬레이트 그레이(light slate gray)","grey":"그레이(gray)","darkkhaki":"다크 카키(dark khaki)","green":"그린(green)","deepskyblue":"딥 스카이 블루(deep sky blue)","aqua":"아쿠아(aqua)","sienna":"시에나(sienna)","mintcream":"민트 크림(mint cream)","rosybrown":"로지 브라운(rosy brown)","mediumslateblue":"미디엄 슬레이트 블루(medium slate blue)","magenta":"마젠타(magenta)","lightseagreen":"라이트 씨 그린(light sea green)","cyan":"시안(cyan)","olivedrab":"올리브 드랩(olive drab)","darkgoldenrod":"다크 골든로드(dark goldenrod)","slateblue":"슬레이트 블루(slate blue)","mediumaquamarine":"미디엄 아쿠아마린(medium aquamarine)","lavender":"라벤더(lavender)","mediumseagreen":"미디엄 씨 그린(medium sea green)","maroon":"마룬(maroon)","darkslategray":"다크 슬레이트 그레이(dark slate gray)","mediumturquoise":"미디엄 터콰즈(medium turquoise)","ghostwhite":"고스트 화이트(ghost white)","darkblue":"다크 블루(dark blue)","mediumvioletred":"미디엄 바이올렛 레드(medium violet-red)","brown":"브라운(brown)","lightgray":"라이트 그레이(light gray)","sandybrown":"샌디 브라운(sandy brown)","pink":"핑크(pink)","firebrick":"파이어 브릭(fire brick)","indigo":"인디고(indigo)","snow":"스노우(snow)","darkorchid":"다크 오키드(dark orchid)","turquoise":"터콰즈(turquoise)","chocolate":"초콜렛(chocolate)","springgreen":"스프링 그린(spring green)","moccasin":"모카신(moccasin)","navy":"네이비(navy)","lemonchiffon":"레몬 쉬폰(lemon chiffon)","teal":"틸(teal)","floralwhite":"플로랄 화이트(floral white)","cornflowerblue":"콘플라워 블루(cornflower blue)","paleturquoise":"페일 터콰즈(pale turquoise)","purple":"퍼플(purple)","gainsboro":"게인스브로(gainsboro)","plum":"플럼(plum)","red":"레드(red)","blue":"블루(blue)","forestgreen":"포레스트 그린(forest green)","darkgreen":"다크 그린(dark green)","honeydew":"허니듀(honeydew)","darkseagreen":"다크 씨 그린(dark sea green)","lightcoral":"라이트 코랄(light coral)","palevioletred":"페일 바이올렛 레드(pale violet-red)","mediumpurple":"미디엄 퍼플(medium purple)","saddlebrown":"새들 브라운(saddle brown)","darkmagenta":"다크 마젠타(dark magenta)","thistle":"시슬(thistle)","whitesmoke":"화이트 스모크(white smoke)","wheat":"휘트(wheat)","violet":"바이올렛(violet)","lightskyblue":"라이트 스카이 블루(light sky blue)","goldenrod":"골든로드(goldenrod)","mediumblue":"미디엄 블루(medium blue)","skyblue":"스카이 블루(sky blue)","crimson":"크림슨(crimson)","darksalmon":"다크 샐몬(dark salmon)","darkred":"다크 레드(dark red)","darkslategrey":"다크 슬레이트 그레이(dark slate gray)","peru":"페루(peru)","lightgrey":"라이트 그레이(light gray)","lightgoldenrodyellow":"라이트 골든로드 옐로우(light goldenrod yellow)","blanchedalmond":"블랜치 아몬드(blanched almond)","aliceblue":"앨리스 블루(alice blue)","bisque":"비스크(bisque)","slategray":"슬레이트 그레이(slate gray)","palegoldenrod":"페일 골든로드(pale goldenrod)","darkorange":"다크 오렌지(dark orange)","aquamarine":"아쿠아마린(aquamarine)","lightgreen":"라이트 그린(light green)","burlywood":"벌리우드(burlywood)","dodgerblue":"다저 블루(dodger blue)","darkgray":"다크 그레이(dark gray)","lightcyan":"라이트 시안(light cyan)","powderblue":"파우더 블루(powder blue)","blueviolet":"블루 바이올렛(blue-violet)","orchid":"오키드(orchid)","dimgray":"딤 그레이(dim gray)","beige":"베이지(beige)","fuchsia":"후크샤(fuchsia)","lavenderblush":"라벤더 블러쉬(lavender blush)","hotpink":"핫 핑크(hot pink)","steelblue":"스틸 블루(steel blue)","tomato":"토마토(tomato)","lightpink":"라이트 핑크(light pink)","limegreen":"라임 그린(lime green)","indianred":"인디안 레드(indian red)","papayawhip":"파파야 휩(papaya whip)","lightslategray":"라이트 슬레이트 그레이(light slate gray)","gray":"그레이(gray)","mediumorchid":"미디엄 오키드(medium orchid)","cornsilk":"콘실크(cornsilk)","black":"블랙(black)","seagreen":"씨 그린(sea green)","darkslateblue":"다크 슬레이트 블루(dark slate blue)","khaki":"카키(khaki)","lightblue":"라이트 블루(light blue)","palegreen":"페일 그린(pale green)","azure":"애쥬어(azure)","peachpuff":"피치 퍼프(peach puff)","darkolivegreen":"다크 올리브 그린(dark olive green)","yellowgreen":"옐로우 그린(yellow green)"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ko_kr");dijit.nls.loading.ko_kr={"loadingState":"로드 중...","errorState":"죄송합니다. 오류가 발생했습니다."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ko_kr");dijit.nls.common.ko_kr={"buttonOk":"확인","buttonCancel":"취소","buttonSave":"저장","itemClose":"닫기"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ko_kr");dijit.form.nls.validate.ko_kr={"rangeMessage":"이 값은 범위를 벗어납니다.","invalidMessage":"입력된 값이 올바르지 않습니다.","missingMessage":"이 값은 필수입니다."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ko_kr");dijit.form.nls.ComboBox.ko_kr={"previousMessage":"이전 선택사항","nextMessage":"기타 선택사항"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ko_kr");dojo.cldr.nls.number.ko_kr={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_ko-kr",{"dijit/form/nls/validate":{"rangeMessage":"이 값은 범위를 벗어납니다.","invalidMessage":"입력된 값이 올바르지 않습니다.","missingMessage":"이 값은 필수입니다."},"dijit/nls/loading":{"loadingState":"로드 중...","errorState":"죄송합니다. 오류가 발생했습니다."},"dojo/nls/colors":{"lightsteelblue":"라이트 스틸 블루(light steel blue)","orangered":"오렌지 레드(orange red)","midnightblue":"미드나잇 블루(midnight blue)","cadetblue":"카뎃 블루(cadet blue)","seashell":"씨쉘(seashell)","slategrey":"슬레이트 그레이(slate gray)","coral":"코랄(coral)","darkturquoise":"다크 터콰즈(dark turquoise)","antiquewhite":"앤틱 화이트(antique white)","mediumspringgreen":"미디엄 스프링 그린(medium spring green)","transparent":"투명(transparent)","salmon":"샐몬(salmon)","darkgrey":"다크 그레이(dark gray)","ivory":"아이보리(ivory)","greenyellow":"그린 옐로우(green-yellow)","mistyrose":"미스티 로즈(misty rose)","lightsalmon":"라이트 샐몬(light salmon)","silver":"실버(silver)","dimgrey":"딤 그레이(dim gray)","orange":"오렌지(orange)","white":"화이트(white)","navajowhite":"나바호 화이트(navajo white)","royalblue":"로얄 블루(royal blue)","deeppink":"딥 핑크(deep pink)","lime":"라임(lime)","oldlace":"올드 레이스(old lace)","chartreuse":"샤르트뢰즈(chartreuse)","darkcyan":"다크 시안(dark cyan)","yellow":"옐로우(yellow)","linen":"리넨(linen)","olive":"올리브(olive)","gold":"골드(gold)","lawngreen":"론 그린(lawn green)","lightyellow":"라이트 옐로우(light yellow)","tan":"탠(tan)","darkviolet":"다크 바이올렛(dark violet)","lightslategrey":"라이트 슬레이트 그레이(light slate gray)","grey":"그레이(gray)","darkkhaki":"다크 카키(dark khaki)","green":"그린(green)","deepskyblue":"딥 스카이 블루(deep sky blue)","aqua":"아쿠아(aqua)","sienna":"시에나(sienna)","mintcream":"민트 크림(mint cream)","rosybrown":"로지 브라운(rosy brown)","mediumslateblue":"미디엄 슬레이트 블루(medium slate blue)","magenta":"마젠타(magenta)","lightseagreen":"라이트 씨 그린(light sea green)","cyan":"시안(cyan)","olivedrab":"올리브 드랩(olive drab)","darkgoldenrod":"다크 골든로드(dark goldenrod)","slateblue":"슬레이트 블루(slate blue)","mediumaquamarine":"미디엄 아쿠아마린(medium aquamarine)","lavender":"라벤더(lavender)","mediumseagreen":"미디엄 씨 그린(medium sea green)","maroon":"마룬(maroon)","darkslategray":"다크 슬레이트 그레이(dark slate gray)","mediumturquoise":"미디엄 터콰즈(medium turquoise)","ghostwhite":"고스트 화이트(ghost white)","darkblue":"다크 블루(dark blue)","mediumvioletred":"미디엄 바이올렛 레드(medium violet-red)","brown":"브라운(brown)","lightgray":"라이트 그레이(light gray)","sandybrown":"샌디 브라운(sandy brown)","pink":"핑크(pink)","firebrick":"파이어 브릭(fire brick)","indigo":"인디고(indigo)","snow":"스노우(snow)","darkorchid":"다크 오키드(dark orchid)","turquoise":"터콰즈(turquoise)","chocolate":"초콜렛(chocolate)","springgreen":"스프링 그린(spring green)","moccasin":"모카신(moccasin)","navy":"네이비(navy)","lemonchiffon":"레몬 쉬폰(lemon chiffon)","teal":"틸(teal)","floralwhite":"플로랄 화이트(floral white)","cornflowerblue":"콘플라워 블루(cornflower blue)","paleturquoise":"페일 터콰즈(pale turquoise)","purple":"퍼플(purple)","gainsboro":"게인스브로(gainsboro)","plum":"플럼(plum)","red":"레드(red)","blue":"블루(blue)","forestgreen":"포레스트 그린(forest green)","darkgreen":"다크 그린(dark green)","honeydew":"허니듀(honeydew)","darkseagreen":"다크 씨 그린(dark sea green)","lightcoral":"라이트 코랄(light coral)","palevioletred":"페일 바이올렛 레드(pale violet-red)","mediumpurple":"미디엄 퍼플(medium purple)","saddlebrown":"새들 브라운(saddle brown)","darkmagenta":"다크 마젠타(dark magenta)","thistle":"시슬(thistle)","whitesmoke":"화이트 스모크(white smoke)","wheat":"휘트(wheat)","violet":"바이올렛(violet)","lightskyblue":"라이트 스카이 블루(light sky blue)","goldenrod":"골든로드(goldenrod)","mediumblue":"미디엄 블루(medium blue)","skyblue":"스카이 블루(sky blue)","crimson":"크림슨(crimson)","darksalmon":"다크 샐몬(dark salmon)","darkred":"다크 레드(dark red)","darkslategrey":"다크 슬레이트 그레이(dark slate gray)","peru":"페루(peru)","lightgrey":"라이트 그레이(light gray)","lightgoldenrodyellow":"라이트 골든로드 옐로우(light goldenrod yellow)","blanchedalmond":"블랜치 아몬드(blanched almond)","aliceblue":"앨리스 블루(alice blue)","bisque":"비스크(bisque)","slategray":"슬레이트 그레이(slate gray)","palegoldenrod":"페일 골든로드(pale goldenrod)","darkorange":"다크 오렌지(dark orange)","aquamarine":"아쿠아마린(aquamarine)","lightgreen":"라이트 그린(light green)","burlywood":"벌리우드(burlywood)","dodgerblue":"다저 블루(dodger blue)","darkgray":"다크 그레이(dark gray)","lightcyan":"라이트 시안(light cyan)","powderblue":"파우더 블루(powder blue)","blueviolet":"블루 바이올렛(blue-violet)","orchid":"오키드(orchid)","dimgray":"딤 그레이(dim gray)","beige":"베이지(beige)","fuchsia":"후크샤(fuchsia)","lavenderblush":"라벤더 블러쉬(lavender blush)","hotpink":"핫 핑크(hot pink)","steelblue":"스틸 블루(steel blue)","tomato":"토마토(tomato)","lightpink":"라이트 핑크(light pink)","limegreen":"라임 그린(lime green)","indianred":"인디안 레드(indian red)","papayawhip":"파파야 휩(papaya whip)","lightslategray":"라이트 슬레이트 그레이(light slate gray)","gray":"그레이(gray)","mediumorchid":"미디엄 오키드(medium orchid)","cornsilk":"콘실크(cornsilk)","black":"블랙(black)","seagreen":"씨 그린(sea green)","darkslateblue":"다크 슬레이트 블루(dark slate blue)","khaki":"카키(khaki)","lightblue":"라이트 블루(light blue)","palegreen":"페일 그린(pale green)","azure":"애쥬어(azure)","peachpuff":"피치 퍼프(peach puff)","darkolivegreen":"다크 올리브 그린(dark olive green)","yellowgreen":"옐로우 그린(yellow green)"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"이전 선택사항","nextMessage":"기타 선택사항"},"dijit/nls/common":{"buttonOk":"확인","buttonCancel":"취소","buttonSave":"저장","itemClose":"닫기"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_ko-kr.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_ko-kr.js.uncompressed.js
new file mode 100644
index 000000000..5a48e4db7
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_ko-kr.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_ko-kr',{
+'dijit/form/nls/validate':{"rangeMessage":"이 값은 범위를 벗어납니다.","invalidMessage":"입력된 값이 올바르지 않습니다.","missingMessage":"이 값은 필수입니다."}
+,
+'dijit/nls/loading':{"loadingState":"로드 중...","errorState":"죄송합니다. 오류가 발생했습니다."}
+,
+'dojo/nls/colors':{"lightsteelblue":"라이트 스틸 블루(light steel blue)","orangered":"오렌지 레드(orange red)","midnightblue":"미드나잇 블루(midnight blue)","cadetblue":"카뎃 블루(cadet blue)","seashell":"씨쉘(seashell)","slategrey":"슬레이트 그레이(slate gray)","coral":"코랄(coral)","darkturquoise":"다크 터콰즈(dark turquoise)","antiquewhite":"앤틱 화이트(antique white)","mediumspringgreen":"미디엄 스프링 그린(medium spring green)","transparent":"투명(transparent)","salmon":"샐몬(salmon)","darkgrey":"다크 그레이(dark gray)","ivory":"아이보리(ivory)","greenyellow":"그린 옐로우(green-yellow)","mistyrose":"미스티 로즈(misty rose)","lightsalmon":"라이트 샐몬(light salmon)","silver":"실버(silver)","dimgrey":"딤 그레이(dim gray)","orange":"오렌지(orange)","white":"화이트(white)","navajowhite":"나바호 화이트(navajo white)","royalblue":"로얄 블루(royal blue)","deeppink":"딥 핑크(deep pink)","lime":"라임(lime)","oldlace":"올드 레이스(old lace)","chartreuse":"샤르트뢰즈(chartreuse)","darkcyan":"다크 시안(dark cyan)","yellow":"옐로우(yellow)","linen":"리넨(linen)","olive":"올리브(olive)","gold":"골드(gold)","lawngreen":"론 그린(lawn green)","lightyellow":"라이트 옐로우(light yellow)","tan":"탠(tan)","darkviolet":"다크 바이올렛(dark violet)","lightslategrey":"라이트 슬레이트 그레이(light slate gray)","grey":"그레이(gray)","darkkhaki":"다크 카키(dark khaki)","green":"그린(green)","deepskyblue":"딥 스카이 블루(deep sky blue)","aqua":"아쿠아(aqua)","sienna":"시에나(sienna)","mintcream":"민트 크림(mint cream)","rosybrown":"로지 브라운(rosy brown)","mediumslateblue":"미디엄 슬레이트 블루(medium slate blue)","magenta":"마젠타(magenta)","lightseagreen":"라이트 씨 그린(light sea green)","cyan":"시안(cyan)","olivedrab":"올리브 드랩(olive drab)","darkgoldenrod":"다크 골든로드(dark goldenrod)","slateblue":"슬레이트 블루(slate blue)","mediumaquamarine":"미디엄 아쿠아마린(medium aquamarine)","lavender":"라벤더(lavender)","mediumseagreen":"미디엄 씨 그린(medium sea green)","maroon":"마룬(maroon)","darkslategray":"다크 슬레이트 그레이(dark slate gray)","mediumturquoise":"미디엄 터콰즈(medium turquoise)","ghostwhite":"고스트 화이트(ghost white)","darkblue":"다크 블루(dark blue)","mediumvioletred":"미디엄 바이올렛 레드(medium violet-red)","brown":"브라운(brown)","lightgray":"라이트 그레이(light gray)","sandybrown":"샌디 브라운(sandy brown)","pink":"핑크(pink)","firebrick":"파이어 브릭(fire brick)","indigo":"인디고(indigo)","snow":"스노우(snow)","darkorchid":"다크 오키드(dark orchid)","turquoise":"터콰즈(turquoise)","chocolate":"초콜렛(chocolate)","springgreen":"스프링 그린(spring green)","moccasin":"모카신(moccasin)","navy":"네이비(navy)","lemonchiffon":"레몬 쉬폰(lemon chiffon)","teal":"틸(teal)","floralwhite":"플로랄 화이트(floral white)","cornflowerblue":"콘플라워 블루(cornflower blue)","paleturquoise":"페일 터콰즈(pale turquoise)","purple":"퍼플(purple)","gainsboro":"게인스브로(gainsboro)","plum":"플럼(plum)","red":"레드(red)","blue":"블루(blue)","forestgreen":"포레스트 그린(forest green)","darkgreen":"다크 그린(dark green)","honeydew":"허니듀(honeydew)","darkseagreen":"다크 씨 그린(dark sea green)","lightcoral":"라이트 코랄(light coral)","palevioletred":"페일 바이올렛 레드(pale violet-red)","mediumpurple":"미디엄 퍼플(medium purple)","saddlebrown":"새들 브라운(saddle brown)","darkmagenta":"다크 마젠타(dark magenta)","thistle":"시슬(thistle)","whitesmoke":"화이트 스모크(white smoke)","wheat":"휘트(wheat)","violet":"바이올렛(violet)","lightskyblue":"라이트 스카이 블루(light sky blue)","goldenrod":"골든로드(goldenrod)","mediumblue":"미디엄 블루(medium blue)","skyblue":"스카이 블루(sky blue)","crimson":"크림슨(crimson)","darksalmon":"다크 샐몬(dark salmon)","darkred":"다크 레드(dark red)","darkslategrey":"다크 슬레이트 그레이(dark slate gray)","peru":"페루(peru)","lightgrey":"라이트 그레이(light gray)","lightgoldenrodyellow":"라이트 골든로드 옐로우(light goldenrod yellow)","blanchedalmond":"블랜치 아몬드(blanched almond)","aliceblue":"앨리스 블루(alice blue)","bisque":"비스크(bisque)","slategray":"슬레이트 그레이(slate gray)","palegoldenrod":"페일 골든로드(pale goldenrod)","darkorange":"다크 오렌지(dark orange)","aquamarine":"아쿠아마린(aquamarine)","lightgreen":"라이트 그린(light green)","burlywood":"벌리우드(burlywood)","dodgerblue":"다저 블루(dodger blue)","darkgray":"다크 그레이(dark gray)","lightcyan":"라이트 시안(light cyan)","powderblue":"파우더 블루(powder blue)","blueviolet":"블루 바이올렛(blue-violet)","orchid":"오키드(orchid)","dimgray":"딤 그레이(dim gray)","beige":"베이지(beige)","fuchsia":"후크샤(fuchsia)","lavenderblush":"라벤더 블러쉬(lavender blush)","hotpink":"핫 핑크(hot pink)","steelblue":"스틸 블루(steel blue)","tomato":"토마토(tomato)","lightpink":"라이트 핑크(light pink)","limegreen":"라임 그린(lime green)","indianred":"인디안 레드(indian red)","papayawhip":"파파야 휩(papaya whip)","lightslategray":"라이트 슬레이트 그레이(light slate gray)","gray":"그레이(gray)","mediumorchid":"미디엄 오키드(medium orchid)","cornsilk":"콘실크(cornsilk)","black":"블랙(black)","seagreen":"씨 그린(sea green)","darkslateblue":"다크 슬레이트 블루(dark slate blue)","khaki":"카키(khaki)","lightblue":"라이트 블루(light blue)","palegreen":"페일 그린(pale green)","azure":"애쥬어(azure)","peachpuff":"피치 퍼프(peach puff)","darkolivegreen":"다크 올리브 그린(dark olive green)","yellowgreen":"옐로우 그린(yellow green)"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"이전 선택사항","nextMessage":"기타 선택사항"}
+,
+'dijit/nls/common':{"buttonOk":"확인","buttonCancel":"취소","buttonSave":"저장","itemClose":"닫기"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_ko.js b/lib/dojo/nls/tt-rss-layer_ko.js
deleted file mode 100644
index a919765c0..000000000
--- a/lib/dojo/nls/tt-rss-layer_ko.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dojo.nls.tt-rss-layer_ko");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ko");dojo.nls.colors.ko={"lightsteelblue":"라이트 스틸 블루(light steel blue)","orangered":"오렌지 레드(orange red)","midnightblue":"미드나잇 블루(midnight blue)","cadetblue":"카뎃 블루(cadet blue)","seashell":"씨쉘(seashell)","slategrey":"슬레이트 그레이(slate gray)","coral":"코랄(coral)","darkturquoise":"다크 터콰즈(dark turquoise)","antiquewhite":"앤틱 화이트(antique white)","mediumspringgreen":"미디엄 스프링 그린(medium spring green)","salmon":"샐몬(salmon)","darkgrey":"다크 그레이(dark gray)","ivory":"아이보리(ivory)","greenyellow":"그린 옐로우(green-yellow)","mistyrose":"미스티 로즈(misty rose)","lightsalmon":"라이트 샐몬(light salmon)","silver":"실버(silver)","dimgrey":"딤 그레이(dim gray)","orange":"오렌지(orange)","white":"화이트(white)","navajowhite":"나바호 화이트(navajo white)","royalblue":"로얄 블루(royal blue)","deeppink":"딥 핑크(deep pink)","lime":"라임(lime)","oldlace":"올드 레이스(old lace)","chartreuse":"샤르트뢰즈(chartreuse)","darkcyan":"다크 시안(dark cyan)","yellow":"옐로우(yellow)","linen":"리넨(linen)","olive":"올리브(olive)","gold":"골드(gold)","lawngreen":"론 그린(lawn green)","lightyellow":"라이트 옐로우(light yellow)","tan":"탠(tan)","darkviolet":"다크 바이올렛(dark violet)","lightslategrey":"라이트 슬레이트 그레이(light slate gray)","grey":"그레이(gray)","darkkhaki":"다크 카키(dark khaki)","green":"그린(green)","deepskyblue":"딥 스카이 블루(deep sky blue)","aqua":"아쿠아(aqua)","sienna":"시에나(sienna)","mintcream":"민트 크림(mint cream)","rosybrown":"로지 브라운(rosy brown)","mediumslateblue":"미디엄 슬레이트 블루(medium slate blue)","magenta":"마젠타(magenta)","lightseagreen":"라이트 씨 그린(light sea green)","cyan":"시안(cyan)","olivedrab":"올리브 드랩(olive drab)","darkgoldenrod":"다크 골든로드(dark goldenrod)","slateblue":"슬레이트 블루(slate blue)","mediumaquamarine":"미디엄 아쿠아마린(medium aquamarine)","lavender":"라벤더(lavender)","mediumseagreen":"미디엄 씨 그린(medium sea green)","maroon":"마룬(maroon)","darkslategray":"다크 슬레이트 그레이(dark slate gray)","mediumturquoise":"미디엄 터콰즈(medium turquoise)","ghostwhite":"고스트 화이트(ghost white)","darkblue":"다크 블루(dark blue)","mediumvioletred":"미디엄 바이올렛 레드(medium violet-red)","brown":"브라운(brown)","lightgray":"라이트 그레이(light gray)","sandybrown":"샌디 브라운(sandy brown)","pink":"핑크(pink)","firebrick":"파이어 브릭(fire brick)","indigo":"인디고(indigo)","snow":"스노우(snow)","darkorchid":"다크 오키드(dark orchid)","turquoise":"터콰즈(turquoise)","chocolate":"초콜렛(chocolate)","springgreen":"스프링 그린(spring green)","moccasin":"모카신(moccasin)","navy":"네이비(navy)","lemonchiffon":"레몬 쉬폰(lemon chiffon)","teal":"틸(teal)","floralwhite":"플로랄 화이트(floral white)","cornflowerblue":"콘플라워 블루(cornflower blue)","paleturquoise":"페일 터콰즈(pale turquoise)","purple":"퍼플(purple)","gainsboro":"게인스브로(gainsboro)","plum":"플럼(plum)","red":"레드(red)","blue":"블루(blue)","forestgreen":"포레스트 그린(forest green)","darkgreen":"다크 그린(dark green)","honeydew":"허니듀(honeydew)","darkseagreen":"다크 씨 그린(dark sea green)","lightcoral":"라이트 코랄(light coral)","palevioletred":"페일 바이올렛 레드(pale violet-red)","mediumpurple":"미디엄 퍼플(medium purple)","saddlebrown":"새들 브라운(saddle brown)","darkmagenta":"다크 마젠타(dark magenta)","thistle":"시슬(thistle)","whitesmoke":"화이트 스모크(white smoke)","wheat":"휘트(wheat)","violet":"바이올렛(violet)","lightskyblue":"라이트 스카이 블루(light sky blue)","goldenrod":"골든로드(goldenrod)","mediumblue":"미디엄 블루(medium blue)","skyblue":"스카이 블루(sky blue)","crimson":"크림슨(crimson)","darksalmon":"다크 샐몬(dark salmon)","darkred":"다크 레드(dark red)","darkslategrey":"다크 슬레이트 그레이(dark slate gray)","peru":"페루(peru)","lightgrey":"라이트 그레이(light gray)","lightgoldenrodyellow":"라이트 골든로드 옐로우(light goldenrod yellow)","blanchedalmond":"블랜치 아몬드(blanched almond)","aliceblue":"앨리스 블루(alice blue)","bisque":"비스크(bisque)","slategray":"슬레이트 그레이(slate gray)","palegoldenrod":"페일 골든로드(pale goldenrod)","darkorange":"다크 오렌지(dark orange)","aquamarine":"아쿠아마린(aquamarine)","lightgreen":"라이트 그린(light green)","burlywood":"벌리우드(burlywood)","dodgerblue":"다저 블루(dodger blue)","darkgray":"다크 그레이(dark gray)","lightcyan":"라이트 시안(light cyan)","powderblue":"파우더 블루(powder blue)","blueviolet":"블루 바이올렛(blue-violet)","orchid":"오키드(orchid)","dimgray":"딤 그레이(dim gray)","beige":"베이지(beige)","fuchsia":"후크샤(fuchsia)","lavenderblush":"라벤더 블러쉬(lavender blush)","hotpink":"핫 핑크(hot pink)","steelblue":"스틸 블루(steel blue)","tomato":"토마토(tomato)","lightpink":"라이트 핑크(light pink)","limegreen":"라임 그린(lime green)","indianred":"인디안 레드(indian red)","papayawhip":"파파야 휩(papaya whip)","lightslategray":"라이트 슬레이트 그레이(light slate gray)","gray":"그레이(gray)","mediumorchid":"미디엄 오키드(medium orchid)","cornsilk":"콘실크(cornsilk)","black":"블랙(black)","seagreen":"씨 그린(sea green)","darkslateblue":"다크 슬레이트 블루(dark slate blue)","khaki":"카키(khaki)","lightblue":"라이트 블루(light blue)","palegreen":"페일 그린(pale green)","azure":"애쥬어(azure)","peachpuff":"피치 퍼프(peach puff)","darkolivegreen":"다크 올리브 그린(dark olive green)","yellowgreen":"옐로우 그린(yellow green)"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ko");dijit.nls.loading.ko={"loadingState":"로드 중...","errorState":"죄송합니다. 오류가 발생했습니다."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ko");dijit.nls.common.ko={"buttonOk":"확인","buttonCancel":"취소","buttonSave":"저장","itemClose":"닫기"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ko");dijit.form.nls.validate.ko={"rangeMessage":"이 값은 범위를 벗어납니다.","invalidMessage":"입력된 값이 올바르지 않습니다.","missingMessage":"이 값은 필수입니다."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ko");dijit.form.nls.ComboBox.ko={"previousMessage":"이전 선택사항","nextMessage":"기타 선택사항"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ko");dojo.cldr.nls.number.ko={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_nb.js b/lib/dojo/nls/tt-rss-layer_nb.js
index d4c87d203..5d8576d72 100644
--- a/lib/dojo/nls/tt-rss-layer_nb.js
+++ b/lib/dojo/nls/tt-rss-layer_nb.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_nb");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.nb");dojo.nls.colors.nb={"lightsteelblue":"lys stålblå","orangered":"rødoransje","midnightblue":"midnattsblå","cadetblue":"mørk grønnblå","seashell":"skjellhvit","slategrey":"skifergrå","coral":"korall","darkturquoise":"mørk turkis","antiquewhite":"antikk hvit","mediumspringgreen":"middels vårgrønn","salmon":"lakserosa","darkgrey":"mørk grå","ivory":"elfenbenshvit","greenyellow":"gulgrønn","mistyrose":"lys rosenrød","lightsalmon":"lys lakserosa","silver":"sølvfarget","dimgrey":"mørk mørkegrå","orange":"oransje","white":"hvit","navajowhite":"gulbrun","royalblue":"kongeblå","deeppink":"dyp rosa","lime":"lime","oldlace":"kniplingshvit","chartreuse":"løvgrønn","darkcyan":"mørk cyan","yellow":"gul","linen":"lin","olive":"oliven","gold":"gull","lawngreen":"plengrønn","lightyellow":"lys gul","tan":"matt mellombrun","darkviolet":"mørk fiolett","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grønn","deepskyblue":"dyp himmelblå","aqua":"akva","sienna":"nøttebrun","mintcream":"mintkrem","rosybrown":"brunlilla","mediumslateblue":"middels skiferblå","magenta":"magenta","lightseagreen":"lys sjøgrønn","cyan":"cyan","olivedrab":"middels olivengrønn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"middels akvamarin","lavender":"lavendel","mediumseagreen":"middels sjøgrønn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"middels turkis","ghostwhite":"egghvit","darkblue":"mørk blå","mediumvioletred":"middels fiolettrød","brown":"brun","lightgray":"lys grå","sandybrown":"sandbrun","pink":"rosa","firebrick":"mursteinsrød","indigo":"indigo","snow":"snøhvit","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"sjokolade","springgreen":"vårgrønn","moccasin":"lys gulbrun","navy":"marineblå","lemonchiffon":"ferskenfarget","teal":"mørk grønnblå","floralwhite":"blomsterhvit","cornflowerblue":"kornblå","paleturquoise":"svak turkis","purple":"purpur","gainsboro":"lys lys grå","plum":"plommefarget","red":"rød","blue":"blå","forestgreen":"skoggrønn","darkgreen":"mørk grønn","honeydew":"grønnhvit","darkseagreen":"mørk sjøgrønn","lightcoral":"lys korall","palevioletred":"svak fiolettrød","mediumpurple":"middels purpur","saddlebrown":"mørk nøttebrun","darkmagenta":"mørk magenta","thistle":"lys grålilla","whitesmoke":"røykhvit","wheat":"varm sienna","violet":"fiolett","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellomblå","skyblue":"himmelblå","crimson":"karmosinrødt","darksalmon":"mørk lakserosa","darkred":"mørk rød","darkslategrey":"mørk skifergrå","peru":"lys nøttebrun","lightgrey":"lys grå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"lys mandel","aliceblue":"blåhvit","bisque":"gulrosa","slategray":"skifergrå","palegoldenrod":"svak gyldenris","darkorange":"mørk oransje","aquamarine":"akvamarin","lightgreen":"lys grønn","burlywood":"matt mellombrun","dodgerblue":"lys havblå","darkgray":"mørk grå","lightcyan":"lys cyan","powderblue":"lys grønnblå","blueviolet":"blåfiolett","orchid":"orkide","dimgray":"mørk mørkegrå","beige":"beige","fuchsia":"fuksia","lavenderblush":"lillahvit","hotpink":"halvmørk rosa","steelblue":"stålblå","tomato":"tomatrød","lightpink":"lys rosa","limegreen":"limegrønn","indianred":"rustrød","papayawhip":"lys papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"middels orkide","cornsilk":"cornsilk","black":"svart","seagreen":"sjøgrønn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lys blå","palegreen":"svak grønn","azure":"asur","peachpuff":"brunrosa","darkolivegreen":"mørk olivengrønn","yellowgreen":"gulgrønn"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.nb");dijit.nls.loading.nb={"loadingState":"Laster inn...","errorState":"Det oppsto en feil"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.nb");dijit.nls.common.nb={"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Lagre","itemClose":"Lukk"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.nb");dijit.form.nls.validate.nb={"rangeMessage":"Denne verdien er utenfor gyldig område.","invalidMessage":"Den angitte verdien er ikke gyldig.","missingMessage":"Denne verdien er obligatorisk."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.nb");dijit.form.nls.ComboBox.nb={"previousMessage":"Tidligere valg","nextMessage":"Flere valg"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.nb");dojo.cldr.nls.number.nb={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_nb",{"dijit/form/nls/validate":{"rangeMessage":"Denne verdien er utenfor gyldig område.","invalidMessage":"Den angitte verdien er ikke gyldig.","missingMessage":"Denne verdien er obligatorisk."},"dijit/nls/loading":{"loadingState":"Laster inn...","errorState":"Det oppsto en feil"},"dojo/nls/colors":{"lightsteelblue":"lys stålblå","orangered":"rødoransje","midnightblue":"midnattsblå","cadetblue":"mørk grønnblå","seashell":"skjellhvit","slategrey":"skifergrå","coral":"korall","darkturquoise":"mørk turkis","antiquewhite":"antikk hvit","mediumspringgreen":"middels vårgrønn","transparent":"gjennomsiktig","salmon":"lakserosa","darkgrey":"mørk grå","ivory":"elfenbenshvit","greenyellow":"gulgrønn","mistyrose":"lys rosenrød","lightsalmon":"lys lakserosa","silver":"sølvfarget","dimgrey":"mørk mørkegrå","orange":"oransje","white":"hvit","navajowhite":"gulbrun","royalblue":"kongeblå","deeppink":"dyp rosa","lime":"lime","oldlace":"kniplingshvit","chartreuse":"løvgrønn","darkcyan":"mørk cyan","yellow":"gul","linen":"lin","olive":"oliven","gold":"gull","lawngreen":"plengrønn","lightyellow":"lys gul","tan":"matt mellombrun","darkviolet":"mørk fiolett","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grønn","deepskyblue":"dyp himmelblå","aqua":"akva","sienna":"nøttebrun","mintcream":"mintkrem","rosybrown":"brunlilla","mediumslateblue":"middels skiferblå","magenta":"magenta","lightseagreen":"lys sjøgrønn","cyan":"cyan","olivedrab":"middels olivengrønn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"middels akvamarin","lavender":"lavendel","mediumseagreen":"middels sjøgrønn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"middels turkis","ghostwhite":"egghvit","darkblue":"mørk blå","mediumvioletred":"middels fiolettrød","brown":"brun","lightgray":"lys grå","sandybrown":"sandbrun","pink":"rosa","firebrick":"mursteinsrød","indigo":"indigo","snow":"snøhvit","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"sjokolade","springgreen":"vårgrønn","moccasin":"lys gulbrun","navy":"marineblå","lemonchiffon":"ferskenfarget","teal":"mørk grønnblå","floralwhite":"blomsterhvit","cornflowerblue":"kornblå","paleturquoise":"svak turkis","purple":"purpur","gainsboro":"lys lys grå","plum":"plommefarget","red":"rød","blue":"blå","forestgreen":"skoggrønn","darkgreen":"mørk grønn","honeydew":"grønnhvit","darkseagreen":"mørk sjøgrønn","lightcoral":"lys korall","palevioletred":"svak fiolettrød","mediumpurple":"middels purpur","saddlebrown":"mørk nøttebrun","darkmagenta":"mørk magenta","thistle":"lys grålilla","whitesmoke":"røykhvit","wheat":"varm sienna","violet":"fiolett","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellomblå","skyblue":"himmelblå","crimson":"karmosinrødt","darksalmon":"mørk lakserosa","darkred":"mørk rød","darkslategrey":"mørk skifergrå","peru":"lys nøttebrun","lightgrey":"lys grå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"lys mandel","aliceblue":"blåhvit","bisque":"gulrosa","slategray":"skifergrå","palegoldenrod":"svak gyldenris","darkorange":"mørk oransje","aquamarine":"akvamarin","lightgreen":"lys grønn","burlywood":"matt mellombrun","dodgerblue":"lys havblå","darkgray":"mørk grå","lightcyan":"lys cyan","powderblue":"lys grønnblå","blueviolet":"blåfiolett","orchid":"orkide","dimgray":"mørk mørkegrå","beige":"beige","fuchsia":"fuksia","lavenderblush":"lillahvit","hotpink":"halvmørk rosa","steelblue":"stålblå","tomato":"tomatrød","lightpink":"lys rosa","limegreen":"limegrønn","indianred":"rustrød","papayawhip":"lys papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"middels orkide","cornsilk":"cornsilk","black":"svart","seagreen":"sjøgrønn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lys blå","palegreen":"svak grønn","azure":"asur","peachpuff":"brunrosa","darkolivegreen":"mørk olivengrønn","yellowgreen":"gulgrønn"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Tidligere valg","nextMessage":"Flere valg"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Lagre","itemClose":"Lukk"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_nb.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_nb.js.uncompressed.js
new file mode 100644
index 000000000..cddd699e1
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_nb.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_nb',{
+'dijit/form/nls/validate':{"rangeMessage":"Denne verdien er utenfor gyldig område.","invalidMessage":"Den angitte verdien er ikke gyldig.","missingMessage":"Denne verdien er obligatorisk."}
+,
+'dijit/nls/loading':{"loadingState":"Laster inn...","errorState":"Det oppsto en feil"}
+,
+'dojo/nls/colors':{"lightsteelblue":"lys stålblå","orangered":"rødoransje","midnightblue":"midnattsblå","cadetblue":"mørk grønnblå","seashell":"skjellhvit","slategrey":"skifergrå","coral":"korall","darkturquoise":"mørk turkis","antiquewhite":"antikk hvit","mediumspringgreen":"middels vårgrønn","transparent":"gjennomsiktig","salmon":"lakserosa","darkgrey":"mørk grå","ivory":"elfenbenshvit","greenyellow":"gulgrønn","mistyrose":"lys rosenrød","lightsalmon":"lys lakserosa","silver":"sølvfarget","dimgrey":"mørk mørkegrå","orange":"oransje","white":"hvit","navajowhite":"gulbrun","royalblue":"kongeblå","deeppink":"dyp rosa","lime":"lime","oldlace":"kniplingshvit","chartreuse":"løvgrønn","darkcyan":"mørk cyan","yellow":"gul","linen":"lin","olive":"oliven","gold":"gull","lawngreen":"plengrønn","lightyellow":"lys gul","tan":"matt mellombrun","darkviolet":"mørk fiolett","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grønn","deepskyblue":"dyp himmelblå","aqua":"akva","sienna":"nøttebrun","mintcream":"mintkrem","rosybrown":"brunlilla","mediumslateblue":"middels skiferblå","magenta":"magenta","lightseagreen":"lys sjøgrønn","cyan":"cyan","olivedrab":"middels olivengrønn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"middels akvamarin","lavender":"lavendel","mediumseagreen":"middels sjøgrønn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"middels turkis","ghostwhite":"egghvit","darkblue":"mørk blå","mediumvioletred":"middels fiolettrød","brown":"brun","lightgray":"lys grå","sandybrown":"sandbrun","pink":"rosa","firebrick":"mursteinsrød","indigo":"indigo","snow":"snøhvit","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"sjokolade","springgreen":"vårgrønn","moccasin":"lys gulbrun","navy":"marineblå","lemonchiffon":"ferskenfarget","teal":"mørk grønnblå","floralwhite":"blomsterhvit","cornflowerblue":"kornblå","paleturquoise":"svak turkis","purple":"purpur","gainsboro":"lys lys grå","plum":"plommefarget","red":"rød","blue":"blå","forestgreen":"skoggrønn","darkgreen":"mørk grønn","honeydew":"grønnhvit","darkseagreen":"mørk sjøgrønn","lightcoral":"lys korall","palevioletred":"svak fiolettrød","mediumpurple":"middels purpur","saddlebrown":"mørk nøttebrun","darkmagenta":"mørk magenta","thistle":"lys grålilla","whitesmoke":"røykhvit","wheat":"varm sienna","violet":"fiolett","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellomblå","skyblue":"himmelblå","crimson":"karmosinrødt","darksalmon":"mørk lakserosa","darkred":"mørk rød","darkslategrey":"mørk skifergrå","peru":"lys nøttebrun","lightgrey":"lys grå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"lys mandel","aliceblue":"blåhvit","bisque":"gulrosa","slategray":"skifergrå","palegoldenrod":"svak gyldenris","darkorange":"mørk oransje","aquamarine":"akvamarin","lightgreen":"lys grønn","burlywood":"matt mellombrun","dodgerblue":"lys havblå","darkgray":"mørk grå","lightcyan":"lys cyan","powderblue":"lys grønnblå","blueviolet":"blåfiolett","orchid":"orkide","dimgray":"mørk mørkegrå","beige":"beige","fuchsia":"fuksia","lavenderblush":"lillahvit","hotpink":"halvmørk rosa","steelblue":"stålblå","tomato":"tomatrød","lightpink":"lys rosa","limegreen":"limegrønn","indianred":"rustrød","papayawhip":"lys papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"middels orkide","cornsilk":"cornsilk","black":"svart","seagreen":"sjøgrønn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lys blå","palegreen":"svak grønn","azure":"asur","peachpuff":"brunrosa","darkolivegreen":"mørk olivengrønn","yellowgreen":"gulgrønn"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Tidligere valg","nextMessage":"Flere valg"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Lagre","itemClose":"Lukk"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_nl-nl.js b/lib/dojo/nls/tt-rss-layer_nl-nl.js
index 6b5f10a11..723b200cc 100644
--- a/lib/dojo/nls/tt-rss-layer_nl-nl.js
+++ b/lib/dojo/nls/tt-rss-layer_nl-nl.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_nl-nl");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.nl_nl");dojo.nls.colors.nl_nl={"lightsteelblue":"lichtstaalblauw","orangered":"oranjerood","midnightblue":"nachtblauw","cadetblue":"donkerstaalblauw","seashell":"schelp","slategrey":"leigrijs","coral":"koraalrood","darkturquoise":"donkerturquoise","antiquewhite":"antiekwit","mediumspringgreen":"midlentegroen","salmon":"zalm","darkgrey":"donkergrijs","ivory":"ivoorwit","greenyellow":"groengeel","mistyrose":"matroze","lightsalmon":"lichtzalm","silver":"zilvergrijs","dimgrey":"dofgrijs","orange":"oranje","white":"wit","navajowhite":"navajowit","royalblue":"koningsblauw","deeppink":"donkerroze","lime":"limoen","oldlace":"kant","chartreuse":"groengeel","darkcyan":"donkercyaan","yellow":"geel","linen":"linnen","olive":"olijfgroen","gold":"goud","lawngreen":"grasgroen","lightyellow":"lichtgeel","tan":"geelbruin","darkviolet":"donkerviolet","lightslategrey":"lichtblauwgrijs","grey":"grijs","darkkhaki":"donkerkaki","green":"groen","deepskyblue":"diephemelblauw","aqua":"aqua","sienna":"sienna","mintcream":"mintroomgeel","rosybrown":"roodbruin","mediumslateblue":"midgrijsblauw","magenta":"magenta","lightseagreen":"lichtzeegroen","cyan":"cyaan","olivedrab":"grijsbruin","darkgoldenrod":"donkergoud","slateblue":"leiblauw","mediumaquamarine":"midaquamarijn","lavender":"lavendelblauw","mediumseagreen":"midzeegroen","maroon":"kastanjebruin","darkslategray":"donkerblauwgrijs","mediumturquoise":"midturquoise","ghostwhite":"spierwit","darkblue":"donkerblauw","mediumvioletred":"midvioletrood","brown":"bruin","lightgray":"lichtgrijs","sandybrown":"zandbruin","pink":"roze","firebrick":"vuursteenrood","indigo":"indigo","snow":"sneeuwwit","darkorchid":"donkerorchidee","turquoise":"turquoise","chocolate":"chocoladebruin","springgreen":"lentegroen","moccasin":"moccasin","navy":"marineblauw","lemonchiffon":"citroengeel","teal":"grijsblauw","floralwhite":"rozewit","cornflowerblue":"korenbloemblauw","paleturquoise":"bleekturquoise","purple":"purper","gainsboro":"lichtblauwgrijs","plum":"pruim","red":"rood","blue":"blauw","forestgreen":"bosgroen","darkgreen":"donkergroen","honeydew":"meloen","darkseagreen":"donkerzeegroen","lightcoral":"lichtkoraal","palevioletred":"bleekvioletrood","mediumpurple":"midpurper","saddlebrown":"leerbruin","darkmagenta":"donkermagenta","thistle":"distel","whitesmoke":"rookwit","wheat":"tarwebruin","violet":"violet","lightskyblue":"lichthemelsblauw","goldenrod":"goudbruin","mediumblue":"midblauw","skyblue":"hemelsblauw","crimson":"karmozijnrood","darksalmon":"donkerzalm","darkred":"donkerrood","darkslategrey":"donkerblauwgrijs","peru":"bruin","lightgrey":"lichtgrijs","lightgoldenrodyellow":"lichtgoudgeel","blanchedalmond":"amandel","aliceblue":"lichtblauw","bisque":"oranjegeel","slategray":"leigrijs","palegoldenrod":"bleekgeel","darkorange":"donkeroranje","aquamarine":"aquamarijn","lightgreen":"lichtgroen","burlywood":"lichtbruin","dodgerblue":"helderblauw","darkgray":"donkergrijs","lightcyan":"lichtcyaan","powderblue":"lichtblauw-wit","blueviolet":"violet","orchid":"orchidee","dimgray":"dofgrijs","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelblos","hotpink":"acaciaroze","steelblue":"staalblauw","tomato":"tomaat","lightpink":"lichtroze","limegreen":"limoengroen","indianred":"indisch rood","papayawhip":"papajaroze","lightslategray":"lichtblauwgrijs","gray":"grijs","mediumorchid":"midorchidee","cornsilk":"maïsgeel","black":"zwart","seagreen":"zeegroen","darkslateblue":"donkergrijsblauw","khaki":"kaki","lightblue":"lichtblauw","palegreen":"bleekgroen","azure":"azuur","peachpuff":"perzikroze","darkolivegreen":"donkerolijfgroen","yellowgreen":"geelgroen"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.nl_nl");dijit.nls.loading.nl_nl={"loadingState":"Bezig met laden...","errorState":"Er is een fout opgetreden"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.nl_nl");dijit.nls.common.nl_nl={"buttonOk":"OK","buttonCancel":"Annuleren","buttonSave":"Opslaan","itemClose":"Sluiten"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.nl_nl");dijit.form.nls.validate.nl_nl={"rangeMessage":"Deze waarde is niet toegestaan.","invalidMessage":"De opgegeven waarde is ongeldig.","missingMessage":"Deze waarde is verplicht."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.nl_nl");dijit.form.nls.ComboBox.nl_nl={"previousMessage":"Eerdere opties","nextMessage":"Meer opties"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.nl_nl");dojo.cldr.nls.number.nl_nl={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_nl-nl",{"dijit/form/nls/validate":{"rangeMessage":"Deze waarde is niet toegestaan.","invalidMessage":"De opgegeven waarde is ongeldig.","missingMessage":"Deze waarde is verplicht."},"dijit/nls/loading":{"loadingState":"Bezig met laden...","errorState":"Er is een fout opgetreden"},"dojo/nls/colors":{"lightsteelblue":"lichtstaalblauw","orangered":"oranjerood","midnightblue":"nachtblauw","cadetblue":"donkerstaalblauw","seashell":"schelp","slategrey":"leigrijs","coral":"koraalrood","darkturquoise":"donkerturquoise","antiquewhite":"antiekwit","mediumspringgreen":"midlentegroen","transparent":"transparant","salmon":"zalm","darkgrey":"donkergrijs","ivory":"ivoorwit","greenyellow":"groengeel","mistyrose":"matroze","lightsalmon":"lichtzalm","silver":"zilvergrijs","dimgrey":"dofgrijs","orange":"oranje","white":"wit","navajowhite":"navajowit","royalblue":"koningsblauw","deeppink":"donkerroze","lime":"limoen","oldlace":"kant","chartreuse":"groengeel","darkcyan":"donkercyaan","yellow":"geel","linen":"linnen","olive":"olijfgroen","gold":"goud","lawngreen":"grasgroen","lightyellow":"lichtgeel","tan":"geelbruin","darkviolet":"donkerviolet","lightslategrey":"lichtblauwgrijs","grey":"grijs","darkkhaki":"donkerkaki","green":"groen","deepskyblue":"diephemelblauw","aqua":"aqua","sienna":"sienna","mintcream":"mintroomgeel","rosybrown":"roodbruin","mediumslateblue":"midgrijsblauw","magenta":"magenta","lightseagreen":"lichtzeegroen","cyan":"cyaan","olivedrab":"grijsbruin","darkgoldenrod":"donkergoud","slateblue":"leiblauw","mediumaquamarine":"midaquamarijn","lavender":"lavendelblauw","mediumseagreen":"midzeegroen","maroon":"kastanjebruin","darkslategray":"donkerblauwgrijs","mediumturquoise":"midturquoise","ghostwhite":"spierwit","darkblue":"donkerblauw","mediumvioletred":"midvioletrood","brown":"bruin","lightgray":"lichtgrijs","sandybrown":"zandbruin","pink":"roze","firebrick":"vuursteenrood","indigo":"indigo","snow":"sneeuwwit","darkorchid":"donkerorchidee","turquoise":"turquoise","chocolate":"chocoladebruin","springgreen":"lentegroen","moccasin":"moccasin","navy":"marineblauw","lemonchiffon":"citroengeel","teal":"grijsblauw","floralwhite":"rozewit","cornflowerblue":"korenbloemblauw","paleturquoise":"bleekturquoise","purple":"purper","gainsboro":"lichtblauwgrijs","plum":"pruim","red":"rood","blue":"blauw","forestgreen":"bosgroen","darkgreen":"donkergroen","honeydew":"meloen","darkseagreen":"donkerzeegroen","lightcoral":"lichtkoraal","palevioletred":"bleekvioletrood","mediumpurple":"midpurper","saddlebrown":"leerbruin","darkmagenta":"donkermagenta","thistle":"distel","whitesmoke":"rookwit","wheat":"tarwebruin","violet":"violet","lightskyblue":"lichthemelsblauw","goldenrod":"goudbruin","mediumblue":"midblauw","skyblue":"hemelsblauw","crimson":"karmozijnrood","darksalmon":"donkerzalm","darkred":"donkerrood","darkslategrey":"donkerblauwgrijs","peru":"bruin","lightgrey":"lichtgrijs","lightgoldenrodyellow":"lichtgoudgeel","blanchedalmond":"amandel","aliceblue":"lichtblauw","bisque":"oranjegeel","slategray":"leigrijs","palegoldenrod":"bleekgeel","darkorange":"donkeroranje","aquamarine":"aquamarijn","lightgreen":"lichtgroen","burlywood":"lichtbruin","dodgerblue":"helderblauw","darkgray":"donkergrijs","lightcyan":"lichtcyaan","powderblue":"lichtblauw-wit","blueviolet":"violet","orchid":"orchidee","dimgray":"dofgrijs","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelblos","hotpink":"acaciaroze","steelblue":"staalblauw","tomato":"tomaat","lightpink":"lichtroze","limegreen":"limoengroen","indianred":"indisch rood","papayawhip":"papajaroze","lightslategray":"lichtblauwgrijs","gray":"grijs","mediumorchid":"midorchidee","cornsilk":"maïsgeel","black":"zwart","seagreen":"zeegroen","darkslateblue":"donkergrijsblauw","khaki":"kaki","lightblue":"lichtblauw","palegreen":"bleekgroen","azure":"azuur","peachpuff":"perzikroze","darkolivegreen":"donkerolijfgroen","yellowgreen":"geelgroen"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Eerdere opties","nextMessage":"Meer opties"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Annuleren","buttonSave":"Opslaan","itemClose":"Sluiten"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_nl-nl.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_nl-nl.js.uncompressed.js
new file mode 100644
index 000000000..7d02b7681
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_nl-nl.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_nl-nl',{
+'dijit/form/nls/validate':{"rangeMessage":"Deze waarde is niet toegestaan.","invalidMessage":"De opgegeven waarde is ongeldig.","missingMessage":"Deze waarde is verplicht."}
+,
+'dijit/nls/loading':{"loadingState":"Bezig met laden...","errorState":"Er is een fout opgetreden"}
+,
+'dojo/nls/colors':{"lightsteelblue":"lichtstaalblauw","orangered":"oranjerood","midnightblue":"nachtblauw","cadetblue":"donkerstaalblauw","seashell":"schelp","slategrey":"leigrijs","coral":"koraalrood","darkturquoise":"donkerturquoise","antiquewhite":"antiekwit","mediumspringgreen":"midlentegroen","transparent":"transparant","salmon":"zalm","darkgrey":"donkergrijs","ivory":"ivoorwit","greenyellow":"groengeel","mistyrose":"matroze","lightsalmon":"lichtzalm","silver":"zilvergrijs","dimgrey":"dofgrijs","orange":"oranje","white":"wit","navajowhite":"navajowit","royalblue":"koningsblauw","deeppink":"donkerroze","lime":"limoen","oldlace":"kant","chartreuse":"groengeel","darkcyan":"donkercyaan","yellow":"geel","linen":"linnen","olive":"olijfgroen","gold":"goud","lawngreen":"grasgroen","lightyellow":"lichtgeel","tan":"geelbruin","darkviolet":"donkerviolet","lightslategrey":"lichtblauwgrijs","grey":"grijs","darkkhaki":"donkerkaki","green":"groen","deepskyblue":"diephemelblauw","aqua":"aqua","sienna":"sienna","mintcream":"mintroomgeel","rosybrown":"roodbruin","mediumslateblue":"midgrijsblauw","magenta":"magenta","lightseagreen":"lichtzeegroen","cyan":"cyaan","olivedrab":"grijsbruin","darkgoldenrod":"donkergoud","slateblue":"leiblauw","mediumaquamarine":"midaquamarijn","lavender":"lavendelblauw","mediumseagreen":"midzeegroen","maroon":"kastanjebruin","darkslategray":"donkerblauwgrijs","mediumturquoise":"midturquoise","ghostwhite":"spierwit","darkblue":"donkerblauw","mediumvioletred":"midvioletrood","brown":"bruin","lightgray":"lichtgrijs","sandybrown":"zandbruin","pink":"roze","firebrick":"vuursteenrood","indigo":"indigo","snow":"sneeuwwit","darkorchid":"donkerorchidee","turquoise":"turquoise","chocolate":"chocoladebruin","springgreen":"lentegroen","moccasin":"moccasin","navy":"marineblauw","lemonchiffon":"citroengeel","teal":"grijsblauw","floralwhite":"rozewit","cornflowerblue":"korenbloemblauw","paleturquoise":"bleekturquoise","purple":"purper","gainsboro":"lichtblauwgrijs","plum":"pruim","red":"rood","blue":"blauw","forestgreen":"bosgroen","darkgreen":"donkergroen","honeydew":"meloen","darkseagreen":"donkerzeegroen","lightcoral":"lichtkoraal","palevioletred":"bleekvioletrood","mediumpurple":"midpurper","saddlebrown":"leerbruin","darkmagenta":"donkermagenta","thistle":"distel","whitesmoke":"rookwit","wheat":"tarwebruin","violet":"violet","lightskyblue":"lichthemelsblauw","goldenrod":"goudbruin","mediumblue":"midblauw","skyblue":"hemelsblauw","crimson":"karmozijnrood","darksalmon":"donkerzalm","darkred":"donkerrood","darkslategrey":"donkerblauwgrijs","peru":"bruin","lightgrey":"lichtgrijs","lightgoldenrodyellow":"lichtgoudgeel","blanchedalmond":"amandel","aliceblue":"lichtblauw","bisque":"oranjegeel","slategray":"leigrijs","palegoldenrod":"bleekgeel","darkorange":"donkeroranje","aquamarine":"aquamarijn","lightgreen":"lichtgroen","burlywood":"lichtbruin","dodgerblue":"helderblauw","darkgray":"donkergrijs","lightcyan":"lichtcyaan","powderblue":"lichtblauw-wit","blueviolet":"violet","orchid":"orchidee","dimgray":"dofgrijs","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelblos","hotpink":"acaciaroze","steelblue":"staalblauw","tomato":"tomaat","lightpink":"lichtroze","limegreen":"limoengroen","indianred":"indisch rood","papayawhip":"papajaroze","lightslategray":"lichtblauwgrijs","gray":"grijs","mediumorchid":"midorchidee","cornsilk":"maïsgeel","black":"zwart","seagreen":"zeegroen","darkslateblue":"donkergrijsblauw","khaki":"kaki","lightblue":"lichtblauw","palegreen":"bleekgroen","azure":"azuur","peachpuff":"perzikroze","darkolivegreen":"donkerolijfgroen","yellowgreen":"geelgroen"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Eerdere opties","nextMessage":"Meer opties"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Annuleren","buttonSave":"Opslaan","itemClose":"Sluiten"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_nl.js b/lib/dojo/nls/tt-rss-layer_nl.js
deleted file mode 100644
index 78bfcfca6..000000000
--- a/lib/dojo/nls/tt-rss-layer_nl.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dojo.nls.tt-rss-layer_nl");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.nl");dojo.nls.colors.nl={"lightsteelblue":"lichtstaalblauw","orangered":"oranjerood","midnightblue":"nachtblauw","cadetblue":"donkerstaalblauw","seashell":"schelp","slategrey":"leigrijs","coral":"koraalrood","darkturquoise":"donkerturquoise","antiquewhite":"antiekwit","mediumspringgreen":"midlentegroen","salmon":"zalm","darkgrey":"donkergrijs","ivory":"ivoorwit","greenyellow":"groengeel","mistyrose":"matroze","lightsalmon":"lichtzalm","silver":"zilvergrijs","dimgrey":"dofgrijs","orange":"oranje","white":"wit","navajowhite":"navajowit","royalblue":"koningsblauw","deeppink":"donkerroze","lime":"limoen","oldlace":"kant","chartreuse":"groengeel","darkcyan":"donkercyaan","yellow":"geel","linen":"linnen","olive":"olijfgroen","gold":"goud","lawngreen":"grasgroen","lightyellow":"lichtgeel","tan":"geelbruin","darkviolet":"donkerviolet","lightslategrey":"lichtblauwgrijs","grey":"grijs","darkkhaki":"donkerkaki","green":"groen","deepskyblue":"diephemelblauw","aqua":"aqua","sienna":"sienna","mintcream":"mintroomgeel","rosybrown":"roodbruin","mediumslateblue":"midgrijsblauw","magenta":"magenta","lightseagreen":"lichtzeegroen","cyan":"cyaan","olivedrab":"grijsbruin","darkgoldenrod":"donkergoud","slateblue":"leiblauw","mediumaquamarine":"midaquamarijn","lavender":"lavendelblauw","mediumseagreen":"midzeegroen","maroon":"kastanjebruin","darkslategray":"donkerblauwgrijs","mediumturquoise":"midturquoise","ghostwhite":"spierwit","darkblue":"donkerblauw","mediumvioletred":"midvioletrood","brown":"bruin","lightgray":"lichtgrijs","sandybrown":"zandbruin","pink":"roze","firebrick":"vuursteenrood","indigo":"indigo","snow":"sneeuwwit","darkorchid":"donkerorchidee","turquoise":"turquoise","chocolate":"chocoladebruin","springgreen":"lentegroen","moccasin":"moccasin","navy":"marineblauw","lemonchiffon":"citroengeel","teal":"grijsblauw","floralwhite":"rozewit","cornflowerblue":"korenbloemblauw","paleturquoise":"bleekturquoise","purple":"purper","gainsboro":"lichtblauwgrijs","plum":"pruim","red":"rood","blue":"blauw","forestgreen":"bosgroen","darkgreen":"donkergroen","honeydew":"meloen","darkseagreen":"donkerzeegroen","lightcoral":"lichtkoraal","palevioletred":"bleekvioletrood","mediumpurple":"midpurper","saddlebrown":"leerbruin","darkmagenta":"donkermagenta","thistle":"distel","whitesmoke":"rookwit","wheat":"tarwebruin","violet":"violet","lightskyblue":"lichthemelsblauw","goldenrod":"goudbruin","mediumblue":"midblauw","skyblue":"hemelsblauw","crimson":"karmozijnrood","darksalmon":"donkerzalm","darkred":"donkerrood","darkslategrey":"donkerblauwgrijs","peru":"bruin","lightgrey":"lichtgrijs","lightgoldenrodyellow":"lichtgoudgeel","blanchedalmond":"amandel","aliceblue":"lichtblauw","bisque":"oranjegeel","slategray":"leigrijs","palegoldenrod":"bleekgeel","darkorange":"donkeroranje","aquamarine":"aquamarijn","lightgreen":"lichtgroen","burlywood":"lichtbruin","dodgerblue":"helderblauw","darkgray":"donkergrijs","lightcyan":"lichtcyaan","powderblue":"lichtblauw-wit","blueviolet":"violet","orchid":"orchidee","dimgray":"dofgrijs","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelblos","hotpink":"acaciaroze","steelblue":"staalblauw","tomato":"tomaat","lightpink":"lichtroze","limegreen":"limoengroen","indianred":"indisch rood","papayawhip":"papajaroze","lightslategray":"lichtblauwgrijs","gray":"grijs","mediumorchid":"midorchidee","cornsilk":"maïsgeel","black":"zwart","seagreen":"zeegroen","darkslateblue":"donkergrijsblauw","khaki":"kaki","lightblue":"lichtblauw","palegreen":"bleekgroen","azure":"azuur","peachpuff":"perzikroze","darkolivegreen":"donkerolijfgroen","yellowgreen":"geelgroen"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.nl");dijit.nls.loading.nl={"loadingState":"Bezig met laden...","errorState":"Er is een fout opgetreden"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.nl");dijit.nls.common.nl={"buttonOk":"OK","buttonCancel":"Annuleren","buttonSave":"Opslaan","itemClose":"Sluiten"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.nl");dijit.form.nls.validate.nl={"rangeMessage":"Deze waarde is niet toegestaan.","invalidMessage":"De opgegeven waarde is ongeldig.","missingMessage":"Deze waarde is verplicht."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.nl");dijit.form.nls.ComboBox.nl={"previousMessage":"Eerdere opties","nextMessage":"Meer opties"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.nl");dojo.cldr.nls.number.nl={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_pl.js b/lib/dojo/nls/tt-rss-layer_pl.js
index dd78bb0fb..8de2ed118 100644
--- a/lib/dojo/nls/tt-rss-layer_pl.js
+++ b/lib/dojo/nls/tt-rss-layer_pl.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_pl");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.pl");dojo.nls.colors.pl={"lightsteelblue":"jasnostalowoniebieski","orangered":"pomarańczowoczerwony","midnightblue":"granatowoczarny","cadetblue":"niebieskoszary","seashell":"matowoliliowy","slategrey":"mysi","coral":"koralowy","darkturquoise":"mlecznoturkusowy","antiquewhite":"biel antyczna","mediumspringgreen":"średnia wiosenna zieleń","salmon":"łososiowy","darkgrey":"ciemnoszary","ivory":"kość słoniowa","greenyellow":"zielonożółty","mistyrose":"bladoróżany","lightsalmon":"jasnołososiowy","silver":"srebrny","dimgrey":"przyciemniony szary","orange":"pomarańczowy","white":"biały","navajowhite":"piaskowy","royalblue":"królewski błękit","deeppink":"głęboki różowy","lime":"limonkowy","oldlace":"bladopomarańczowy","chartreuse":"żółtooliwkowy","darkcyan":"ciemnoniebieskozielony","yellow":"żółty","linen":"lniany","olive":"oliwkowy","gold":"złoty","lawngreen":"trawiasty","lightyellow":"jasnożółty","tan":"śniady","darkviolet":"ciemnofiołkowy","lightslategrey":"jasny mysi","grey":"szary","darkkhaki":"ciemny khaki","green":"zielony","deepskyblue":"intensywny błękit nieba","aqua":"morski","sienna":"siena","mintcream":"jasnomiętowy","rosybrown":"różowobrązowy","mediumslateblue":"średni gołębi","magenta":"amarantowy","lightseagreen":"jasna zieleń morska","cyan":"niebieskozielony","olivedrab":"oliwkowa zieleń","darkgoldenrod":"ciemne stare złoto","slateblue":"gołębi","mediumaquamarine":"średnia akwamaryna","lavender":"lawendowy","mediumseagreen":"średnia zieleń morska","maroon":"kasztanowy","darkslategray":"ciemny mysi","mediumturquoise":"średni turkusowy","ghostwhite":"bladobiały","darkblue":"ciemnoniebieski","mediumvioletred":"średni fiołkowowoczerwony","brown":"brązowy","lightgray":"jasnoszary","sandybrown":"piaskowy brąz","pink":"różowy","firebrick":"ceglasty","indigo":"indygo","snow":"śnieżny","darkorchid":"ciemna orchidea","turquoise":"turkusowy","chocolate":"czekoladowy","springgreen":"wiosenna zieleń","moccasin":"mokasynowy","navy":"granatowy","lemonchiffon":"cytrynowy","teal":"zielonomodry","floralwhite":"kwiatowa biel","cornflowerblue":"chabrowy","paleturquoise":"bladoturkusowy","purple":"fioletowy","gainsboro":"bladoszary","plum":"śliwkowy","red":"czerwony","blue":"niebieski","forestgreen":"leśna zieleń","darkgreen":"ciemnozielony","honeydew":"miodowy","darkseagreen":"ciemna zieleń morska","lightcoral":"jasnokoralowy","palevioletred":"blady fiołkowoczerwony","mediumpurple":"średni fioletowy","saddlebrown":"brąz skórzany","darkmagenta":"ciemnoamarantowy","thistle":"bladofioletowy","whitesmoke":"przydymiony biały","wheat":"pszeniczny","violet":"fiołkowy","lightskyblue":"jasny błękit nieba","goldenrod":"stare złoto","mediumblue":"ciemnochabrowy","skyblue":"błękit nieba","crimson":"karmazynowy","darksalmon":"ciemnołososiowy","darkred":"ciemnoczerwony","darkslategrey":"ciemny mysi","peru":"jasnobrązowy","lightgrey":"jasnoszary","lightgoldenrodyellow":"jasnożółte stare złoto","blanchedalmond":"migdałowy","aliceblue":"bladoniebieski","bisque":"biszkoptowy","slategray":"mysi","palegoldenrod":"blade stare złoto","darkorange":"ciemnopomarańczowy","aquamarine":"akwamaryna","lightgreen":"jasnozielony","burlywood":"kolor drewna","dodgerblue":"błękit Dodgers","darkgray":"ciemnoszary","lightcyan":"jasnoniebieskozielony","powderblue":"jasnobladobłękitny","blueviolet":"błękitnofiołkowy","orchid":"orchidea","dimgray":"przyciemniony szary","beige":"beżowy","fuchsia":"fuksjowy","lavenderblush":"lawendowocielisty","hotpink":"odblaskoworóżowy","steelblue":"stalowoniebieski","tomato":"pomidorowy","lightpink":"jasnoróżowy","limegreen":"zielony limonkowy","indianred":"kasztanowy","papayawhip":"papaja","lightslategray":"jasny mysi","gray":"szary","mediumorchid":"średnia orchidea","cornsilk":"kukurydziany","black":"czarny","seagreen":"zieleń morska","darkslateblue":"ciemny gołębi","khaki":"khaki","lightblue":"jasnoniebieski","palegreen":"bladozielony","azure":"lazurowy","peachpuff":"brzoskwiniowy","darkolivegreen":"ciemnooliwkowy","yellowgreen":"żółtozielony"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.pl");dijit.nls.loading.pl={"loadingState":"Ładowanie...","errorState":"Niestety, wystąpił błąd"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.pl");dijit.nls.common.pl={"buttonOk":"OK","buttonCancel":"Anuluj","buttonSave":"Zapisz","itemClose":"Zamknij"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.pl");dijit.form.nls.validate.pl={"rangeMessage":"Ta wartość jest spoza zakresu.","invalidMessage":"Wprowadzona wartość jest niepoprawna.","missingMessage":"Ta wartość jest wymagana."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.pl");dijit.form.nls.ComboBox.pl={"previousMessage":"Poprzednie wybory","nextMessage":"Więcej wyborów"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.pl");dojo.cldr.nls.number.pl={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_pl",{"dijit/form/nls/validate":{"rangeMessage":"Ta wartość jest spoza zakresu.","invalidMessage":"Wprowadzona wartość jest niepoprawna.","missingMessage":"Ta wartość jest wymagana."},"dijit/nls/loading":{"loadingState":"Ładowanie...","errorState":"Niestety, wystąpił błąd"},"dojo/nls/colors":{"lightsteelblue":"jasnostalowoniebieski","orangered":"czerwona pomarańcza","midnightblue":"atramentowoniebieski","cadetblue":"szaroniebieski","seashell":"matowoliliowy","slategrey":"mysi","coral":"koralowy","darkturquoise":"ciemnoturkusowy","antiquewhite":"biel antyczna","mediumspringgreen":"średnia wiosenna zieleń","transparent":"przezroczysty","salmon":"łososiowy","darkgrey":"ciemnoszary","ivory":"kość słoniowa","greenyellow":"zielonożółty","mistyrose":"mglistoróżany","lightsalmon":"jasnołososiowy","silver":"srebrny","dimgrey":"przyciemniony szary","orange":"pomarańczowy","white":"biały","navajowhite":"biel Nawaho","royalblue":"królewska purpura","deeppink":"głęboki róż","lime":"limonkowy","oldlace":"ecru","chartreuse":"żółtooliwkowy","darkcyan":"ciemnoniebieskozielony","yellow":"żółty","linen":"lniany","olive":"oliwkowy","gold":"złoty","lawngreen":"trawiasty","lightyellow":"jasnożółty","tan":"śniady","darkviolet":"ciemnofiołkowy","lightslategrey":"jasny mysi","grey":"szary","darkkhaki":"ciemny khaki","green":"zielony","deepskyblue":"intensywny błękit nieba","aqua":"morski","sienna":"sjena","mintcream":"miętowokremowy","rosybrown":"różanobrązowy","mediumslateblue":"średni gołębi","magenta":"amarantowy","lightseagreen":"jasna zieleń morska","cyan":"niebieskozielony","olivedrab":"oliwkowozielony","darkgoldenrod":"ciemne stare złoto","slateblue":"gołębi","mediumaquamarine":"średnia akwamaryna","lavender":"lawendowy","mediumseagreen":"średnia zieleń morska","maroon":"rdzawoczerwony","darkslategray":"ciemny mysi","mediumturquoise":"średni turkusowy","ghostwhite":"sina biel","darkblue":"ciemnoniebieski","mediumvioletred":"średni fiołkowowoczerwony","brown":"brązowy","lightgray":"jasnoszary","sandybrown":"piaskowobrązowy","pink":"różowy","firebrick":"podpalana cegła","indigo":"indygo","snow":"śnieżny","darkorchid":"ciemna orchidea","turquoise":"turkusowy","chocolate":"czekoladowy","springgreen":"wiosenna zieleń","moccasin":"mokasynowy","navy":"granatowy","lemonchiffon":"babka cytrynowa","teal":"zielonomodry","floralwhite":"złamana biel","cornflowerblue":"niebieskochabrowy","paleturquoise":"bladoturkusowy","purple":"fioletowy","gainsboro":"jasnoniebieskawoszary","plum":"śliwkowy","red":"czerwony","blue":"niebieski","forestgreen":"leśna zieleń","darkgreen":"ciemnozielony","honeydew":"miodowy","darkseagreen":"ciemna zieleń morska","lightcoral":"jasnokoralowy","palevioletred":"bladofiołkowoczerwony","mediumpurple":"średni fioletowy","saddlebrown":"brąz skórzany","darkmagenta":"ciemnoamarantowy","thistle":"kwiat ostu","whitesmoke":"siwy","wheat":"pszeniczny","violet":"fiołkowy","lightskyblue":"jasny błękit nieba","goldenrod":"stare złoto","mediumblue":"średni niebieski","skyblue":"błękit nieba","crimson":"karmazynowy","darksalmon":"ciemnołososiowy","darkred":"ciemnoczerwony","darkslategrey":"ciemny mysi","peru":"palona glina","lightgrey":"jasnoszary","lightgoldenrodyellow":"jasne stare złoto","blanchedalmond":"obrany migdał","aliceblue":"bladoniebieski","bisque":"cielistobeżowy","slategray":"mysi","palegoldenrod":"blade stare złoto","darkorange":"ciemnopomarańczowy","aquamarine":"akwamaryna","lightgreen":"jasnozielony","burlywood":"piaskowobeżowy","dodgerblue":"niebieski Dodgersów","darkgray":"ciemnoszary","lightcyan":"jasnoniebieskozielony","powderblue":"jasnobladobłękitny","blueviolet":"błękitnofiołkowy","orchid":"orchidea","dimgray":"przyciemniony szary","beige":"beżowy","fuchsia":"fuksjowy","lavenderblush":"lawendoworóżowy","hotpink":"odblaskoworóżowy","steelblue":"stalowoniebieski","tomato":"pomidorowy","lightpink":"jasnoróżowy","limegreen":"limonkowozielony","indianred":"kasztanowy","papayawhip":"kremowa papaja","lightslategray":"jasny mysi","gray":"szary","mediumorchid":"średnia orchidea","cornsilk":"białożółty","black":"czarny","seagreen":"zieleń morska","darkslateblue":"ciemny gołębi","khaki":"khaki","lightblue":"jasnoniebieski","palegreen":"bladozielony","azure":"lazurowy","peachpuff":"cielisty brzoskwiniowy","darkolivegreen":"ciemnooliwkowozielony","yellowgreen":"żółtozielony"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Poprzednie wybory","nextMessage":"Więcej wyborów"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Anuluj","buttonSave":"Zapisz","itemClose":"Zamknij"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_pl.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_pl.js.uncompressed.js
new file mode 100644
index 000000000..5be92aa5b
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_pl.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_pl',{
+'dijit/form/nls/validate':{"rangeMessage":"Ta wartość jest spoza zakresu.","invalidMessage":"Wprowadzona wartość jest niepoprawna.","missingMessage":"Ta wartość jest wymagana."}
+,
+'dijit/nls/loading':{"loadingState":"Ładowanie...","errorState":"Niestety, wystąpił błąd"}
+,
+'dojo/nls/colors':{"lightsteelblue":"jasnostalowoniebieski","orangered":"czerwona pomarańcza","midnightblue":"atramentowoniebieski","cadetblue":"szaroniebieski","seashell":"matowoliliowy","slategrey":"mysi","coral":"koralowy","darkturquoise":"ciemnoturkusowy","antiquewhite":"biel antyczna","mediumspringgreen":"średnia wiosenna zieleń","transparent":"przezroczysty","salmon":"łososiowy","darkgrey":"ciemnoszary","ivory":"kość słoniowa","greenyellow":"zielonożółty","mistyrose":"mglistoróżany","lightsalmon":"jasnołososiowy","silver":"srebrny","dimgrey":"przyciemniony szary","orange":"pomarańczowy","white":"biały","navajowhite":"biel Nawaho","royalblue":"królewska purpura","deeppink":"głęboki róż","lime":"limonkowy","oldlace":"ecru","chartreuse":"żółtooliwkowy","darkcyan":"ciemnoniebieskozielony","yellow":"żółty","linen":"lniany","olive":"oliwkowy","gold":"złoty","lawngreen":"trawiasty","lightyellow":"jasnożółty","tan":"śniady","darkviolet":"ciemnofiołkowy","lightslategrey":"jasny mysi","grey":"szary","darkkhaki":"ciemny khaki","green":"zielony","deepskyblue":"intensywny błękit nieba","aqua":"morski","sienna":"sjena","mintcream":"miętowokremowy","rosybrown":"różanobrązowy","mediumslateblue":"średni gołębi","magenta":"amarantowy","lightseagreen":"jasna zieleń morska","cyan":"niebieskozielony","olivedrab":"oliwkowozielony","darkgoldenrod":"ciemne stare złoto","slateblue":"gołębi","mediumaquamarine":"średnia akwamaryna","lavender":"lawendowy","mediumseagreen":"średnia zieleń morska","maroon":"rdzawoczerwony","darkslategray":"ciemny mysi","mediumturquoise":"średni turkusowy","ghostwhite":"sina biel","darkblue":"ciemnoniebieski","mediumvioletred":"średni fiołkowowoczerwony","brown":"brązowy","lightgray":"jasnoszary","sandybrown":"piaskowobrązowy","pink":"różowy","firebrick":"podpalana cegła","indigo":"indygo","snow":"śnieżny","darkorchid":"ciemna orchidea","turquoise":"turkusowy","chocolate":"czekoladowy","springgreen":"wiosenna zieleń","moccasin":"mokasynowy","navy":"granatowy","lemonchiffon":"babka cytrynowa","teal":"zielonomodry","floralwhite":"złamana biel","cornflowerblue":"niebieskochabrowy","paleturquoise":"bladoturkusowy","purple":"fioletowy","gainsboro":"jasnoniebieskawoszary","plum":"śliwkowy","red":"czerwony","blue":"niebieski","forestgreen":"leśna zieleń","darkgreen":"ciemnozielony","honeydew":"miodowy","darkseagreen":"ciemna zieleń morska","lightcoral":"jasnokoralowy","palevioletred":"bladofiołkowoczerwony","mediumpurple":"średni fioletowy","saddlebrown":"brąz skórzany","darkmagenta":"ciemnoamarantowy","thistle":"kwiat ostu","whitesmoke":"siwy","wheat":"pszeniczny","violet":"fiołkowy","lightskyblue":"jasny błękit nieba","goldenrod":"stare złoto","mediumblue":"średni niebieski","skyblue":"błękit nieba","crimson":"karmazynowy","darksalmon":"ciemnołososiowy","darkred":"ciemnoczerwony","darkslategrey":"ciemny mysi","peru":"palona glina","lightgrey":"jasnoszary","lightgoldenrodyellow":"jasne stare złoto","blanchedalmond":"obrany migdał","aliceblue":"bladoniebieski","bisque":"cielistobeżowy","slategray":"mysi","palegoldenrod":"blade stare złoto","darkorange":"ciemnopomarańczowy","aquamarine":"akwamaryna","lightgreen":"jasnozielony","burlywood":"piaskowobeżowy","dodgerblue":"niebieski Dodgersów","darkgray":"ciemnoszary","lightcyan":"jasnoniebieskozielony","powderblue":"jasnobladobłękitny","blueviolet":"błękitnofiołkowy","orchid":"orchidea","dimgray":"przyciemniony szary","beige":"beżowy","fuchsia":"fuksjowy","lavenderblush":"lawendoworóżowy","hotpink":"odblaskoworóżowy","steelblue":"stalowoniebieski","tomato":"pomidorowy","lightpink":"jasnoróżowy","limegreen":"limonkowozielony","indianred":"kasztanowy","papayawhip":"kremowa papaja","lightslategray":"jasny mysi","gray":"szary","mediumorchid":"średnia orchidea","cornsilk":"białożółty","black":"czarny","seagreen":"zieleń morska","darkslateblue":"ciemny gołębi","khaki":"khaki","lightblue":"jasnoniebieski","palegreen":"bladozielony","azure":"lazurowy","peachpuff":"cielisty brzoskwiniowy","darkolivegreen":"ciemnooliwkowozielony","yellowgreen":"żółtozielony"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Poprzednie wybory","nextMessage":"Więcej wyborów"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Anuluj","buttonSave":"Zapisz","itemClose":"Zamknij"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_pt-br.js b/lib/dojo/nls/tt-rss-layer_pt-br.js
index c78390e9b..9a279f3b3 100644
--- a/lib/dojo/nls/tt-rss-layer_pt-br.js
+++ b/lib/dojo/nls/tt-rss-layer_pt-br.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_pt-br");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.pt_br");dojo.nls.colors.pt_br={"lightsteelblue":"azul aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","salmon":"salmão","darkgrey":"cinza escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa enevoado","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinza turvo","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul royal","deeppink":"rosa profundo","lime":"lima","oldlace":"cadarço velho","chartreuse":"chartreuse","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"oliva","gold":"dourado","lawngreen":"verde grama","lightyellow":"amarelo claro","tan":"tan","darkviolet":"violeta escuro","lightslategrey":"cinza ardósia claro","grey":"cinza","darkkhaki":"cáqui escuro","green":"verde","deepskyblue":"azul céu intenso","aqua":"aqua","sienna":"sienna","mintcream":"creme de menta","rosybrown":"marrom rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"verde oliva","darkgoldenrod":"goldenrod escuro","slateblue":"azul ardósia","mediumaquamarine":"água marinha médio","lavender":"lavanda","mediumseagreen":"verde marinho médio","maroon":"castanho","darkslategray":"cinza ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco ghost","darkblue":"azul escuro","mediumvioletred":"vermelho violeta médio","brown":"marrom","lightgray":"cinza claro","sandybrown":"marrom cor de areia","pink":"rosa","firebrick":"firebrick","indigo":"índigo","snow":"branco neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"moccasin","navy":"marinho","lemonchiffon":"limão chiffon","teal":"azul esverdeado","floralwhite":"branco floral","cornflowerblue":"azul centaurea","paleturquoise":"turquesa esbranquiçado","purple":"roxo","gainsboro":"gainsboro","plum":"ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"honeydew","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"vermelho violeta esbranquiçado","mediumpurple":"roxo médio","saddlebrown":"marrom saddle","darkmagenta":"magenta escuro","thistle":"thistle","whitesmoke":"fumaça branca","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"goldenrod","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinza ardósia escuro","peru":"peru","lightgrey":"cinza claro","lightgoldenrodyellow":"amarelo goldenrod claro","blanchedalmond":"amêndoa pelada","aliceblue":"azul alice","bisque":"bisque","slategray":"cinza ardósia","palegoldenrod":"goldenrod esbranquiçado","darkorange":"laranja escuro","aquamarine":"água marinha","lightgreen":"verde claro","burlywood":"burlywood","dodgerblue":"azul dodger","darkgray":"cinza escuro","lightcyan":"ciano claro","powderblue":"azul talco","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinza turvo","beige":"bege","fuchsia":"fúcsia","lavenderblush":"lavanda avermelhada","hotpink":"rosa quente","steelblue":"azul aço","tomato":"tomate","lightpink":"rosa claro","limegreen":"verde lima","indianred":"vermelho indiano","papayawhip":"creme de papaya","lightslategray":"cinza ardósia claro","gray":"cinza","mediumorchid":"orquídea médio","cornsilk":"cornsilk","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"cáqui","lightblue":"azul claro","palegreen":"verde esbranquiçado","azure":"azul celeste","peachpuff":"peach puff","darkolivegreen":"verde oliva escuro","yellowgreen":"verde amarelado"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.pt_br");dijit.nls.loading.pt_br={"loadingState":"Carregando...","errorState":"Desculpe, ocorreu um erro"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.pt_br");dijit.nls.common.pt_br={"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Salvar","itemClose":"Fechar"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.pt_br");dijit.form.nls.validate.pt_br={"rangeMessage":"Este valor está fora do intervalo. ","invalidMessage":"O valor inserido não é válido.","missingMessage":"Este valor é necessário."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.pt_br");dijit.form.nls.ComboBox.pt_br={"previousMessage":"Opções anteriores","nextMessage":"Mais opções"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.pt_br");dojo.cldr.nls.number.pt_br={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;(¤#,##0.00)","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_pt-br",{"dijit/form/nls/validate":{"rangeMessage":"Este valor está fora do intervalo. ","invalidMessage":"O valor inserido não é válido.","missingMessage":"Este valor é necessário."},"dijit/nls/loading":{"loadingState":"Carregando...","errorState":"Desculpe, ocorreu um erro"},"dojo/nls/colors":{"lightsteelblue":"azul aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","transparent":"transparente","salmon":"salmão","darkgrey":"cinza escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa enevoado","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinza turvo","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul royal","deeppink":"rosa profundo","lime":"lima","oldlace":"cadarço velho","chartreuse":"chartreuse","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"oliva","gold":"dourado","lawngreen":"verde grama","lightyellow":"amarelo claro","tan":"tan","darkviolet":"violeta escuro","lightslategrey":"cinza ardósia claro","grey":"cinza","darkkhaki":"cáqui escuro","green":"verde","deepskyblue":"azul céu intenso","aqua":"aqua","sienna":"sienna","mintcream":"creme de menta","rosybrown":"marrom rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"verde oliva","darkgoldenrod":"goldenrod escuro","slateblue":"azul ardósia","mediumaquamarine":"água marinha médio","lavender":"lavanda","mediumseagreen":"verde marinho médio","maroon":"castanho","darkslategray":"cinza ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco ghost","darkblue":"azul escuro","mediumvioletred":"vermelho violeta médio","brown":"marrom","lightgray":"cinza claro","sandybrown":"marrom cor de areia","pink":"rosa","firebrick":"firebrick","indigo":"índigo","snow":"branco neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"moccasin","navy":"marinho","lemonchiffon":"limão chiffon","teal":"azul esverdeado","floralwhite":"branco floral","cornflowerblue":"azul centaurea","paleturquoise":"turquesa esbranquiçado","purple":"roxo","gainsboro":"gainsboro","plum":"ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"honeydew","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"vermelho violeta esbranquiçado","mediumpurple":"roxo médio","saddlebrown":"marrom saddle","darkmagenta":"magenta escuro","thistle":"thistle","whitesmoke":"fumaça branca","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"goldenrod","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinza ardósia escuro","peru":"peru","lightgrey":"cinza claro","lightgoldenrodyellow":"amarelo goldenrod claro","blanchedalmond":"amêndoa pelada","aliceblue":"azul alice","bisque":"bisque","slategray":"cinza ardósia","palegoldenrod":"goldenrod esbranquiçado","darkorange":"laranja escuro","aquamarine":"água marinha","lightgreen":"verde claro","burlywood":"burlywood","dodgerblue":"azul dodger","darkgray":"cinza escuro","lightcyan":"ciano claro","powderblue":"azul talco","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinza turvo","beige":"bege","fuchsia":"fúcsia","lavenderblush":"lavanda avermelhada","hotpink":"rosa quente","steelblue":"azul aço","tomato":"tomate","lightpink":"rosa claro","limegreen":"verde lima","indianred":"vermelho indiano","papayawhip":"creme de papaya","lightslategray":"cinza ardósia claro","gray":"cinza","mediumorchid":"orquídea médio","cornsilk":"cornsilk","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"cáqui","lightblue":"azul claro","palegreen":"verde esbranquiçado","azure":"azul celeste","peachpuff":"peach puff","darkolivegreen":"verde oliva escuro","yellowgreen":"verde amarelado"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00;(¤#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Opções anteriores","nextMessage":"Mais opções"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Salvar","itemClose":"Fechar"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_pt-br.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_pt-br.js.uncompressed.js
new file mode 100644
index 000000000..0f5f2dfaa
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_pt-br.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_pt-br',{
+'dijit/form/nls/validate':{"rangeMessage":"Este valor está fora do intervalo. ","invalidMessage":"O valor inserido não é válido.","missingMessage":"Este valor é necessário."}
+,
+'dijit/nls/loading':{"loadingState":"Carregando...","errorState":"Desculpe, ocorreu um erro"}
+,
+'dojo/nls/colors':{"lightsteelblue":"azul aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","transparent":"transparente","salmon":"salmão","darkgrey":"cinza escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa enevoado","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinza turvo","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul royal","deeppink":"rosa profundo","lime":"lima","oldlace":"cadarço velho","chartreuse":"chartreuse","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"oliva","gold":"dourado","lawngreen":"verde grama","lightyellow":"amarelo claro","tan":"tan","darkviolet":"violeta escuro","lightslategrey":"cinza ardósia claro","grey":"cinza","darkkhaki":"cáqui escuro","green":"verde","deepskyblue":"azul céu intenso","aqua":"aqua","sienna":"sienna","mintcream":"creme de menta","rosybrown":"marrom rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"verde oliva","darkgoldenrod":"goldenrod escuro","slateblue":"azul ardósia","mediumaquamarine":"água marinha médio","lavender":"lavanda","mediumseagreen":"verde marinho médio","maroon":"castanho","darkslategray":"cinza ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco ghost","darkblue":"azul escuro","mediumvioletred":"vermelho violeta médio","brown":"marrom","lightgray":"cinza claro","sandybrown":"marrom cor de areia","pink":"rosa","firebrick":"firebrick","indigo":"índigo","snow":"branco neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"moccasin","navy":"marinho","lemonchiffon":"limão chiffon","teal":"azul esverdeado","floralwhite":"branco floral","cornflowerblue":"azul centaurea","paleturquoise":"turquesa esbranquiçado","purple":"roxo","gainsboro":"gainsboro","plum":"ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"honeydew","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"vermelho violeta esbranquiçado","mediumpurple":"roxo médio","saddlebrown":"marrom saddle","darkmagenta":"magenta escuro","thistle":"thistle","whitesmoke":"fumaça branca","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"goldenrod","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinza ardósia escuro","peru":"peru","lightgrey":"cinza claro","lightgoldenrodyellow":"amarelo goldenrod claro","blanchedalmond":"amêndoa pelada","aliceblue":"azul alice","bisque":"bisque","slategray":"cinza ardósia","palegoldenrod":"goldenrod esbranquiçado","darkorange":"laranja escuro","aquamarine":"água marinha","lightgreen":"verde claro","burlywood":"burlywood","dodgerblue":"azul dodger","darkgray":"cinza escuro","lightcyan":"ciano claro","powderblue":"azul talco","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinza turvo","beige":"bege","fuchsia":"fúcsia","lavenderblush":"lavanda avermelhada","hotpink":"rosa quente","steelblue":"azul aço","tomato":"tomate","lightpink":"rosa claro","limegreen":"verde lima","indianred":"vermelho indiano","papayawhip":"creme de papaya","lightslategray":"cinza ardósia claro","gray":"cinza","mediumorchid":"orquídea médio","cornsilk":"cornsilk","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"cáqui","lightblue":"azul claro","palegreen":"verde esbranquiçado","azure":"azul celeste","peachpuff":"peach puff","darkolivegreen":"verde oliva escuro","yellowgreen":"verde amarelado"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00;(¤#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Opções anteriores","nextMessage":"Mais opções"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Salvar","itemClose":"Fechar"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_pt-pt.js b/lib/dojo/nls/tt-rss-layer_pt-pt.js
index 7e805cd00..63440b1cd 100644
--- a/lib/dojo/nls/tt-rss-layer_pt-pt.js
+++ b/lib/dojo/nls/tt-rss-layer_pt-pt.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_pt-pt");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.pt_pt");dojo.nls.colors.pt_pt={"lightsteelblue":"azul-aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadete","seashell":"concha","slategrey":"cinzento ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","salmon":"salmão","darkgrey":"cinzento escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa pálido","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinzento esbatido","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul real","deeppink":"rosa profundo","lime":"lima","oldlace":"renda antiga","chartreuse":"amarelo esverdeado","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"azeitona","gold":"dourado","lawngreen":"verde relva","lightyellow":"amarelo claro","tan":"castanho claro","darkviolet":"violeta escuro","lightslategrey":"cinzento ardósia claro","grey":"cinzento","darkkhaki":"caqui escuro","green":"verde","deepskyblue":"azul céu profundo","aqua":"verde-água","sienna":"castanho-avermelhado","mintcream":"creme de menta","rosybrown":"castanho rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"azeitona claro","darkgoldenrod":"ouro velho escuro","slateblue":"azul ardósia","mediumaquamarine":"verde-azulado médio","lavender":"alfazema","mediumseagreen":"verde marinho médio","maroon":"bordeaux","darkslategray":"cinzento ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco sombreado","darkblue":"azul escuro","mediumvioletred":"violeta avermelhado médio","brown":"castanho","lightgray":"cinzento claro","sandybrown":"castanho areia","pink":"rosa","firebrick":"tijolo fogo","indigo":"índigo","snow":"branco-neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"mocassim","navy":"azul marinho","lemonchiffon":"limão chiffon","teal":"verde-azulado","floralwhite":"branco floral","cornflowerblue":"azul-violáceo","paleturquoise":"turquesa pálido","purple":"roxo","gainsboro":"cinzento azulado claro","plum":"cor-de-ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"mel","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"violeta avermelhado pálido","mediumpurple":"roxo médio","saddlebrown":"castanho sela","darkmagenta":"magenta escuro","thistle":"cardo","whitesmoke":"fumo branco","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"ouro velho","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinzento ardósia escuro","peru":"peru","lightgrey":"cinzento claro","lightgoldenrodyellow":"ouro velho amarelado claro","blanchedalmond":"amêndoa claro","aliceblue":"azul alice","bisque":"rosa-velho","slategray":"cinzento ardósia","palegoldenrod":"ouro velho pálido","darkorange":"laranja escuro","aquamarine":"verde-azulado","lightgreen":"verde claro","burlywood":"castanho pinho","dodgerblue":"azul furtivo","darkgray":"cinzento escuro","lightcyan":"ciano claro","powderblue":"azul de esmalte","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinzento esbatido","beige":"bege","fuchsia":"fúcsia","lavenderblush":"alfazema rosado","hotpink":"rosa forte","steelblue":"azul-aço","tomato":"vermelho tomate","lightpink":"rosa claro","limegreen":"verde-lima","indianred":"almagre","papayawhip":"creme de papaia","lightslategray":"cinzento ardósia claro","gray":"cinzento","mediumorchid":"orquídea médio","cornsilk":"branco seda","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"azul-celeste","peachpuff":"pêssego","darkolivegreen":"verde-azeitona escuro","yellowgreen":"verde amarelado"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.pt_pt");dijit.nls.loading.pt_pt={"loadingState":"A carregar...","errorState":"Lamentamos, mas ocorreu um erro"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.pt_pt");dijit.nls.common.pt_pt={"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Fechar"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.pt_pt");dijit.form.nls.validate.pt_pt={"rangeMessage":"Este valor encontra-se fora do intervalo.","invalidMessage":"O valor introduzido não é válido.","missingMessage":"Este valor é requerido."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.pt_pt");dijit.form.nls.ComboBox.pt_pt={"previousMessage":"Opções anteriores","nextMessage":"Mais opções"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.pt_pt");dojo.cldr.nls.number.pt_pt={"currencyFormat":"#,##0.00 ¤","group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_pt-pt",{"dijit/form/nls/validate":{"rangeMessage":"Este valor encontra-se fora do intervalo.","invalidMessage":"O valor introduzido não é válido.","missingMessage":"Este valor é requerido."},"dijit/nls/loading":{"loadingState":"A carregar...","errorState":"Lamentamos, mas ocorreu um erro"},"dojo/nls/colors":{"lightsteelblue":"azul-aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadete","seashell":"concha","slategrey":"cinzento ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","transparent":"transparente","salmon":"salmão","darkgrey":"cinzento escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa pálido","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinzento esbatido","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul real","deeppink":"rosa profundo","lime":"lima","oldlace":"renda antiga","chartreuse":"amarelo esverdeado","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"azeitona","gold":"dourado","lawngreen":"verde relva","lightyellow":"amarelo claro","tan":"castanho claro","darkviolet":"violeta escuro","lightslategrey":"cinzento ardósia claro","grey":"cinzento","darkkhaki":"caqui escuro","green":"verde","deepskyblue":"azul céu profundo","aqua":"verde-água","sienna":"castanho-avermelhado","mintcream":"creme de menta","rosybrown":"castanho rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"azeitona claro","darkgoldenrod":"ouro velho escuro","slateblue":"azul ardósia","mediumaquamarine":"verde-azulado médio","lavender":"alfazema","mediumseagreen":"verde marinho médio","maroon":"bordeaux","darkslategray":"cinzento ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco sombreado","darkblue":"azul escuro","mediumvioletred":"violeta avermelhado médio","brown":"castanho","lightgray":"cinzento claro","sandybrown":"castanho areia","pink":"rosa","firebrick":"tijolo fogo","indigo":"índigo","snow":"branco-neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"mocassim","navy":"azul marinho","lemonchiffon":"limão chiffon","teal":"verde-azulado","floralwhite":"branco floral","cornflowerblue":"azul-violáceo","paleturquoise":"turquesa pálido","purple":"roxo","gainsboro":"cinzento azulado claro","plum":"cor-de-ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"mel","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"violeta avermelhado pálido","mediumpurple":"roxo médio","saddlebrown":"castanho sela","darkmagenta":"magenta escuro","thistle":"cardo","whitesmoke":"fumo branco","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"ouro velho","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinzento ardósia escuro","peru":"peru","lightgrey":"cinzento claro","lightgoldenrodyellow":"ouro velho amarelado claro","blanchedalmond":"amêndoa claro","aliceblue":"azul alice","bisque":"rosa-velho","slategray":"cinzento ardósia","palegoldenrod":"ouro velho pálido","darkorange":"laranja escuro","aquamarine":"verde-azulado","lightgreen":"verde claro","burlywood":"castanho pinho","dodgerblue":"azul furtivo","darkgray":"cinzento escuro","lightcyan":"ciano claro","powderblue":"azul de esmalte","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinzento esbatido","beige":"bege","fuchsia":"fúcsia","lavenderblush":"alfazema rosado","hotpink":"rosa forte","steelblue":"azul-aço","tomato":"vermelho tomate","lightpink":"rosa claro","limegreen":"verde-lima","indianred":"almagre","papayawhip":"creme de papaia","lightslategray":"cinzento ardósia claro","gray":"cinzento","mediumorchid":"orquídea médio","cornsilk":"branco seda","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"azul-celeste","peachpuff":"pêssego","darkolivegreen":"verde-azeitona escuro","yellowgreen":"verde amarelado"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Opções anteriores","nextMessage":"Mais opções"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Fechar"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_pt-pt.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_pt-pt.js.uncompressed.js
new file mode 100644
index 000000000..cdf2af2e0
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_pt-pt.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_pt-pt',{
+'dijit/form/nls/validate':{"rangeMessage":"Este valor encontra-se fora do intervalo.","invalidMessage":"O valor introduzido não é válido.","missingMessage":"Este valor é requerido."}
+,
+'dijit/nls/loading':{"loadingState":"A carregar...","errorState":"Lamentamos, mas ocorreu um erro"}
+,
+'dojo/nls/colors':{"lightsteelblue":"azul-aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadete","seashell":"concha","slategrey":"cinzento ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","transparent":"transparente","salmon":"salmão","darkgrey":"cinzento escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa pálido","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinzento esbatido","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul real","deeppink":"rosa profundo","lime":"lima","oldlace":"renda antiga","chartreuse":"amarelo esverdeado","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"azeitona","gold":"dourado","lawngreen":"verde relva","lightyellow":"amarelo claro","tan":"castanho claro","darkviolet":"violeta escuro","lightslategrey":"cinzento ardósia claro","grey":"cinzento","darkkhaki":"caqui escuro","green":"verde","deepskyblue":"azul céu profundo","aqua":"verde-água","sienna":"castanho-avermelhado","mintcream":"creme de menta","rosybrown":"castanho rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"azeitona claro","darkgoldenrod":"ouro velho escuro","slateblue":"azul ardósia","mediumaquamarine":"verde-azulado médio","lavender":"alfazema","mediumseagreen":"verde marinho médio","maroon":"bordeaux","darkslategray":"cinzento ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco sombreado","darkblue":"azul escuro","mediumvioletred":"violeta avermelhado médio","brown":"castanho","lightgray":"cinzento claro","sandybrown":"castanho areia","pink":"rosa","firebrick":"tijolo fogo","indigo":"índigo","snow":"branco-neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"mocassim","navy":"azul marinho","lemonchiffon":"limão chiffon","teal":"verde-azulado","floralwhite":"branco floral","cornflowerblue":"azul-violáceo","paleturquoise":"turquesa pálido","purple":"roxo","gainsboro":"cinzento azulado claro","plum":"cor-de-ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"mel","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"violeta avermelhado pálido","mediumpurple":"roxo médio","saddlebrown":"castanho sela","darkmagenta":"magenta escuro","thistle":"cardo","whitesmoke":"fumo branco","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"ouro velho","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinzento ardósia escuro","peru":"peru","lightgrey":"cinzento claro","lightgoldenrodyellow":"ouro velho amarelado claro","blanchedalmond":"amêndoa claro","aliceblue":"azul alice","bisque":"rosa-velho","slategray":"cinzento ardósia","palegoldenrod":"ouro velho pálido","darkorange":"laranja escuro","aquamarine":"verde-azulado","lightgreen":"verde claro","burlywood":"castanho pinho","dodgerblue":"azul furtivo","darkgray":"cinzento escuro","lightcyan":"ciano claro","powderblue":"azul de esmalte","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinzento esbatido","beige":"bege","fuchsia":"fúcsia","lavenderblush":"alfazema rosado","hotpink":"rosa forte","steelblue":"azul-aço","tomato":"vermelho tomate","lightpink":"rosa claro","limegreen":"verde-lima","indianred":"almagre","papayawhip":"creme de papaia","lightslategray":"cinzento ardósia claro","gray":"cinzento","mediumorchid":"orquídea médio","cornsilk":"branco seda","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"azul-celeste","peachpuff":"pêssego","darkolivegreen":"verde-azeitona escuro","yellowgreen":"verde amarelado"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Opções anteriores","nextMessage":"Mais opções"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Fechar"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_pt.js b/lib/dojo/nls/tt-rss-layer_pt.js
deleted file mode 100644
index 8cc90f5cc..000000000
--- a/lib/dojo/nls/tt-rss-layer_pt.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dojo.nls.tt-rss-layer_pt");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.pt");dojo.nls.colors.pt={"lightsteelblue":"azul aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","salmon":"salmão","darkgrey":"cinza escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa enevoado","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinza turvo","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul royal","deeppink":"rosa profundo","lime":"lima","oldlace":"cadarço velho","chartreuse":"chartreuse","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"oliva","gold":"dourado","lawngreen":"verde grama","lightyellow":"amarelo claro","tan":"tan","darkviolet":"violeta escuro","lightslategrey":"cinza ardósia claro","grey":"cinza","darkkhaki":"cáqui escuro","green":"verde","deepskyblue":"azul céu intenso","aqua":"aqua","sienna":"sienna","mintcream":"creme de menta","rosybrown":"marrom rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"verde oliva","darkgoldenrod":"goldenrod escuro","slateblue":"azul ardósia","mediumaquamarine":"água marinha médio","lavender":"lavanda","mediumseagreen":"verde marinho médio","maroon":"castanho","darkslategray":"cinza ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco ghost","darkblue":"azul escuro","mediumvioletred":"vermelho violeta médio","brown":"marrom","lightgray":"cinza claro","sandybrown":"marrom cor de areia","pink":"rosa","firebrick":"firebrick","indigo":"índigo","snow":"branco neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"moccasin","navy":"marinho","lemonchiffon":"limão chiffon","teal":"azul esverdeado","floralwhite":"branco floral","cornflowerblue":"azul centaurea","paleturquoise":"turquesa esbranquiçado","purple":"roxo","gainsboro":"gainsboro","plum":"ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"honeydew","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"vermelho violeta esbranquiçado","mediumpurple":"roxo médio","saddlebrown":"marrom saddle","darkmagenta":"magenta escuro","thistle":"thistle","whitesmoke":"fumaça branca","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"goldenrod","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinza ardósia escuro","peru":"peru","lightgrey":"cinza claro","lightgoldenrodyellow":"amarelo goldenrod claro","blanchedalmond":"amêndoa pelada","aliceblue":"azul alice","bisque":"bisque","slategray":"cinza ardósia","palegoldenrod":"goldenrod esbranquiçado","darkorange":"laranja escuro","aquamarine":"água marinha","lightgreen":"verde claro","burlywood":"burlywood","dodgerblue":"azul dodger","darkgray":"cinza escuro","lightcyan":"ciano claro","powderblue":"azul talco","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinza turvo","beige":"bege","fuchsia":"fúcsia","lavenderblush":"lavanda avermelhada","hotpink":"rosa quente","steelblue":"azul aço","tomato":"tomate","lightpink":"rosa claro","limegreen":"verde lima","indianred":"vermelho indiano","papayawhip":"creme de papaya","lightslategray":"cinza ardósia claro","gray":"cinza","mediumorchid":"orquídea médio","cornsilk":"cornsilk","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"cáqui","lightblue":"azul claro","palegreen":"verde esbranquiçado","azure":"azul celeste","peachpuff":"peach puff","darkolivegreen":"verde oliva escuro","yellowgreen":"verde amarelado"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.pt");dijit.nls.loading.pt={"loadingState":"Carregando...","errorState":"Desculpe, ocorreu um erro"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.pt");dijit.nls.common.pt={"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Salvar","itemClose":"Fechar"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.pt");dijit.form.nls.validate.pt={"rangeMessage":"Este valor está fora do intervalo. ","invalidMessage":"O valor inserido não é válido.","missingMessage":"Este valor é necessário."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.pt");dijit.form.nls.ComboBox.pt={"previousMessage":"Opções anteriores","nextMessage":"Mais opções"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.pt");dojo.cldr.nls.number.pt={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;(¤#,##0.00)","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
diff --git a/lib/dojo/nls/tt-rss-layer_ru.js b/lib/dojo/nls/tt-rss-layer_ru.js
index 293429a4a..d2fe70754 100644
--- a/lib/dojo/nls/tt-rss-layer_ru.js
+++ b/lib/dojo/nls/tt-rss-layer_ru.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_ru");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ru");dojo.nls.colors.ru={"lightsteelblue":"светлый стальной","orangered":"оранжево-красный","midnightblue":"полуночно-синий","cadetblue":"серо-синий","seashell":"морская раковина","slategrey":"грифельно-серый","coral":"коралловый","darkturquoise":"темный бирюзовый","antiquewhite":"белый антик","mediumspringgreen":"нейтральный весенне-зеленый","salmon":"лососевый","darkgrey":"темно-серый","ivory":"слоновой кости","greenyellow":"зелено-желтый","mistyrose":"блекло-розовый","lightsalmon":"светло-лососевый","silver":"серебристый","dimgrey":"тускло-серый","orange":"оранжевый","white":"белый","navajowhite":"белый навахо","royalblue":"королевский голубой","deeppink":"темно-розовый","lime":"лайм","oldlace":"матово-белый","chartreuse":"желто-салатный","darkcyan":"темный циан","yellow":"желтый","linen":"хлопковый","olive":"оливковый","gold":"золотой","lawngreen":"зеленая лужайка","lightyellow":"светло-желтый","tan":"рыжевато-коричневый","darkviolet":"темно-фиолетовый","lightslategrey":"светлый грифельно-серый","grey":"серый","darkkhaki":"темный хаки","green":"зеленый","deepskyblue":"темный небесно-голубой","aqua":"зеленовато-голубой","sienna":"охра","mintcream":"мятно-кремовый","rosybrown":"розово-коричневый","mediumslateblue":"нейтральный грифельно-синий","magenta":"пурпурный","lightseagreen":"светлый морской волны","cyan":"циан","olivedrab":"желтовато-серый","darkgoldenrod":"темно-золотистый","slateblue":"грифельно-синий","mediumaquamarine":"нейтральный аквамарин","lavender":"бледно-лиловый","mediumseagreen":"нейтральный морской волны","maroon":"темно-бордовый","darkslategray":"темный грифельно-серый","mediumturquoise":"нейтральный бирюзовый","ghostwhite":"призрачно-белый","darkblue":"темно-синий","mediumvioletred":"нейтральный фиолетово-красный","brown":"коричневый","lightgray":"светло-серый","sandybrown":"коричнево-песчаный","pink":"розовый","firebrick":"кирпичный","indigo":"индиго","snow":"белоснежный","darkorchid":"темный орсель","turquoise":"бирюзовый","chocolate":"шоколадный","springgreen":"весенний зеленый","moccasin":"мокасин","navy":"темно-синий","lemonchiffon":"бледно-лимонный","teal":"чирок","floralwhite":"цветочно-белый","cornflowerblue":"фиолетово-синий","paleturquoise":"бледно-бирюзовый","purple":"фиолетовый","gainsboro":"бледно-серый","plum":"сливовый","red":"красный","blue":"синий","forestgreen":"зеленый лесной","darkgreen":"темно-зеленый","honeydew":"медовый","darkseagreen":"темный морской волны","lightcoral":"светло-коралловый","palevioletred":"бледный фиолетово-красный","mediumpurple":"нейтральный фиолетовый","saddlebrown":"кожано-коричневый","darkmagenta":"темно-пурпурный","thistle":"чертополох","whitesmoke":"дымчато-белый","wheat":"пшеница","violet":"фиолетовый","lightskyblue":"светлый небесно-голубой","goldenrod":"золотистый","mediumblue":"нейтральный синий","skyblue":"небесно-голубой","crimson":"малиновый","darksalmon":"темно-лососевый","darkred":"темно-красный","darkslategrey":"темный грифельно-серый","peru":"перу","lightgrey":"светло-серый","lightgoldenrodyellow":"светло-золотистый","blanchedalmond":"светло-миндальный","aliceblue":"серо-голубой","bisque":"бисквитный","slategray":"грифельно-серый","palegoldenrod":"бледно-золотистый","darkorange":"темно-оранжевый","aquamarine":"аквамарин","lightgreen":"светло-зеленый","burlywood":"светло-коричневый","dodgerblue":"бледно-синий","darkgray":"темно-серый","lightcyan":"светлый циан","powderblue":"пороховой","blueviolet":"сине-фиолетовый","orchid":"орсель","dimgray":"тускло-серый","beige":"бежевый","fuchsia":"фуксин","lavenderblush":"розовато-лиловый","hotpink":"красно-розовый","steelblue":"стальной","tomato":"помидор","lightpink":"светло-розовый","limegreen":"зеленый лайм","indianred":"индийский красный","papayawhip":"черенок папайи","lightslategray":"светлый грифельно-серый","gray":"серый","mediumorchid":"нейтральный орсель","cornsilk":"шелковый оттенок","black":"черный","seagreen":"морской волны","darkslateblue":"темный грифельно-синий","khaki":"хаки","lightblue":"светло-синий","palegreen":"бледно-зеленый","azure":"лазурный","peachpuff":"персиковый","darkolivegreen":"темно-оливковый","yellowgreen":"желто-зеленый"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ru");dijit.nls.loading.ru={"loadingState":"Загрузка...","errorState":"Извините, возникла ошибка"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ru");dijit.nls.common.ru={"buttonOk":"ОК","buttonCancel":"Отмена","buttonSave":"Сохранить","itemClose":"Закрыть"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ru");dijit.form.nls.validate.ru={"rangeMessage":"Это значение вне диапазона.","invalidMessage":"Указано недопустимое значение.","missingMessage":"Это обязательное значение."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ru");dijit.form.nls.ComboBox.ru={"previousMessage":"Предыдущие варианты","nextMessage":"Следующие варианты"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ru");dojo.cldr.nls.number.ru={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_ru",{"dijit/form/nls/validate":{"rangeMessage":"Это значение вне диапазона.","invalidMessage":"Указано недопустимое значение.","missingMessage":"Это обязательное значение."},"dijit/nls/loading":{"loadingState":"Загрузка...","errorState":"Извините, возникла ошибка"},"dojo/nls/colors":{"lightsteelblue":"светлый стальной","orangered":"оранжево-красный","midnightblue":"полуночно-синий","cadetblue":"серо-синий","seashell":"морская раковина","slategrey":"грифельно-серый","coral":"коралловый","darkturquoise":"темный бирюзовый","antiquewhite":"белый антик","mediumspringgreen":"нейтральный весенне-зеленый","transparent":"прозрачный","salmon":"лососевый","darkgrey":"темно-серый","ivory":"слоновой кости","greenyellow":"зелено-желтый","mistyrose":"блекло-розовый","lightsalmon":"светло-лососевый","silver":"серебристый","dimgrey":"тускло-серый","orange":"оранжевый","white":"белый","navajowhite":"белый навахо","royalblue":"королевский голубой","deeppink":"темно-розовый","lime":"лайм","oldlace":"матово-белый","chartreuse":"желто-салатный","darkcyan":"темный циан","yellow":"желтый","linen":"хлопковый","olive":"оливковый","gold":"золотой","lawngreen":"зеленая лужайка","lightyellow":"светло-желтый","tan":"рыжевато-коричневый","darkviolet":"темно-фиолетовый","lightslategrey":"светлый грифельно-серый","grey":"серый","darkkhaki":"темный хаки","green":"зеленый","deepskyblue":"темный небесно-голубой","aqua":"зеленовато-голубой","sienna":"охра","mintcream":"мятно-кремовый","rosybrown":"розово-коричневый","mediumslateblue":"нейтральный грифельно-синий","magenta":"пурпурный","lightseagreen":"светлый морской волны","cyan":"циан","olivedrab":"желтовато-серый","darkgoldenrod":"темно-золотистый","slateblue":"грифельно-синий","mediumaquamarine":"нейтральный аквамарин","lavender":"бледно-лиловый","mediumseagreen":"нейтральный морской волны","maroon":"темно-бордовый","darkslategray":"темный грифельно-серый","mediumturquoise":"нейтральный бирюзовый","ghostwhite":"призрачно-белый","darkblue":"темно-синий","mediumvioletred":"нейтральный фиолетово-красный","brown":"коричневый","lightgray":"светло-серый","sandybrown":"коричнево-песчаный","pink":"розовый","firebrick":"кирпичный","indigo":"индиго","snow":"белоснежный","darkorchid":"темный орсель","turquoise":"бирюзовый","chocolate":"шоколадный","springgreen":"весенний зеленый","moccasin":"мокасин","navy":"темно-синий","lemonchiffon":"бледно-лимонный","teal":"чирок","floralwhite":"цветочно-белый","cornflowerblue":"фиолетово-синий","paleturquoise":"бледно-бирюзовый","purple":"фиолетовый","gainsboro":"бледно-серый","plum":"сливовый","red":"красный","blue":"синий","forestgreen":"зеленый лесной","darkgreen":"темно-зеленый","honeydew":"медовый","darkseagreen":"темный морской волны","lightcoral":"светло-коралловый","palevioletred":"бледный фиолетово-красный","mediumpurple":"нейтральный фиолетовый","saddlebrown":"кожано-коричневый","darkmagenta":"темно-пурпурный","thistle":"чертополох","whitesmoke":"дымчато-белый","wheat":"пшеница","violet":"фиолетовый","lightskyblue":"светлый небесно-голубой","goldenrod":"золотистый","mediumblue":"нейтральный синий","skyblue":"небесно-голубой","crimson":"малиновый","darksalmon":"темно-лососевый","darkred":"темно-красный","darkslategrey":"темный грифельно-серый","peru":"перу","lightgrey":"светло-серый","lightgoldenrodyellow":"светло-золотистый","blanchedalmond":"светло-миндальный","aliceblue":"серо-голубой","bisque":"бисквитный","slategray":"грифельно-серый","palegoldenrod":"бледно-золотистый","darkorange":"темно-оранжевый","aquamarine":"аквамарин","lightgreen":"светло-зеленый","burlywood":"светло-коричневый","dodgerblue":"бледно-синий","darkgray":"темно-серый","lightcyan":"светлый циан","powderblue":"пороховой","blueviolet":"сине-фиолетовый","orchid":"орсель","dimgray":"тускло-серый","beige":"бежевый","fuchsia":"фуксин","lavenderblush":"розовато-лиловый","hotpink":"красно-розовый","steelblue":"стальной","tomato":"помидор","lightpink":"светло-розовый","limegreen":"зеленый лайм","indianred":"индийский красный","papayawhip":"черенок папайи","lightslategray":"светлый грифельно-серый","gray":"серый","mediumorchid":"нейтральный орсель","cornsilk":"шелковый оттенок","black":"черный","seagreen":"морской волны","darkslateblue":"темный грифельно-синий","khaki":"хаки","lightblue":"светло-синий","palegreen":"бледно-зеленый","azure":"лазурный","peachpuff":"персиковый","darkolivegreen":"темно-оливковый","yellowgreen":"желто-зеленый"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Предыдущие варианты","nextMessage":"Следующие варианты"},"dijit/nls/common":{"buttonOk":"ОК","buttonCancel":"Отмена","buttonSave":"Сохранить","itemClose":"Закрыть"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_ru.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_ru.js.uncompressed.js
new file mode 100644
index 000000000..84fbc91d5
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_ru.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_ru',{
+'dijit/form/nls/validate':{"rangeMessage":"Это значение вне диапазона.","invalidMessage":"Указано недопустимое значение.","missingMessage":"Это обязательное значение."}
+,
+'dijit/nls/loading':{"loadingState":"Загрузка...","errorState":"Извините, возникла ошибка"}
+,
+'dojo/nls/colors':{"lightsteelblue":"светлый стальной","orangered":"оранжево-красный","midnightblue":"полуночно-синий","cadetblue":"серо-синий","seashell":"морская раковина","slategrey":"грифельно-серый","coral":"коралловый","darkturquoise":"темный бирюзовый","antiquewhite":"белый антик","mediumspringgreen":"нейтральный весенне-зеленый","transparent":"прозрачный","salmon":"лососевый","darkgrey":"темно-серый","ivory":"слоновой кости","greenyellow":"зелено-желтый","mistyrose":"блекло-розовый","lightsalmon":"светло-лососевый","silver":"серебристый","dimgrey":"тускло-серый","orange":"оранжевый","white":"белый","navajowhite":"белый навахо","royalblue":"королевский голубой","deeppink":"темно-розовый","lime":"лайм","oldlace":"матово-белый","chartreuse":"желто-салатный","darkcyan":"темный циан","yellow":"желтый","linen":"хлопковый","olive":"оливковый","gold":"золотой","lawngreen":"зеленая лужайка","lightyellow":"светло-желтый","tan":"рыжевато-коричневый","darkviolet":"темно-фиолетовый","lightslategrey":"светлый грифельно-серый","grey":"серый","darkkhaki":"темный хаки","green":"зеленый","deepskyblue":"темный небесно-голубой","aqua":"зеленовато-голубой","sienna":"охра","mintcream":"мятно-кремовый","rosybrown":"розово-коричневый","mediumslateblue":"нейтральный грифельно-синий","magenta":"пурпурный","lightseagreen":"светлый морской волны","cyan":"циан","olivedrab":"желтовато-серый","darkgoldenrod":"темно-золотистый","slateblue":"грифельно-синий","mediumaquamarine":"нейтральный аквамарин","lavender":"бледно-лиловый","mediumseagreen":"нейтральный морской волны","maroon":"темно-бордовый","darkslategray":"темный грифельно-серый","mediumturquoise":"нейтральный бирюзовый","ghostwhite":"призрачно-белый","darkblue":"темно-синий","mediumvioletred":"нейтральный фиолетово-красный","brown":"коричневый","lightgray":"светло-серый","sandybrown":"коричнево-песчаный","pink":"розовый","firebrick":"кирпичный","indigo":"индиго","snow":"белоснежный","darkorchid":"темный орсель","turquoise":"бирюзовый","chocolate":"шоколадный","springgreen":"весенний зеленый","moccasin":"мокасин","navy":"темно-синий","lemonchiffon":"бледно-лимонный","teal":"чирок","floralwhite":"цветочно-белый","cornflowerblue":"фиолетово-синий","paleturquoise":"бледно-бирюзовый","purple":"фиолетовый","gainsboro":"бледно-серый","plum":"сливовый","red":"красный","blue":"синий","forestgreen":"зеленый лесной","darkgreen":"темно-зеленый","honeydew":"медовый","darkseagreen":"темный морской волны","lightcoral":"светло-коралловый","palevioletred":"бледный фиолетово-красный","mediumpurple":"нейтральный фиолетовый","saddlebrown":"кожано-коричневый","darkmagenta":"темно-пурпурный","thistle":"чертополох","whitesmoke":"дымчато-белый","wheat":"пшеница","violet":"фиолетовый","lightskyblue":"светлый небесно-голубой","goldenrod":"золотистый","mediumblue":"нейтральный синий","skyblue":"небесно-голубой","crimson":"малиновый","darksalmon":"темно-лососевый","darkred":"темно-красный","darkslategrey":"темный грифельно-серый","peru":"перу","lightgrey":"светло-серый","lightgoldenrodyellow":"светло-золотистый","blanchedalmond":"светло-миндальный","aliceblue":"серо-голубой","bisque":"бисквитный","slategray":"грифельно-серый","palegoldenrod":"бледно-золотистый","darkorange":"темно-оранжевый","aquamarine":"аквамарин","lightgreen":"светло-зеленый","burlywood":"светло-коричневый","dodgerblue":"бледно-синий","darkgray":"темно-серый","lightcyan":"светлый циан","powderblue":"пороховой","blueviolet":"сине-фиолетовый","orchid":"орсель","dimgray":"тускло-серый","beige":"бежевый","fuchsia":"фуксин","lavenderblush":"розовато-лиловый","hotpink":"красно-розовый","steelblue":"стальной","tomato":"помидор","lightpink":"светло-розовый","limegreen":"зеленый лайм","indianred":"индийский красный","papayawhip":"черенок папайи","lightslategray":"светлый грифельно-серый","gray":"серый","mediumorchid":"нейтральный орсель","cornsilk":"шелковый оттенок","black":"черный","seagreen":"морской волны","darkslateblue":"темный грифельно-синий","khaki":"хаки","lightblue":"светло-синий","palegreen":"бледно-зеленый","azure":"лазурный","peachpuff":"персиковый","darkolivegreen":"темно-оливковый","yellowgreen":"желто-зеленый"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Предыдущие варианты","nextMessage":"Следующие варианты"}
+,
+'dijit/nls/common':{"buttonOk":"ОК","buttonCancel":"Отмена","buttonSave":"Сохранить","itemClose":"Закрыть"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_sk.js b/lib/dojo/nls/tt-rss-layer_sk.js
index 273f62030..3f99f0144 100644
--- a/lib/dojo/nls/tt-rss-layer_sk.js
+++ b/lib/dojo/nls/tt-rss-layer_sk.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_sk");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.sk");dojo.nls.colors.sk={"lightsteelblue":"oceľovo modrá svetlá","orangered":"oranžovo červená","midnightblue":"nočná modrá","cadetblue":"sivomodrá","seashell":"lastúrová","slategrey":"bridlicová sivá","coral":"koralová","darkturquoise":"tyrkysová tmavá","antiquewhite":"antická biela","mediumspringgreen":"jarná zelená stredná","salmon":"lososovo ružová","darkgrey":"tmavosivá","ivory":"slonovinová","greenyellow":"žltozelená","mistyrose":"zahmlená ruža","lightsalmon":"lososovo ružová svetlá","silver":"strieborná","dimgrey":"sivá matná","orange":"oranžová","white":"biela","navajowhite":"navajská biela","royalblue":"kráľovská modrá","deeppink":"hlboká ružová","lime":"lipová","oldlace":"stará čipka","chartreuse":"kartúza","darkcyan":"tmavozelenomodrá","yellow":"žltá","linen":"ľan","olive":"olivovo zelená","gold":"zlatá","lawngreen":"zelená tráva","lightyellow":"svetložltá","tan":"žltohnedá","darkviolet":"tmavofialová","lightslategrey":"bridlicová sivá svetlá","grey":"sivá","darkkhaki":"žltohnedá tmavá","green":"zelená","deepskyblue":"hlboká blankytná modrá","aqua":"svetlá zelenomodrá","sienna":"sienská","mintcream":"mätová krémová","rosybrown":"ružovo hnedá","mediumslateblue":"bridlicová modrá stredná","magenta":"purpurová","lightseagreen":"morská zelená svetlá","cyan":"zelenomodrá","olivedrab":"olivovo zelená fádna","darkgoldenrod":"zlatobyľová tmavá","slateblue":"bridlicová modrá","mediumaquamarine":"akvamarínová stredná","lavender":"levanduľová","mediumseagreen":"morská zelená stredná","maroon":"gaštanovo hnedá","darkslategray":"bridlicová sivá tmavá","mediumturquoise":"tyrkysová stredná","ghostwhite":"biely tieň","darkblue":"tmavomodrá","mediumvioletred":"fialovočervená stredná","brown":"hnedá","lightgray":"svetlosivá","sandybrown":"pieskovo hnedá","pink":"ružová","firebrick":"pálená tehla","indigo":"fialovo modrá","snow":"snehobiela","darkorchid":"orchideovo ružová tmavá","turquoise":"tyrkysová","chocolate":"čokoládovo hnedá","springgreen":"jarná zelená","moccasin":"črievičníková","navy":"vojenská zelená","lemonchiffon":"citrónový šifón","teal":"tyrkysová","floralwhite":"kvetinová biela","cornflowerblue":"nevädzovo modrá","paleturquoise":"bledo tyrkysová","purple":"purpurová","gainsboro":"sivomodrá svetlá","plum":"slivková","red":"červená","blue":"modrá","forestgreen":"lesná zelená","darkgreen":"tmavozelená","honeydew":"ambrózia","darkseagreen":"morská zelená tmavá","lightcoral":"koralová svetlá","palevioletred":"bledá fialovo červená","mediumpurple":"purpurová stredná","saddlebrown":"sedlová hnedá","darkmagenta":"tmavopurpurová","thistle":"bodliaková fialová","whitesmoke":"biely dym","wheat":"pšeničná","violet":"fialová","lightskyblue":"blankytná modrá svetlá","goldenrod":"zlatobyľ","mediumblue":"stredne modrá","skyblue":"blankytná modrá","crimson":"karmínová","darksalmon":"lososovo ružová tmavá","darkred":"tmavočervená","darkslategrey":"bridlicová sivá tmavá","peru":"peru","lightgrey":"svetlosivá","lightgoldenrodyellow":"zlatobyľová svetlá","blanchedalmond":"lúpané mandle","aliceblue":"modrá alice","bisque":"biskvitová","slategray":"bridlicová sivá","palegoldenrod":"bledá zlatobyľová","darkorange":"tmavooranžová","aquamarine":"akvamarínová","lightgreen":"svetlozelená","burlywood":"pieskovo hnedá","dodgerblue":"modrá dodger","darkgray":"tmavosivá","lightcyan":"zelenomodrá svetlá","powderblue":"prášková modrá","blueviolet":"modrofialová","orchid":"orchideovo ružová","dimgray":"sivá matná","beige":"béžová","fuchsia":"purpurová","lavenderblush":"levanduľový rumenec","hotpink":"teplá ružová","steelblue":"oceľovo modrá","tomato":"paradajková červená","lightpink":"svetloružová","limegreen":"lipová zelená","indianred":"indická červená","papayawhip":"papájový krém","lightslategray":"bridlicová sivá svetlá","gray":"sivá","mediumorchid":"orchideovo ružová stredná","cornsilk":"hodvábna žltá","black":"čierna","seagreen":"morská zelená","darkslateblue":"bridlicová modrá tmavá","khaki":"khaki","lightblue":"svetlomodrá","palegreen":"bledozelená","azure":"azúrová","peachpuff":"broskyňová pena","darkolivegreen":"olivovozelená tmavá","yellowgreen":"žltozelená"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.sk");dijit.nls.loading.sk={"loadingState":"Zavádzanie...","errorState":"Nastala chyba"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.sk");dijit.nls.common.sk={"buttonOk":"OK","buttonCancel":"Zrušiť","buttonSave":"Uložiť","itemClose":"Zatvoriť"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.sk");dijit.form.nls.validate.sk={"rangeMessage":"Táto hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota nie je platná.","missingMessage":"Táto hodnota je vyžadovaná."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.sk");dijit.form.nls.ComboBox.sk={"previousMessage":"Predchádzajúce voľby","nextMessage":"Ďalšie voľby"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.sk");dojo.cldr.nls.number.sk={"currencyFormat":"#,##0.00 ¤","group":" ","decimal":",","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","percentFormat":"#,##0%","decimalFormat":"#,##0.###","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_sk",{"dijit/form/nls/validate":{"rangeMessage":"Táto hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota nie je platná.","missingMessage":"Táto hodnota je vyžadovaná."},"dijit/nls/loading":{"loadingState":"Zavádzanie...","errorState":"Nastala chyba"},"dojo/nls/colors":{"lightsteelblue":"svetlá oceľovomodrá","orangered":"oranžovo červená","midnightblue":"polnočná modrá","cadetblue":"červeno modrá","seashell":"lastúrová","slategrey":"bridlicová sivá","coral":"koralová","darkturquoise":"tmavá tyrkysová","antiquewhite":"antická biela","mediumspringgreen":"stredná jarná zelená","transparent":"priesvitná","salmon":"lososová","darkgrey":"tmavosivá","ivory":"slonovina","greenyellow":"zelenožltá","mistyrose":"zahmlená ruža","lightsalmon":"svetlá lososová","silver":"strieborná","dimgrey":"matná sivá","orange":"oranžová","white":"biela","navajowhite":"navajská biela","royalblue":"kráľovská modrá","deeppink":"hlboká ružová","lime":"limetková","oldlace":"stará čipka","chartreuse":"kartúzska","darkcyan":"tmavá zelenomodrá","yellow":"žltá","linen":"ľan","olive":"olivová","gold":"zlatá","lawngreen":"trávová zelená","lightyellow":"svetložltá","tan":"žltohnedá","darkviolet":"tmavofialová","lightslategrey":"svetlá bridlicová sivá","grey":"sivá","darkkhaki":"tmavá žltohnedá","green":"zelená","deepskyblue":"hlboká modrá obloha","aqua":"vodová","sienna":"sienská","mintcream":"mätová krémová","rosybrown":"ružovo hnedá","mediumslateblue":"stredná bridlicová modrá","magenta":"purpurová","lightseagreen":"svetlá morská zelená","cyan":"zelenomodrá","olivedrab":"fádna olivová","darkgoldenrod":"tmavá zlatobyľ","slateblue":"bridlicová modrá","mediumaquamarine":"stredná akvamarínová","lavender":"levanduľa","mediumseagreen":"stredná morská zelená","maroon":"gaštanová hnedá","darkslategray":"tmavá bridlicová sivá","mediumturquoise":"stredná tyrkysová","ghostwhite":"biela (ghost white)","darkblue":"tmavomodrá","mediumvioletred":"stredná fialovočervená","brown":"hnedá","lightgray":"svetlosivá","sandybrown":"piesková hnedá","pink":"ružová","firebrick":"pálená tehla","indigo":"indigo","snow":"snehová","darkorchid":"tmavá orchidea","turquoise":"tyrkysová","chocolate":"čokoládová","springgreen":"jarná zelená","moccasin":"mokasínová","navy":"námornícka","lemonchiffon":"citrónový šifón","teal":"zelenomodrá","floralwhite":"biely kvet","cornflowerblue":"nevädzová modrá","paleturquoise":"bledá tyrkysová","purple":"purpurová","gainsboro":"sivá - gainsboro","plum":"slivková","red":"červená","blue":"modrá","forestgreen":"lesná zelená","darkgreen":"tmavozelená","honeydew":"ambrózia","darkseagreen":"tmavá morská zelená","lightcoral":"svetlá koralová","palevioletred":"bledá fialovo červená","mediumpurple":"stredná purpurová","saddlebrown":"sedlová hnedá","darkmagenta":"tmavá purpurová","thistle":"bodliaková","whitesmoke":"biely dym","wheat":"pšeničná","violet":"fialová","lightskyblue":"svetlá modrá obloha","goldenrod":"zlatobyľ","mediumblue":"stredná modrá","skyblue":"modré nebo","crimson":"karmínová","darksalmon":"tmavá lososová","darkred":"tmavočervená","darkslategrey":"tmavá bridlicová sivá","peru":"peru","lightgrey":"svetlosivá","lightgoldenrodyellow":"svetlá zlatobyľová žltá","blanchedalmond":"bledá mandľová","aliceblue":"modrá (alice)","bisque":"porcelánová","slategray":"bridlicová sivá","palegoldenrod":"bledá zlatobyľová","darkorange":"tmavá oranžová","aquamarine":"akvamarínová","lightgreen":"svetlozelená","burlywood":"drevená hnedá","dodgerblue":"modrá (dodger)","darkgray":"tmavosivá","lightcyan":"svetlá zelenomodrá","powderblue":"prášková modrá","blueviolet":"modro-fialová","orchid":"orchideová","dimgray":"matná sivá","beige":"béžová","fuchsia":"fuchsia","lavenderblush":"rumencová levanduľa","hotpink":"horúca ružová","steelblue":"oceľovomodrá","tomato":"paradajková","lightpink":"svetloružová","limegreen":"limetková zelená","indianred":"indiánska červená","papayawhip":"papájový krém","lightslategray":"svetlá bridlicová sivá","gray":"sivá","mediumorchid":"stredná orchideová","cornsilk":"ôstie kukurice","black":"čierna","seagreen":"morská zelená","darkslateblue":"tmavá bridlicová modrá","khaki":"kaki","lightblue":"svetlomodrá","palegreen":"bledá zelená","azure":"azúrová","peachpuff":"broskyňový nádych","darkolivegreen":"tmavá olivovo zelená","yellowgreen":"žltozelená"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Predchádzajúce voľby","nextMessage":"Ďalšie voľby"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Zrušiť","buttonSave":"Uložiť","itemClose":"Zatvoriť"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_sk.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_sk.js.uncompressed.js
new file mode 100644
index 000000000..98c6c5ffa
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_sk.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_sk',{
+'dijit/form/nls/validate':{"rangeMessage":"Táto hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota nie je platná.","missingMessage":"Táto hodnota je vyžadovaná."}
+,
+'dijit/nls/loading':{"loadingState":"Zavádzanie...","errorState":"Nastala chyba"}
+,
+'dojo/nls/colors':{"lightsteelblue":"svetlá oceľovomodrá","orangered":"oranžovo červená","midnightblue":"polnočná modrá","cadetblue":"červeno modrá","seashell":"lastúrová","slategrey":"bridlicová sivá","coral":"koralová","darkturquoise":"tmavá tyrkysová","antiquewhite":"antická biela","mediumspringgreen":"stredná jarná zelená","transparent":"priesvitná","salmon":"lososová","darkgrey":"tmavosivá","ivory":"slonovina","greenyellow":"zelenožltá","mistyrose":"zahmlená ruža","lightsalmon":"svetlá lososová","silver":"strieborná","dimgrey":"matná sivá","orange":"oranžová","white":"biela","navajowhite":"navajská biela","royalblue":"kráľovská modrá","deeppink":"hlboká ružová","lime":"limetková","oldlace":"stará čipka","chartreuse":"kartúzska","darkcyan":"tmavá zelenomodrá","yellow":"žltá","linen":"ľan","olive":"olivová","gold":"zlatá","lawngreen":"trávová zelená","lightyellow":"svetložltá","tan":"žltohnedá","darkviolet":"tmavofialová","lightslategrey":"svetlá bridlicová sivá","grey":"sivá","darkkhaki":"tmavá žltohnedá","green":"zelená","deepskyblue":"hlboká modrá obloha","aqua":"vodová","sienna":"sienská","mintcream":"mätová krémová","rosybrown":"ružovo hnedá","mediumslateblue":"stredná bridlicová modrá","magenta":"purpurová","lightseagreen":"svetlá morská zelená","cyan":"zelenomodrá","olivedrab":"fádna olivová","darkgoldenrod":"tmavá zlatobyľ","slateblue":"bridlicová modrá","mediumaquamarine":"stredná akvamarínová","lavender":"levanduľa","mediumseagreen":"stredná morská zelená","maroon":"gaštanová hnedá","darkslategray":"tmavá bridlicová sivá","mediumturquoise":"stredná tyrkysová","ghostwhite":"biela (ghost white)","darkblue":"tmavomodrá","mediumvioletred":"stredná fialovočervená","brown":"hnedá","lightgray":"svetlosivá","sandybrown":"piesková hnedá","pink":"ružová","firebrick":"pálená tehla","indigo":"indigo","snow":"snehová","darkorchid":"tmavá orchidea","turquoise":"tyrkysová","chocolate":"čokoládová","springgreen":"jarná zelená","moccasin":"mokasínová","navy":"námornícka","lemonchiffon":"citrónový šifón","teal":"zelenomodrá","floralwhite":"biely kvet","cornflowerblue":"nevädzová modrá","paleturquoise":"bledá tyrkysová","purple":"purpurová","gainsboro":"sivá - gainsboro","plum":"slivková","red":"červená","blue":"modrá","forestgreen":"lesná zelená","darkgreen":"tmavozelená","honeydew":"ambrózia","darkseagreen":"tmavá morská zelená","lightcoral":"svetlá koralová","palevioletred":"bledá fialovo červená","mediumpurple":"stredná purpurová","saddlebrown":"sedlová hnedá","darkmagenta":"tmavá purpurová","thistle":"bodliaková","whitesmoke":"biely dym","wheat":"pšeničná","violet":"fialová","lightskyblue":"svetlá modrá obloha","goldenrod":"zlatobyľ","mediumblue":"stredná modrá","skyblue":"modré nebo","crimson":"karmínová","darksalmon":"tmavá lososová","darkred":"tmavočervená","darkslategrey":"tmavá bridlicová sivá","peru":"peru","lightgrey":"svetlosivá","lightgoldenrodyellow":"svetlá zlatobyľová žltá","blanchedalmond":"bledá mandľová","aliceblue":"modrá (alice)","bisque":"porcelánová","slategray":"bridlicová sivá","palegoldenrod":"bledá zlatobyľová","darkorange":"tmavá oranžová","aquamarine":"akvamarínová","lightgreen":"svetlozelená","burlywood":"drevená hnedá","dodgerblue":"modrá (dodger)","darkgray":"tmavosivá","lightcyan":"svetlá zelenomodrá","powderblue":"prášková modrá","blueviolet":"modro-fialová","orchid":"orchideová","dimgray":"matná sivá","beige":"béžová","fuchsia":"fuchsia","lavenderblush":"rumencová levanduľa","hotpink":"horúca ružová","steelblue":"oceľovomodrá","tomato":"paradajková","lightpink":"svetloružová","limegreen":"limetková zelená","indianred":"indiánska červená","papayawhip":"papájový krém","lightslategray":"svetlá bridlicová sivá","gray":"sivá","mediumorchid":"stredná orchideová","cornsilk":"ôstie kukurice","black":"čierna","seagreen":"morská zelená","darkslateblue":"tmavá bridlicová modrá","khaki":"kaki","lightblue":"svetlomodrá","palegreen":"bledá zelená","azure":"azúrová","peachpuff":"broskyňový nádych","darkolivegreen":"tmavá olivovo zelená","yellowgreen":"žltozelená"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Predchádzajúce voľby","nextMessage":"Ďalšie voľby"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Zrušiť","buttonSave":"Uložiť","itemClose":"Zatvoriť"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_sl.js b/lib/dojo/nls/tt-rss-layer_sl.js
index b9697650b..afc0d4e07 100644
--- a/lib/dojo/nls/tt-rss-layer_sl.js
+++ b/lib/dojo/nls/tt-rss-layer_sl.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_sl");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.sl");dojo.nls.colors.sl={"lightsteelblue":"svetlo kovinsko modra","orangered":"oranžno-rdeča","midnightblue":"polnočno modra","cadetblue":"kadetsko modra","seashell":"morska lupina","slategrey":"skrilasto siva","coral":"koralna","darkturquoise":"temno turkizna","antiquewhite":"antično bela","mediumspringgreen":"srednje pomladno zelena","salmon":"lososova","darkgrey":"temno siva","ivory":"slonokoščena","greenyellow":"zeleno-rumena","mistyrose":"megleno rožnata","lightsalmon":"svetlo lososova","silver":"srebrna","dimgrey":"pepelnato siva","orange":"oranžna","white":"bela","navajowhite":"navajo bela","royalblue":"kraljevsko modra","deeppink":"temno rožnata","lime":"limetasta","oldlace":"stara čipka","chartreuse":"chartreuse","darkcyan":"temno cijan","yellow":"rumena","linen":"lanena","olive":"olivna","gold":"zlata","lawngreen":"travniško zelena","lightyellow":"svetlo rumena","tan":"rumeno-rjava","darkviolet":"temno vijolična","lightslategrey":"svetlo skrilasto siva","grey":"siva","darkkhaki":"temno kaki","green":"zelena","deepskyblue":"temno nebeško modra","aqua":"akva","sienna":"sienna","mintcream":"metina krema","rosybrown":"rožnato rjava","mediumslateblue":"srednje skrilasto modra","magenta":"magenta","lightseagreen":"svetlo morsko zelena","cyan":"cijan","olivedrab":"umazano olivna","darkgoldenrod":"temna zlata rozga","slateblue":"skrilasto modra","mediumaquamarine":"srednji akvamarin","lavender":"sivka","mediumseagreen":"srednje morsko zelena","maroon":"kostanjeva","darkslategray":"temno skrilasto siva","mediumturquoise":"srednje turkizna","ghostwhite":"senčnato bela","darkblue":"temno modra","mediumvioletred":"srednje vijolično rdeča","brown":"rjava","lightgray":"svetlo siva","sandybrown":"peščeno rjava","pink":"rožnata","firebrick":"opečnata","indigo":"indigo","snow":"snežena","darkorchid":"temno orhidejasta","turquoise":"turkizna","chocolate":"čokoladna","springgreen":"pomladno zelena","moccasin":"mokasinasta","navy":"mornarska","lemonchiffon":"limonast šifon","teal":"modrozelena","floralwhite":"cvetno bela","cornflowerblue":"plavičasto modra","paleturquoise":"bledo turkizna","purple":"škrlatna","gainsboro":"gainsboro","plum":"slivova","red":"rdeča","blue":"modra","forestgreen":"gozdno zelena","darkgreen":"temno zelena","honeydew":"medena rosa","darkseagreen":"temno morsko zelena","lightcoral":"svetlo koralna","palevioletred":"bledo vijolično-rdeča","mediumpurple":"srednje škrlatna","saddlebrown":"sedlasto rjava","darkmagenta":"temna magenta","thistle":"osatna","whitesmoke":"megleno bela","wheat":"pšenična","violet":"vijolična","lightskyblue":"svetlo nebeško modra","goldenrod":"zlata rozga","mediumblue":"srednje modra","skyblue":"nebeško modra","crimson":"karminasta","darksalmon":"temno lososova","darkred":"temno rdeča","darkslategrey":"temno skrilasto siva","peru":"perujska","lightgrey":"svetlo siva","lightgoldenrodyellow":"svetlo rumena zlata rozga","blanchedalmond":"obledelo mandljeva","aliceblue":"alice blue modra","bisque":"porcelanasta","slategray":"skrilasto siva","palegoldenrod":"bleda zlata rozga","darkorange":"temno oranžna","aquamarine":"akvamarin","lightgreen":"svetlo zelena","burlywood":"peščeno sivo-rjava","dodgerblue":"dodgersko modra","darkgray":"temno siva","lightcyan":"svetlo cijan","powderblue":"kobaltovo modra","blueviolet":"modro vijolična","orchid":"orhidejasta","dimgray":"pepelnato siva","beige":"bež","fuchsia":"fuksija","lavenderblush":"rožnato sivka","hotpink":"kričeče rožnata","steelblue":"kovinsko modra","tomato":"paradižnikova","lightpink":"svetlo rožnata","limegreen":"apneno zelena","indianred":"indijansko rdeča","papayawhip":"papaja","lightslategray":"svetlo skrilasto siva","gray":"siva","mediumorchid":"srednje orhidejasta","cornsilk":"koruzna","black":"črna","seagreen":"morsko zelena","darkslateblue":"temno skrilasto modra","khaki":"kaki","lightblue":"svetlo modra","palegreen":"bledo zelena","azure":"azurno modra","peachpuff":"breskova","darkolivegreen":"temna olivno zelena","yellowgreen":"rumeno-zelena"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.sl");dijit.nls.loading.sl={"loadingState":"Nalaganje ...","errorState":"Oprostite, prišlo je do napake."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.sl");dijit.nls.common.sl={"buttonOk":"V redu","buttonCancel":"Prekliči","buttonSave":"Shrani","itemClose":"Zapri"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.sl");dijit.form.nls.validate.sl={"rangeMessage":"Ta vrednost je izven območja.","invalidMessage":"Vnesena vrednost ni veljavna.","missingMessage":"Ta vrednost je zahtevana."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.sl");dijit.form.nls.ComboBox.sl={"previousMessage":"Prejšnje izbire","nextMessage":"Dodatne izbire"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.sl");dojo.cldr.nls.number.sl={"group":".","percentSign":"%","exponential":"e","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_sl",{"dijit/form/nls/validate":{"rangeMessage":"Ta vrednost je izven območja.","invalidMessage":"Vnesena vrednost ni veljavna.","missingMessage":"Ta vrednost je zahtevana."},"dijit/nls/loading":{"loadingState":"Nalaganje ...","errorState":"Oprostite, prišlo je do napake."},"dojo/nls/colors":{"lightsteelblue":"svetlo kovinsko modra","orangered":"oranžno-rdeča","midnightblue":"polnočno modra","cadetblue":"kadetsko modra","seashell":"morska lupina","slategrey":"skrilasto siva","coral":"koralna","darkturquoise":"temno turkizna","antiquewhite":"antično bela","mediumspringgreen":"srednje pomladno zelena","transparent":"prosojno","salmon":"lososova","darkgrey":"temno siva","ivory":"slonokoščena","greenyellow":"zeleno-rumena","mistyrose":"megleno rožnata","lightsalmon":"svetlo lososova","silver":"srebrna","dimgrey":"pepelnato siva","orange":"oranžna","white":"bela","navajowhite":"navajo bela","royalblue":"kraljevsko modra","deeppink":"temno rožnata","lime":"limetasta","oldlace":"stara čipka","chartreuse":"chartreuse","darkcyan":"temno cijan","yellow":"rumena","linen":"lanena","olive":"olivna","gold":"zlata","lawngreen":"travniško zelena","lightyellow":"svetlo rumena","tan":"rumeno-rjava","darkviolet":"temno vijolična","lightslategrey":"svetlo skrilasto siva","grey":"siva","darkkhaki":"temno kaki","green":"zelena","deepskyblue":"temno nebeško modra","aqua":"akva","sienna":"sienna","mintcream":"metina krema","rosybrown":"rožnato rjava","mediumslateblue":"srednje skrilasto modra","magenta":"magenta","lightseagreen":"svetlo morsko zelena","cyan":"cijan","olivedrab":"umazano olivna","darkgoldenrod":"temna zlata rozga","slateblue":"skrilasto modra","mediumaquamarine":"srednji akvamarin","lavender":"sivka","mediumseagreen":"srednje morsko zelena","maroon":"kostanjeva","darkslategray":"temno skrilasto siva","mediumturquoise":"srednje turkizna","ghostwhite":"senčnato bela","darkblue":"temno modra","mediumvioletred":"srednje vijolično rdeča","brown":"rjava","lightgray":"svetlo siva","sandybrown":"peščeno rjava","pink":"rožnata","firebrick":"opečnata","indigo":"indigo","snow":"snežena","darkorchid":"temno orhidejasta","turquoise":"turkizna","chocolate":"čokoladna","springgreen":"pomladno zelena","moccasin":"mokasinasta","navy":"mornarska","lemonchiffon":"limonast šifon","teal":"modrozelena","floralwhite":"cvetno bela","cornflowerblue":"plavičasto modra","paleturquoise":"bledo turkizna","purple":"škrlatna","gainsboro":"gainsboro","plum":"slivova","red":"rdeča","blue":"modra","forestgreen":"gozdno zelena","darkgreen":"temno zelena","honeydew":"medena rosa","darkseagreen":"temno morsko zelena","lightcoral":"svetlo koralna","palevioletred":"bledo vijolično-rdeča","mediumpurple":"srednje škrlatna","saddlebrown":"sedlasto rjava","darkmagenta":"temna magenta","thistle":"osatna","whitesmoke":"megleno bela","wheat":"pšenična","violet":"vijolična","lightskyblue":"svetlo nebeško modra","goldenrod":"zlata rozga","mediumblue":"srednje modra","skyblue":"nebeško modra","crimson":"karminasta","darksalmon":"temno lososova","darkred":"temno rdeča","darkslategrey":"temno skrilasto siva","peru":"perujska","lightgrey":"svetlo siva","lightgoldenrodyellow":"svetlo rumena zlata rozga","blanchedalmond":"obledelo mandljeva","aliceblue":"alice blue modra","bisque":"porcelanasta","slategray":"skrilasto siva","palegoldenrod":"bleda zlata rozga","darkorange":"temno oranžna","aquamarine":"akvamarin","lightgreen":"svetlo zelena","burlywood":"peščeno sivo-rjava","dodgerblue":"dodgersko modra","darkgray":"temno siva","lightcyan":"svetlo cijan","powderblue":"kobaltovo modra","blueviolet":"modro vijolična","orchid":"orhidejasta","dimgray":"pepelnato siva","beige":"bež","fuchsia":"fuksija","lavenderblush":"rožnato sivka","hotpink":"kričeče rožnata","steelblue":"kovinsko modra","tomato":"paradižnikova","lightpink":"svetlo rožnata","limegreen":"apneno zelena","indianred":"indijansko rdeča","papayawhip":"papaja","lightslategray":"svetlo skrilasto siva","gray":"siva","mediumorchid":"srednje orhidejasta","cornsilk":"koruzna","black":"črna","seagreen":"morsko zelena","darkslateblue":"temno skrilasto modra","khaki":"kaki","lightblue":"svetlo modra","palegreen":"bledo zelena","azure":"azurno modra","peachpuff":"breskova","darkolivegreen":"temna olivno zelena","yellowgreen":"rumeno-zelena"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"e"},"dijit/form/nls/ComboBox":{"previousMessage":"Prejšnje izbire","nextMessage":"Dodatne izbire"},"dijit/nls/common":{"buttonOk":"V redu","buttonCancel":"Prekliči","buttonSave":"Shrani","itemClose":"Zapri"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_sl.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_sl.js.uncompressed.js
new file mode 100644
index 000000000..fcc11280b
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_sl.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_sl',{
+'dijit/form/nls/validate':{"rangeMessage":"Ta vrednost je izven območja.","invalidMessage":"Vnesena vrednost ni veljavna.","missingMessage":"Ta vrednost je zahtevana."}
+,
+'dijit/nls/loading':{"loadingState":"Nalaganje ...","errorState":"Oprostite, prišlo je do napake."}
+,
+'dojo/nls/colors':{"lightsteelblue":"svetlo kovinsko modra","orangered":"oranžno-rdeča","midnightblue":"polnočno modra","cadetblue":"kadetsko modra","seashell":"morska lupina","slategrey":"skrilasto siva","coral":"koralna","darkturquoise":"temno turkizna","antiquewhite":"antično bela","mediumspringgreen":"srednje pomladno zelena","transparent":"prosojno","salmon":"lososova","darkgrey":"temno siva","ivory":"slonokoščena","greenyellow":"zeleno-rumena","mistyrose":"megleno rožnata","lightsalmon":"svetlo lososova","silver":"srebrna","dimgrey":"pepelnato siva","orange":"oranžna","white":"bela","navajowhite":"navajo bela","royalblue":"kraljevsko modra","deeppink":"temno rožnata","lime":"limetasta","oldlace":"stara čipka","chartreuse":"chartreuse","darkcyan":"temno cijan","yellow":"rumena","linen":"lanena","olive":"olivna","gold":"zlata","lawngreen":"travniško zelena","lightyellow":"svetlo rumena","tan":"rumeno-rjava","darkviolet":"temno vijolična","lightslategrey":"svetlo skrilasto siva","grey":"siva","darkkhaki":"temno kaki","green":"zelena","deepskyblue":"temno nebeško modra","aqua":"akva","sienna":"sienna","mintcream":"metina krema","rosybrown":"rožnato rjava","mediumslateblue":"srednje skrilasto modra","magenta":"magenta","lightseagreen":"svetlo morsko zelena","cyan":"cijan","olivedrab":"umazano olivna","darkgoldenrod":"temna zlata rozga","slateblue":"skrilasto modra","mediumaquamarine":"srednji akvamarin","lavender":"sivka","mediumseagreen":"srednje morsko zelena","maroon":"kostanjeva","darkslategray":"temno skrilasto siva","mediumturquoise":"srednje turkizna","ghostwhite":"senčnato bela","darkblue":"temno modra","mediumvioletred":"srednje vijolično rdeča","brown":"rjava","lightgray":"svetlo siva","sandybrown":"peščeno rjava","pink":"rožnata","firebrick":"opečnata","indigo":"indigo","snow":"snežena","darkorchid":"temno orhidejasta","turquoise":"turkizna","chocolate":"čokoladna","springgreen":"pomladno zelena","moccasin":"mokasinasta","navy":"mornarska","lemonchiffon":"limonast šifon","teal":"modrozelena","floralwhite":"cvetno bela","cornflowerblue":"plavičasto modra","paleturquoise":"bledo turkizna","purple":"škrlatna","gainsboro":"gainsboro","plum":"slivova","red":"rdeča","blue":"modra","forestgreen":"gozdno zelena","darkgreen":"temno zelena","honeydew":"medena rosa","darkseagreen":"temno morsko zelena","lightcoral":"svetlo koralna","palevioletred":"bledo vijolično-rdeča","mediumpurple":"srednje škrlatna","saddlebrown":"sedlasto rjava","darkmagenta":"temna magenta","thistle":"osatna","whitesmoke":"megleno bela","wheat":"pšenična","violet":"vijolična","lightskyblue":"svetlo nebeško modra","goldenrod":"zlata rozga","mediumblue":"srednje modra","skyblue":"nebeško modra","crimson":"karminasta","darksalmon":"temno lososova","darkred":"temno rdeča","darkslategrey":"temno skrilasto siva","peru":"perujska","lightgrey":"svetlo siva","lightgoldenrodyellow":"svetlo rumena zlata rozga","blanchedalmond":"obledelo mandljeva","aliceblue":"alice blue modra","bisque":"porcelanasta","slategray":"skrilasto siva","palegoldenrod":"bleda zlata rozga","darkorange":"temno oranžna","aquamarine":"akvamarin","lightgreen":"svetlo zelena","burlywood":"peščeno sivo-rjava","dodgerblue":"dodgersko modra","darkgray":"temno siva","lightcyan":"svetlo cijan","powderblue":"kobaltovo modra","blueviolet":"modro vijolična","orchid":"orhidejasta","dimgray":"pepelnato siva","beige":"bež","fuchsia":"fuksija","lavenderblush":"rožnato sivka","hotpink":"kričeče rožnata","steelblue":"kovinsko modra","tomato":"paradižnikova","lightpink":"svetlo rožnata","limegreen":"apneno zelena","indianred":"indijansko rdeča","papayawhip":"papaja","lightslategray":"svetlo skrilasto siva","gray":"siva","mediumorchid":"srednje orhidejasta","cornsilk":"koruzna","black":"črna","seagreen":"morsko zelena","darkslateblue":"temno skrilasto modra","khaki":"kaki","lightblue":"svetlo modra","palegreen":"bledo zelena","azure":"azurno modra","peachpuff":"breskova","darkolivegreen":"temna olivno zelena","yellowgreen":"rumeno-zelena"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"e"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Prejšnje izbire","nextMessage":"Dodatne izbire"}
+,
+'dijit/nls/common':{"buttonOk":"V redu","buttonCancel":"Prekliči","buttonSave":"Shrani","itemClose":"Zapri"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_sv.js b/lib/dojo/nls/tt-rss-layer_sv.js
index d52287cf1..551c6496a 100644
--- a/lib/dojo/nls/tt-rss-layer_sv.js
+++ b/lib/dojo/nls/tt-rss-layer_sv.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_sv");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.sv");dojo.nls.colors.sv={"lightsteelblue":"ljust stålblått","orangered":"orangerött","midnightblue":"midnattsblått","cadetblue":"kadettblått","seashell":"snäckskal","slategrey":"skiffergrått","coral":"korall","darkturquoise":"mörkturkost","antiquewhite":"antikvitt","mediumspringgreen":"mellanvårgrönt","salmon":"laxfärgat","darkgrey":"mörkgrått","ivory":"elfenbensvitt","greenyellow":"gröngult","mistyrose":"dunkelrosa","lightsalmon":"ljust laxfärgat","silver":"silver","dimgrey":"smutsgrått","orange":"orange","white":"vitt","navajowhite":"navajovitt","royalblue":"kungligt blått","deeppink":"djuprosa","lime":"lime","oldlace":"spetsvitt","chartreuse":"chartreuse","darkcyan":"mörkt cyan","yellow":"gult","linen":"linne","olive":"olivfärgat","gold":"guld","lawngreen":"gräsmattegrönt","lightyellow":"ljusgult","tan":"mellanbrunt","darkviolet":"mörkviolett","lightslategrey":"ljust skiffergrått","grey":"grått","darkkhaki":"mörkt kaki","green":"grönt","deepskyblue":"mörkt himmelsblått","aqua":"akvamarin","sienna":"sienna","mintcream":"mintgrädde","rosybrown":"rosenbrunt","mediumslateblue":"mellanskifferblått","magenta":"magenta","lightseagreen":"ljust havsgrönt","cyan":"cyan","olivedrab":"olivsmutsgult","darkgoldenrod":"mörkt gullris","slateblue":"skifferblått","mediumaquamarine":"mellanakvamarin","lavender":"lavendel","mediumseagreen":"mellanhavsgrönt","maroon":"rödbrunt","darkslategray":"mörkt skiffergrått","mediumturquoise":"mellanturkost","ghostwhite":"spökvitt","darkblue":"mörkblått","mediumvioletred":"mellanviolettrött","brown":"brunt","lightgray":"ljusgrått","sandybrown":"sandbrunt","pink":"rosa","firebrick":"tegelstensrött","indigo":"indigo","snow":"snö","darkorchid":"mörkt orkidé","turquoise":"turkost","chocolate":"choklad","springgreen":"vårgrönt","moccasin":"mockasin","navy":"marinblått","lemonchiffon":"citronchiffong","teal":"blågrönt","floralwhite":"blomvitt","cornflowerblue":"kornblått","paleturquoise":"blekturkost","purple":"lila","gainsboro":"gainsboro","plum":"plommon","red":"rött","blue":"blått","forestgreen":"skogsgrönt","darkgreen":"mörkgrönt","honeydew":"honungsdagg","darkseagreen":"mörkt havsgrönt","lightcoral":"ljuskorall","palevioletred":"blekviolettrött","mediumpurple":"mellanlila","saddlebrown":"sadelbrunt","darkmagenta":"mörk magenta","thistle":"tistel","whitesmoke":"vit rök","wheat":"vete","violet":"violett","lightskyblue":"ljust himmelsblått","goldenrod":"gullris","mediumblue":"mellanblått","skyblue":"himmelsblått","crimson":"karmosinrött","darksalmon":"mörkt laxfärgat","darkred":"mörkrött","darkslategrey":"mörkt skiffergrått","peru":"peru","lightgrey":"ljusgrått","lightgoldenrodyellow":"ljust gullrisgult","blanchedalmond":"skållad mandel","aliceblue":"aliceblå","bisque":"biskvi","slategray":"skiffergrått","palegoldenrod":"blekt gullris","darkorange":"mörkorange","aquamarine":"akvamarin","lightgreen":"ljusgrönt","burlywood":"träfärgat","dodgerblue":"dodgerblått","darkgray":"mörkgrått","lightcyan":"ljust cyan","powderblue":"pulverblått","blueviolet":"blåviolett","orchid":"orkidé","dimgray":"smutsgrått","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelskimrande","hotpink":"varmrosa","steelblue":"stålblått","tomato":"tomatrött","lightpink":"ljusrosa","limegreen":"limegrönt","indianred":"indianrött","papayawhip":"papayaröra","lightslategray":"ljust skiffergrått","gray":"grått","mediumorchid":"mellanorkidé","cornsilk":"gulvitt","black":"svart","seagreen":"havsgrönt","darkslateblue":"mörkt skifferblått","khaki":"kaki","lightblue":"ljusblått","palegreen":"blekgrönt","azure":"azurblått","peachpuff":"persika","darkolivegreen":"mörkt olivgrönt","yellowgreen":"gulgrönt"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.sv");dijit.nls.loading.sv={"loadingState":"Läser in...","errorState":"Det uppstod ett fel."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.sv");dijit.nls.common.sv={"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Spara","itemClose":"Stäng"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.sv");dijit.form.nls.validate.sv={"rangeMessage":"Värdet är utanför intervallet.","invalidMessage":"Det angivna värdet är ogiltigt.","missingMessage":"Värdet är obligatoriskt."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.sv");dijit.form.nls.ComboBox.sv={"previousMessage":"Föregående alternativ","nextMessage":"Fler alternativ"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.sv");dojo.cldr.nls.number.sv={"group":" ","percentSign":"%","exponential":"×10^","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"−","decimal":",","nan":"¤¤¤","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_sv",{"dijit/form/nls/validate":{"rangeMessage":"Värdet är utanför intervallet.","invalidMessage":"Det angivna värdet är ogiltigt.","missingMessage":"Värdet är obligatoriskt."},"dijit/nls/loading":{"loadingState":"Läser in...","errorState":"Det uppstod ett fel."},"dojo/nls/colors":{"lightsteelblue":"ljust stålblått","orangered":"orangerött","midnightblue":"midnattsblått","cadetblue":"kadettblått","seashell":"snäckskal","slategrey":"skiffergrått","coral":"korall","darkturquoise":"mörkturkost","antiquewhite":"antikvitt","mediumspringgreen":"mellanvårgrönt","transparent":"transparent","salmon":"laxfärgat","darkgrey":"mörkgrått","ivory":"elfenbensvitt","greenyellow":"gröngult","mistyrose":"dunkelrosa","lightsalmon":"ljust laxfärgat","silver":"silver","dimgrey":"smutsgrått","orange":"orange","white":"vitt","navajowhite":"navajovitt","royalblue":"kungligt blått","deeppink":"djuprosa","lime":"lime","oldlace":"spetsvitt","chartreuse":"chartreuse","darkcyan":"mörkt cyan","yellow":"gult","linen":"linne","olive":"olivfärgat","gold":"guld","lawngreen":"gräsmattegrönt","lightyellow":"ljusgult","tan":"mellanbrunt","darkviolet":"mörkviolett","lightslategrey":"ljust skiffergrått","grey":"grått","darkkhaki":"mörkt kaki","green":"grönt","deepskyblue":"mörkt himmelsblått","aqua":"akvamarin","sienna":"sienna","mintcream":"mintgrädde","rosybrown":"rosenbrunt","mediumslateblue":"mellanskifferblått","magenta":"magenta","lightseagreen":"ljust havsgrönt","cyan":"cyan","olivedrab":"olivsmutsgult","darkgoldenrod":"mörkt gullris","slateblue":"skifferblått","mediumaquamarine":"mellanakvamarin","lavender":"lavendel","mediumseagreen":"mellanhavsgrönt","maroon":"rödbrunt","darkslategray":"mörkt skiffergrått","mediumturquoise":"mellanturkost","ghostwhite":"spökvitt","darkblue":"mörkblått","mediumvioletred":"mellanviolettrött","brown":"brunt","lightgray":"ljusgrått","sandybrown":"sandbrunt","pink":"rosa","firebrick":"tegelstensrött","indigo":"indigo","snow":"snö","darkorchid":"mörkt orkidé","turquoise":"turkost","chocolate":"choklad","springgreen":"vårgrönt","moccasin":"mockasin","navy":"marinblått","lemonchiffon":"citronchiffong","teal":"blågrönt","floralwhite":"blomvitt","cornflowerblue":"kornblått","paleturquoise":"blekturkost","purple":"lila","gainsboro":"gainsboro","plum":"plommon","red":"rött","blue":"blått","forestgreen":"skogsgrönt","darkgreen":"mörkgrönt","honeydew":"honungsdagg","darkseagreen":"mörkt havsgrönt","lightcoral":"ljuskorall","palevioletred":"blekviolettrött","mediumpurple":"mellanlila","saddlebrown":"sadelbrunt","darkmagenta":"mörk magenta","thistle":"tistel","whitesmoke":"vit rök","wheat":"vete","violet":"violett","lightskyblue":"ljust himmelsblått","goldenrod":"gullris","mediumblue":"mellanblått","skyblue":"himmelsblått","crimson":"karmosinrött","darksalmon":"mörkt laxfärgat","darkred":"mörkrött","darkslategrey":"mörkt skiffergrått","peru":"peru","lightgrey":"ljusgrått","lightgoldenrodyellow":"ljust gullrisgult","blanchedalmond":"skållad mandel","aliceblue":"aliceblå","bisque":"biskvi","slategray":"skiffergrått","palegoldenrod":"blekt gullris","darkorange":"mörkorange","aquamarine":"akvamarin","lightgreen":"ljusgrönt","burlywood":"träfärgat","dodgerblue":"dodgerblått","darkgray":"mörkgrått","lightcyan":"ljust cyan","powderblue":"pulverblått","blueviolet":"blåviolett","orchid":"orkidé","dimgray":"smutsgrått","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelskimrande","hotpink":"varmrosa","steelblue":"stålblått","tomato":"tomatrött","lightpink":"ljusrosa","limegreen":"limegrönt","indianred":"indianrött","papayawhip":"papayaröra","lightslategray":"ljust skiffergrått","gray":"grått","mediumorchid":"mellanorkidé","cornsilk":"gulvitt","black":"svart","seagreen":"havsgrönt","darkslateblue":"mörkt skifferblått","khaki":"kaki","lightblue":"ljusblått","palegreen":"blekgrönt","azure":"azurblått","peachpuff":"persika","darkolivegreen":"mörkt olivgrönt","yellowgreen":"gulgrönt"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"−","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"¤¤¤","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"×10^"},"dijit/form/nls/ComboBox":{"previousMessage":"Föregående alternativ","nextMessage":"Fler alternativ"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Spara","itemClose":"Stäng"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_sv.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_sv.js.uncompressed.js
new file mode 100644
index 000000000..5d179927f
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_sv.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_sv',{
+'dijit/form/nls/validate':{"rangeMessage":"Värdet är utanför intervallet.","invalidMessage":"Det angivna värdet är ogiltigt.","missingMessage":"Värdet är obligatoriskt."}
+,
+'dijit/nls/loading':{"loadingState":"Läser in...","errorState":"Det uppstod ett fel."}
+,
+'dojo/nls/colors':{"lightsteelblue":"ljust stålblått","orangered":"orangerött","midnightblue":"midnattsblått","cadetblue":"kadettblått","seashell":"snäckskal","slategrey":"skiffergrått","coral":"korall","darkturquoise":"mörkturkost","antiquewhite":"antikvitt","mediumspringgreen":"mellanvårgrönt","transparent":"transparent","salmon":"laxfärgat","darkgrey":"mörkgrått","ivory":"elfenbensvitt","greenyellow":"gröngult","mistyrose":"dunkelrosa","lightsalmon":"ljust laxfärgat","silver":"silver","dimgrey":"smutsgrått","orange":"orange","white":"vitt","navajowhite":"navajovitt","royalblue":"kungligt blått","deeppink":"djuprosa","lime":"lime","oldlace":"spetsvitt","chartreuse":"chartreuse","darkcyan":"mörkt cyan","yellow":"gult","linen":"linne","olive":"olivfärgat","gold":"guld","lawngreen":"gräsmattegrönt","lightyellow":"ljusgult","tan":"mellanbrunt","darkviolet":"mörkviolett","lightslategrey":"ljust skiffergrått","grey":"grått","darkkhaki":"mörkt kaki","green":"grönt","deepskyblue":"mörkt himmelsblått","aqua":"akvamarin","sienna":"sienna","mintcream":"mintgrädde","rosybrown":"rosenbrunt","mediumslateblue":"mellanskifferblått","magenta":"magenta","lightseagreen":"ljust havsgrönt","cyan":"cyan","olivedrab":"olivsmutsgult","darkgoldenrod":"mörkt gullris","slateblue":"skifferblått","mediumaquamarine":"mellanakvamarin","lavender":"lavendel","mediumseagreen":"mellanhavsgrönt","maroon":"rödbrunt","darkslategray":"mörkt skiffergrått","mediumturquoise":"mellanturkost","ghostwhite":"spökvitt","darkblue":"mörkblått","mediumvioletred":"mellanviolettrött","brown":"brunt","lightgray":"ljusgrått","sandybrown":"sandbrunt","pink":"rosa","firebrick":"tegelstensrött","indigo":"indigo","snow":"snö","darkorchid":"mörkt orkidé","turquoise":"turkost","chocolate":"choklad","springgreen":"vårgrönt","moccasin":"mockasin","navy":"marinblått","lemonchiffon":"citronchiffong","teal":"blågrönt","floralwhite":"blomvitt","cornflowerblue":"kornblått","paleturquoise":"blekturkost","purple":"lila","gainsboro":"gainsboro","plum":"plommon","red":"rött","blue":"blått","forestgreen":"skogsgrönt","darkgreen":"mörkgrönt","honeydew":"honungsdagg","darkseagreen":"mörkt havsgrönt","lightcoral":"ljuskorall","palevioletred":"blekviolettrött","mediumpurple":"mellanlila","saddlebrown":"sadelbrunt","darkmagenta":"mörk magenta","thistle":"tistel","whitesmoke":"vit rök","wheat":"vete","violet":"violett","lightskyblue":"ljust himmelsblått","goldenrod":"gullris","mediumblue":"mellanblått","skyblue":"himmelsblått","crimson":"karmosinrött","darksalmon":"mörkt laxfärgat","darkred":"mörkrött","darkslategrey":"mörkt skiffergrått","peru":"peru","lightgrey":"ljusgrått","lightgoldenrodyellow":"ljust gullrisgult","blanchedalmond":"skållad mandel","aliceblue":"aliceblå","bisque":"biskvi","slategray":"skiffergrått","palegoldenrod":"blekt gullris","darkorange":"mörkorange","aquamarine":"akvamarin","lightgreen":"ljusgrönt","burlywood":"träfärgat","dodgerblue":"dodgerblått","darkgray":"mörkgrått","lightcyan":"ljust cyan","powderblue":"pulverblått","blueviolet":"blåviolett","orchid":"orkidé","dimgray":"smutsgrått","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelskimrande","hotpink":"varmrosa","steelblue":"stålblått","tomato":"tomatrött","lightpink":"ljusrosa","limegreen":"limegrönt","indianred":"indianrött","papayawhip":"papayaröra","lightslategray":"ljust skiffergrått","gray":"grått","mediumorchid":"mellanorkidé","cornsilk":"gulvitt","black":"svart","seagreen":"havsgrönt","darkslateblue":"mörkt skifferblått","khaki":"kaki","lightblue":"ljusblått","palegreen":"blekgrönt","azure":"azurblått","peachpuff":"persika","darkolivegreen":"mörkt olivgrönt","yellowgreen":"gulgrönt"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"−","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"¤¤¤","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"×10^"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Föregående alternativ","nextMessage":"Fler alternativ"}
+,
+'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Spara","itemClose":"Stäng"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_th.js b/lib/dojo/nls/tt-rss-layer_th.js
index 95820b7bb..b1f871bd5 100644
--- a/lib/dojo/nls/tt-rss-layer_th.js
+++ b/lib/dojo/nls/tt-rss-layer_th.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_th");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.th");dojo.nls.colors.th={"lightsteelblue":"light steel blue","orangered":"ส้มแกมแดง","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"เทาเข้ม","ivory":"งาช้าง","greenyellow":"เขียวแกมเหลือง","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"เงิน","dimgrey":"dim gray","orange":"ส้ม","white":"ขาว","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"ชมพูเข้ม","lime":"เหลืองมะนาว","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"เขียวแกมน้ำเงินเข้ม","yellow":"เหลือง","linen":"linen","olive":"โอลีฟ","gold":"ทอง","lawngreen":"lawn green","lightyellow":"เหลืองอ่อน","tan":"tan","darkviolet":"ม่วงเข้ม","lightslategrey":"light slate gray","grey":"เทา","darkkhaki":"dark khaki","green":"เขียว","deepskyblue":"deep sky blue","aqua":"ฟ้าน้ำทะเล","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"แดงแกมม่วง","lightseagreen":"light sea green","cyan":"เขียวแกมน้ำเงิน","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"ม่วงลาเวนเดอร์","mediumseagreen":"medium sea green","maroon":"น้ำตาลแดง","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"น้ำเงินเข้ม","mediumvioletred":"medium violet-red","brown":"น้ำตาล","lightgray":"เทาอ่อน","sandybrown":"sandy brown","pink":"ชมพู","firebrick":"สีอิฐ","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"ช็อกโกแลต","springgreen":"spring green","moccasin":"ม็อคค่า","navy":"น้ำเงินเข้ม","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"ม่วง","gainsboro":"gainsboro","plum":"plum","red":"แดง","blue":"น้ำเงิน","forestgreen":"forest green","darkgreen":"เขียวเข้ม","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"แดงแกมม่วงเข้ม","thistle":"thistle","whitesmoke":"ขาวควัน","wheat":"wheat","violet":"ม่วง","lightskyblue":"ฟ้าอ่อน","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"แดงเลือดหมู","darksalmon":"dark salmon","darkred":"แดงเข้ม","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"เทาอ่อน","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"ส้มเข้ม","aquamarine":"aquamarine","lightgreen":"เขียวอ่อน","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"เทาเข้ม","lightcyan":"เขียวแกมน้ำเงินอ่อน","powderblue":"powder blue","blueviolet":"น้ำเงินม่วง","orchid":"orchid","dimgray":"dim gray","beige":"น้ำตาลเบจ","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"ชมพูอ่อน","limegreen":"เขียวมะนาว","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"เทา","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"ดำ","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"น้ำเงินอ่อน","palegreen":"pale green","azure":"น้ำเงินฟ้า","peachpuff":"peach puff","darkolivegreen":"เขียวโอลีฟเข้ม","yellowgreen":"เหลืองแกมเขียว"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.th");dijit.nls.loading.th={"loadingState":"กำลังโหลด...","errorState":"ขออภัย เกิดข้อผิดพลาด"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.th");dijit.nls.common.th={"buttonOk":"ตกลง","buttonCancel":"ยกเลิก","buttonSave":"บันทึก","itemClose":"ปิด"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.th");dijit.form.nls.validate.th={"rangeMessage":"ค่านี้เกินช่วง","invalidMessage":"ค่าที่ป้อนไม่ถูกต้อง","missingMessage":"จำเป็นต้องมีค่านี้"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.th");dijit.form.nls.ComboBox.th={"previousMessage":"การเลือกก่อนหน้า","nextMessage":"การเลือกเพิ่มเติม"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.th");dojo.cldr.nls.number.th={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;¤-#,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_th",{"dijit/form/nls/validate":{"rangeMessage":"ค่านี้เกินช่วง","invalidMessage":"ค่าที่ป้อนไม่ถูกต้อง","missingMessage":"จำเป็นต้องมีค่านี้"},"dijit/nls/loading":{"loadingState":"กำลังโหลด...","errorState":"ขออภัย เกิดข้อผิดพลาด"},"dojo/nls/colors":{"lightsteelblue":"light steel blue","orangered":"ส้มแกมแดง","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"สีใส","salmon":"salmon","darkgrey":"เทาเข้ม","ivory":"งาช้าง","greenyellow":"เขียวแกมเหลือง","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"เงิน","dimgrey":"dim gray","orange":"ส้ม","white":"ขาว","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"ชมพูเข้ม","lime":"เหลืองมะนาว","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"เขียวแกมน้ำเงินเข้ม","yellow":"เหลือง","linen":"linen","olive":"โอลีฟ","gold":"ทอง","lawngreen":"lawn green","lightyellow":"เหลืองอ่อน","tan":"tan","darkviolet":"ม่วงเข้ม","lightslategrey":"light slate gray","grey":"เทา","darkkhaki":"dark khaki","green":"เขียว","deepskyblue":"deep sky blue","aqua":"ฟ้าน้ำทะเล","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"แดงแกมม่วง","lightseagreen":"light sea green","cyan":"เขียวแกมน้ำเงิน","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"ม่วงลาเวนเดอร์","mediumseagreen":"medium sea green","maroon":"น้ำตาลแดง","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"น้ำเงินเข้ม","mediumvioletred":"medium violet-red","brown":"น้ำตาล","lightgray":"เทาอ่อน","sandybrown":"sandy brown","pink":"ชมพู","firebrick":"สีอิฐ","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"ช็อกโกแลต","springgreen":"spring green","moccasin":"ม็อคค่า","navy":"น้ำเงินเข้ม","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"ม่วง","gainsboro":"gainsboro","plum":"plum","red":"แดง","blue":"น้ำเงิน","forestgreen":"forest green","darkgreen":"เขียวเข้ม","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"แดงแกมม่วงเข้ม","thistle":"thistle","whitesmoke":"ขาวควัน","wheat":"wheat","violet":"ม่วง","lightskyblue":"ฟ้าอ่อน","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"แดงเลือดหมู","darksalmon":"dark salmon","darkred":"แดงเข้ม","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"เทาอ่อน","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"ส้มเข้ม","aquamarine":"aquamarine","lightgreen":"เขียวอ่อน","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"เทาเข้ม","lightcyan":"เขียวแกมน้ำเงินอ่อน","powderblue":"powder blue","blueviolet":"น้ำเงินม่วง","orchid":"orchid","dimgray":"dim gray","beige":"น้ำตาลเบจ","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"ชมพูอ่อน","limegreen":"เขียวมะนาว","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"เทา","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"ดำ","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"น้ำเงินอ่อน","palegreen":"pale green","azure":"น้ำเงินฟ้า","peachpuff":"peach puff","darkolivegreen":"เขียวโอลีฟเข้ม","yellowgreen":"เหลืองแกมเขียว"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00;¤-#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"การเลือกก่อนหน้า","nextMessage":"การเลือกเพิ่มเติม"},"dijit/nls/common":{"buttonOk":"ตกลง","buttonCancel":"ยกเลิก","buttonSave":"บันทึก","itemClose":"ปิด"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_th.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_th.js.uncompressed.js
new file mode 100644
index 000000000..003f3d3cc
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_th.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_th',{
+'dijit/form/nls/validate':{"rangeMessage":"ค่านี้เกินช่วง","invalidMessage":"ค่าที่ป้อนไม่ถูกต้อง","missingMessage":"จำเป็นต้องมีค่านี้"}
+,
+'dijit/nls/loading':{"loadingState":"กำลังโหลด...","errorState":"ขออภัย เกิดข้อผิดพลาด"}
+,
+'dojo/nls/colors':{"lightsteelblue":"light steel blue","orangered":"ส้มแกมแดง","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"สีใส","salmon":"salmon","darkgrey":"เทาเข้ม","ivory":"งาช้าง","greenyellow":"เขียวแกมเหลือง","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"เงิน","dimgrey":"dim gray","orange":"ส้ม","white":"ขาว","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"ชมพูเข้ม","lime":"เหลืองมะนาว","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"เขียวแกมน้ำเงินเข้ม","yellow":"เหลือง","linen":"linen","olive":"โอลีฟ","gold":"ทอง","lawngreen":"lawn green","lightyellow":"เหลืองอ่อน","tan":"tan","darkviolet":"ม่วงเข้ม","lightslategrey":"light slate gray","grey":"เทา","darkkhaki":"dark khaki","green":"เขียว","deepskyblue":"deep sky blue","aqua":"ฟ้าน้ำทะเล","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"แดงแกมม่วง","lightseagreen":"light sea green","cyan":"เขียวแกมน้ำเงิน","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"ม่วงลาเวนเดอร์","mediumseagreen":"medium sea green","maroon":"น้ำตาลแดง","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"น้ำเงินเข้ม","mediumvioletred":"medium violet-red","brown":"น้ำตาล","lightgray":"เทาอ่อน","sandybrown":"sandy brown","pink":"ชมพู","firebrick":"สีอิฐ","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"ช็อกโกแลต","springgreen":"spring green","moccasin":"ม็อคค่า","navy":"น้ำเงินเข้ม","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"ม่วง","gainsboro":"gainsboro","plum":"plum","red":"แดง","blue":"น้ำเงิน","forestgreen":"forest green","darkgreen":"เขียวเข้ม","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"แดงแกมม่วงเข้ม","thistle":"thistle","whitesmoke":"ขาวควัน","wheat":"wheat","violet":"ม่วง","lightskyblue":"ฟ้าอ่อน","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"แดงเลือดหมู","darksalmon":"dark salmon","darkred":"แดงเข้ม","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"เทาอ่อน","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"ส้มเข้ม","aquamarine":"aquamarine","lightgreen":"เขียวอ่อน","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"เทาเข้ม","lightcyan":"เขียวแกมน้ำเงินอ่อน","powderblue":"powder blue","blueviolet":"น้ำเงินม่วง","orchid":"orchid","dimgray":"dim gray","beige":"น้ำตาลเบจ","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"ชมพูอ่อน","limegreen":"เขียวมะนาว","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"เทา","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"ดำ","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"น้ำเงินอ่อน","palegreen":"pale green","azure":"น้ำเงินฟ้า","peachpuff":"peach puff","darkolivegreen":"เขียวโอลีฟเข้ม","yellowgreen":"เหลืองแกมเขียว"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00;¤-#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"การเลือกก่อนหน้า","nextMessage":"การเลือกเพิ่มเติม"}
+,
+'dijit/nls/common':{"buttonOk":"ตกลง","buttonCancel":"ยกเลิก","buttonSave":"บันทึก","itemClose":"ปิด"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_tr.js b/lib/dojo/nls/tt-rss-layer_tr.js
index 163130bf4..30e824e05 100644
--- a/lib/dojo/nls/tt-rss-layer_tr.js
+++ b/lib/dojo/nls/tt-rss-layer_tr.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_tr");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.tr");dojo.nls.colors.tr={"lightsteelblue":"açık metalik mavi","orangered":"turuncu kırmızı","midnightblue":"gece mavisi","cadetblue":"denizci mavisi","seashell":"deniz kabuğu","slategrey":"arduvaz grisi","coral":"mercan","darkturquoise":"koyu turkuaz","antiquewhite":"antik beyaz","mediumspringgreen":"orta bahar yeşili","salmon":"somon","darkgrey":"koyu gri","ivory":"fildişi","greenyellow":"yeşil-sarı","mistyrose":"gülkurusu","lightsalmon":"açık somon","silver":"gümüş","dimgrey":"soluk gri","orange":"turuncu","white":"beyaz","navajowhite":"navajo beyazı","royalblue":"parlak koyu mavi","deeppink":"koyu pembe","lime":"limon yeşili","oldlace":"eski dantel","chartreuse":"chartreuse","darkcyan":"koyu camgöbeği","yellow":"sarı","linen":"keten","olive":"zeytin","gold":"altın","lawngreen":"çimen yeşili","lightyellow":"açık sarı","tan":"güneş yanığı","darkviolet":"koyu eflatun","lightslategrey":"açık arduvaz grisi","grey":"gri","darkkhaki":"koyu haki","green":"yeşil","deepskyblue":"koyu gök mavisi","aqua":"deniz mavisi","sienna":"koyu kahve","mintcream":"naneli krem","rosybrown":"pembemsi kahverengi","mediumslateblue":"orta arduvaz mavisi","magenta":"macenta","lightseagreen":"açık deniz yeşili","cyan":"camgöbeği","olivedrab":"asker yeşili","darkgoldenrod":"koyu sarı","slateblue":"arduvaz mavisi","mediumaquamarine":"orta akuamarin","lavender":"lavanta","mediumseagreen":"orta deniz yeşili","maroon":"kestane","darkslategray":"koyu arduvaz grisi","mediumturquoise":"orta turkuaz","ghostwhite":"silik beyaz","darkblue":"koyu mavi","mediumvioletred":"orta menekşe kırmızısı","brown":"kahverengi","lightgray":"açık gri","sandybrown":"kum rengi","pink":"pembe","firebrick":"canlı kiremit","indigo":"çivit mavisi","snow":"kar","darkorchid":"koyu orkide","turquoise":"turkuaz","chocolate":"çikolata","springgreen":"bahar yeşili","moccasin":"mokosen","navy":"lacivert","lemonchiffon":"limoni","teal":"Teal mavi","floralwhite":"çiçek beyazı","cornflowerblue":"peygamber çiçeği mavisi","paleturquoise":"soluk turkuaz","purple":"mor","gainsboro":"gainsboro","plum":"erik","red":"kırmızı","blue":"mavi","forestgreen":"koyu deniz yeşili","darkgreen":"koyu yeşil","honeydew":"çam sakızı","darkseagreen":"koyu deniz yeşili","lightcoral":"açık mercan","palevioletred":"soluk menekşe kırmızısı","mediumpurple":"orta mor","saddlebrown":"açık kahve","darkmagenta":"koyu mor","thistle":"devedikeni","whitesmoke":"beyaz duman","wheat":"buğday","violet":"eflatun","lightskyblue":"açık gök mavisi","goldenrod":"sarısabır","mediumblue":"orta mavi","skyblue":"gök mavisi","crimson":"crimson","darksalmon":"koyu somon","darkred":"koyu kırmızı","darkslategrey":"koyu arduvaz grisi","peru":"peru","lightgrey":"açık gri","lightgoldenrodyellow":"açık sarısabır","blanchedalmond":"soluk badem","aliceblue":"alice mavisi","bisque":"bisküvi","slategray":"arduvaz grisi","palegoldenrod":"soluk sarısabır","darkorange":"koyu turuncu","aquamarine":"akuamarin","lightgreen":"açık yeşil","burlywood":"sarımsı kahverengi","dodgerblue":"toz mavisi","darkgray":"koyu gri","lightcyan":"açık camgöbeği","powderblue":"pudra mavisi","blueviolet":"mavi-mor","orchid":"orkide","dimgray":"soluk gri","beige":"bej","fuchsia":"fuşya","lavenderblush":"lavanta pembesi","hotpink":"sıcak pembe","steelblue":"metalik mavi","tomato":"domates","lightpink":"açık pembe","limegreen":"küf yeşili","indianred":"kızılderili kırmızısı","papayawhip":"papaya sapı","lightslategray":"açık arduvaz grisi","gray":"gri","mediumorchid":"orta orkide","cornsilk":"mısır rengi","black":"siyah","seagreen":"deniz yeşili","darkslateblue":"koyu arduvaz mavisi","khaki":"haki","lightblue":"açık mavi","palegreen":"soluk yeşil","azure":"azur mavisi","peachpuff":"açık şeftali","darkolivegreen":"koyu zeytin yeşili","yellowgreen":"sarı yeşil"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.tr");dijit.nls.loading.tr={"loadingState":"Yükleniyor...","errorState":"Üzgünüz, bir hata oluştu"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.tr");dijit.nls.common.tr={"buttonOk":"Tamam","buttonCancel":"İptal","buttonSave":"Kaydet","itemClose":"Kapat"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.tr");dijit.form.nls.validate.tr={"rangeMessage":"Bu değer aralık dışında.","invalidMessage":"Girilen değer geçersiz.","missingMessage":"Bu değer gerekli."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.tr");dijit.form.nls.ComboBox.tr={"previousMessage":"Önceki seçenekler","nextMessage":"Diğer seçenekler"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.tr");dojo.cldr.nls.number.tr={"group":".","percentSign":"%","exponential":"E","percentFormat":"% #,##0","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_tr",{"dijit/form/nls/validate":{"rangeMessage":"Bu değer aralık dışında.","invalidMessage":"Girilen değer geçersiz.","missingMessage":"Bu değer gerekli."},"dijit/nls/loading":{"loadingState":"Yükleniyor...","errorState":"Üzgünüz, bir hata oluştu"},"dojo/nls/colors":{"lightsteelblue":"açık metalik mavi","orangered":"turuncu kırmızı","midnightblue":"gece mavisi","cadetblue":"denizci mavisi","seashell":"deniz kabuğu","slategrey":"arduvaz grisi","coral":"mercan","darkturquoise":"koyu turkuaz","antiquewhite":"antik beyaz","mediumspringgreen":"orta bahar yeşili","transparent":"saydam","salmon":"somon","darkgrey":"koyu gri","ivory":"fildişi","greenyellow":"yeşil-sarı","mistyrose":"gülkurusu","lightsalmon":"açık somon","silver":"gümüş","dimgrey":"soluk gri","orange":"turuncu","white":"beyaz","navajowhite":"navajo beyazı","royalblue":"parlak koyu mavi","deeppink":"koyu pembe","lime":"limon yeşili","oldlace":"eski dantel","chartreuse":"chartreuse","darkcyan":"koyu camgöbeği","yellow":"sarı","linen":"keten","olive":"zeytin","gold":"altın","lawngreen":"çimen yeşili","lightyellow":"açık sarı","tan":"güneş yanığı","darkviolet":"koyu eflatun","lightslategrey":"açık arduvaz grisi","grey":"gri","darkkhaki":"koyu haki","green":"yeşil","deepskyblue":"koyu gök mavisi","aqua":"deniz mavisi","sienna":"koyu kahve","mintcream":"naneli krem","rosybrown":"pembemsi kahverengi","mediumslateblue":"orta arduvaz mavisi","magenta":"macenta","lightseagreen":"açık deniz yeşili","cyan":"camgöbeği","olivedrab":"asker yeşili","darkgoldenrod":"koyu sarı","slateblue":"arduvaz mavisi","mediumaquamarine":"orta akuamarin","lavender":"lavanta","mediumseagreen":"orta deniz yeşili","maroon":"kestane","darkslategray":"koyu arduvaz grisi","mediumturquoise":"orta turkuaz","ghostwhite":"silik beyaz","darkblue":"koyu mavi","mediumvioletred":"orta menekşe kırmızısı","brown":"kahverengi","lightgray":"açık gri","sandybrown":"kum rengi","pink":"pembe","firebrick":"canlı kiremit","indigo":"çivit mavisi","snow":"kar","darkorchid":"koyu orkide","turquoise":"turkuaz","chocolate":"çikolata","springgreen":"bahar yeşili","moccasin":"mokosen","navy":"lacivert","lemonchiffon":"limoni","teal":"Teal mavi","floralwhite":"çiçek beyazı","cornflowerblue":"peygamber çiçeği mavisi","paleturquoise":"soluk turkuaz","purple":"mor","gainsboro":"gainsboro","plum":"erik","red":"kırmızı","blue":"mavi","forestgreen":"koyu deniz yeşili","darkgreen":"koyu yeşil","honeydew":"çam sakızı","darkseagreen":"koyu deniz yeşili","lightcoral":"açık mercan","palevioletred":"soluk menekşe kırmızısı","mediumpurple":"orta mor","saddlebrown":"açık kahve","darkmagenta":"koyu mor","thistle":"devedikeni","whitesmoke":"beyaz duman","wheat":"buğday","violet":"eflatun","lightskyblue":"açık gök mavisi","goldenrod":"sarısabır","mediumblue":"orta mavi","skyblue":"gök mavisi","crimson":"crimson","darksalmon":"koyu somon","darkred":"koyu kırmızı","darkslategrey":"koyu arduvaz grisi","peru":"peru","lightgrey":"açık gri","lightgoldenrodyellow":"açık sarısabır","blanchedalmond":"soluk badem","aliceblue":"alice mavisi","bisque":"bisküvi","slategray":"arduvaz grisi","palegoldenrod":"soluk sarısabır","darkorange":"koyu turuncu","aquamarine":"akuamarin","lightgreen":"açık yeşil","burlywood":"sarımsı kahverengi","dodgerblue":"toz mavisi","darkgray":"koyu gri","lightcyan":"açık camgöbeği","powderblue":"pudra mavisi","blueviolet":"mavi-mor","orchid":"orkide","dimgray":"soluk gri","beige":"bej","fuchsia":"fuşya","lavenderblush":"lavanta pembesi","hotpink":"sıcak pembe","steelblue":"metalik mavi","tomato":"domates","lightpink":"açık pembe","limegreen":"küf yeşili","indianred":"kızılderili kırmızısı","papayawhip":"papaya sapı","lightslategray":"açık arduvaz grisi","gray":"gri","mediumorchid":"orta orkide","cornsilk":"mısır rengi","black":"siyah","seagreen":"deniz yeşili","darkslateblue":"koyu arduvaz mavisi","khaki":"haki","lightblue":"açık mavi","palegreen":"soluk yeşil","azure":"azur mavisi","peachpuff":"açık şeftali","darkolivegreen":"koyu zeytin yeşili","yellowgreen":"sarı yeşil"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"% #,##0","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Önceki seçenekler","nextMessage":"Diğer seçenekler"},"dijit/nls/common":{"buttonOk":"Tamam","buttonCancel":"İptal","buttonSave":"Kaydet","itemClose":"Kapat"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_tr.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_tr.js.uncompressed.js
new file mode 100644
index 000000000..444d7afe6
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_tr.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_tr',{
+'dijit/form/nls/validate':{"rangeMessage":"Bu değer aralık dışında.","invalidMessage":"Girilen değer geçersiz.","missingMessage":"Bu değer gerekli."}
+,
+'dijit/nls/loading':{"loadingState":"Yükleniyor...","errorState":"Üzgünüz, bir hata oluştu"}
+,
+'dojo/nls/colors':{"lightsteelblue":"açık metalik mavi","orangered":"turuncu kırmızı","midnightblue":"gece mavisi","cadetblue":"denizci mavisi","seashell":"deniz kabuğu","slategrey":"arduvaz grisi","coral":"mercan","darkturquoise":"koyu turkuaz","antiquewhite":"antik beyaz","mediumspringgreen":"orta bahar yeşili","transparent":"saydam","salmon":"somon","darkgrey":"koyu gri","ivory":"fildişi","greenyellow":"yeşil-sarı","mistyrose":"gülkurusu","lightsalmon":"açık somon","silver":"gümüş","dimgrey":"soluk gri","orange":"turuncu","white":"beyaz","navajowhite":"navajo beyazı","royalblue":"parlak koyu mavi","deeppink":"koyu pembe","lime":"limon yeşili","oldlace":"eski dantel","chartreuse":"chartreuse","darkcyan":"koyu camgöbeği","yellow":"sarı","linen":"keten","olive":"zeytin","gold":"altın","lawngreen":"çimen yeşili","lightyellow":"açık sarı","tan":"güneş yanığı","darkviolet":"koyu eflatun","lightslategrey":"açık arduvaz grisi","grey":"gri","darkkhaki":"koyu haki","green":"yeşil","deepskyblue":"koyu gök mavisi","aqua":"deniz mavisi","sienna":"koyu kahve","mintcream":"naneli krem","rosybrown":"pembemsi kahverengi","mediumslateblue":"orta arduvaz mavisi","magenta":"macenta","lightseagreen":"açık deniz yeşili","cyan":"camgöbeği","olivedrab":"asker yeşili","darkgoldenrod":"koyu sarı","slateblue":"arduvaz mavisi","mediumaquamarine":"orta akuamarin","lavender":"lavanta","mediumseagreen":"orta deniz yeşili","maroon":"kestane","darkslategray":"koyu arduvaz grisi","mediumturquoise":"orta turkuaz","ghostwhite":"silik beyaz","darkblue":"koyu mavi","mediumvioletred":"orta menekşe kırmızısı","brown":"kahverengi","lightgray":"açık gri","sandybrown":"kum rengi","pink":"pembe","firebrick":"canlı kiremit","indigo":"çivit mavisi","snow":"kar","darkorchid":"koyu orkide","turquoise":"turkuaz","chocolate":"çikolata","springgreen":"bahar yeşili","moccasin":"mokosen","navy":"lacivert","lemonchiffon":"limoni","teal":"Teal mavi","floralwhite":"çiçek beyazı","cornflowerblue":"peygamber çiçeği mavisi","paleturquoise":"soluk turkuaz","purple":"mor","gainsboro":"gainsboro","plum":"erik","red":"kırmızı","blue":"mavi","forestgreen":"koyu deniz yeşili","darkgreen":"koyu yeşil","honeydew":"çam sakızı","darkseagreen":"koyu deniz yeşili","lightcoral":"açık mercan","palevioletred":"soluk menekşe kırmızısı","mediumpurple":"orta mor","saddlebrown":"açık kahve","darkmagenta":"koyu mor","thistle":"devedikeni","whitesmoke":"beyaz duman","wheat":"buğday","violet":"eflatun","lightskyblue":"açık gök mavisi","goldenrod":"sarısabır","mediumblue":"orta mavi","skyblue":"gök mavisi","crimson":"crimson","darksalmon":"koyu somon","darkred":"koyu kırmızı","darkslategrey":"koyu arduvaz grisi","peru":"peru","lightgrey":"açık gri","lightgoldenrodyellow":"açık sarısabır","blanchedalmond":"soluk badem","aliceblue":"alice mavisi","bisque":"bisküvi","slategray":"arduvaz grisi","palegoldenrod":"soluk sarısabır","darkorange":"koyu turuncu","aquamarine":"akuamarin","lightgreen":"açık yeşil","burlywood":"sarımsı kahverengi","dodgerblue":"toz mavisi","darkgray":"koyu gri","lightcyan":"açık camgöbeği","powderblue":"pudra mavisi","blueviolet":"mavi-mor","orchid":"orkide","dimgray":"soluk gri","beige":"bej","fuchsia":"fuşya","lavenderblush":"lavanta pembesi","hotpink":"sıcak pembe","steelblue":"metalik mavi","tomato":"domates","lightpink":"açık pembe","limegreen":"küf yeşili","indianred":"kızılderili kırmızısı","papayawhip":"papaya sapı","lightslategray":"açık arduvaz grisi","gray":"gri","mediumorchid":"orta orkide","cornsilk":"mısır rengi","black":"siyah","seagreen":"deniz yeşili","darkslateblue":"koyu arduvaz mavisi","khaki":"haki","lightblue":"açık mavi","palegreen":"soluk yeşil","azure":"azur mavisi","peachpuff":"açık şeftali","darkolivegreen":"koyu zeytin yeşili","yellowgreen":"sarı yeşil"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"% #,##0","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"Önceki seçenekler","nextMessage":"Diğer seçenekler"}
+,
+'dijit/nls/common':{"buttonOk":"Tamam","buttonCancel":"İptal","buttonSave":"Kaydet","itemClose":"Kapat"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_xx.js b/lib/dojo/nls/tt-rss-layer_xx.js
deleted file mode 100644
index a4f0b8535..000000000
--- a/lib/dojo/nls/tt-rss-layer_xx.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dojo.nls.tt-rss-layer_xx");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.xx");dojo.nls.colors.xx={"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.xx");dijit.nls.loading.xx={"loadingState":"Loading...","errorState":"Sorry, an error occurred"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.xx");dijit.nls.common.xx={"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.xx");dijit.form.nls.validate.xx={"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.xx");dijit.form.nls.ComboBox.xx={"previousMessage":"Previous choices","nextMessage":"More choices"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.xx");dojo.cldr.nls.number.xx={"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
diff --git a/lib/dojo/nls/tt-rss-layer_zh-cn.js b/lib/dojo/nls/tt-rss-layer_zh-cn.js
index e16eeb4be..b1ad719cb 100644
--- a/lib/dojo/nls/tt-rss-layer_zh-cn.js
+++ b/lib/dojo/nls/tt-rss-layer_zh-cn.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_zh-cn");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.zh_cn");dojo.nls.colors.zh_cn={"lightsteelblue":"浅钢蓝色","orangered":"桔红色","midnightblue":"蓝黑色","cadetblue":"军队蓝","seashell":"贝壳白","slategrey":"石板灰","coral":"珊瑚红","darkturquoise":"深青绿色","antiquewhite":"古董白","mediumspringgreen":"淡草绿色","salmon":"橙红色","darkgrey":"深灰色","ivory":"象牙色","greenyellow":"绿黄色","mistyrose":"粉红玫瑰","lightsalmon":"浅橙红色","silver":"银白色","dimgrey":"暗灰色","orange":"橙色","white":"白色","navajowhite":"印地安黄","royalblue":"亮蓝色","deeppink":"深粉色","lime":"酸橙色","oldlace":"旧布黄","chartreuse":"浅黄绿色","darkcyan":"深青色","yellow":"黄色","linen":"亚麻布色","olive":"橄榄色","gold":"金黄色","lawngreen":"草绿色","lightyellow":"浅黄色","tan":"茶色","darkviolet":"深紫罗兰","lightslategrey":"浅石板灰","grey":"灰色","darkkhaki":"深褐色","green":"绿色","deepskyblue":"深天蓝色","aqua":"水绿色","sienna":"赭色","mintcream":"薄荷乳白","rosybrown":"玫瑰褐色","mediumslateblue":"淡灰蓝色","magenta":"洋红色","lightseagreen":"浅海绿色","cyan":"青色","olivedrab":"暗橄榄色","darkgoldenrod":"深金黄色","slateblue":"石板蓝","mediumaquamarine":"淡碧绿色","lavender":"淡紫色","mediumseagreen":"淡海绿色","maroon":"褐紫红色","darkslategray":"深石板灰","mediumturquoise":"淡青绿色","ghostwhite":"苍白","darkblue":"深蓝色","mediumvioletred":"淡紫罗兰","brown":"褐色","lightgray":"浅灰色","sandybrown":"浅褐色","pink":"粉红色","firebrick":"砖红色","indigo":"靛蓝色","snow":"雪白","darkorchid":"暗兰花紫","turquoise":"青绿色","chocolate":"巧克力色","springgreen":"浅草绿色","moccasin":"鹿皮黄","navy":"藏青色","lemonchiffon":"柠檬色","teal":"青色","floralwhite":"花白","cornflowerblue":"藏蓝色","paleturquoise":"淡青绿色","purple":"紫色","gainsboro":"亮灰色","plum":"梅红色","red":"红色","blue":"蓝色","forestgreen":"森林绿","darkgreen":"深绿色","honeydew":"蜜色","darkseagreen":"深海绿色","lightcoral":"浅珊瑚红","palevioletred":"浅紫罗兰","mediumpurple":"淡紫色","saddlebrown":"鞍具褐色","darkmagenta":"深洋红色","thistle":"蓟色","whitesmoke":"烟白色","wheat":"淡黄色","violet":"紫罗兰色","lightskyblue":"浅天蓝色","goldenrod":"鲜黄","mediumblue":"淡蓝色","skyblue":"天蓝色","crimson":"绯红色","darksalmon":"深橙红","darkred":"深红色","darkslategrey":"深石板灰","peru":"秘鲁棕","lightgrey":"浅灰色","lightgoldenrodyellow":"浅金黄色","blanchedalmond":"杏仁白","aliceblue":"艾莉斯蓝","bisque":"乳黄色","slategray":"石板灰","palegoldenrod":"浅金黄色","darkorange":"深橙色","aquamarine":"碧绿色","lightgreen":"浅绿色","burlywood":"原木色","dodgerblue":"宝蓝","darkgray":"深灰色","lightcyan":"浅青色","powderblue":"粉蓝色","blueviolet":"蓝紫色","orchid":"兰花紫","dimgray":"暗灰色","beige":"米色","fuchsia":"紫红色","lavenderblush":"淡紫红色","hotpink":"暗粉","steelblue":"钢蓝色","tomato":"番茄色","lightpink":"浅粉色","limegreen":"暗黄绿色","indianred":"印度红","papayawhip":"粉木瓜橙","lightslategray":"浅石板灰","gray":"灰色","mediumorchid":"淡兰花紫","cornsilk":"玉米黄","black":"黑色","seagreen":"海绿色","darkslateblue":"深石板蓝","khaki":"黄褐色","lightblue":"淡蓝色","palegreen":"淡绿色","azure":"浅天蓝","peachpuff":"粉桃红","darkolivegreen":"深橄榄绿色","yellowgreen":"黄绿色"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.zh_cn");dijit.nls.loading.zh_cn={"loadingState":"正在加载...","errorState":"对不起,发生了错误"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.zh_cn");dijit.nls.common.zh_cn={"buttonOk":"确定","buttonCancel":"取消","buttonSave":"保存","itemClose":"关闭"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.zh_cn");dijit.form.nls.validate.zh_cn={"rangeMessage":"此值超出范围。","invalidMessage":"输入的值无效。","missingMessage":"此值是必需值。"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.zh_cn");dijit.form.nls.ComboBox.zh_cn={"previousMessage":"先前选项","nextMessage":"更多选项"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.zh_cn");dojo.cldr.nls.number.zh_cn={"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_zh-cn",{"dijit/form/nls/validate":{"rangeMessage":"此值超出范围。","invalidMessage":"输入的值无效。","missingMessage":"此值是必需值。"},"dijit/nls/loading":{"loadingState":"正在加载...","errorState":"对不起,发生了错误"},"dojo/nls/colors":{"lightsteelblue":"浅钢蓝色","orangered":"橙红色","midnightblue":"深蓝色","cadetblue":"灰蓝色","seashell":"海贝色","slategrey":"灰石色","coral":"珊瑚色","darkturquoise":"深粉蓝","antiquewhite":"古董白","mediumspringgreen":"间春绿色","transparent":"透明的","salmon":"橙红","darkgrey":"深灰色","ivory":"象牙色","greenyellow":"绿黄色","mistyrose":"浅玫瑰色","lightsalmon":"淡橙色","silver":"银白色","dimgrey":"暗灰色","orange":"橙色","white":"白色","navajowhite":"纳瓦白","royalblue":"品蓝","deeppink":"深粉红色","lime":"淡黄绿色","oldlace":"老白色","chartreuse":"黄绿色","darkcyan":"深青绿","yellow":"黄色","linen":"亚麻色","olive":"橄榄绿","gold":"金黄色","lawngreen":"草绿色","lightyellow":"浅黄色","tan":"棕褐色","darkviolet":"深紫色","lightslategrey":"浅青灰","grey":"灰色","darkkhaki":"深卡其色","green":"绿色","deepskyblue":"深天蓝色","aqua":"浅绿色","sienna":"赭色","mintcream":"薄荷色","rosybrown":"褐玫瑰红","mediumslateblue":"间暗蓝色","magenta":"洋红色","lightseagreen":"浅海藻绿","cyan":"青蓝色","olivedrab":"草绿色","darkgoldenrod":"深金黄","slateblue":"石蓝色","mediumaquamarine":"间绿色","lavender":"淡紫色","mediumseagreen":"间海蓝色","maroon":"栗色","darkslategray":"深青灰","mediumturquoise":"间绿宝石色","ghostwhite":"苍白","darkblue":"深蓝","mediumvioletred":"间紫罗兰色","brown":"棕色","lightgray":"浅灰色","sandybrown":"沙褐色","pink":"粉红色","firebrick":"砖红","indigo":"靛青","snow":"雪白色","darkorchid":"深紫色","turquoise":"绿宝石色","chocolate":"巧克力色","springgreen":"春绿色","moccasin":"鹿皮色","navy":"藏青色","lemonchiffon":"柠檬绸色","teal":"水鸭色","floralwhite":"花白色","cornflowerblue":"浅蓝色","paleturquoise":"苍绿色","purple":"紫色","gainsboro":"淡灰色","plum":"杨李色","red":"红色","blue":"蓝色","forestgreen":"森林绿","darkgreen":"深绿色","honeydew":"蜜汁色","darkseagreen":"深海藻绿","lightcoral":"浅珊瑚色","palevioletred":"苍紫罗兰色","mediumpurple":"间紫色","saddlebrown":"重褐色","darkmagenta":"深洋红色","thistle":"蓟色","whitesmoke":"烟白色","wheat":"浅黄色","violet":"紫色","lightskyblue":"浅天蓝色","goldenrod":"金麒麟色","mediumblue":"间蓝色","skyblue":"天蓝色","crimson":"绯红色","darksalmon":"深橙红","darkred":"深红色","darkslategrey":"深青灰","peru":"秘鲁色","lightgrey":"浅灰色","lightgoldenrodyellow":"浅金黄色","blanchedalmond":"白杏色","aliceblue":"爱丽丝蓝","bisque":"桔黄色","slategray":"灰石色","palegoldenrod":"淡金黄色","darkorange":"深橙色","aquamarine":"碧绿色","lightgreen":"浅绿色","burlywood":"实木色","dodgerblue":"闪蓝色","darkgray":"深灰色","lightcyan":"浅青色","powderblue":"铁蓝","blueviolet":"蓝紫色","orchid":"紫色","dimgray":"暗灰色","beige":"米色","fuchsia":"紫红色","lavenderblush":"淡紫红","hotpink":"深粉红","steelblue":"钢蓝色","tomato":"西红柿色","lightpink":"浅粉红色","limegreen":"橙绿色","indianred":"印度红","papayawhip":"木瓜色","lightslategray":"浅青灰","gray":"灰色","mediumorchid":"间紫色","cornsilk":"米绸色","black":"黑色","seagreen":"海绿色","darkslateblue":"深青蓝","khaki":"卡其色","lightblue":"淡蓝色","palegreen":"淡绿色","azure":"天蓝色","peachpuff":"桃色","darkolivegreen":"深橄榄绿","yellowgreen":"黄绿色"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"先前选项","nextMessage":"更多选项"},"dijit/nls/common":{"buttonOk":"确定","buttonCancel":"取消","buttonSave":"保存","itemClose":"关闭"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_zh-cn.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_zh-cn.js.uncompressed.js
new file mode 100644
index 000000000..957a54efa
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_zh-cn.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_zh-cn',{
+'dijit/form/nls/validate':{"rangeMessage":"此值超出范围。","invalidMessage":"输入的值无效。","missingMessage":"此值是必需值。"}
+,
+'dijit/nls/loading':{"loadingState":"正在加载...","errorState":"对不起,发生了错误"}
+,
+'dojo/nls/colors':{"lightsteelblue":"浅钢蓝色","orangered":"橙红色","midnightblue":"深蓝色","cadetblue":"灰蓝色","seashell":"海贝色","slategrey":"灰石色","coral":"珊瑚色","darkturquoise":"深粉蓝","antiquewhite":"古董白","mediumspringgreen":"间春绿色","transparent":"透明的","salmon":"橙红","darkgrey":"深灰色","ivory":"象牙色","greenyellow":"绿黄色","mistyrose":"浅玫瑰色","lightsalmon":"淡橙色","silver":"银白色","dimgrey":"暗灰色","orange":"橙色","white":"白色","navajowhite":"纳瓦白","royalblue":"品蓝","deeppink":"深粉红色","lime":"淡黄绿色","oldlace":"老白色","chartreuse":"黄绿色","darkcyan":"深青绿","yellow":"黄色","linen":"亚麻色","olive":"橄榄绿","gold":"金黄色","lawngreen":"草绿色","lightyellow":"浅黄色","tan":"棕褐色","darkviolet":"深紫色","lightslategrey":"浅青灰","grey":"灰色","darkkhaki":"深卡其色","green":"绿色","deepskyblue":"深天蓝色","aqua":"浅绿色","sienna":"赭色","mintcream":"薄荷色","rosybrown":"褐玫瑰红","mediumslateblue":"间暗蓝色","magenta":"洋红色","lightseagreen":"浅海藻绿","cyan":"青蓝色","olivedrab":"草绿色","darkgoldenrod":"深金黄","slateblue":"石蓝色","mediumaquamarine":"间绿色","lavender":"淡紫色","mediumseagreen":"间海蓝色","maroon":"栗色","darkslategray":"深青灰","mediumturquoise":"间绿宝石色","ghostwhite":"苍白","darkblue":"深蓝","mediumvioletred":"间紫罗兰色","brown":"棕色","lightgray":"浅灰色","sandybrown":"沙褐色","pink":"粉红色","firebrick":"砖红","indigo":"靛青","snow":"雪白色","darkorchid":"深紫色","turquoise":"绿宝石色","chocolate":"巧克力色","springgreen":"春绿色","moccasin":"鹿皮色","navy":"藏青色","lemonchiffon":"柠檬绸色","teal":"水鸭色","floralwhite":"花白色","cornflowerblue":"浅蓝色","paleturquoise":"苍绿色","purple":"紫色","gainsboro":"淡灰色","plum":"杨李色","red":"红色","blue":"蓝色","forestgreen":"森林绿","darkgreen":"深绿色","honeydew":"蜜汁色","darkseagreen":"深海藻绿","lightcoral":"浅珊瑚色","palevioletred":"苍紫罗兰色","mediumpurple":"间紫色","saddlebrown":"重褐色","darkmagenta":"深洋红色","thistle":"蓟色","whitesmoke":"烟白色","wheat":"浅黄色","violet":"紫色","lightskyblue":"浅天蓝色","goldenrod":"金麒麟色","mediumblue":"间蓝色","skyblue":"天蓝色","crimson":"绯红色","darksalmon":"深橙红","darkred":"深红色","darkslategrey":"深青灰","peru":"秘鲁色","lightgrey":"浅灰色","lightgoldenrodyellow":"浅金黄色","blanchedalmond":"白杏色","aliceblue":"爱丽丝蓝","bisque":"桔黄色","slategray":"灰石色","palegoldenrod":"淡金黄色","darkorange":"深橙色","aquamarine":"碧绿色","lightgreen":"浅绿色","burlywood":"实木色","dodgerblue":"闪蓝色","darkgray":"深灰色","lightcyan":"浅青色","powderblue":"铁蓝","blueviolet":"蓝紫色","orchid":"紫色","dimgray":"暗灰色","beige":"米色","fuchsia":"紫红色","lavenderblush":"淡紫红","hotpink":"深粉红","steelblue":"钢蓝色","tomato":"西红柿色","lightpink":"浅粉红色","limegreen":"橙绿色","indianred":"印度红","papayawhip":"木瓜色","lightslategray":"浅青灰","gray":"灰色","mediumorchid":"间紫色","cornsilk":"米绸色","black":"黑色","seagreen":"海绿色","darkslateblue":"深青蓝","khaki":"卡其色","lightblue":"淡蓝色","palegreen":"淡绿色","azure":"天蓝色","peachpuff":"桃色","darkolivegreen":"深橄榄绿","yellowgreen":"黄绿色"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"先前选项","nextMessage":"更多选项"}
+,
+'dijit/nls/common':{"buttonOk":"确定","buttonCancel":"取消","buttonSave":"保存","itemClose":"关闭"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_zh-tw.js b/lib/dojo/nls/tt-rss-layer_zh-tw.js
index 9ac816dd9..99244ded2 100644
--- a/lib/dojo/nls/tt-rss-layer_zh-tw.js
+++ b/lib/dojo/nls/tt-rss-layer_zh-tw.js
@@ -1 +1,8 @@
-dojo.provide("dojo.nls.tt-rss-layer_zh-tw");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.zh_tw");dojo.nls.colors.zh_tw={"lightsteelblue":"淡鐵藍色","orangered":"橙紅色","midnightblue":"午夜藍","cadetblue":"軍服藍","seashell":"海貝色","slategrey":"岩灰色","coral":"珊瑚紅","darkturquoise":"暗松石綠","antiquewhite":"米白色","mediumspringgreen":"中春綠色","salmon":"鮭紅色","darkgrey":"暗灰色","ivory":"象牙色","greenyellow":"綠黃色","mistyrose":"霧玫瑰色","lightsalmon":"淡鮭紅","silver":"銀色","dimgrey":"昏灰色","orange":"橙色","white":"白色","navajowhite":"印地安黃色","royalblue":"品藍色","deeppink":"深粉紅色","lime":"檸檬色","oldlace":"舊蕾絲色","chartreuse":"淡黃綠色","darkcyan":"暗青色","yellow":"黃色","linen":"亞麻色","olive":"橄欖色","gold":"金色","lawngreen":"草綠色","lightyellow":"淡黃色","tan":"皮革色","darkviolet":"暗紫羅蘭色","lightslategrey":"淡岩灰色","grey":"灰色","darkkhaki":"暗卡其色","green":"綠色","deepskyblue":"深天藍色","aqua":"水色","sienna":"黃土赭色","mintcream":"薄荷乳白色","rosybrown":"玫瑰褐","mediumslateblue":"中岩藍色","magenta":"紫紅色","lightseagreen":"淡海綠色","cyan":"青色","olivedrab":"橄欖綠","darkgoldenrod":"暗金菊色","slateblue":"岩藍色","mediumaquamarine":"中碧綠色","lavender":"薰衣草紫","mediumseagreen":"中海綠色","maroon":"栗色","darkslategray":"暗岩灰色","mediumturquoise":"中松石綠","ghostwhite":"幽靈色","darkblue":"暗藍色","mediumvioletred":"中紫羅蘭紅","brown":"褐色","lightgray":"淡灰色","sandybrown":"沙褐色","pink":"粉紅色","firebrick":"紅磚色","indigo":"靛藍色","snow":"雪白色","darkorchid":"暗蘭花色","turquoise":"松石綠","chocolate":"巧克力色","springgreen":"春綠色","moccasin":"鹿皮黃色","navy":"海軍藍","lemonchiffon":"奶油黃","teal":"深藍綠色","floralwhite":"花卉白","cornflowerblue":"矢車菊藍","paleturquoise":"灰松石綠","purple":"紫色","gainsboro":"石板灰","plum":"李紫色","red":"紅色","blue":"藍色","forestgreen":"森綠色","darkgreen":"暗綠色","honeydew":"密瓜色","darkseagreen":"暗海綠色","lightcoral":"淡珊瑚紅","palevioletred":"灰紫羅蘭紅","mediumpurple":"中紫色","saddlebrown":"鞍褐色","darkmagenta":"暗紫紅色","thistle":"薊色","whitesmoke":"白煙色","wheat":"小麥色","violet":"紫羅蘭色","lightskyblue":"淡天藍色","goldenrod":"金菊色","mediumblue":"中藍色","skyblue":"天藍色","crimson":"暗深紅色","darksalmon":"暗鮭紅","darkred":"暗紅色","darkslategrey":"暗岩灰色","peru":"祕魯色","lightgrey":"淡灰色","lightgoldenrodyellow":"淡金菊黃","blanchedalmond":"杏仁白","aliceblue":"愛麗絲藍","bisque":"橘黃色","slategray":"岩灰色","palegoldenrod":"灰金菊色","darkorange":"暗橙色","aquamarine":"碧綠色","lightgreen":"淡綠色","burlywood":"實木色","dodgerblue":"道奇藍","darkgray":"暗灰色","lightcyan":"淡青色","powderblue":"粉藍色","blueviolet":"藍紫色","orchid":"蘭花色","dimgray":"昏灰色","beige":"灰棕色","fuchsia":"海棠紅","lavenderblush":"薰衣草紫紅","hotpink":"暖粉紅色","steelblue":"鐵藍色","tomato":"蕃茄紅","lightpink":"淡粉紅色","limegreen":"檸檬綠","indianred":"印度紅","papayawhip":"番木瓜色","lightslategray":"淡岩灰色","gray":"灰色","mediumorchid":"中蘭紫色","cornsilk":"玉米黃","black":"黑色","seagreen":"海綠色","darkslateblue":"暗岩藍色","khaki":"卡其色","lightblue":"淡藍色","palegreen":"灰綠色","azure":"天藍色","peachpuff":"粉撲桃色","darkolivegreen":"暗橄欖綠","yellowgreen":"黃綠色"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.zh_tw");dijit.nls.loading.zh_tw={"loadingState":"載入中...","errorState":"抱歉,發生錯誤"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.zh_tw");dijit.nls.common.zh_tw={"buttonOk":"確定","buttonCancel":"取消","buttonSave":"儲存","itemClose":"關閉"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.zh_tw");dijit.form.nls.validate.zh_tw={"rangeMessage":"此值超出範圍。","invalidMessage":"輸入的值無效。","missingMessage":"必須提供此值。"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.zh_tw");dijit.form.nls.ComboBox.zh_tw={"previousMessage":"前一個選擇項","nextMessage":"其他選擇項"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.zh_tw");dojo.cldr.nls.number.zh_tw={"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/tt-rss-layer_zh-tw",{"dijit/form/nls/validate":{"rangeMessage":"此值超出範圍。","invalidMessage":"輸入的值無效。","missingMessage":"必須提供此值。"},"dijit/nls/loading":{"loadingState":"載入中...","errorState":"抱歉,發生錯誤"},"dojo/nls/colors":{"lightsteelblue":"淡鐵藍色","orangered":"橙紅色","midnightblue":"午夜藍","cadetblue":"軍服藍","seashell":"海貝色","slategrey":"岩灰色","coral":"珊瑚紅","darkturquoise":"暗松石綠","antiquewhite":"米白色","mediumspringgreen":"中春綠色","transparent":"透明","salmon":"鮭紅色","darkgrey":"暗灰色","ivory":"象牙色","greenyellow":"綠黃色","mistyrose":"霧玫瑰色","lightsalmon":"淡鮭紅","silver":"銀色","dimgrey":"昏灰色","orange":"橙色","white":"白色","navajowhite":"印地安黃色","royalblue":"品藍色","deeppink":"深粉紅色","lime":"檸檬色","oldlace":"舊蕾絲色","chartreuse":"淡黃綠色","darkcyan":"暗青色","yellow":"黃色","linen":"亞麻色","olive":"橄欖色","gold":"金色","lawngreen":"草綠色","lightyellow":"淡黃色","tan":"皮革色","darkviolet":"暗紫羅蘭色","lightslategrey":"淡岩灰色","grey":"灰色","darkkhaki":"暗卡其色","green":"綠色","deepskyblue":"深天藍色","aqua":"水色","sienna":"黃土赭色","mintcream":"薄荷乳白色","rosybrown":"玫瑰褐","mediumslateblue":"中岩藍色","magenta":"紫紅色","lightseagreen":"淡海綠色","cyan":"青色","olivedrab":"橄欖綠","darkgoldenrod":"暗金菊色","slateblue":"岩藍色","mediumaquamarine":"中碧綠色","lavender":"薰衣草紫","mediumseagreen":"中海綠色","maroon":"栗色","darkslategray":"暗岩灰色","mediumturquoise":"中松石綠","ghostwhite":"幽靈色","darkblue":"暗藍色","mediumvioletred":"中紫羅蘭紅","brown":"褐色","lightgray":"淡灰色","sandybrown":"沙褐色","pink":"粉紅色","firebrick":"紅磚色","indigo":"靛藍色","snow":"雪白色","darkorchid":"暗蘭花色","turquoise":"松石綠","chocolate":"巧克力色","springgreen":"春綠色","moccasin":"鹿皮黃色","navy":"海軍藍","lemonchiffon":"奶油黃","teal":"深藍綠色","floralwhite":"花卉白","cornflowerblue":"矢車菊藍","paleturquoise":"灰松石綠","purple":"紫色","gainsboro":"石板灰","plum":"李紫色","red":"紅色","blue":"藍色","forestgreen":"森綠色","darkgreen":"暗綠色","honeydew":"密瓜色","darkseagreen":"暗海綠色","lightcoral":"淡珊瑚紅","palevioletred":"灰紫羅蘭紅","mediumpurple":"中紫色","saddlebrown":"鞍褐色","darkmagenta":"暗紫紅色","thistle":"薊色","whitesmoke":"白煙色","wheat":"小麥色","violet":"紫羅蘭色","lightskyblue":"淡天藍色","goldenrod":"金菊色","mediumblue":"中藍色","skyblue":"天藍色","crimson":"暗深紅色","darksalmon":"暗鮭紅","darkred":"暗紅色","darkslategrey":"暗岩灰色","peru":"祕魯色","lightgrey":"淡灰色","lightgoldenrodyellow":"淡金菊黃","blanchedalmond":"杏仁白","aliceblue":"愛麗絲藍","bisque":"橘黃色","slategray":"岩灰色","palegoldenrod":"灰金菊色","darkorange":"暗橙色","aquamarine":"碧綠色","lightgreen":"淡綠色","burlywood":"實木色","dodgerblue":"道奇藍","darkgray":"暗灰色","lightcyan":"淡青色","powderblue":"粉藍色","blueviolet":"藍紫色","orchid":"蘭花色","dimgray":"昏灰色","beige":"灰棕色","fuchsia":"海棠紅","lavenderblush":"薰衣草紫紅","hotpink":"暖粉紅色","steelblue":"鐵藍色","tomato":"蕃茄紅","lightpink":"淡粉紅色","limegreen":"檸檬綠","indianred":"印度紅","papayawhip":"番木瓜色","lightslategray":"淡岩灰色","gray":"灰色","mediumorchid":"中蘭紫色","cornsilk":"玉米黃","black":"黑色","seagreen":"海綠色","darkslateblue":"暗岩藍色","khaki":"卡其色","lightblue":"淡藍色","palegreen":"灰綠色","azure":"天藍色","peachpuff":"粉撲桃色","darkolivegreen":"暗橄欖綠","yellowgreen":"黃綠色"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"前一個選擇項","nextMessage":"其他選擇項"},"dijit/nls/common":{"buttonOk":"確定","buttonCancel":"取消","buttonSave":"儲存","itemClose":"關閉"}}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_zh-tw.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_zh-tw.js.uncompressed.js
new file mode 100644
index 000000000..14378f4ec
--- /dev/null
+++ b/lib/dojo/nls/tt-rss-layer_zh-tw.js.uncompressed.js
@@ -0,0 +1,13 @@
+define('dojo/nls/tt-rss-layer_zh-tw',{
+'dijit/form/nls/validate':{"rangeMessage":"此值超出範圍。","invalidMessage":"輸入的值無效。","missingMessage":"必須提供此值。"}
+,
+'dijit/nls/loading':{"loadingState":"載入中...","errorState":"抱歉,發生錯誤"}
+,
+'dojo/nls/colors':{"lightsteelblue":"淡鐵藍色","orangered":"橙紅色","midnightblue":"午夜藍","cadetblue":"軍服藍","seashell":"海貝色","slategrey":"岩灰色","coral":"珊瑚紅","darkturquoise":"暗松石綠","antiquewhite":"米白色","mediumspringgreen":"中春綠色","transparent":"透明","salmon":"鮭紅色","darkgrey":"暗灰色","ivory":"象牙色","greenyellow":"綠黃色","mistyrose":"霧玫瑰色","lightsalmon":"淡鮭紅","silver":"銀色","dimgrey":"昏灰色","orange":"橙色","white":"白色","navajowhite":"印地安黃色","royalblue":"品藍色","deeppink":"深粉紅色","lime":"檸檬色","oldlace":"舊蕾絲色","chartreuse":"淡黃綠色","darkcyan":"暗青色","yellow":"黃色","linen":"亞麻色","olive":"橄欖色","gold":"金色","lawngreen":"草綠色","lightyellow":"淡黃色","tan":"皮革色","darkviolet":"暗紫羅蘭色","lightslategrey":"淡岩灰色","grey":"灰色","darkkhaki":"暗卡其色","green":"綠色","deepskyblue":"深天藍色","aqua":"水色","sienna":"黃土赭色","mintcream":"薄荷乳白色","rosybrown":"玫瑰褐","mediumslateblue":"中岩藍色","magenta":"紫紅色","lightseagreen":"淡海綠色","cyan":"青色","olivedrab":"橄欖綠","darkgoldenrod":"暗金菊色","slateblue":"岩藍色","mediumaquamarine":"中碧綠色","lavender":"薰衣草紫","mediumseagreen":"中海綠色","maroon":"栗色","darkslategray":"暗岩灰色","mediumturquoise":"中松石綠","ghostwhite":"幽靈色","darkblue":"暗藍色","mediumvioletred":"中紫羅蘭紅","brown":"褐色","lightgray":"淡灰色","sandybrown":"沙褐色","pink":"粉紅色","firebrick":"紅磚色","indigo":"靛藍色","snow":"雪白色","darkorchid":"暗蘭花色","turquoise":"松石綠","chocolate":"巧克力色","springgreen":"春綠色","moccasin":"鹿皮黃色","navy":"海軍藍","lemonchiffon":"奶油黃","teal":"深藍綠色","floralwhite":"花卉白","cornflowerblue":"矢車菊藍","paleturquoise":"灰松石綠","purple":"紫色","gainsboro":"石板灰","plum":"李紫色","red":"紅色","blue":"藍色","forestgreen":"森綠色","darkgreen":"暗綠色","honeydew":"密瓜色","darkseagreen":"暗海綠色","lightcoral":"淡珊瑚紅","palevioletred":"灰紫羅蘭紅","mediumpurple":"中紫色","saddlebrown":"鞍褐色","darkmagenta":"暗紫紅色","thistle":"薊色","whitesmoke":"白煙色","wheat":"小麥色","violet":"紫羅蘭色","lightskyblue":"淡天藍色","goldenrod":"金菊色","mediumblue":"中藍色","skyblue":"天藍色","crimson":"暗深紅色","darksalmon":"暗鮭紅","darkred":"暗紅色","darkslategrey":"暗岩灰色","peru":"祕魯色","lightgrey":"淡灰色","lightgoldenrodyellow":"淡金菊黃","blanchedalmond":"杏仁白","aliceblue":"愛麗絲藍","bisque":"橘黃色","slategray":"岩灰色","palegoldenrod":"灰金菊色","darkorange":"暗橙色","aquamarine":"碧綠色","lightgreen":"淡綠色","burlywood":"實木色","dodgerblue":"道奇藍","darkgray":"暗灰色","lightcyan":"淡青色","powderblue":"粉藍色","blueviolet":"藍紫色","orchid":"蘭花色","dimgray":"昏灰色","beige":"灰棕色","fuchsia":"海棠紅","lavenderblush":"薰衣草紫紅","hotpink":"暖粉紅色","steelblue":"鐵藍色","tomato":"蕃茄紅","lightpink":"淡粉紅色","limegreen":"檸檬綠","indianred":"印度紅","papayawhip":"番木瓜色","lightslategray":"淡岩灰色","gray":"灰色","mediumorchid":"中蘭紫色","cornsilk":"玉米黃","black":"黑色","seagreen":"海綠色","darkslateblue":"暗岩藍色","khaki":"卡其色","lightblue":"淡藍色","palegreen":"灰綠色","azure":"天藍色","peachpuff":"粉撲桃色","darkolivegreen":"暗橄欖綠","yellowgreen":"黃綠色"}
+,
+'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}
+,
+'dijit/form/nls/ComboBox':{"previousMessage":"前一個選擇項","nextMessage":"其他選擇項"}
+,
+'dijit/nls/common':{"buttonOk":"確定","buttonCancel":"取消","buttonSave":"儲存","itemClose":"關閉"}
+}); \ No newline at end of file
diff --git a/lib/dojo/nls/tt-rss-layer_zh.js b/lib/dojo/nls/tt-rss-layer_zh.js
deleted file mode 100644
index 0b391dbbb..000000000
--- a/lib/dojo/nls/tt-rss-layer_zh.js
+++ /dev/null
@@ -1 +0,0 @@
-dojo.provide("dojo.nls.tt-rss-layer_zh");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.zh");dojo.nls.colors.zh={"lightsteelblue":"浅钢蓝色","orangered":"桔红色","midnightblue":"蓝黑色","cadetblue":"军队蓝","seashell":"贝壳白","slategrey":"石板灰","coral":"珊瑚红","darkturquoise":"深青绿色","antiquewhite":"古董白","mediumspringgreen":"淡草绿色","salmon":"橙红色","darkgrey":"深灰色","ivory":"象牙色","greenyellow":"绿黄色","mistyrose":"粉红玫瑰","lightsalmon":"浅橙红色","silver":"银白色","dimgrey":"暗灰色","orange":"橙色","white":"白色","navajowhite":"印地安黄","royalblue":"亮蓝色","deeppink":"深粉色","lime":"酸橙色","oldlace":"旧布黄","chartreuse":"浅黄绿色","darkcyan":"深青色","yellow":"黄色","linen":"亚麻布色","olive":"橄榄色","gold":"金黄色","lawngreen":"草绿色","lightyellow":"浅黄色","tan":"茶色","darkviolet":"深紫罗兰","lightslategrey":"浅石板灰","grey":"灰色","darkkhaki":"深褐色","green":"绿色","deepskyblue":"深天蓝色","aqua":"水绿色","sienna":"赭色","mintcream":"薄荷乳白","rosybrown":"玫瑰褐色","mediumslateblue":"淡灰蓝色","magenta":"洋红色","lightseagreen":"浅海绿色","cyan":"青色","olivedrab":"暗橄榄色","darkgoldenrod":"深金黄色","slateblue":"石板蓝","mediumaquamarine":"淡碧绿色","lavender":"淡紫色","mediumseagreen":"淡海绿色","maroon":"褐紫红色","darkslategray":"深石板灰","mediumturquoise":"淡青绿色","ghostwhite":"苍白","darkblue":"深蓝色","mediumvioletred":"淡紫罗兰","brown":"褐色","lightgray":"浅灰色","sandybrown":"浅褐色","pink":"粉红色","firebrick":"砖红色","indigo":"靛蓝色","snow":"雪白","darkorchid":"暗兰花紫","turquoise":"青绿色","chocolate":"巧克力色","springgreen":"浅草绿色","moccasin":"鹿皮黄","navy":"藏青色","lemonchiffon":"柠檬色","teal":"青色","floralwhite":"花白","cornflowerblue":"藏蓝色","paleturquoise":"淡青绿色","purple":"紫色","gainsboro":"亮灰色","plum":"梅红色","red":"红色","blue":"蓝色","forestgreen":"森林绿","darkgreen":"深绿色","honeydew":"蜜色","darkseagreen":"深海绿色","lightcoral":"浅珊瑚红","palevioletred":"浅紫罗兰","mediumpurple":"淡紫色","saddlebrown":"鞍具褐色","darkmagenta":"深洋红色","thistle":"蓟色","whitesmoke":"烟白色","wheat":"淡黄色","violet":"紫罗兰色","lightskyblue":"浅天蓝色","goldenrod":"鲜黄","mediumblue":"淡蓝色","skyblue":"天蓝色","crimson":"绯红色","darksalmon":"深橙红","darkred":"深红色","darkslategrey":"深石板灰","peru":"秘鲁棕","lightgrey":"浅灰色","lightgoldenrodyellow":"浅金黄色","blanchedalmond":"杏仁白","aliceblue":"艾莉斯蓝","bisque":"乳黄色","slategray":"石板灰","palegoldenrod":"浅金黄色","darkorange":"深橙色","aquamarine":"碧绿色","lightgreen":"浅绿色","burlywood":"原木色","dodgerblue":"宝蓝","darkgray":"深灰色","lightcyan":"浅青色","powderblue":"粉蓝色","blueviolet":"蓝紫色","orchid":"兰花紫","dimgray":"暗灰色","beige":"米色","fuchsia":"紫红色","lavenderblush":"淡紫红色","hotpink":"暗粉","steelblue":"钢蓝色","tomato":"番茄色","lightpink":"浅粉色","limegreen":"暗黄绿色","indianred":"印度红","papayawhip":"粉木瓜橙","lightslategray":"浅石板灰","gray":"灰色","mediumorchid":"淡兰花紫","cornsilk":"玉米黄","black":"黑色","seagreen":"海绿色","darkslateblue":"深石板蓝","khaki":"黄褐色","lightblue":"淡蓝色","palegreen":"淡绿色","azure":"浅天蓝","peachpuff":"粉桃红","darkolivegreen":"深橄榄绿色","yellowgreen":"黄绿色"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.zh");dijit.nls.loading.zh={"loadingState":"正在加载...","errorState":"对不起,发生了错误"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.zh");dijit.nls.common.zh={"buttonOk":"确定","buttonCancel":"取消","buttonSave":"保存","itemClose":"关闭"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.zh");dijit.form.nls.validate.zh={"rangeMessage":"此值超出范围。","invalidMessage":"输入的值无效。","missingMessage":"此值是必需值。"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.zh");dijit.form.nls.ComboBox.zh={"previousMessage":"先前选项","nextMessage":"更多选项"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.zh");dojo.cldr.nls.number.zh={"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};
diff --git a/lib/dojo/nls/zh-tw/colors.js b/lib/dojo/nls/zh-tw/colors.js
index 6ee6c5ec3..e3e36634b 100644
--- a/lib/dojo/nls/zh-tw/colors.js
+++ b/lib/dojo/nls/zh-tw/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"淡鐵藍色","orangered":"橙紅色","midnightblue":"午夜藍","cadetblue":"軍服藍","seashell":"海貝色","slategrey":"岩灰色","coral":"珊瑚紅","darkturquoise":"暗松石綠","antiquewhite":"米白色","mediumspringgreen":"中春綠色","salmon":"鮭紅色","darkgrey":"暗灰色","ivory":"象牙色","greenyellow":"綠黃色","mistyrose":"霧玫瑰色","lightsalmon":"淡鮭紅","silver":"銀色","dimgrey":"昏灰色","orange":"橙色","white":"白色","navajowhite":"印地安黃色","royalblue":"品藍色","deeppink":"深粉紅色","lime":"檸檬色","oldlace":"舊蕾絲色","chartreuse":"淡黃綠色","darkcyan":"暗青色","yellow":"黃色","linen":"亞麻色","olive":"橄欖色","gold":"金色","lawngreen":"草綠色","lightyellow":"淡黃色","tan":"皮革色","darkviolet":"暗紫羅蘭色","lightslategrey":"淡岩灰色","grey":"灰色","darkkhaki":"暗卡其色","green":"綠色","deepskyblue":"深天藍色","aqua":"水色","sienna":"黃土赭色","mintcream":"薄荷乳白色","rosybrown":"玫瑰褐","mediumslateblue":"中岩藍色","magenta":"紫紅色","lightseagreen":"淡海綠色","cyan":"青色","olivedrab":"橄欖綠","darkgoldenrod":"暗金菊色","slateblue":"岩藍色","mediumaquamarine":"中碧綠色","lavender":"薰衣草紫","mediumseagreen":"中海綠色","maroon":"栗色","darkslategray":"暗岩灰色","mediumturquoise":"中松石綠","ghostwhite":"幽靈色","darkblue":"暗藍色","mediumvioletred":"中紫羅蘭紅","brown":"褐色","lightgray":"淡灰色","sandybrown":"沙褐色","pink":"粉紅色","firebrick":"紅磚色","indigo":"靛藍色","snow":"雪白色","darkorchid":"暗蘭花色","turquoise":"松石綠","chocolate":"巧克力色","springgreen":"春綠色","moccasin":"鹿皮黃色","navy":"海軍藍","lemonchiffon":"奶油黃","teal":"深藍綠色","floralwhite":"花卉白","cornflowerblue":"矢車菊藍","paleturquoise":"灰松石綠","purple":"紫色","gainsboro":"石板灰","plum":"李紫色","red":"紅色","blue":"藍色","forestgreen":"森綠色","darkgreen":"暗綠色","honeydew":"密瓜色","darkseagreen":"暗海綠色","lightcoral":"淡珊瑚紅","palevioletred":"灰紫羅蘭紅","mediumpurple":"中紫色","saddlebrown":"鞍褐色","darkmagenta":"暗紫紅色","thistle":"薊色","whitesmoke":"白煙色","wheat":"小麥色","violet":"紫羅蘭色","lightskyblue":"淡天藍色","goldenrod":"金菊色","mediumblue":"中藍色","skyblue":"天藍色","crimson":"暗深紅色","darksalmon":"暗鮭紅","darkred":"暗紅色","darkslategrey":"暗岩灰色","peru":"祕魯色","lightgrey":"淡灰色","lightgoldenrodyellow":"淡金菊黃","blanchedalmond":"杏仁白","aliceblue":"愛麗絲藍","bisque":"橘黃色","slategray":"岩灰色","palegoldenrod":"灰金菊色","darkorange":"暗橙色","aquamarine":"碧綠色","lightgreen":"淡綠色","burlywood":"實木色","dodgerblue":"道奇藍","darkgray":"暗灰色","lightcyan":"淡青色","powderblue":"粉藍色","blueviolet":"藍紫色","orchid":"蘭花色","dimgray":"昏灰色","beige":"灰棕色","fuchsia":"海棠紅","lavenderblush":"薰衣草紫紅","hotpink":"暖粉紅色","steelblue":"鐵藍色","tomato":"蕃茄紅","lightpink":"淡粉紅色","limegreen":"檸檬綠","indianred":"印度紅","papayawhip":"番木瓜色","lightslategray":"淡岩灰色","gray":"灰色","mediumorchid":"中蘭紫色","cornsilk":"玉米黃","black":"黑色","seagreen":"海綠色","darkslateblue":"暗岩藍色","khaki":"卡其色","lightblue":"淡藍色","palegreen":"灰綠色","azure":"天藍色","peachpuff":"粉撲桃色","darkolivegreen":"暗橄欖綠","yellowgreen":"黃綠色"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/zh-tw/colors",({aliceblue:"愛麗絲藍",antiquewhite:"米白色",aqua:"水色",aquamarine:"碧綠色",azure:"天藍色",beige:"灰棕色",bisque:"橘黃色",black:"黑色",blanchedalmond:"杏仁白",blue:"藍色",blueviolet:"藍紫色",brown:"褐色",burlywood:"實木色",cadetblue:"軍服藍",chartreuse:"淡黃綠色",chocolate:"巧克力色",coral:"珊瑚紅",cornflowerblue:"矢車菊藍",cornsilk:"玉米黃",crimson:"暗深紅色",cyan:"青色",darkblue:"暗藍色",darkcyan:"暗青色",darkgoldenrod:"暗金菊色",darkgray:"暗灰色",darkgreen:"暗綠色",darkgrey:"暗灰色",darkkhaki:"暗卡其色",darkmagenta:"暗紫紅色",darkolivegreen:"暗橄欖綠",darkorange:"暗橙色",darkorchid:"暗蘭花色",darkred:"暗紅色",darksalmon:"暗鮭紅",darkseagreen:"暗海綠色",darkslateblue:"暗岩藍色",darkslategray:"暗岩灰色",darkslategrey:"暗岩灰色",darkturquoise:"暗松石綠",darkviolet:"暗紫羅蘭色",deeppink:"深粉紅色",deepskyblue:"深天藍色",dimgray:"昏灰色",dimgrey:"昏灰色",dodgerblue:"道奇藍",firebrick:"紅磚色",floralwhite:"花卉白",forestgreen:"森綠色",fuchsia:"海棠紅",gainsboro:"石板灰",ghostwhite:"幽靈色",gold:"金色",goldenrod:"金菊色",gray:"灰色",green:"綠色",greenyellow:"綠黃色",grey:"灰色",honeydew:"密瓜色",hotpink:"暖粉紅色",indianred:"印度紅",indigo:"靛藍色",ivory:"象牙色",khaki:"卡其色",lavender:"薰衣草紫",lavenderblush:"薰衣草紫紅",lawngreen:"草綠色",lemonchiffon:"奶油黃",lightblue:"淡藍色",lightcoral:"淡珊瑚紅",lightcyan:"淡青色",lightgoldenrodyellow:"淡金菊黃",lightgray:"淡灰色",lightgreen:"淡綠色",lightgrey:"淡灰色",lightpink:"淡粉紅色",lightsalmon:"淡鮭紅",lightseagreen:"淡海綠色",lightskyblue:"淡天藍色",lightslategray:"淡岩灰色",lightslategrey:"淡岩灰色",lightsteelblue:"淡鐵藍色",lightyellow:"淡黃色",lime:"檸檬色",limegreen:"檸檬綠",linen:"亞麻色",magenta:"紫紅色",maroon:"栗色",mediumaquamarine:"中碧綠色",mediumblue:"中藍色",mediumorchid:"中蘭紫色",mediumpurple:"中紫色",mediumseagreen:"中海綠色",mediumslateblue:"中岩藍色",mediumspringgreen:"中春綠色",mediumturquoise:"中松石綠",mediumvioletred:"中紫羅蘭紅",midnightblue:"午夜藍",mintcream:"薄荷乳白色",mistyrose:"霧玫瑰色",moccasin:"鹿皮黃色",navajowhite:"印地安黃色",navy:"海軍藍",oldlace:"舊蕾絲色",olive:"橄欖色",olivedrab:"橄欖綠",orange:"橙色",orangered:"橙紅色",orchid:"蘭花色",palegoldenrod:"灰金菊色",palegreen:"灰綠色",paleturquoise:"灰松石綠",palevioletred:"灰紫羅蘭紅",papayawhip:"番木瓜色",peachpuff:"粉撲桃色",peru:"祕魯色",pink:"粉紅色",plum:"李紫色",powderblue:"粉藍色",purple:"紫色",red:"紅色",rosybrown:"玫瑰褐",royalblue:"品藍色",saddlebrown:"鞍褐色",salmon:"鮭紅色",sandybrown:"沙褐色",seagreen:"海綠色",seashell:"海貝色",sienna:"黃土赭色",silver:"銀色",skyblue:"天藍色",slateblue:"岩藍色",slategray:"岩灰色",slategrey:"岩灰色",snow:"雪白色",springgreen:"春綠色",steelblue:"鐵藍色",tan:"皮革色",teal:"深藍綠色",thistle:"薊色",tomato:"蕃茄紅",transparent:"透明",turquoise:"松石綠",violet:"紫羅蘭色",wheat:"小麥色",white:"白色",whitesmoke:"白煙色",yellow:"黃色",yellowgreen:"黃綠色"})); \ No newline at end of file
diff --git a/lib/dojo/nls/zh-tw/colors.js.uncompressed.js b/lib/dojo/nls/zh-tw/colors.js.uncompressed.js
new file mode 100644
index 000000000..5d8ce27b2
--- /dev/null
+++ b/lib/dojo/nls/zh-tw/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/zh-tw/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "愛麗絲藍",
+ antiquewhite: "米白色",
+ aqua: "水色",
+ aquamarine: "碧綠色",
+ azure: "天藍色",
+ beige: "灰棕色",
+ bisque: "橘黃色",
+ black: "黑色",
+ blanchedalmond: "杏仁白",
+ blue: "藍色",
+ blueviolet: "藍紫色",
+ brown: "褐色",
+ burlywood: "實木色",
+ cadetblue: "軍服藍",
+ chartreuse: "淡黃綠色",
+ chocolate: "巧克力色",
+ coral: "珊瑚紅",
+ cornflowerblue: "矢車菊藍",
+ cornsilk: "玉米黃",
+ crimson: "暗深紅色",
+ cyan: "青色",
+ darkblue: "暗藍色",
+ darkcyan: "暗青色",
+ darkgoldenrod: "暗金菊色",
+ darkgray: "暗灰色",
+ darkgreen: "暗綠色",
+ darkgrey: "暗灰色", // same as darkgray
+ darkkhaki: "暗卡其色",
+ darkmagenta: "暗紫紅色",
+ darkolivegreen: "暗橄欖綠",
+ darkorange: "暗橙色",
+ darkorchid: "暗蘭花色",
+ darkred: "暗紅色",
+ darksalmon: "暗鮭紅",
+ darkseagreen: "暗海綠色",
+ darkslateblue: "暗岩藍色",
+ darkslategray: "暗岩灰色",
+ darkslategrey: "暗岩灰色", // same as darkslategray
+ darkturquoise: "暗松石綠",
+ darkviolet: "暗紫羅蘭色",
+ deeppink: "深粉紅色",
+ deepskyblue: "深天藍色",
+ dimgray: "昏灰色",
+ dimgrey: "昏灰色", // same as dimgray
+ dodgerblue: "道奇藍",
+ firebrick: "紅磚色",
+ floralwhite: "花卉白",
+ forestgreen: "森綠色",
+ fuchsia: "海棠紅",
+ gainsboro: "石板灰",
+ ghostwhite: "幽靈色",
+ gold: "金色",
+ goldenrod: "金菊色",
+ gray: "灰色",
+ green: "綠色",
+ greenyellow: "綠黃色",
+ grey: "灰色", // same as gray
+ honeydew: "密瓜色",
+ hotpink: "暖粉紅色",
+ indianred: "印度紅",
+ indigo: "靛藍色",
+ ivory: "象牙色",
+ khaki: "卡其色",
+ lavender: "薰衣草紫",
+ lavenderblush: "薰衣草紫紅",
+ lawngreen: "草綠色",
+ lemonchiffon: "奶油黃",
+ lightblue: "淡藍色",
+ lightcoral: "淡珊瑚紅",
+ lightcyan: "淡青色",
+ lightgoldenrodyellow: "淡金菊黃",
+ lightgray: "淡灰色",
+ lightgreen: "淡綠色",
+ lightgrey: "淡灰色", // same as lightgray
+ lightpink: "淡粉紅色",
+ lightsalmon: "淡鮭紅",
+ lightseagreen: "淡海綠色",
+ lightskyblue: "淡天藍色",
+ lightslategray: "淡岩灰色",
+ lightslategrey: "淡岩灰色", // same as lightslategray
+ lightsteelblue: "淡鐵藍色",
+ lightyellow: "淡黃色",
+ lime: "檸檬色",
+ limegreen: "檸檬綠",
+ linen: "亞麻色",
+ magenta: "紫紅色",
+ maroon: "栗色",
+ mediumaquamarine: "中碧綠色",
+ mediumblue: "中藍色",
+ mediumorchid: "中蘭紫色",
+ mediumpurple: "中紫色",
+ mediumseagreen: "中海綠色",
+ mediumslateblue: "中岩藍色",
+ mediumspringgreen: "中春綠色",
+ mediumturquoise: "中松石綠",
+ mediumvioletred: "中紫羅蘭紅",
+ midnightblue: "午夜藍",
+ mintcream: "薄荷乳白色",
+ mistyrose: "霧玫瑰色",
+ moccasin: "鹿皮黃色",
+ navajowhite: "印地安黃色",
+ navy: "海軍藍",
+ oldlace: "舊蕾絲色",
+ olive: "橄欖色",
+ olivedrab: "橄欖綠",
+ orange: "橙色",
+ orangered: "橙紅色",
+ orchid: "蘭花色",
+ palegoldenrod: "灰金菊色",
+ palegreen: "灰綠色",
+ paleturquoise: "灰松石綠",
+ palevioletred: "灰紫羅蘭紅",
+ papayawhip: "番木瓜色",
+ peachpuff: "粉撲桃色",
+ peru: "祕魯色",
+ pink: "粉紅色",
+ plum: "李紫色",
+ powderblue: "粉藍色",
+ purple: "紫色",
+ red: "紅色",
+ rosybrown: "玫瑰褐",
+ royalblue: "品藍色",
+ saddlebrown: "鞍褐色",
+ salmon: "鮭紅色",
+ sandybrown: "沙褐色",
+ seagreen: "海綠色",
+ seashell: "海貝色",
+ sienna: "黃土赭色",
+ silver: "銀色",
+ skyblue: "天藍色",
+ slateblue: "岩藍色",
+ slategray: "岩灰色",
+ slategrey: "岩灰色", // same as slategray
+ snow: "雪白色",
+ springgreen: "春綠色",
+ steelblue: "鐵藍色",
+ tan: "皮革色",
+ teal: "深藍綠色",
+ thistle: "薊色",
+ tomato: "蕃茄紅",
+ transparent: "透明",
+ turquoise: "松石綠",
+ violet: "紫羅蘭色",
+ wheat: "小麥色",
+ white: "白色",
+ whitesmoke: "白煙色",
+ yellow: "黃色",
+ yellowgreen: "黃綠色"
+})
+);
diff --git a/lib/dojo/nls/zh/colors.js b/lib/dojo/nls/zh/colors.js
index 0ffb2d8f9..b8596ea2f 100644
--- a/lib/dojo/nls/zh/colors.js
+++ b/lib/dojo/nls/zh/colors.js
@@ -1 +1,8 @@
-({"lightsteelblue":"浅钢蓝色","orangered":"桔红色","midnightblue":"蓝黑色","cadetblue":"军队蓝","seashell":"贝壳白","slategrey":"石板灰","coral":"珊瑚红","darkturquoise":"深青绿色","antiquewhite":"古董白","mediumspringgreen":"淡草绿色","salmon":"橙红色","darkgrey":"深灰色","ivory":"象牙色","greenyellow":"绿黄色","mistyrose":"粉红玫瑰","lightsalmon":"浅橙红色","silver":"银白色","dimgrey":"暗灰色","orange":"橙色","white":"白色","navajowhite":"印地安黄","royalblue":"亮蓝色","deeppink":"深粉色","lime":"酸橙色","oldlace":"旧布黄","chartreuse":"浅黄绿色","darkcyan":"深青色","yellow":"黄色","linen":"亚麻布色","olive":"橄榄色","gold":"金黄色","lawngreen":"草绿色","lightyellow":"浅黄色","tan":"茶色","darkviolet":"深紫罗兰","lightslategrey":"浅石板灰","grey":"灰色","darkkhaki":"深褐色","green":"绿色","deepskyblue":"深天蓝色","aqua":"水绿色","sienna":"赭色","mintcream":"薄荷乳白","rosybrown":"玫瑰褐色","mediumslateblue":"淡灰蓝色","magenta":"洋红色","lightseagreen":"浅海绿色","cyan":"青色","olivedrab":"暗橄榄色","darkgoldenrod":"深金黄色","slateblue":"石板蓝","mediumaquamarine":"淡碧绿色","lavender":"淡紫色","mediumseagreen":"淡海绿色","maroon":"褐紫红色","darkslategray":"深石板灰","mediumturquoise":"淡青绿色","ghostwhite":"苍白","darkblue":"深蓝色","mediumvioletred":"淡紫罗兰","brown":"褐色","lightgray":"浅灰色","sandybrown":"浅褐色","pink":"粉红色","firebrick":"砖红色","indigo":"靛蓝色","snow":"雪白","darkorchid":"暗兰花紫","turquoise":"青绿色","chocolate":"巧克力色","springgreen":"浅草绿色","moccasin":"鹿皮黄","navy":"藏青色","lemonchiffon":"柠檬色","teal":"青色","floralwhite":"花白","cornflowerblue":"藏蓝色","paleturquoise":"淡青绿色","purple":"紫色","gainsboro":"亮灰色","plum":"梅红色","red":"红色","blue":"蓝色","forestgreen":"森林绿","darkgreen":"深绿色","honeydew":"蜜色","darkseagreen":"深海绿色","lightcoral":"浅珊瑚红","palevioletred":"浅紫罗兰","mediumpurple":"淡紫色","saddlebrown":"鞍具褐色","darkmagenta":"深洋红色","thistle":"蓟色","whitesmoke":"烟白色","wheat":"淡黄色","violet":"紫罗兰色","lightskyblue":"浅天蓝色","goldenrod":"鲜黄","mediumblue":"淡蓝色","skyblue":"天蓝色","crimson":"绯红色","darksalmon":"深橙红","darkred":"深红色","darkslategrey":"深石板灰","peru":"秘鲁棕","lightgrey":"浅灰色","lightgoldenrodyellow":"浅金黄色","blanchedalmond":"杏仁白","aliceblue":"艾莉斯蓝","bisque":"乳黄色","slategray":"石板灰","palegoldenrod":"浅金黄色","darkorange":"深橙色","aquamarine":"碧绿色","lightgreen":"浅绿色","burlywood":"原木色","dodgerblue":"宝蓝","darkgray":"深灰色","lightcyan":"浅青色","powderblue":"粉蓝色","blueviolet":"蓝紫色","orchid":"兰花紫","dimgray":"暗灰色","beige":"米色","fuchsia":"紫红色","lavenderblush":"淡紫红色","hotpink":"暗粉","steelblue":"钢蓝色","tomato":"番茄色","lightpink":"浅粉色","limegreen":"暗黄绿色","indianred":"印度红","papayawhip":"粉木瓜橙","lightslategray":"浅石板灰","gray":"灰色","mediumorchid":"淡兰花紫","cornsilk":"玉米黄","black":"黑色","seagreen":"海绿色","darkslateblue":"深石板蓝","khaki":"黄褐色","lightblue":"淡蓝色","palegreen":"淡绿色","azure":"浅天蓝","peachpuff":"粉桃红","darkolivegreen":"深橄榄绿色","yellowgreen":"黄绿色"}) \ No newline at end of file
+/*
+ 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
+*/
+
+//>>built
+define("dojo/nls/zh/colors",({aliceblue:"爱丽丝蓝",antiquewhite:"古董白",aqua:"浅绿色",aquamarine:"碧绿色",azure:"天蓝色",beige:"米色",bisque:"桔黄色",black:"黑色",blanchedalmond:"白杏色",blue:"蓝色",blueviolet:"蓝紫色",brown:"棕色",burlywood:"实木色",cadetblue:"灰蓝色",chartreuse:"黄绿色",chocolate:"巧克力色",coral:"珊瑚色",cornflowerblue:"浅蓝色",cornsilk:"米绸色",crimson:"绯红色",cyan:"青蓝色",darkblue:"深蓝",darkcyan:"深青绿",darkgoldenrod:"深金黄",darkgray:"深灰色",darkgreen:"深绿色",darkgrey:"深灰色",darkkhaki:"深卡其色",darkmagenta:"深洋红色",darkolivegreen:"深橄榄绿",darkorange:"深橙色",darkorchid:"深紫色",darkred:"深红色",darksalmon:"深橙红",darkseagreen:"深海藻绿",darkslateblue:"深青蓝",darkslategray:"深青灰",darkslategrey:"深青灰",darkturquoise:"深粉蓝",darkviolet:"深紫色",deeppink:"深粉红色",deepskyblue:"深天蓝色",dimgray:"暗灰色",dimgrey:"暗灰色",dodgerblue:"闪蓝色",firebrick:"砖红",floralwhite:"花白色",forestgreen:"森林绿",fuchsia:"紫红色",gainsboro:"淡灰色",ghostwhite:"苍白",gold:"金黄色",goldenrod:"金麒麟色",gray:"灰色",green:"绿色",greenyellow:"绿黄色",grey:"灰色",honeydew:"蜜汁色",hotpink:"深粉红",indianred:"印度红",indigo:"靛青",ivory:"象牙色",khaki:"卡其色",lavender:"淡紫色",lavenderblush:"淡紫红",lawngreen:"草绿色",lemonchiffon:"柠檬绸色",lightblue:"淡蓝色",lightcoral:"浅珊瑚色",lightcyan:"浅青色",lightgoldenrodyellow:"浅金黄色",lightgray:"浅灰色",lightgreen:"浅绿色",lightgrey:"浅灰色",lightpink:"浅粉红色",lightsalmon:"淡橙色",lightseagreen:"浅海藻绿",lightskyblue:"浅天蓝色",lightslategray:"浅青灰",lightslategrey:"浅青灰",lightsteelblue:"浅钢蓝色",lightyellow:"浅黄色",lime:"淡黄绿色",limegreen:"橙绿色",linen:"亚麻色",magenta:"洋红色",maroon:"栗色",mediumaquamarine:"间绿色",mediumblue:"间蓝色",mediumorchid:"间紫色",mediumpurple:"间紫色",mediumseagreen:"间海蓝色",mediumslateblue:"间暗蓝色",mediumspringgreen:"间春绿色",mediumturquoise:"间绿宝石色",mediumvioletred:"间紫罗兰色",midnightblue:"深蓝色",mintcream:"薄荷色",mistyrose:"浅玫瑰色",moccasin:"鹿皮色",navajowhite:"纳瓦白",navy:"藏青色",oldlace:"老白色",olive:"橄榄绿",olivedrab:"草绿色",orange:"橙色",orangered:"橙红色",orchid:"紫色",palegoldenrod:"淡金黄色",palegreen:"淡绿色",paleturquoise:"苍绿色",palevioletred:"苍紫罗兰色",papayawhip:"木瓜色",peachpuff:"桃色",peru:"秘鲁色",pink:"粉红色",plum:"杨李色",powderblue:"铁蓝",purple:"紫色",red:"红色",rosybrown:"褐玫瑰红",royalblue:"品蓝",saddlebrown:"重褐色",salmon:"橙红",sandybrown:"沙褐色",seagreen:"海绿色",seashell:"海贝色",sienna:"赭色",silver:"银白色",skyblue:"天蓝色",slateblue:"石蓝色",slategray:"灰石色",slategrey:"灰石色",snow:"雪白色",springgreen:"春绿色",steelblue:"钢蓝色",tan:"棕褐色",teal:"水鸭色",thistle:"蓟色",tomato:"西红柿色",transparent:"透明的",turquoise:"绿宝石色",violet:"紫色",wheat:"浅黄色",white:"白色",whitesmoke:"烟白色",yellow:"黄色",yellowgreen:"黄绿色"})); \ No newline at end of file
diff --git a/lib/dojo/nls/zh/colors.js.uncompressed.js b/lib/dojo/nls/zh/colors.js.uncompressed.js
new file mode 100644
index 000000000..4449d4134
--- /dev/null
+++ b/lib/dojo/nls/zh/colors.js.uncompressed.js
@@ -0,0 +1,156 @@
+define(
+"dojo/nls/zh/colors", ({
+// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information
+// is required for each color, such as a palette widget, and not for specifying color programatically.
+ //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey).
+ //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping?
+ aliceblue: "爱丽丝蓝",
+ antiquewhite: "古董白",
+ aqua: "浅绿色",
+ aquamarine: "碧绿色",
+ azure: "天蓝色",
+ beige: "米色",
+ bisque: "桔黄色",
+ black: "黑色",
+ blanchedalmond: "白杏色",
+ blue: "蓝色",
+ blueviolet: "蓝紫色",
+ brown: "棕色",
+ burlywood: "实木色",
+ cadetblue: "灰蓝色",
+ chartreuse: "黄绿色",
+ chocolate: "巧克力色",
+ coral: "珊瑚色",
+ cornflowerblue: "浅蓝色",
+ cornsilk: "米绸色",
+ crimson: "绯红色",
+ cyan: "青蓝色",
+ darkblue: "深蓝",
+ darkcyan: "深青绿",
+ darkgoldenrod: "深金黄",
+ darkgray: "深灰色",
+ darkgreen: "深绿色",
+ darkgrey: "深灰色", // same as darkgray
+ darkkhaki: "深卡其色",
+ darkmagenta: "深洋红色",
+ darkolivegreen: "深橄榄绿",
+ darkorange: "深橙色",
+ darkorchid: "深紫色",
+ darkred: "深红色",
+ darksalmon: "深橙红",
+ darkseagreen: "深海藻绿",
+ darkslateblue: "深青蓝",
+ darkslategray: "深青灰",
+ darkslategrey: "深青灰", // same as darkslategray
+ darkturquoise: "深粉蓝",
+ darkviolet: "深紫色",
+ deeppink: "深粉红色",
+ deepskyblue: "深天蓝色",
+ dimgray: "暗灰色",
+ dimgrey: "暗灰色", // same as dimgray
+ dodgerblue: "闪蓝色",
+ firebrick: "砖红",
+ floralwhite: "花白色",
+ forestgreen: "森林绿",
+ fuchsia: "紫红色",
+ gainsboro: "淡灰色",
+ ghostwhite: "苍白",
+ gold: "金黄色",
+ goldenrod: "金麒麟色",
+ gray: "灰色",
+ green: "绿色",
+ greenyellow: "绿黄色",
+ grey: "灰色", // same as gray
+ honeydew: "蜜汁色",
+ hotpink: "深粉红",
+ indianred: "印度红",
+ indigo: "靛青",
+ ivory: "象牙色",
+ khaki: "卡其色",
+ lavender: "淡紫色",
+ lavenderblush: "淡紫红",
+ lawngreen: "草绿色",
+ lemonchiffon: "柠檬绸色",
+ lightblue: "淡蓝色",
+ lightcoral: "浅珊瑚色",
+ lightcyan: "浅青色",
+ lightgoldenrodyellow: "浅金黄色",
+ lightgray: "浅灰色",
+ lightgreen: "浅绿色",
+ lightgrey: "浅灰色", // same as lightgray
+ lightpink: "浅粉红色",
+ lightsalmon: "淡橙色",
+ lightseagreen: "浅海藻绿",
+ lightskyblue: "浅天蓝色",
+ lightslategray: "浅青灰",
+ lightslategrey: "浅青灰", // same as lightslategray
+ lightsteelblue: "浅钢蓝色",
+ lightyellow: "浅黄色",
+ lime: "淡黄绿色",
+ limegreen: "橙绿色",
+ linen: "亚麻色",
+ magenta: "洋红色",
+ maroon: "栗色",
+ mediumaquamarine: "间绿色",
+ mediumblue: "间蓝色",
+ mediumorchid: "间紫色",
+ mediumpurple: "间紫色",
+ mediumseagreen: "间海蓝色",
+ mediumslateblue: "间暗蓝色",
+ mediumspringgreen: "间春绿色",
+ mediumturquoise: "间绿宝石色",
+ mediumvioletred: "间紫罗兰色",
+ midnightblue: "深蓝色",
+ mintcream: "薄荷色",
+ mistyrose: "浅玫瑰色",
+ moccasin: "鹿皮色",
+ navajowhite: "纳瓦白",
+ navy: "藏青色",
+ oldlace: "老白色",
+ olive: "橄榄绿",
+ olivedrab: "草绿色",
+ orange: "橙色",
+ orangered: "橙红色",
+ orchid: "紫色",
+ palegoldenrod: "淡金黄色",
+ palegreen: "淡绿色",
+ paleturquoise: "苍绿色",
+ palevioletred: "苍紫罗兰色",
+ papayawhip: "木瓜色",
+ peachpuff: "桃色",
+ peru: "秘鲁色",
+ pink: "粉红色",
+ plum: "杨李色",
+ powderblue: "铁蓝",
+ purple: "紫色",
+ red: "红色",
+ rosybrown: "褐玫瑰红",
+ royalblue: "品蓝",
+ saddlebrown: "重褐色",
+ salmon: "橙红",
+ sandybrown: "沙褐色",
+ seagreen: "海绿色",
+ seashell: "海贝色",
+ sienna: "赭色",
+ silver: "银白色",
+ skyblue: "天蓝色",
+ slateblue: "石蓝色",
+ slategray: "灰石色",
+ slategrey: "灰石色", // same as slategray
+ snow: "雪白色",
+ springgreen: "春绿色",
+ steelblue: "钢蓝色",
+ tan: "棕褐色",
+ teal: "水鸭色",
+ thistle: "蓟色",
+ tomato: "西红柿色",
+ transparent: "透明的",
+ turquoise: "绿宝石色",
+ violet: "紫色",
+ wheat: "浅黄色",
+ white: "白色",
+ whitesmoke: "烟白色",
+ yellow: "黄色",
+ yellowgreen: "黄绿色"
+})
+);
diff --git a/lib/dojo/number.js b/lib/dojo/number.js
index 30fcb6142..3473c11fe 100644
--- a/lib/dojo/number.js
+++ b/lib/dojo/number.js
@@ -4,581 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.number"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.number"] = true;
-dojo.provide("dojo.number");
-dojo.require("dojo.i18n");
-dojo.requireLocalization("dojo.cldr", "number", null, "ROOT,ar,ca,cs,da,de,el,en,en-au,en-gb,es,fi,fr,fr-ch,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-hant,zh-hk");
-dojo.require("dojo.string");
-dojo.require("dojo.regexp");
-
-dojo.getObject("number", true, dojo);
-
-/*=====
-dojo.number = {
- // summary: localized formatting and parsing routines for Number
-}
-
-dojo.number.__FormatOptions = function(){
- // pattern: String?
- // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
- // with this string. Default value is based on locale. Overriding this property will defeat
- // localization. Literal characters in patterns are not supported.
- // type: String?
- // choose a format type based on the locale from the following:
- // decimal, scientific (not yet supported), percent, currency. decimal by default.
- // places: Number?
- // fixed number of decimal places to show. This overrides any
- // information in the provided pattern.
- // round: Number?
- // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
- // means do not round.
- // locale: String?
- // override the locale used to determine formatting rules
- // fractional: Boolean?
- // If false, show no decimal places, overriding places and pattern settings.
- this.pattern = pattern;
- this.type = type;
- this.places = places;
- this.round = round;
- this.locale = locale;
- this.fractional = fractional;
-}
-=====*/
-
-dojo.number.format = function(/*Number*/value, /*dojo.number.__FormatOptions?*/options){
- // summary:
- // Format a Number as a String, using locale-specific settings
- // description:
- // Create a string from a Number using a known localized pattern.
- // Formatting patterns appropriate to the locale are chosen from the
- // [Common Locale Data Repository](http://unicode.org/cldr) as well as the appropriate symbols and
- // delimiters.
- // If value is Infinity, -Infinity, or is not a valid JavaScript number, return null.
- // value:
- // the number to be formatted
-
- options = dojo.mixin({}, options || {});
- var locale = dojo.i18n.normalizeLocale(options.locale),
- bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale);
- options.customs = bundle;
- var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"];
- if(isNaN(value) || Math.abs(value) == Infinity){ return null; } // null
- return dojo.number._applyPattern(value, pattern, options); // String
-};
-
-//dojo.number._numberPatternRE = /(?:[#0]*,?)*[#0](?:\.0*#*)?/; // not precise, but good enough
-dojo.number._numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/; // not precise, but good enough
-
-dojo.number._applyPattern = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatOptions?*/options){
- // summary:
- // Apply pattern to format value as a string using options. Gives no
- // consideration to local customs.
- // value:
- // the number to be formatted.
- // pattern:
- // a pattern string as described by
- // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
- // options: dojo.number.__FormatOptions?
- // _applyPattern is usually called via `dojo.number.format()` which
- // populates an extra property in the options parameter, "customs".
- // The customs object specifies group and decimal parameters if set.
-
- //TODO: support escapes
- options = options || {};
- var group = options.customs.group,
- decimal = options.customs.decimal,
- patternList = pattern.split(';'),
- positivePattern = patternList[0];
- pattern = patternList[(value < 0) ? 1 : 0] || ("-" + positivePattern);
-
- //TODO: only test against unescaped
- if(pattern.indexOf('%') != -1){
- value *= 100;
- }else if(pattern.indexOf('\u2030') != -1){
- value *= 1000; // per mille
- }else if(pattern.indexOf('\u00a4') != -1){
- group = options.customs.currencyGroup || group;//mixins instead?
- decimal = options.customs.currencyDecimal || decimal;// Should these be mixins instead?
- pattern = pattern.replace(/\u00a4{1,3}/, function(match){
- var prop = ["symbol", "currency", "displayName"][match.length-1];
- return options[prop] || options.currency || "";
- });
- }else if(pattern.indexOf('E') != -1){
- throw new Error("exponential notation not supported");
- }
-
- //TODO: support @ sig figs?
- var numberPatternRE = dojo.number._numberPatternRE;
- var numberPattern = positivePattern.match(numberPatternRE);
- if(!numberPattern){
- throw new Error("unable to find a number expression in pattern: "+pattern);
- }
- if(options.fractional === false){ options.places = 0; }
- return pattern.replace(numberPatternRE,
- dojo.number._formatAbsolute(value, numberPattern[0], {decimal: decimal, group: group, places: options.places, round: options.round}));
-};
-
-dojo.number.round = function(/*Number*/value, /*Number?*/places, /*Number?*/increment){
- // summary:
- // Rounds to the nearest value with the given number of decimal places, away from zero
- // description:
- // Rounds to the nearest value with the given number of decimal places, away from zero if equal.
- // Similar to Number.toFixed(), but compensates for browser quirks. Rounding can be done by
- // fractional increments also, such as the nearest quarter.
- // NOTE: Subject to floating point errors. See dojox.math.round for experimental workaround.
- // value:
- // The number to round
- // places:
- // The number of decimal places where rounding takes place. Defaults to 0 for whole rounding.
- // Must be non-negative.
- // increment:
- // Rounds next place to nearest value of increment/10. 10 by default.
- // example:
- // >>> dojo.number.round(-0.5)
- // -1
- // >>> dojo.number.round(162.295, 2)
- // 162.29 // note floating point error. Should be 162.3
- // >>> dojo.number.round(10.71, 0, 2.5)
- // 10.75
- var factor = 10 / (increment || 10);
- return (factor * +value).toFixed(places) / factor; // Number
-};
-
-if((0.9).toFixed() == 0){
- // (isIE) toFixed() bug workaround: Rounding fails on IE when most significant digit
- // is just after the rounding place and is >=5
- (function(){
- var round = dojo.number.round;
- dojo.number.round = function(v, p, m){
- var d = Math.pow(10, -p || 0), a = Math.abs(v);
- if(!v || a >= d || a * Math.pow(10, p + 1) < 5){
- d = 0;
- }
- return round(v, p, m) + (v > 0 ? d : -d);
- };
- })();
-}
-
-/*=====
-dojo.number.__FormatAbsoluteOptions = function(){
- // decimal: String?
- // the decimal separator
- // group: String?
- // the group separator
- // places: Number?|String?
- // number of decimal places. the range "n,m" will format to m places.
- // round: Number?
- // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
- // means don't round.
- this.decimal = decimal;
- this.group = group;
- this.places = places;
- this.round = round;
-}
-=====*/
-
-dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatAbsoluteOptions?*/options){
- // summary:
- // Apply numeric pattern to absolute value using options. Gives no
- // consideration to local customs.
- // value:
- // the number to be formatted, ignores sign
- // pattern:
- // the number portion of a pattern (e.g. `#,##0.00`)
- options = options || {};
- if(options.places === true){options.places=0;}
- if(options.places === Infinity){options.places=6;} // avoid a loop; pick a limit
-
- var patternParts = pattern.split("."),
- comma = typeof options.places == "string" && options.places.indexOf(","),
- maxPlaces = options.places;
- if(comma){
- maxPlaces = options.places.substring(comma + 1);
- }else if(!(maxPlaces >= 0)){
- maxPlaces = (patternParts[1] || []).length;
- }
- if(!(options.round < 0)){
- value = dojo.number.round(value, maxPlaces, options.round);
- }
-
- var valueParts = String(Math.abs(value)).split("."),
- fractional = valueParts[1] || "";
- if(patternParts[1] || options.places){
- if(comma){
- options.places = options.places.substring(0, comma);
- }
- // Pad fractional with trailing zeros
- var pad = options.places !== undefined ? options.places : (patternParts[1] && patternParts[1].lastIndexOf("0") + 1);
- if(pad > fractional.length){
- valueParts[1] = dojo.string.pad(fractional, pad, '0', true);
- }
-
- // Truncate fractional
- if(maxPlaces < fractional.length){
- valueParts[1] = fractional.substr(0, maxPlaces);
- }
- }else{
- if(valueParts[1]){ valueParts.pop(); }
- }
-
- // Pad whole with leading zeros
- var patternDigits = patternParts[0].replace(',', '');
- pad = patternDigits.indexOf("0");
- if(pad != -1){
- pad = patternDigits.length - pad;
- if(pad > valueParts[0].length){
- valueParts[0] = dojo.string.pad(valueParts[0], pad);
- }
-
- // Truncate whole
- if(patternDigits.indexOf("#") == -1){
- valueParts[0] = valueParts[0].substr(valueParts[0].length - pad);
- }
- }
-
- // Add group separators
- var index = patternParts[0].lastIndexOf(','),
- groupSize, groupSize2;
- if(index != -1){
- groupSize = patternParts[0].length - index - 1;
- var remainder = patternParts[0].substr(0, index);
- index = remainder.lastIndexOf(',');
- if(index != -1){
- groupSize2 = remainder.length - index - 1;
- }
- }
- var pieces = [];
- for(var whole = valueParts[0]; whole;){
- var off = whole.length - groupSize;
- pieces.push((off > 0) ? whole.substr(off) : whole);
- whole = (off > 0) ? whole.slice(0, off) : "";
- if(groupSize2){
- groupSize = groupSize2;
- delete groupSize2;
- }
- }
- valueParts[0] = pieces.reverse().join(options.group || ",");
-
- return valueParts.join(options.decimal || ".");
-};
-
-/*=====
-dojo.number.__RegexpOptions = function(){
- // pattern: String?
- // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
- // with this string. Default value is based on locale. Overriding this property will defeat
- // localization.
- // type: String?
- // choose a format type based on the locale from the following:
- // decimal, scientific (not yet supported), percent, currency. decimal by default.
- // locale: String?
- // override the locale used to determine formatting rules
- // strict: Boolean?
- // strict parsing, false by default. Strict parsing requires input as produced by the format() method.
- // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators
- // places: Number|String?
- // number of decimal places to accept: Infinity, a positive number, or
- // a range "n,m". Defined by pattern or Infinity if pattern not provided.
- this.pattern = pattern;
- this.type = type;
- this.locale = locale;
- this.strict = strict;
- this.places = places;
-}
-=====*/
-dojo.number.regexp = function(/*dojo.number.__RegexpOptions?*/options){
- // summary:
- // Builds the regular needed to parse a number
- // description:
- // Returns regular expression with positive and negative match, group
- // and decimal separators
- return dojo.number._parseInfo(options).regexp; // String
-};
-
-dojo.number._parseInfo = function(/*Object?*/options){
- options = options || {};
- var locale = dojo.i18n.normalizeLocale(options.locale),
- bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale),
- pattern = options.pattern || bundle[(options.type || "decimal") + "Format"],
-//TODO: memoize?
- group = bundle.group,
- decimal = bundle.decimal,
- factor = 1;
-
- if(pattern.indexOf('%') != -1){
- factor /= 100;
- }else if(pattern.indexOf('\u2030') != -1){
- factor /= 1000; // per mille
- }else{
- var isCurrency = pattern.indexOf('\u00a4') != -1;
- if(isCurrency){
- group = bundle.currencyGroup || group;
- decimal = bundle.currencyDecimal || decimal;
- }
- }
-
- //TODO: handle quoted escapes
- var patternList = pattern.split(';');
- if(patternList.length == 1){
- patternList.push("-" + patternList[0]);
- }
-
- var re = dojo.regexp.buildGroupRE(patternList, function(pattern){
- pattern = "(?:"+dojo.regexp.escapeString(pattern, '.')+")";
- return pattern.replace(dojo.number._numberPatternRE, function(format){
- var flags = {
- signed: false,
- separator: options.strict ? group : [group,""],
- fractional: options.fractional,
- decimal: decimal,
- exponent: false
- },
-
- parts = format.split('.'),
- places = options.places;
-
- // special condition for percent (factor != 1)
- // allow decimal places even if not specified in pattern
- if(parts.length == 1 && factor != 1){
- parts[1] = "###";
- }
- if(parts.length == 1 || places === 0){
- flags.fractional = false;
- }else{
- if(places === undefined){ places = options.pattern ? parts[1].lastIndexOf('0') + 1 : Infinity; }
- if(places && options.fractional == undefined){flags.fractional = true;} // required fractional, unless otherwise specified
- if(!options.places && (places < parts[1].length)){ places += "," + parts[1].length; }
- flags.places = places;
- }
- var groups = parts[0].split(',');
- if(groups.length > 1){
- flags.groupSize = groups.pop().length;
- if(groups.length > 1){
- flags.groupSize2 = groups.pop().length;
- }
- }
- return "("+dojo.number._realNumberRegexp(flags)+")";
- });
- }, true);
-
- if(isCurrency){
- // substitute the currency symbol for the placeholder in the pattern
- re = re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g, function(match, before, target, after){
- var prop = ["symbol", "currency", "displayName"][target.length-1],
- symbol = dojo.regexp.escapeString(options[prop] || options.currency || "");
- before = before ? "[\\s\\xa0]" : "";
- after = after ? "[\\s\\xa0]" : "";
- if(!options.strict){
- if(before){before += "*";}
- if(after){after += "*";}
- return "(?:"+before+symbol+after+")?";
- }
- return before+symbol+after;
- });
- }
-
-//TODO: substitute localized sign/percent/permille/etc.?
-
- // normalize whitespace and return
- return {regexp: re.replace(/[\xa0 ]/g, "[\\s\\xa0]"), group: group, decimal: decimal, factor: factor}; // Object
-};
-
-/*=====
-dojo.number.__ParseOptions = function(){
- // pattern: String?
- // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
- // with this string. Default value is based on locale. Overriding this property will defeat
- // localization. Literal characters in patterns are not supported.
- // type: String?
- // choose a format type based on the locale from the following:
- // decimal, scientific (not yet supported), percent, currency. decimal by default.
- // locale: String?
- // override the locale used to determine formatting rules
- // strict: Boolean?
- // strict parsing, false by default. Strict parsing requires input as produced by the format() method.
- // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators
- // fractional: Boolean?|Array?
- // Whether to include the fractional portion, where the number of decimal places are implied by pattern
- // or explicit 'places' parameter. The value [true,false] makes the fractional portion optional.
- this.pattern = pattern;
- this.type = type;
- this.locale = locale;
- this.strict = strict;
- this.fractional = fractional;
-}
-=====*/
-dojo.number.parse = function(/*String*/expression, /*dojo.number.__ParseOptions?*/options){
- // summary:
- // Convert a properly formatted string to a primitive Number, using
- // locale-specific settings.
- // description:
- // Create a Number from a string using a known localized pattern.
- // Formatting patterns are chosen appropriate to the locale
- // and follow the syntax described by
- // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
- // Note that literal characters in patterns are not supported.
- // expression:
- // A string representation of a Number
- var info = dojo.number._parseInfo(options),
- results = (new RegExp("^"+info.regexp+"$")).exec(expression);
- if(!results){
- return NaN; //NaN
- }
- var absoluteMatch = results[1]; // match for the positive expression
- if(!results[1]){
- if(!results[2]){
- return NaN; //NaN
- }
- // matched the negative pattern
- absoluteMatch =results[2];
- info.factor *= -1;
- }
-
- // Transform it to something Javascript can parse as a number. Normalize
- // decimal point and strip out group separators or alternate forms of whitespace
- absoluteMatch = absoluteMatch.
- replace(new RegExp("["+info.group + "\\s\\xa0"+"]", "g"), "").
- replace(info.decimal, ".");
- // Adjust for negative sign, percent, etc. as necessary
- return absoluteMatch * info.factor; //Number
-};
-
-/*=====
-dojo.number.__RealNumberRegexpFlags = function(){
- // places: Number?
- // The integer number of decimal places or a range given as "n,m". If
- // not given, the decimal part is optional and the number of places is
- // unlimited.
- // decimal: String?
- // A string for the character used as the decimal point. Default
- // is ".".
- // fractional: Boolean?|Array?
- // Whether decimal places are used. Can be true, false, or [true,
- // false]. Default is [true, false] which means optional.
- // exponent: Boolean?|Array?
- // Express in exponential notation. Can be true, false, or [true,
- // false]. Default is [true, false], (i.e. will match if the
- // exponential part is present are not).
- // eSigned: Boolean?|Array?
- // The leading plus-or-minus sign on the exponent. Can be true,
- // false, or [true, false]. Default is [true, false], (i.e. will
- // match if it is signed or unsigned). flags in regexp.integer can be
- // applied.
- this.places = places;
- this.decimal = decimal;
- this.fractional = fractional;
- this.exponent = exponent;
- this.eSigned = eSigned;
-}
-=====*/
-
-dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*/flags){
- // summary:
- // Builds a regular expression to match a real number in exponential
- // notation
-
- // assign default values to missing parameters
- flags = flags || {};
- //TODO: use mixin instead?
- if(!("places" in flags)){ flags.places = Infinity; }
- if(typeof flags.decimal != "string"){ flags.decimal = "."; }
- if(!("fractional" in flags) || /^0/.test(flags.places)){ flags.fractional = [true, false]; }
- if(!("exponent" in flags)){ flags.exponent = [true, false]; }
- if(!("eSigned" in flags)){ flags.eSigned = [true, false]; }
-
- var integerRE = dojo.number._integerRegexp(flags),
- decimalRE = dojo.regexp.buildGroupRE(flags.fractional,
- function(q){
- var re = "";
- if(q && (flags.places!==0)){
- re = "\\" + flags.decimal;
- if(flags.places == Infinity){
- re = "(?:" + re + "\\d+)?";
- }else{
- re += "\\d{" + flags.places + "}";
- }
- }
- return re;
- },
- true
- );
-
- var exponentRE = dojo.regexp.buildGroupRE(flags.exponent,
- function(q){
- if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; }
- return "";
- }
- );
-
- var realRE = integerRE + decimalRE;
- // allow for decimals without integers, e.g. .25
- if(decimalRE){realRE = "(?:(?:"+ realRE + ")|(?:" + decimalRE + "))";}
- return realRE + exponentRE; // String
-};
-
-/*=====
-dojo.number.__IntegerRegexpFlags = function(){
- // signed: Boolean?
- // The leading plus-or-minus sign. Can be true, false, or `[true,false]`.
- // Default is `[true, false]`, (i.e. will match if it is signed
- // or unsigned).
- // separator: String?
- // The character used as the thousands separator. Default is no
- // separator. For more than one symbol use an array, e.g. `[",", ""]`,
- // makes ',' optional.
- // groupSize: Number?
- // group size between separators
- // groupSize2: Number?
- // second grouping, where separators 2..n have a different interval than the first separator (for India)
- this.signed = signed;
- this.separator = separator;
- this.groupSize = groupSize;
- this.groupSize2 = groupSize2;
-}
-=====*/
-
-dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags){
- // summary:
- // Builds a regular expression that matches an integer
-
- // assign default values to missing parameters
- flags = flags || {};
- if(!("signed" in flags)){ flags.signed = [true, false]; }
- if(!("separator" in flags)){
- flags.separator = "";
- }else if(!("groupSize" in flags)){
- flags.groupSize = 3;
- }
-
- var signRE = dojo.regexp.buildGroupRE(flags.signed,
- function(q){ return q ? "[-+]" : ""; },
- true
- );
-
- var numberRE = dojo.regexp.buildGroupRE(flags.separator,
- function(sep){
- if(!sep){
- return "(?:\\d+)";
- }
-
- sep = dojo.regexp.escapeString(sep);
- if(sep == " "){ sep = "\\s"; }
- else if(sep == "\xa0"){ sep = "\\s\\xa0"; }
-
- var grp = flags.groupSize, grp2 = flags.groupSize2;
- //TODO: should we continue to enforce that numbers with separators begin with 1-9? See #6933
- if(grp2){
- var grp2RE = "(?:0|[1-9]\\d{0," + (grp2-1) + "}(?:[" + sep + "]\\d{" + grp2 + "})*[" + sep + "]\\d{" + grp + "})";
- return ((grp-grp2) > 0) ? "(?:" + grp2RE + "|(?:0|[1-9]\\d{0," + (grp-1) + "}))" : grp2RE;
- }
- return "(?:0|[1-9]\\d{0," + (grp-1) + "}(?:[" + sep + "]\\d{" + grp + "})*)";
- },
- true
- );
-
- return signRE + numberRE; // String
-};
-
-}
+//>>built
+define("dojo/number",["./_base/kernel","./_base/lang","./i18n","./i18n!./cldr/nls/number","./string","./regexp"],function(_1,_2,_3,_4,_5,_6){_2.getObject("number",true,_1);_1.number.format=function(_7,_8){_8=_2.mixin({},_8||{});var _9=_3.normalizeLocale(_8.locale),_a=_3.getLocalization("dojo.cldr","number",_9);_8.customs=_a;var _b=_8.pattern||_a[(_8.type||"decimal")+"Format"];if(isNaN(_7)||Math.abs(_7)==Infinity){return null;}return _1.number._applyPattern(_7,_b,_8);};_1.number._numberPatternRE=/[#0,]*[#0](?:\.0*#*)?/;_1.number._applyPattern=function(_c,_d,_e){_e=_e||{};var _f=_e.customs.group,_10=_e.customs.decimal,_11=_d.split(";"),_12=_11[0];_d=_11[(_c<0)?1:0]||("-"+_12);if(_d.indexOf("%")!=-1){_c*=100;}else{if(_d.indexOf("‰")!=-1){_c*=1000;}else{if(_d.indexOf("¤")!=-1){_f=_e.customs.currencyGroup||_f;_10=_e.customs.currencyDecimal||_10;_d=_d.replace(/\u00a4{1,3}/,function(_13){var _14=["symbol","currency","displayName"][_13.length-1];return _e[_14]||_e.currency||"";});}else{if(_d.indexOf("E")!=-1){throw new Error("exponential notation not supported");}}}}var _15=_1.number._numberPatternRE;var _16=_12.match(_15);if(!_16){throw new Error("unable to find a number expression in pattern: "+_d);}if(_e.fractional===false){_e.places=0;}return _d.replace(_15,_1.number._formatAbsolute(_c,_16[0],{decimal:_10,group:_f,places:_e.places,round:_e.round}));};_1.number.round=function(_17,_18,_19){var _1a=10/(_19||10);return (_1a*+_17).toFixed(_18)/_1a;};if((0.9).toFixed()==0){var _1b=_1.number.round;_1.number.round=function(v,p,m){var d=Math.pow(10,-p||0),a=Math.abs(v);if(!v||a>=d||a*Math.pow(10,p+1)<5){d=0;}return _1b(v,p,m)+(v>0?d:-d);};}_1.number._formatAbsolute=function(_1c,_1d,_1e){_1e=_1e||{};if(_1e.places===true){_1e.places=0;}if(_1e.places===Infinity){_1e.places=6;}var _1f=_1d.split("."),_20=typeof _1e.places=="string"&&_1e.places.indexOf(","),_21=_1e.places;if(_20){_21=_1e.places.substring(_20+1);}else{if(!(_21>=0)){_21=(_1f[1]||[]).length;}}if(!(_1e.round<0)){_1c=_1.number.round(_1c,_21,_1e.round);}var _22=String(Math.abs(_1c)).split("."),_23=_22[1]||"";if(_1f[1]||_1e.places){if(_20){_1e.places=_1e.places.substring(0,_20);}var pad=_1e.places!==undefined?_1e.places:(_1f[1]&&_1f[1].lastIndexOf("0")+1);if(pad>_23.length){_22[1]=_5.pad(_23,pad,"0",true);}if(_21<_23.length){_22[1]=_23.substr(0,_21);}}else{if(_22[1]){_22.pop();}}var _24=_1f[0].replace(",","");pad=_24.indexOf("0");if(pad!=-1){pad=_24.length-pad;if(pad>_22[0].length){_22[0]=_5.pad(_22[0],pad);}if(_24.indexOf("#")==-1){_22[0]=_22[0].substr(_22[0].length-pad);}}var _25=_1f[0].lastIndexOf(","),_26,_27;if(_25!=-1){_26=_1f[0].length-_25-1;var _28=_1f[0].substr(0,_25);_25=_28.lastIndexOf(",");if(_25!=-1){_27=_28.length-_25-1;}}var _29=[];for(var _2a=_22[0];_2a;){var off=_2a.length-_26;_29.push((off>0)?_2a.substr(off):_2a);_2a=(off>0)?_2a.slice(0,off):"";if(_27){_26=_27;delete _27;}}_22[0]=_29.reverse().join(_1e.group||",");return _22.join(_1e.decimal||".");};_1.number.regexp=function(_2b){return _1.number._parseInfo(_2b).regexp;};_1.number._parseInfo=function(_2c){_2c=_2c||{};var _2d=_3.normalizeLocale(_2c.locale),_2e=_3.getLocalization("dojo.cldr","number",_2d),_2f=_2c.pattern||_2e[(_2c.type||"decimal")+"Format"],_30=_2e.group,_31=_2e.decimal,_32=1;if(_2f.indexOf("%")!=-1){_32/=100;}else{if(_2f.indexOf("‰")!=-1){_32/=1000;}else{var _33=_2f.indexOf("¤")!=-1;if(_33){_30=_2e.currencyGroup||_30;_31=_2e.currencyDecimal||_31;}}}var _34=_2f.split(";");if(_34.length==1){_34.push("-"+_34[0]);}var re=_6.buildGroupRE(_34,function(_35){_35="(?:"+_6.escapeString(_35,".")+")";return _35.replace(_1.number._numberPatternRE,function(_36){var _37={signed:false,separator:_2c.strict?_30:[_30,""],fractional:_2c.fractional,decimal:_31,exponent:false},_38=_36.split("."),_39=_2c.places;if(_38.length==1&&_32!=1){_38[1]="###";}if(_38.length==1||_39===0){_37.fractional=false;}else{if(_39===undefined){_39=_2c.pattern?_38[1].lastIndexOf("0")+1:Infinity;}if(_39&&_2c.fractional==undefined){_37.fractional=true;}if(!_2c.places&&(_39<_38[1].length)){_39+=","+_38[1].length;}_37.places=_39;}var _3a=_38[0].split(",");if(_3a.length>1){_37.groupSize=_3a.pop().length;if(_3a.length>1){_37.groupSize2=_3a.pop().length;}}return "("+_1.number._realNumberRegexp(_37)+")";});},true);if(_33){re=re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g,function(_3b,_3c,_3d,_3e){var _3f=["symbol","currency","displayName"][_3d.length-1],_40=_6.escapeString(_2c[_3f]||_2c.currency||"");_3c=_3c?"[\\s\\xa0]":"";_3e=_3e?"[\\s\\xa0]":"";if(!_2c.strict){if(_3c){_3c+="*";}if(_3e){_3e+="*";}return "(?:"+_3c+_40+_3e+")?";}return _3c+_40+_3e;});}return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_30,decimal:_31,factor:_32};};_1.number.parse=function(_41,_42){var _43=_1.number._parseInfo(_42),_44=(new RegExp("^"+_43.regexp+"$")).exec(_41);if(!_44){return NaN;}var _45=_44[1];if(!_44[1]){if(!_44[2]){return NaN;}_45=_44[2];_43.factor*=-1;}_45=_45.replace(new RegExp("["+_43.group+"\\s\\xa0"+"]","g"),"").replace(_43.decimal,".");return _45*_43.factor;};_1.number._realNumberRegexp=function(_46){_46=_46||{};if(!("places" in _46)){_46.places=Infinity;}if(typeof _46.decimal!="string"){_46.decimal=".";}if(!("fractional" in _46)||/^0/.test(_46.places)){_46.fractional=[true,false];}if(!("exponent" in _46)){_46.exponent=[true,false];}if(!("eSigned" in _46)){_46.eSigned=[true,false];}var _47=_1.number._integerRegexp(_46),_48=_6.buildGroupRE(_46.fractional,function(q){var re="";if(q&&(_46.places!==0)){re="\\"+_46.decimal;if(_46.places==Infinity){re="(?:"+re+"\\d+)?";}else{re+="\\d{"+_46.places+"}";}}return re;},true);var _49=_6.buildGroupRE(_46.exponent,function(q){if(q){return "([eE]"+_1.number._integerRegexp({signed:_46.eSigned})+")";}return "";});var _4a=_47+_48;if(_48){_4a="(?:(?:"+_4a+")|(?:"+_48+"))";}return _4a+_49;};_1.number._integerRegexp=function(_4b){_4b=_4b||{};if(!("signed" in _4b)){_4b.signed=[true,false];}if(!("separator" in _4b)){_4b.separator="";}else{if(!("groupSize" in _4b)){_4b.groupSize=3;}}var _4c=_6.buildGroupRE(_4b.signed,function(q){return q?"[-+]":"";},true);var _4d=_6.buildGroupRE(_4b.separator,function(sep){if(!sep){return "(?:\\d+)";}sep=_6.escapeString(sep);if(sep==" "){sep="\\s";}else{if(sep==" "){sep="\\s\\xa0";}}var grp=_4b.groupSize,_4e=_4b.groupSize2;if(_4e){var _4f="(?:0|[1-9]\\d{0,"+(_4e-1)+"}(?:["+sep+"]\\d{"+_4e+"})*["+sep+"]\\d{"+grp+"})";return ((grp-_4e)>0)?"(?:"+_4f+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_4f;}return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";},true);return _4c+_4d;};return _1.number;}); \ No newline at end of file
diff --git a/lib/dojo/number.js.uncompressed.js b/lib/dojo/number.js.uncompressed.js
new file mode 100644
index 000000000..c3635df38
--- /dev/null
+++ b/lib/dojo/number.js.uncompressed.js
@@ -0,0 +1,576 @@
+define("dojo/number", ["./_base/kernel", "./_base/lang", "./i18n", "./i18n!./cldr/nls/number", "./string", "./regexp"],
+ function(dojo, lang, i18n, nlsNumber, dstring, dregexp) {
+
+ // module:
+ // dojo/number
+ // summary:
+ // TODOC
+
+lang.getObject("number", true, dojo);
+
+/*=====
+dojo.number = {
+ // summary: localized formatting and parsing routines for Number
+}
+
+dojo.number.__FormatOptions = function(){
+ // pattern: String?
+ // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+ // with this string. Default value is based on locale. Overriding this property will defeat
+ // localization. Literal characters in patterns are not supported.
+ // type: String?
+ // choose a format type based on the locale from the following:
+ // decimal, scientific (not yet supported), percent, currency. decimal by default.
+ // places: Number?
+ // fixed number of decimal places to show. This overrides any
+ // information in the provided pattern.
+ // round: Number?
+ // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
+ // means do not round.
+ // locale: String?
+ // override the locale used to determine formatting rules
+ // fractional: Boolean?
+ // If false, show no decimal places, overriding places and pattern settings.
+ this.pattern = pattern;
+ this.type = type;
+ this.places = places;
+ this.round = round;
+ this.locale = locale;
+ this.fractional = fractional;
+}
+=====*/
+
+dojo.number.format = function(/*Number*/value, /*dojo.number.__FormatOptions?*/options){
+ // summary:
+ // Format a Number as a String, using locale-specific settings
+ // description:
+ // Create a string from a Number using a known localized pattern.
+ // Formatting patterns appropriate to the locale are chosen from the
+ // [Common Locale Data Repository](http://unicode.org/cldr) as well as the appropriate symbols and
+ // delimiters.
+ // If value is Infinity, -Infinity, or is not a valid JavaScript number, return null.
+ // value:
+ // the number to be formatted
+
+ options = lang.mixin({}, options || {});
+ var locale = i18n.normalizeLocale(options.locale),
+ bundle = i18n.getLocalization("dojo.cldr", "number", locale);
+ options.customs = bundle;
+ var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"];
+ if(isNaN(value) || Math.abs(value) == Infinity){ return null; } // null
+ return dojo.number._applyPattern(value, pattern, options); // String
+};
+
+//dojo.number._numberPatternRE = /(?:[#0]*,?)*[#0](?:\.0*#*)?/; // not precise, but good enough
+dojo.number._numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/; // not precise, but good enough
+
+dojo.number._applyPattern = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatOptions?*/options){
+ // summary:
+ // Apply pattern to format value as a string using options. Gives no
+ // consideration to local customs.
+ // value:
+ // the number to be formatted.
+ // pattern:
+ // a pattern string as described by
+ // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+ // options: dojo.number.__FormatOptions?
+ // _applyPattern is usually called via `dojo.number.format()` which
+ // populates an extra property in the options parameter, "customs".
+ // The customs object specifies group and decimal parameters if set.
+
+ //TODO: support escapes
+ options = options || {};
+ var group = options.customs.group,
+ decimal = options.customs.decimal,
+ patternList = pattern.split(';'),
+ positivePattern = patternList[0];
+ pattern = patternList[(value < 0) ? 1 : 0] || ("-" + positivePattern);
+
+ //TODO: only test against unescaped
+ if(pattern.indexOf('%') != -1){
+ value *= 100;
+ }else if(pattern.indexOf('\u2030') != -1){
+ value *= 1000; // per mille
+ }else if(pattern.indexOf('\u00a4') != -1){
+ group = options.customs.currencyGroup || group;//mixins instead?
+ decimal = options.customs.currencyDecimal || decimal;// Should these be mixins instead?
+ pattern = pattern.replace(/\u00a4{1,3}/, function(match){
+ var prop = ["symbol", "currency", "displayName"][match.length-1];
+ return options[prop] || options.currency || "";
+ });
+ }else if(pattern.indexOf('E') != -1){
+ throw new Error("exponential notation not supported");
+ }
+
+ //TODO: support @ sig figs?
+ var numberPatternRE = dojo.number._numberPatternRE;
+ var numberPattern = positivePattern.match(numberPatternRE);
+ if(!numberPattern){
+ throw new Error("unable to find a number expression in pattern: "+pattern);
+ }
+ if(options.fractional === false){ options.places = 0; }
+ return pattern.replace(numberPatternRE,
+ dojo.number._formatAbsolute(value, numberPattern[0], {decimal: decimal, group: group, places: options.places, round: options.round}));
+};
+
+dojo.number.round = function(/*Number*/value, /*Number?*/places, /*Number?*/increment){
+ // summary:
+ // Rounds to the nearest value with the given number of decimal places, away from zero
+ // description:
+ // Rounds to the nearest value with the given number of decimal places, away from zero if equal.
+ // Similar to Number.toFixed(), but compensates for browser quirks. Rounding can be done by
+ // fractional increments also, such as the nearest quarter.
+ // NOTE: Subject to floating point errors. See dojox.math.round for experimental workaround.
+ // value:
+ // The number to round
+ // places:
+ // The number of decimal places where rounding takes place. Defaults to 0 for whole rounding.
+ // Must be non-negative.
+ // increment:
+ // Rounds next place to nearest value of increment/10. 10 by default.
+ // example:
+ // >>> dojo.number.round(-0.5)
+ // -1
+ // >>> dojo.number.round(162.295, 2)
+ // 162.29 // note floating point error. Should be 162.3
+ // >>> dojo.number.round(10.71, 0, 2.5)
+ // 10.75
+ var factor = 10 / (increment || 10);
+ return (factor * +value).toFixed(places) / factor; // Number
+};
+
+if((0.9).toFixed() == 0){
+ // (isIE) toFixed() bug workaround: Rounding fails on IE when most significant digit
+ // is just after the rounding place and is >=5
+ var round = dojo.number.round;
+ dojo.number.round = function(v, p, m){
+ var d = Math.pow(10, -p || 0), a = Math.abs(v);
+ if(!v || a >= d || a * Math.pow(10, p + 1) < 5){
+ d = 0;
+ }
+ return round(v, p, m) + (v > 0 ? d : -d);
+ };
+}
+
+/*=====
+dojo.number.__FormatAbsoluteOptions = function(){
+ // decimal: String?
+ // the decimal separator
+ // group: String?
+ // the group separator
+ // places: Number?|String?
+ // number of decimal places. the range "n,m" will format to m places.
+ // round: Number?
+ // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
+ // means don't round.
+ this.decimal = decimal;
+ this.group = group;
+ this.places = places;
+ this.round = round;
+}
+=====*/
+
+dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatAbsoluteOptions?*/options){
+ // summary:
+ // Apply numeric pattern to absolute value using options. Gives no
+ // consideration to local customs.
+ // value:
+ // the number to be formatted, ignores sign
+ // pattern:
+ // the number portion of a pattern (e.g. `#,##0.00`)
+ options = options || {};
+ if(options.places === true){options.places=0;}
+ if(options.places === Infinity){options.places=6;} // avoid a loop; pick a limit
+
+ var patternParts = pattern.split("."),
+ comma = typeof options.places == "string" && options.places.indexOf(","),
+ maxPlaces = options.places;
+ if(comma){
+ maxPlaces = options.places.substring(comma + 1);
+ }else if(!(maxPlaces >= 0)){
+ maxPlaces = (patternParts[1] || []).length;
+ }
+ if(!(options.round < 0)){
+ value = dojo.number.round(value, maxPlaces, options.round);
+ }
+
+ var valueParts = String(Math.abs(value)).split("."),
+ fractional = valueParts[1] || "";
+ if(patternParts[1] || options.places){
+ if(comma){
+ options.places = options.places.substring(0, comma);
+ }
+ // Pad fractional with trailing zeros
+ var pad = options.places !== undefined ? options.places : (patternParts[1] && patternParts[1].lastIndexOf("0") + 1);
+ if(pad > fractional.length){
+ valueParts[1] = dstring.pad(fractional, pad, '0', true);
+ }
+
+ // Truncate fractional
+ if(maxPlaces < fractional.length){
+ valueParts[1] = fractional.substr(0, maxPlaces);
+ }
+ }else{
+ if(valueParts[1]){ valueParts.pop(); }
+ }
+
+ // Pad whole with leading zeros
+ var patternDigits = patternParts[0].replace(',', '');
+ pad = patternDigits.indexOf("0");
+ if(pad != -1){
+ pad = patternDigits.length - pad;
+ if(pad > valueParts[0].length){
+ valueParts[0] = dstring.pad(valueParts[0], pad);
+ }
+
+ // Truncate whole
+ if(patternDigits.indexOf("#") == -1){
+ valueParts[0] = valueParts[0].substr(valueParts[0].length - pad);
+ }
+ }
+
+ // Add group separators
+ var index = patternParts[0].lastIndexOf(','),
+ groupSize, groupSize2;
+ if(index != -1){
+ groupSize = patternParts[0].length - index - 1;
+ var remainder = patternParts[0].substr(0, index);
+ index = remainder.lastIndexOf(',');
+ if(index != -1){
+ groupSize2 = remainder.length - index - 1;
+ }
+ }
+ var pieces = [];
+ for(var whole = valueParts[0]; whole;){
+ var off = whole.length - groupSize;
+ pieces.push((off > 0) ? whole.substr(off) : whole);
+ whole = (off > 0) ? whole.slice(0, off) : "";
+ if(groupSize2){
+ groupSize = groupSize2;
+ delete groupSize2;
+ }
+ }
+ valueParts[0] = pieces.reverse().join(options.group || ",");
+
+ return valueParts.join(options.decimal || ".");
+};
+
+/*=====
+dojo.number.__RegexpOptions = function(){
+ // pattern: String?
+ // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+ // with this string. Default value is based on locale. Overriding this property will defeat
+ // localization.
+ // type: String?
+ // choose a format type based on the locale from the following:
+ // decimal, scientific (not yet supported), percent, currency. decimal by default.
+ // locale: String?
+ // override the locale used to determine formatting rules
+ // strict: Boolean?
+ // strict parsing, false by default. Strict parsing requires input as produced by the format() method.
+ // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators
+ // places: Number|String?
+ // number of decimal places to accept: Infinity, a positive number, or
+ // a range "n,m". Defined by pattern or Infinity if pattern not provided.
+ this.pattern = pattern;
+ this.type = type;
+ this.locale = locale;
+ this.strict = strict;
+ this.places = places;
+}
+=====*/
+dojo.number.regexp = function(/*dojo.number.__RegexpOptions?*/options){
+ // summary:
+ // Builds the regular needed to parse a number
+ // description:
+ // Returns regular expression with positive and negative match, group
+ // and decimal separators
+ return dojo.number._parseInfo(options).regexp; // String
+};
+
+dojo.number._parseInfo = function(/*Object?*/options){
+ options = options || {};
+ var locale = i18n.normalizeLocale(options.locale),
+ bundle = i18n.getLocalization("dojo.cldr", "number", locale),
+ pattern = options.pattern || bundle[(options.type || "decimal") + "Format"],
+//TODO: memoize?
+ group = bundle.group,
+ decimal = bundle.decimal,
+ factor = 1;
+
+ if(pattern.indexOf('%') != -1){
+ factor /= 100;
+ }else if(pattern.indexOf('\u2030') != -1){
+ factor /= 1000; // per mille
+ }else{
+ var isCurrency = pattern.indexOf('\u00a4') != -1;
+ if(isCurrency){
+ group = bundle.currencyGroup || group;
+ decimal = bundle.currencyDecimal || decimal;
+ }
+ }
+
+ //TODO: handle quoted escapes
+ var patternList = pattern.split(';');
+ if(patternList.length == 1){
+ patternList.push("-" + patternList[0]);
+ }
+
+ var re = dregexp.buildGroupRE(patternList, function(pattern){
+ pattern = "(?:"+dregexp.escapeString(pattern, '.')+")";
+ return pattern.replace(dojo.number._numberPatternRE, function(format){
+ var flags = {
+ signed: false,
+ separator: options.strict ? group : [group,""],
+ fractional: options.fractional,
+ decimal: decimal,
+ exponent: false
+ },
+
+ parts = format.split('.'),
+ places = options.places;
+
+ // special condition for percent (factor != 1)
+ // allow decimal places even if not specified in pattern
+ if(parts.length == 1 && factor != 1){
+ parts[1] = "###";
+ }
+ if(parts.length == 1 || places === 0){
+ flags.fractional = false;
+ }else{
+ if(places === undefined){ places = options.pattern ? parts[1].lastIndexOf('0') + 1 : Infinity; }
+ if(places && options.fractional == undefined){flags.fractional = true;} // required fractional, unless otherwise specified
+ if(!options.places && (places < parts[1].length)){ places += "," + parts[1].length; }
+ flags.places = places;
+ }
+ var groups = parts[0].split(',');
+ if(groups.length > 1){
+ flags.groupSize = groups.pop().length;
+ if(groups.length > 1){
+ flags.groupSize2 = groups.pop().length;
+ }
+ }
+ return "("+dojo.number._realNumberRegexp(flags)+")";
+ });
+ }, true);
+
+ if(isCurrency){
+ // substitute the currency symbol for the placeholder in the pattern
+ re = re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g, function(match, before, target, after){
+ var prop = ["symbol", "currency", "displayName"][target.length-1],
+ symbol = dregexp.escapeString(options[prop] || options.currency || "");
+ before = before ? "[\\s\\xa0]" : "";
+ after = after ? "[\\s\\xa0]" : "";
+ if(!options.strict){
+ if(before){before += "*";}
+ if(after){after += "*";}
+ return "(?:"+before+symbol+after+")?";
+ }
+ return before+symbol+after;
+ });
+ }
+
+//TODO: substitute localized sign/percent/permille/etc.?
+
+ // normalize whitespace and return
+ return {regexp: re.replace(/[\xa0 ]/g, "[\\s\\xa0]"), group: group, decimal: decimal, factor: factor}; // Object
+};
+
+/*=====
+dojo.number.__ParseOptions = function(){
+ // pattern: String?
+ // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+ // with this string. Default value is based on locale. Overriding this property will defeat
+ // localization. Literal characters in patterns are not supported.
+ // type: String?
+ // choose a format type based on the locale from the following:
+ // decimal, scientific (not yet supported), percent, currency. decimal by default.
+ // locale: String?
+ // override the locale used to determine formatting rules
+ // strict: Boolean?
+ // strict parsing, false by default. Strict parsing requires input as produced by the format() method.
+ // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators
+ // fractional: Boolean?|Array?
+ // Whether to include the fractional portion, where the number of decimal places are implied by pattern
+ // or explicit 'places' parameter. The value [true,false] makes the fractional portion optional.
+ this.pattern = pattern;
+ this.type = type;
+ this.locale = locale;
+ this.strict = strict;
+ this.fractional = fractional;
+}
+=====*/
+dojo.number.parse = function(/*String*/expression, /*dojo.number.__ParseOptions?*/options){
+ // summary:
+ // Convert a properly formatted string to a primitive Number, using
+ // locale-specific settings.
+ // description:
+ // Create a Number from a string using a known localized pattern.
+ // Formatting patterns are chosen appropriate to the locale
+ // and follow the syntax described by
+ // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+ // Note that literal characters in patterns are not supported.
+ // expression:
+ // A string representation of a Number
+ var info = dojo.number._parseInfo(options),
+ results = (new RegExp("^"+info.regexp+"$")).exec(expression);
+ if(!results){
+ return NaN; //NaN
+ }
+ var absoluteMatch = results[1]; // match for the positive expression
+ if(!results[1]){
+ if(!results[2]){
+ return NaN; //NaN
+ }
+ // matched the negative pattern
+ absoluteMatch =results[2];
+ info.factor *= -1;
+ }
+
+ // Transform it to something Javascript can parse as a number. Normalize
+ // decimal point and strip out group separators or alternate forms of whitespace
+ absoluteMatch = absoluteMatch.
+ replace(new RegExp("["+info.group + "\\s\\xa0"+"]", "g"), "").
+ replace(info.decimal, ".");
+ // Adjust for negative sign, percent, etc. as necessary
+ return absoluteMatch * info.factor; //Number
+};
+
+/*=====
+dojo.number.__RealNumberRegexpFlags = function(){
+ // places: Number?
+ // The integer number of decimal places or a range given as "n,m". If
+ // not given, the decimal part is optional and the number of places is
+ // unlimited.
+ // decimal: String?
+ // A string for the character used as the decimal point. Default
+ // is ".".
+ // fractional: Boolean?|Array?
+ // Whether decimal places are used. Can be true, false, or [true,
+ // false]. Default is [true, false] which means optional.
+ // exponent: Boolean?|Array?
+ // Express in exponential notation. Can be true, false, or [true,
+ // false]. Default is [true, false], (i.e. will match if the
+ // exponential part is present are not).
+ // eSigned: Boolean?|Array?
+ // The leading plus-or-minus sign on the exponent. Can be true,
+ // false, or [true, false]. Default is [true, false], (i.e. will
+ // match if it is signed or unsigned). flags in regexp.integer can be
+ // applied.
+ this.places = places;
+ this.decimal = decimal;
+ this.fractional = fractional;
+ this.exponent = exponent;
+ this.eSigned = eSigned;
+}
+=====*/
+
+dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*/flags){
+ // summary:
+ // Builds a regular expression to match a real number in exponential
+ // notation
+
+ // assign default values to missing parameters
+ flags = flags || {};
+ //TODO: use mixin instead?
+ if(!("places" in flags)){ flags.places = Infinity; }
+ if(typeof flags.decimal != "string"){ flags.decimal = "."; }
+ if(!("fractional" in flags) || /^0/.test(flags.places)){ flags.fractional = [true, false]; }
+ if(!("exponent" in flags)){ flags.exponent = [true, false]; }
+ if(!("eSigned" in flags)){ flags.eSigned = [true, false]; }
+
+ var integerRE = dojo.number._integerRegexp(flags),
+ decimalRE = dregexp.buildGroupRE(flags.fractional,
+ function(q){
+ var re = "";
+ if(q && (flags.places!==0)){
+ re = "\\" + flags.decimal;
+ if(flags.places == Infinity){
+ re = "(?:" + re + "\\d+)?";
+ }else{
+ re += "\\d{" + flags.places + "}";
+ }
+ }
+ return re;
+ },
+ true
+ );
+
+ var exponentRE = dregexp.buildGroupRE(flags.exponent,
+ function(q){
+ if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; }
+ return "";
+ }
+ );
+
+ var realRE = integerRE + decimalRE;
+ // allow for decimals without integers, e.g. .25
+ if(decimalRE){realRE = "(?:(?:"+ realRE + ")|(?:" + decimalRE + "))";}
+ return realRE + exponentRE; // String
+};
+
+/*=====
+dojo.number.__IntegerRegexpFlags = function(){
+ // signed: Boolean?
+ // The leading plus-or-minus sign. Can be true, false, or `[true,false]`.
+ // Default is `[true, false]`, (i.e. will match if it is signed
+ // or unsigned).
+ // separator: String?
+ // The character used as the thousands separator. Default is no
+ // separator. For more than one symbol use an array, e.g. `[",", ""]`,
+ // makes ',' optional.
+ // groupSize: Number?
+ // group size between separators
+ // groupSize2: Number?
+ // second grouping, where separators 2..n have a different interval than the first separator (for India)
+ this.signed = signed;
+ this.separator = separator;
+ this.groupSize = groupSize;
+ this.groupSize2 = groupSize2;
+}
+=====*/
+
+dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags){
+ // summary:
+ // Builds a regular expression that matches an integer
+
+ // assign default values to missing parameters
+ flags = flags || {};
+ if(!("signed" in flags)){ flags.signed = [true, false]; }
+ if(!("separator" in flags)){
+ flags.separator = "";
+ }else if(!("groupSize" in flags)){
+ flags.groupSize = 3;
+ }
+
+ var signRE = dregexp.buildGroupRE(flags.signed,
+ function(q){ return q ? "[-+]" : ""; },
+ true
+ );
+
+ var numberRE = dregexp.buildGroupRE(flags.separator,
+ function(sep){
+ if(!sep){
+ return "(?:\\d+)";
+ }
+
+ sep = dregexp.escapeString(sep);
+ if(sep == " "){ sep = "\\s"; }
+ else if(sep == "\xa0"){ sep = "\\s\\xa0"; }
+
+ var grp = flags.groupSize, grp2 = flags.groupSize2;
+ //TODO: should we continue to enforce that numbers with separators begin with 1-9? See #6933
+ if(grp2){
+ var grp2RE = "(?:0|[1-9]\\d{0," + (grp2-1) + "}(?:[" + sep + "]\\d{" + grp2 + "})*[" + sep + "]\\d{" + grp + "})";
+ return ((grp-grp2) > 0) ? "(?:" + grp2RE + "|(?:0|[1-9]\\d{0," + (grp-1) + "}))" : grp2RE;
+ }
+ return "(?:0|[1-9]\\d{0," + (grp-1) + "}(?:[" + sep + "]\\d{" + grp + "})*)";
+ },
+ true
+ );
+
+ return signRE + numberRE; // String
+};
+
+return dojo.number;
+});
diff --git a/lib/dojo/on.js b/lib/dojo/on.js
new file mode 100644
index 000000000..c9b473460
--- /dev/null
+++ b/lib/dojo/on.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/on",["./has!dom-addeventlistener?:./aspect","./_base/kernel","./has"],function(_1,_2,_3){"use strict";if(1){var _4=window.ScriptEngineMajorVersion;_3.add("jscript",_4&&(_4()+ScriptEngineMinorVersion()/10));_3.add("event-orientationchange",_3("touch")&&!_3("android"));}var on=function(_5,_6,_7,_8){if(_5.on){return _5.on(_6,_7);}return on.parse(_5,_6,_7,_9,_8,this);};on.pausable=function(_a,_b,_c,_d){var _e;var _f=on(_a,_b,function(){if(!_e){return _c.apply(this,arguments);}},_d);_f.pause=function(){_e=true;};_f.resume=function(){_e=false;};return _f;};on.once=function(_10,_11,_12,_13){var _14=on(_10,_11,function(){_14.remove();return _12.apply(this,arguments);});return _14;};on.parse=function(_15,_16,_17,_18,_19,_1a){if(_16.call){return _16.call(_1a,_15,_17);}if(_16.indexOf(",")>-1){var _1b=_16.split(/\s*,\s*/);var _1c=[];var i=0;var _1d;while(_1d=_1b[i++]){_1c.push(_18(_15,_1d,_17,_19,_1a));}_1c.remove=function(){for(var i=0;i<_1c.length;i++){_1c[i].remove();}};return _1c;}return _18(_15,_16,_17,_19,_1a);};var _1e=/^touch/;function _9(_1f,_20,_21,_22,_23){var _24=_20.match(/(.*):(.*)/);if(_24){_20=_24[2];_24=_24[1];return on.selector(_24,_20).call(_23,_1f,_21);}if(_3("touch")){if(_1e.test(_20)){_21=_25(_21);}if(!_3("event-orientationchange")&&(_20=="orientationchange")){_20="resize";_1f=window;_21=_25(_21);}}if(_1f.addEventListener){var _26=_20 in _27;_1f.addEventListener(_26?_27[_20]:_20,_21,_26);return {remove:function(){_1f.removeEventListener(_20,_21,_26);}};}_20="on"+_20;if(_28&&_1f.attachEvent){return _28(_1f,_20,_21);}throw new Error("Target must be an event emitter");};on.selector=function(_29,_2a,_2b){return function(_2c,_2d){var _2e=this;var _2f=_2a.bubble;if(_2f){_2a=_2f;}else{if(_2b!==false){_2b=true;}}return on(_2c,_2a,function(_30){var _31=_30.target;_2e=_2e&&_2e.matches?_2e:_2.query;while(!_2e.matches(_31,_29,_2c)){if(_31==_2c||!_2b||!(_31=_31.parentNode)){return;}}return _2d.call(_31,_30);});};};function _32(){this.cancelable=false;};function _33(){this.bubbles=false;};var _34=[].slice,_35=on.emit=function(_36,_37,_38){var _39=_34.call(arguments,2);var _3a="on"+_37;if("parentNode" in _36){var _3b=_39[0]={};for(var i in _38){_3b[i]=_38[i];}_3b.preventDefault=_32;_3b.stopPropagation=_33;_3b.target=_36;_3b.type=_37;_38=_3b;}do{_36[_3a]&&_36[_3a].apply(_36,_39);}while(_38&&_38.bubbles&&(_36=_36.parentNode));return _38&&_38.cancelable&&_38;};var _27={};if(_3("dom-addeventlistener")){_27={focusin:"focus",focusout:"blur"};if(_3("opera")){_27.keydown="keypress";}on.emit=function(_3c,_3d,_3e){if(_3c.dispatchEvent&&document.createEvent){var _3f=document.createEvent("HTMLEvents");_3f.initEvent(_3d,!!_3e.bubbles,!!_3e.cancelable);for(var i in _3e){var _40=_3e[i];if(!(i in _3f)){_3f[i]=_3e[i];}}return _3c.dispatchEvent(_3f)&&_3f;}return _35.apply(on,arguments);};}else{on._fixEvent=function(evt,_41){if(!evt){var w=_41&&(_41.ownerDocument||_41.document||_41).parentWindow||window;evt=w.event;}if(!evt){return (evt);}if(!evt.target){evt.target=evt.srcElement;evt.currentTarget=(_41||evt.srcElement);if(evt.type=="mouseover"){evt.relatedTarget=evt.fromElement;}if(evt.type=="mouseout"){evt.relatedTarget=evt.toElement;}if(!evt.stopPropagation){evt.stopPropagation=_42;evt.preventDefault=_43;}switch(evt.type){case "keypress":var c=("charCode" in evt?evt.charCode:evt.keyCode);if(c==10){c=0;evt.keyCode=13;}else{if(c==13||c==27){c=0;}else{if(c==3){c=99;}}}evt.charCode=c;_44(evt);break;}}return evt;};var _45=function(_46){this.handle=_46;};_45.prototype.remove=function(){delete _dojoIEListeners_[this.handle];};var _47=function(_48){return function(evt){evt=on._fixEvent(evt,this);return _48.call(this,evt);};};var _28=function(_49,_4a,_4b){_4b=_47(_4b);if(((_49.ownerDocument?_49.ownerDocument.parentWindow:_49.parentWindow||_49.window||window)!=top||_3("jscript")<5.8)&&!_3("config-_allow_leaks")){if(typeof _dojoIEListeners_=="undefined"){_dojoIEListeners_=[];}var _4c=_49[_4a];if(!_4c||!_4c.listeners){var _4d=_4c;_49[_4a]=_4c=Function("event","var callee = arguments.callee; for(var i = 0; i<callee.listeners.length; i++){var listener = _dojoIEListeners_[callee.listeners[i]]; if(listener){listener.call(this,event);}}");_4c.listeners=[];_4c.global=this;if(_4d){_4c.listeners.push(_dojoIEListeners_.push(_4d)-1);}}var _4e;_4c.listeners.push(_4e=(_4c.global._dojoIEListeners_.push(_4b)-1));return new _45(_4e);}return _1.after(_49,_4a,_4b,true);};var _44=function(evt){evt.keyChar=evt.charCode?String.fromCharCode(evt.charCode):"";evt.charOrCode=evt.keyChar||evt.keyCode;};var _42=function(){this.cancelBubble=true;};var _43=on._preventDefault=function(){this.bubbledKeyCode=this.keyCode;if(this.ctrlKey){try{this.keyCode=0;}catch(e){}}this.returnValue=false;};}if(_3("touch")){var _4f=function(){};var _50=window.orientation;var _25=function(_51){return function(_52){var _53=_52.corrected;if(!_53){var _54=_52.type;try{delete _52.type;}catch(e){}if(_52.type){_4f.prototype=_52;var _53=new _4f;_53.preventDefault=function(){_52.preventDefault();};_53.stopPropagation=function(){_52.stopPropagation();};}else{_53=_52;_53.type=_54;}_52.corrected=_53;if(_54=="resize"){if(_50==window.orientation){return null;}_50=window.orientation;_53.type="orientationchange";return _51.call(this,_53);}if(!("rotation" in _53)){_53.rotation=0;_53.scale=1;}var _55=_53.changedTouches[0];for(var i in _55){delete _53[i];_53[i]=_55[i];}}return _51.call(this,_53);};};}return on;}); \ No newline at end of file
diff --git a/lib/dojo/on.js.uncompressed.js b/lib/dojo/on.js.uncompressed.js
new file mode 100644
index 000000000..2d4af3ca4
--- /dev/null
+++ b/lib/dojo/on.js.uncompressed.js
@@ -0,0 +1,474 @@
+define("dojo/on", ["./has!dom-addeventlistener?:./aspect", "./_base/kernel", "./has"], function(aspect, dojo, has){
+ // summary:
+ // The export of this module is a function that provides core event listening functionality. With this function
+ // you can provide a target, event type, and listener to be notified of
+ // future matching events that are fired.
+ // target: Element|Object
+ // This is the target object or DOM element that to receive events from
+ // type: String|Function
+ // This is the name of the event to listen for or an extension event type.
+ // listener: Function
+ // This is the function that should be called when the event fires.
+ // returns: Object
+ // An object with a remove() method that can be used to stop listening for this
+ // event.
+ // description:
+ // To listen for "click" events on a button node, we can do:
+ // | define(["dojo/on"], function(listen){
+ // | on(button, "click", clickHandler);
+ // | ...
+ // Evented JavaScript objects can also have their own events.
+ // | var obj = new Evented;
+ // | on(obj, "foo", fooHandler);
+ // And then we could publish a "foo" event:
+ // | on.emit(obj, "foo", {key: "value"});
+ // We can use extension events as well. For example, you could listen for a tap gesture:
+ // | define(["dojo/on", "dojo/gesture/tap", function(listen, tap){
+ // | on(button, tap, tapHandler);
+ // | ...
+ // which would trigger fooHandler. Note that for a simple object this is equivalent to calling:
+ // | obj.onfoo({key:"value"});
+ // If you use on.emit on a DOM node, it will use native event dispatching when possible.
+
+ "use strict";
+ if(1){ // check to make sure we are in a browser, this module should work anywhere
+ var major = window.ScriptEngineMajorVersion;
+ has.add("jscript", major && (major() + ScriptEngineMinorVersion() / 10));
+ has.add("event-orientationchange", has("touch") && !has("android")); // TODO: how do we detect this?
+ }
+ var on = function(target, type, listener, dontFix){
+ if(target.on){
+ // delegate to the target's on() method, so it can handle it's own listening if it wants
+ return target.on(type, listener);
+ }
+ // delegate to main listener code
+ return on.parse(target, type, listener, addListener, dontFix, this);
+ };
+ on.pausable = function(target, type, listener, dontFix){
+ // summary:
+ // This function acts the same as on(), but with pausable functionality. The
+ // returned signal object has pause() and resume() functions. Calling the
+ // pause() method will cause the listener to not be called for future events. Calling the
+ // resume() method will cause the listener to again be called for future events.
+ var paused;
+ var signal = on(target, type, function(){
+ if(!paused){
+ return listener.apply(this, arguments);
+ }
+ }, dontFix);
+ signal.pause = function(){
+ paused = true;
+ };
+ signal.resume = function(){
+ paused = false;
+ };
+ return signal;
+ };
+ on.once = function(target, type, listener, dontFix){
+ // summary:
+ // This function acts the same as on(), but will only call the listener once. The
+ // listener will be called for the first
+ // event that takes place and then listener will automatically be removed.
+ var signal = on(target, type, function(){
+ // remove this listener
+ signal.remove();
+ // proceed to call the listener
+ return listener.apply(this, arguments);
+ });
+ return signal;
+ };
+ on.parse = function(target, type, listener, addListener, dontFix, matchesTarget){
+ if(type.call){
+ // event handler function
+ // on(node, dojo.touch.press, touchListener);
+ return type.call(matchesTarget, target, listener);
+ }
+
+ if(type.indexOf(",") > -1){
+ // we allow comma delimited event names, so you can register for multiple events at once
+ var events = type.split(/\s*,\s*/);
+ var handles = [];
+ var i = 0;
+ var eventName;
+ while(eventName = events[i++]){
+ handles.push(addListener(target, eventName, listener, dontFix, matchesTarget));
+ }
+ handles.remove = function(){
+ for(var i = 0; i < handles.length; i++){
+ handles[i].remove();
+ }
+ };
+ return handles;
+ }
+ return addListener(target, type, listener, dontFix, matchesTarget)
+ };
+ var touchEvents = /^touch/;
+ function addListener(target, type, listener, dontFix, matchesTarget){
+ // event delegation:
+ var selector = type.match(/(.*):(.*)/);
+ // if we have a selector:event, the last one is interpreted as an event, and we use event delegation
+ if(selector){
+ type = selector[2];
+ selector = selector[1];
+ // create the extension event for selectors and directly call it
+ return on.selector(selector, type).call(matchesTarget, target, listener);
+ }
+ // test to see if it a touch event right now, so we don't have to do it every time it fires
+ if(has("touch")){
+ if(touchEvents.test(type)){
+ // touch event, fix it
+ listener = fixTouchListener(listener);
+ }
+ if(!has("event-orientationchange") && (type == "orientationchange")){
+ //"orientationchange" not supported <= Android 2.1,
+ //but works through "resize" on window
+ type = "resize";
+ target = window;
+ listener = fixTouchListener(listener);
+ }
+ }
+ // normal path, the target is |this|
+ if(target.addEventListener){
+ // the target has addEventListener, which should be used if available (might or might not be a node, non-nodes can implement this method as well)
+ // check for capture conversions
+ var capture = type in captures;
+ target.addEventListener(capture ? captures[type] : type, listener, capture);
+ // create and return the signal
+ return {
+ remove: function(){
+ target.removeEventListener(type, listener, capture);
+ }
+ };
+ }
+ type = "on" + type;
+ if(fixAttach && target.attachEvent){
+ return fixAttach(target, type, listener);
+ }
+ throw new Error("Target must be an event emitter");
+ }
+
+ on.selector = function(selector, eventType, children){
+ // summary:
+ // Creates a new extension event with event delegation. This is based on
+ // the provided event type (can be extension event) that
+ // only calls the listener when the CSS selector matches the target of the event.
+ // selector:
+ // The CSS selector to use for filter events and determine the |this| of the event listener.
+ // eventType:
+ // The event to listen for
+ // children:
+ // Indicates if children elements of the selector should be allowed. This defaults to
+ // true (except in the case of normally non-bubbling events like mouse.enter, in which case it defaults to false).
+ // example:
+ // define(["dojo/on", "dojo/mouse"], function(listen, mouse){
+ // on(node, on.selector(".my-class", mouse.enter), handlerForMyHover);
+ return function(target, listener){
+ var matchesTarget = this;
+ var bubble = eventType.bubble;
+ if(bubble){
+ // the event type doesn't naturally bubble, but has a bubbling form, use that
+ eventType = bubble;
+ }else if(children !== false){
+ // for normal bubbling events we default to allowing children of the selector
+ children = true;
+ }
+ return on(target, eventType, function(event){
+ var eventTarget = event.target;
+ // see if we have a valid matchesTarget or default to dojo.query
+ matchesTarget = matchesTarget && matchesTarget.matches ? matchesTarget : dojo.query;
+ // there is a selector, so make sure it matches
+ while(!matchesTarget.matches(eventTarget, selector, target)){
+ if(eventTarget == target || !children || !(eventTarget = eventTarget.parentNode)){ // intentional assignment
+ return;
+ }
+ }
+ return listener.call(eventTarget, event);
+ });
+ };
+ };
+
+ function syntheticPreventDefault(){
+ this.cancelable = false;
+ }
+ function syntheticStopPropagation(){
+ this.bubbles = false;
+ }
+ var slice = [].slice,
+ syntheticDispatch = on.emit = function(target, type, event){
+ // summary:
+ // Fires an event on the target object.
+ // target:
+ // The target object to fire the event on. This can be a DOM element or a plain
+ // JS object. If the target is a DOM element, native event emiting mechanisms
+ // are used when possible.
+ // type:
+ // The event type name. You can emulate standard native events like "click" and
+ // "mouseover" or create custom events like "open" or "finish".
+ // event:
+ // An object that provides the properties for the event. See https://developer.mozilla.org/en/DOM/event.initEvent
+ // for some of the properties. These properties are copied to the event object.
+ // Of particular importance are the cancelable and bubbles properties. The
+ // cancelable property indicates whether or not the event has a default action
+ // that can be cancelled. The event is cancelled by calling preventDefault() on
+ // the event object. The bubbles property indicates whether or not the
+ // event will bubble up the DOM tree. If bubbles is true, the event will be called
+ // on the target and then each parent successively until the top of the tree
+ // is reached or stopPropagation() is called. Both bubbles and cancelable
+ // default to false.
+ // returns:
+ // If the event is cancelable and the event is not cancelled,
+ // emit will return true. If the event is cancelable and the event is cancelled,
+ // emit will return false.
+ // details:
+ // Note that this is designed to emit events for listeners registered through
+ // dojo/on. It should actually work with any event listener except those
+ // added through IE's attachEvent (IE8 and below's non-W3C event emiting
+ // doesn't support custom event types). It should work with all events registered
+ // through dojo/on. Also note that the emit method does do any default
+ // action, it only returns a value to indicate if the default action should take
+ // place. For example, emiting a keypress event would not cause a character
+ // to appear in a textbox.
+ // example:
+ // To fire our own click event
+ // | on.emit(dojo.byId("button"), "click", {
+ // | cancelable: true,
+ // | bubbles: true,
+ // | screenX: 33,
+ // | screenY: 44
+ // | });
+ // We can also fire our own custom events:
+ // | on.emit(dojo.byId("slider"), "slide", {
+ // | cancelable: true,
+ // | bubbles: true,
+ // | direction: "left-to-right"
+ // | });
+ var args = slice.call(arguments, 2);
+ var method = "on" + type;
+ if("parentNode" in target){
+ // node (or node-like), create event controller methods
+ var newEvent = args[0] = {};
+ for(var i in event){
+ newEvent[i] = event[i];
+ }
+ newEvent.preventDefault = syntheticPreventDefault;
+ newEvent.stopPropagation = syntheticStopPropagation;
+ newEvent.target = target;
+ newEvent.type = type;
+ event = newEvent;
+ }
+ do{
+ // call any node which has a handler (note that ideally we would try/catch to simulate normal event propagation but that causes too much pain for debugging)
+ target[method] && target[method].apply(target, args);
+ // and then continue up the parent node chain if it is still bubbling (if started as bubbles and stopPropagation hasn't been called)
+ }while(event && event.bubbles && (target = target.parentNode));
+ return event && event.cancelable && event; // if it is still true (was cancelable and was cancelled), return the event to indicate default action should happen
+ };
+ var captures = {};
+ if(has("dom-addeventlistener")){
+ // normalize focusin and focusout
+ captures = {
+ focusin: "focus",
+ focusout: "blur"
+ };
+ if(has("opera")){
+ captures.keydown = "keypress"; // this one needs to be transformed because Opera doesn't support repeating keys on keydown (and keypress works because it incorrectly fires on all keydown events)
+ }
+
+ // emiter that works with native event handling
+ on.emit = function(target, type, event){
+ if(target.dispatchEvent && document.createEvent){
+ // use the native event emiting mechanism if it is available on the target object
+ // create a generic event
+ // we could create branch into the different types of event constructors, but
+ // that would be a lot of extra code, with little benefit that I can see, seems
+ // best to use the generic constructor and copy properties over, making it
+ // easy to have events look like the ones created with specific initializers
+ var nativeEvent = document.createEvent("HTMLEvents");
+ nativeEvent.initEvent(type, !!event.bubbles, !!event.cancelable);
+ // and copy all our properties over
+ for(var i in event){
+ var value = event[i];
+ if(!(i in nativeEvent)){
+ nativeEvent[i] = event[i];
+ }
+ }
+ return target.dispatchEvent(nativeEvent) && nativeEvent;
+ }
+ return syntheticDispatch.apply(on, arguments); // emit for a non-node
+ };
+ }else{
+ // no addEventListener, basically old IE event normalization
+ on._fixEvent = function(evt, sender){
+ // summary:
+ // normalizes properties on the event object including event
+ // bubbling methods, keystroke normalization, and x/y positions
+ // evt:
+ // native event object
+ // sender:
+ // node to treat as "currentTarget"
+ if(!evt){
+ var w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window;
+ evt = w.event;
+ }
+ if(!evt){return(evt);}
+ if(!evt.target){ // check to see if it has been fixed yet
+ evt.target = evt.srcElement;
+ evt.currentTarget = (sender || evt.srcElement);
+ if(evt.type == "mouseover"){
+ evt.relatedTarget = evt.fromElement;
+ }
+ if(evt.type == "mouseout"){
+ evt.relatedTarget = evt.toElement;
+ }
+ if(!evt.stopPropagation){
+ evt.stopPropagation = stopPropagation;
+ evt.preventDefault = preventDefault;
+ }
+ switch(evt.type){
+ case "keypress":
+ var c = ("charCode" in evt ? evt.charCode : evt.keyCode);
+ if (c==10){
+ // CTRL-ENTER is CTRL-ASCII(10) on IE, but CTRL-ENTER on Mozilla
+ c=0;
+ evt.keyCode = 13;
+ }else if(c==13||c==27){
+ c=0; // Mozilla considers ENTER and ESC non-printable
+ }else if(c==3){
+ c=99; // Mozilla maps CTRL-BREAK to CTRL-c
+ }
+ // Mozilla sets keyCode to 0 when there is a charCode
+ // but that stops the event on IE.
+ evt.charCode = c;
+ _setKeyChar(evt);
+ break;
+ }
+ }
+ return evt;
+ };
+ var IESignal = function(handle){
+ this.handle = handle;
+ };
+ IESignal.prototype.remove = function(){
+ delete _dojoIEListeners_[this.handle];
+ };
+ var fixListener = function(listener){
+ // this is a minimal function for closing on the previous listener with as few as variables as possible
+ return function(evt){
+ evt = on._fixEvent(evt, this);
+ return listener.call(this, evt);
+ }
+ }
+ var fixAttach = function(target, type, listener){
+ listener = fixListener(listener);
+ if(((target.ownerDocument ? target.ownerDocument.parentWindow : target.parentWindow || target.window || window) != top ||
+ has("jscript") < 5.8) &&
+ !has("config-_allow_leaks")){
+ // IE will leak memory on certain handlers in frames (IE8 and earlier) and in unattached DOM nodes for JScript 5.7 and below.
+ // Here we use global redirection to solve the memory leaks
+ if(typeof _dojoIEListeners_ == "undefined"){
+ _dojoIEListeners_ = [];
+ }
+ var emiter = target[type];
+ if(!emiter || !emiter.listeners){
+ var oldListener = emiter;
+ target[type] = emiter = Function('event', 'var callee = arguments.callee; for(var i = 0; i<callee.listeners.length; i++){var listener = _dojoIEListeners_[callee.listeners[i]]; if(listener){listener.call(this,event);}}');
+ emiter.listeners = [];
+ emiter.global = this;
+ if(oldListener){
+ emiter.listeners.push(_dojoIEListeners_.push(oldListener) - 1);
+ }
+ }
+ var handle;
+ emiter.listeners.push(handle = (emiter.global._dojoIEListeners_.push(listener) - 1));
+ return new IESignal(handle);
+ }
+ return aspect.after(target, type, listener, true);
+ };
+
+ var _setKeyChar = function(evt){
+ evt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : '';
+ evt.charOrCode = evt.keyChar || evt.keyCode;
+ };
+ // Called in Event scope
+ var stopPropagation = function(){
+ this.cancelBubble = true;
+ };
+ var preventDefault = on._preventDefault = function(){
+ // Setting keyCode to 0 is the only way to prevent certain keypresses (namely
+ // ctrl-combinations that correspond to menu accelerator keys).
+ // Otoh, it prevents upstream listeners from getting this information
+ // Try to split the difference here by clobbering keyCode only for ctrl
+ // combinations. If you still need to access the key upstream, bubbledKeyCode is
+ // provided as a workaround.
+ this.bubbledKeyCode = this.keyCode;
+ if(this.ctrlKey){
+ try{
+ // squelch errors when keyCode is read-only
+ // (e.g. if keyCode is ctrl or shift)
+ this.keyCode = 0;
+ }catch(e){
+ }
+ }
+ this.returnValue = false;
+ };
+ }
+ if(has("touch")){
+ var Event = function (){};
+ var windowOrientation = window.orientation;
+ var fixTouchListener = function(listener){
+ return function(originalEvent){
+ //Event normalization(for ontouchxxx and resize):
+ //1.incorrect e.pageX|pageY in iOS
+ //2.there are no "e.rotation", "e.scale" and "onorientationchange" in Andriod
+ //3.More TBD e.g. force | screenX | screenX | clientX | clientY | radiusX | radiusY
+
+ // see if it has already been corrected
+ var event = originalEvent.corrected;
+ if(!event){
+ var type = originalEvent.type;
+ try{
+ delete originalEvent.type; // on some JS engines (android), deleting properties make them mutable
+ }catch(e){}
+ if(originalEvent.type){
+ // deleting properties doesn't work (older iOS), have to use delegation
+ Event.prototype = originalEvent;
+ var event = new Event;
+ // have to delegate methods to make them work
+ event.preventDefault = function(){
+ originalEvent.preventDefault();
+ };
+ event.stopPropagation = function(){
+ originalEvent.stopPropagation();
+ };
+ }else{
+ // deletion worked, use property as is
+ event = originalEvent;
+ event.type = type;
+ }
+ originalEvent.corrected = event;
+ if(type == 'resize'){
+ if(windowOrientation == window.orientation){
+ return null;//double tap causes an unexpected 'resize' in Andriod
+ }
+ windowOrientation = window.orientation;
+ event.type = "orientationchange";
+ return listener.call(this, event);
+ }
+ // We use the original event and augment, rather than doing an expensive mixin operation
+ if(!("rotation" in event)){ // test to see if it has rotation
+ event.rotation = 0;
+ event.scale = 1;
+ }
+ //use event.changedTouches[0].pageX|pageY|screenX|screenY|clientX|clientY|target
+ var firstChangeTouch = event.changedTouches[0];
+ for(var i in firstChangeTouch){ // use for-in, we don't need to have dependency on dojo/_base/lang here
+ delete event[i]; // delete it first to make it mutable
+ event[i] = firstChangeTouch[i];
+ }
+ }
+ return listener.call(this, event);
+ };
+ };
+ }
+ return on;
+});
diff --git a/lib/dojo/package.json b/lib/dojo/package.json
index 5855be51f..88c2a655d 100644
--- a/lib/dojo/package.json
+++ b/lib/dojo/package.json
@@ -1,21 +1,23 @@
{
- "name": "dojo",
- "directories": {
- "lib": "."
- },
- "main":"./lib/main-browser",
- "description": "Dojo core is a powerful, lightweight library that makes common tasks quicker and easier. Animate elements, manipulate the DOM, and query with easy CSS syntax, all without sacrificing performance.",
- "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", "Toolkit"],
- "homepage": "http://dojotoolkit.org/"
-} \ No newline at end of file
+ "name": "dojo",
+ "version":"1.7.3",
+ "directories": {
+ "lib": "."
+ },
+ "main": "main",
+ "description": "Dojo core is a powerful, lightweight library that makes common tasks quicker and easier. Animate elements, manipulate the DOM, and query with easy CSS syntax, all without sacrificing performance.",
+ "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", "Toolkit"],
+ "homepage": "http://dojotoolkit.org/",
+ "dojoBuild": "dojo.profile.js"
+}
diff --git a/lib/dojo/parser.js b/lib/dojo/parser.js
index bd52030e0..a8c5428ba 100644
--- a/lib/dojo/parser.js
+++ b/lib/dojo/parser.js
@@ -4,559 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.parser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.parser"] = true;
-dojo.provide("dojo.parser");
-dojo.require("dojo.date.stamp");
-
-
-new Date("X"); // workaround for #11279, new Date("") == NaN
-
-dojo.parser = new function(){
- // summary:
- // The Dom/Widget parsing package
-
- var d = dojo;
-
- function val2type(/*Object*/ value){
- // summary:
- // Returns name of type of given value.
-
- if(d.isString(value)){ return "string"; }
- if(typeof value == "number"){ return "number"; }
- if(typeof value == "boolean"){ return "boolean"; }
- if(d.isFunction(value)){ return "function"; }
- if(d.isArray(value)){ return "array"; } // typeof [] == "object"
- if(value instanceof Date) { return "date"; } // assume timestamp
- if(value instanceof d._Url){ return "url"; }
- return "object";
- }
-
- function str2obj(/*String*/ value, /*String*/ type){
- // summary:
- // Convert given string value to given type
- switch(type){
- case "string":
- return value;
- case "number":
- return value.length ? Number(value) : NaN;
- case "boolean":
- // for checked/disabled value might be "" or "checked". interpret as true.
- return typeof value == "boolean" ? value : !(value.toLowerCase()=="false");
- case "function":
- if(d.isFunction(value)){
- // IE gives us a function, even when we say something like onClick="foo"
- // (in which case it gives us an invalid function "function(){ foo }").
- // Therefore, convert to string
- value=value.toString();
- value=d.trim(value.substring(value.indexOf('{')+1, value.length-1));
- }
- try{
- if(value === "" || value.search(/[^\w\.]+/i) != -1){
- // The user has specified some text for a function like "return x+5"
- return new Function(value);
- }else{
- // The user has specified the name of a function like "myOnClick"
- // or a single word function "return"
- return d.getObject(value, false) || new Function(value);
- }
- }catch(e){ return new Function(); }
- case "array":
- return value ? value.split(/\s*,\s*/) : [];
- case "date":
- switch(value){
- case "": return new Date(""); // the NaN of dates
- case "now": return new Date(); // current date
- default: return d.date.stamp.fromISOString(value);
- }
- case "url":
- return d.baseUrl + value;
- default:
- return d.fromJson(value);
- }
- }
-
- var dummyClass = {}, instanceClasses = {
- // map from fully qualified name (like "dijit.Button") to structure like
- // { cls: dijit.Button, params: {label: "string", disabled: "boolean"} }
- };
-
- // Widgets like BorderContainer add properties to _Widget via dojo.extend().
- // If BorderContainer is loaded after _Widget's parameter list has been cached,
- // we need to refresh that parameter list (for _Widget and all widgets that extend _Widget).
- // TODO: remove this in 2.0, when we stop caching parameters.
- d.connect(d, "extend", function(){
- instanceClasses = {};
- });
-
- function getProtoInfo(cls, params){
- // cls: A prototype
- // The prototype of the class to check props on
- // params: Object
- // The parameters object to mix found parameters onto.
- for(var name in cls){
- if(name.charAt(0)=="_"){ continue; } // skip internal properties
- if(name in dummyClass){ continue; } // skip "constructor" and "toString"
- params[name] = val2type(cls[name]);
- }
- return params;
- }
-
- function getClassInfo(/*String*/ className, /*Boolean*/ skipParamsLookup){
- // summary:
- // Maps a widget name string like "dijit.form.Button" to the widget constructor itself,
- // and a list of that widget's parameters and their types
- // className:
- // fully qualified name (like "dijit.form.Button")
- // returns:
- // structure like
- // {
- // cls: dijit.Button,
- // params: { label: "string", disabled: "boolean"}
- // }
-
- var c = instanceClasses[className];
- if(!c){
- // get pointer to widget class
- var cls = d.getObject(className), params = null;
- if(!cls){ return null; } // class not defined [yet]
- if(!skipParamsLookup){ // from fastpath, we don't need to lookup the attrs on the proto because they are explicit
- params = getProtoInfo(cls.prototype, {})
- }
- c = { cls: cls, params: params };
-
- }else if(!skipParamsLookup && !c.params){
- // if we're calling getClassInfo and have a cls proto, but no params info, scan that cls for params now
- // and update the pointer in instanceClasses[className]. This happens when a widget appears in another
- // widget's template which still uses dojoType, but an instance of the widget appears prior with a data-dojo-type,
- // skipping this lookup the first time.
- c.params = getProtoInfo(c.cls.prototype, {});
- }
-
- return c;
- }
-
- this._functionFromScript = function(script, attrData){
- // summary:
- // Convert a <script type="dojo/method" args="a, b, c"> ... </script>
- // into a function
- // script: DOMNode
- // The <script> DOMNode
- // attrData: String
- // For HTML5 compliance, searches for attrData + "args" (typically
- // "data-dojo-args") instead of "args"
- var preamble = "";
- var suffix = "";
- var argsStr = (script.getAttribute(attrData + "args") || script.getAttribute("args"));
- if(argsStr){
- d.forEach(argsStr.split(/\s*,\s*/), function(part, idx){
- preamble += "var "+part+" = arguments["+idx+"]; ";
- });
- }
- var withStr = script.getAttribute("with");
- if(withStr && withStr.length){
- d.forEach(withStr.split(/\s*,\s*/), function(part){
- preamble += "with("+part+"){";
- suffix += "}";
- });
- }
- return new Function(preamble+script.innerHTML+suffix);
- };
-
- this.instantiate = function(/* Array */nodes, /* Object? */mixin, /* Object? */args){
- // summary:
- // Takes array of nodes, and turns them into class instances and
- // potentially calls a startup method to allow them to connect with
- // any children.
- // nodes: Array
- // Array of nodes or objects like
- // | {
- // | type: "dijit.form.Button",
- // | node: DOMNode,
- // | scripts: [ ... ], // array of <script type="dojo/..."> children of node
- // | inherited: { ... } // settings inherited from ancestors like dir, theme, etc.
- // | }
- // mixin: Object?
- // An object that will be mixed in with each node in the array.
- // Values in the mixin will override values in the node, if they
- // exist.
- // args: Object?
- // An object used to hold kwArgs for instantiation.
- // See parse.args argument for details.
-
- var thelist = [],
- mixin = mixin||{};
- args = args||{};
-
- // TODO: for 2.0 default to data-dojo- regardless of scopeName (or maybe scopeName won't exist in 2.0)
- var attrName = (args.scope || d._scopeName) + "Type", // typically "dojoType"
- attrData = "data-" + (args.scope || d._scopeName) + "-"; // typically "data-dojo-"
-
- d.forEach(nodes, function(obj){
- if(!obj){ return; }
-
- // Get pointers to DOMNode, dojoType string, and clsInfo (metadata about the dojoType), etc.
- var node, type, clsInfo, clazz, scripts, fastpath;
- if(obj.node){
- // new format of nodes[] array, object w/lots of properties pre-computed for me
- node = obj.node;
- type = obj.type;
- fastpath = obj.fastpath;
- clsInfo = obj.clsInfo || (type && getClassInfo(type, fastpath));
- clazz = clsInfo && clsInfo.cls;
- scripts = obj.scripts;
- }else{
- // old (backwards compatible) format of nodes[] array, simple array of DOMNodes. no fastpath/data-dojo-type support here.
- node = obj;
- type = attrName in mixin ? mixin[attrName] : node.getAttribute(attrName);
- clsInfo = type && getClassInfo(type);
- clazz = clsInfo && clsInfo.cls;
- scripts = (clazz && (clazz._noScript || clazz.prototype._noScript) ? [] :
- d.query("> script[type^='dojo/']", node));
- }
- if(!clsInfo){
- throw new Error("Could not load class '" + type);
- }
-
- // Setup hash to hold parameter settings for this widget. Start with the parameter
- // settings inherited from ancestors ("dir" and "lang").
- // Inherited setting may later be overridden by explicit settings on node itself.
- var params = {};
-
- if(args.defaults){
- // settings for the document itself (or whatever subtree is being parsed)
- d._mixin(params, args.defaults);
- }
- if(obj.inherited){
- // settings from dir=rtl or lang=... on a node above this node
- d._mixin(params, obj.inherited);
- }
-
- // mix things found in data-dojo-props into the params
- if(fastpath){
- var extra = node.getAttribute(attrData + "props");
- if(extra && extra.length){
- try{
- extra = d.fromJson.call(args.propsThis, "{" + extra + "}");
- d._mixin(params, extra);
- }catch(e){
- // give the user a pointer to their invalid parameters. FIXME: can we kill this in production?
- throw new Error(e.toString() + " in data-dojo-props='" + extra + "'");
- }
- }
-
- // For the benefit of _Templated, check if node has data-dojo-attach-point/data-dojo-attach-event
- // and mix those in as though they were parameters
- var attachPoint = node.getAttribute(attrData + "attach-point");
- if(attachPoint){
- params.dojoAttachPoint = attachPoint;
- }
- var attachEvent = node.getAttribute(attrData + "attach-event");
- if(attachEvent){
- params.dojoAttachEvent = attachEvent;
- }
- dojo.mixin(params, mixin);
- }else{
- // FIXME: we need something like "deprecateOnce()" to throw dojo.deprecation for something.
- // remove this logic in 2.0
- // read parameters (ie, attributes) specified on DOMNode
-
- var attributes = node.attributes;
-
- // clsInfo.params lists expected params like {"checked": "boolean", "n": "number"}
- for(var name in clsInfo.params){
- var item = name in mixin ? { value:mixin[name], specified:true } : attributes.getNamedItem(name);
- if(!item || (!item.specified && (!dojo.isIE || name.toLowerCase()!="value"))){ continue; }
- var value = item.value;
- // Deal with IE quirks for 'class' and 'style'
- switch(name){
- case "class":
- value = "className" in mixin ? mixin.className : node.className;
- break;
- case "style":
- value = "style" in mixin ? mixin.style : (node.style && node.style.cssText); // FIXME: Opera?
- }
- var _type = clsInfo.params[name];
- if(typeof value == "string"){
- params[name] = str2obj(value, _type);
- }else{
- params[name] = value;
- }
- }
- }
-
- // Process <script type="dojo/*"> script tags
- // <script type="dojo/method" event="foo"> tags are added to params, and passed to
- // the widget on instantiation.
- // <script type="dojo/method"> tags (with no event) are executed after instantiation
- // <script type="dojo/connect" event="foo"> tags are dojo.connected after instantiation
- // note: dojo/* script tags cannot exist in self closing widgets, like <input />
- var connects = [], // functions to connect after instantiation
- calls = []; // functions to call after instantiation
-
- d.forEach(scripts, function(script){
- node.removeChild(script);
- // FIXME: drop event="" support in 2.0. use data-dojo-event="" instead
- var event = (script.getAttribute(attrData + "event") || script.getAttribute("event")),
- type = script.getAttribute("type"),
- nf = d.parser._functionFromScript(script, attrData);
- if(event){
- if(type == "dojo/connect"){
- connects.push({event: event, func: nf});
- }else{
- params[event] = nf;
- }
- }else{
- calls.push(nf);
- }
- });
-
- var markupFactory = clazz.markupFactory || clazz.prototype && clazz.prototype.markupFactory;
- // create the instance
- var instance = markupFactory ? markupFactory(params, node, clazz) : new clazz(params, node);
- thelist.push(instance);
-
- // map it to the JS namespace if that makes sense
- // FIXME: in 2.0, drop jsId support. use data-dojo-id instead
- var jsname = (node.getAttribute(attrData + "id") || node.getAttribute("jsId"));
- if(jsname){
- d.setObject(jsname, instance);
- }
-
- // process connections and startup functions
- d.forEach(connects, function(connect){
- d.connect(instance, connect.event, null, connect.func);
- });
- d.forEach(calls, function(func){
- func.call(instance);
- });
- });
-
- // Call startup on each top level instance if it makes sense (as for
- // widgets). Parent widgets will recursively call startup on their
- // (non-top level) children
- if(!mixin._started){
- // TODO: for 2.0, when old instantiate() API is desupported, store parent-child
- // relationships in the nodes[] array so that no getParent() call is needed.
- // Note that will require a parse() call from ContentPane setting a param that the
- // ContentPane is the parent widget (so that the parse doesn't call startup() on the
- // ContentPane's children)
- d.forEach(thelist, function(instance){
- if( !args.noStart && instance &&
- dojo.isFunction(instance.startup) &&
- !instance._started &&
- (!instance.getParent || !instance.getParent())
- ){
- instance.startup();
- }
- });
- }
- return thelist;
- };
-
- this.parse = function(rootNode, args){
- // summary:
- // Scan the DOM for class instances, and instantiate them.
- //
- // description:
- // Search specified node (or root node) recursively for class instances,
- // and instantiate them. Searches for either data-dojo-type="Class" or
- // dojoType="Class" where "Class" is a a fully qualified class name,
- // like `dijit.form.Button`
- //
- // Using `data-dojo-type`:
- // Attributes using can be mixed into the parameters used to instantitate the
- // Class by using a `data-dojo-props` attribute on the node being converted.
- // `data-dojo-props` should be a string attribute to be converted from JSON.
- //
- // Using `dojoType`:
- // Attributes are read from the original domNode and converted to appropriate
- // types by looking up the Class prototype values. This is the default behavior
- // from Dojo 1.0 to Dojo 1.5. `dojoType` support is deprecated, and will
- // go away in Dojo 2.0.
- //
- // rootNode: DomNode?
- // A default starting root node from which to start the parsing. Can be
- // omitted, defaulting to the entire document. If omitted, the `args`
- // object can be passed in this place. If the `args` object has a
- // `rootNode` member, that is used.
- //
- // args: Object
- // a kwArgs object passed along to instantiate()
- //
- // * noStart: Boolean?
- // when set will prevent the parser from calling .startup()
- // when locating the nodes.
- // * rootNode: DomNode?
- // identical to the function's `rootNode` argument, though
- // allowed to be passed in via this `args object.
- // * template: Boolean
- // If true, ignores ContentPane's stopParser flag and parses contents inside of
- // a ContentPane inside of a template. This allows dojoAttachPoint on widgets/nodes
- // nested inside the ContentPane to work.
- // * inherited: Object
- // Hash possibly containing dir and lang settings to be applied to
- // parsed widgets, unless there's another setting on a sub-node that overrides
- // * scope: String
- // 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.)
- // * propsThis: Object
- // If specified, "this" referenced from data-dojo-props will refer to propsThis.
- // Intended for use from the widgets-in-template feature of `dijit._Templated`
- //
- // example:
- // Parse all widgets on a page:
- // | dojo.parser.parse();
- //
- // example:
- // Parse all classes within the node with id="foo"
- // | dojo.parser.parse(dojo.byId('foo'));
- //
- // example:
- // Parse all classes in a page, but do not call .startup() on any
- // child
- // | dojo.parser.parse({ noStart: true })
- //
- // example:
- // Parse all classes in a node, but do not call .startup()
- // | dojo.parser.parse(someNode, { noStart:true });
- // | // or
- // | dojo.parser.parse({ noStart:true, rootNode: someNode });
-
- // determine the root node based on the passed arguments.
- var root;
- if(!args && rootNode && rootNode.rootNode){
- args = rootNode;
- root = args.rootNode;
- }else{
- root = rootNode;
- }
- root = root ? dojo.byId(root) : dojo.body();
- args = args || {};
-
- var attrName = (args.scope || d._scopeName) + "Type", // typically "dojoType"
- attrData = "data-" + (args.scope || d._scopeName) + "-"; // typically "data-dojo-"
-
- function scan(parent, list){
- // summary:
- // Parent is an Object representing a DOMNode, with or without a dojoType specified.
- // Scan parent's children looking for nodes with dojoType specified, storing in list[].
- // If parent has a dojoType, also collects <script type=dojo/*> children and stores in parent.scripts[].
- // parent: Object
- // Object representing the parent node, like
- // | {
- // | node: DomNode, // scan children of this node
- // | inherited: {dir: "rtl"}, // dir/lang setting inherited from above node
- // |
- // | // attributes only set if node has dojoType specified
- // | scripts: [], // empty array, put <script type=dojo/*> in here
- // | clsInfo: { cls: dijit.form.Button, ...}
- // | }
- // list: DomNode[]
- // Output array of objects (same format as parent) representing nodes to be turned into widgets
-
- // Effective dir and lang settings on parent node, either set directly or inherited from grandparent
- var inherited = dojo.clone(parent.inherited);
- dojo.forEach(["dir", "lang"], function(name){
- // TODO: what if this is a widget and dir/lang are declared in data-dojo-props?
- var val = parent.node.getAttribute(name);
- if(val){
- inherited[name] = val;
- }
- });
-
- // if parent is a widget, then search for <script type=dojo/*> tags and put them in scripts[].
- var scripts = parent.clsInfo && !parent.clsInfo.cls.prototype._noScript ? parent.scripts : null;
-
- // unless parent is a widget with the stopParser flag set, continue search for dojoType, recursively
- var recurse = (!parent.clsInfo || !parent.clsInfo.cls.prototype.stopParser) || (args && args.template);
-
- // scan parent's children looking for dojoType and <script type=dojo/*>
- for(var child = parent.node.firstChild; child; child = child.nextSibling){
- if(child.nodeType == 1){
- // FIXME: desupport dojoType in 2.0. use data-dojo-type instead
- var type, html5 = recurse && child.getAttribute(attrData + "type");
- if(html5){
- type = html5;
- }else{
- // fallback to backward compatible mode, using dojoType. remove in 2.0
- type = recurse && child.getAttribute(attrName);
- }
-
- var fastpath = html5 == type;
-
- if(type){
- // if dojoType/data-dojo-type specified, add to output array of nodes to instantiate
- var params = {
- "type": type,
- fastpath: fastpath,
- clsInfo: getClassInfo(type, fastpath), // note: won't find classes declared via dojo.Declaration
- node: child,
- scripts: [], // <script> nodes that are parent's children
- inherited: inherited // dir & lang attributes inherited from parent
- };
- list.push(params);
-
- // Recurse, collecting <script type="dojo/..."> children, and also looking for
- // descendant nodes with dojoType specified (unless the widget has the stopParser flag),
- scan(params, list);
- }else if(scripts && child.nodeName.toLowerCase() == "script"){
- // if <script type="dojo/...">, save in scripts[]
- type = child.getAttribute("type");
- if (type && /^dojo\/\w/i.test(type)) {
- scripts.push(child);
- }
- }else if(recurse){
- // Recurse, looking for grandchild nodes with dojoType specified
- scan({
- node: child,
- inherited: inherited
- }, list);
- }
- }
- }
- }
-
- // Ignore bogus entries in inherited hash like {dir: ""}
- var inherited = {};
- if(args && args.inherited){
- for(var key in args.inherited){
- if(args.inherited[key]){ inherited[key] = args.inherited[key]; }
- }
- }
-
- // Make list of all nodes on page w/dojoType specified
- var list = [];
- scan({
- node: root,
- inherited: inherited
- }, list);
-
- // go build the object instances
- var mixin = args && args.template ? {template: true} : null;
- return this.instantiate(list, mixin, args); // Array
- };
-}();
-
-//Register the parser callback. It should be the first callback
-//after the a11y test.
-
-(function(){
- var parseRunner = function(){
- if(dojo.config.parseOnLoad){
- dojo.parser.parse();
- }
- };
-
- // FIXME: need to clobber cross-dependency!!
- if(dojo.getObject("dijit.wai.onload") === dojo._loaders[0]){
- dojo._loaders.splice(1, 0, parseRunner);
- }else{
- dojo._loaders.unshift(parseRunner);
- }
-})();
-
-}
+//>>built
+define("dojo/parser",["./_base/kernel","./_base/lang","./_base/array","./_base/html","./_base/window","./_base/url","./_base/json","./aspect","./date/stamp","./query","./on","./ready"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){new Date("X");var _c={"dom-attributes-explicit":document.createElement("div").attributes.length<40};function _d(_e){return _c[_e];};_1.parser=new function(){var _f={};function _10(_11){var map={};for(var _12 in _11){if(_12.charAt(0)=="_"){continue;}map[_12.toLowerCase()]=_12;}return map;};_8.after(_2,"extend",function(){_f={};},true);var _13={};this._functionFromScript=function(_14,_15){var _16="";var _17="";var _18=(_14.getAttribute(_15+"args")||_14.getAttribute("args"));if(_18){_3.forEach(_18.split(/\s*,\s*/),function(_19,idx){_16+="var "+_19+" = arguments["+idx+"]; ";});}var _1a=_14.getAttribute("with");if(_1a&&_1a.length){_3.forEach(_1a.split(/\s*,\s*/),function(_1b){_16+="with("+_1b+"){";_17+="}";});}return new Function(_16+_14.innerHTML+_17);};this.instantiate=function(_1c,_1d,_1e){var _1f=[],_1d=_1d||{};_1e=_1e||{};var _20=(_1e.scope||_1._scopeName)+"Type",_21="data-"+(_1e.scope||_1._scopeName)+"-",_22=_21+"type",_23=_21+"props",_24=_21+"attach-point",_25=_21+"attach-event",_26=_21+"id";var _27={};_3.forEach([_23,_22,_20,_26,"jsId",_24,_25,"dojoAttachPoint","dojoAttachEvent","class","style"],function(_28){_27[_28.toLowerCase()]=_28.replace(_1e.scope,"dojo");});_3.forEach(_1c,function(obj){if(!obj){return;}var _29=obj.node||obj,_2a=_20 in _1d?_1d[_20]:obj.node?obj.type:(_29.getAttribute(_22)||_29.getAttribute(_20)),_2b=_13[_2a]||(_13[_2a]=_2.getObject(_2a)),_2c=_2b&&_2b.prototype;if(!_2b){throw new Error("Could not load class '"+_2a);}var _2d={};if(_1e.defaults){_2.mixin(_2d,_1e.defaults);}if(obj.inherited){_2.mixin(_2d,obj.inherited);}var _2e;if(_d("dom-attributes-explicit")){_2e=_29.attributes;}else{var _2f=/^input$|^img$/i.test(_29.nodeName)?_29:_29.cloneNode(false),_30=_2f.outerHTML.replace(/=[^\s"']+|="[^"]*"|='[^']*'/g,"").replace(/^\s*<[a-zA-Z0-9]*/,"").replace(/>.*$/,"");_2e=_3.map(_30.split(/\s+/),function(_31){var _32=_31.toLowerCase();return {name:_31,value:(_29.nodeName=="LI"&&_31=="value")||_32=="enctype"?_29.getAttribute(_32):_29.getAttributeNode(_32).value,specified:true};});}var i=0,_33;while(_33=_2e[i++]){if(!_33||!_33.specified){continue;}var _34=_33.name,_35=_34.toLowerCase(),_36=_33.value;if(_35 in _27){switch(_27[_35]){case "data-dojo-props":var _37=_36;break;case "data-dojo-id":case "jsId":var _38=_36;break;case "data-dojo-attach-point":case "dojoAttachPoint":_2d.dojoAttachPoint=_36;break;case "data-dojo-attach-event":case "dojoAttachEvent":_2d.dojoAttachEvent=_36;break;case "class":_2d["class"]=_29.className;break;case "style":_2d["style"]=_29.style&&_29.style.cssText;break;}}else{if(!(_34 in _2c)){var map=(_f[_2a]||(_f[_2a]=_10(_2c)));_34=map[_35]||_34;}if(_34 in _2c){switch(typeof _2c[_34]){case "string":_2d[_34]=_36;break;case "number":_2d[_34]=_36.length?Number(_36):NaN;break;case "boolean":_2d[_34]=_36.toLowerCase()!="false";break;case "function":if(_36===""||_36.search(/[^\w\.]+/i)!=-1){_2d[_34]=new Function(_36);}else{_2d[_34]=_2.getObject(_36,false)||new Function(_36);}break;default:var _39=_2c[_34];_2d[_34]=(_39&&"length" in _39)?(_36?_36.split(/\s*,\s*/):[]):(_39 instanceof Date)?(_36==""?new Date(""):_36=="now"?new Date():_9.fromISOString(_36)):(_39 instanceof _1._Url)?(_1.baseUrl+_36):_7.fromJson(_36);}}else{_2d[_34]=_36;}}}if(_37){try{_37=_7.fromJson.call(_1e.propsThis,"{"+_37+"}");_2.mixin(_2d,_37);}catch(e){throw new Error(e.toString()+" in data-dojo-props='"+_37+"'");}}_2.mixin(_2d,_1d);var _3a=obj.node?obj.scripts:(_2b&&(_2b._noScript||_2c._noScript)?[]:_a("> script[type^='dojo/']",_29));var _3b=[],_3c=[],_3d=[],on=[];if(_3a){for(i=0;i<_3a.length;i++){var _3e=_3a[i];_29.removeChild(_3e);var _3f=(_3e.getAttribute(_21+"event")||_3e.getAttribute("event")),_40=_3e.getAttribute(_21+"prop"),_2a=_3e.getAttribute("type"),nf=this._functionFromScript(_3e,_21);if(_3f){if(_2a=="dojo/connect"){_3b.push({event:_3f,func:nf});}else{if(_2a=="dojo/on"){on.push({event:_3f,func:nf});}else{_2d[_3f]=nf;}}}else{if(_2a=="dojo/watch"){_3d.push({prop:_40,func:nf});}else{_3c.push(nf);}}}}var _41=_2b.markupFactory||_2c.markupFactory;var _42=_41?_41(_2d,_29,_2b):new _2b(_2d,_29);_1f.push(_42);if(_38){_2.setObject(_38,_42);}for(i=0;i<_3b.length;i++){_8.after(_42,_3b[i].event,_1.hitch(_42,_3b[i].func),true);}for(i=0;i<_3c.length;i++){_3c[i].call(_42);}for(i=0;i<_3d.length;i++){_42.watch(_3d[i].prop,_3d[i].func);}for(i=0;i<on.length;i++){_b(_42,on[i].event,on[i].func);}},this);if(!_1d._started){_3.forEach(_1f,function(_43){if(!_1e.noStart&&_43&&_2.isFunction(_43.startup)&&!_43._started){_43.startup();}});}return _1f;};this.parse=function(_44,_45){var _46;if(!_45&&_44&&_44.rootNode){_45=_44;_46=_45.rootNode;}else{_46=_44;}_46=_46?_4.byId(_46):_5.body();_45=_45||{};var _47=(_45.scope||_1._scopeName)+"Type",_48="data-"+(_45.scope||_1._scopeName)+"-",_49=_48+"type",_4a=_48+"textdir";var _4b=[];var _4c=_46.firstChild;var _4d=_45&&_45.inherited;if(!_4d){function _4e(_4f,_50){return (_4f.getAttribute&&_4f.getAttribute(_50))||(_4f!==_5.doc&&_4f!==_5.doc.documentElement&&_4f.parentNode?_4e(_4f.parentNode,_50):null);};_4d={dir:_4e(_46,"dir"),lang:_4e(_46,"lang"),textDir:_4e(_46,_4a)};for(var key in _4d){if(!_4d[key]){delete _4d[key];}}}var _51={inherited:_4d};var _52;var _53;function _54(_55){if(!_55.inherited){_55.inherited={};var _56=_55.node,_57=_54(_55.parent);var _58={dir:_56.getAttribute("dir")||_57.dir,lang:_56.getAttribute("lang")||_57.lang,textDir:_56.getAttribute(_4a)||_57.textDir};for(var key in _58){if(_58[key]){_55.inherited[key]=_58[key];}}}return _55.inherited;};while(true){if(!_4c){if(!_51||!_51.node){break;}_4c=_51.node.nextSibling;_52=_51.scripts;_53=false;_51=_51.parent;continue;}if(_4c.nodeType!=1){_4c=_4c.nextSibling;continue;}if(_52&&_4c.nodeName.toLowerCase()=="script"){_59=_4c.getAttribute("type");if(_59&&/^dojo\/\w/i.test(_59)){_52.push(_4c);}_4c=_4c.nextSibling;continue;}if(_53){_4c=_4c.nextSibling;continue;}var _59=_4c.getAttribute(_49)||_4c.getAttribute(_47);var _5a=_4c.firstChild;if(!_59&&(!_5a||(_5a.nodeType==3&&!_5a.nextSibling))){_4c=_4c.nextSibling;continue;}var _5b={node:_4c,scripts:_52,parent:_51};var _5c=_59&&(_13[_59]||(_13[_59]=_2.getObject(_59))),_5d=_5c&&!_5c.prototype._noScript?[]:null;if(_59){_4b.push({"type":_59,node:_4c,scripts:_5d,inherited:_54(_5b)});}_4c=_5a;_52=_5d;_53=_5c&&_5c.prototype.stopParser&&!(_45&&_45.template);_51=_5b;}var _5e=_45&&_45.template?{template:true}:null;return this.instantiate(_4b,_5e,_45);};}();if(_1.config.parseOnLoad){_1.ready(100,_1.parser,"parse");}return _1.parser;}); \ No newline at end of file
diff --git a/lib/dojo/parser.js.uncompressed.js b/lib/dojo/parser.js.uncompressed.js
new file mode 100644
index 000000000..6d340fc24
--- /dev/null
+++ b/lib/dojo/parser.js.uncompressed.js
@@ -0,0 +1,594 @@
+define(
+ "dojo/parser", ["./_base/kernel", "./_base/lang", "./_base/array", "./_base/html", "./_base/window", "./_base/url",
+ "./_base/json", "./aspect", "./date/stamp", "./query", "./on", "./ready"],
+ function(dojo, dlang, darray, dhtml, dwindow, _Url, djson, aspect, dates, query, don){
+
+// module:
+// dojo/parser
+// summary:
+// The Dom/Widget parsing package
+
+new Date("X"); // workaround for #11279, new Date("") == NaN
+
+var features = {
+ // Feature detection for when node.attributes only lists the attributes specified in the markup
+ // rather than old IE/quirks behavior where it lists every default value too
+ "dom-attributes-explicit": document.createElement("div").attributes.length < 40
+};
+function has(feature){
+ return features[feature];
+}
+
+
+dojo.parser = new function(){
+ // summary:
+ // The Dom/Widget parsing package
+
+ var _nameMap = {
+ // Map from widget name (ex: "dijit.form.Button") to structure mapping
+ // lowercase version of attribute names to the version in the widget ex:
+ // {
+ // label: "label",
+ // onclick: "onClick"
+ // }
+ };
+ function getNameMap(proto){
+ // summary:
+ // Returns map from lowercase name to attribute name in class, ex: {onclick: "onClick"}
+ var map = {};
+ for(var name in proto){
+ if(name.charAt(0)=="_"){ continue; } // skip internal properties
+ map[name.toLowerCase()] = name;
+ }
+ return map;
+ }
+ // Widgets like BorderContainer add properties to _Widget via dojo.extend().
+ // If BorderContainer is loaded after _Widget's parameter list has been cached,
+ // we need to refresh that parameter list (for _Widget and all widgets that extend _Widget).
+ aspect.after(dlang, "extend", function(){
+ _nameMap = {};
+ }, true);
+
+ // Map from widget name (ex: "dijit.form.Button") to constructor
+ var _ctorMap = {};
+
+ this._functionFromScript = function(script, attrData){
+ // summary:
+ // Convert a <script type="dojo/method" args="a, b, c"> ... </script>
+ // into a function
+ // script: DOMNode
+ // The <script> DOMNode
+ // attrData: String
+ // For HTML5 compliance, searches for attrData + "args" (typically
+ // "data-dojo-args") instead of "args"
+ var preamble = "";
+ var suffix = "";
+ var argsStr = (script.getAttribute(attrData + "args") || script.getAttribute("args"));
+ if(argsStr){
+ darray.forEach(argsStr.split(/\s*,\s*/), function(part, idx){
+ preamble += "var "+part+" = arguments["+idx+"]; ";
+ });
+ }
+ var withStr = script.getAttribute("with");
+ if(withStr && withStr.length){
+ darray.forEach(withStr.split(/\s*,\s*/), function(part){
+ preamble += "with("+part+"){";
+ suffix += "}";
+ });
+ }
+ return new Function(preamble+script.innerHTML+suffix);
+ };
+
+ this.instantiate = /*====== dojo.parser.instantiate= ======*/function(nodes, mixin, args){
+ // summary:
+ // Takes array of nodes, and turns them into class instances and
+ // potentially calls a startup method to allow them to connect with
+ // any children.
+ // nodes: Array
+ // Array of nodes or objects like
+ // | {
+ // | type: "dijit.form.Button",
+ // | node: DOMNode,
+ // | scripts: [ ... ], // array of <script type="dojo/..."> children of node
+ // | inherited: { ... } // settings inherited from ancestors like dir, theme, etc.
+ // | }
+ // mixin: Object?
+ // An object that will be mixed in with each node in the array.
+ // Values in the mixin will override values in the node, if they
+ // exist.
+ // args: Object?
+ // An object used to hold kwArgs for instantiation.
+ // See parse.args argument for details.
+
+ var thelist = [],
+ mixin = mixin||{};
+ args = args||{};
+
+ // Precompute names of special attributes we are looking for
+ // TODO: for 2.0 default to data-dojo- regardless of scopeName (or maybe scopeName won't exist in 2.0)
+ var dojoType = (args.scope || dojo._scopeName) + "Type", // typically "dojoType"
+ attrData = "data-" + (args.scope || dojo._scopeName) + "-",// typically "data-dojo-"
+ dataDojoType = attrData + "type", // typically "data-dojo-type"
+ dataDojoProps = attrData + "props", // typically "data-dojo-props"
+ dataDojoAttachPoint = attrData + "attach-point",
+ dataDojoAttachEvent = attrData + "attach-event",
+ dataDojoId = attrData + "id";
+
+ // And make hash to quickly check if a given attribute is special, and to map the name to something friendly
+ var specialAttrs = {};
+ darray.forEach([dataDojoProps, dataDojoType, dojoType, dataDojoId, "jsId", dataDojoAttachPoint,
+ dataDojoAttachEvent, "dojoAttachPoint", "dojoAttachEvent", "class", "style"], function(name){
+ specialAttrs[name.toLowerCase()] = name.replace(args.scope, "dojo");
+ });
+
+ darray.forEach(nodes, function(obj){
+ if(!obj){ return; }
+
+ var node = obj.node || obj,
+ type = dojoType in mixin ? mixin[dojoType] : obj.node ? obj.type : (node.getAttribute(dataDojoType) || node.getAttribute(dojoType)),
+ ctor = _ctorMap[type] || (_ctorMap[type] = dlang.getObject(type)),
+ proto = ctor && ctor.prototype;
+ if(!ctor){
+ throw new Error("Could not load class '" + type);
+ }
+
+ // Setup hash to hold parameter settings for this widget. Start with the parameter
+ // settings inherited from ancestors ("dir" and "lang").
+ // Inherited setting may later be overridden by explicit settings on node itself.
+ var params = {};
+
+ if(args.defaults){
+ // settings for the document itself (or whatever subtree is being parsed)
+ dlang.mixin(params, args.defaults);
+ }
+ if(obj.inherited){
+ // settings from dir=rtl or lang=... on a node above this node
+ dlang.mixin(params, obj.inherited);
+ }
+
+ // Get list of attributes explicitly listed in the markup
+ var attributes;
+ if(has("dom-attributes-explicit")){
+ // Standard path to get list of user specified attributes
+ attributes = node.attributes;
+ }else{
+ // Special path for IE, avoid (sometimes >100) bogus entries in node.attributes
+ var clone = /^input$|^img$/i.test(node.nodeName) ? node : node.cloneNode(false),
+ attrs = clone.outerHTML.replace(/=[^\s"']+|="[^"]*"|='[^']*'/g, "").replace(/^\s*<[a-zA-Z0-9]*/, "").replace(/>.*$/, "");
+
+ attributes = darray.map(attrs.split(/\s+/), function(name){
+ var lcName = name.toLowerCase();
+ return {
+ name: name,
+ // getAttribute() doesn't work for button.value, returns innerHTML of button.
+ // but getAttributeNode().value doesn't work for the form.encType or li.value
+ value: (node.nodeName == "LI" && name == "value") || lcName == "enctype" ?
+ node.getAttribute(lcName) : node.getAttributeNode(lcName).value,
+ specified: true
+ };
+ });
+ }
+
+ // Read in attributes and process them, including data-dojo-props, data-dojo-type,
+ // dojoAttachPoint, etc., as well as normal foo=bar attributes.
+ var i=0, item;
+ while(item = attributes[i++]){
+ if(!item || !item.specified){
+ continue;
+ }
+
+ var name = item.name,
+ lcName = name.toLowerCase(),
+ value = item.value;
+
+ if(lcName in specialAttrs){
+ switch(specialAttrs[lcName]){
+
+ // Data-dojo-props. Save for later to make sure it overrides direct foo=bar settings
+ case "data-dojo-props":
+ var extra = value;
+ break;
+
+ // data-dojo-id or jsId. TODO: drop jsId in 2.0
+ case "data-dojo-id":
+ case "jsId":
+ var jsname = value;
+ break;
+
+ // For the benefit of _Templated
+ case "data-dojo-attach-point":
+ case "dojoAttachPoint":
+ params.dojoAttachPoint = value;
+ break;
+ case "data-dojo-attach-event":
+ case "dojoAttachEvent":
+ params.dojoAttachEvent = value;
+ break;
+
+ // Special parameter handling needed for IE
+ case "class":
+ params["class"] = node.className;
+ break;
+ case "style":
+ params["style"] = node.style && node.style.cssText;
+ break;
+ }
+ }else{
+ // Normal attribute, ex: value="123"
+
+ // Find attribute in widget corresponding to specified name.
+ // May involve case conversion, ex: onclick --> onClick
+ if(!(name in proto)){
+ var map = (_nameMap[type] || (_nameMap[type] = getNameMap(proto)));
+ name = map[lcName] || name;
+ }
+
+ // Set params[name] to value, doing type conversion
+ if(name in proto){
+ switch(typeof proto[name]){
+ case "string":
+ params[name] = value;
+ break;
+ case "number":
+ params[name] = value.length ? Number(value) : NaN;
+ break;
+ case "boolean":
+ // for checked/disabled value might be "" or "checked". interpret as true.
+ params[name] = value.toLowerCase() != "false";
+ break;
+ case "function":
+ if(value === "" || value.search(/[^\w\.]+/i) != -1){
+ // The user has specified some text for a function like "return x+5"
+ params[name] = new Function(value);
+ }else{
+ // The user has specified the name of a function like "myOnClick"
+ // or a single word function "return"
+ params[name] = dlang.getObject(value, false) || new Function(value);
+ }
+ break;
+ default:
+ var pVal = proto[name];
+ params[name] =
+ (pVal && "length" in pVal) ? (value ? value.split(/\s*,\s*/) : []) : // array
+ (pVal instanceof Date) ?
+ (value == "" ? new Date("") : // the NaN of dates
+ value == "now" ? new Date() : // current date
+ dates.fromISOString(value)) :
+ (pVal instanceof dojo._Url) ? (dojo.baseUrl + value) :
+ djson.fromJson(value);
+ }
+ }else{
+ params[name] = value;
+ }
+ }
+ }
+
+ // Mix things found in data-dojo-props into the params, overriding any direct settings
+ if(extra){
+ try{
+ extra = djson.fromJson.call(args.propsThis, "{" + extra + "}");
+ dlang.mixin(params, extra);
+ }catch(e){
+ // give the user a pointer to their invalid parameters. FIXME: can we kill this in production?
+ throw new Error(e.toString() + " in data-dojo-props='" + extra + "'");
+ }
+ }
+
+ // Any parameters specified in "mixin" override everything else.
+ dlang.mixin(params, mixin);
+
+ var scripts = obj.node ? obj.scripts : (ctor && (ctor._noScript || proto._noScript) ? [] :
+ query("> script[type^='dojo/']", node));
+
+ // Process <script type="dojo/*"> script tags
+ // <script type="dojo/method" event="foo"> tags are added to params, and passed to
+ // the widget on instantiation.
+ // <script type="dojo/method"> tags (with no event) are executed after instantiation
+ // <script type="dojo/connect" data-dojo-event="foo"> tags are dojo.connected after instantiation
+ // <script type="dojo/watch" data-dojo-prop="foo"> tags are dojo.watch after instantiation
+ // <script type="dojo/on" data-dojo-event="foo"> tags are dojo.on after instantiation
+ // note: dojo/* script tags cannot exist in self closing widgets, like <input />
+ var connects = [], // functions to connect after instantiation
+ calls = [], // functions to call after instantiation
+ watch = [], //functions to watch after instantiation
+ on = []; //functions to on after instantiation
+
+ if(scripts){
+ for(i=0; i<scripts.length; i++){
+ var script = scripts[i];
+ node.removeChild(script);
+ // FIXME: drop event="" support in 2.0. use data-dojo-event="" instead
+ var event = (script.getAttribute(attrData + "event") || script.getAttribute("event")),
+ prop = script.getAttribute(attrData + "prop"),
+ type = script.getAttribute("type"),
+ nf = this._functionFromScript(script, attrData);
+ if(event){
+ if(type == "dojo/connect"){
+ connects.push({event: event, func: nf});
+ }else if(type == "dojo/on"){
+ on.push({event: event, func: nf});
+ }else{
+ params[event] = nf;
+ }
+ }else if(type == "dojo/watch"){
+ watch.push({prop: prop, func: nf});
+ }else{
+ calls.push(nf);
+ }
+ }
+ }
+
+ // create the instance
+ var markupFactory = ctor.markupFactory || proto.markupFactory;
+ var instance = markupFactory ? markupFactory(params, node, ctor) : new ctor(params, node);
+ thelist.push(instance);
+
+ // map it to the JS namespace if that makes sense
+ if(jsname){
+ dlang.setObject(jsname, instance);
+ }
+
+ // process connections and startup functions
+ for(i=0; i<connects.length; i++){
+ aspect.after(instance, connects[i].event, dojo.hitch(instance, connects[i].func), true);
+ }
+ for(i=0; i<calls.length; i++){
+ calls[i].call(instance);
+ }
+ for(i=0; i<watch.length; i++){
+ instance.watch(watch[i].prop, watch[i].func);
+ }
+ for(i=0; i<on.length; i++){
+ don(instance, on[i].event, on[i].func);
+ }
+ }, this);
+
+ // Call startup on each top level instance if it makes sense (as for
+ // widgets). Parent widgets will recursively call startup on their
+ // (non-top level) children
+ if(!mixin._started){
+ darray.forEach(thelist, function(instance){
+ if( !args.noStart && instance &&
+ dlang.isFunction(instance.startup) &&
+ !instance._started
+ ){
+ instance.startup();
+ }
+ });
+ }
+ return thelist;
+ };
+
+ this.parse = /*====== dojo.parser.parse= ======*/ function(rootNode, args){
+ // summary:
+ // Scan the DOM for class instances, and instantiate them.
+ //
+ // description:
+ // Search specified node (or root node) recursively for class instances,
+ // and instantiate them. Searches for either data-dojo-type="Class" or
+ // dojoType="Class" where "Class" is a a fully qualified class name,
+ // like `dijit.form.Button`
+ //
+ // Using `data-dojo-type`:
+ // Attributes using can be mixed into the parameters used to instantiate the
+ // Class by using a `data-dojo-props` attribute on the node being converted.
+ // `data-dojo-props` should be a string attribute to be converted from JSON.
+ //
+ // Using `dojoType`:
+ // Attributes are read from the original domNode and converted to appropriate
+ // types by looking up the Class prototype values. This is the default behavior
+ // from Dojo 1.0 to Dojo 1.5. `dojoType` support is deprecated, and will
+ // go away in Dojo 2.0.
+ //
+ // rootNode: DomNode?
+ // A default starting root node from which to start the parsing. Can be
+ // omitted, defaulting to the entire document. If omitted, the `args`
+ // object can be passed in this place. If the `args` object has a
+ // `rootNode` member, that is used.
+ //
+ // args: Object
+ // a kwArgs object passed along to instantiate()
+ //
+ // * noStart: Boolean?
+ // when set will prevent the parser from calling .startup()
+ // when locating the nodes.
+ // * rootNode: DomNode?
+ // identical to the function's `rootNode` argument, though
+ // allowed to be passed in via this `args object.
+ // * template: Boolean
+ // If true, ignores ContentPane's stopParser flag and parses contents inside of
+ // a ContentPane inside of a template. This allows dojoAttachPoint on widgets/nodes
+ // nested inside the ContentPane to work.
+ // * inherited: Object
+ // Hash possibly containing dir and lang settings to be applied to
+ // parsed widgets, unless there's another setting on a sub-node that overrides
+ // * scope: String
+ // 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.)
+ // * propsThis: Object
+ // If specified, "this" referenced from data-dojo-props will refer to propsThis.
+ // Intended for use from the widgets-in-template feature of `dijit._WidgetsInTemplateMixin`
+ //
+ // example:
+ // Parse all widgets on a page:
+ // | dojo.parser.parse();
+ //
+ // example:
+ // Parse all classes within the node with id="foo"
+ // | dojo.parser.parse(dojo.byId('foo'));
+ //
+ // example:
+ // Parse all classes in a page, but do not call .startup() on any
+ // child
+ // | dojo.parser.parse({ noStart: true })
+ //
+ // example:
+ // Parse all classes in a node, but do not call .startup()
+ // | dojo.parser.parse(someNode, { noStart:true });
+ // | // or
+ // | dojo.parser.parse({ noStart:true, rootNode: someNode });
+
+ // determine the root node based on the passed arguments.
+ var root;
+ if(!args && rootNode && rootNode.rootNode){
+ args = rootNode;
+ root = args.rootNode;
+ }else{
+ root = rootNode;
+ }
+ root = root ? dhtml.byId(root) : dwindow.body();
+ args = args || {};
+
+ var dojoType = (args.scope || dojo._scopeName) + "Type", // typically "dojoType"
+ attrData = "data-" + (args.scope || dojo._scopeName) + "-", // typically "data-dojo-"
+ dataDojoType = attrData + "type", // typically "data-dojo-type"
+ dataDojoTextDir = attrData + "textdir"; // typically "data-dojo-textdir"
+
+ // List of all nodes on page w/dojoType specified
+ var list = [];
+
+ // Info on DOMNode currently being processed
+ var node = root.firstChild;
+
+ // Info on parent of DOMNode currently being processed
+ // - inherited: dir, lang, and textDir setting of parent, or inherited by parent
+ // - parent: pointer to identical structure for my parent (or null if no parent)
+ // - scripts: if specified, collects <script type="dojo/..."> type nodes from children
+ var inherited = args && args.inherited;
+ if(!inherited){
+ function findAncestorAttr(node, attr){
+ return (node.getAttribute && node.getAttribute(attr)) ||
+ (node !== dwindow.doc && node !== dwindow.doc.documentElement && node.parentNode ? findAncestorAttr(node.parentNode, attr) : null);
+ }
+ inherited = {
+ dir: findAncestorAttr(root, "dir"),
+ lang: findAncestorAttr(root, "lang"),
+ textDir: findAncestorAttr(root, dataDojoTextDir)
+ };
+ for(var key in inherited){
+ if(!inherited[key]){ delete inherited[key]; }
+ }
+ }
+ var parent = {
+ inherited: inherited
+ };
+
+ // For collecting <script type="dojo/..."> type nodes (when null, we don't need to collect)
+ var scripts;
+
+ // when true, only look for <script type="dojo/..."> tags, and don't recurse to children
+ var scriptsOnly;
+
+ function getEffective(parent){
+ // summary:
+ // Get effective dir, lang, textDir settings for specified obj
+ // (matching "parent" object structure above), and do caching.
+ // Take care not to return null entries.
+ if(!parent.inherited){
+ parent.inherited = {};
+ var node = parent.node,
+ grandparent = getEffective(parent.parent);
+ var inherited = {
+ dir: node.getAttribute("dir") || grandparent.dir,
+ lang: node.getAttribute("lang") || grandparent.lang,
+ textDir: node.getAttribute(dataDojoTextDir) || grandparent.textDir
+ };
+ for(var key in inherited){
+ if(inherited[key]){
+ parent.inherited[key] = inherited[key];
+ }
+ }
+ }
+ return parent.inherited;
+ }
+
+ // DFS on DOM tree, collecting nodes with data-dojo-type specified.
+ while(true){
+ if(!node){
+ // Finished this level, continue to parent's next sibling
+ if(!parent || !parent.node){
+ break;
+ }
+ node = parent.node.nextSibling;
+ scripts = parent.scripts;
+ scriptsOnly = false;
+ parent = parent.parent;
+ continue;
+ }
+
+ if(node.nodeType != 1){
+ // Text or comment node, skip to next sibling
+ node = node.nextSibling;
+ continue;
+ }
+
+ if(scripts && node.nodeName.toLowerCase() == "script"){
+ // Save <script type="dojo/..."> for parent, then continue to next sibling
+ type = node.getAttribute("type");
+ if(type && /^dojo\/\w/i.test(type)){
+ scripts.push(node);
+ }
+ node = node.nextSibling;
+ continue;
+ }
+ if(scriptsOnly){
+ node = node.nextSibling;
+ continue;
+ }
+
+ // Check for data-dojo-type attribute, fallback to backward compatible dojoType
+ var type = node.getAttribute(dataDojoType) || node.getAttribute(dojoType);
+
+ // Short circuit for leaf nodes containing nothing [but text]
+ var firstChild = node.firstChild;
+ if(!type && (!firstChild || (firstChild.nodeType == 3 && !firstChild.nextSibling))){
+ node = node.nextSibling;
+ continue;
+ }
+
+ // Setup data structure to save info on current node for when we return from processing descendant nodes
+ var current = {
+ node: node,
+ scripts: scripts,
+ parent: parent
+ };
+
+ // If dojoType/data-dojo-type specified, add to output array of nodes to instantiate
+ var ctor = type && (_ctorMap[type] || (_ctorMap[type] = dlang.getObject(type))), // note: won't find classes declared via dojo.Declaration
+ childScripts = ctor && !ctor.prototype._noScript ? [] : null; // <script> nodes that are parent's children
+ if(type){
+ list.push({
+ "type": type,
+ node: node,
+ scripts: childScripts,
+ inherited: getEffective(current) // dir & lang settings for current node, explicit or inherited
+ });
+ }
+
+ // Recurse, collecting <script type="dojo/..."> children, and also looking for
+ // descendant nodes with dojoType specified (unless the widget has the stopParser flag).
+ // When finished with children, go to my next sibling.
+ node = firstChild;
+ scripts = childScripts;
+ scriptsOnly = ctor && ctor.prototype.stopParser && !(args && args.template);
+ parent = current;
+
+ }
+
+ // go build the object instances
+ var mixin = args && args.template ? {template: true} : null;
+ return this.instantiate(list, mixin, args); // Array
+ };
+}();
+
+
+//Register the parser callback. It should be the first callback
+//after the a11y test.
+if(dojo.config.parseOnLoad){
+ dojo.ready(100, dojo.parser, "parse");
+}
+
+return dojo.parser;
+});
diff --git a/lib/dojo/query.js b/lib/dojo/query.js
new file mode 100644
index 000000000..33245dbac
--- /dev/null
+++ b/lib/dojo/query.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/query",["./_base/kernel","./has","./dom","./on","./_base/array","./_base/lang","./selector/_loader","./selector/_loader!default"],function(_1,_2,_3,on,_4,_5,_6,_7){"use strict";_2.add("array-extensible",function(){return _5.delegate([],{length:1}).length==1&&!_2("bug-for-in-skips-shadowed");});var ap=Array.prototype,_8=ap.slice,_9=ap.concat,_a=_4.forEach;var _b=function(a,_c,_d){var _e=new (_d||this._NodeListCtor||nl)(a);return _c?_e._stash(_c):_e;};var _f=function(f,a,o){a=[0].concat(_8.call(a,0));o=o||_1.global;return function(_10){a[0]=_10;return f.apply(o,a);};};var _11=function(f,o){return function(){this.forEach(_f(f,arguments,o));return this;};};var _12=function(f,o){return function(){return this.map(_f(f,arguments,o));};};var _13=function(f,o){return function(){return this.filter(_f(f,arguments,o));};};var _14=function(f,g,o){return function(){var a=arguments,_15=_f(f,a,o);if(g.call(o||_1.global,a)){return this.map(_15);}this.forEach(_15);return this;};};var _16=function(_17){var _18=this instanceof nl&&_2("array-extensible");if(typeof _17=="number"){_17=Array(_17);}var _19=(_17&&"length" in _17)?_17:arguments;if(_18||!_19.sort){var _1a=_18?this:[],l=_1a.length=_19.length;for(var i=0;i<l;i++){_1a[i]=_19[i];}if(_18){return _1a;}_19=_1a;}_5._mixin(_19,nlp);_19._NodeListCtor=function(_1b){return nl(_1b);};return _19;};var nl=_16,nlp=nl.prototype=_2("array-extensible")?[]:{};nl._wrap=nlp._wrap=_b;nl._adaptAsMap=_12;nl._adaptAsForEach=_11;nl._adaptAsFilter=_13;nl._adaptWithCondition=_14;_a(["slice","splice"],function(_1c){var f=ap[_1c];nlp[_1c]=function(){return this._wrap(f.apply(this,arguments),_1c=="slice"?this:null);};});_a(["indexOf","lastIndexOf","every","some"],function(_1d){var f=_4[_1d];nlp[_1d]=function(){return f.apply(_1,[this].concat(_8.call(arguments,0)));};});_5.extend(_16,{constructor:nl,_NodeListCtor:nl,toString:function(){return this.join(",");},_stash:function(_1e){this._parent=_1e;return this;},on:function(_1f,_20){var _21=this.map(function(_22){return on(_22,_1f,_20);});_21.remove=function(){for(var i=0;i<_21.length;i++){_21[i].remove();}};return _21;},end:function(){if(this._parent){return this._parent;}else{return new this._NodeListCtor(0);}},concat:function(_23){var t=_5.isArray(this)?this:_8.call(this,0),m=_4.map(arguments,function(a){return a&&!_5.isArray(a)&&(typeof _16!="undefined"&&a.constructor===_16||a.constructor===this._NodeListCtor)?_8.call(a,0):a;});return this._wrap(_9.apply(t,m),this);},map:function(_24,obj){return this._wrap(_4.map(this,_24,obj),this);},forEach:function(_25,_26){_a(this,_25,_26);return this;},filter:function(_27){var a=arguments,_28=this,_29=0;if(typeof _27=="string"){_28=_2a._filterResult(this,a[0]);if(a.length==1){return _28._stash(this);}_29=1;}return this._wrap(_4.filter(_28,a[_29],a[_29+1]),this);},instantiate:function(_2b,_2c){var c=_5.isFunction(_2b)?_2b:_5.getObject(_2b);_2c=_2c||{};return this.forEach(function(_2d){new c(_2c,_2d);});},at:function(){var t=new this._NodeListCtor(0);_a(arguments,function(i){if(i<0){i=this.length+i;}if(this[i]){t.push(this[i]);}},this);return t._stash(this);}});function _2e(_2f,_30){var _31=function(_32,_33){if(typeof _33=="string"){_33=_3.byId(_33);if(!_33){return new _30([]);}}var _34=typeof _32=="string"?_2f(_32,_33):_32.orphan?_32:[_32];if(_34.orphan){return _34;}return new _30(_34);};_31.matches=_2f.match||function(_35,_36,_37){return _31.filter([_35],_36,_37).length>0;};_31.filter=_2f.filter||function(_38,_39,_3a){return _31(_39,_3a).filter(function(_3b){return _4.indexOf(_38,_3b)>-1;});};if(typeof _2f!="function"){var _3c=_2f.search;_2f=function(_3d,_3e){return _3c(_3e||document,_3d);};}return _31;};var _2a=_2e(_7,_16);_1.query=_2e(_7,function(_3f){return _16(_3f);});_2a.load=function(id,_40,_41,_42){_6.load(id,_40,function(_43){_41(_2e(_43,_16));});};_1._filterQueryResult=_2a._filterResult=function(_44,_45,_46){return new _16(_2a.filter(_44,_45,_46));};_1.NodeList=_2a.NodeList=_16;return _2a;}); \ No newline at end of file
diff --git a/lib/dojo/query.js.uncompressed.js b/lib/dojo/query.js.uncompressed.js
new file mode 100644
index 000000000..3fc66151d
--- /dev/null
+++ b/lib/dojo/query.js.uncompressed.js
@@ -0,0 +1,713 @@
+define("dojo/query", ["./_base/kernel", "./has", "./dom", "./on", "./_base/array", "./_base/lang", "./selector/_loader", "./selector/_loader!default"],
+ function(dojo, has, dom, on, array, lang, loader, defaultEngine){
+"use strict";
+
+ has.add("array-extensible", function(){
+ // test to see if we can extend an array (not supported in old IE)
+ return lang.delegate([], {length: 1}).length == 1 && !has("bug-for-in-skips-shadowed");
+ });
+
+ var ap = Array.prototype, aps = ap.slice, apc = ap.concat, forEach = array.forEach;
+
+ var tnl = function(/*Array*/ a, /*dojo.NodeList?*/ parent, /*Function?*/ NodeListCtor){
+ // summary:
+ // decorate an array to make it look like a `dojo.NodeList`.
+ // a:
+ // Array of nodes to decorate.
+ // parent:
+ // An optional parent NodeList that generated the current
+ // list of nodes. Used to call _stash() so the parent NodeList
+ // can be accessed via end() later.
+ // NodeListCtor:
+ // An optional constructor function to use for any
+ // new NodeList calls. This allows a certain chain of
+ // NodeList calls to use a different object than dojo.NodeList.
+ var nodeList = new (NodeListCtor || this._NodeListCtor || nl)(a);
+ return parent ? nodeList._stash(parent) : nodeList;
+ };
+
+ var loopBody = function(f, a, o){
+ a = [0].concat(aps.call(a, 0));
+ o = o || dojo.global;
+ return function(node){
+ a[0] = node;
+ return f.apply(o, a);
+ };
+ };
+
+ // adapters
+
+ var adaptAsForEach = function(f, o){
+ // summary:
+ // adapts a single node function to be used in the forEach-type
+ // actions. The initial object is returned from the specialized
+ // function.
+ // f: Function
+ // a function to adapt
+ // o: Object?
+ // an optional context for f
+ return function(){
+ this.forEach(loopBody(f, arguments, o));
+ return this; // Object
+ };
+ };
+
+ var adaptAsMap = function(f, o){
+ // summary:
+ // adapts a single node function to be used in the map-type
+ // actions. The return is a new array of values, as via `dojo.map`
+ // f: Function
+ // a function to adapt
+ // o: Object?
+ // an optional context for f
+ return function(){
+ return this.map(loopBody(f, arguments, o));
+ };
+ };
+
+ var adaptAsFilter = function(f, o){
+ // summary:
+ // adapts a single node function to be used in the filter-type actions
+ // f: Function
+ // a function to adapt
+ // o: Object?
+ // an optional context for f
+ return function(){
+ return this.filter(loopBody(f, arguments, o));
+ };
+ };
+
+ var adaptWithCondition = function(f, g, o){
+ // summary:
+ // adapts a single node function to be used in the map-type
+ // actions, behaves like forEach() or map() depending on arguments
+ // f: Function
+ // a function to adapt
+ // g: Function
+ // a condition function, if true runs as map(), otherwise runs as forEach()
+ // o: Object?
+ // an optional context for f and g
+ return function(){
+ var a = arguments, body = loopBody(f, a, o);
+ if(g.call(o || dojo.global, a)){
+ return this.map(body); // self
+ }
+ this.forEach(body);
+ return this; // self
+ };
+ };
+
+ var NodeList = function(array){
+ // summary:
+ // dojo.NodeList is an of Array-like object which adds syntactic
+ // sugar for chaining, common iteration operations, animation, and
+ // node manipulation. NodeLists are most often returned as the
+ // result of dojo.query() calls.
+ // description:
+ // dojo.NodeList instances provide many utilities that reflect
+ // core Dojo APIs for Array iteration and manipulation, DOM
+ // manipulation, and event handling. Instead of needing to dig up
+ // functions in the dojo.* namespace, NodeLists generally make the
+ // full power of Dojo available for DOM manipulation tasks in a
+ // simple, chainable way.
+ // example:
+ // create a node list from a node
+ // | new dojo.NodeList(dojo.byId("foo"));
+ // example:
+ // get a NodeList from a CSS query and iterate on it
+ // | var l = dojo.query(".thinger");
+ // | l.forEach(function(node, index, nodeList){
+ // | console.log(index, node.innerHTML);
+ // | });
+ // example:
+ // use native and Dojo-provided array methods to manipulate a
+ // NodeList without needing to use dojo.* functions explicitly:
+ // | var l = dojo.query(".thinger");
+ // | // since NodeLists are real arrays, they have a length
+ // | // property that is both readable and writable and
+ // | // push/pop/shift/unshift methods
+ // | console.log(l.length);
+ // | l.push(dojo.create("span"));
+ // |
+ // | // dojo's normalized array methods work too:
+ // | console.log( l.indexOf(dojo.byId("foo")) );
+ // | // ...including the special "function as string" shorthand
+ // | console.log( l.every("item.nodeType == 1") );
+ // |
+ // | // NodeLists can be [..] indexed, or you can use the at()
+ // | // function to get specific items wrapped in a new NodeList:
+ // | var node = l[3]; // the 4th element
+ // | var newList = l.at(1, 3); // the 2nd and 4th elements
+ // example:
+ // the style functions you expect are all there too:
+ // | // style() as a getter...
+ // | var borders = dojo.query(".thinger").style("border");
+ // | // ...and as a setter:
+ // | dojo.query(".thinger").style("border", "1px solid black");
+ // | // class manipulation
+ // | dojo.query("li:nth-child(even)").addClass("even");
+ // | // even getting the coordinates of all the items
+ // | var coords = dojo.query(".thinger").coords();
+ // example:
+ // DOM manipulation functions from the dojo.* namespace area also
+ // available:
+ // | // remove all of the elements in the list from their
+ // | // parents (akin to "deleting" them from the document)
+ // | dojo.query(".thinger").orphan();
+ // | // place all elements in the list at the front of #foo
+ // | dojo.query(".thinger").place("foo", "first");
+ // example:
+ // Event handling couldn't be easier. `dojo.connect` is mapped in,
+ // and shortcut handlers are provided for most DOM events:
+ // | // like dojo.connect(), but with implicit scope
+ // | dojo.query("li").connect("onclick", console, "log");
+ // |
+ // | // many common event handlers are already available directly:
+ // | dojo.query("li").onclick(console, "log");
+ // | var toggleHovered = dojo.hitch(dojo, "toggleClass", "hovered");
+ // | dojo.query("p")
+ // | .onmouseenter(toggleHovered)
+ // | .onmouseleave(toggleHovered);
+ // example:
+ // chainability is a key advantage of NodeLists:
+ // | dojo.query(".thinger")
+ // | .onclick(function(e){ /* ... */ })
+ // | .at(1, 3, 8) // get a subset
+ // | .style("padding", "5px")
+ // | .forEach(console.log);
+ var isNew = this instanceof nl && has("array-extensible");
+ if(typeof array == "number"){
+ array = Array(array);
+ }
+ var nodeArray = (array && "length" in array) ? array : arguments;
+ if(isNew || !nodeArray.sort){
+ // make sure it's a real array before we pass it on to be wrapped
+ var target = isNew ? this : [],
+ l = target.length = nodeArray.length;
+ for(var i = 0; i < l; i++){
+ target[i] = nodeArray[i];
+ }
+ if(isNew){
+ // called with new operator, this means we are going to use this instance and push
+ // the nodes on to it. This is usually much faster since the NodeList properties
+ // don't need to be copied (unless the list of nodes is extremely large).
+ return target;
+ }
+ nodeArray = target;
+ }
+ // called without new operator, use a real array and copy prototype properties,
+ // this is slower and exists for back-compat. Should be removed in 2.0.
+ lang._mixin(nodeArray, nlp);
+ nodeArray._NodeListCtor = function(array){
+ // call without new operator to preserve back-compat behavior
+ return nl(array);
+ };
+ return nodeArray;
+ };
+
+ var nl = NodeList, nlp = nl.prototype =
+ has("array-extensible") ? [] : {};// extend an array if it is extensible
+
+ // expose adapters and the wrapper as private functions
+
+ nl._wrap = nlp._wrap = tnl;
+ nl._adaptAsMap = adaptAsMap;
+ nl._adaptAsForEach = adaptAsForEach;
+ nl._adaptAsFilter = adaptAsFilter;
+ nl._adaptWithCondition = adaptWithCondition;
+
+ // mass assignment
+
+ // add array redirectors
+ forEach(["slice", "splice"], function(name){
+ var f = ap[name];
+ //Use a copy of the this array via this.slice() to allow .end() to work right in the splice case.
+ // CANNOT apply ._stash()/end() to splice since it currently modifies
+ // the existing this array -- it would break backward compatibility if we copy the array before
+ // the splice so that we can use .end(). So only doing the stash option to this._wrap for slice.
+ nlp[name] = function(){ return this._wrap(f.apply(this, arguments), name == "slice" ? this : null); };
+ });
+ // concat should be here but some browsers with native NodeList have problems with it
+
+ // add array.js redirectors
+ forEach(["indexOf", "lastIndexOf", "every", "some"], function(name){
+ var f = array[name];
+ nlp[name] = function(){ return f.apply(dojo, [this].concat(aps.call(arguments, 0))); };
+ });
+
+ /*===== var NodeList = dojo.NodeList; =====*/
+ lang.extend(NodeList, {
+ // copy the constructors
+ constructor: nl,
+ _NodeListCtor: nl,
+ toString: function(){
+ // Array.prototype.toString can't be applied to objects, so we use join
+ return this.join(",");
+ },
+ _stash: function(parent){
+ // summary:
+ // private function to hold to a parent NodeList. end() to return the parent NodeList.
+ //
+ // example:
+ // How to make a `dojo.NodeList` method that only returns the third node in
+ // the dojo.NodeList but allows access to the original NodeList by using this._stash:
+ // | dojo.extend(dojo.NodeList, {
+ // | third: function(){
+ // | var newNodeList = dojo.NodeList(this[2]);
+ // | return newNodeList._stash(this);
+ // | }
+ // | });
+ // | // then see how _stash applies a sub-list, to be .end()'ed out of
+ // | dojo.query(".foo")
+ // | .third()
+ // | .addClass("thirdFoo")
+ // | .end()
+ // | // access to the orig .foo list
+ // | .removeClass("foo")
+ // |
+ //
+ this._parent = parent;
+ return this; //dojo.NodeList
+ },
+
+ on: function(eventName, listener){
+ // summary:
+ // Listen for events on the nodes in the NodeList. Basic usage is:
+ // | query(".my-class").on("click", listener);
+ // This supports event delegation by using selectors as the first argument with the event names as
+ // pseudo selectors. For example:
+ // | dojo.query("#my-list").on("li:click", listener);
+ // This will listen for click events within <li> elements that are inside the #my-list element.
+ // Because on supports CSS selector syntax, we can use comma-delimited events as well:
+ // | dojo.query("#my-list").on("li button:mouseover, li:click", listener);
+ var handles = this.map(function(node){
+ return on(node, eventName, listener); // TODO: apply to the NodeList so the same selector engine is used for matches
+ });
+ handles.remove = function(){
+ for(var i = 0; i < handles.length; i++){
+ handles[i].remove();
+ }
+ };
+ return handles;
+ },
+
+ end: function(){
+ // summary:
+ // Ends use of the current `dojo.NodeList` by returning the previous dojo.NodeList
+ // that generated the current dojo.NodeList.
+ // description:
+ // Returns the `dojo.NodeList` that generated the current `dojo.NodeList`. If there
+ // is no parent dojo.NodeList, an empty dojo.NodeList is returned.
+ // example:
+ // | dojo.query("a")
+ // | .filter(".disabled")
+ // | // operate on the anchors that only have a disabled class
+ // | .style("color", "grey")
+ // | .end()
+ // | // jump back to the list of anchors
+ // | .style(...)
+ //
+ if(this._parent){
+ return this._parent;
+ }else{
+ //Just return empty list.
+ return new this._NodeListCtor(0);
+ }
+ },
+
+ // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Methods
+
+ // FIXME: handle return values for #3244
+ // http://trac.dojotoolkit.org/ticket/3244
+
+ // FIXME:
+ // need to wrap or implement:
+ // join (perhaps w/ innerHTML/outerHTML overload for toString() of items?)
+ // reduce
+ // reduceRight
+
+ /*=====
+ slice: function(begin, end){
+ // summary:
+ // Returns a new NodeList, maintaining this one in place
+ // description:
+ // This method behaves exactly like the Array.slice method
+ // with the caveat that it returns a dojo.NodeList and not a
+ // raw Array. For more details, see Mozilla's (slice
+ // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:slice]
+ // begin: Integer
+ // Can be a positive or negative integer, with positive
+ // integers noting the offset to begin at, and negative
+ // integers denoting an offset from the end (i.e., to the left
+ // of the end)
+ // end: Integer?
+ // Optional parameter to describe what position relative to
+ // the NodeList's zero index to end the slice at. Like begin,
+ // can be positive or negative.
+ return this._wrap(a.slice.apply(this, arguments));
+ },
+
+ splice: function(index, howmany, item){
+ // summary:
+ // Returns a new NodeList, manipulating this NodeList based on
+ // the arguments passed, potentially splicing in new elements
+ // at an offset, optionally deleting elements
+ // description:
+ // This method behaves exactly like the Array.splice method
+ // with the caveat that it returns a dojo.NodeList and not a
+ // raw Array. For more details, see Mozilla's (splice
+ // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:splice]
+ // For backwards compatibility, calling .end() on the spliced NodeList
+ // does not return the original NodeList -- splice alters the NodeList in place.
+ // index: Integer
+ // begin can be a positive or negative integer, with positive
+ // integers noting the offset to begin at, and negative
+ // integers denoting an offset from the end (i.e., to the left
+ // of the end)
+ // howmany: Integer?
+ // Optional parameter to describe what position relative to
+ // the NodeList's zero index to end the slice at. Like begin,
+ // can be positive or negative.
+ // item: Object...?
+ // Any number of optional parameters may be passed in to be
+ // spliced into the NodeList
+ // returns:
+ // dojo.NodeList
+ return this._wrap(a.splice.apply(this, arguments));
+ },
+
+ indexOf: function(value, fromIndex){
+ // summary:
+ // see dojo.indexOf(). The primary difference is that the acted-on
+ // array is implicitly this NodeList
+ // value: Object:
+ // The value to search for.
+ // fromIndex: Integer?:
+ // The location to start searching from. Optional. Defaults to 0.
+ // description:
+ // For more details on the behavior of indexOf, see Mozilla's
+ // (indexOf
+ // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf]
+ // returns:
+ // Positive Integer or 0 for a match, -1 of not found.
+ return d.indexOf(this, value, fromIndex); // Integer
+ },
+
+ lastIndexOf: function(value, fromIndex){
+ // summary:
+ // see dojo.lastIndexOf(). The primary difference is that the
+ // acted-on array is implicitly this NodeList
+ // description:
+ // For more details on the behavior of lastIndexOf, see
+ // Mozilla's (lastIndexOf
+ // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:lastIndexOf]
+ // value: Object
+ // The value to search for.
+ // fromIndex: Integer?
+ // The location to start searching from. Optional. Defaults to 0.
+ // returns:
+ // Positive Integer or 0 for a match, -1 of not found.
+ return d.lastIndexOf(this, value, fromIndex); // Integer
+ },
+
+ every: function(callback, thisObject){
+ // summary:
+ // see `dojo.every()` and the (Array.every
+ // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every].
+ // Takes the same structure of arguments and returns as
+ // dojo.every() with the caveat that the passed array is
+ // implicitly this NodeList
+ // callback: Function: the callback
+ // thisObject: Object?: the context
+ return d.every(this, callback, thisObject); // Boolean
+ },
+
+ some: function(callback, thisObject){
+ // summary:
+ // Takes the same structure of arguments and returns as
+ // `dojo.some()` with the caveat that the passed array is
+ // implicitly this NodeList. See `dojo.some()` and Mozilla's
+ // (Array.some
+ // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some].
+ // callback: Function: the callback
+ // thisObject: Object?: the context
+ return d.some(this, callback, thisObject); // Boolean
+ },
+ =====*/
+
+ concat: function(item){
+ // summary:
+ // Returns a new NodeList comprised of items in this NodeList
+ // as well as items passed in as parameters
+ // description:
+ // This method behaves exactly like the Array.concat method
+ // with the caveat that it returns a `dojo.NodeList` and not a
+ // raw Array. For more details, see the (Array.concat
+ // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:concat]
+ // item: Object?
+ // Any number of optional parameters may be passed in to be
+ // spliced into the NodeList
+ // returns:
+ // dojo.NodeList
+
+ //return this._wrap(apc.apply(this, arguments));
+ // the line above won't work for the native NodeList :-(
+
+ // implementation notes:
+ // 1) Native NodeList is not an array, and cannot be used directly
+ // in concat() --- the latter doesn't recognize it as an array, and
+ // does not inline it, but append as a single entity.
+ // 2) On some browsers (e.g., Safari) the "constructor" property is
+ // read-only and cannot be changed. So we have to test for both
+ // native NodeList and dojo.NodeList in this property to recognize
+ // the node list.
+
+ var t = lang.isArray(this) ? this : aps.call(this, 0),
+ m = array.map(arguments, function(a){
+ return a && !lang.isArray(a) &&
+ (typeof NodeList != "undefined" && a.constructor === NodeList || a.constructor === this._NodeListCtor) ?
+ aps.call(a, 0) : a;
+ });
+ return this._wrap(apc.apply(t, m), this); // dojo.NodeList
+ },
+
+ map: function(/*Function*/ func, /*Function?*/ obj){
+ // summary:
+ // see dojo.map(). The primary difference is that the acted-on
+ // array is implicitly this NodeList and the return is a
+ // dojo.NodeList (a subclass of Array)
+ ///return d.map(this, func, obj, d.NodeList); // dojo.NodeList
+ return this._wrap(array.map(this, func, obj), this); // dojo.NodeList
+ },
+
+ forEach: function(callback, thisObj){
+ // summary:
+ // see `dojo.forEach()`. The primary difference is that the acted-on
+ // array is implicitly this NodeList. If you want the option to break out
+ // of the forEach loop, use every() or some() instead.
+ forEach(this, callback, thisObj);
+ // non-standard return to allow easier chaining
+ return this; // dojo.NodeList
+ },
+ filter: function(/*String|Function*/ filter){
+ // summary:
+ // "masks" the built-in javascript filter() method (supported
+ // in Dojo via `dojo.filter`) to support passing a simple
+ // string filter in addition to supporting filtering function
+ // objects.
+ // filter:
+ // If a string, a CSS rule like ".thinger" or "div > span".
+ // example:
+ // "regular" JS filter syntax as exposed in dojo.filter:
+ // | dojo.query("*").filter(function(item){
+ // | // highlight every paragraph
+ // | return (item.nodeName == "p");
+ // | }).style("backgroundColor", "yellow");
+ // example:
+ // the same filtering using a CSS selector
+ // | dojo.query("*").filter("p").styles("backgroundColor", "yellow");
+
+ var a = arguments, items = this, start = 0;
+ if(typeof filter == "string"){ // inline'd type check
+ items = query._filterResult(this, a[0]);
+ if(a.length == 1){
+ // if we only got a string query, pass back the filtered results
+ return items._stash(this); // dojo.NodeList
+ }
+ // if we got a callback, run it over the filtered items
+ start = 1;
+ }
+ return this._wrap(array.filter(items, a[start], a[start + 1]), this); // dojo.NodeList
+ },
+ instantiate: function(/*String|Object*/ declaredClass, /*Object?*/ properties){
+ // summary:
+ // Create a new instance of a specified class, using the
+ // specified properties and each node in the nodeList as a
+ // srcNodeRef.
+ // example:
+ // Grabs all buttons in the page and converts them to diji.form.Buttons.
+ // | var buttons = dojo.query("button").instantiate("dijit.form.Button", {showLabel: true});
+ var c = lang.isFunction(declaredClass) ? declaredClass : lang.getObject(declaredClass);
+ properties = properties || {};
+ return this.forEach(function(node){
+ new c(properties, node);
+ }); // dojo.NodeList
+ },
+ at: function(/*===== index =====*/){
+ // summary:
+ // Returns a new NodeList comprised of items in this NodeList
+ // at the given index or indices.
+ //
+ // index: Integer...
+ // One or more 0-based indices of items in the current
+ // NodeList. A negative index will start at the end of the
+ // list and go backwards.
+ //
+ // example:
+ // Shorten the list to the first, second, and third elements
+ // | dojo.query("a").at(0, 1, 2).forEach(fn);
+ //
+ // example:
+ // Retrieve the first and last elements of a unordered list:
+ // | dojo.query("ul > li").at(0, -1).forEach(cb);
+ //
+ // example:
+ // Do something for the first element only, but end() out back to
+ // the original list and continue chaining:
+ // | dojo.query("a").at(0).onclick(fn).end().forEach(function(n){
+ // | console.log(n); // all anchors on the page.
+ // | })
+ //
+ // returns:
+ // dojo.NodeList
+ var t = new this._NodeListCtor(0);
+ forEach(arguments, function(i){
+ if(i < 0){ i = this.length + i; }
+ if(this[i]){ t.push(this[i]); }
+ }, this);
+ return t._stash(this); // dojo.NodeList
+ }
+ });
+
+
+/*=====
+dojo.query = function(selector, context){
+ // summary:
+ // This modules provides DOM querying functionality. The module export is a function
+ // that can be used to query for DOM nodes by CSS selector and returns a dojo.NodeList
+ // representing the matching nodes.
+ //
+ // selector: String
+ // A CSS selector to search for.
+ // context: String|DomNode?
+ // An optional context to limit the searching scope. Only nodes under `context` will be
+ // scanned.
+ //
+ // example:
+ // add an onclick handler to every submit button in the document
+ // which causes the form to be sent via Ajax instead:
+ // | define(["dojo/query"], function(query){
+ // | query("input[type='submit']").on("click", function(e){
+ // | dojo.stopEvent(e); // prevent sending the form
+ // | var btn = e.target;
+ // | dojo.xhrPost({
+ // | form: btn.form,
+ // | load: function(data){
+ // | // replace the form with the response
+ // | var div = dojo.doc.createElement("div");
+ // | dojo.place(div, btn.form, "after");
+ // | div.innerHTML = data;
+ // | dojo.style(btn.form, "display", "none");
+ // | }
+ // | });
+ // | });
+ //
+ // description:
+ // dojo/query is responsible for loading the appropriate query engine and wrapping
+ // its results with a `dojo.NodeList`. You can use dojo/query with a specific selector engine
+ // by using it as a plugin. For example, if you installed the sizzle package, you could
+ // use it as the selector engine with:
+ // | define("dojo/query!sizzle", function(query){
+ // | query("div")...
+ //
+ // The id after the ! can be a module id of the selector engine or one of the following values:
+ // | + acme: This is the default engine used by Dojo base, and will ensure that the full
+ // | Acme engine is always loaded.
+ // |
+ // | + css2: If the browser has a native selector engine, this will be used, otherwise a
+ // | very minimal lightweight selector engine will be loaded that can do simple CSS2 selectors
+ // | (by #id, .class, tag, and [name=value] attributes, with standard child or descendant (>)
+ // | operators) and nothing more.
+ // |
+ // | + css2.1: If the browser has a native selector engine, this will be used, otherwise the
+ // | full Acme engine will be loaded.
+ // |
+ // | + css3: If the browser has a native selector engine with support for CSS3 pseudo
+ // | selectors (most modern browsers except IE8), this will be used, otherwise the
+ // | full Acme engine will be loaded.
+ // |
+ // | + Or the module id of a selector engine can be used to explicitly choose the selector engine
+ //
+ // For example, if you are using CSS3 pseudo selectors in module, you can specify that
+ // you will need support them with:
+ // | define("dojo/query!css3", function(query){
+ // | query('#t > h3:nth-child(odd)')...
+ //
+ // You can also choose the selector engine/load configuration by setting the <FIXME:what is the configuration setting?>.
+ // For example:
+ // | <script data-dojo-config="query-selector:'css3'" src="dojo.js"></script>
+ //
+ return new dojo.NodeList(); // dojo.NodeList
+};
+=====*/
+
+function queryForEngine(engine, NodeList){
+ var query = function(/*String*/ query, /*String|DOMNode?*/ root){
+ // summary:
+ // Returns nodes which match the given CSS selector, searching the
+ // entire document by default but optionally taking a node to scope
+ // the search by. Returns an instance of dojo.NodeList.
+ if(typeof root == "string"){
+ root = dom.byId(root);
+ if(!root){
+ return new NodeList([]);
+ }
+ }
+ var results = typeof query == "string" ? engine(query, root) : query.orphan ? query : [query];
+ if(results.orphan){
+ // already wrapped
+ return results;
+ }
+ return new NodeList(results);
+ };
+ query.matches = engine.match || function(node, selector, root){
+ // summary:
+ // Test to see if a node matches a selector
+ return query.filter([node], selector, root).length > 0;
+ };
+ // the engine provides a filtering function, use it to for matching
+ query.filter = engine.filter || function(nodes, selector, root){
+ // summary:
+ // Filters an array of nodes. Note that this does not guarantee to return a dojo.NodeList, just an array.
+ return query(selector, root).filter(function(node){
+ return array.indexOf(nodes, node) > -1;
+ });
+ };
+ if(typeof engine != "function"){
+ var search = engine.search;
+ engine = function(selector, root){
+ // Slick does it backwards (or everyone else does it backwards, probably the latter)
+ return search(root || document, selector);
+ };
+ }
+ return query;
+}
+var query = queryForEngine(defaultEngine, NodeList);
+// the query that is returned from this module is slightly different than dojo.query,
+// because dojo.query has to maintain backwards compatibility with returning a
+// true array which has performance problems. The query returned from the module
+// does not use true arrays, but rather inherits from Array, making it much faster to
+// instantiate.
+dojo.query = queryForEngine(defaultEngine, function(array){
+ // call it without the new operator to invoke the back-compat behavior that returns a true array
+ return NodeList(array);
+});
+
+query.load = /*===== dojo.query.load= ======*/ function(id, parentRequire, loaded, config){
+ // summary: can be used as AMD plugin to conditionally load new query engine
+ // example:
+ // | define(["dojo/query!custom"], function(qsa){
+ // | // loaded selector/custom.js as engine
+ // | qsa("#foobar").forEach(...);
+ // | });
+ loader.load(id, parentRequire, function(engine){
+ loaded(queryForEngine(engine, NodeList));
+ });
+};
+
+dojo._filterQueryResult = query._filterResult = function(nodes, selector, root){
+ return new NodeList(query.filter(nodes, selector, root));
+};
+dojo.NodeList = query.NodeList = NodeList;
+return query;
+});
diff --git a/lib/dojo/ready.js b/lib/dojo/ready.js
new file mode 100644
index 000000000..cb2e38ace
--- /dev/null
+++ b/lib/dojo/ready.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/ready",["./_base/kernel","./has","require","./domReady","./_base/lang"],function(_1,_2,_3,_4,_5){var _6=0,_7,_8=[],_9=0,_a=function(){_6=1;_1._postLoad=_1.config.afterOnLoad=true;if(_8.length){_7(_b);}},_b=function(){if(_6&&!_9&&_8.length){_9=1;var f=_8.shift();try{f();}finally{_9=0;}_9=0;if(_8.length){_7(_b);}}};if(1){_3.on("idle",_b);_7=function(){if(_3.idle()){_b();}};}else{_7=function(){_3.ready(_b);};}var _c=_1.ready=_1.addOnLoad=function(_d,_e,_f){var _10=_5._toArray(arguments);if(typeof _d!="number"){_f=_e;_e=_d;_d=1000;}else{_10.shift();}_f=_f?_5.hitch.apply(_1,_10):function(){_e();};_f.priority=_d;for(var i=0;i<_8.length&&_d>=_8[i].priority;i++){}_8.splice(i,0,_f);_7();};true||_2.add("dojo-config-addOnLoad",1);if(1){var dca=_1.config.addOnLoad;if(dca){_c[(_5.isArray(dca)?"apply":"call")](_1,dca);}}if(1&&_1.config.parseOnLoad&&!_1.isAsync){_c(99,function(){if(!_1.parser){_1.deprecated("Add explicit require(['dojo/parser']);","","2.0");_3(["dojo/parser"]);}});}if(1){_4(_a);}else{_a();}return _c;}); \ No newline at end of file
diff --git a/lib/dojo/ready.js.uncompressed.js b/lib/dojo/ready.js.uncompressed.js
new file mode 100644
index 000000000..65e3d3df9
--- /dev/null
+++ b/lib/dojo/ready.js.uncompressed.js
@@ -0,0 +1,138 @@
+define("dojo/ready", ["./_base/kernel", "./has", "require", "./domReady", "./_base/lang"], function(dojo, has, require, domReady, lang) {
+ // module:
+ // dojo/ready
+ // summary:
+ // This module defines the dojo.ready API.
+ //
+ // note:
+ // This module should be unnecessary in dojo 2.0
+ var
+ // truthy if DOMContentLoaded or better (e.g., window.onload fired) has been achieved
+ isDomReady = 0,
+
+ // a function to call to cause onLoad to be called when all requested modules have been loaded
+ requestCompleteSignal,
+
+ // The queue of functions waiting to execute as soon as dojo.ready conditions satisfied
+ loadQ = [],
+
+ // prevent recursion in onLoad
+ onLoadRecursiveGuard = 0,
+
+ handleDomReady = function(){
+ isDomReady = 1;
+ dojo._postLoad = dojo.config.afterOnLoad = true;
+ if(loadQ.length){
+ requestCompleteSignal(onLoad);
+ }
+ },
+
+ // run the next function queued with dojo.ready
+ onLoad = function(){
+ if(isDomReady && !onLoadRecursiveGuard && loadQ.length){
+ //guard against recursions into this function
+ onLoadRecursiveGuard = 1;
+ var f = loadQ.shift();
+ try{
+ f();
+ }
+ // FIXME: signal the error via require.on
+ finally{
+ onLoadRecursiveGuard = 0;
+ }
+ onLoadRecursiveGuard = 0;
+ if(loadQ.length){
+ requestCompleteSignal(onLoad);
+ }
+ }
+ };
+
+ // define requireCompleteSignal; impl depends on loader
+ if(1){
+ require.on("idle", onLoad);
+ requestCompleteSignal = function(){
+ if(require.idle()){
+ onLoad();
+ } // else do nothing, onLoad will be called with the next idle signal
+ };
+ }else{
+ // RequireJS or similar
+ requestCompleteSignal = function(){
+ // the next function call will fail if you don't have a loader with require.ready
+ // in that case, either fix your loader, use dojo's loader, or don't call dojo.ready;
+ require.ready(onLoad);
+ };
+ }
+
+ var ready = dojo.ready = dojo.addOnLoad = function(priority, context, callback){
+ // summary: Add a function to execute on DOM content loaded and all requested modules have arrived and been evaluated.
+ // priority: Integer?
+ // The order in which to exec this callback relative to other callbacks, defaults to 1000
+ // context: Object?|Function
+ // The context in which to run execute callback, or a callback if not using context
+ // callback: Function?
+ // The function to execute.
+ //
+ // example:
+ // Simple DOM and Modules ready syntax
+ // | dojo.ready(function(){ alert("Dom ready!"); });
+ //
+ // example:
+ // Using a priority
+ // | dojo.ready(2, function(){ alert("low priority ready!"); })
+ //
+ // example:
+ // Using context
+ // | dojo.ready(foo, function(){
+ // | // in here, this == foo
+ // | })
+ //
+ // example:
+ // Using dojo.hitch style args:
+ // | var foo = { dojoReady: function(){ console.warn(this, "dojo dom and modules ready."); } };
+ // | dojo.ready(foo, "dojoReady");
+
+ var hitchArgs = lang._toArray(arguments);
+ if(typeof priority != "number"){
+ callback = context;
+ context = priority;
+ priority = 1000;
+ }else{
+ hitchArgs.shift();
+ }
+ callback = callback ?
+ lang.hitch.apply(dojo, hitchArgs) :
+ function(){
+ context();
+ };
+ callback.priority = priority;
+ for(var i = 0; i < loadQ.length && priority >= loadQ[i].priority; i++){}
+ loadQ.splice(i, 0, callback);
+ requestCompleteSignal();
+ };
+
+ true || has.add("dojo-config-addOnLoad", 1);
+ if(1){
+ var dca = dojo.config.addOnLoad;
+ if(dca){
+ ready[(lang.isArray(dca) ? "apply" : "call")](dojo, dca);
+ }
+ }
+
+ if(1 && dojo.config.parseOnLoad && !dojo.isAsync){
+ ready(99, function(){
+ if(!dojo.parser){
+ dojo.deprecated("Add explicit require(['dojo/parser']);", "", "2.0");
+ require(["dojo/parser"]);
+ }
+ });
+ }
+
+ if(1){
+ domReady(handleDomReady);
+ }else{
+ handleDomReady();
+ }
+
+ return ready;
+});
diff --git a/lib/dojo/regexp.js b/lib/dojo/regexp.js
index 947ecf1d5..65b7c3a00 100644
--- a/lib/dojo/regexp.js
+++ b/lib/dojo/regexp.js
@@ -4,74 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.regexp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.regexp"] = true;
-dojo.provide("dojo.regexp");
-
-dojo.getObject("regexp", true, dojo);
-
-/*=====
-dojo.regexp = {
- // summary: Regular expressions and Builder resources
-};
-=====*/
-
-dojo.regexp.escapeString = function(/*String*/str, /*String?*/except){
- // summary:
- // Adds escape sequences for special characters in regular expressions
- // except:
- // a String with special characters to be left unescaped
-
- return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, function(ch){
- if(except && except.indexOf(ch) != -1){
- return ch;
- }
- return "\\" + ch;
- }); // String
-};
-
-dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boolean?*/nonCapture){
- // summary:
- // Builds a regular expression that groups subexpressions
- // description:
- // A utility function used by some of the RE generators. The
- // subexpressions are constructed by the function, re, in the second
- // parameter. re builds one subexpression for each elem in the array
- // a, in the first parameter. Returns a string for a regular
- // expression that groups all the subexpressions.
- // arr:
- // A single value or an array of values.
- // re:
- // A function. Takes one parameter and converts it to a regular
- // expression.
- // nonCapture:
- // If true, uses non-capturing match, otherwise matches are retained
- // by regular expression. Defaults to false
-
- // case 1: a is a single value.
- if(!(arr instanceof Array)){
- return re(arr); // String
- }
-
- // case 2: a is an array
- var b = [];
- for(var i = 0; i < arr.length; i++){
- // convert each elem to a RE
- b.push(re(arr[i]));
- }
-
- // join the REs as alternatives in a RE group.
- return dojo.regexp.group(b.join("|"), nonCapture); // String
-};
-
-dojo.regexp.group = function(/*String*/expression, /*Boolean?*/nonCapture){
- // summary:
- // adds group match to expression
- // nonCapture:
- // If true, uses non-capturing match, otherwise matches are retained
- // by regular expression.
- return "(" + (nonCapture ? "?:":"") + expression + ")"; // String
-};
-
-}
+//>>built
+define("dojo/regexp",["./_base/kernel","./_base/lang"],function(_1,_2){_2.getObject("regexp",true,_1);_1.regexp.escapeString=function(_3,_4){return _3.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(ch){if(_4&&_4.indexOf(ch)!=-1){return ch;}return "\\"+ch;});};_1.regexp.buildGroupRE=function(_5,re,_6){if(!(_5 instanceof Array)){return re(_5);}var b=[];for(var i=0;i<_5.length;i++){b.push(re(_5[i]));}return _1.regexp.group(b.join("|"),_6);};_1.regexp.group=function(_7,_8){return "("+(_8?"?:":"")+_7+")";};return _1.regexp;}); \ No newline at end of file
diff --git a/lib/dojo/regexp.js.uncompressed.js b/lib/dojo/regexp.js.uncompressed.js
new file mode 100644
index 000000000..4817a7796
--- /dev/null
+++ b/lib/dojo/regexp.js.uncompressed.js
@@ -0,0 +1,73 @@
+define("dojo/regexp", ["./_base/kernel", "./_base/lang"], function(dojo, lang) {
+ // module:
+ // dojo/regexp
+ // summary:
+ // TODOC
+
+lang.getObject("regexp", true, dojo);
+
+/*=====
+dojo.regexp = {
+ // summary: Regular expressions and Builder resources
+};
+=====*/
+
+dojo.regexp.escapeString = function(/*String*/str, /*String?*/except){
+ // summary:
+ // Adds escape sequences for special characters in regular expressions
+ // except:
+ // a String with special characters to be left unescaped
+
+ return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, function(ch){
+ if(except && except.indexOf(ch) != -1){
+ return ch;
+ }
+ return "\\" + ch;
+ }); // String
+};
+
+dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boolean?*/nonCapture){
+ // summary:
+ // Builds a regular expression that groups subexpressions
+ // description:
+ // A utility function used by some of the RE generators. The
+ // subexpressions are constructed by the function, re, in the second
+ // parameter. re builds one subexpression for each elem in the array
+ // a, in the first parameter. Returns a string for a regular
+ // expression that groups all the subexpressions.
+ // arr:
+ // A single value or an array of values.
+ // re:
+ // A function. Takes one parameter and converts it to a regular
+ // expression.
+ // nonCapture:
+ // If true, uses non-capturing match, otherwise matches are retained
+ // by regular expression. Defaults to false
+
+ // case 1: a is a single value.
+ if(!(arr instanceof Array)){
+ return re(arr); // String
+ }
+
+ // case 2: a is an array
+ var b = [];
+ for(var i = 0; i < arr.length; i++){
+ // convert each elem to a RE
+ b.push(re(arr[i]));
+ }
+
+ // join the REs as alternatives in a RE group.
+ return dojo.regexp.group(b.join("|"), nonCapture); // String
+};
+
+dojo.regexp.group = function(/*String*/expression, /*Boolean?*/nonCapture){
+ // summary:
+ // adds group match to expression
+ // nonCapture:
+ // If true, uses non-capturing match, otherwise matches are retained
+ // by regular expression.
+ return "(" + (nonCapture ? "?:":"") + expression + ")"; // String
+};
+
+return dojo.regexp;
+});
diff --git a/lib/dojo/require.js b/lib/dojo/require.js
new file mode 100644
index 000000000..40160e179
--- /dev/null
+++ b/lib/dojo/require.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/require",["./_base/loader"],function(_1){return {dynamic:0,normalize:function(id){return id;},load:_1.require};}); \ No newline at end of file
diff --git a/lib/dojo/require.js.uncompressed.js b/lib/dojo/require.js.uncompressed.js
new file mode 100644
index 000000000..e3d12dde4
--- /dev/null
+++ b/lib/dojo/require.js.uncompressed.js
@@ -0,0 +1,7 @@
+define("dojo/require", ["./_base/loader"], function(loader){
+ return {
+ dynamic:0,
+ normalize:function(id){return id;},
+ load:loader.require
+ };
+});
diff --git a/lib/dojo/resources/_modules.js b/lib/dojo/resources/_modules.js
index 2afef9a6c..e093a58f3 100644
--- a/lib/dojo/resources/_modules.js
+++ b/lib/dojo/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
-*/
-
-
/*=====
// Supplemental summaries for those hard-to-doc places your conventional doc parser can't reach.
// Where possible, these summaries should appear inline in the code.
diff --git a/lib/dojo/resources/dnd.css b/lib/dojo/resources/dnd.css
index b7f1651f9..fb0611856 100644
--- a/lib/dojo/resources/dnd.css
+++ b/lib/dojo/resources/dnd.css
@@ -1,6 +1,6 @@
/* DnD avatar-specific settings */
.dojoDndAvatar {font-size: 75%; color: black;}
-.dojoDndAvatarHeader td {padding-left: 20px; padding-right: 4px;}
+.dojoDndAvatarHeader td {padding-left: 20px; padding-right: 4px; height: 16px;}
.dojoDndAvatarHeader {background: #ccc;}
.dojoDndAvatarItem {background: #eee;}
.dojoDndMove .dojoDndAvatarHeader {background-image: url(images/dndNoMove.png); background-repeat: no-repeat;}
diff --git a/lib/dojo/robot.js b/lib/dojo/robot.js
deleted file mode 100644
index 40bc746ee..000000000
--- a/lib/dojo/robot.js
+++ /dev/null
@@ -1,187 +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["dojo.robot"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.robot"] = true;
-dojo.provide("dojo.robot");
-dojo.require("doh.robot");
-dojo.require("dojo.window");
-
-
-dojo.experimental("dojo.robot");
-
-(function(){
-// users who use doh+dojo get the added convenience of dojo.mouseMoveAt,
-// instead of computing the absolute coordinates of their elements themselves
-dojo.mixin(doh.robot,{
-
- _resolveNode: function(/*String||DOMNode||Function*/ n){
- if(typeof n == "function"){
- // if the user passed a function returning a node, evaluate it
- n = n();
- }
- return n? dojo.byId(n) : null;
- },
-
- _scrollIntoView: function(/*Node*/ n){
- // scrolls the passed node into view, scrolling all ancester frames/windows as well.
- // Assumes parent iframes can be made fully visible given the current browser window size
- var d = dojo,
- dr = doh.robot,
- p = null;
- d.forEach(dr._getWindowChain(n), function(w){
- d.withGlobal(w, function(){
- // get the position of the node wrt its parent window
- // if it is a parent frame, its padding and border extents will get added in
- var p2 = d.position(n, false),
- b = d._getPadBorderExtents(n),
- oldp = null;
- // if p2 is the position of the original passed node, store the position away as p
- // otherwise, node is actually an iframe. in this case, add the iframe's position wrt its parent window and also the iframe's padding and border extents
- if(!p){
- p = p2;
- }else{
- oldp = p;
- p = {x: p.x+p2.x+b.l,
- y: p.y+p2.y+b.t,
- w: p.w,
- h: p.h};
-
- }
- // scroll the parent window so that the node translated into the parent window's coordinate space is in view
- dojo.window.scrollIntoView(n,p);
- // adjust position for the new scroll offsets
- p2 = d.position(n, false);
- if(!oldp){
- p = p2;
- }else{
- p = {x: oldp.x+p2.x+b.l,
- y: oldp.y+p2.y+b.t,
- w: p.w,
- h: p.h};
- }
- // get the parent iframe so it can be scrolled too
- n = w.frameElement;
- });
- });
- },
-
- _position: function(/*Node*/ n){
- // Returns the dojo.position of the passed node wrt the passed window's viewport,
- // following any parent iframes containing the node and clipping the node to each iframe.
- // precondition: _scrollIntoView already called
- var d = dojo, p = null, M = Math.max, m = Math.min;
- // p: the returned position of the node
- d.forEach(doh.robot._getWindowChain(n), function(w){
- d.withGlobal(w, function(){
- // get the position of the node wrt its parent window
- // if it is a parent frame, its padding and border extents will get added in
- var p2 = d.position(n, false), b = d._getPadBorderExtents(n);
- // if p2 is the position of the original passed node, store the position away as p
- // otherwise, node is actually an iframe. in this case, add the iframe's position wrt its parent window and also the iframe's padding and border extents
- if(!p){
- p = p2;
- }else{
- var view;
- d.withGlobal(n.contentWindow,function(){
- view=dojo.window.getBox();
- });
- p2.r = p2.x+view.w;
- p2.b = p2.y+view.h;
- p = {x: M(p.x+p2.x,p2.x)+b.l, // clip left edge of node wrt the iframe
- y: M(p.y+p2.y,p2.y)+b.t, // top edge
- r: m(p.x+p2.x+p.w,p2.r)+b.l, // right edge (to compute width)
- b: m(p.y+p2.y+p.h,p2.b)+b.t}; // bottom edge (to compute height)
- // save a few bytes by computing width and height from r and b
- p.w = p.r-p.x;
- p.h = p.b-p.y;
- }
- // the new node is now the old node's parent iframe
- n=w.frameElement;
- });
- });
- return p;
- },
-
- _getWindowChain : function(/*Node*/ n){
- // Returns an array of windows starting from the passed node's parent window and ending at dojo's window
- var cW = dojo.window.get(n.ownerDocument);
- var arr=[cW];
- var f = cW.frameElement;
- return (cW == dojo.global || f == null)? arr : arr.concat(doh.robot._getWindowChain(f));
- },
-
- scrollIntoView : function(/*String||DOMNode||Function*/ node, /*Number, optional*/ delay){
- // summary:
- // Scroll the passed node into view, if it is not.
- //
- // node:
- // The id of the node, or the node itself, to move the mouse to.
- // If you pass an id or a function that returns a node, the node will not be evaluated until the movement executes.
- // This is useful if you need to move the mouse to an node that is not yet present.
- //
- // delay:
- // Delay, in milliseconds, to wait before firing.
- // The delay is a delta with respect to the previous automation call.
- //
- doh.robot.sequence(function(){
- doh.robot._scrollIntoView(doh.robot._resolveNode(node));
- }, delay);
- },
-
- mouseMoveAt : function(/*String||DOMNode||Function*/ node, /*Integer, optional*/ delay, /*Integer, optional*/ duration, /*Number, optional*/ offsetX, /*Number, optional*/ offsetY){
- // summary:
- // Moves the mouse over the specified node at the specified relative x,y offset.
- //
- // description:
- // Moves the mouse over the specified node at the specified relative x,y offset.
- // If you do not specify an offset, mouseMove will default to move to the middle of the node.
- // Example: to move the mouse over a ComboBox's down arrow node, call doh.mouseMoveAt(dijit.byId('setvaluetest').downArrowNode);
- //
- // node:
- // The id of the node, or the node itself, to move the mouse to.
- // If you pass an id or a function that returns a node, the node will not be evaluated until the movement executes.
- // This is useful if you need to move the mouse to an node that is not yet present.
- //
- // delay:
- // Delay, in milliseconds, to wait before firing.
- // The delay is a delta with respect to the previous automation call.
- // For example, the following code ends after 600ms:
- // doh.robot.mouseClick({left:true}, 100) // first call; wait 100ms
- // doh.robot.typeKeys("dij", 500) // 500ms AFTER previous call; 600ms in all
- //
- // duration:
- // Approximate time Robot will spend moving the mouse
- // The default is 100ms.
- //
- // offsetX:
- // x offset relative to the node, in pixels, to move the mouse. The default is half the node's width.
- //
- // offsetY:
- // y offset relative to the node, in pixels, to move the mouse. The default is half the node's height.
- //
-
- doh.robot._assertRobot();
- duration = duration||100;
- this.sequence(function(){
- node=doh.robot._resolveNode(node);
- doh.robot._scrollIntoView(node);
- var pos = doh.robot._position(node);
- if(offsetY === undefined){
- offsetX=pos.w/2;
- offsetY=pos.h/2;
- }
- var x = pos.x+offsetX;
- var y = pos.y+offsetY;
- doh.robot._mouseMove(x, y, false, duration);
- }, delay, duration);
- }
-});
-
-})();
-
-}
diff --git a/lib/dojo/robotx.js b/lib/dojo/robotx.js
deleted file mode 100644
index 3a07c6903..000000000
--- a/lib/dojo/robotx.js
+++ /dev/null
@@ -1,173 +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["dojo.robotx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.robotx"] = true;
-dojo.provide("dojo.robotx");
-dojo.require("dojo.robot");
-
-
-dojo.experimental("dojo.robotx");
-
-// loads an external app into an iframe and points dojo.doc to the iframe document, allowing the robot to control it
-// to use: set robotURL in djConfig to the URL you want to load
-// dojo.require this file
-
-(function(){
-
-var iframe = null;
-
-var groupStarted=dojo.connect(doh, '_groupStarted', function(){
- dojo.disconnect(groupStarted);
- iframe.style.visibility="visible";
-});
-
-var attachIframe = function(){
- dojo.addOnLoad(function(){
- var emptyStyle = {
- overflow: dojo.isWebKit? 'hidden' : 'visible',
- margin: '0px',
- borderWidth: '0px',
- height: '100%',
- width: '100%'
- };
- dojo.style(document.documentElement, emptyStyle);
- dojo.style(document.body, emptyStyle);
- document.body.appendChild(iframe);
- var base=document.createElement('base');
- base.href=iframe.src;
- document.getElementsByTagName("head")[0].appendChild(base);
- });
-};
-
-// Prevent race conditions between iframe loading and robot init.
-// If iframe is allowed to load while the robot is typing, sync XHRs can prevent the robot from completing its initialization.
-var robotReady=false;
-var robotFrame=null;
-var _run=doh.robot._run;
-doh.robot._run=function(frame){
- // Called from robot when the robot completed its initialization.
- robotReady = true;
- robotFrame = frame;
- doh.robot._run=_run;
- // If initRobot was already called, then attach the iframe.
- if(iframe.src){ attachIframe(); }
-}
-
-var onIframeLoad=function(){
- // initial load handler: update the document and start the tests
- doh.robot._updateDocument();
- onIframeLoad = null;
- var scrollRoot = (document.compatMode == 'BackCompat')? document.body : document.documentElement;
- var consoleHeight = document.getElementById('robotconsole').offsetHeight;
- if(consoleHeight){
- iframe.style.height = (scrollRoot.clientHeight - consoleHeight)+"px";
- }
- // If dojo is present in the test case, then at least make a best effort to wait for it to load.
- // The test must handle other race conditions like initial data queries by itself.
- if(iframe.contentWindow.dojo){
- iframe.contentWindow.dojo.addOnLoad(function(){
- doh.robot._run(robotFrame);
- });
- }else{
- doh.robot._run(robotFrame);
- }
-};
-
-var iframeLoad=function(){
- if(onIframeLoad){
- onIframeLoad();
- }
- var unloadConnect = dojo.connect(dojo.body(), 'onunload', function(){
- dojo.global = window;
- dojo.doc = document;
- dojo.disconnect(unloadConnect);
- });
-};
-
-// write the firebug console to a place it will fit
-dojo.config.debugContainerId = "robotconsole";
-dojo.config.debugHeight = dojo.config.debugHeight || 200;
-document.write('<div id="robotconsole" style="position:absolute;left:0px;bottom:0px;width:100%;"></div>');
-
-// write the iframe
-//document.writeln('<iframe id="robotapplication" style="visibility:hidden; border:0px none; padding:0px; margin:0px; position:absolute; left:0px; top:0px; width:100%; height:100%; z-index: 1;" src="'+dojo.config.robotURL+'" onload="iframeLoad();" ></iframe>');
-iframe = document.createElement('iframe');
-iframe.setAttribute("ALLOWTRANSPARENCY","true");
-iframe.scrolling = dojo.isIE? "yes" : "auto";
-dojo.style(iframe,{visibility:'hidden', border:'0px none', padding:'0px', margin:'0px', position:'absolute', left:'0px', top:'0px', width:'100%', height:'100%'});
-if(iframe['attachEvent'] !== undefined){
- iframe.attachEvent('onload', iframeLoad);
-}else{
- dojo.connect(iframe, 'onload', iframeLoad);
-}
-
-
-
-
-dojo.mixin(doh.robot,{
- _updateDocument: function(){
- dojo.setContext(iframe.contentWindow, iframe.contentWindow.document);
- var win = dojo.global;
- if(win["dojo"]){
- // allow the tests to subscribe to topics published by the iframe
- dojo._topics = win.dojo._topics;
- }
-
- },
-
- initRobot: function(/*String*/ url){
- // summary:
- // Opens the application at the specified URL for testing, redirecting dojo to point to the application environment instead of the test environment.
- //
- // url:
- // URL to open. Any of the test's dojo.doc calls (e.g. dojo.byId()), and any dijit.registry calls (e.g. dijit.byId()) will point to elements and widgets inside this application.
- //
-
- iframe.src=url;
- // see above note about race conditions
- if(robotReady){
- attachIframe();
-
- }
- },
-
- waitForPageToLoad: function(/*Function*/ submitActions){
- // summary:
- // Notifies DOH that the doh.robot is about to make a page change in the application it is driving,
- // returning a doh.Deferred object the user should return in their runTest function as part of a DOH test.
- //
- // description:
- // Notifies DOH that the doh.robot is about to make a page change in the application it is driving,
- // returning a doh.Deferred object the user should return in their runTest function as part of a DOH test.
- // Example:
- // runTest:function(){
- // return waitForPageLoad(function(){ doh.robot.keyPress(dojo.keys.ENTER, 500); });
- // }
- //
- // submitActions:
- // The doh.robot will execute the actions the test passes into the submitActions argument (like clicking the submit button),
- // expecting these actions to create a page change (like a form submit).
- // After these actions execute and the resulting page loads, the next test will start.
- //
-
- var d = new doh.Deferred();
- // create iframe event handler to track submit progress
- onIframeLoad = function(){
- onIframeLoad = null;
- // set dojo.doc on every page change to point to the iframe doc so the robot works
- doh.robot._updateDocument();
- d.callback(true);
- };
- submitActions();
- return d;
- }
-
-});
-})();
-
-}
diff --git a/lib/dojo/rpc/JsonService.js b/lib/dojo/rpc/JsonService.js
index 064fd0fee..5a755252f 100644
--- a/lib/dojo/rpc/JsonService.js
+++ b/lib/dojo/rpc/JsonService.js
@@ -4,88 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.rpc.JsonService"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.rpc.JsonService"] = true;
-dojo.provide("dojo.rpc.JsonService");
-dojo.require("dojo.rpc.RpcService");
-
-
-dojo.declare("dojo.rpc.JsonService", dojo.rpc.RpcService, {
- bustCache: false,
- contentType: "application/json-rpc",
- lastSubmissionId: 0,
-
- callRemote: function(method, params){
- // summary:
- // call an arbitrary remote method without requiring it to be
- // predefined with SMD
- // method: string
- // the name of the remote method you want to call.
- // params: array
- // array of parameters to pass to method
-
- var deferred = new dojo.Deferred();
- this.bind(method, params, deferred);
- return deferred;
- },
-
- bind: function(method, parameters, deferredRequestHandler, url){
- //summary:
- // JSON-RPC bind method. Takes remote method, parameters,
- // deferred, and a url, calls createRequest to make a JSON-RPC
- // envelope and passes that off with bind.
- // method: string
- // The name of the method we are calling
- // parameters: array
- // The parameters we are passing off to the method
- // deferredRequestHandler: deferred
- // The Deferred object for this particular request
-
- var def = dojo.rawXhrPost({
- url: url||this.serviceUrl,
- postData: this.createRequest(method, parameters),
- contentType: this.contentType,
- timeout: this.timeout,
- handleAs: "json-comment-optional"
- });
- def.addCallbacks(this.resultCallback(deferredRequestHandler), this.errorCallback(deferredRequestHandler));
- },
-
- createRequest: function(method, params){
- // summary:
- // create a JSON-RPC envelope for the request
- // method: string
- // The name of the method we are creating the requst for
- // params: array
- // The array of parameters for this request;
-
- var req = { "params": params, "method": method, "id": ++this.lastSubmissionId };
- var data = dojo.toJson(req);
- return data;
- },
-
- parseResults: function(/*anything*/obj){
- //summary:
- // parse the result envelope and pass the results back to
- // the callback function
- // obj: Object
- // Object containing envelope of data we recieve from the server
-
- if(dojo.isObject(obj)){
- if("result" in obj){
- return obj.result;
- }
- if("Result" in obj){
- return obj.Result;
- }
- if("ResultSet" in obj){
- return obj.ResultSet;
- }
- }
- return obj;
- }
- }
-);
-
-}
+//>>built
+define("dojo/rpc/JsonService",["../main","./RpcService"],function(_1){_1.declare("dojo.rpc.JsonService",_1.rpc.RpcService,{bustCache:false,contentType:"application/json-rpc",lastSubmissionId:0,callRemote:function(_2,_3){var _4=new _1.Deferred();this.bind(_2,_3,_4);return _4;},bind:function(_5,_6,_7,_8){var _9=_1.rawXhrPost({url:_8||this.serviceUrl,postData:this.createRequest(_5,_6),contentType:this.contentType,timeout:this.timeout,handleAs:"json-comment-optional"});_9.addCallbacks(this.resultCallback(_7),this.errorCallback(_7));},createRequest:function(_a,_b){var _c={"params":_b,"method":_a,"id":++this.lastSubmissionId};return _1.toJson(_c);},parseResults:function(_d){if(_1.isObject(_d)){if("result" in _d){return _d.result;}if("Result" in _d){return _d.Result;}if("ResultSet" in _d){return _d.ResultSet;}}return _d;}});return _1.rpc.JsonService;}); \ No newline at end of file
diff --git a/lib/dojo/rpc/JsonService.js.uncompressed.js b/lib/dojo/rpc/JsonService.js.uncompressed.js
new file mode 100644
index 000000000..ae7703d99
--- /dev/null
+++ b/lib/dojo/rpc/JsonService.js.uncompressed.js
@@ -0,0 +1,85 @@
+define("dojo/rpc/JsonService", ["../main", "./RpcService"], function(dojo) {
+ // module:
+ // dojo/rpc/JsonService
+ // summary:
+ // TODOC
+
+
+dojo.declare("dojo.rpc.JsonService", dojo.rpc.RpcService, {
+ bustCache: false,
+ contentType: "application/json-rpc",
+ lastSubmissionId: 0,
+
+ callRemote: function(method, params){
+ // summary:
+ // call an arbitrary remote method without requiring it to be
+ // predefined with SMD
+ // method: string
+ // the name of the remote method you want to call.
+ // params: array
+ // array of parameters to pass to method
+
+ var deferred = new dojo.Deferred();
+ this.bind(method, params, deferred);
+ return deferred;
+ },
+
+ bind: function(method, parameters, deferredRequestHandler, url){
+ //summary:
+ // JSON-RPC bind method. Takes remote method, parameters,
+ // deferred, and a url, calls createRequest to make a JSON-RPC
+ // envelope and passes that off with bind.
+ // method: string
+ // The name of the method we are calling
+ // parameters: array
+ // The parameters we are passing off to the method
+ // deferredRequestHandler: deferred
+ // The Deferred object for this particular request
+
+ var def = dojo.rawXhrPost({
+ url: url||this.serviceUrl,
+ postData: this.createRequest(method, parameters),
+ contentType: this.contentType,
+ timeout: this.timeout,
+ handleAs: "json-comment-optional"
+ });
+ def.addCallbacks(this.resultCallback(deferredRequestHandler), this.errorCallback(deferredRequestHandler));
+ },
+
+ createRequest: function(method, params){
+ // summary:
+ // create a JSON-RPC envelope for the request
+ // method: string
+ // The name of the method we are creating the requst for
+ // params: array
+ // The array of parameters for this request;
+
+ var req = { "params": params, "method": method, "id": ++this.lastSubmissionId };
+ return dojo.toJson(req);
+ },
+
+ parseResults: function(/*anything*/obj){
+ //summary:
+ // parse the result envelope and pass the results back to
+ // the callback function
+ // obj: Object
+ // Object containing envelope of data we recieve from the server
+
+ if(dojo.isObject(obj)){
+ if("result" in obj){
+ return obj.result;
+ }
+ if("Result" in obj){
+ return obj.Result;
+ }
+ if("ResultSet" in obj){
+ return obj.ResultSet;
+ }
+ }
+ return obj;
+ }
+ }
+);
+
+return dojo.rpc.JsonService;
+});
diff --git a/lib/dojo/rpc/JsonpService.js b/lib/dojo/rpc/JsonpService.js
index ecdadc7fc..7bb74e07c 100644
--- a/lib/dojo/rpc/JsonpService.js
+++ b/lib/dojo/rpc/JsonpService.js
@@ -4,70 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.rpc.JsonpService"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.rpc.JsonpService"] = true;
-dojo.provide("dojo.rpc.JsonpService");
-dojo.require("dojo.rpc.RpcService");
-dojo.require("dojo.io.script");
-
-
-dojo.declare("dojo.rpc.JsonpService", dojo.rpc.RpcService, {
- // summary:
- // Generic JSONP service. Minimally extends RpcService to allow
- // easy definition of nearly any JSONP style service. Example
- // SMD files exist in dojox.data
-
- constructor: function(args, requiredArgs){
- if(this.required) {
- if(requiredArgs){
- dojo.mixin(this.required, requiredArgs);
- }
-
- dojo.forEach(this.required, function(req){
- if(req=="" || req==undefined){
- throw new Error("Required Service Argument not found: "+req);
- }
- });
- }
- },
-
- strictArgChecks: false,
-
- bind: function(method, parameters, deferredRequestHandler, url){
- //summary:
- // JSONP bind method. Takes remote method, parameters,
- // deferred, and a url, calls createRequest to make a JSON-RPC
- // envelope and passes that off with bind.
- // method: string
- // The name of the method we are calling
- // parameters: array
- // The parameters we are passing off to the method
- // deferredRequestHandler: deferred
- // The Deferred object for this particular request
-
- var def = dojo.io.script.get({
- url: url||this.serviceUrl,
- callbackParamName: this.callbackParamName||"callback",
- content: this.createRequest(parameters),
- timeout: this.timeout,
- handleAs: "json",
- preventCache: true
- });
- def.addCallbacks(this.resultCallback(deferredRequestHandler), this.errorCallback(deferredRequestHandler));
- },
-
- createRequest: function(parameters){
- // summary:
- // create a JSONP req
- // params: array
- // The array of parameters for this request;
-
- var params = (dojo.isArrayLike(parameters) && parameters.length==1) ?
- parameters[0] : {};
- dojo.mixin(params,this.required);
- return params;
- }
-});
-
-}
+//>>built
+define("dojo/rpc/JsonpService",["../main","./RpcService","../io/script"],function(_1){_1.declare("dojo.rpc.JsonpService",_1.rpc.RpcService,{constructor:function(_2,_3){if(this.required){if(_3){_1.mixin(this.required,_3);}_1.forEach(this.required,function(_4){if(_4==""||_4==undefined){throw new Error("Required Service Argument not found: "+_4);}});}},strictArgChecks:false,bind:function(_5,_6,_7,_8){var _9=_1.io.script.get({url:_8||this.serviceUrl,callbackParamName:this.callbackParamName||"callback",content:this.createRequest(_6),timeout:this.timeout,handleAs:"json",preventCache:true});_9.addCallbacks(this.resultCallback(_7),this.errorCallback(_7));},createRequest:function(_a){var _b=(_1.isArrayLike(_a)&&_a.length==1)?_a[0]:{};_1.mixin(_b,this.required);return _b;}});return _1.rpc.JsonpService;}); \ No newline at end of file
diff --git a/lib/dojo/rpc/JsonpService.js.uncompressed.js b/lib/dojo/rpc/JsonpService.js.uncompressed.js
new file mode 100644
index 000000000..bc1d7108d
--- /dev/null
+++ b/lib/dojo/rpc/JsonpService.js.uncompressed.js
@@ -0,0 +1,67 @@
+define("dojo/rpc/JsonpService", ["../main", "./RpcService", "../io/script"], function(dojo) {
+ // module:
+ // dojo/rpc/JsonpService
+ // summary:
+ // TODOC
+
+
+dojo.declare("dojo.rpc.JsonpService", dojo.rpc.RpcService, {
+ // summary:
+ // Generic JSONP service. Minimally extends RpcService to allow
+ // easy definition of nearly any JSONP style service. Example
+ // SMD files exist in dojox.data
+
+ constructor: function(args, requiredArgs){
+ if(this.required) {
+ if(requiredArgs){
+ dojo.mixin(this.required, requiredArgs);
+ }
+
+ dojo.forEach(this.required, function(req){
+ if(req=="" || req==undefined){
+ throw new Error("Required Service Argument not found: "+req);
+ }
+ });
+ }
+ },
+
+ strictArgChecks: false,
+
+ bind: function(method, parameters, deferredRequestHandler, url){
+ //summary:
+ // JSONP bind method. Takes remote method, parameters,
+ // deferred, and a url, calls createRequest to make a JSON-RPC
+ // envelope and passes that off with bind.
+ // method: string
+ // The name of the method we are calling
+ // parameters: array
+ // The parameters we are passing off to the method
+ // deferredRequestHandler: deferred
+ // The Deferred object for this particular request
+
+ var def = dojo.io.script.get({
+ url: url||this.serviceUrl,
+ callbackParamName: this.callbackParamName||"callback",
+ content: this.createRequest(parameters),
+ timeout: this.timeout,
+ handleAs: "json",
+ preventCache: true
+ });
+ def.addCallbacks(this.resultCallback(deferredRequestHandler), this.errorCallback(deferredRequestHandler));
+ },
+
+ createRequest: function(parameters){
+ // summary:
+ // create a JSONP req
+ // params: array
+ // The array of parameters for this request;
+
+ var params = (dojo.isArrayLike(parameters) && parameters.length==1) ?
+ parameters[0] : {};
+ dojo.mixin(params,this.required);
+ return params;
+ }
+});
+
+return dojo.rpc.JsonpService;
+});
diff --git a/lib/dojo/rpc/RpcService.js b/lib/dojo/rpc/RpcService.js
index 5ef5dae7f..e504818be 100644
--- a/lib/dojo/rpc/RpcService.js
+++ b/lib/dojo/rpc/RpcService.js
@@ -4,177 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.rpc.RpcService"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.rpc.RpcService"] = true;
-dojo.provide("dojo.rpc.RpcService");
-
-
-dojo.declare("dojo.rpc.RpcService", null, {
- constructor: function(args){
- //summary:
- //Take a string as a url to retrieve an smd or an object that is an smd or partial smd to use
- //as a definition for the service
- //
- // args: object
- // Takes a number of properties as kwArgs for defining the service. It also
- // accepts a string. When passed a string, it is treated as a url from
- // which it should synchronously retrieve an smd file. Otherwise it is a kwArgs
- // object. It accepts serviceUrl, to manually define a url for the rpc service
- // allowing the rpc system to be used without an smd definition. strictArgChecks
- // forces the system to verify that the # of arguments provided in a call
- // matches those defined in the smd. smdString allows a developer to pass
- // a jsonString directly, which will be converted into an object or alternatively
- // smdObject is accepts an smdObject directly.
- //
- if(args){
- //if the arg is a string, we assume it is a url to retrieve an smd definition from
- if( (dojo.isString(args)) || (args instanceof dojo._Url)){
- if (args instanceof dojo._Url){
- var url = args + "";
- }else{
- url = args;
- }
- var def = dojo.xhrGet({
- url: url,
- handleAs: "json-comment-optional",
- sync: true
- });
-
- def.addCallback(this, "processSmd");
- def.addErrback(function() {
- throw new Error("Unable to load SMD from " + args);
- });
-
- }else if(args.smdStr){
- this.processSmd(dojo.eval("("+args.smdStr+")"));
- }else{
- // otherwise we assume it's an arguments object with the following
- // (optional) properties:
- // - serviceUrl
- // - strictArgChecks
- // - smdStr
- // - smdObj
-
- if(args.serviceUrl){
- this.serviceUrl = args.serviceUrl;
- }
-
- this.timeout = args.timeout || 3000;
-
- if("strictArgChecks" in args){
- this.strictArgChecks = args.strictArgChecks;
- }
-
- this.processSmd(args);
- }
- }
- },
-
- strictArgChecks: true,
- serviceUrl: "",
-
- parseResults: function(obj){
- // summary
- // parse the results coming back from an rpc request. this
- // base implementation, just returns the full object
- // subclasses should parse and only return the actual results
- // obj: Object
- // Object that is the return results from an rpc request
- return obj;
- },
-
- errorCallback: function(/* dojo.Deferred */ deferredRequestHandler){
- // summary:
- // create callback that calls the Deferres errback method
- // deferredRequestHandler: Deferred
- // The deferred object handling a request.
- return function(data){
- deferredRequestHandler.errback(data.message);
- };
- },
-
- resultCallback: function(/* dojo.Deferred */ deferredRequestHandler){
- // summary:
- // create callback that calls the Deferred's callback method
- // deferredRequestHandler: Deferred
- // The deferred object handling a request.
-
- var tf = dojo.hitch(this,
- function(obj){
- if(obj.error!=null){
- var err;
- if(typeof obj.error == 'object'){
- err = new Error(obj.error.message);
- err.code = obj.error.code;
- err.error = obj.error.error;
- }else{
- err = new Error(obj.error);
- }
- err.id = obj.id;
- err.errorObject = obj;
- deferredRequestHandler.errback(err);
- }else{
- deferredRequestHandler.callback(this.parseResults(obj));
- }
- }
- );
- return tf;
- },
-
- generateMethod: function(/*string*/ method, /*array*/ parameters, /*string*/ url){
- // summary:
- // generate the local bind methods for the remote object
- // method: string
- // The name of the method we are generating
- // parameters: array
- // the array of parameters for this call.
- // url: string
- // the service url for this call
-
- return dojo.hitch(this, function(){
- var deferredRequestHandler = new dojo.Deferred();
-
- // if params weren't specified, then we can assume it's varargs
- if( (this.strictArgChecks) &&
- (parameters != null) &&
- (arguments.length != parameters.length)
- ){
- // put error stuff here, no enough params
- throw new Error("Invalid number of parameters for remote method.");
- }else{
- this.bind(method, dojo._toArray(arguments), deferredRequestHandler, url);
- }
-
- return deferredRequestHandler;
- });
- },
-
- processSmd: function(object){
- // summary:
- // callback method for reciept of a smd object. Parse the smd
- // and generate functions based on the description
- // object:
- // smd object defining this service.
-
- if(object.methods){
- dojo.forEach(object.methods, function(m){
- if(m && m.name){
- this[m.name] = this.generateMethod( m.name,
- m.parameters,
- m.url||m.serviceUrl||m.serviceURL);
- if(!dojo.isFunction(this[m.name])){
- throw new Error("RpcService: Failed to create" + m.name + "()");
- /*console.log("RpcService: Failed to create", m.name, "()");*/
- }
- }
- }, this);
- }
-
- this.serviceUrl = object.serviceUrl||object.serviceURL;
- this.required = object.required;
- this.smd = object;
- }
-});
-
-}
+//>>built
+define("dojo/rpc/RpcService",["../main","../_base/url"],function(_1){_1.declare("dojo.rpc.RpcService",null,{constructor:function(_2){if(_2){if((_1.isString(_2))||(_2 instanceof _1._Url)){if(_2 instanceof _1._Url){var _3=_2+"";}else{_3=_2;}var _4=_1.xhrGet({url:_3,handleAs:"json-comment-optional",sync:true});_4.addCallback(this,"processSmd");_4.addErrback(function(){throw new Error("Unable to load SMD from "+_2);});}else{if(_2.smdStr){this.processSmd(_1.eval("("+_2.smdStr+")"));}else{if(_2.serviceUrl){this.serviceUrl=_2.serviceUrl;}this.timeout=_2.timeout||3000;if("strictArgChecks" in _2){this.strictArgChecks=_2.strictArgChecks;}this.processSmd(_2);}}}},strictArgChecks:true,serviceUrl:"",parseResults:function(_5){return _5;},errorCallback:function(_6){return function(_7){_6.errback(_7.message);};},resultCallback:function(_8){return _1.hitch(this,function(_9){if(_9.error!=null){var _a;if(typeof _9.error=="object"){_a=new Error(_9.error.message);_a.code=_9.error.code;_a.error=_9.error.error;}else{_a=new Error(_9.error);}_a.id=_9.id;_a.errorObject=_9;_8.errback(_a);}else{_8.callback(this.parseResults(_9));}});},generateMethod:function(_b,_c,_d){return _1.hitch(this,function(){var _e=new _1.Deferred();if((this.strictArgChecks)&&(_c!=null)&&(arguments.length!=_c.length)){throw new Error("Invalid number of parameters for remote method.");}else{this.bind(_b,_1._toArray(arguments),_e,_d);}return _e;});},processSmd:function(_f){if(_f.methods){_1.forEach(_f.methods,function(m){if(m&&m.name){this[m.name]=this.generateMethod(m.name,m.parameters,m.url||m.serviceUrl||m.serviceURL);if(!_1.isFunction(this[m.name])){throw new Error("RpcService: Failed to create"+m.name+"()");}}},this);}this.serviceUrl=_f.serviceUrl||_f.serviceURL;this.required=_f.required;this.smd=_f;}});return _1.rpc.RpcService;}); \ No newline at end of file
diff --git a/lib/dojo/rpc/RpcService.js.uncompressed.js b/lib/dojo/rpc/RpcService.js.uncompressed.js
new file mode 100644
index 000000000..3675dadf6
--- /dev/null
+++ b/lib/dojo/rpc/RpcService.js.uncompressed.js
@@ -0,0 +1,175 @@
+define("dojo/rpc/RpcService", ["../main", "../_base/url"], function(dojo) {
+ // module:
+ // dojo/rpc/RpcService
+ // summary:
+ // TODOC
+
+
+dojo.declare("dojo.rpc.RpcService", null, {
+ constructor: function(args){
+ //summary:
+ //Take a string as a url to retrieve an smd or an object that is an smd or partial smd to use
+ //as a definition for the service
+ //
+ // args: object
+ // Takes a number of properties as kwArgs for defining the service. It also
+ // accepts a string. When passed a string, it is treated as a url from
+ // which it should synchronously retrieve an smd file. Otherwise it is a kwArgs
+ // object. It accepts serviceUrl, to manually define a url for the rpc service
+ // allowing the rpc system to be used without an smd definition. strictArgChecks
+ // forces the system to verify that the # of arguments provided in a call
+ // matches those defined in the smd. smdString allows a developer to pass
+ // a jsonString directly, which will be converted into an object or alternatively
+ // smdObject is accepts an smdObject directly.
+ //
+ if(args){
+ //if the arg is a string, we assume it is a url to retrieve an smd definition from
+ if( (dojo.isString(args)) || (args instanceof dojo._Url)){
+ if (args instanceof dojo._Url){
+ var url = args + "";
+ }else{
+ url = args;
+ }
+ var def = dojo.xhrGet({
+ url: url,
+ handleAs: "json-comment-optional",
+ sync: true
+ });
+
+ def.addCallback(this, "processSmd");
+ def.addErrback(function() {
+ throw new Error("Unable to load SMD from " + args);
+ });
+
+ }else if(args.smdStr){
+ this.processSmd(dojo.eval("("+args.smdStr+")"));
+ }else{
+ // otherwise we assume it's an arguments object with the following
+ // (optional) properties:
+ // - serviceUrl
+ // - strictArgChecks
+ // - smdStr
+ // - smdObj
+
+ if(args.serviceUrl){
+ this.serviceUrl = args.serviceUrl;
+ }
+
+ this.timeout = args.timeout || 3000;
+
+ if("strictArgChecks" in args){
+ this.strictArgChecks = args.strictArgChecks;
+ }
+
+ this.processSmd(args);
+ }
+ }
+ },
+
+ strictArgChecks: true,
+ serviceUrl: "",
+
+ parseResults: function(obj){
+ // summary:
+ // parse the results coming back from an rpc request. this
+ // base implementation, just returns the full object
+ // subclasses should parse and only return the actual results
+ // obj: Object
+ // Object that is the return results from an rpc request
+ return obj;
+ },
+
+ errorCallback: function(/* dojo.Deferred */ deferredRequestHandler){
+ // summary:
+ // create callback that calls the Deferres errback method
+ // deferredRequestHandler: Deferred
+ // The deferred object handling a request.
+ return function(data){
+ deferredRequestHandler.errback(data.message);
+ };
+ },
+
+ resultCallback: function(/* dojo.Deferred */ deferredRequestHandler){
+ // summary:
+ // create callback that calls the Deferred's callback method
+ // deferredRequestHandler: Deferred
+ // The deferred object handling a request.
+
+ return dojo.hitch(this,
+ function(obj){
+ if(obj.error!=null){
+ var err;
+ if(typeof obj.error == 'object'){
+ err = new Error(obj.error.message);
+ err.code = obj.error.code;
+ err.error = obj.error.error;
+ }else{
+ err = new Error(obj.error);
+ }
+ err.id = obj.id;
+ err.errorObject = obj;
+ deferredRequestHandler.errback(err);
+ }else{
+ deferredRequestHandler.callback(this.parseResults(obj));
+ }
+ }
+ );
+ },
+
+ generateMethod: function(/*string*/ method, /*array*/ parameters, /*string*/ url){
+ // summary:
+ // generate the local bind methods for the remote object
+ // method: string
+ // The name of the method we are generating
+ // parameters: array
+ // the array of parameters for this call.
+ // url: string
+ // the service url for this call
+
+ return dojo.hitch(this, function(){
+ var deferredRequestHandler = new dojo.Deferred();
+
+ // if params weren't specified, then we can assume it's varargs
+ if( (this.strictArgChecks) &&
+ (parameters != null) &&
+ (arguments.length != parameters.length)
+ ){
+ // put error stuff here, no enough params
+ throw new Error("Invalid number of parameters for remote method.");
+ }else{
+ this.bind(method, dojo._toArray(arguments), deferredRequestHandler, url);
+ }
+
+ return deferredRequestHandler;
+ });
+ },
+
+ processSmd: function(object){
+ // summary:
+ // callback method for reciept of a smd object. Parse the smd
+ // and generate functions based on the description
+ // object:
+ // smd object defining this service.
+
+ if(object.methods){
+ dojo.forEach(object.methods, function(m){
+ if(m && m.name){
+ this[m.name] = this.generateMethod( m.name,
+ m.parameters,
+ m.url||m.serviceUrl||m.serviceURL);
+ if(!dojo.isFunction(this[m.name])){
+ throw new Error("RpcService: Failed to create" + m.name + "()");
+ /*console.log("RpcService: Failed to create", m.name, "()");*/
+ }
+ }
+ }, this);
+ }
+
+ this.serviceUrl = object.serviceUrl||object.serviceURL;
+ this.required = object.required;
+ this.smd = object;
+ }
+});
+
+return dojo.rpc.RpcService;
+});
diff --git a/lib/dojo/selector/_loader.js b/lib/dojo/selector/_loader.js
new file mode 100644
index 000000000..68db99f00
--- /dev/null
+++ b/lib/dojo/selector/_loader.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/selector/_loader",["../has","require"],function(_1,_2){"use strict";var _3=document.createElement("div");_1.add("dom-qsa2.1",!!_3.querySelectorAll);_1.add("dom-qsa3",function(){try{_3.innerHTML="<p class='TEST'></p>";return _3.querySelectorAll(".TEST:empty").length==1;}catch(e){}});var _4;var _5="./acme",_6="./lite";return {load:function(id,_7,_8,_9){var _a=_2;id=id=="default"?_1("config-selectorEngine")||"css3":id;id=id=="css2"||id=="lite"?_6:id=="css2.1"?_1("dom-qsa2.1")?_6:_5:id=="css3"?_1("dom-qsa3")?_6:_5:id=="acme"?_5:(_a=_7)&&id;if(id.charAt(id.length-1)=="?"){id=id.substring(0,id.length-1);var _b=true;}if(_b&&(_1("dom-compliant-qsa")||_4)){return _8(_4);}_a([id],function(_c){if(id!="./lite"){_4=_c;}_8(_c);});}};}); \ No newline at end of file
diff --git a/lib/dojo/selector/_loader.js.uncompressed.js b/lib/dojo/selector/_loader.js.uncompressed.js
new file mode 100644
index 000000000..9543069e1
--- /dev/null
+++ b/lib/dojo/selector/_loader.js.uncompressed.js
@@ -0,0 +1,45 @@
+define("dojo/selector/_loader", ["../has", "require"],
+ function(has, require){
+// summary:
+// This module handles loading the appropriate selector engine for the given browser
+"use strict";
+var testDiv = document.createElement("div");
+has.add("dom-qsa2.1", !!testDiv.querySelectorAll);
+has.add("dom-qsa3", function(){
+ // test to see if we have a reasonable native selector engine available
+ try{
+ testDiv.innerHTML = "<p class='TEST'></p>"; // test kind of from sizzle
+ // Safari can't handle uppercase or unicode characters when
+ // in quirks mode, IE8 can't handle pseudos like :empty
+ return testDiv.querySelectorAll(".TEST:empty").length == 1;
+ }catch(e){}
+ });
+var fullEngine;
+var acme = "./acme", lite = "./lite";
+return {
+ load: function(id, parentRequire, loaded, config){
+ var req = require;
+ // here we implement the default logic for choosing a selector engine
+ id = id == "default" ? has("config-selectorEngine") || "css3" : id;
+ id = id == "css2" || id == "lite" ? lite :
+ id == "css2.1" ? has("dom-qsa2.1") ? lite : acme :
+ id == "css3" ? has("dom-qsa3") ? lite : acme :
+ id == "acme" ? acme : (req = parentRequire) && id;
+ if(id.charAt(id.length-1) == '?'){
+ id = id.substring(0,id.length - 1);
+ var optionalLoad = true;
+ }
+ // the query engine is optional, only load it if a native one is not available or existing one has not been loaded
+ if(optionalLoad && (has("dom-compliant-qsa") || fullEngine)){
+ return loaded(fullEngine);
+ }
+ // load the referenced selector engine
+ req([id], function(engine){
+ if(id != "./lite"){
+ fullEngine = engine;
+ }
+ loaded(engine);
+ });
+ }
+};
+});
diff --git a/lib/dojo/selector/acme.js b/lib/dojo/selector/acme.js
new file mode 100644
index 000000000..e75fbf0f4
--- /dev/null
+++ b/lib/dojo/selector/acme.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/selector/acme",["../_base/kernel","../has","../dom","../_base/sniff","../_base/array","../_base/lang","../_base/window"],function(_1,_2,_3){var _4=_1.trim;var _5=_1.forEach;var _6=function(){return _1.doc;};var _7=((_1.isWebKit||_1.isMozilla)&&((_6().compatMode)=="BackCompat"));var _8=">~+";var _9=false;var _a=function(){return true;};var _b=function(_c){if(_8.indexOf(_c.slice(-1))>=0){_c+=" * ";}else{_c+=" ";}var ts=function(s,e){return _4(_c.slice(s,e));};var _d=[];var _e=-1,_f=-1,_10=-1,_11=-1,_12=-1,_13=-1,_14=-1,lc="",cc="",_15;var x=0,ql=_c.length,_16=null,_17=null;var _18=function(){if(_14>=0){var tv=(_14==x)?null:ts(_14,x);_16[(_8.indexOf(tv)<0)?"tag":"oper"]=tv;_14=-1;}};var _19=function(){if(_13>=0){_16.id=ts(_13,x).replace(/\\/g,"");_13=-1;}};var _1a=function(){if(_12>=0){_16.classes.push(ts(_12+1,x).replace(/\\/g,""));_12=-1;}};var _1b=function(){_19();_18();_1a();};var _1c=function(){_1b();if(_11>=0){_16.pseudos.push({name:ts(_11+1,x)});}_16.loops=(_16.pseudos.length||_16.attrs.length||_16.classes.length);_16.oquery=_16.query=ts(_15,x);_16.otag=_16.tag=(_16["oper"])?null:(_16.tag||"*");if(_16.tag){_16.tag=_16.tag.toUpperCase();}if(_d.length&&(_d[_d.length-1].oper)){_16.infixOper=_d.pop();_16.query=_16.infixOper.query+" "+_16.query;}_d.push(_16);_16=null;};for(;lc=cc,cc=_c.charAt(x),x<ql;x++){if(lc=="\\"){continue;}if(!_16){_15=x;_16={query:null,pseudos:[],attrs:[],classes:[],tag:null,oper:null,id:null,getTag:function(){return (_9)?this.otag:this.tag;}};_14=x;}if(_e>=0){if(cc=="]"){if(!_17.attr){_17.attr=ts(_e+1,x);}else{_17.matchFor=ts((_10||_e+1),x);}var cmf=_17.matchFor;if(cmf){if((cmf.charAt(0)=="\"")||(cmf.charAt(0)=="'")){_17.matchFor=cmf.slice(1,-1);}}_16.attrs.push(_17);_17=null;_e=_10=-1;}else{if(cc=="="){var _1d=("|~^$*".indexOf(lc)>=0)?lc:"";_17.type=_1d+cc;_17.attr=ts(_e+1,x-_1d.length);_10=x+1;}}}else{if(_f>=0){if(cc==")"){if(_11>=0){_17.value=ts(_f+1,x);}_11=_f=-1;}}else{if(cc=="#"){_1b();_13=x+1;}else{if(cc=="."){_1b();_12=x;}else{if(cc==":"){_1b();_11=x;}else{if(cc=="["){_1b();_e=x;_17={};}else{if(cc=="("){if(_11>=0){_17={name:ts(_11+1,x),value:null};_16.pseudos.push(_17);}_f=x;}else{if((cc==" ")&&(lc!=cc)){_1c();}}}}}}}}}return _d;};var _1e=function(_1f,_20){if(!_1f){return _20;}if(!_20){return _1f;}return function(){return _1f.apply(window,arguments)&&_20.apply(window,arguments);};};var _21=function(i,arr){var r=arr||[];if(i){r.push(i);}return r;};var _22=function(n){return (1==n.nodeType);};var _23="";var _24=function(_25,_26){if(!_25){return _23;}if(_26=="class"){return _25.className||_23;}if(_26=="for"){return _25.htmlFor||_23;}if(_26=="style"){return _25.style.cssText||_23;}return (_9?_25.getAttribute(_26):_25.getAttribute(_26,2))||_23;};var _27={"*=":function(_28,_29){return function(_2a){return (_24(_2a,_28).indexOf(_29)>=0);};},"^=":function(_2b,_2c){return function(_2d){return (_24(_2d,_2b).indexOf(_2c)==0);};},"$=":function(_2e,_2f){return function(_30){var ea=" "+_24(_30,_2e);return (ea.lastIndexOf(_2f)==(ea.length-_2f.length));};},"~=":function(_31,_32){var _33=" "+_32+" ";return function(_34){var ea=" "+_24(_34,_31)+" ";return (ea.indexOf(_33)>=0);};},"|=":function(_35,_36){var _37=_36+"-";return function(_38){var ea=_24(_38,_35);return ((ea==_36)||(ea.indexOf(_37)==0));};},"=":function(_39,_3a){return function(_3b){return (_24(_3b,_39)==_3a);};}};var _3c=(typeof _6().firstChild.nextElementSibling=="undefined");var _3d=!_3c?"nextElementSibling":"nextSibling";var _3e=!_3c?"previousElementSibling":"previousSibling";var _3f=(_3c?_22:_a);var _40=function(_41){while(_41=_41[_3e]){if(_3f(_41)){return false;}}return true;};var _42=function(_43){while(_43=_43[_3d]){if(_3f(_43)){return false;}}return true;};var _44=function(_45){var _46=_45.parentNode;var i=0,_47=_46.children||_46.childNodes,ci=(_45["_i"]||-1),cl=(_46["_l"]||-1);if(!_47){return -1;}var l=_47.length;if(cl==l&&ci>=0&&cl>=0){return ci;}_46["_l"]=l;ci=-1;for(var te=_46["firstElementChild"]||_46["firstChild"];te;te=te[_3d]){if(_3f(te)){te["_i"]=++i;if(_45===te){ci=i;}}}return ci;};var _48=function(_49){return !((_44(_49))%2);};var _4a=function(_4b){return ((_44(_4b))%2);};var _4c={"checked":function(_4d,_4e){return function(_4f){return !!("checked" in _4f?_4f.checked:_4f.selected);};},"first-child":function(){return _40;},"last-child":function(){return _42;},"only-child":function(_50,_51){return function(_52){return _40(_52)&&_42(_52);};},"empty":function(_53,_54){return function(_55){var cn=_55.childNodes;var cnl=_55.childNodes.length;for(var x=cnl-1;x>=0;x--){var nt=cn[x].nodeType;if((nt===1)||(nt==3)){return false;}}return true;};},"contains":function(_56,_57){var cz=_57.charAt(0);if(cz=="\""||cz=="'"){_57=_57.slice(1,-1);}return function(_58){return (_58.innerHTML.indexOf(_57)>=0);};},"not":function(_59,_5a){var p=_b(_5a)[0];var _5b={el:1};if(p.tag!="*"){_5b.tag=1;}if(!p.classes.length){_5b.classes=1;}var ntf=_5c(p,_5b);return function(_5d){return (!ntf(_5d));};},"nth-child":function(_5e,_5f){var pi=parseInt;if(_5f=="odd"){return _4a;}else{if(_5f=="even"){return _48;}}if(_5f.indexOf("n")!=-1){var _60=_5f.split("n",2);var _61=_60[0]?((_60[0]=="-")?-1:pi(_60[0])):1;var idx=_60[1]?pi(_60[1]):0;var lb=0,ub=-1;if(_61>0){if(idx<0){idx=(idx%_61)&&(_61+(idx%_61));}else{if(idx>0){if(idx>=_61){lb=idx-idx%_61;}idx=idx%_61;}}}else{if(_61<0){_61*=-1;if(idx>0){ub=idx;idx=idx%_61;}}}if(_61>0){return function(_62){var i=_44(_62);return (i>=lb)&&(ub<0||i<=ub)&&((i%_61)==idx);};}else{_5f=idx;}}var _63=pi(_5f);return function(_64){return (_44(_64)==_63);};}};var _65=(_1.isIE&&(_1.isIE<9||_1.isQuirks))?function(_66){var clc=_66.toLowerCase();if(clc=="class"){_66="className";}return function(_67){return (_9?_67.getAttribute(_66):_67[_66]||_67[clc]);};}:function(_68){return function(_69){return (_69&&_69.getAttribute&&_69.hasAttribute(_68));};};var _5c=function(_6a,_6b){if(!_6a){return _a;}_6b=_6b||{};var ff=null;if(!("el" in _6b)){ff=_1e(ff,_22);}if(!("tag" in _6b)){if(_6a.tag!="*"){ff=_1e(ff,function(_6c){return (_6c&&(_6c.tagName==_6a.getTag()));});}}if(!("classes" in _6b)){_5(_6a.classes,function(_6d,idx,arr){var re=new RegExp("(?:^|\\s)"+_6d+"(?:\\s|$)");ff=_1e(ff,function(_6e){return re.test(_6e.className);});ff.count=idx;});}if(!("pseudos" in _6b)){_5(_6a.pseudos,function(_6f){var pn=_6f.name;if(_4c[pn]){ff=_1e(ff,_4c[pn](pn,_6f.value));}});}if(!("attrs" in _6b)){_5(_6a.attrs,function(_70){var _71;var a=_70.attr;if(_70.type&&_27[_70.type]){_71=_27[_70.type](a,_70.matchFor);}else{if(a.length){_71=_65(a);}}if(_71){ff=_1e(ff,_71);}});}if(!("id" in _6b)){if(_6a.id){ff=_1e(ff,function(_72){return (!!_72&&(_72.id==_6a.id));});}}if(!ff){if(!("default" in _6b)){ff=_a;}}return ff;};var _73=function(_74){return function(_75,ret,bag){while(_75=_75[_3d]){if(_3c&&(!_22(_75))){continue;}if((!bag||_76(_75,bag))&&_74(_75)){ret.push(_75);}break;}return ret;};};var _77=function(_78){return function(_79,ret,bag){var te=_79[_3d];while(te){if(_3f(te)){if(bag&&!_76(te,bag)){break;}if(_78(te)){ret.push(te);}}te=te[_3d];}return ret;};};var _7a=function(_7b){_7b=_7b||_a;return function(_7c,ret,bag){var te,x=0,_7d=_7c.children||_7c.childNodes;while(te=_7d[x++]){if(_3f(te)&&(!bag||_76(te,bag))&&(_7b(te,x))){ret.push(te);}}return ret;};};var _7e=function(_7f,_80){var pn=_7f.parentNode;while(pn){if(pn==_80){break;}pn=pn.parentNode;}return !!pn;};var _81={};var _82=function(_83){var _84=_81[_83.query];if(_84){return _84;}var io=_83.infixOper;var _85=(io?io.oper:"");var _86=_5c(_83,{el:1});var qt=_83.tag;var _87=("*"==qt);var ecs=_6()["getElementsByClassName"];if(!_85){if(_83.id){_86=(!_83.loops&&_87)?_a:_5c(_83,{el:1,id:1});_84=function(_88,arr){var te=_3.byId(_83.id,(_88.ownerDocument||_88));if(!te||!_86(te)){return;}if(9==_88.nodeType){return _21(te,arr);}else{if(_7e(te,_88)){return _21(te,arr);}}};}else{if(ecs&&/\{\s*\[native code\]\s*\}/.test(String(ecs))&&_83.classes.length&&!_7){_86=_5c(_83,{el:1,classes:1,id:1});var _89=_83.classes.join(" ");_84=function(_8a,arr,bag){var ret=_21(0,arr),te,x=0;var _8b=_8a.getElementsByClassName(_89);while((te=_8b[x++])){if(_86(te,_8a)&&_76(te,bag)){ret.push(te);}}return ret;};}else{if(!_87&&!_83.loops){_84=function(_8c,arr,bag){var ret=_21(0,arr),te,x=0;var _8d=_8c.getElementsByTagName(_83.getTag());while((te=_8d[x++])){if(_76(te,bag)){ret.push(te);}}return ret;};}else{_86=_5c(_83,{el:1,tag:1,id:1});_84=function(_8e,arr,bag){var ret=_21(0,arr),te,x=0;var _8f=_8e.getElementsByTagName(_83.getTag());while((te=_8f[x++])){if(_86(te,_8e)&&_76(te,bag)){ret.push(te);}}return ret;};}}}}else{var _90={el:1};if(_87){_90.tag=1;}_86=_5c(_83,_90);if("+"==_85){_84=_73(_86);}else{if("~"==_85){_84=_77(_86);}else{if(">"==_85){_84=_7a(_86);}}}}return _81[_83.query]=_84;};var _91=function(_92,_93){var _94=_21(_92),qp,x,te,qpl=_93.length,bag,ret;for(var i=0;i<qpl;i++){ret=[];qp=_93[i];x=_94.length-1;if(x>0){bag={};ret.nozip=true;}var gef=_82(qp);for(var j=0;(te=_94[j]);j++){gef(te,ret,bag);}if(!ret.length){break;}_94=ret;}return ret;};var _95={},_96={};var _97=function(_98){var _99=_b(_4(_98));if(_99.length==1){var tef=_82(_99[0]);return function(_9a){var r=tef(_9a,[]);if(r){r.nozip=true;}return r;};}return function(_9b){return _91(_9b,_99);};};var nua=navigator.userAgent;var wk="WebKit/";var _9c=(_1.isWebKit&&(nua.indexOf(wk)>0)&&(parseFloat(nua.split(wk)[1])>528));var _9d=_1.isIE?"commentStrip":"nozip";var qsa="querySelectorAll";var _9e=(!!_6()[qsa]&&(!_1.isSafari||(_1.isSafari>3.1)||_9c));var _9f=/n\+\d|([^ ])?([>~+])([^ =])?/g;var _a0=function(_a1,pre,ch,_a2){return ch?(pre?pre+" ":"")+ch+(_a2?" "+_a2:""):_a1;};var _a3=function(_a4,_a5){_a4=_a4.replace(_9f,_a0);if(_9e){var _a6=_96[_a4];if(_a6&&!_a5){return _a6;}}var _a7=_95[_a4];if(_a7){return _a7;}var qcz=_a4.charAt(0);var _a8=(-1==_a4.indexOf(" "));if((_a4.indexOf("#")>=0)&&(_a8)){_a5=true;}var _a9=(_9e&&(!_a5)&&(_8.indexOf(qcz)==-1)&&(!_1.isIE||(_a4.indexOf(":")==-1))&&(!(_7&&(_a4.indexOf(".")>=0)))&&(_a4.indexOf(":contains")==-1)&&(_a4.indexOf(":checked")==-1)&&(_a4.indexOf("|=")==-1));if(_a9){var tq=(_8.indexOf(_a4.charAt(_a4.length-1))>=0)?(_a4+" *"):_a4;return _96[_a4]=function(_aa){try{if(!((9==_aa.nodeType)||_a8)){throw "";}var r=_aa[qsa](tq);r[_9d]=true;return r;}catch(e){return _a3(_a4,true)(_aa);}};}else{var _ab=_a4.split(/\s*,\s*/);return _95[_a4]=((_ab.length<2)?_97(_a4):function(_ac){var _ad=0,ret=[],tp;while((tp=_ab[_ad++])){ret=ret.concat(_97(tp)(_ac));}return ret;});}};var _ae=0;var _af=_1.isIE?function(_b0){if(_9){return (_b0.getAttribute("_uid")||_b0.setAttribute("_uid",++_ae)||_ae);}else{return _b0.uniqueID;}}:function(_b1){return (_b1._uid||(_b1._uid=++_ae));};var _76=function(_b2,bag){if(!bag){return 1;}var id=_af(_b2);if(!bag[id]){return bag[id]=1;}return 0;};var _b3="_zipIdx";var _b4=function(arr){if(arr&&arr.nozip){return arr;}var ret=[];if(!arr||!arr.length){return ret;}if(arr[0]){ret.push(arr[0]);}if(arr.length<2){return ret;}_ae++;if(_1.isIE&&_9){var _b5=_ae+"";arr[0].setAttribute(_b3,_b5);for(var x=1,te;te=arr[x];x++){if(arr[x].getAttribute(_b3)!=_b5){ret.push(te);}te.setAttribute(_b3,_b5);}}else{if(_1.isIE&&arr.commentStrip){try{for(var x=1,te;te=arr[x];x++){if(_22(te)){ret.push(te);}}}catch(e){}}else{if(arr[0]){arr[0][_b3]=_ae;}for(var x=1,te;te=arr[x];x++){if(arr[x][_b3]!=_ae){ret.push(te);}te[_b3]=_ae;}}}return ret;};var _b6=function(_b7,_b8){_b8=_b8||_6();var od=_b8.ownerDocument||_b8.documentElement;_9=(_b8.contentType&&_b8.contentType=="application/xml")||(_1.isOpera&&(_b8.doctype||od.toString()=="[object XMLDocument]"))||(!!od)&&(_1.isIE?od.xml:(_b8.xmlVersion||od.xmlVersion));var r=_a3(_b7)(_b8);if(r&&r.nozip){return r;}return _b4(r);};_b6.filter=function(_b9,_ba,_bb){var _bc=[],_bd=_b(_ba),_be=(_bd.length==1&&!/[^\w#\.]/.test(_ba))?_5c(_bd[0]):function(_bf){return _1.query(_ba,_bb).indexOf(_bf)!=-1;};for(var x=0,te;te=_b9[x];x++){if(_be(te)){_bc.push(te);}}return _bc;};return _b6;}); \ No newline at end of file
diff --git a/lib/dojo/selector/acme.js.uncompressed.js b/lib/dojo/selector/acme.js.uncompressed.js
new file mode 100644
index 000000000..641478ec3
--- /dev/null
+++ b/lib/dojo/selector/acme.js.uncompressed.js
@@ -0,0 +1,1480 @@
+define("dojo/selector/acme", ["../_base/kernel", "../has", "../dom", "../_base/sniff", "../_base/array", "../_base/lang", "../_base/window"], function(dojo, has, dom){
+ // module:
+ // dojo/selector/acme
+ // summary:
+ // This module defines the Acme selector engine
+
+/*
+ acme architectural overview:
+
+ acme is a relatively full-featured CSS3 query library. It is
+ designed to take any valid CSS3 selector and return the nodes matching
+ the selector. To do this quickly, it processes queries in several
+ steps, applying caching where profitable.
+
+ The steps (roughly in reverse order of the way they appear in the code):
+ 1.) check to see if we already have a "query dispatcher"
+ - if so, use that with the given parameterization. Skip to step 4.
+ 2.) attempt to determine which branch to dispatch the query to:
+ - JS (optimized DOM iteration)
+ - native (FF3.1+, Safari 3.1+, IE 8+)
+ 3.) tokenize and convert to executable "query dispatcher"
+ - this is where the lion's share of the complexity in the
+ system lies. In the DOM version, the query dispatcher is
+ assembled as a chain of "yes/no" test functions pertaining to
+ a section of a simple query statement (".blah:nth-child(odd)"
+ but not "div div", which is 2 simple statements). Individual
+ statement dispatchers are cached (to prevent re-definition)
+ as are entire dispatch chains (to make re-execution of the
+ same query fast)
+ 4.) the resulting query dispatcher is called in the passed scope
+ (by default the top-level document)
+ - for DOM queries, this results in a recursive, top-down
+ evaluation of nodes based on each simple query section
+ - for native implementations, this may mean working around spec
+ bugs. So be it.
+ 5.) matched nodes are pruned to ensure they are unique (if necessary)
+*/
+
+
+ ////////////////////////////////////////////////////////////////////////
+ // Toolkit aliases
+ ////////////////////////////////////////////////////////////////////////
+
+ // if you are extracting acme for use in your own system, you will
+ // need to provide these methods and properties. No other porting should be
+ // necessary, save for configuring the system to use a class other than
+ // dojo.NodeList as the return instance instantiator
+ var trim = dojo.trim;
+ var each = dojo.forEach;
+ // d.isIE; // float
+ // d.isSafari; // float
+ // d.isOpera; // float
+ // d.isWebKit; // float
+ // d.doc ; // document element
+
+ var getDoc = function(){ return dojo.doc; };
+ // NOTE(alex): the spec is idiotic. CSS queries should ALWAYS be case-sensitive, but nooooooo
+ var cssCaseBug = ((dojo.isWebKit||dojo.isMozilla) && ((getDoc().compatMode) == "BackCompat"));
+
+ ////////////////////////////////////////////////////////////////////////
+ // Global utilities
+ ////////////////////////////////////////////////////////////////////////
+
+
+ var specials = ">~+";
+
+ // global thunk to determine whether we should treat the current query as
+ // case sensitive or not. This switch is flipped by the query evaluator
+ // based on the document passed as the context to search.
+ var caseSensitive = false;
+
+ // how high?
+ var yesman = function(){ return true; };
+
+ ////////////////////////////////////////////////////////////////////////
+ // Tokenizer
+ ////////////////////////////////////////////////////////////////////////
+
+ var getQueryParts = function(query){
+ // summary:
+ // state machine for query tokenization
+ // description:
+ // instead of using a brittle and slow regex-based CSS parser,
+ // acme implements an AST-style query representation. This
+ // representation is only generated once per query. For example,
+ // the same query run multiple times or under different root nodes
+ // does not re-parse the selector expression but instead uses the
+ // cached data structure. The state machine implemented here
+ // terminates on the last " " (space) character and returns an
+ // ordered array of query component structures (or "parts"). Each
+ // part represents an operator or a simple CSS filtering
+ // expression. The structure for parts is documented in the code
+ // below.
+
+
+ // NOTE:
+ // this code is designed to run fast and compress well. Sacrifices
+ // to readability and maintainability have been made. Your best
+ // bet when hacking the tokenizer is to put The Donnas on *really*
+ // loud (may we recommend their "Spend The Night" release?) and
+ // just assume you're gonna make mistakes. Keep the unit tests
+ // open and run them frequently. Knowing is half the battle ;-)
+ if(specials.indexOf(query.slice(-1)) >= 0){
+ // if we end with a ">", "+", or "~", that means we're implicitly
+ // searching all children, so make it explicit
+ query += " * "
+ }else{
+ // if you have not provided a terminator, one will be provided for
+ // you...
+ query += " ";
+ }
+
+ var ts = function(/*Integer*/ s, /*Integer*/ e){
+ // trim and slice.
+
+ // take an index to start a string slice from and an end position
+ // and return a trimmed copy of that sub-string
+ return trim(query.slice(s, e));
+ };
+
+ // the overall data graph of the full query, as represented by queryPart objects
+ var queryParts = [];
+
+
+ // state keeping vars
+ var inBrackets = -1, inParens = -1, inMatchFor = -1,
+ inPseudo = -1, inClass = -1, inId = -1, inTag = -1,
+ lc = "", cc = "", pStart;
+
+ // iteration vars
+ var x = 0, // index in the query
+ ql = query.length,
+ currentPart = null, // data structure representing the entire clause
+ _cp = null; // the current pseudo or attr matcher
+
+ // several temporary variables are assigned to this structure during a
+ // potential sub-expression match:
+ // attr:
+ // a string representing the current full attribute match in a
+ // bracket expression
+ // type:
+ // if there's an operator in a bracket expression, this is
+ // used to keep track of it
+ // value:
+ // the internals of parenthetical expression for a pseudo. for
+ // :nth-child(2n+1), value might be "2n+1"
+
+ var endTag = function(){
+ // called when the tokenizer hits the end of a particular tag name.
+ // Re-sets state variables for tag matching and sets up the matcher
+ // to handle the next type of token (tag or operator).
+ if(inTag >= 0){
+ var tv = (inTag == x) ? null : ts(inTag, x); // .toLowerCase();
+ currentPart[ (specials.indexOf(tv) < 0) ? "tag" : "oper" ] = tv;
+ inTag = -1;
+ }
+ };
+
+ var endId = function(){
+ // called when the tokenizer might be at the end of an ID portion of a match
+ if(inId >= 0){
+ currentPart.id = ts(inId, x).replace(/\\/g, "");
+ inId = -1;
+ }
+ };
+
+ var endClass = function(){
+ // called when the tokenizer might be at the end of a class name
+ // match. CSS allows for multiple classes, so we augment the
+ // current item with another class in its list
+ if(inClass >= 0){
+ currentPart.classes.push(ts(inClass + 1, x).replace(/\\/g, ""));
+ inClass = -1;
+ }
+ };
+
+ var endAll = function(){
+ // at the end of a simple fragment, so wall off the matches
+ endId();
+ endTag();
+ endClass();
+ };
+
+ var endPart = function(){
+ endAll();
+ if(inPseudo >= 0){
+ currentPart.pseudos.push({ name: ts(inPseudo + 1, x) });
+ }
+ // hint to the selector engine to tell it whether or not it
+ // needs to do any iteration. Many simple selectors don't, and
+ // we can avoid significant construction-time work by advising
+ // the system to skip them
+ currentPart.loops = (
+ currentPart.pseudos.length ||
+ currentPart.attrs.length ||
+ currentPart.classes.length );
+
+ currentPart.oquery = currentPart.query = ts(pStart, x); // save the full expression as a string
+
+
+ // otag/tag are hints to suggest to the system whether or not
+ // it's an operator or a tag. We save a copy of otag since the
+ // tag name is cast to upper-case in regular HTML matches. The
+ // system has a global switch to figure out if the current
+ // expression needs to be case sensitive or not and it will use
+ // otag or tag accordingly
+ currentPart.otag = currentPart.tag = (currentPart["oper"]) ? null : (currentPart.tag || "*");
+
+ if(currentPart.tag){
+ // if we're in a case-insensitive HTML doc, we likely want
+ // the toUpperCase when matching on element.tagName. If we
+ // do it here, we can skip the string op per node
+ // comparison
+ currentPart.tag = currentPart.tag.toUpperCase();
+ }
+
+ // add the part to the list
+ if(queryParts.length && (queryParts[queryParts.length-1].oper)){
+ // operators are always infix, so we remove them from the
+ // list and attach them to the next match. The evaluator is
+ // responsible for sorting out how to handle them.
+ currentPart.infixOper = queryParts.pop();
+ currentPart.query = currentPart.infixOper.query + " " + currentPart.query;
+ /*
+ console.debug( "swapping out the infix",
+ currentPart.infixOper,
+ "and attaching it to",
+ currentPart);
+ */
+ }
+ queryParts.push(currentPart);
+
+ currentPart = null;
+ };
+
+ // iterate over the query, character by character, building up a
+ // list of query part objects
+ for(; lc=cc, cc=query.charAt(x), x < ql; x++){
+ // cc: the current character in the match
+ // lc: the last character (if any)
+
+ // someone is trying to escape something, so don't try to match any
+ // fragments. We assume we're inside a literal.
+ if(lc == "\\"){ continue; }
+ if(!currentPart){ // a part was just ended or none has yet been created
+ // NOTE: I hate all this alloc, but it's shorter than writing tons of if's
+ pStart = x;
+ // rules describe full CSS sub-expressions, like:
+ // #someId
+ // .className:first-child
+ // but not:
+ // thinger > div.howdy[type=thinger]
+ // the indidual components of the previous query would be
+ // split into 3 parts that would be represented a structure
+ // like:
+ // [
+ // {
+ // query: "thinger",
+ // tag: "thinger",
+ // },
+ // {
+ // query: "div.howdy[type=thinger]",
+ // classes: ["howdy"],
+ // infixOper: {
+ // query: ">",
+ // oper: ">",
+ // }
+ // },
+ // ]
+ currentPart = {
+ query: null, // the full text of the part's rule
+ pseudos: [], // CSS supports multiple pseud-class matches in a single rule
+ attrs: [], // CSS supports multi-attribute match, so we need an array
+ classes: [], // class matches may be additive, e.g.: .thinger.blah.howdy
+ tag: null, // only one tag...
+ oper: null, // ...or operator per component. Note that these wind up being exclusive.
+ id: null, // the id component of a rule
+ getTag: function(){
+ return (caseSensitive) ? this.otag : this.tag;
+ }
+ };
+
+ // if we don't have a part, we assume we're going to start at
+ // the beginning of a match, which should be a tag name. This
+ // might fault a little later on, but we detect that and this
+ // iteration will still be fine.
+ inTag = x;
+ }
+
+ if(inBrackets >= 0){
+ // look for a the close first
+ if(cc == "]"){ // if we're in a [...] clause and we end, do assignment
+ if(!_cp.attr){
+ // no attribute match was previously begun, so we
+ // assume this is an attribute existence match in the
+ // form of [someAttributeName]
+ _cp.attr = ts(inBrackets+1, x);
+ }else{
+ // we had an attribute already, so we know that we're
+ // matching some sort of value, as in [attrName=howdy]
+ _cp.matchFor = ts((inMatchFor||inBrackets+1), x);
+ }
+ var cmf = _cp.matchFor;
+ if(cmf){
+ // try to strip quotes from the matchFor value. We want
+ // [attrName=howdy] to match the same
+ // as [attrName = 'howdy' ]
+ if( (cmf.charAt(0) == '"') || (cmf.charAt(0) == "'") ){
+ _cp.matchFor = cmf.slice(1, -1);
+ }
+ }
+ // end the attribute by adding it to the list of attributes.
+ currentPart.attrs.push(_cp);
+ _cp = null; // necessary?
+ inBrackets = inMatchFor = -1;
+ }else if(cc == "="){
+ // if the last char was an operator prefix, make sure we
+ // record it along with the "=" operator.
+ var addToCc = ("|~^$*".indexOf(lc) >=0 ) ? lc : "";
+ _cp.type = addToCc+cc;
+ _cp.attr = ts(inBrackets+1, x-addToCc.length);
+ inMatchFor = x+1;
+ }
+ // now look for other clause parts
+ }else if(inParens >= 0){
+ // if we're in a parenthetical expression, we need to figure
+ // out if it's attached to a pseudo-selector rule like
+ // :nth-child(1)
+ if(cc == ")"){
+ if(inPseudo >= 0){
+ _cp.value = ts(inParens+1, x);
+ }
+ inPseudo = inParens = -1;
+ }
+ }else if(cc == "#"){
+ // start of an ID match
+ endAll();
+ inId = x+1;
+ }else if(cc == "."){
+ // start of a class match
+ endAll();
+ inClass = x;
+ }else if(cc == ":"){
+ // start of a pseudo-selector match
+ endAll();
+ inPseudo = x;
+ }else if(cc == "["){
+ // start of an attribute match.
+ endAll();
+ inBrackets = x;
+ // provide a new structure for the attribute match to fill-in
+ _cp = {
+ /*=====
+ attr: null, type: null, matchFor: null
+ =====*/
+ };
+ }else if(cc == "("){
+ // we really only care if we've entered a parenthetical
+ // expression if we're already inside a pseudo-selector match
+ if(inPseudo >= 0){
+ // provide a new structure for the pseudo match to fill-in
+ _cp = {
+ name: ts(inPseudo+1, x),
+ value: null
+ };
+ currentPart.pseudos.push(_cp);
+ }
+ inParens = x;
+ }else if(
+ (cc == " ") &&
+ // if it's a space char and the last char is too, consume the
+ // current one without doing more work
+ (lc != cc)
+ ){
+ endPart();
+ }
+ }
+ return queryParts;
+ };
+
+
+ ////////////////////////////////////////////////////////////////////////
+ // DOM query infrastructure
+ ////////////////////////////////////////////////////////////////////////
+
+ var agree = function(first, second){
+ // the basic building block of the yes/no chaining system. agree(f1,
+ // f2) generates a new function which returns the boolean results of
+ // both of the passed functions to a single logical-anded result. If
+ // either are not passed, the other is used exclusively.
+ if(!first){ return second; }
+ if(!second){ return first; }
+
+ return function(){
+ return first.apply(window, arguments) && second.apply(window, arguments);
+ }
+ };
+
+ var getArr = function(i, arr){
+ // helps us avoid array alloc when we don't need it
+ var r = arr||[]; // FIXME: should this be 'new d._NodeListCtor()' ?
+ if(i){ r.push(i); }
+ return r;
+ };
+
+ var _isElement = function(n){ return (1 == n.nodeType); };
+
+ // FIXME: need to coalesce _getAttr with defaultGetter
+ var blank = "";
+ var _getAttr = function(elem, attr){
+ if(!elem){ return blank; }
+ if(attr == "class"){
+ return elem.className || blank;
+ }
+ if(attr == "for"){
+ return elem.htmlFor || blank;
+ }
+ if(attr == "style"){
+ return elem.style.cssText || blank;
+ }
+ return (caseSensitive ? elem.getAttribute(attr) : elem.getAttribute(attr, 2)) || blank;
+ };
+
+ var attrs = {
+ "*=": function(attr, value){
+ return function(elem){
+ // E[foo*="bar"]
+ // an E element whose "foo" attribute value contains
+ // the substring "bar"
+ return (_getAttr(elem, attr).indexOf(value)>=0);
+ }
+ },
+ "^=": function(attr, value){
+ // E[foo^="bar"]
+ // an E element whose "foo" attribute value begins exactly
+ // with the string "bar"
+ return function(elem){
+ return (_getAttr(elem, attr).indexOf(value)==0);
+ }
+ },
+ "$=": function(attr, value){
+ // E[foo$="bar"]
+ // an E element whose "foo" attribute value ends exactly
+ // with the string "bar"
+ return function(elem){
+ var ea = " "+_getAttr(elem, attr);
+ return (ea.lastIndexOf(value)==(ea.length-value.length));
+ }
+ },
+ "~=": function(attr, value){
+ // E[foo~="bar"]
+ // an E element whose "foo" attribute value is a list of
+ // space-separated values, one of which is exactly equal
+ // to "bar"
+
+ // return "[contains(concat(' ',@"+attr+",' '), ' "+ value +" ')]";
+ var tval = " "+value+" ";
+ return function(elem){
+ var ea = " "+_getAttr(elem, attr)+" ";
+ return (ea.indexOf(tval)>=0);
+ }
+ },
+ "|=": function(attr, value){
+ // E[hreflang|="en"]
+ // an E element whose "hreflang" attribute has a
+ // hyphen-separated list of values beginning (from the
+ // left) with "en"
+ var valueDash = value+"-";
+ return function(elem){
+ var ea = _getAttr(elem, attr);
+ return (
+ (ea == value) ||
+ (ea.indexOf(valueDash)==0)
+ );
+ }
+ },
+ "=": function(attr, value){
+ return function(elem){
+ return (_getAttr(elem, attr) == value);
+ }
+ }
+ };
+
+ // avoid testing for node type if we can. Defining this in the negative
+ // here to avoid negation in the fast path.
+ var _noNES = (typeof getDoc().firstChild.nextElementSibling == "undefined");
+ var _ns = !_noNES ? "nextElementSibling" : "nextSibling";
+ var _ps = !_noNES ? "previousElementSibling" : "previousSibling";
+ var _simpleNodeTest = (_noNES ? _isElement : yesman);
+
+ var _lookLeft = function(node){
+ // look left
+ while(node = node[_ps]){
+ if(_simpleNodeTest(node)){ return false; }
+ }
+ return true;
+ };
+
+ var _lookRight = function(node){
+ // look right
+ while(node = node[_ns]){
+ if(_simpleNodeTest(node)){ return false; }
+ }
+ return true;
+ };
+
+ var getNodeIndex = function(node){
+ var root = node.parentNode;
+ var i = 0,
+ tret = root.children || root.childNodes,
+ ci = (node["_i"]||-1),
+ cl = (root["_l"]||-1);
+
+ if(!tret){ return -1; }
+ var l = tret.length;
+
+ // we calculate the parent length as a cheap way to invalidate the
+ // cache. It's not 100% accurate, but it's much more honest than what
+ // other libraries do
+ if( cl == l && ci >= 0 && cl >= 0 ){
+ // if it's legit, tag and release
+ return ci;
+ }
+
+ // else re-key things
+ root["_l"] = l;
+ ci = -1;
+ for(var te = root["firstElementChild"]||root["firstChild"]; te; te = te[_ns]){
+ if(_simpleNodeTest(te)){
+ te["_i"] = ++i;
+ if(node === te){
+ // NOTE:
+ // shortcutting the return at this step in indexing works
+ // very well for benchmarking but we avoid it here since
+ // it leads to potential O(n^2) behavior in sequential
+ // getNodexIndex operations on a previously un-indexed
+ // parent. We may revisit this at a later time, but for
+ // now we just want to get the right answer more often
+ // than not.
+ ci = i;
+ }
+ }
+ }
+ return ci;
+ };
+
+ var isEven = function(elem){
+ return !((getNodeIndex(elem)) % 2);
+ };
+
+ var isOdd = function(elem){
+ return ((getNodeIndex(elem)) % 2);
+ };
+
+ var pseudos = {
+ "checked": function(name, condition){
+ return function(elem){
+ return !!("checked" in elem ? elem.checked : elem.selected);
+ }
+ },
+ "first-child": function(){ return _lookLeft; },
+ "last-child": function(){ return _lookRight; },
+ "only-child": function(name, condition){
+ return function(node){
+ return _lookLeft(node) && _lookRight(node);
+ };
+ },
+ "empty": function(name, condition){
+ return function(elem){
+ // DomQuery and jQuery get this wrong, oddly enough.
+ // The CSS 3 selectors spec is pretty explicit about it, too.
+ var cn = elem.childNodes;
+ var cnl = elem.childNodes.length;
+ // if(!cnl){ return true; }
+ for(var x=cnl-1; x >= 0; x--){
+ var nt = cn[x].nodeType;
+ if((nt === 1)||(nt == 3)){ return false; }
+ }
+ return true;
+ }
+ },
+ "contains": function(name, condition){
+ var cz = condition.charAt(0);
+ if( cz == '"' || cz == "'" ){ //remove quote
+ condition = condition.slice(1, -1);
+ }
+ return function(elem){
+ return (elem.innerHTML.indexOf(condition) >= 0);
+ }
+ },
+ "not": function(name, condition){
+ var p = getQueryParts(condition)[0];
+ var ignores = { el: 1 };
+ if(p.tag != "*"){
+ ignores.tag = 1;
+ }
+ if(!p.classes.length){
+ ignores.classes = 1;
+ }
+ var ntf = getSimpleFilterFunc(p, ignores);
+ return function(elem){
+ return (!ntf(elem));
+ }
+ },
+ "nth-child": function(name, condition){
+ var pi = parseInt;
+ // avoid re-defining function objects if we can
+ if(condition == "odd"){
+ return isOdd;
+ }else if(condition == "even"){
+ return isEven;
+ }
+ // FIXME: can we shorten this?
+ if(condition.indexOf("n") != -1){
+ var tparts = condition.split("n", 2);
+ var pred = tparts[0] ? ((tparts[0] == '-') ? -1 : pi(tparts[0])) : 1;
+ var idx = tparts[1] ? pi(tparts[1]) : 0;
+ var lb = 0, ub = -1;
+ if(pred > 0){
+ if(idx < 0){
+ idx = (idx % pred) && (pred + (idx % pred));
+ }else if(idx>0){
+ if(idx >= pred){
+ lb = idx - idx % pred;
+ }
+ idx = idx % pred;
+ }
+ }else if(pred<0){
+ pred *= -1;
+ // idx has to be greater than 0 when pred is negative;
+ // shall we throw an error here?
+ if(idx > 0){
+ ub = idx;
+ idx = idx % pred;
+ }
+ }
+ if(pred > 0){
+ return function(elem){
+ var i = getNodeIndex(elem);
+ return (i>=lb) && (ub<0 || i<=ub) && ((i % pred) == idx);
+ }
+ }else{
+ condition = idx;
+ }
+ }
+ var ncount = pi(condition);
+ return function(elem){
+ return (getNodeIndex(elem) == ncount);
+ }
+ }
+ };
+
+ var defaultGetter = (dojo.isIE && (dojo.isIE < 9 || dojo.isQuirks)) ? function(cond){
+ var clc = cond.toLowerCase();
+ if(clc == "class"){ cond = "className"; }
+ return function(elem){
+ return (caseSensitive ? elem.getAttribute(cond) : elem[cond]||elem[clc]);
+ }
+ } : function(cond){
+ return function(elem){
+ return (elem && elem.getAttribute && elem.hasAttribute(cond));
+ }
+ };
+
+ var getSimpleFilterFunc = function(query, ignores){
+ // generates a node tester function based on the passed query part. The
+ // query part is one of the structures generated by the query parser
+ // when it creates the query AST. The "ignores" object specifies which
+ // (if any) tests to skip, allowing the system to avoid duplicating
+ // work where it may have already been taken into account by other
+ // factors such as how the nodes to test were fetched in the first
+ // place
+ if(!query){ return yesman; }
+ ignores = ignores||{};
+
+ var ff = null;
+
+ if(!("el" in ignores)){
+ ff = agree(ff, _isElement);
+ }
+
+ if(!("tag" in ignores)){
+ if(query.tag != "*"){
+ ff = agree(ff, function(elem){
+ return (elem && (elem.tagName == query.getTag()));
+ });
+ }
+ }
+
+ if(!("classes" in ignores)){
+ each(query.classes, function(cname, idx, arr){
+ // get the class name
+ /*
+ var isWildcard = cname.charAt(cname.length-1) == "*";
+ if(isWildcard){
+ cname = cname.substr(0, cname.length-1);
+ }
+ // I dislike the regex thing, even if memoized in a cache, but it's VERY short
+ var re = new RegExp("(?:^|\\s)" + cname + (isWildcard ? ".*" : "") + "(?:\\s|$)");
+ */
+ var re = new RegExp("(?:^|\\s)" + cname + "(?:\\s|$)");
+ ff = agree(ff, function(elem){
+ return re.test(elem.className);
+ });
+ ff.count = idx;
+ });
+ }
+
+ if(!("pseudos" in ignores)){
+ each(query.pseudos, function(pseudo){
+ var pn = pseudo.name;
+ if(pseudos[pn]){
+ ff = agree(ff, pseudos[pn](pn, pseudo.value));
+ }
+ });
+ }
+
+ if(!("attrs" in ignores)){
+ each(query.attrs, function(attr){
+ var matcher;
+ var a = attr.attr;
+ // type, attr, matchFor
+ if(attr.type && attrs[attr.type]){
+ matcher = attrs[attr.type](a, attr.matchFor);
+ }else if(a.length){
+ matcher = defaultGetter(a);
+ }
+ if(matcher){
+ ff = agree(ff, matcher);
+ }
+ });
+ }
+
+ if(!("id" in ignores)){
+ if(query.id){
+ ff = agree(ff, function(elem){
+ return (!!elem && (elem.id == query.id));
+ });
+ }
+ }
+
+ if(!ff){
+ if(!("default" in ignores)){
+ ff = yesman;
+ }
+ }
+ return ff;
+ };
+
+ var _nextSibling = function(filterFunc){
+ return function(node, ret, bag){
+ while(node = node[_ns]){
+ if(_noNES && (!_isElement(node))){ continue; }
+ if(
+ (!bag || _isUnique(node, bag)) &&
+ filterFunc(node)
+ ){
+ ret.push(node);
+ }
+ break;
+ }
+ return ret;
+ }
+ };
+
+ var _nextSiblings = function(filterFunc){
+ return function(root, ret, bag){
+ var te = root[_ns];
+ while(te){
+ if(_simpleNodeTest(te)){
+ if(bag && !_isUnique(te, bag)){
+ break;
+ }
+ if(filterFunc(te)){
+ ret.push(te);
+ }
+ }
+ te = te[_ns];
+ }
+ return ret;
+ }
+ };
+
+ // get an array of child *elements*, skipping text and comment nodes
+ var _childElements = function(filterFunc){
+ filterFunc = filterFunc||yesman;
+ return function(root, ret, bag){
+ // get an array of child elements, skipping text and comment nodes
+ var te, x = 0, tret = root.children || root.childNodes;
+ while(te = tret[x++]){
+ if(
+ _simpleNodeTest(te) &&
+ (!bag || _isUnique(te, bag)) &&
+ (filterFunc(te, x))
+ ){
+ ret.push(te);
+ }
+ }
+ return ret;
+ };
+ };
+
+ /*
+ // thanks, Dean!
+ var itemIsAfterRoot = d.isIE ? function(item, root){
+ return (item.sourceIndex > root.sourceIndex);
+ } : function(item, root){
+ return (item.compareDocumentPosition(root) == 2);
+ };
+ */
+
+ // test to see if node is below root
+ var _isDescendant = function(node, root){
+ var pn = node.parentNode;
+ while(pn){
+ if(pn == root){
+ break;
+ }
+ pn = pn.parentNode;
+ }
+ return !!pn;
+ };
+
+ var _getElementsFuncCache = {};
+
+ var getElementsFunc = function(query){
+ var retFunc = _getElementsFuncCache[query.query];
+ // if we've got a cached dispatcher, just use that
+ if(retFunc){ return retFunc; }
+ // else, generate a new on
+
+ // NOTE:
+ // this function returns a function that searches for nodes and
+ // filters them. The search may be specialized by infix operators
+ // (">", "~", or "+") else it will default to searching all
+ // descendants (the " " selector). Once a group of children is
+ // found, a test function is applied to weed out the ones we
+ // don't want. Many common cases can be fast-pathed. We spend a
+ // lot of cycles to create a dispatcher that doesn't do more work
+ // than necessary at any point since, unlike this function, the
+ // dispatchers will be called every time. The logic of generating
+ // efficient dispatchers looks like this in pseudo code:
+ //
+ // # if it's a purely descendant query (no ">", "+", or "~" modifiers)
+ // if infixOperator == " ":
+ // if only(id):
+ // return def(root):
+ // return d.byId(id, root);
+ //
+ // elif id:
+ // return def(root):
+ // return filter(d.byId(id, root));
+ //
+ // elif cssClass && getElementsByClassName:
+ // return def(root):
+ // return filter(root.getElementsByClassName(cssClass));
+ //
+ // elif only(tag):
+ // return def(root):
+ // return root.getElementsByTagName(tagName);
+ //
+ // else:
+ // # search by tag name, then filter
+ // return def(root):
+ // return filter(root.getElementsByTagName(tagName||"*"));
+ //
+ // elif infixOperator == ">":
+ // # search direct children
+ // return def(root):
+ // return filter(root.children);
+ //
+ // elif infixOperator == "+":
+ // # search next sibling
+ // return def(root):
+ // return filter(root.nextElementSibling);
+ //
+ // elif infixOperator == "~":
+ // # search rightward siblings
+ // return def(root):
+ // return filter(nextSiblings(root));
+
+ var io = query.infixOper;
+ var oper = (io ? io.oper : "");
+ // the default filter func which tests for all conditions in the query
+ // part. This is potentially inefficient, so some optimized paths may
+ // re-define it to test fewer things.
+ var filterFunc = getSimpleFilterFunc(query, { el: 1 });
+ var qt = query.tag;
+ var wildcardTag = ("*" == qt);
+ var ecs = getDoc()["getElementsByClassName"];
+
+ if(!oper){
+ // if there's no infix operator, then it's a descendant query. ID
+ // and "elements by class name" variants can be accelerated so we
+ // call them out explicitly:
+ if(query.id){
+ // testing shows that the overhead of yesman() is acceptable
+ // and can save us some bytes vs. re-defining the function
+ // everywhere.
+ filterFunc = (!query.loops && wildcardTag) ?
+ yesman :
+ getSimpleFilterFunc(query, { el: 1, id: 1 });
+
+ retFunc = function(root, arr){
+ var te = dom.byId(query.id, (root.ownerDocument||root));
+ if(!te || !filterFunc(te)){ return; }
+ if(9 == root.nodeType){ // if root's a doc, we just return directly
+ return getArr(te, arr);
+ }else{ // otherwise check ancestry
+ if(_isDescendant(te, root)){
+ return getArr(te, arr);
+ }
+ }
+ }
+ }else if(
+ ecs &&
+ // isAlien check. Workaround for Prototype.js being totally evil/dumb.
+ /\{\s*\[native code\]\s*\}/.test(String(ecs)) &&
+ query.classes.length &&
+ !cssCaseBug
+ ){
+ // it's a class-based query and we've got a fast way to run it.
+
+ // ignore class and ID filters since we will have handled both
+ filterFunc = getSimpleFilterFunc(query, { el: 1, classes: 1, id: 1 });
+ var classesString = query.classes.join(" ");
+ retFunc = function(root, arr, bag){
+ var ret = getArr(0, arr), te, x=0;
+ var tret = root.getElementsByClassName(classesString);
+ while((te = tret[x++])){
+ if(filterFunc(te, root) && _isUnique(te, bag)){
+ ret.push(te);
+ }
+ }
+ return ret;
+ };
+
+ }else if(!wildcardTag && !query.loops){
+ // it's tag only. Fast-path it.
+ retFunc = function(root, arr, bag){
+ var ret = getArr(0, arr), te, x=0;
+ var tret = root.getElementsByTagName(query.getTag());
+ while((te = tret[x++])){
+ if(_isUnique(te, bag)){
+ ret.push(te);
+ }
+ }
+ return ret;
+ };
+ }else{
+ // the common case:
+ // a descendant selector without a fast path. By now it's got
+ // to have a tag selector, even if it's just "*" so we query
+ // by that and filter
+ filterFunc = getSimpleFilterFunc(query, { el: 1, tag: 1, id: 1 });
+ retFunc = function(root, arr, bag){
+ var ret = getArr(0, arr), te, x=0;
+ // we use getTag() to avoid case sensitivity issues
+ var tret = root.getElementsByTagName(query.getTag());
+ while((te = tret[x++])){
+ if(filterFunc(te, root) && _isUnique(te, bag)){
+ ret.push(te);
+ }
+ }
+ return ret;
+ };
+ }
+ }else{
+ // the query is scoped in some way. Instead of querying by tag we
+ // use some other collection to find candidate nodes
+ var skipFilters = { el: 1 };
+ if(wildcardTag){
+ skipFilters.tag = 1;
+ }
+ filterFunc = getSimpleFilterFunc(query, skipFilters);
+ if("+" == oper){
+ retFunc = _nextSibling(filterFunc);
+ }else if("~" == oper){
+ retFunc = _nextSiblings(filterFunc);
+ }else if(">" == oper){
+ retFunc = _childElements(filterFunc);
+ }
+ }
+ // cache it and return
+ return _getElementsFuncCache[query.query] = retFunc;
+ };
+
+ var filterDown = function(root, queryParts){
+ // NOTE:
+ // this is the guts of the DOM query system. It takes a list of
+ // parsed query parts and a root and finds children which match
+ // the selector represented by the parts
+ var candidates = getArr(root), qp, x, te, qpl = queryParts.length, bag, ret;
+
+ for(var i = 0; i < qpl; i++){
+ ret = [];
+ qp = queryParts[i];
+ x = candidates.length - 1;
+ if(x > 0){
+ // if we have more than one root at this level, provide a new
+ // hash to use for checking group membership but tell the
+ // system not to post-filter us since we will already have been
+ // gauranteed to be unique
+ bag = {};
+ ret.nozip = true;
+ }
+ var gef = getElementsFunc(qp);
+ for(var j = 0; (te = candidates[j]); j++){
+ // for every root, get the elements that match the descendant
+ // selector, adding them to the "ret" array and filtering them
+ // via membership in this level's bag. If there are more query
+ // parts, then this level's return will be used as the next
+ // level's candidates
+ gef(te, ret, bag);
+ }
+ if(!ret.length){ break; }
+ candidates = ret;
+ }
+ return ret;
+ };
+
+ ////////////////////////////////////////////////////////////////////////
+ // the query runner
+ ////////////////////////////////////////////////////////////////////////
+
+ // these are the primary caches for full-query results. The query
+ // dispatcher functions are generated then stored here for hash lookup in
+ // the future
+ var _queryFuncCacheDOM = {},
+ _queryFuncCacheQSA = {};
+
+ // this is the second level of spliting, from full-length queries (e.g.,
+ // "div.foo .bar") into simple query expressions (e.g., ["div.foo",
+ // ".bar"])
+ var getStepQueryFunc = function(query){
+ var qparts = getQueryParts(trim(query));
+
+ // if it's trivial, avoid iteration and zipping costs
+ if(qparts.length == 1){
+ // we optimize this case here to prevent dispatch further down the
+ // chain, potentially slowing things down. We could more elegantly
+ // handle this in filterDown(), but it's slower for simple things
+ // that need to be fast (e.g., "#someId").
+ var tef = getElementsFunc(qparts[0]);
+ return function(root){
+ var r = tef(root, []);
+ if(r){ r.nozip = true; }
+ return r;
+ }
+ }
+
+ // otherwise, break it up and return a runner that iterates over the parts recursively
+ return function(root){
+ return filterDown(root, qparts);
+ }
+ };
+
+ // NOTES:
+ // * we can't trust QSA for anything but document-rooted queries, so
+ // caching is split into DOM query evaluators and QSA query evaluators
+ // * caching query results is dirty and leak-prone (or, at a minimum,
+ // prone to unbounded growth). Other toolkits may go this route, but
+ // they totally destroy their own ability to manage their memory
+ // footprint. If we implement it, it should only ever be with a fixed
+ // total element reference # limit and an LRU-style algorithm since JS
+ // has no weakref support. Caching compiled query evaluators is also
+ // potentially problematic, but even on large documents the size of the
+ // query evaluators is often < 100 function objects per evaluator (and
+ // LRU can be applied if it's ever shown to be an issue).
+ // * since IE's QSA support is currently only for HTML documents and even
+ // then only in IE 8's "standards mode", we have to detect our dispatch
+ // route at query time and keep 2 separate caches. Ugg.
+
+ // we need to determine if we think we can run a given query via
+ // querySelectorAll or if we'll need to fall back on DOM queries to get
+ // there. We need a lot of information about the environment and the query
+ // to make the determiniation (e.g. does it support QSA, does the query in
+ // question work in the native QSA impl, etc.).
+ var nua = navigator.userAgent;
+ // some versions of Safari provided QSA, but it was buggy and crash-prone.
+ // We need te detect the right "internal" webkit version to make this work.
+ var wk = "WebKit/";
+ var is525 = (
+ dojo.isWebKit &&
+ (nua.indexOf(wk) > 0) &&
+ (parseFloat(nua.split(wk)[1]) > 528)
+ );
+
+ // IE QSA queries may incorrectly include comment nodes, so we throw the
+ // zipping function into "remove" comments mode instead of the normal "skip
+ // it" which every other QSA-clued browser enjoys
+ var noZip = dojo.isIE ? "commentStrip" : "nozip";
+
+ var qsa = "querySelectorAll";
+ var qsaAvail = (
+ !!getDoc()[qsa] &&
+ // see #5832
+ (!dojo.isSafari || (dojo.isSafari > 3.1) || is525 )
+ );
+
+ //Don't bother with n+3 type of matches, IE complains if we modify those.
+ var infixSpaceRe = /n\+\d|([^ ])?([>~+])([^ =])?/g;
+ var infixSpaceFunc = function(match, pre, ch, post){
+ return ch ? (pre ? pre + " " : "") + ch + (post ? " " + post : "") : /*n+3*/ match;
+ };
+
+ var getQueryFunc = function(query, forceDOM){
+ //Normalize query. The CSS3 selectors spec allows for omitting spaces around
+ //infix operators, >, ~ and +
+ //Do the work here since detection for spaces is used as a simple "not use QSA"
+ //test below.
+ query = query.replace(infixSpaceRe, infixSpaceFunc);
+
+ if(qsaAvail){
+ // if we've got a cached variant and we think we can do it, run it!
+ var qsaCached = _queryFuncCacheQSA[query];
+ if(qsaCached && !forceDOM){ return qsaCached; }
+ }
+
+ // else if we've got a DOM cached variant, assume that we already know
+ // all we need to and use it
+ var domCached = _queryFuncCacheDOM[query];
+ if(domCached){ return domCached; }
+
+ // TODO:
+ // today we're caching DOM and QSA branches separately so we
+ // recalc useQSA every time. If we had a way to tag root+query
+ // efficiently, we'd be in good shape to do a global cache.
+
+ var qcz = query.charAt(0);
+ var nospace = (-1 == query.indexOf(" "));
+
+ // byId searches are wicked fast compared to QSA, even when filtering
+ // is required
+ if( (query.indexOf("#") >= 0) && (nospace) ){
+ forceDOM = true;
+ }
+
+ var useQSA = (
+ qsaAvail && (!forceDOM) &&
+ // as per CSS 3, we can't currently start w/ combinator:
+ // http://www.w3.org/TR/css3-selectors/#w3cselgrammar
+ (specials.indexOf(qcz) == -1) &&
+ // IE's QSA impl sucks on pseudos
+ (!dojo.isIE || (query.indexOf(":") == -1)) &&
+
+ (!(cssCaseBug && (query.indexOf(".") >= 0))) &&
+
+ // FIXME:
+ // need to tighten up browser rules on ":contains" and "|=" to
+ // figure out which aren't good
+ // Latest webkit (around 531.21.8) does not seem to do well with :checked on option
+ // elements, even though according to spec, selected options should
+ // match :checked. So go nonQSA for it:
+ // http://bugs.dojotoolkit.org/ticket/5179
+ (query.indexOf(":contains") == -1) && (query.indexOf(":checked") == -1) &&
+ (query.indexOf("|=") == -1) // some browsers don't grok it
+ );
+
+ // TODO:
+ // if we've got a descendant query (e.g., "> .thinger" instead of
+ // just ".thinger") in a QSA-able doc, but are passed a child as a
+ // root, it should be possible to give the item a synthetic ID and
+ // trivially rewrite the query to the form "#synid > .thinger" to
+ // use the QSA branch
+
+
+ if(useQSA){
+ var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ?
+ (query + " *") : query;
+ return _queryFuncCacheQSA[query] = function(root){
+ try{
+ // the QSA system contains an egregious spec bug which
+ // limits us, effectively, to only running QSA queries over
+ // entire documents. See:
+ // http://ejohn.org/blog/thoughts-on-queryselectorall/
+ // despite this, we can also handle QSA runs on simple
+ // selectors, but we don't want detection to be expensive
+ // so we're just checking for the presence of a space char
+ // right now. Not elegant, but it's cheaper than running
+ // the query parser when we might not need to
+ if(!((9 == root.nodeType) || nospace)){ throw ""; }
+ var r = root[qsa](tq);
+ // skip expensive duplication checks and just wrap in a NodeList
+ r[noZip] = true;
+ return r;
+ }catch(e){
+ // else run the DOM branch on this query, ensuring that we
+ // default that way in the future
+ return getQueryFunc(query, true)(root);
+ }
+ }
+ }else{
+ // DOM branch
+ var parts = query.split(/\s*,\s*/);
+ return _queryFuncCacheDOM[query] = ((parts.length < 2) ?
+ // if not a compound query (e.g., ".foo, .bar"), cache and return a dispatcher
+ getStepQueryFunc(query) :
+ // if it *is* a complex query, break it up into its
+ // constituent parts and return a dispatcher that will
+ // merge the parts when run
+ function(root){
+ var pindex = 0, // avoid array alloc for every invocation
+ ret = [],
+ tp;
+ while((tp = parts[pindex++])){
+ ret = ret.concat(getStepQueryFunc(tp)(root));
+ }
+ return ret;
+ }
+ );
+ }
+ };
+
+ var _zipIdx = 0;
+
+ // NOTE:
+ // this function is Moo inspired, but our own impl to deal correctly
+ // with XML in IE
+ var _nodeUID = dojo.isIE ? function(node){
+ if(caseSensitive){
+ // XML docs don't have uniqueID on their nodes
+ return (node.getAttribute("_uid") || node.setAttribute("_uid", ++_zipIdx) || _zipIdx);
+
+ }else{
+ return node.uniqueID;
+ }
+ } :
+ function(node){
+ return (node._uid || (node._uid = ++_zipIdx));
+ };
+
+ // determine if a node in is unique in a "bag". In this case we don't want
+ // to flatten a list of unique items, but rather just tell if the item in
+ // question is already in the bag. Normally we'd just use hash lookup to do
+ // this for us but IE's DOM is busted so we can't really count on that. On
+ // the upside, it gives us a built in unique ID function.
+ var _isUnique = function(node, bag){
+ if(!bag){ return 1; }
+ var id = _nodeUID(node);
+ if(!bag[id]){ return bag[id] = 1; }
+ return 0;
+ };
+
+ // attempt to efficiently determine if an item in a list is a dupe,
+ // returning a list of "uniques", hopefully in doucment order
+ var _zipIdxName = "_zipIdx";
+ var _zip = function(arr){
+ if(arr && arr.nozip){
+ return arr;
+ }
+ var ret = [];
+ if(!arr || !arr.length){ return ret; }
+ if(arr[0]){
+ ret.push(arr[0]);
+ }
+ if(arr.length < 2){ return ret; }
+
+ _zipIdx++;
+
+ // we have to fork here for IE and XML docs because we can't set
+ // expandos on their nodes (apparently). *sigh*
+ if(dojo.isIE && caseSensitive){
+ var szidx = _zipIdx+"";
+ arr[0].setAttribute(_zipIdxName, szidx);
+ for(var x = 1, te; te = arr[x]; x++){
+ if(arr[x].getAttribute(_zipIdxName) != szidx){
+ ret.push(te);
+ }
+ te.setAttribute(_zipIdxName, szidx);
+ }
+ }else if(dojo.isIE && arr.commentStrip){
+ try{
+ for(var x = 1, te; te = arr[x]; x++){
+ if(_isElement(te)){
+ ret.push(te);
+ }
+ }
+ }catch(e){ /* squelch */ }
+ }else{
+ if(arr[0]){ arr[0][_zipIdxName] = _zipIdx; }
+ for(var x = 1, te; te = arr[x]; x++){
+ if(arr[x][_zipIdxName] != _zipIdx){
+ ret.push(te);
+ }
+ te[_zipIdxName] = _zipIdx;
+ }
+ }
+ return ret;
+ };
+
+ // the main executor
+ var query = function(/*String*/ query, /*String|DOMNode?*/ root){
+ // summary:
+ // Returns nodes which match the given CSS3 selector, searching the
+ // entire document by default but optionally taking a node to scope
+ // the search by. Returns an array.
+ // description:
+ // dojo.query() is the swiss army knife of DOM node manipulation in
+ // Dojo. Much like Prototype's "$$" (bling-bling) function or JQuery's
+ // "$" function, dojo.query provides robust, high-performance
+ // CSS-based node selector support with the option of scoping searches
+ // to a particular sub-tree of a document.
+ //
+ // Supported Selectors:
+ // --------------------
+ //
+ // acme supports a rich set of CSS3 selectors, including:
+ //
+ // * class selectors (e.g., `.foo`)
+ // * node type selectors like `span`
+ // * ` ` descendant selectors
+ // * `>` child element selectors
+ // * `#foo` style ID selectors
+ // * `*` universal selector
+ // * `~`, the preceded-by sibling selector
+ // * `+`, the immediately preceded-by sibling selector
+ // * attribute queries:
+ // | * `[foo]` attribute presence selector
+ // | * `[foo='bar']` attribute value exact match
+ // | * `[foo~='bar']` attribute value list item match
+ // | * `[foo^='bar']` attribute start match
+ // | * `[foo$='bar']` attribute end match
+ // | * `[foo*='bar']` attribute substring match
+ // * `:first-child`, `:last-child`, and `:only-child` positional selectors
+ // * `:empty` content emtpy selector
+ // * `:checked` pseudo selector
+ // * `:nth-child(n)`, `:nth-child(2n+1)` style positional calculations
+ // * `:nth-child(even)`, `:nth-child(odd)` positional selectors
+ // * `:not(...)` negation pseudo selectors
+ //
+ // Any legal combination of these selectors will work with
+ // `dojo.query()`, including compound selectors ("," delimited).
+ // Very complex and useful searches can be constructed with this
+ // palette of selectors and when combined with functions for
+ // manipulation presented by dojo.NodeList, many types of DOM
+ // manipulation operations become very straightforward.
+ //
+ // Unsupported Selectors:
+ // ----------------------
+ //
+ // While dojo.query handles many CSS3 selectors, some fall outside of
+ // what's reasonable for a programmatic node querying engine to
+ // handle. Currently unsupported selectors include:
+ //
+ // * namespace-differentiated selectors of any form
+ // * all `::` pseduo-element selectors
+ // * certain pseduo-selectors which don't get a lot of day-to-day use:
+ // | * `:root`, `:lang()`, `:target`, `:focus`
+ // * all visual and state selectors:
+ // | * `:root`, `:active`, `:hover`, `:visisted`, `:link`,
+ // `:enabled`, `:disabled`
+ // * `:*-of-type` pseudo selectors
+ //
+ // dojo.query and XML Documents:
+ // -----------------------------
+ //
+ // `dojo.query` (as of dojo 1.2) supports searching XML documents
+ // in a case-sensitive manner. If an HTML document is served with
+ // a doctype that forces case-sensitivity (e.g., XHTML 1.1
+ // Strict), dojo.query() will detect this and "do the right
+ // thing". Case sensitivity is dependent upon the document being
+ // searched and not the query used. It is therefore possible to
+ // use case-sensitive queries on strict sub-documents (iframes,
+ // etc.) or XML documents while still assuming case-insensitivity
+ // for a host/root document.
+ //
+ // Non-selector Queries:
+ // ---------------------
+ //
+ // If something other than a String is passed for the query,
+ // `dojo.query` will return a new `dojo.NodeList` instance
+ // constructed from that parameter alone and all further
+ // processing will stop. This means that if you have a reference
+ // to a node or NodeList, you can quickly construct a new NodeList
+ // from the original by calling `dojo.query(node)` or
+ // `dojo.query(list)`.
+ //
+ // query:
+ // The CSS3 expression to match against. For details on the syntax of
+ // CSS3 selectors, see <http://www.w3.org/TR/css3-selectors/#selectors>
+ // root:
+ // A DOMNode (or node id) to scope the search from. Optional.
+ // returns: Array
+ // example:
+ // search the entire document for elements with the class "foo":
+ // | dojo.query(".foo");
+ // these elements will match:
+ // | <span class="foo"></span>
+ // | <span class="foo bar"></span>
+ // | <p class="thud foo"></p>
+ // example:
+ // search the entire document for elements with the classes "foo" *and* "bar":
+ // | dojo.query(".foo.bar");
+ // these elements will match:
+ // | <span class="foo bar"></span>
+ // while these will not:
+ // | <span class="foo"></span>
+ // | <p class="thud foo"></p>
+ // example:
+ // find `<span>` elements which are descendants of paragraphs and
+ // which have a "highlighted" class:
+ // | dojo.query("p span.highlighted");
+ // the innermost span in this fragment matches:
+ // | <p class="foo">
+ // | <span>...
+ // | <span class="highlighted foo bar">...</span>
+ // | </span>
+ // | </p>
+ // example:
+ // set an "odd" class on all odd table rows inside of the table
+ // `#tabular_data`, using the `>` (direct child) selector to avoid
+ // affecting any nested tables:
+ // | dojo.query("#tabular_data > tbody > tr:nth-child(odd)").addClass("odd");
+ // example:
+ // remove all elements with the class "error" from the document
+ // and store them in a list:
+ // | var errors = dojo.query(".error").orphan();
+ // example:
+ // add an onclick handler to every submit button in the document
+ // which causes the form to be sent via Ajax instead:
+ // | dojo.query("input[type='submit']").onclick(function(e){
+ // | dojo.stopEvent(e); // prevent sending the form
+ // | var btn = e.target;
+ // | dojo.xhrPost({
+ // | form: btn.form,
+ // | load: function(data){
+ // | // replace the form with the response
+ // | var div = dojo.doc.createElement("div");
+ // | dojo.place(div, btn.form, "after");
+ // | div.innerHTML = data;
+ // | dojo.style(btn.form, "display", "none");
+ // | }
+ // | });
+ // | });
+
+ root = root||getDoc();
+ var od = root.ownerDocument||root.documentElement;
+
+ // throw the big case sensitivity switch
+
+ // NOTE:
+ // Opera in XHTML mode doesn't detect case-sensitivity correctly
+ // and it's not clear that there's any way to test for it
+ caseSensitive = (root.contentType && root.contentType=="application/xml") ||
+ (dojo.isOpera && (root.doctype || od.toString() == "[object XMLDocument]")) ||
+ (!!od) &&
+ (dojo.isIE ? od.xml : (root.xmlVersion || od.xmlVersion));
+
+ // NOTE:
+ // adding "true" as the 2nd argument to getQueryFunc is useful for
+ // testing the DOM branch without worrying about the
+ // behavior/performance of the QSA branch.
+ var r = getQueryFunc(query)(root);
+
+ // FIXME:
+ // need to investigate this branch WRT #8074 and #8075
+ if(r && r.nozip){
+ return r;
+ }
+ return _zip(r); // dojo.NodeList
+ };
+ query.filter = function(/*Node[]*/ nodeList, /*String*/ filter, /*String|DOMNode?*/ root){
+ // summary:
+ // function for filtering a NodeList based on a selector, optimized for simple selectors
+ var tmpNodeList = [],
+ parts = getQueryParts(filter),
+ filterFunc =
+ (parts.length == 1 && !/[^\w#\.]/.test(filter)) ?
+ getSimpleFilterFunc(parts[0]) :
+ function(node){
+ return dojo.query(filter, root).indexOf(node) != -1;
+ };
+ for(var x = 0, te; te = nodeList[x]; x++){
+ if(filterFunc(te)){ tmpNodeList.push(te); }
+ }
+ return tmpNodeList;
+ };
+ return query;
+});//end defineQuery
diff --git a/lib/dojo/selector/lite.js b/lib/dojo/selector/lite.js
new file mode 100644
index 000000000..c20fe724b
--- /dev/null
+++ b/lib/dojo/selector/lite.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/selector/lite",["../has","../_base/kernel"],function(_1,_2){"use strict";var _3=document.createElement("div");var _4=_3.matchesSelector||_3.webkitMatchesSelector||_3.mozMatchesSelector||_3.msMatchesSelector||_3.oMatchesSelector;var _5=_3.querySelectorAll;_1.add("dom-matches-selector",!!_4);_1.add("dom-qsa",!!_5);var _6=function(_7,_8){if(_9&&_7.indexOf(",")>-1){return _9(_7,_8);}var _a=(_5?/^([\w]*)#([\w\-]+$)|^(\.)([\w\-\*]+$)|^(\w+$)/:/^([\w]*)#([\w\-]+)(?:\s+(.*))?$|(?:^|(>|.+\s+))([\w\-\*]+)(\S*$)/).exec(_7);_8=_8||document;if(_a){if(_a[2]){var _b=_2.byId?_2.byId(_a[2]):document.getElementById(_a[2]);if(!_b||(_a[1]&&_a[1]!=_b.tagName.toLowerCase())){return [];}if(_8!=document){var _c=_b;while(_c!=_8){_c=_c.parentNode;if(!_c){return [];}}}return _a[3]?_6(_a[3],_b):[_b];}if(_a[3]&&_8.getElementsByClassName){return _8.getElementsByClassName(_a[4]);}var _b;if(_a[5]){_b=_8.getElementsByTagName(_a[5]);if(_a[4]||_a[6]){_7=(_a[4]||"")+_a[6];}else{return _b;}}}if(_5){if(_8.nodeType===1&&_8.nodeName.toLowerCase()!=="object"){return _d(_8,_7,_8.querySelectorAll);}else{return _8.querySelectorAll(_7);}}else{if(!_b){_b=_8.getElementsByTagName("*");}}var _e=[];for(var i=0,l=_b.length;i<l;i++){var _f=_b[i];if(_f.nodeType==1&&_10(_f,_7,_8)){_e.push(_f);}}return _e;};var _d=function(_11,_12,_13){var _14=_11,old=_11.getAttribute("id"),nid=old||"__dojo__",_15=_11.parentNode,_16=/^\s*[+~]/.test(_12);if(_16&&!_15){return [];}if(!old){_11.setAttribute("id",nid);}else{nid=nid.replace(/'/g,"\\$&");}if(_16&&_15){_11=_11.parentNode;}try{return _13.call(_11,"[id='"+nid+"'] "+_12);}finally{if(!old){_14.removeAttribute("id");}}};if(!_1("dom-matches-selector")){var _10=(function(){var _17=_3.tagName=="div"?"toLowerCase":"toUpperCase";function tag(_18){_18=_18[_17]();return function(_19){return _19.tagName==_18;};};function _1a(_1b){var _1c=" "+_1b+" ";return function(_1d){return _1d.className.indexOf(_1b)>-1&&(" "+_1d.className+" ").indexOf(_1c)>-1;};};var _1e={"^=":function(_1f,_20){return _1f.indexOf(_20)==0;},"*=":function(_21,_22){return _21.indexOf(_22)>-1;},"$=":function(_23,_24){return _23.substring(_23.length-_24.length,_23.length)==_24;},"~=":function(_25,_26){return (" "+_25+" ").indexOf(" "+_26+" ")>-1;},"|=":function(_27,_28){return (_27+"-").indexOf(_28+"-")==0;},"=":function(_29,_2a){return _29==_2a;},"":function(_2b,_2c){return true;}};function _2d(_2e,_2f,_30){if(_2f.match(/['"]/)){_2f=eval(_2f);}var _31=_1e[_30||""];return function(_32){var _33=_32.getAttribute(_2e);return _33&&_31(_33,_2f);};};function _34(_35){return function(_36,_37){while((_36=_36.parentNode)!=_37){if(_35(_36,_37)){return true;}}};};function _38(_39){return function(_3a,_3b){_3a=_3a.parentNode;return _39?_3a!=_3b&&_39(_3a,_3b):_3a==_3b;};};var _3c={};function and(_3d,_3e){return _3d?function(_3f,_40){return _3e(_3f)&&_3d(_3f,_40);}:_3e;};return function(_41,_42,_43){var _44=_3c[_42];if(!_44){if(_42.replace(/(?:\s*([> ])\s*)|(\.)?([\w-]+)|\[([\w-]+)\s*(.?=)?\s*([^\]]*)\]/g,function(t,_45,_46,_47,_48,_49,_4a){if(_47){if(_46=="."){_44=and(_44,_1a(_47));}else{_44=and(_44,tag(_47));}}else{if(_45){_44=(_45==" "?_34:_38)(_44);}else{if(_48){_44=and(_44,_2d(_48,_4a,_49));}}}return "";})){throw new Error("Syntax error in query");}if(!_44){return true;}_3c[_42]=_44;}return _44(_41,_43);};})();}if(!_1("dom-qsa")){var _9=function(_4b,_4c){_4b=_4b.split(/\s*,\s*/);var _4d=[];for(var i=0;i<_4b.length;i++){var _4e=_6(_4b[i],_4c);for(var j=0,l=_4e.length;j<l;j++){var _4f=_4e[j];_4d[_4f.sourceIndex]=_4f;}}var _50=[];for(i in _4d){_50.push(_4d[i]);}return _50;};}_6.match=_4?function(_51,_52,_53){if(_53){return _d(_53,_52,function(_54){return _4.call(_51,_54);});}return _4.call(_51,_52);}:_10;return _6;}); \ No newline at end of file
diff --git a/lib/dojo/selector/lite.js.uncompressed.js b/lib/dojo/selector/lite.js.uncompressed.js
new file mode 100644
index 000000000..374f7a2ad
--- /dev/null
+++ b/lib/dojo/selector/lite.js.uncompressed.js
@@ -0,0 +1,264 @@
+define("dojo/selector/lite", ["../has", "../_base/kernel"], function(has, dojo){
+"use strict";
+// summary:
+// A small lightweight query selector engine that implements CSS2.1 selectors
+// minus pseudo-classes and the sibling combinator, plus CSS3 attribute selectors
+var testDiv = document.createElement("div");
+var matchesSelector = testDiv.matchesSelector || testDiv.webkitMatchesSelector || testDiv.mozMatchesSelector || testDiv.msMatchesSelector || testDiv.oMatchesSelector; // IE9, WebKit, Firefox have this, but not Opera yet
+var querySelectorAll = testDiv.querySelectorAll;
+has.add("dom-matches-selector", !!matchesSelector);
+has.add("dom-qsa", !!querySelectorAll);
+
+// this is a simple query engine. It has handles basic selectors, and for simple
+// common selectors is extremely fast
+var liteEngine = function(selector, root){
+ if(combine && selector.indexOf(',') > -1){
+ return combine(selector, root);
+ }
+ var match = (querySelectorAll ?
+ /^([\w]*)#([\w\-]+$)|^(\.)([\w\-\*]+$)|^(\w+$)/ : // this one only matches on simple queries where we can beat qSA with specific methods
+ /^([\w]*)#([\w\-]+)(?:\s+(.*))?$|(?:^|(>|.+\s+))([\w\-\*]+)(\S*$)/) // this one matches parts of the query that we can use to speed up manual filtering
+ .exec(selector);
+ root = root || document;
+ if(match){
+ // fast path regardless of whether or not querySelectorAll exists
+ if(match[2]){
+ // an #id
+ // use dojo.byId if available as it fixes the id retrieval in IE
+ var found = dojo.byId ? dojo.byId(match[2]) : document.getElementById(match[2]);
+ if(!found || (match[1] && match[1] != found.tagName.toLowerCase())){
+ // if there is a tag qualifer and it doesn't match, no matches
+ return [];
+ }
+ if(root != document){
+ // there is a root element, make sure we are a child of it
+ var parent = found;
+ while(parent != root){
+ parent = parent.parentNode;
+ if(!parent){
+ return [];
+ }
+ }
+ }
+ return match[3] ?
+ liteEngine(match[3], found)
+ : [found];
+ }
+ if(match[3] && root.getElementsByClassName){
+ // a .class
+ return root.getElementsByClassName(match[4]);
+ }
+ var found;
+ if(match[5]){
+ // a tag
+ found = root.getElementsByTagName(match[5]);
+ if(match[4] || match[6]){
+ selector = (match[4] || "") + match[6];
+ }else{
+ // that was the entirety of the query, return results
+ return found;
+ }
+ }
+ }
+ if(querySelectorAll){
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if (root.nodeType === 1 && root.nodeName.toLowerCase() !== "object"){
+ return useRoot(root, selector, root.querySelectorAll);
+ }else{
+ // we can use the native qSA
+ return root.querySelectorAll(selector);
+ }
+ }else if(!found){
+ // search all children and then filter
+ found = root.getElementsByTagName("*");
+ }
+ // now we filter the nodes that were found using the matchesSelector
+ var results = [];
+ for(var i = 0, l = found.length; i < l; i++){
+ var node = found[i];
+ if(node.nodeType == 1 && jsMatchesSelector(node, selector, root)){
+ // keep the nodes that match the selector
+ results.push(node);
+ }
+ }
+ return results;
+};
+var useRoot = function(context, query, method){
+ // this function creates a temporary id so we can do rooted qSA queries, this is taken from sizzle
+ var oldContext = context,
+ old = context.getAttribute( "id" ),
+ nid = old || "__dojo__",
+ hasParent = context.parentNode,
+ relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+ if(relativeHierarchySelector && !hasParent){
+ return [];
+ }
+ if(!old){
+ context.setAttribute("id", nid);
+ }else{
+ nid = nid.replace(/'/g, "\\$&");
+ }
+ if(relativeHierarchySelector && hasParent){
+ context = context.parentNode;
+ }
+
+ try {
+ return method.call(context, "[id='" + nid + "'] " + query );
+ } finally {
+ if ( !old ) {
+ oldContext.removeAttribute( "id" );
+ }
+ }
+};
+
+if(!has("dom-matches-selector")){
+ var jsMatchesSelector = (function(){
+ // a JS implementation of CSS selector matching, first we start with the various handlers
+ var caseFix = testDiv.tagName == "div" ? "toLowerCase" : "toUpperCase";
+ function tag(tagName){
+ tagName = tagName[caseFix]();
+ return function(node){
+ return node.tagName == tagName;
+ }
+ }
+ function className(className){
+ var classNameSpaced = ' ' + className + ' ';
+ return function(node){
+ return node.className.indexOf(className) > -1 && (' ' + node.className + ' ').indexOf(classNameSpaced) > -1;
+ }
+ }
+ var attrComparators = {
+ "^=": function(attrValue, value){
+ return attrValue.indexOf(value) == 0;
+ },
+ "*=": function(attrValue, value){
+ return attrValue.indexOf(value) > -1;
+ },
+ "$=": function(attrValue, value){
+ return attrValue.substring(attrValue.length - value.length, attrValue.length) == value;
+ },
+ "~=": function(attrValue, value){
+ return (' ' + attrValue + ' ').indexOf(' ' + value + ' ') > -1;
+ },
+ "|=": function(attrValue, value){
+ return (attrValue + '-').indexOf(value + '-') == 0;
+ },
+ "=": function(attrValue, value){
+ return attrValue == value;
+ },
+ "": function(attrValue, value){
+ return true;
+ }
+ };
+ function attr(name, value, type){
+ if(value.match(/['"]/)){
+ // it is quoted, do an eval to parse the string (CSS and JS parsing are close enough)
+ value = eval(value);
+ }
+ var comparator = attrComparators[type || ""];
+ return function(node){
+ var attrValue = node.getAttribute(name);
+ return attrValue && comparator(attrValue, value);
+ }
+ }
+ function ancestor(matcher){
+ return function(node, root){
+ while((node = node.parentNode) != root){
+ if(matcher(node, root)){
+ return true;
+ }
+ }
+ };
+ }
+ function parent(matcher){
+ return function(node, root){
+ node = node.parentNode;
+ return matcher ?
+ node != root && matcher(node, root)
+ : node == root;
+ };
+ }
+ var cache = {};
+ function and(matcher, next){
+ return matcher ?
+ function(node, root){
+ return next(node) && matcher(node, root);
+ }
+ : next;
+ }
+ return function(node, selector, root){
+ // this returns true or false based on if the node matches the selector (optionally within the given root)
+ var matcher = cache[selector]; // check to see if we have created a matcher function for the given selector
+ if(!matcher){
+ // create a matcher function for the given selector
+ // parse the selectors
+ if(selector.replace(/(?:\s*([> ])\s*)|(\.)?([\w-]+)|\[([\w-]+)\s*(.?=)?\s*([^\]]*)\]/g, function(t, combinator, type, value, attrName, attrType, attrValue){
+ if(value){
+ if(type == "."){
+ matcher = and(matcher, className(value));
+ }
+ else{
+ matcher = and(matcher, tag(value));
+ }
+ }
+ else if(combinator){
+ matcher = (combinator == " " ? ancestor : parent)(matcher);
+ }
+ else if(attrName){
+ matcher = and(matcher, attr(attrName, attrValue, attrType));
+ }
+ return "";
+ })){
+ throw new Error("Syntax error in query");
+ }
+ if(!matcher){
+ return true;
+ }
+ cache[selector] = matcher;
+ }
+ // now run the matcher function on the node
+ return matcher(node, root);
+ };
+ })();
+}
+if(!has("dom-qsa")){
+ var combine = function(selector, root){
+ // combined queries
+ selector = selector.split(/\s*,\s*/);
+ var indexed = [];
+ // add all results and keep unique ones, this only runs in IE, so we take advantage
+ // of known IE features, particularly sourceIndex which is unique and allows us to
+ // order the results
+ for(var i = 0; i < selector.length; i++){
+ var results = liteEngine(selector[i], root);
+ for(var j = 0, l = results.length; j < l; j++){
+ var node = results[j];
+ indexed[node.sourceIndex] = node;
+ }
+ }
+ // now convert from a sparse array to a dense array
+ var totalResults = [];
+ for(i in indexed){
+ totalResults.push(indexed[i]);
+ }
+ return totalResults;
+ };
+}
+
+liteEngine.match = matchesSelector ? function(node, selector, root){
+ if(root){
+ // doesn't support three args, use rooted id trick
+ return useRoot(root, selector, function(query){
+ return matchesSelector.call(node, query);
+ });
+ }
+ // we have a native matchesSelector, use that
+ return matchesSelector.call(node, selector);
+} : jsMatchesSelector; // otherwise use the JS matches impl
+
+return liteEngine;
+});
diff --git a/lib/dojo/store/Cache.js b/lib/dojo/store/Cache.js
index d08d17099..3ca7e050e 100644
--- a/lib/dojo/store/Cache.js
+++ b/lib/dojo/store/Cache.js
@@ -4,149 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.store.Cache"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.store.Cache"] = true;
-dojo.provide("dojo.store.Cache");
-
-dojo.getObject("store", true, dojo);
-
-/*=====
-dojo.declare("dojo.store.__CacheArgs", null, {
- constructor: function(){
- // summary:
- // These are additional options for how caching is handled.
- // isLoaded: Function?
- // This is a function that will be called for each item in a query response to determine
- // if it is cacheable. If isLoaded returns true, the item will be cached, otherwise it
- // will not be cached. If isLoaded is not provided, all items will be cached.
- this.isLoaded = isLoaded;
- }
-});
-=====*/
-dojo.store.Cache = function(masterStore, cachingStore, /*dojo.store.__CacheArgs*/ options){
- // summary:
- // The Cache store wrapper takes a master store and a caching store,
- // caches data from the master into the caching store for faster
- // lookup. Normally one would use a memory store for the caching
- // store and a server store like JsonRest for the master store.
- // masterStore:
- // This is the authoritative store, all uncached requests or non-safe requests will
- // be made against this store.
- // cachingStore:
- // This is the caching store that will be used to store responses for quick access.
- // Typically this should be a local store.
- // options:
- // These are additional options for how caching is handled.
- options = options || {};
- return dojo.delegate(masterStore, {
- query: function(query, directives){
- var results = masterStore.query(query, directives);
- results.forEach(function(object){
- if(!options.isLoaded || options.isLoaded(object)){
- cachingStore.put(object);
- }
- });
- return results;
- },
- // look for a queryEngine in either store
- queryEngine: masterStore.queryEngine || cachingStore.queryEngine,
- get: function(id, directives){
- return dojo.when(cachingStore.get(id), function(result){
- return result || dojo.when(masterStore.get(id, directives), function(result){
- if(result){
- cachingStore.put(result, {id: id});
- }
- return result;
- });
- });
- },
- add: function(object, directives){
- return dojo.when(masterStore.add(object, directives), function(result){
- // now put result in cache
- return cachingStore.add(typeof result == "object" ? result : object, directives);
- });
- },
- put: function(object, directives){
- // first remove from the cache, so it is empty until we get a response from the master store
- cachingStore.remove((directives && directives.id) || this.getIdentity(object));
- return dojo.when(masterStore.put(object, directives), function(result){
- // now put result in cache
- return cachingStore.put(typeof result == "object" ? result : object, directives);
- });
- },
- remove: function(id, directives){
- return dojo.when(masterStore.remove(id, directives), function(result){
- return cachingStore.remove(id, directives);
- });
- },
- evict: function(id){
- return cachingStore.remove(id);
- }
- });
-};
-/*=====
-dojo.declare("dojo.store.Cache", null, {
- // example:
- // | var master = new dojo.store.Memory(data);
- // | var cacher = new dojo.store.Memory();
- // | var store = new dojo.store.Cache(master, cacher);
- //
- query: function(query, directives){
- // summary:
- // Query the underlying master store and cache any results.
- // query: Object|String
- // The object or string containing query information. Dependent on the query engine used.
- // directives: dojo.store.util.SimpleQueryEngine.__queryOptions?
- // An optional keyword arguments object with additional parameters describing the query.
- // returns: dojo.store.util.QueryResults
- // A QueryResults object that can be used to iterate over.
- },
- get: function(id, directives){
- // summary:
- // Get the object with the specific id.
- // id: Number
- // The identifier for the object in question.
- // directives: dojo.store.__GetOptions?
- // Any additional parameters needed to describe how the get should be performed.
- // returns: dojo.store.util.QueryResults
- // A QueryResults object.
- },
- add: function(object, directives){
- // summary:
- // Add the given object to the store.
- // object: Object
- // The object to add to the store.
- // directives: dojo.store.__AddOptions?
- // Any additional parameters needed to describe how the add should be performed.
- // returns: Number
- // The new id for the object.
- },
- put: function(object, directives){
- // summary:
- // Put the object into the store (similar to an HTTP PUT).
- // object: Object
- // The object to put to the store.
- // directives: dojo.store.__PutOptions?
- // Any additional parameters needed to describe how the put should be performed.
- // returns: Number
- // The new id for the object.
- },
- remove: function(id, directives){
- // summary:
- // Remove the object with the specific id.
- // id: Number
- // The identifier for the object in question.
- // directives: dojo.store.__RemoveOptions?
- // Any additional parameters needed to describe how the remove should be performed.
- },
- evict: function(id){
- // summary:
- // Remove the object with the given id from the underlying caching store.
- // id: Number
- // The identifier for the object in question.
- }
-});
-=====*/
-
-}
+//>>built
+define("dojo/store/Cache",["../_base/lang","../_base/Deferred"],function(_1,_2){var _3=_1.getObject("dojo.store",true);_3.Cache=function(_4,_5,_6){_6=_6||{};return _1.delegate(_4,{query:function(_7,_8){var _9=_4.query(_7,_8);_9.forEach(function(_a){if(!_6.isLoaded||_6.isLoaded(_a)){_5.put(_a);}});return _9;},queryEngine:_4.queryEngine||_5.queryEngine,get:function(id,_b){return _2.when(_5.get(id),function(_c){return _c||_2.when(_4.get(id,_b),function(_d){if(_d){_5.put(_d,{id:id});}return _d;});});},add:function(_e,_f){return _2.when(_4.add(_e,_f),function(_10){return _5.add(typeof _10=="object"?_10:_e,_f);});},put:function(_11,_12){_5.remove((_12&&_12.id)||this.getIdentity(_11));return _2.when(_4.put(_11,_12),function(_13){return _5.put(typeof _13=="object"?_13:_11,_12);});},remove:function(id,_14){return _2.when(_4.remove(id,_14),function(_15){return _5.remove(id,_14);});},evict:function(id){return _5.remove(id);}});};return _3.Cache;}); \ No newline at end of file
diff --git a/lib/dojo/store/Cache.js.uncompressed.js b/lib/dojo/store/Cache.js.uncompressed.js
new file mode 100644
index 000000000..d6951deb3
--- /dev/null
+++ b/lib/dojo/store/Cache.js.uncompressed.js
@@ -0,0 +1,148 @@
+define("dojo/store/Cache", ["../_base/lang","../_base/Deferred"
+],function(lang, Deferred) {
+ // module:
+ // dojo/store/Cache
+ // summary:
+ // TODOC
+
+var store = lang.getObject("dojo.store", true);
+
+/*=====
+dojo.declare("dojo.store.__CacheArgs", null, {
+ constructor: function(){
+ // summary:
+ // These are additional options for how caching is handled.
+ // isLoaded: Function?
+ // This is a function that will be called for each item in a query response to determine
+ // if it is cacheable. If isLoaded returns true, the item will be cached, otherwise it
+ // will not be cached. If isLoaded is not provided, all items will be cached.
+ this.isLoaded = isLoaded;
+ }
+});
+=====*/
+store.Cache = function(masterStore, cachingStore, /*dojo.store.__CacheArgs*/ options){
+ // summary:
+ // The Cache store wrapper takes a master store and a caching store,
+ // caches data from the master into the caching store for faster
+ // lookup. Normally one would use a memory store for the caching
+ // store and a server store like JsonRest for the master store.
+ // masterStore:
+ // This is the authoritative store, all uncached requests or non-safe requests will
+ // be made against this store.
+ // cachingStore:
+ // This is the caching store that will be used to store responses for quick access.
+ // Typically this should be a local store.
+ // options:
+ // These are additional options for how caching is handled.
+ options = options || {};
+ return lang.delegate(masterStore, {
+ query: function(query, directives){
+ var results = masterStore.query(query, directives);
+ results.forEach(function(object){
+ if(!options.isLoaded || options.isLoaded(object)){
+ cachingStore.put(object);
+ }
+ });
+ return results;
+ },
+ // look for a queryEngine in either store
+ queryEngine: masterStore.queryEngine || cachingStore.queryEngine,
+ get: function(id, directives){
+ return Deferred.when(cachingStore.get(id), function(result){
+ return result || Deferred.when(masterStore.get(id, directives), function(result){
+ if(result){
+ cachingStore.put(result, {id: id});
+ }
+ return result;
+ });
+ });
+ },
+ add: function(object, directives){
+ return Deferred.when(masterStore.add(object, directives), function(result){
+ // now put result in cache
+ return cachingStore.add(typeof result == "object" ? result : object, directives);
+ });
+ },
+ put: function(object, directives){
+ // first remove from the cache, so it is empty until we get a response from the master store
+ cachingStore.remove((directives && directives.id) || this.getIdentity(object));
+ return Deferred.when(masterStore.put(object, directives), function(result){
+ // now put result in cache
+ return cachingStore.put(typeof result == "object" ? result : object, directives);
+ });
+ },
+ remove: function(id, directives){
+ return Deferred.when(masterStore.remove(id, directives), function(result){
+ return cachingStore.remove(id, directives);
+ });
+ },
+ evict: function(id){
+ return cachingStore.remove(id);
+ }
+ });
+};
+/*=====
+dojo.declare("dojo.store.Cache", null, {
+ // example:
+ // | var master = new dojo.store.Memory(data);
+ // | var cacher = new dojo.store.Memory();
+ // | var store = new dojo.store.Cache(master, cacher);
+ //
+ query: function(query, directives){
+ // summary:
+ // Query the underlying master store and cache any results.
+ // query: Object|String
+ // The object or string containing query information. Dependent on the query engine used.
+ // directives: dojo.store.util.SimpleQueryEngine.__queryOptions?
+ // An optional keyword arguments object with additional parameters describing the query.
+ // returns: dojo.store.util.QueryResults
+ // A QueryResults object that can be used to iterate over.
+ },
+ get: function(id, directives){
+ // summary:
+ // Get the object with the specific id.
+ // id: Number
+ // The identifier for the object in question.
+ // directives: dojo.store.__GetOptions?
+ // Any additional parameters needed to describe how the get should be performed.
+ // returns: dojo.store.util.QueryResults
+ // A QueryResults object.
+ },
+ add: function(object, directives){
+ // summary:
+ // Add the given object to the store.
+ // object: Object
+ // The object to add to the store.
+ // directives: dojo.store.__AddOptions?
+ // Any additional parameters needed to describe how the add should be performed.
+ // returns: Number
+ // The new id for the object.
+ },
+ put: function(object, directives){
+ // summary:
+ // Put the object into the store (similar to an HTTP PUT).
+ // object: Object
+ // The object to put to the store.
+ // directives: dojo.store.__PutOptions?
+ // Any additional parameters needed to describe how the put should be performed.
+ // returns: Number
+ // The new id for the object.
+ },
+ remove: function(id, directives){
+ // summary:
+ // Remove the object with the specific id.
+ // id: Number
+ // The identifier for the object in question.
+ // directives: dojo.store.__RemoveOptions?
+ // Any additional parameters needed to describe how the remove should be performed.
+ },
+ evict: function(id){
+ // summary:
+ // Remove the object with the given id from the underlying caching store.
+ // id: Number
+ // The identifier for the object in question.
+ }
+});
+=====*/
+return store.Cache;
+});
diff --git a/lib/dojo/store/DataStore.js b/lib/dojo/store/DataStore.js
index 99c81fd5d..e65eb0e60 100644
--- a/lib/dojo/store/DataStore.js
+++ b/lib/dojo/store/DataStore.js
@@ -4,139 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.store.DataStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.store.DataStore"] = true;
-dojo.provide("dojo.store.DataStore");
-dojo.require("dojo.store.util.QueryResults");
-
-
-dojo.declare("dojo.store.DataStore", null, {
- target: "",
- constructor: function(options){
- // summary:
- // This is an adapter for using Dojo Data stores with an object store consumer.
- // You can provide a Dojo data store and use this adapter to interact with it through
- // the Dojo object store API
- // options: Object?
- // This provides any configuration information that will be mixed into the store,
- // including a reference to the Dojo data store under the property "store".
- dojo.mixin(this, options);
- },
- _objectConverter: function(callback){
- var store = this.store;
- return function(item){
- var object = {};
- var attributes = store.getAttributes(item);
- for(var i = 0; i < attributes.length; i++){
- object[attributes[i]] = store.getValue(item, attributes[i]);
- }
- return callback(object);
- };
- },
- get: function(id, options){
- // summary:
- // Retrieves an object by it's identity. This will trigger a fetchItemByIdentity
- // id: Object?
- // The identity to use to lookup the object
- var returnedObject, returnedError;
- var deferred = new dojo.Deferred();
- this.store.fetchItemByIdentity({
- identity: id,
- onItem: this._objectConverter(function(object){
- deferred.resolve(returnedObject = object);
- }),
- onError: function(error){
- deferred.reject(returnedError = error);
- }
- });
- if(returnedObject){
- // if it was returned synchronously
- return returnedObject;
- }
- if(returnedError){
- throw returnedError;
- }
- return deferred.promise;
- },
- put: function(object, options){
- // summary:
- // Stores an object by its identity.
- // object: Object
- // The object to store.
- // options: Object?
- // Additional metadata for storing the data. Includes a reference to an id
- // that the object may be stored with (i.e. { id: "foo" }).
- var id = options && typeof options.id != "undefined" || this.getIdentity(object);
- var store = this.store;
- if(typeof id == "undefined"){
- store.newItem(object);
- }else{
- store.fetchItemByIdentity({
- identity: id,
- onItem: function(item){
- if(item){
- for(var i in object){
- if(store.getValue(item, i) != object[i]){
- store.setValue(item, i, object[i]);
- }
- }
- }else{
- store.newItem(object);
- }
- }
- });
- }
- },
- remove: function(id){
- // summary:
- // Deletes an object by its identity.
- // id: Object
- // The identity to use to delete the object
- var store = this.store;
- this.store.fetchItemByIdentity({
- identity: id,
- onItem: function(item){
- store.deleteItem(item);
- }
- });
- },
- query: function(query, options){
- // summary:
- // Queries the store for objects.
- // query: Object
- // The query to use for retrieving objects from the store
- // options: Object?
- // Optional options object as used by the underlying dojo.data Store.
- // returns: dojo.store.util.QueryResults
- // A query results object that can be used to iterate over results.
- var returnedObject, returnedError;
- var deferred = new dojo.Deferred();
- deferred.total = new dojo.Deferred();
- var converter = this._objectConverter(function(object){return object;});
- this.store.fetch(dojo.mixin({
- query: query,
- onBegin: function(count){
- deferred.total.resolve(count);
- },
- onComplete: function(results){
- deferred.resolve(dojo.map(results, converter));
- },
- onError: function(error){
- deferred.reject(error);
- }
- }, options));
- return dojo.store.util.QueryResults(deferred);
- },
- getIdentity: function(object){
- // summary:
- // Fetch the identity for the given object.
- // object: Object
- // The data object to get the identity from.
- // returns: Number
- // The id of the given object.
- return object[this.idProperty || this.store.getIdentityAttributes()[0]];
- }
-});
-
-}
+//>>built
+define("dojo/store/DataStore",["../_base/lang","../_base/declare","../_base/Deferred","../_base/array","./util/QueryResults"],function(_1,_2,_3,_4,_5){return _2("dojo.store.DataStore",null,{target:"",constructor:function(_6){_1.mixin(this,_6);if(!"idProperty" in _6){var _7;try{_7=this.store.getIdentityAttributes();}catch(e){}this.idProperty=(!_7||!idAttributes[0])||this.idProperty;}var _8=this.store.getFeatures();if(!_8["dojo.data.api.Read"]){this.get=null;}if(!_8["dojo.data.api.Identity"]){this.getIdentity=null;}if(!_8["dojo.data.api.Write"]){this.put=this.add=null;}},idProperty:"id",store:null,_objectConverter:function(_9){var _a=this.store;var _b=this.idProperty;return function(_c){var _d={};var _e=_a.getAttributes(_c);for(var i=0;i<_e.length;i++){_d[_e[i]]=_a.getValue(_c,_e[i]);}if(!(_b in _d)){_d[_b]=_a.getIdentity(_c);}return _9(_d);};},get:function(id,_f){var _10,_11;var _12=new _3();this.store.fetchItemByIdentity({identity:id,onItem:this._objectConverter(function(_13){_12.resolve(_10=_13);}),onError:function(_14){_12.reject(_11=_14);}});if(_10){return _10;}if(_11){throw _11;}return _12.promise;},put:function(_15,_16){var id=_16&&typeof _16.id!="undefined"||this.getIdentity(_15);var _17=this.store;var _18=this.idProperty;if(typeof id=="undefined"){_17.newItem(_15);}else{_17.fetchItemByIdentity({identity:id,onItem:function(_19){if(_19){for(var i in _15){if(i!=_18&&_17.getValue(_19,i)!=_15[i]){_17.setValue(_19,i,_15[i]);}}}else{_17.newItem(_15);}}});}},remove:function(id){var _1a=this.store;this.store.fetchItemByIdentity({identity:id,onItem:function(_1b){_1a.deleteItem(_1b);}});},query:function(_1c,_1d){var _1e;var _1f=new _3(function(){_1e.abort&&_1e.abort();});_1f.total=new _3();var _20=this._objectConverter(function(_21){return _21;});_1e=this.store.fetch(_1.mixin({query:_1c,onBegin:function(_22){_1f.total.resolve(_22);},onComplete:function(_23){_1f.resolve(_4.map(_23,_20));},onError:function(_24){_1f.reject(_24);}},_1d));return _5(_1f);},getIdentity:function(_25){return _25[this.idProperty];}});}); \ No newline at end of file
diff --git a/lib/dojo/store/DataStore.js.uncompressed.js b/lib/dojo/store/DataStore.js.uncompressed.js
new file mode 100644
index 000000000..e2a96e316
--- /dev/null
+++ b/lib/dojo/store/DataStore.js.uncompressed.js
@@ -0,0 +1,170 @@
+define("dojo/store/DataStore", ["../_base/lang", "../_base/declare", "../_base/Deferred", "../_base/array", "./util/QueryResults"
+], function(lang,declare,Deferred,array,QueryResults) {
+ // module:
+ // dojo/store/DataStore
+ // summary:
+ // TODOC
+
+
+return declare("dojo.store.DataStore", null, {
+ target: "",
+ constructor: function(options){
+ // summary:
+ // This is an adapter for using Dojo Data stores with an object store consumer.
+ // You can provide a Dojo data store and use this adapter to interact with it through
+ // the Dojo object store API
+ // options: Object?
+ // This provides any configuration information that will be mixed into the store,
+ // including a reference to the Dojo data store under the property "store".
+ lang.mixin(this, options);
+ if(!"idProperty" in options){
+ var idAttribute;
+ try{
+ idAttribute = this.store.getIdentityAttributes();
+ }catch(e){
+ // some store are not requiring an item instance to give us the ID attributes
+ // but some other do and throw errors in that case.
+ }
+ // if no idAttribute we have implicit id
+ this.idProperty = (!idAttribute || !idAttributes[0]) || this.idProperty;
+ }
+ var features = this.store.getFeatures();
+ // check the feature set and null out any methods that shouldn't be available
+ if(!features["dojo.data.api.Read"]){
+ this.get = null;
+ }
+ if(!features["dojo.data.api.Identity"]){
+ this.getIdentity = null;
+ }
+ if(!features["dojo.data.api.Write"]){
+ this.put = this.add = null;
+ }
+ },
+ // idProperty: String
+ // The object property to use to store the identity of the store items.
+ idProperty: "id",
+ // store:
+ // The object store to convert to a data store
+ store: null,
+ _objectConverter: function(callback){
+ var store = this.store;
+ var idProperty = this.idProperty;
+ return function(item){
+ var object = {};
+ var attributes = store.getAttributes(item);
+ for(var i = 0; i < attributes.length; i++){
+ object[attributes[i]] = store.getValue(item, attributes[i]);
+ }
+ if(!(idProperty in object)){
+ object[idProperty] = store.getIdentity(item);
+ }
+ return callback(object);
+ };
+ },
+ get: function(id, options){
+ // summary:
+ // Retrieves an object by it's identity. This will trigger a fetchItemByIdentity
+ // id: Object?
+ // The identity to use to lookup the object
+ var returnedObject, returnedError;
+ var deferred = new Deferred();
+ this.store.fetchItemByIdentity({
+ identity: id,
+ onItem: this._objectConverter(function(object){
+ deferred.resolve(returnedObject = object);
+ }),
+ onError: function(error){
+ deferred.reject(returnedError = error);
+ }
+ });
+ if(returnedObject){
+ // if it was returned synchronously
+ return returnedObject;
+ }
+ if(returnedError){
+ throw returnedError;
+ }
+ return deferred.promise;
+ },
+ put: function(object, options){
+ // summary:
+ // Stores an object by its identity.
+ // object: Object
+ // The object to store.
+ // options: Object?
+ // Additional metadata for storing the data. Includes a reference to an id
+ // that the object may be stored with (i.e. { id: "foo" }).
+ var id = options && typeof options.id != "undefined" || this.getIdentity(object);
+ var store = this.store;
+ var idProperty = this.idProperty;
+ if(typeof id == "undefined"){
+ store.newItem(object);
+ }else{
+ store.fetchItemByIdentity({
+ identity: id,
+ onItem: function(item){
+ if(item){
+ for(var i in object){
+ if(i != idProperty && // don't copy id properties since they are immutable and should be omitted for implicit ids
+ store.getValue(item, i) != object[i]){
+ store.setValue(item, i, object[i]);
+ }
+ }
+ }else{
+ store.newItem(object);
+ }
+ }
+ });
+ }
+ },
+ remove: function(id){
+ // summary:
+ // Deletes an object by its identity.
+ // id: Object
+ // The identity to use to delete the object
+ var store = this.store;
+ this.store.fetchItemByIdentity({
+ identity: id,
+ onItem: function(item){
+ store.deleteItem(item);
+ }
+ });
+ },
+ query: function(query, options){
+ // summary:
+ // Queries the store for objects.
+ // query: Object
+ // The query to use for retrieving objects from the store
+ // options: Object?
+ // Optional options object as used by the underlying dojo.data Store.
+ // returns: dojo.store.util.QueryResults
+ // A query results object that can be used to iterate over results.
+ var fetchHandle;
+ var deferred = new Deferred(function(){ fetchHandle.abort && fetchHandle.abort(); });
+ deferred.total = new Deferred();
+ var converter = this._objectConverter(function(object){return object;});
+ fetchHandle = this.store.fetch(lang.mixin({
+ query: query,
+ onBegin: function(count){
+ deferred.total.resolve(count);
+ },
+ onComplete: function(results){
+ deferred.resolve(array.map(results, converter));
+ },
+ onError: function(error){
+ deferred.reject(error);
+ }
+ }, options));
+ return QueryResults(deferred);
+ },
+ getIdentity: function(object){
+ // summary:
+ // Fetch the identity for the given object.
+ // object: Object
+ // The data object to get the identity from.
+ // returns: Number
+ // The id of the given object.
+ return object[this.idProperty];
+ }
+});
+});
diff --git a/lib/dojo/store/JsonRest.js b/lib/dojo/store/JsonRest.js
index 5f9254c3e..dc00d973f 100644
--- a/lib/dojo/store/JsonRest.js
+++ b/lib/dojo/store/JsonRest.js
@@ -4,143 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.store.JsonRest"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.store.JsonRest"] = true;
-dojo.provide("dojo.store.JsonRest");
-dojo.require("dojo.store.util.QueryResults");
-
-
-dojo.declare("dojo.store.JsonRest", null, {
- constructor: function(/*dojo.store.JsonRest*/ options){
- // summary:
- // This is a basic store for RESTful communicating with a server through JSON
- // formatted data.
- // options:
- // This provides any configuration information that will be mixed into the store
- dojo.mixin(this, options);
- },
- // target: String
- // The target base URL to use for all requests to the server. This string will be
- // prepended to the id to generate the URL (relative or absolute) for requests
- // sent to the server
- target: "",
- // idProperty: String
- // Indicates the property to use as the identity property. The values of this
- // property should be unique.
- idProperty: "id",
-
- get: function(id, options){
- // summary:
- // Retrieves an object by its identity. This will trigger a GET request to the server using
- // the url `this.target + id`.
- // id: Number
- // The identity to use to lookup the object
- // returns: Object
- // The object in the store that matches the given id.
- var headers = options || {};
- headers.Accept = "application/javascript, application/json";
- return dojo.xhrGet({
- url:this.target + id,
- handleAs: "json",
- headers: headers
- });
- },
- getIdentity: function(object){
- // summary:
- // Returns an object's identity
- // object: Object
- // The object to get the identity from
- // returns: Number
- return object[this.idProperty];
- },
- put: function(object, options){
- // summary:
- // Stores an object. This will trigger a PUT request to the server
- // if the object has an id, otherwise it will trigger a POST request.
- // object: Object
- // The object to store.
- // options: dojo.store.api.Store.PutDirectives?
- // Additional metadata for storing the data. Includes an "id"
- // property if a specific id is to be used.
- // returns: Number
- options = options || {};
- var id = ("id" in options) ? options.id : this.getIdentity(object);
- var hasId = typeof id != "undefined";
- return dojo.xhr(hasId && !options.incremental ? "PUT" : "POST", {
- url: hasId ? this.target + id : this.target,
- postData: dojo.toJson(object),
- handleAs: "json",
- headers:{
- "Content-Type": "application/json",
- "If-Match": options.overwrite === true ? "*" : null,
- "If-None-Match": options.overwrite === false ? "*" : null
- }
- });
- },
- add: function(object, options){
- // summary:
- // Adds an object. This will trigger a PUT request to the server
- // if the object has an id, otherwise it will trigger a POST request.
- // object: Object
- // The object to store.
- // options: dojo.store.api.Store.PutDirectives?
- // Additional metadata for storing the data. Includes an "id"
- // property if a specific id is to be used.
- options = options || {};
- options.overwrite = false;
- return this.put(object, options);
- },
- remove: function(id){
- // summary:
- // Deletes an object by its identity. This will trigger a DELETE request to the server.
- // id: Number
- // The identity to use to delete the object
- return dojo.xhrDelete({
- url:this.target + id
- });
- },
- query: function(query, options){
- // summary:
- // Queries the store for objects. This will trigger a GET request to the server, with the
- // query added as a query string.
- // query: Object
- // The query to use for retrieving objects from the store.
- // options: dojo.store.api.Store.QueryOptions?
- // The optional arguments to apply to the resultset.
- // returns: dojo.store.api.Store.QueryResults
- // The results of the query, extended with iterative methods.
- var headers = {Accept: "application/javascript, application/json"};
- options = options || {};
-
- if(options.start >= 0 || options.count >= 0){
- headers.Range = "items=" + (options.start || '0') + '-' +
- (("count" in options && options.count != Infinity) ?
- (options.count + (options.start || 0) - 1) : '');
- }
- if(dojo.isObject(query)){
- query = dojo.objectToQuery(query);
- query = query ? "?" + query: "";
- }
- if(options && options.sort){
- query += (query ? "&" : "?") + "sort(";
- for(var i = 0; i<options.sort.length; i++){
- var sort = options.sort[i];
- query += (i > 0 ? "," : "") + (sort.descending ? '-' : '+') + encodeURIComponent(sort.attribute);
- }
- query += ")";
- }
- var results = dojo.xhrGet({
- url: this.target + (query || ""),
- handleAs: "json",
- headers: headers
- });
- results.total = results.then(function(){
- var range = results.ioArgs.xhr.getResponseHeader("Content-Range");
- return range && (range=range.match(/\/(.*)/)) && +range[1];
- });
- return dojo.store.util.QueryResults(results);
- }
-});
-
-}
+//>>built
+define("dojo/store/JsonRest",["../_base/xhr","../json","../_base/declare","./util/QueryResults"],function(_1,_2,_3,_4){return _3("dojo.store.JsonRest",null,{constructor:function(_5){_3.safeMixin(this,_5);},target:"",idProperty:"id",get:function(id,_6){var _7=_6||{};_7.Accept=this.accepts;return _1("GET",{url:this.target+id,handleAs:"json",headers:_7});},accepts:"application/javascript, application/json",getIdentity:function(_8){return _8[this.idProperty];},put:function(_9,_a){_a=_a||{};var id=("id" in _a)?_a.id:this.getIdentity(_9);var _b=typeof id!="undefined";return _1(_b&&!_a.incremental?"PUT":"POST",{url:_b?this.target+id:this.target,postData:_2.stringify(_9),handleAs:"json",headers:{"Content-Type":"application/json",Accept:this.accepts,"If-Match":_a.overwrite===true?"*":null,"If-None-Match":_a.overwrite===false?"*":null}});},add:function(_c,_d){_d=_d||{};_d.overwrite=false;return this.put(_c,_d);},remove:function(id){return _1("DELETE",{url:this.target+id});},query:function(_e,_f){var _10={Accept:this.accepts};_f=_f||{};if(_f.start>=0||_f.count>=0){_10.Range="items="+(_f.start||"0")+"-"+(("count" in _f&&_f.count!=Infinity)?(_f.count+(_f.start||0)-1):"");}if(_e&&typeof _e=="object"){_e=_1.objectToQuery(_e);_e=_e?"?"+_e:"";}if(_f&&_f.sort){var _11=this.sortParam;_e+=(_e?"&":"?")+(_11?_11+"=":"sort(");for(var i=0;i<_f.sort.length;i++){var _12=_f.sort[i];_e+=(i>0?",":"")+(_12.descending?"-":"+")+encodeURIComponent(_12.attribute);}if(!_11){_e+=")";}}var _13=_1("GET",{url:this.target+(_e||""),handleAs:"json",headers:_10});_13.total=_13.then(function(){var _14=_13.ioArgs.xhr.getResponseHeader("Content-Range");return _14&&(_14=_14.match(/\/(.*)/))&&+_14[1];});return _4(_13);}});}); \ No newline at end of file
diff --git a/lib/dojo/store/JsonRest.js.uncompressed.js b/lib/dojo/store/JsonRest.js.uncompressed.js
new file mode 100644
index 000000000..a395f907f
--- /dev/null
+++ b/lib/dojo/store/JsonRest.js.uncompressed.js
@@ -0,0 +1,155 @@
+define("dojo/store/JsonRest", ["../_base/xhr", "../json", "../_base/declare", "./util/QueryResults"
+], function(xhr, JSON, declare, QueryResults) {
+ // module:
+ // dojo/store/JsonRest
+ // summary:
+ // The module defines a JSON/REST based object store
+
+return declare("dojo.store.JsonRest", null, {
+ // summary:
+ // This is a basic store for RESTful communicating with a server through JSON
+ // formatted data. It implements dojo.store.api.Store.
+
+ constructor: function(/*dojo.store.JsonRest*/ options){
+ // summary:
+ // This is a basic store for RESTful communicating with a server through JSON
+ // formatted data.
+ // options:
+ // This provides any configuration information that will be mixed into the store
+ declare.safeMixin(this, options);
+ },
+ // target: String
+ // The target base URL to use for all requests to the server. This string will be
+ // prepended to the id to generate the URL (relative or absolute) for requests
+ // sent to the server
+ target: "",
+ // idProperty: String
+ // Indicates the property to use as the identity property. The values of this
+ // property should be unique.
+ idProperty: "id",
+ // sortParam: String
+ // The query parameter to used for holding sort information. If this is omitted, than
+ // the sort information is included in a functional query token to avoid colliding
+ // with the set of name/value pairs.
+
+ get: function(id, options){
+ // summary:
+ // Retrieves an object by its identity. This will trigger a GET request to the server using
+ // the url `this.target + id`.
+ // id: Number
+ // The identity to use to lookup the object
+ // returns: Object
+ // The object in the store that matches the given id.
+ var headers = options || {};
+ headers.Accept = this.accepts;
+ return xhr("GET", {
+ url:this.target + id,
+ handleAs: "json",
+ headers: headers
+ });
+ },
+ // accepts: String
+ // Defines the Accept header to use on HTTP requests
+ accepts: "application/javascript, application/json",
+ getIdentity: function(object){
+ // summary:
+ // Returns an object's identity
+ // object: Object
+ // The object to get the identity from
+ // returns: Number
+ return object[this.idProperty];
+ },
+ put: function(object, options){
+ // summary:
+ // Stores an object. This will trigger a PUT request to the server
+ // if the object has an id, otherwise it will trigger a POST request.
+ // object: Object
+ // The object to store.
+ // options: dojo.store.api.Store.PutDirectives?
+ // Additional metadata for storing the data. Includes an "id"
+ // property if a specific id is to be used.
+ // returns: Number
+ options = options || {};
+ var id = ("id" in options) ? options.id : this.getIdentity(object);
+ var hasId = typeof id != "undefined";
+ return xhr(hasId && !options.incremental ? "PUT" : "POST", {
+ url: hasId ? this.target + id : this.target,
+ postData: JSON.stringify(object),
+ handleAs: "json",
+ headers:{
+ "Content-Type": "application/json",
+ Accept: this.accepts,
+ "If-Match": options.overwrite === true ? "*" : null,
+ "If-None-Match": options.overwrite === false ? "*" : null
+ }
+ });
+ },
+ add: function(object, options){
+ // summary:
+ // Adds an object. This will trigger a PUT request to the server
+ // if the object has an id, otherwise it will trigger a POST request.
+ // object: Object
+ // The object to store.
+ // options: dojo.store.api.Store.PutDirectives?
+ // Additional metadata for storing the data. Includes an "id"
+ // property if a specific id is to be used.
+ options = options || {};
+ options.overwrite = false;
+ return this.put(object, options);
+ },
+ remove: function(id){
+ // summary:
+ // Deletes an object by its identity. This will trigger a DELETE request to the server.
+ // id: Number
+ // The identity to use to delete the object
+ return xhr("DELETE",{
+ url:this.target + id
+ });
+ },
+ query: function(query, options){
+ // summary:
+ // Queries the store for objects. This will trigger a GET request to the server, with the
+ // query added as a query string.
+ // query: Object
+ // The query to use for retrieving objects from the store.
+ // options: dojo.store.api.Store.QueryOptions?
+ // The optional arguments to apply to the resultset.
+ // returns: dojo.store.api.Store.QueryResults
+ // The results of the query, extended with iterative methods.
+ var headers = {Accept: this.accepts};
+ options = options || {};
+
+ if(options.start >= 0 || options.count >= 0){
+ headers.Range = "items=" + (options.start || '0') + '-' +
+ (("count" in options && options.count != Infinity) ?
+ (options.count + (options.start || 0) - 1) : '');
+ }
+ if(query && typeof query == "object"){
+ query = xhr.objectToQuery(query);
+ query = query ? "?" + query: "";
+ }
+ if(options && options.sort){
+ var sortParam = this.sortParam;
+ query += (query ? "&" : "?") + (sortParam ? sortParam + '=' : "sort(");
+ for(var i = 0; i<options.sort.length; i++){
+ var sort = options.sort[i];
+ query += (i > 0 ? "," : "") + (sort.descending ? '-' : '+') + encodeURIComponent(sort.attribute);
+ }
+ if(!sortParam){
+ query += ")";
+ }
+ }
+ var results = xhr("GET", {
+ url: this.target + (query || ""),
+ handleAs: "json",
+ headers: headers
+ });
+ results.total = results.then(function(){
+ var range = results.ioArgs.xhr.getResponseHeader("Content-Range");
+ return range && (range=range.match(/\/(.*)/)) && +range[1];
+ });
+ return QueryResults(results);
+ }
+});
+
+}); \ No newline at end of file
diff --git a/lib/dojo/store/Memory.js b/lib/dojo/store/Memory.js
index b9001cdaf..9d1b17a98 100644
--- a/lib/dojo/store/Memory.js
+++ b/lib/dojo/store/Memory.js
@@ -4,161 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.store.Memory"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.store.Memory"] = true;
-dojo.provide("dojo.store.Memory");
-dojo.require("dojo.store.util.QueryResults");
-dojo.require("dojo.store.util.SimpleQueryEngine");
-
-
-dojo.declare("dojo.store.Memory", null, {
- // summary:
- // This is a basic in-memory object store. It implements dojo.store.api.Store.
- constructor: function(/*dojo.store.Memory*/ options){
- // summary:
- // Creates a memory object store.
- // options:
- // This provides any configuration information that will be mixed into the store.
- // This should generally include the data property to provide the starting set of data.
- this.index = {};
- dojo.mixin(this, options);
- this.setData(this.data || []);
- },
- // data: Array
- // The array of all the objects in the memory store
- data:null,
-
- // idProperty: String
- // Indicates the property to use as the identity property. The values of this
- // property should be unique.
- idProperty: "id",
-
- // index: Object
- // An index of data by id
- index:null,
-
- // queryEngine: Function
- // Defines the query engine to use for querying the data store
- queryEngine: dojo.store.util.SimpleQueryEngine,
- get: function(id){
- // summary:
- // Retrieves an object by its identity
- // id: Number
- // The identity to use to lookup the object
- // returns: Object
- // The object in the store that matches the given id.
- return this.index[id];
- },
- getIdentity: function(object){
- // summary:
- // Returns an object's identity
- // object: Object
- // The object to get the identity from
- // returns: Number
- return object[this.idProperty];
- },
- put: function(object, options){
- // summary:
- // Stores an object
- // object: Object
- // The object to store.
- // options: dojo.store.api.Store.PutDirectives??
- // Additional metadata for storing the data. Includes an "id"
- // property if a specific id is to be used.
- // returns: Number
- var id = options && options.id || object[this.idProperty] || Math.random();
- this.index[id] = object;
- var data = this.data,
- idProperty = this.idProperty;
- for(var i = 0, l = data.length; i < l; i++){
- if(data[i][idProperty] == id){
- data[i] = object;
- return id;
- }
- }
- this.data.push(object);
- return id;
- },
- add: function(object, options){
- // summary:
- // Creates an object, throws an error if the object already exists
- // object: Object
- // The object to store.
- // options: dojo.store.api.Store.PutDirectives??
- // Additional metadata for storing the data. Includes an "id"
- // property if a specific id is to be used.
- // returns: Number
- if(this.index[options && options.id || object[this.idProperty]]){
- throw new Error("Object already exists");
- }
- return this.put(object, options);
- },
- remove: function(id){
- // summary:
- // Deletes an object by its identity
- // id: Number
- // The identity to use to delete the object
- delete this.index[id];
- var data = this.data,
- idProperty = this.idProperty;
- for(var i = 0, l = data.length; i < l; i++){
- if(data[i][idProperty] == id){
- data.splice(i, 1);
- return;
- }
- }
- },
- query: function(query, options){
- // summary:
- // Queries the store for objects.
- // query: Object
- // The query to use for retrieving objects from the store.
- // options: dojo.store.api.Store.QueryOptions?
- // The optional arguments to apply to the resultset.
- // returns: dojo.store.api.Store.QueryResults
- // The results of the query, extended with iterative methods.
- //
- // example:
- // Given the following store:
- //
- // | var store = new dojo.store.Memory({
- // | data: [
- // | {id: 1, name: "one", prime: false },
- // | {id: 2, name: "two", even: true, prime: true},
- // | {id: 3, name: "three", prime: true},
- // | {id: 4, name: "four", even: true, prime: false},
- // | {id: 5, name: "five", prime: true}
- // | ]
- // | });
- //
- // ...find all items where "prime" is true:
- //
- // | var results = store.query({ prime: true });
- //
- // ...or find all items where "even" is true:
- //
- // | var results = store.query({ even: true });
- return dojo.store.util.QueryResults(this.queryEngine(query, options)(this.data));
- },
- setData: function(data){
- // summary:
- // Sets the given data as the source for this store, and indexes it
- // data: Object[]
- // An array of objects to use as the source of data.
- if(data.items){
- // just for convenience with the data format IFRS expects
- this.idProperty = data.identifier;
- data = this.data = data.items;
- }else{
- this.data = data;
- }
-
- for(var i = 0, l = data.length; i < l; i++){
- var object = data[i];
- this.index[object[this.idProperty]] = object;
- }
- }
-});
-
-}
+//>>built
+define("dojo/store/Memory",["../_base/declare","./util/QueryResults","./util/SimpleQueryEngine"],function(_1,_2,_3){return _1("dojo.store.Memory",null,{constructor:function(_4){for(var i in _4){this[i]=_4[i];}this.setData(this.data||[]);},data:null,idProperty:"id",index:null,queryEngine:_3,get:function(id){return this.data[this.index[id]];},getIdentity:function(_5){return _5[this.idProperty];},put:function(_6,_7){var _8=this.data,_9=this.index,_a=this.idProperty;var id=(_7&&"id" in _7)?_7.id:_a in _6?_6[_a]:Math.random();if(id in _9){if(_7&&_7.overwrite===false){throw new Error("Object already exists");}_8[_9[id]]=_6;}else{_9[id]=_8.push(_6)-1;}return id;},add:function(_b,_c){(_c=_c||{}).overwrite=false;return this.put(_b,_c);},remove:function(id){var _d=this.index;var _e=this.data;if(id in _d){_e.splice(_d[id],1);this.setData(_e);return true;}},query:function(_f,_10){return _2(this.queryEngine(_f,_10)(this.data));},setData:function(_11){if(_11.items){this.idProperty=_11.identifier;_11=this.data=_11.items;}else{this.data=_11;}this.index={};for(var i=0,l=_11.length;i<l;i++){this.index[_11[i][this.idProperty]]=i;}}});}); \ No newline at end of file
diff --git a/lib/dojo/store/Memory.js.uncompressed.js b/lib/dojo/store/Memory.js.uncompressed.js
new file mode 100644
index 000000000..ecea859b9
--- /dev/null
+++ b/lib/dojo/store/Memory.js.uncompressed.js
@@ -0,0 +1,161 @@
+define("dojo/store/Memory", ["../_base/declare", "./util/QueryResults", "./util/SimpleQueryEngine"], function(declare, QueryResults, SimpleQueryEngine) {
+ // module:
+ // dojo/store/Memory
+ // summary:
+ // The module defines an in-memory object store.
+
+
+return declare("dojo.store.Memory", null, {
+ // summary:
+ // This is a basic in-memory object store. It implements dojo.store.api.Store.
+ constructor: function(/*dojo.store.Memory*/ options){
+ // summary:
+ // Creates a memory object store.
+ // options:
+ // This provides any configuration information that will be mixed into the store.
+ // This should generally include the data property to provide the starting set of data.
+ for(var i in options){
+ this[i] = options[i];
+ }
+ this.setData(this.data || []);
+ },
+ // data: Array
+ // The array of all the objects in the memory store
+ data:null,
+
+ // idProperty: String
+ // Indicates the property to use as the identity property. The values of this
+ // property should be unique.
+ idProperty: "id",
+
+ // index: Object
+ // An index of data indices into the data array by id
+ index:null,
+
+ // queryEngine: Function
+ // Defines the query engine to use for querying the data store
+ queryEngine: SimpleQueryEngine,
+ get: function(id){
+ // summary:
+ // Retrieves an object by its identity
+ // id: Number
+ // The identity to use to lookup the object
+ // returns: Object
+ // The object in the store that matches the given id.
+ return this.data[this.index[id]];
+ },
+ getIdentity: function(object){
+ // summary:
+ // Returns an object's identity
+ // object: Object
+ // The object to get the identity from
+ // returns: Number
+ return object[this.idProperty];
+ },
+ put: function(object, options){
+ // summary:
+ // Stores an object
+ // object: Object
+ // The object to store.
+ // options: dojo.store.api.Store.PutDirectives??
+ // Additional metadata for storing the data. Includes an "id"
+ // property if a specific id is to be used.
+ // returns: Number
+ var data = this.data,
+ index = this.index,
+ idProperty = this.idProperty;
+ var id = (options && "id" in options) ? options.id : idProperty in object ? object[idProperty] : Math.random();
+ if(id in index){
+ // object exists
+ if(options && options.overwrite === false){
+ throw new Error("Object already exists");
+ }
+ // replace the entry in data
+ data[index[id]] = object;
+ }else{
+ // add the new object
+ index[id] = data.push(object) - 1;
+ }
+ return id;
+ },
+ add: function(object, options){
+ // summary:
+ // Creates an object, throws an error if the object already exists
+ // object: Object
+ // The object to store.
+ // options: dojo.store.api.Store.PutDirectives??
+ // Additional metadata for storing the data. Includes an "id"
+ // property if a specific id is to be used.
+ // returns: Number
+ (options = options || {}).overwrite = false;
+ // call put with overwrite being false
+ return this.put(object, options);
+ },
+ remove: function(id){
+ // summary:
+ // Deletes an object by its identity
+ // id: Number
+ // The identity to use to delete the object
+ // returns: Boolean
+ // Returns true if an object was removed, falsy (undefined) if no object matched the id
+ var index = this.index;
+ var data = this.data;
+ if(id in index){
+ data.splice(index[id], 1);
+ // now we have to reindex
+ this.setData(data);
+ return true;
+ }
+ },
+ query: function(query, options){
+ // summary:
+ // Queries the store for objects.
+ // query: Object
+ // The query to use for retrieving objects from the store.
+ // options: dojo.store.api.Store.QueryOptions?
+ // The optional arguments to apply to the resultset.
+ // returns: dojo.store.api.Store.QueryResults
+ // The results of the query, extended with iterative methods.
+ //
+ // example:
+ // Given the following store:
+ //
+ // | var store = new dojo.store.Memory({
+ // | data: [
+ // | {id: 1, name: "one", prime: false },
+ // | {id: 2, name: "two", even: true, prime: true},
+ // | {id: 3, name: "three", prime: true},
+ // | {id: 4, name: "four", even: true, prime: false},
+ // | {id: 5, name: "five", prime: true}
+ // | ]
+ // | });
+ //
+ // ...find all items where "prime" is true:
+ //
+ // | var results = store.query({ prime: true });
+ //
+ // ...or find all items where "even" is true:
+ //
+ // | var results = store.query({ even: true });
+ return QueryResults(this.queryEngine(query, options)(this.data));
+ },
+ setData: function(data){
+ // summary:
+ // Sets the given data as the source for this store, and indexes it
+ // data: Object[]
+ // An array of objects to use as the source of data.
+ if(data.items){
+ // just for convenience with the data format IFRS expects
+ this.idProperty = data.identifier;
+ data = this.data = data.items;
+ }else{
+ this.data = data;
+ }
+ this.index = {};
+ for(var i = 0, l = data.length; i < l; i++){
+ this.index[data[i][this.idProperty]] = i;
+ }
+ }
+});
+
+});
diff --git a/lib/dojo/store/Observable.js b/lib/dojo/store/Observable.js
index f231e0321..a1d47cc57 100644
--- a/lib/dojo/store/Observable.js
+++ b/lib/dojo/store/Observable.js
@@ -4,170 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.store.Observable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.store.Observable"] = true;
-dojo.provide("dojo.store.Observable");
-
-dojo.getObject("store", true, dojo);
-
-dojo.store.Observable = function(store){
- // summary:
- // The Observable store wrapper takes a store and sets an observe method on query()
- // results that can be used to monitor results for changes.
- //
- // description:
- // Observable wraps an existing store so that notifications can be made when a query
- // is performed.
- //
- // example:
- // Create a Memory store that returns an observable query, and then log some
- // information about that query.
- //
- // | var store = dojo.store.Observable(new dojo.store.Memory({
- // | data: [
- // | {id: 1, name: "one", prime: false},
- // | {id: 2, name: "two", even: true, prime: true},
- // | {id: 3, name: "three", prime: true},
- // | {id: 4, name: "four", even: true, prime: false},
- // | {id: 5, name: "five", prime: true}
- // | ]
- // | }));
- // | var changes = [], results = store.query({ prime: true });
- // | var observer = results.observe(function(object, previousIndex, newIndex){
- // | changes.push({previousIndex:previousIndex, newIndex:newIndex, object:object});
- // | });
- //
- // See the Observable tests for more information.
-
- var queryUpdaters = [], revision = 0;
- // a Comet driven store could directly call notify to notify observers when data has
- // changed on the backend
- store.notify = function(object, existingId){
- revision++;
- var updaters = queryUpdaters.slice();
- for(var i = 0, l = updaters.length; i < l; i++){
- updaters[i](object, existingId);
- }
- };
- var originalQuery = store.query;
- store.query = function(query, options){
- options = options || {};
- var results = originalQuery.apply(this, arguments);
- if(results && results.forEach){
- var nonPagedOptions = dojo.mixin({}, options);
- delete nonPagedOptions.start;
- delete nonPagedOptions.count;
-
- var queryExecutor = store.queryEngine && store.queryEngine(query, nonPagedOptions);
- var queryRevision = revision;
- var listeners = [], queryUpdater;
- results.observe = function(listener, includeObjectUpdates){
- if(listeners.push(listener) == 1){
- // first listener was added, create the query checker and updater
- queryUpdaters.push(queryUpdater = function(changed, existingId){
- dojo.when(results, function(resultsArray){
- var atEnd = resultsArray.length != options.count;
- var i;
- if(++queryRevision != revision){
- throw new Error("Query is out of date, you must observe() the query prior to any data modifications");
- }
- var removedObject, removedFrom = -1, insertedInto = -1;
- if(existingId){
- // remove the old one
- for(i = 0, l = resultsArray.length; i < l; i++){
- var object = resultsArray[i];
- if(store.getIdentity(object) == existingId){
- removedObject = object;
- removedFrom = i;
- if(queryExecutor || !changed){// if it was changed and we don't have a queryExecutor, we shouldn't remove it because updated objects would be eliminated
- resultsArray.splice(i, 1);
- }
- break;
- }
- }
- }
- if(queryExecutor){
- // add the new one
- if(changed &&
- // if a matches function exists, use that (probably more efficient)
- (queryExecutor.matches ? queryExecutor.matches(changed) : queryExecutor([changed]).length)){
-
- if(removedFrom > -1){
- // put back in the original slot so it doesn't move unless it needs to (relying on a stable sort below)
- resultsArray.splice(removedFrom, 0, changed);
- }else{
- resultsArray.push(changed);
- }
- insertedInto = dojo.indexOf(queryExecutor(resultsArray), changed);
- if((options.start && insertedInto == 0) ||
- (!atEnd && insertedInto == resultsArray.length -1)){
- // if it is at the end of the page, assume it goes into the prev or next page
- insertedInto = -1;
- }
- }
- }else if(changed){
- // we don't have a queryEngine, so we can't provide any information
- // about where it was inserted, but we can at least indicate a new object
- insertedInto = removedFrom >= 0 ? removedFrom : (store.defaultIndex || 0);
- }
- if((removedFrom > -1 || insertedInto > -1) &&
- (includeObjectUpdates || !queryExecutor || (removedFrom != insertedInto))){
- var copyListeners = listeners.slice();
- for(i = 0;listener = copyListeners[i]; i++){
- listener(changed || removedObject, removedFrom, insertedInto);
- }
- }
- });
- });
- }
- return {
- cancel: function(){
- // remove this listener
- listeners.splice(dojo.indexOf(listeners, listener), 1);
- if(!listeners.length){
- // no more listeners, remove the query updater too
- queryUpdaters.splice(dojo.indexOf(queryUpdaters, queryUpdater), 1);
- }
- }
- };
- };
- }
- return results;
- };
- var inMethod;
- function whenFinished(method, action){
- var original = store[method];
- if(original){
- store[method] = function(value){
- if(inMethod){
- // if one method calls another (like add() calling put()) we don't want two events
- return original.apply(this, arguments);
- }
- inMethod = true;
- try{
- return dojo.when(original.apply(this, arguments), function(results){
- action((typeof results == "object" && results) || value);
- return results;
- });
- }finally{
- inMethod = false;
- }
- };
- }
- }
- // monitor for updates by listening to these methods
- whenFinished("put", function(object){
- store.notify(object, store.getIdentity(object));
- });
- whenFinished("add", function(object){
- store.notify(object);
- });
- whenFinished("remove", function(id){
- store.notify(undefined, id);
- });
-
- return store;
-};
-
-}
+//>>built
+define("dojo/store/Observable",["../_base/kernel","../_base/lang","../_base/Deferred","../_base/array"],function(_1,_2,_3,_4){var ds=_2.getObject("dojo.store",true);return ds.Observable=function(_5){var _6,_7=[],_8=0;_5.notify=function(_9,_a){_8++;var _b=_7.slice();for(var i=0,l=_b.length;i<l;i++){_b[i](_9,_a);}};var _c=_5.query;_5.query=function(_d,_e){_e=_e||{};var _f=_c.apply(this,arguments);if(_f&&_f.forEach){var _10=_2.mixin({},_e);delete _10.start;delete _10.count;var _11=_5.queryEngine&&_5.queryEngine(_d,_10);var _12=_8;var _13=[],_14;_f.observe=function(_15,_16){if(_13.push(_15)==1){_7.push(_14=function(_17,_18){_3.when(_f,function(_19){var _1a=_19.length!=_e.count;var i,l,_15;if(++_12!=_8){throw new Error("Query is out of date, you must observe() the query prior to any data modifications");}var _1b,_1c=-1,_1d=-1;if(_18!==_6){for(i=0,l=_19.length;i<l;i++){var _1e=_19[i];if(_5.getIdentity(_1e)==_18){_1b=_1e;_1c=i;if(_11||!_17){_19.splice(i,1);}break;}}}if(_11){if(_17&&(_11.matches?_11.matches(_17):_11([_17]).length)){var _1f=_1c>-1?_1c:_19.length;_19.splice(_1f,0,_17);_1d=_4.indexOf(_11(_19),_17);_19.splice(_1f,1);if((_e.start&&_1d==0)||(!_1a&&_1d==_19.length)){_1d=-1;}else{_19.splice(_1d,0,_17);}}}else{if(_17&&!_e.start){_1d=_1c>=0?_1c:(_5.defaultIndex||0);}}if((_1c>-1||_1d>-1)&&(_16||!_11||(_1c!=_1d))){var _20=_13.slice();for(i=0;_15=_20[i];i++){_15(_17||_1b,_1c,_1d);}}});});}return {cancel:function(){var _21=_4.indexOf(_13,_15);if(_21>-1){_13.splice(_21,1);if(!_13.length){_7.splice(_4.indexOf(_7,_14),1);}}}};};}return _f;};var _22;function _23(_24,_25){var _26=_5[_24];if(_26){_5[_24]=function(_27){if(_22){return _26.apply(this,arguments);}_22=true;try{var _28=_26.apply(this,arguments);_3.when(_28,function(_29){_25((typeof _29=="object"&&_29)||_27);});return _28;}finally{_22=false;}};}};_23("put",function(_2a){_5.notify(_2a,_5.getIdentity(_2a));});_23("add",function(_2b){_5.notify(_2b);});_23("remove",function(id){_5.notify(undefined,id);});return _5;};}); \ No newline at end of file
diff --git a/lib/dojo/store/Observable.js.uncompressed.js b/lib/dojo/store/Observable.js.uncompressed.js
new file mode 100644
index 000000000..62e4a8591
--- /dev/null
+++ b/lib/dojo/store/Observable.js.uncompressed.js
@@ -0,0 +1,175 @@
+define("dojo/store/Observable", ["../_base/kernel", "../_base/lang", "../_base/Deferred", "../_base/array"
+], function(kernel, lang, Deferred, array) {
+ // module:
+ // dojo/store/Observable
+ // summary:
+ // TODOC
+
+var ds = lang.getObject("dojo.store", true);
+
+return ds.Observable = function(store){
+ // summary:
+ // The Observable store wrapper takes a store and sets an observe method on query()
+ // results that can be used to monitor results for changes.
+ //
+ // description:
+ // Observable wraps an existing store so that notifications can be made when a query
+ // is performed.
+ //
+ // example:
+ // Create a Memory store that returns an observable query, and then log some
+ // information about that query.
+ //
+ // | var store = dojo.store.Observable(new dojo.store.Memory({
+ // | data: [
+ // | {id: 1, name: "one", prime: false},
+ // | {id: 2, name: "two", even: true, prime: true},
+ // | {id: 3, name: "three", prime: true},
+ // | {id: 4, name: "four", even: true, prime: false},
+ // | {id: 5, name: "five", prime: true}
+ // | ]
+ // | }));
+ // | var changes = [], results = store.query({ prime: true });
+ // | var observer = results.observe(function(object, previousIndex, newIndex){
+ // | changes.push({previousIndex:previousIndex, newIndex:newIndex, object:object});
+ // | });
+ //
+ // See the Observable tests for more information.
+
+ var undef, queryUpdaters = [], revision = 0;
+ // a Comet driven store could directly call notify to notify observers when data has
+ // changed on the backend
+ store.notify = function(object, existingId){
+ revision++;
+ var updaters = queryUpdaters.slice();
+ for(var i = 0, l = updaters.length; i < l; i++){
+ updaters[i](object, existingId);
+ }
+ };
+ var originalQuery = store.query;
+ store.query = function(query, options){
+ options = options || {};
+ var results = originalQuery.apply(this, arguments);
+ if(results && results.forEach){
+ var nonPagedOptions = lang.mixin({}, options);
+ delete nonPagedOptions.start;
+ delete nonPagedOptions.count;
+
+ var queryExecutor = store.queryEngine && store.queryEngine(query, nonPagedOptions);
+ var queryRevision = revision;
+ var listeners = [], queryUpdater;
+ results.observe = function(listener, includeObjectUpdates){
+ if(listeners.push(listener) == 1){
+ // first listener was added, create the query checker and updater
+ queryUpdaters.push(queryUpdater = function(changed, existingId){
+ Deferred.when(results, function(resultsArray){
+ var atEnd = resultsArray.length != options.count;
+ var i, l, listener;
+ if(++queryRevision != revision){
+ throw new Error("Query is out of date, you must observe() the query prior to any data modifications");
+ }
+ var removedObject, removedFrom = -1, insertedInto = -1;
+ if(existingId !== undef){
+ // remove the old one
+ for(i = 0, l = resultsArray.length; i < l; i++){
+ var object = resultsArray[i];
+ if(store.getIdentity(object) == existingId){
+ removedObject = object;
+ removedFrom = i;
+ if(queryExecutor || !changed){// if it was changed and we don't have a queryExecutor, we shouldn't remove it because updated objects would be eliminated
+ resultsArray.splice(i, 1);
+ }
+ break;
+ }
+ }
+ }
+ if(queryExecutor){
+ // add the new one
+ if(changed &&
+ // if a matches function exists, use that (probably more efficient)
+ (queryExecutor.matches ? queryExecutor.matches(changed) : queryExecutor([changed]).length)){
+
+ var firstInsertedInto = removedFrom > -1 ?
+ removedFrom : // put back in the original slot so it doesn't move unless it needs to (relying on a stable sort below)
+ resultsArray.length;
+ resultsArray.splice(firstInsertedInto, 0, changed); // add the new item
+ insertedInto = array.indexOf(queryExecutor(resultsArray), changed); // sort it
+ // we now need to push the chagne back into the original results array
+ resultsArray.splice(firstInsertedInto, 1); // remove the inserted item from the previous index
+
+ if((options.start && insertedInto == 0) ||
+ (!atEnd && insertedInto == resultsArray.length)){
+ // if it is at the end of the page, assume it goes into the prev or next page
+ insertedInto = -1;
+ }else{
+ resultsArray.splice(insertedInto, 0, changed); // and insert into the results array with the correct index
+ }
+ }
+ }else if(changed && !options.start){
+ // we don't have a queryEngine, so we can't provide any information
+ // about where it was inserted, but we can at least indicate a new object
+ insertedInto = removedFrom >= 0 ? removedFrom : (store.defaultIndex || 0);
+ }
+ if((removedFrom > -1 || insertedInto > -1) &&
+ (includeObjectUpdates || !queryExecutor || (removedFrom != insertedInto))){
+ var copyListeners = listeners.slice();
+ for(i = 0;listener = copyListeners[i]; i++){
+ listener(changed || removedObject, removedFrom, insertedInto);
+ }
+ }
+ });
+ });
+ }
+ return {
+ cancel: function(){
+ // remove this listener
+ var index = array.indexOf(listeners, listener);
+ if(index > -1){ // check to make sure we haven't already called cancel
+ listeners.splice(index, 1);
+ if(!listeners.length){
+ // no more listeners, remove the query updater too
+ queryUpdaters.splice(array.indexOf(queryUpdaters, queryUpdater), 1);
+ }
+ }
+ }
+ };
+ };
+ }
+ return results;
+ };
+ var inMethod;
+ function whenFinished(method, action){
+ var original = store[method];
+ if(original){
+ store[method] = function(value){
+ if(inMethod){
+ // if one method calls another (like add() calling put()) we don't want two events
+ return original.apply(this, arguments);
+ }
+ inMethod = true;
+ try{
+ var results = original.apply(this, arguments);
+ Deferred.when(results, function(results){
+ action((typeof results == "object" && results) || value);
+ });
+ return results;
+ }finally{
+ inMethod = false;
+ }
+ };
+ }
+ }
+ // monitor for updates by listening to these methods
+ whenFinished("put", function(object){
+ store.notify(object, store.getIdentity(object));
+ });
+ whenFinished("add", function(object){
+ store.notify(object);
+ });
+ whenFinished("remove", function(id){
+ store.notify(undefined, id);
+ });
+
+ return store;
+};
+});
diff --git a/lib/dojo/store/api/Store.js b/lib/dojo/store/api/Store.js
index ca26226d3..d4f4b0b90 100644
--- a/lib/dojo/store/api/Store.js
+++ b/lib/dojo/store/api/Store.js
@@ -4,301 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-define([], function() {
- // module:
- // dojo/store/api/Store
- // summary:
- // The module defines the Dojo object store interface.
-
-dojo.declare("dojo.store.api.Store", null, {
- // summary:
- // This is an abstract API that data provider implementations conform to.
- // This file defines methods signatures and intentionally leaves all the
- // methods unimplemented. For more information on the dojo.store APIs,
- // please visit: http://dojotoolkit.org/reference-guide/dojo/store.html
- // Every method and property is optional, and is only needed if the functionality
- // it provides is required.
- // Every method may return a promise for the specified return value if the
- // execution of the operation is asynchronous (except
- // for query() which already defines an async return value).
-
- // idProperty: String
- // If the store has a single primary key, this tndicates the property to use as the
- // identity property. The values of this property should be unique.
- idProperty: "id",
-
- // queryEngine: Function
- // If the store can be queried locally (on the client side in JS), this defines
- // the query engine to use for querying the data store.
- // This takes a query and query options and returns a function that can execute
- // the provided query on a JavaScript array. The queryEngine may be replace to
- // provide more sophisticated querying capabilities. For example:
- // | var query = store.queryEngine({foo:"bar"}, {count:10});
- // | query(someArray) -> filtered array
- // The returned query function may have a "matches" property that can be
- // used to determine if an object matches the query. For example:
- // | query.matches({id:"some-object", foo:"bar"}) -> true
- // | query.matches({id:"some-object", foo:"something else"}) -> false
- queryEngine: null,
-
- get: function(id){
- // summary:
- // Retrieves an object by its identity
- // id: Number
- // The identity to use to lookup the object
- // returns: Object
- // The object in the store that matches the given id.
- },
- getIdentity: function(object){
- // summary:
- // Returns an object's identity
- // object: Object
- // The object to get the identity from
- // returns: String|Number
- },
- put: function(object, directives){
- // summary:
- // Stores an object
- // object: Object
- // The object to store.
- // directives: dojo.store.api.Store.PutDirectives?
- // Additional directives for storing objects.
- // returns: Number|String
- },
- add: function(object, directives){
- // summary:
- // Creates an object, throws an error if the object already exists
- // object: Object
- // The object to store.
- // directives: dojo.store.api.Store.PutDirectives?
- // Additional directives for creating objects.
- // returns: Number|String
- },
- remove: function(id){
- // summary:
- // Deletes an object by its identity
- // id: Number
- // The identity to use to delete the object
- delete this.index[id];
- var data = this.data,
- idProperty = this.idProperty;
- for(var i = 0, l = data.length; i < l; i++){
- if(data[i][idProperty] == id){
- data.splice(i, 1);
- return;
- }
- }
- },
- query: function(query, options){
- // summary:
- // Queries the store for objects. This does not alter the store, but returns a
- // set of data from the store.
- // query: String|Object|Function
- // The query to use for retrieving objects from the store.
- // options: dojo.store.api.Store.QueryOptions
- // The optional arguments to apply to the resultset.
- // returns: dojo.store.api.Store.QueryResults
- // The results of the query, extended with iterative methods.
- //
- // example:
- // Given the following store:
- //
- // ...find all items where "prime" is true:
- //
- // | store.query({ prime: true }).forEach(function(object){
- // | // handle each object
- // | });
- },
- transaction: function(){
- // summary:
- // Starts a new transaction.
- // Note that a store user might not call transaction() prior to using put,
- // delete, etc. in which case these operations effectively could be thought of
- // as "auto-commit" style actions.
- // returns: dojo.store.api.Store.Transaction
- // This represents the new current transaction.
- },
- getChildren: function(parent, options){
- // summary:
- // Retrieves the children of an object.
- // parent: Object
- // The object to find the children of.
- // options: dojo.store.api.Store.QueryOptions?
- // Additional options to apply to the retrieval of the children.
- // returns: dojo.store.api.Store.QueryResults
- // A result set of the children of the parent object.
- },
- getMetadata: function(object){
- // summary:
- // Returns any metadata about the object. This may include attribution,
- // cache directives, history, or version information.
- // object: Object
- // The object to return metadata for.
- // returns: Object
- // An object containing metadata.
- }
-});
-
-dojo.store.api.Store.PutDirectives = function(id, before, parent, overwrite){
- // summary:
- // Directives passed to put() and add() handlers for guiding the update and
- // creation of stored objects.
- // id: String|Number?
- // Indicates the identity of the object if a new object is created
- // before: Object?
- // If the collection of objects in the store has a natural ordering,
- // this indicates that the created or updated object should be placed before the
- // object specified by the value of this property. A value of null indicates that the
- // object should be last.
- // parent: Object?,
- // If the store is hierarchical (with single parenting) this property indicates the
- // new parent of the created or updated object.
- // overwrite: Boolean?
- // If this is provided as a boolean it indicates that the object should or should not
- // overwrite an existing object. A value of true indicates that a new object
- // should not be created, the operation should update an existing object. A
- // value of false indicates that an existing object should not be updated, a new
- // object should be created (which is the same as an add() operation). When
- // this property is not provided, either an update or creation is acceptable.
- this.id = id;
- this.before = before;
- this.parent = parent;
- this.overwrite = overwrite;
-};
-
-dojo.store.api.Store.SortInformation = function(attribute, descending){
- // summary:
- // An object describing what attribute to sort on, and the direction of the sort.
- // attribute: String
- // The name of the attribute to sort on.
- // descending: Boolean
- // The direction of the sort. Default is false.
- this.attribute = attribute;
- this.descending = descending;
-};
-
-dojo.store.api.Store.QueryOptions = function(sort, start, count){
- // summary:
- // Optional object with additional parameters for query results.
- // sort: dojo.store.api.Store.SortInformation[]?
- // A list of attributes to sort on, as well as direction
- // For example:
- // | [{attribute:"price, descending: true}].
- // If the sort parameter is omitted, then the natural order of the store may be
- // applied if there is a natural order.
- // start: Number?
- // The first result to begin iteration on
- // count: Number?
- // The number of how many results should be returned.
- this.sort = sort;
- this.start = start;
- this.count = count;
-};
-
-dojo.declare("dojo.store.api.Store.QueryResults", null, {
- // summary:
- // This is an object returned from query() calls that provides access to the results
- // of a query. Queries may be executed asynchronously.
-
- forEach: function(callback, thisObject){
- // summary:
- // Iterates over the query results, based on
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach.
- // Note that this may executed asynchronously. The callback may be called
- // after this function returns.
- // callback:
- // Function that is called for each object in the query results
- // thisObject:
- // The object to use as |this| in the callback.
-
- },
- filter: function(callback, thisObject){
- // summary:
- // Filters the query results, based on
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter.
- // Note that this may executed asynchronously. The callback may be called
- // after this function returns.
- // callback:
- // Function that is called for each object in the query results
- // thisObject:
- // The object to use as |this| in the callback.
- // returns: dojo.store.api.Store.QueryResults
- },
- map: function(callback, thisObject){
- // summary:
- // Maps the query results, based on
- // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map.
- // Note that this may executed asynchronously. The callback may be called
- // after this function returns.
- // callback:
- // Function that is called for each object in the query results
- // thisObject:
- // The object to use as |this| in the callback.
- // returns: dojo.store.api.Store.QueryResults
- },
- then: function(callback, errorHandler){
- // summary:
- // This registers a callback for when the query is complete, if the query is asynchronous.
- // This is an optional method, and may not be present for synchronous queries.
- // callback:
- // This is called when the query is completed successfully, and is passed a single argument
- // that is an array representing the query results.
- // errorHandler:
- // This is called if the query failed, and is passed a single argument that is the error
- // for the failure.
- },
- observe: function(listener, includeAllUpdates){
- // summary:
- // This registers a callback for notification of when data is modified in the query results.
- // This is an optional method, and is usually provided by dojo.store.Observable.
- // listener: Function
- // The listener function is called when objects in the query results are modified
- // to affect the query result. The listener function is called with the following
- // arguments:
- // | listener(object, removedFrom, insertedInto);
- // * The object parameter indicates the object that was create, modified, or deleted.
- // * The removedFrom parameter indicates the index in the result array where
- // the object used to be. If the value is -1, then the object is an addition to
- // this result set (due to a new object being created, or changed such that it
- // is a part of the result set).
- // * The insertedInto parameter indicates the index in the result array where
- // the object should be now. If the value is -1, then the object is a removal
- // from this result set (due to an object being deleted, or changed such that it
- // is not a part of the result set).
- // includeAllUpdates:
- // This indicates whether or not to include object updates that do not affect
- // the inclusion or order of the object in the query results. By default this is false,
- // which means that if any object is updated in such a way that it remains
- // in the result set and it's position in result sets is not affected, then the listener
- // will not be fired.
-
- },
- // total: Number|Promise?
- // This property should be included in if the query options included the "count"
- // property limiting the result set. This property indicates the total number of objects
- // matching the query (as if "start" and "count" weren't present). This may be
- // a promise if the query is asynchronous.
- total: 0
-});
-
-dojo.declare("dojo.store.api.Store.Transaction", null, {
- // summary:
- // This is an object returned from transaction() calls that represents the current
- // transaction.
-
- commit: function(){
- // summary:
- // Commits the transaction. This may throw an error if it fails. Of if the operation
- // is asynchronous, it may return a promise that represents the eventual success
- // or failure of the commit.
- },
- abort: function(callback, thisObject){
- // summary:
- // Aborts the transaction. This may throw an error if it fails. Of if the operation
- // is asynchronous, it may return a promise that represents the eventual success
- // or failure of the abort.
- }
-});
-
-});
+//>>built
+define("dojo/store/api/Store",["dojo/_base/declare"],function(_1){var _2=_1("dojo.store.api.Store",null,{idProperty:"id",queryEngine:null,get:function(id){},getIdentity:function(_3){},put:function(_4,_5){},add:function(_6,_7){},remove:function(id){delete this.index[id];var _8=this.data,_9=this.idProperty;for(var i=0,l=_8.length;i<l;i++){if(_8[i][_9]==id){_8.splice(i,1);return;}}},query:function(_a,_b){},transaction:function(){},getChildren:function(_c,_d){},getMetadata:function(_e){}});_2.PutDirectives=function(id,_f,_10,_11){this.id=id;this.before=_f;this.parent=_10;this.overwrite=_11;};_2.SortInformation=function(_12,_13){this.attribute=_12;this.descending=_13;};_2.QueryOptions=function(_14,_15,_16){this.sort=_14;this.start=_15;this.count=_16;};_1("dojo.store.api.Store.QueryResults",null,{forEach:function(_17,_18){},filter:function(_19,_1a){},map:function(_1b,_1c){},then:function(_1d,_1e){},observe:function(_1f,_20){},total:0});_1("dojo.store.api.Store.Transaction",null,{commit:function(){},abort:function(_21,_22){}});return _2;}); \ No newline at end of file
diff --git a/lib/dojo/store/api/Store.js.uncompressed.js b/lib/dojo/store/api/Store.js.uncompressed.js
new file mode 100644
index 000000000..55078d771
--- /dev/null
+++ b/lib/dojo/store/api/Store.js.uncompressed.js
@@ -0,0 +1,297 @@
+define("dojo/store/api/Store", ["dojo/_base/declare"], function(declare) {
+ // module:
+ // dojo/store/api/Store
+ // summary:
+ // The module defines the Dojo object store interface.
+
+var Store = declare("dojo.store.api.Store", null, {
+ // summary:
+ // This is an abstract API that data provider implementations conform to.
+ // This file defines methods signatures and intentionally leaves all the
+ // methods unimplemented. For more information on the dojo.store APIs,
+ // please visit: http://dojotoolkit.org/reference-guide/dojo/store.html
+ // Every method and property is optional, and is only needed if the functionality
+ // it provides is required.
+ // Every method may return a promise for the specified return value if the
+ // execution of the operation is asynchronous (except
+ // for query() which already defines an async return value).
+
+ // idProperty: String
+ // If the store has a single primary key, this tndicates the property to use as the
+ // identity property. The values of this property should be unique.
+ idProperty: "id",
+
+ // queryEngine: Function
+ // If the store can be queried locally (on the client side in JS), this defines
+ // the query engine to use for querying the data store.
+ // This takes a query and query options and returns a function that can execute
+ // the provided query on a JavaScript array. The queryEngine may be replace to
+ // provide more sophisticated querying capabilities. For example:
+ // | var query = store.queryEngine({foo:"bar"}, {count:10});
+ // | query(someArray) -> filtered array
+ // The returned query function may have a "matches" property that can be
+ // used to determine if an object matches the query. For example:
+ // | query.matches({id:"some-object", foo:"bar"}) -> true
+ // | query.matches({id:"some-object", foo:"something else"}) -> false
+ queryEngine: null,
+
+ get: function(id){
+ // summary:
+ // Retrieves an object by its identity
+ // id: Number
+ // The identity to use to lookup the object
+ // returns: Object
+ // The object in the store that matches the given id.
+ },
+ getIdentity: function(object){
+ // summary:
+ // Returns an object's identity
+ // object: Object
+ // The object to get the identity from
+ // returns: String|Number
+ },
+ put: function(object, directives){
+ // summary:
+ // Stores an object
+ // object: Object
+ // The object to store.
+ // directives: dojo.store.api.Store.PutDirectives?
+ // Additional directives for storing objects.
+ // returns: Number|String
+ },
+ add: function(object, directives){
+ // summary:
+ // Creates an object, throws an error if the object already exists
+ // object: Object
+ // The object to store.
+ // directives: dojo.store.api.Store.PutDirectives?
+ // Additional directives for creating objects.
+ // returns: Number|String
+ },
+ remove: function(id){
+ // summary:
+ // Deletes an object by its identity
+ // id: Number
+ // The identity to use to delete the object
+ delete this.index[id];
+ var data = this.data,
+ idProperty = this.idProperty;
+ for(var i = 0, l = data.length; i < l; i++){
+ if(data[i][idProperty] == id){
+ data.splice(i, 1);
+ return;
+ }
+ }
+ },
+ query: function(query, options){
+ // summary:
+ // Queries the store for objects. This does not alter the store, but returns a
+ // set of data from the store.
+ // query: String|Object|Function
+ // The query to use for retrieving objects from the store.
+ // options: dojo.store.api.Store.QueryOptions
+ // The optional arguments to apply to the resultset.
+ // returns: dojo.store.api.Store.QueryResults
+ // The results of the query, extended with iterative methods.
+ //
+ // example:
+ // Given the following store:
+ //
+ // ...find all items where "prime" is true:
+ //
+ // | store.query({ prime: true }).forEach(function(object){
+ // | // handle each object
+ // | });
+ },
+ transaction: function(){
+ // summary:
+ // Starts a new transaction.
+ // Note that a store user might not call transaction() prior to using put,
+ // delete, etc. in which case these operations effectively could be thought of
+ // as "auto-commit" style actions.
+ // returns: dojo.store.api.Store.Transaction
+ // This represents the new current transaction.
+ },
+ getChildren: function(parent, options){
+ // summary:
+ // Retrieves the children of an object.
+ // parent: Object
+ // The object to find the children of.
+ // options: dojo.store.api.Store.QueryOptions?
+ // Additional options to apply to the retrieval of the children.
+ // returns: dojo.store.api.Store.QueryResults
+ // A result set of the children of the parent object.
+ },
+ getMetadata: function(object){
+ // summary:
+ // Returns any metadata about the object. This may include attribution,
+ // cache directives, history, or version information.
+ // object: Object
+ // The object to return metadata for.
+ // returns: Object
+ // An object containing metadata.
+ }
+});
+
+Store.PutDirectives = function(id, before, parent, overwrite){
+ // summary:
+ // Directives passed to put() and add() handlers for guiding the update and
+ // creation of stored objects.
+ // id: String|Number?
+ // Indicates the identity of the object if a new object is created
+ // before: Object?
+ // If the collection of objects in the store has a natural ordering,
+ // this indicates that the created or updated object should be placed before the
+ // object specified by the value of this property. A value of null indicates that the
+ // object should be last.
+ // parent: Object?,
+ // If the store is hierarchical (with single parenting) this property indicates the
+ // new parent of the created or updated object.
+ // overwrite: Boolean?
+ // If this is provided as a boolean it indicates that the object should or should not
+ // overwrite an existing object. A value of true indicates that a new object
+ // should not be created, the operation should update an existing object. A
+ // value of false indicates that an existing object should not be updated, a new
+ // object should be created (which is the same as an add() operation). When
+ // this property is not provided, either an update or creation is acceptable.
+ this.id = id;
+ this.before = before;
+ this.parent = parent;
+ this.overwrite = overwrite;
+};
+
+Store.SortInformation = function(attribute, descending){
+ // summary:
+ // An object describing what attribute to sort on, and the direction of the sort.
+ // attribute: String
+ // The name of the attribute to sort on.
+ // descending: Boolean
+ // The direction of the sort. Default is false.
+ this.attribute = attribute;
+ this.descending = descending;
+};
+
+Store.QueryOptions = function(sort, start, count){
+ // summary:
+ // Optional object with additional parameters for query results.
+ // sort: dojo.store.api.Store.SortInformation[]?
+ // A list of attributes to sort on, as well as direction
+ // For example:
+ // | [{attribute:"price, descending: true}].
+ // If the sort parameter is omitted, then the natural order of the store may be
+ // applied if there is a natural order.
+ // start: Number?
+ // The first result to begin iteration on
+ // count: Number?
+ // The number of how many results should be returned.
+ this.sort = sort;
+ this.start = start;
+ this.count = count;
+};
+
+declare("dojo.store.api.Store.QueryResults", null, {
+ // summary:
+ // This is an object returned from query() calls that provides access to the results
+ // of a query. Queries may be executed asynchronously.
+
+ forEach: function(callback, thisObject){
+ // summary:
+ // Iterates over the query results, based on
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach.
+ // Note that this may executed asynchronously. The callback may be called
+ // after this function returns.
+ // callback:
+ // Function that is called for each object in the query results
+ // thisObject:
+ // The object to use as |this| in the callback.
+
+ },
+ filter: function(callback, thisObject){
+ // summary:
+ // Filters the query results, based on
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter.
+ // Note that this may executed asynchronously. The callback may be called
+ // after this function returns.
+ // callback:
+ // Function that is called for each object in the query results
+ // thisObject:
+ // The object to use as |this| in the callback.
+ // returns: dojo.store.api.Store.QueryResults
+ },
+ map: function(callback, thisObject){
+ // summary:
+ // Maps the query results, based on
+ // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map.
+ // Note that this may executed asynchronously. The callback may be called
+ // after this function returns.
+ // callback:
+ // Function that is called for each object in the query results
+ // thisObject:
+ // The object to use as |this| in the callback.
+ // returns: dojo.store.api.Store.QueryResults
+ },
+ then: function(callback, errorHandler){
+ // summary:
+ // This registers a callback for when the query is complete, if the query is asynchronous.
+ // This is an optional method, and may not be present for synchronous queries.
+ // callback:
+ // This is called when the query is completed successfully, and is passed a single argument
+ // that is an array representing the query results.
+ // errorHandler:
+ // This is called if the query failed, and is passed a single argument that is the error
+ // for the failure.
+ },
+ observe: function(listener, includeAllUpdates){
+ // summary:
+ // This registers a callback for notification of when data is modified in the query results.
+ // This is an optional method, and is usually provided by dojo.store.Observable.
+ // listener: Function
+ // The listener function is called when objects in the query results are modified
+ // to affect the query result. The listener function is called with the following
+ // arguments:
+ // | listener(object, removedFrom, insertedInto);
+ // * The object parameter indicates the object that was create, modified, or deleted.
+ // * The removedFrom parameter indicates the index in the result array where
+ // the object used to be. If the value is -1, then the object is an addition to
+ // this result set (due to a new object being created, or changed such that it
+ // is a part of the result set).
+ // * The insertedInto parameter indicates the index in the result array where
+ // the object should be now. If the value is -1, then the object is a removal
+ // from this result set (due to an object being deleted, or changed such that it
+ // is not a part of the result set).
+ // includeAllUpdates:
+ // This indicates whether or not to include object updates that do not affect
+ // the inclusion or order of the object in the query results. By default this is false,
+ // which means that if any object is updated in such a way that it remains
+ // in the result set and it's position in result sets is not affected, then the listener
+ // will not be fired.
+
+ },
+ // total: Number|Promise?
+ // This property should be included in if the query options included the "count"
+ // property limiting the result set. This property indicates the total number of objects
+ // matching the query (as if "start" and "count" weren't present). This may be
+ // a promise if the query is asynchronous.
+ total: 0
+});
+
+declare("dojo.store.api.Store.Transaction", null, {
+ // summary:
+ // This is an object returned from transaction() calls that represents the current
+ // transaction.
+
+ commit: function(){
+ // summary:
+ // Commits the transaction. This may throw an error if it fails. Of if the operation
+ // is asynchronous, it may return a promise that represents the eventual success
+ // or failure of the commit.
+ },
+ abort: function(callback, thisObject){
+ // summary:
+ // Aborts the transaction. This may throw an error if it fails. Of if the operation
+ // is asynchronous, it may return a promise that represents the eventual success
+ // or failure of the abort.
+ }
+});
+return Store;
+});
diff --git a/lib/dojo/store/util/QueryResults.js b/lib/dojo/store/util/QueryResults.js
index a237d1dce..fc164ec6b 100644
--- a/lib/dojo/store/util/QueryResults.js
+++ b/lib/dojo/store/util/QueryResults.js
@@ -4,64 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.store.util.QueryResults"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.store.util.QueryResults"] = true;
-dojo.provide("dojo.store.util.QueryResults");
-
-dojo.getObject("store.util", true, dojo);
-
-dojo.store.util.QueryResults = function(results){
- // summary:
- // A function that wraps the results of a store query with additional
- // methods.
- //
- // description:
- // QueryResults is a basic wrapper that allows for array-like iteration
- // over any kind of returned data from a query. While the simplest store
- // will return a plain array of data, other stores may return deferreds or
- // promises; this wrapper makes sure that *all* results can be treated
- // the same.
- //
- // Additional methods include `forEach`, `filter` and `map`.
- //
- // returns: Object
- // An array-like object that can be used for iterating over.
- //
- // example:
- // Query a store and iterate over the results.
- //
- // | store.query({ prime: true }).forEach(function(item){
- // | // do something
- // | });
-
- if(!results){
- return results;
- }
- // if it is a promise it may be frozen
- if(results.then){
- results = dojo.delegate(results);
- }
- function addIterativeMethod(method){
- if(!results[method]){
- results[method] = function(){
- var args = arguments;
- return dojo.when(results, function(results){
- Array.prototype.unshift.call(args, results);
- return dojo.store.util.QueryResults(dojo[method].apply(dojo, args));
- });
- };
- }
- }
- addIterativeMethod("forEach");
- addIterativeMethod("filter");
- addIterativeMethod("map");
- if(!results.total){
- results.total = dojo.when(results, function(results){
- return results.length;
- });
- }
- return results;
-};
-
-}
+//>>built
+define("dojo/store/util/QueryResults",["../../_base/array","../../_base/lang","../../_base/Deferred"],function(_1,_2,_3){var _4=_2.getObject("dojo.store.util",true);_4.QueryResults=function(_5){if(!_5){return _5;}if(_5.then){_5=_2.delegate(_5);}function _6(_7){if(!_5[_7]){_5[_7]=function(){var _8=arguments;return _3.when(_5,function(_9){Array.prototype.unshift.call(_8,_9);return _4.QueryResults(_1[_7].apply(_1,_8));});};}};_6("forEach");_6("filter");_6("map");if(!_5.total){_5.total=_3.when(_5,function(_a){return _a.length;});}return _5;};return _4.QueryResults;}); \ No newline at end of file
diff --git a/lib/dojo/store/util/QueryResults.js.uncompressed.js b/lib/dojo/store/util/QueryResults.js.uncompressed.js
new file mode 100644
index 000000000..cd9e1969a
--- /dev/null
+++ b/lib/dojo/store/util/QueryResults.js.uncompressed.js
@@ -0,0 +1,64 @@
+define("dojo/store/util/QueryResults", ["../../_base/array", "../../_base/lang", "../../_base/Deferred"
+], function(array, lang, Deferred) {
+ // module:
+ // dojo/store/util/QueryResults
+ // summary:
+ // The module defines a query results wrapper
+
+var util = lang.getObject("dojo.store.util", true);
+
+util.QueryResults = function(results){
+ // summary:
+ // A function that wraps the results of a store query with additional
+ // methods.
+ //
+ // description:
+ // QueryResults is a basic wrapper that allows for array-like iteration
+ // over any kind of returned data from a query. While the simplest store
+ // will return a plain array of data, other stores may return deferreds or
+ // promises; this wrapper makes sure that *all* results can be treated
+ // the same.
+ //
+ // Additional methods include `forEach`, `filter` and `map`.
+ //
+ // returns: Object
+ // An array-like object that can be used for iterating over.
+ //
+ // example:
+ // Query a store and iterate over the results.
+ //
+ // | store.query({ prime: true }).forEach(function(item){
+ // | // do something
+ // | });
+
+ if(!results){
+ return results;
+ }
+ // if it is a promise it may be frozen
+ if(results.then){
+ results = lang.delegate(results);
+ }
+ function addIterativeMethod(method){
+ if(!results[method]){
+ results[method] = function(){
+ var args = arguments;
+ return Deferred.when(results, function(results){
+ Array.prototype.unshift.call(args, results);
+ return util.QueryResults(array[method].apply(array, args));
+ });
+ };
+ }
+ }
+ addIterativeMethod("forEach");
+ addIterativeMethod("filter");
+ addIterativeMethod("map");
+ if(!results.total){
+ results.total = Deferred.when(results, function(results){
+ return results.length;
+ });
+ }
+ return results;
+};
+
+return util.QueryResults;
+});
diff --git a/lib/dojo/store/util/SimpleQueryEngine.js b/lib/dojo/store/util/SimpleQueryEngine.js
index 4b29f20cb..aa398f6e7 100644
--- a/lib/dojo/store/util/SimpleQueryEngine.js
+++ b/lib/dojo/store/util/SimpleQueryEngine.js
@@ -4,113 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.store.util.SimpleQueryEngine"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.store.util.SimpleQueryEngine"] = true;
-dojo.provide("dojo.store.util.SimpleQueryEngine");
-
-dojo.getObject("store.util", true, dojo);
-
-dojo.store.util.SimpleQueryEngine = function(query, options){
- // summary:
- // Simple query engine that matches using filter functions, named filter
- // functions or objects by name-value on a query object hash
- //
- // description:
- // The SimpleQueryEngine provides a way of getting a QueryResults through
- // the use of a simple object hash as a filter. The hash will be used to
- // match properties on data objects with the corresponding value given. In
- // other words, only exact matches will be returned.
- //
- // This function can be used as a template for more complex query engines;
- // for example, an engine can be created that accepts an object hash that
- // contains filtering functions, or a string that gets evaluated, etc.
- //
- // When creating a new dojo.store, simply set the store's queryEngine
- // field as a reference to this function.
- //
- // query: Object
- // An object hash with fields that may match fields of items in the store.
- // Values in the hash will be compared by normal == operator, but regular expressions
- // or any object that provides a test() method are also supported and can be
- // used to match strings by more complex expressions
- // (and then the regex's or object's test() method will be used to match values).
- //
- // options: dojo.store.util.SimpleQueryEngine.__queryOptions?
- // An object that contains optional information such as sort, start, and count.
- //
- // returns: Function
- // A function that caches the passed query under the field "matches". See any
- // of the "query" methods on dojo.stores.
- //
- // example:
- // Define a store with a reference to this engine, and set up a query method.
- //
- // | var myStore = function(options){
- // | // ...more properties here
- // | this.queryEngine = dojo.store.util.SimpleQueryEngine;
- // | // define our query method
- // | this.query = function(query, options){
- // | return dojo.store.util.QueryResults(this.queryEngine(query, options)(this.data));
- // | };
- // | };
-
- // create our matching query function
- switch(typeof query){
- default:
- throw new Error("Can not query with a " + typeof query);
- case "object": case "undefined":
- var queryObject = query;
- query = function(object){
- for(var key in queryObject){
- var required = queryObject[key];
- if(required && required.test){
- if(!required.test(object[key])){
- return false;
- }
- }else if(required != object[key]){
- return false;
- }
- }
- return true;
- };
- break;
- case "string":
- // named query
- if(!this[query]){
- throw new Error("No filter function " + query + " was found in store");
- }
- query = this[query];
- // fall through
- case "function":
- // fall through
- }
- function execute(array){
- // execute the whole query, first we filter
- var results = dojo.filter(array, query);
- // next we sort
- if(options && options.sort){
- results.sort(function(a, b){
- for(var sort, i=0; sort = options.sort[i]; i++){
- var aValue = a[sort.attribute];
- var bValue = b[sort.attribute];
- if (aValue != bValue) {
- return !!sort.descending == aValue > bValue ? -1 : 1;
- }
- }
- return 0;
- });
- }
- // now we paginate
- if(options && (options.start || options.count)){
- var total = results.length;
- results = results.slice(options.start || 0, (options.start || 0) + (options.count || Infinity));
- results.total = total;
- }
- return results;
- }
- execute.matches = query;
- return execute;
-};
-
-}
+//>>built
+define("dojo/store/util/SimpleQueryEngine",["../../_base/array"],function(_1){return function(_2,_3){switch(typeof _2){default:throw new Error("Can not query with a "+typeof _2);case "object":case "undefined":var _4=_2;_2=function(_5){for(var _6 in _4){var _7=_4[_6];if(_7&&_7.test){if(!_7.test(_5[_6])){return false;}}else{if(_7!=_5[_6]){return false;}}}return true;};break;case "string":if(!this[_2]){throw new Error("No filter function "+_2+" was found in store");}_2=this[_2];case "function":}function _8(_9){var _a=_1.filter(_9,_2);if(_3&&_3.sort){_a.sort(function(a,b){for(var _b,i=0;_b=_3.sort[i];i++){var _c=a[_b.attribute];var _d=b[_b.attribute];if(_c!=_d){return !!_b.descending==_c>_d?-1:1;}}return 0;});}if(_3&&(_3.start||_3.count)){var _e=_a.length;_a=_a.slice(_3.start||0,(_3.start||0)+(_3.count||Infinity));_a.total=_e;}return _a;};_8.matches=_2;return _8;};}); \ No newline at end of file
diff --git a/lib/dojo/store/util/SimpleQueryEngine.js.uncompressed.js b/lib/dojo/store/util/SimpleQueryEngine.js.uncompressed.js
new file mode 100644
index 000000000..4f241e6f1
--- /dev/null
+++ b/lib/dojo/store/util/SimpleQueryEngine.js.uncompressed.js
@@ -0,0 +1,108 @@
+define("dojo/store/util/SimpleQueryEngine", ["../../_base/array"], function(arrayUtil) {
+ // module:
+ // dojo/store/util/SimpleQueryEngine
+ // summary:
+ // The module defines a simple filtering query engine for object stores.
+
+return function(query, options){
+ // summary:
+ // Simple query engine that matches using filter functions, named filter
+ // functions or objects by name-value on a query object hash
+ //
+ // description:
+ // The SimpleQueryEngine provides a way of getting a QueryResults through
+ // the use of a simple object hash as a filter. The hash will be used to
+ // match properties on data objects with the corresponding value given. In
+ // other words, only exact matches will be returned.
+ //
+ // This function can be used as a template for more complex query engines;
+ // for example, an engine can be created that accepts an object hash that
+ // contains filtering functions, or a string that gets evaluated, etc.
+ //
+ // When creating a new dojo.store, simply set the store's queryEngine
+ // field as a reference to this function.
+ //
+ // query: Object
+ // An object hash with fields that may match fields of items in the store.
+ // Values in the hash will be compared by normal == operator, but regular expressions
+ // or any object that provides a test() method are also supported and can be
+ // used to match strings by more complex expressions
+ // (and then the regex's or object's test() method will be used to match values).
+ //
+ // options: dojo.store.util.SimpleQueryEngine.__queryOptions?
+ // An object that contains optional information such as sort, start, and count.
+ //
+ // returns: Function
+ // A function that caches the passed query under the field "matches". See any
+ // of the "query" methods on dojo.stores.
+ //
+ // example:
+ // Define a store with a reference to this engine, and set up a query method.
+ //
+ // | var myStore = function(options){
+ // | // ...more properties here
+ // | this.queryEngine = dojo.store.util.SimpleQueryEngine;
+ // | // define our query method
+ // | this.query = function(query, options){
+ // | return dojo.store.util.QueryResults(this.queryEngine(query, options)(this.data));
+ // | };
+ // | };
+
+ // create our matching query function
+ switch(typeof query){
+ default:
+ throw new Error("Can not query with a " + typeof query);
+ case "object": case "undefined":
+ var queryObject = query;
+ query = function(object){
+ for(var key in queryObject){
+ var required = queryObject[key];
+ if(required && required.test){
+ if(!required.test(object[key])){
+ return false;
+ }
+ }else if(required != object[key]){
+ return false;
+ }
+ }
+ return true;
+ };
+ break;
+ case "string":
+ // named query
+ if(!this[query]){
+ throw new Error("No filter function " + query + " was found in store");
+ }
+ query = this[query];
+ // fall through
+ case "function":
+ // fall through
+ }
+ function execute(array){
+ // execute the whole query, first we filter
+ var results = arrayUtil.filter(array, query);
+ // next we sort
+ if(options && options.sort){
+ results.sort(function(a, b){
+ for(var sort, i=0; sort = options.sort[i]; i++){
+ var aValue = a[sort.attribute];
+ var bValue = b[sort.attribute];
+ if (aValue != bValue) {
+ return !!sort.descending == aValue > bValue ? -1 : 1;
+ }
+ }
+ return 0;
+ });
+ }
+ // now we paginate
+ if(options && (options.start || options.count)){
+ var total = results.length;
+ results = results.slice(options.start || 0, (options.start || 0) + (options.count || Infinity));
+ results.total = total;
+ }
+ return results;
+ }
+ execute.matches = query;
+ return execute;
+};
+});
diff --git a/lib/dojo/string.js b/lib/dojo/string.js
index 2e1cc5015..0b8ce6f4c 100644
--- a/lib/dojo/string.js
+++ b/lib/dojo/string.js
@@ -4,163 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.string"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.string"] = true;
-dojo.provide("dojo.string");
-
-dojo.getObject("string", true, dojo);
-
-/*=====
-dojo.string = {
- // summary: String utilities for Dojo
-};
-=====*/
-
-dojo.string.rep = function(/*String*/str, /*Integer*/num){
- // summary:
- // Efficiently replicate a string `n` times.
- // str:
- // the string to replicate
- // num:
- // number of times to replicate the string
-
- if(num <= 0 || !str){ return ""; }
-
- var buf = [];
- for(;;){
- if(num & 1){
- buf.push(str);
- }
- if(!(num >>= 1)){ break; }
- str += str;
- }
- return buf.join(""); // String
-};
-
-dojo.string.pad = function(/*String*/text, /*Integer*/size, /*String?*/ch, /*Boolean?*/end){
- // summary:
- // Pad a string to guarantee that it is at least `size` length by
- // filling with the character `ch` at either the start or end of the
- // string. Pads at the start, by default.
- // text:
- // the string to pad
- // size:
- // length to provide padding
- // ch:
- // character to pad, defaults to '0'
- // end:
- // adds padding at the end if true, otherwise pads at start
- // example:
- // | // Fill the string to length 10 with "+" characters on the right. Yields "Dojo++++++".
- // | dojo.string.pad("Dojo", 10, "+", true);
-
- if(!ch){
- ch = '0';
- }
- var out = String(text),
- pad = dojo.string.rep(ch, Math.ceil((size - out.length) / ch.length));
- return end ? out + pad : pad + out; // String
-};
-
-dojo.string.substitute = function( /*String*/ template,
- /*Object|Array*/map,
- /*Function?*/ transform,
- /*Object?*/ thisObject){
- // summary:
- // Performs parameterized substitutions on a string. Throws an
- // exception if any parameter is unmatched.
- // template:
- // a string with expressions in the form `${key}` to be replaced or
- // `${key:format}` which specifies a format function. keys are case-sensitive.
- // map:
- // hash to search for substitutions
- // transform:
- // a function to process all parameters before substitution takes
- // place, e.g. mylib.encodeXML
- // thisObject:
- // where to look for optional format function; default to the global
- // namespace
- // example:
- // Substitutes two expressions in a string from an Array or Object
- // | // returns "File 'foo.html' is not found in directory '/temp'."
- // | // by providing substitution data in an Array
- // | dojo.string.substitute(
- // | "File '${0}' is not found in directory '${1}'.",
- // | ["foo.html","/temp"]
- // | );
- // |
- // | // also returns "File 'foo.html' is not found in directory '/temp'."
- // | // but provides substitution data in an Object structure. Dotted
- // | // notation may be used to traverse the structure.
- // | dojo.string.substitute(
- // | "File '${name}' is not found in directory '${info.dir}'.",
- // | { name: "foo.html", info: { dir: "/temp" } }
- // | );
- // example:
- // Use a transform function to modify the values:
- // | // returns "file 'foo.html' is not found in directory '/temp'."
- // | dojo.string.substitute(
- // | "${0} is not found in ${1}.",
- // | ["foo.html","/temp"],
- // | function(str){
- // | // try to figure out the type
- // | var prefix = (str.charAt(0) == "/") ? "directory": "file";
- // | return prefix + " '" + str + "'";
- // | }
- // | );
- // example:
- // Use a formatter
- // | // returns "thinger -- howdy"
- // | dojo.string.substitute(
- // | "${0:postfix}", ["thinger"], null, {
- // | postfix: function(value, key){
- // | return value + " -- howdy";
- // | }
- // | }
- // | );
-
- thisObject = thisObject || dojo.global;
- transform = transform ?
- dojo.hitch(thisObject, transform) : function(v){ return v; };
-
- return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,
- function(match, key, format){
- var value = dojo.getObject(key, false, map);
- if(format){
- value = dojo.getObject(format, false, thisObject).call(thisObject, value, key);
- }
- return transform(value, key).toString();
- }); // String
-};
-
-/*=====
-dojo.string.trim = function(str){
- // summary:
- // Trims whitespace from both sides of the string
- // str: String
- // String to be trimmed
- // returns: String
- // Returns the trimmed string
- // description:
- // This version of trim() was taken from [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript).
- // The short yet performant version of this function is dojo.trim(),
- // which is part of Dojo base. Uses String.prototype.trim instead, if available.
- return ""; // String
-}
-=====*/
-
-dojo.string.trim = String.prototype.trim ?
- dojo.trim : // aliasing to the native function
- function(str){
- str = str.replace(/^\s+/, '');
- for(var i = str.length - 1; i >= 0; i--){
- if(/\S/.test(str.charAt(i))){
- str = str.substring(0, i + 1);
- break;
- }
- }
- return str;
- };
-
-}
+//>>built
+define("dojo/string",["./_base/kernel","./_base/lang"],function(_1,_2){_2.getObject("string",true,_1);_1.string.rep=function(_3,_4){if(_4<=0||!_3){return "";}var _5=[];for(;;){if(_4&1){_5.push(_3);}if(!(_4>>=1)){break;}_3+=_3;}return _5.join("");};_1.string.pad=function(_6,_7,ch,_8){if(!ch){ch="0";}var _9=String(_6),_a=_1.string.rep(ch,Math.ceil((_7-_9.length)/ch.length));return _8?_9+_a:_a+_9;};_1.string.substitute=function(_b,_c,_d,_e){_e=_e||_1.global;_d=_d?_2.hitch(_e,_d):function(v){return v;};return _b.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_f,key,_10){var _11=_2.getObject(key,false,_c);if(_10){_11=_2.getObject(_10,false,_e).call(_e,_11,key);}return _d(_11,key).toString();});};_1.string.trim=String.prototype.trim?_2.trim:function(str){str=str.replace(/^\s+/,"");for(var i=str.length-1;i>=0;i--){if(/\S/.test(str.charAt(i))){str=str.substring(0,i+1);break;}}return str;};return _1.string;}); \ No newline at end of file
diff --git a/lib/dojo/string.js.uncompressed.js b/lib/dojo/string.js.uncompressed.js
new file mode 100644
index 000000000..14aef6c95
--- /dev/null
+++ b/lib/dojo/string.js.uncompressed.js
@@ -0,0 +1,162 @@
+define("dojo/string", ["./_base/kernel", "./_base/lang"], function(dojo, lang) {
+ // module:
+ // dojo/string
+ // summary:
+ // TODOC
+
+lang.getObject("string", true, dojo);
+
+/*=====
+dojo.string = {
+ // summary: String utilities for Dojo
+};
+=====*/
+
+dojo.string.rep = function(/*String*/str, /*Integer*/num){
+ // summary:
+ // Efficiently replicate a string `n` times.
+ // str:
+ // the string to replicate
+ // num:
+ // number of times to replicate the string
+
+ if(num <= 0 || !str){ return ""; }
+
+ var buf = [];
+ for(;;){
+ if(num & 1){
+ buf.push(str);
+ }
+ if(!(num >>= 1)){ break; }
+ str += str;
+ }
+ return buf.join(""); // String
+};
+
+dojo.string.pad = function(/*String*/text, /*Integer*/size, /*String?*/ch, /*Boolean?*/end){
+ // summary:
+ // Pad a string to guarantee that it is at least `size` length by
+ // filling with the character `ch` at either the start or end of the
+ // string. Pads at the start, by default.
+ // text:
+ // the string to pad
+ // size:
+ // length to provide padding
+ // ch:
+ // character to pad, defaults to '0'
+ // end:
+ // adds padding at the end if true, otherwise pads at start
+ // example:
+ // | // Fill the string to length 10 with "+" characters on the right. Yields "Dojo++++++".
+ // | dojo.string.pad("Dojo", 10, "+", true);
+
+ if(!ch){
+ ch = '0';
+ }
+ var out = String(text),
+ pad = dojo.string.rep(ch, Math.ceil((size - out.length) / ch.length));
+ return end ? out + pad : pad + out; // String
+};
+
+dojo.string.substitute = function( /*String*/ template,
+ /*Object|Array*/map,
+ /*Function?*/ transform,
+ /*Object?*/ thisObject){
+ // summary:
+ // Performs parameterized substitutions on a string. Throws an
+ // exception if any parameter is unmatched.
+ // template:
+ // a string with expressions in the form `${key}` to be replaced or
+ // `${key:format}` which specifies a format function. keys are case-sensitive.
+ // map:
+ // hash to search for substitutions
+ // transform:
+ // a function to process all parameters before substitution takes
+ // place, e.g. mylib.encodeXML
+ // thisObject:
+ // where to look for optional format function; default to the global
+ // namespace
+ // example:
+ // Substitutes two expressions in a string from an Array or Object
+ // | // returns "File 'foo.html' is not found in directory '/temp'."
+ // | // by providing substitution data in an Array
+ // | dojo.string.substitute(
+ // | "File '${0}' is not found in directory '${1}'.",
+ // | ["foo.html","/temp"]
+ // | );
+ // |
+ // | // also returns "File 'foo.html' is not found in directory '/temp'."
+ // | // but provides substitution data in an Object structure. Dotted
+ // | // notation may be used to traverse the structure.
+ // | dojo.string.substitute(
+ // | "File '${name}' is not found in directory '${info.dir}'.",
+ // | { name: "foo.html", info: { dir: "/temp" } }
+ // | );
+ // example:
+ // Use a transform function to modify the values:
+ // | // returns "file 'foo.html' is not found in directory '/temp'."
+ // | dojo.string.substitute(
+ // | "${0} is not found in ${1}.",
+ // | ["foo.html","/temp"],
+ // | function(str){
+ // | // try to figure out the type
+ // | var prefix = (str.charAt(0) == "/") ? "directory": "file";
+ // | return prefix + " '" + str + "'";
+ // | }
+ // | );
+ // example:
+ // Use a formatter
+ // | // returns "thinger -- howdy"
+ // | dojo.string.substitute(
+ // | "${0:postfix}", ["thinger"], null, {
+ // | postfix: function(value, key){
+ // | return value + " -- howdy";
+ // | }
+ // | }
+ // | );
+
+ thisObject = thisObject || dojo.global;
+ transform = transform ?
+ lang.hitch(thisObject, transform) : function(v){ return v; };
+
+ return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,
+ function(match, key, format){
+ var value = lang.getObject(key, false, map);
+ if(format){
+ value = lang.getObject(format, false, thisObject).call(thisObject, value, key);
+ }
+ return transform(value, key).toString();
+ }); // String
+};
+
+/*=====
+dojo.string.trim = function(str){
+ // summary:
+ // Trims whitespace from both sides of the string
+ // str: String
+ // String to be trimmed
+ // returns: String
+ // Returns the trimmed string
+ // description:
+ // This version of trim() was taken from [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript).
+ // The short yet performant version of this function is dojo.trim(),
+ // which is part of Dojo base. Uses String.prototype.trim instead, if available.
+ return ""; // String
+}
+=====*/
+
+dojo.string.trim = String.prototype.trim ?
+ lang.trim : // aliasing to the native function
+ function(str){
+ str = str.replace(/^\s+/, '');
+ for(var i = str.length - 1; i >= 0; i--){
+ if(/\S/.test(str.charAt(i))){
+ str = str.substring(0, i + 1);
+ break;
+ }
+ }
+ return str;
+ };
+
+return dojo.string;
+});
diff --git a/lib/dojo/text.js b/lib/dojo/text.js
new file mode 100644
index 000000000..3d067ef57
--- /dev/null
+++ b/lib/dojo/text.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/text",["./_base/kernel","require","./has","./_base/xhr"],function(_1,_2,_3,_4){var _5;if(1){_5=function(_6,_7,_8){_4("GET",{url:_6,sync:!!_7,load:_8});};}else{if(_2.getText){_5=_2.getText;}else{console.error("dojo/text plugin failed to load because loader does not support getText");}}var _9={},_a=function(_b){if(_b){_b=_b.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _c=_b.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_c){_b=_c[1];}}else{_b="";}return _b;},_d={},_e={},_f={dynamic:true,normalize:function(id,_10){var _11=id.split("!"),url=_11[0];return (/^\./.test(url)?_10(url):url)+(_11[1]?"!"+_11[1]:"");},load:function(id,_12,_13){var _14=id.split("!"),_15=_14.length>1,_16=_14[0],url=_12.toUrl(_14[0]),_17=_d,_18=function(_19){_13(_15?_a(_19):_19);};if(_16 in _9){_17=_9[_16];}else{if(url in _12.cache){_17=_12.cache[url];}else{if(url in _9){_17=_9[url];}}}if(_17===_d){if(_e[url]){_e[url].push(_18);}else{var _1a=_e[url]=[_18];_5(url,!_12.async,function(_1b){_9[_16]=_9[url]=_1b;for(var i=0;i<_1a.length;){_1a[i++](_1b);}delete _e[url];});}}else{_18(_17);}}};_1.cache=function(_1c,url,_1d){var key;if(typeof _1c=="string"){if(/\//.test(_1c)){key=_1c;_1d=url;}else{key=_2.toUrl(_1c.replace(/\./g,"/")+(url?("/"+url):""));}}else{key=_1c+"";_1d=url;}var val=(_1d!=undefined&&typeof _1d!="string")?_1d.value:_1d,_1e=_1d&&_1d.sanitize;if(typeof val=="string"){_9[key]=val;return _1e?_a(val):val;}else{if(val===null){delete _9[key];return null;}else{if(!(key in _9)){_5(key,true,function(_1f){_9[key]=_1f;});}return _1e?_a(_9[key]):_9[key];}}};return _f;}); \ No newline at end of file
diff --git a/lib/dojo/text.js.uncompressed.js b/lib/dojo/text.js.uncompressed.js
new file mode 100644
index 000000000..75d26766b
--- /dev/null
+++ b/lib/dojo/text.js.uncompressed.js
@@ -0,0 +1,212 @@
+define("dojo/text", ["./_base/kernel", "require", "./has", "./_base/xhr"], function(dojo, require, has, xhr){
+ // module:
+ // dojo/text
+ // summary:
+ // This module implements the !dojo/text plugin and the dojo.cache API.
+ // description:
+ // We choose to include our own plugin to leverage functionality already contained in dojo
+ // and thereby reduce the size of the plugin compared to various foreign loader implementations.
+ // Also, this allows foreign AMD loaders to be used without their plugins.
+ //
+ // CAUTION: this module is designed to optionally function synchronously to support the dojo v1.x synchronous
+ // loader. This feature is outside the scope of the CommonJS plugins specification.
+
+ var getText;
+ if(1){
+ getText= function(url, sync, load){
+ xhr("GET", {url:url, sync:!!sync, load:load});
+ };
+ }else{
+ // TODOC: only works for dojo AMD loader
+ if(require.getText){
+ getText= require.getText;
+ }else{
+ console.error("dojo/text plugin failed to load because loader does not support getText");
+ }
+ }
+
+ var
+ theCache= {},
+
+ strip= function(text){
+ //Strips <?xml ...?> declarations so that external SVG and XML
+ //documents can be added to a document without worry. Also, if the string
+ //is an HTML document, only the part inside the body tag is returned.
+ if(text){
+ text= text.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, "");
+ var matches= text.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+ if(matches){
+ text= matches[1];
+ }
+ }else{
+ text = "";
+ }
+ return text;
+ },
+
+ notFound = {},
+
+ pending = {},
+
+ result= {
+ dynamic:
+ // the dojo/text caches it's own resources because of dojo.cache
+ true,
+
+ normalize:function(id, toAbsMid){
+ // id is something like (path may be relative):
+ //
+ // "path/to/text.html"
+ // "path/to/text.html!strip"
+ var parts= id.split("!"),
+ url= parts[0];
+ return (/^\./.test(url) ? toAbsMid(url) : url) + (parts[1] ? "!" + parts[1] : "");
+ },
+
+ load:function(id, require, load){
+ // id is something like (path is always absolute):
+ //
+ // "path/to/text.html"
+ // "path/to/text.html!strip"
+ var
+ parts= id.split("!"),
+ stripFlag= parts.length>1,
+ absMid= parts[0],
+ url = require.toUrl(parts[0]),
+ text = notFound,
+ finish = function(text){
+ load(stripFlag ? strip(text) : text);
+ };
+ if(absMid in theCache){
+ text = theCache[absMid];
+ }else if(url in require.cache){
+ text = require.cache[url];
+ }else if(url in theCache){
+ text = theCache[url];
+ }
+ if(text===notFound){
+ if(pending[url]){
+ pending[url].push(finish);
+ }else{
+ var pendingList = pending[url] = [finish];
+ getText(url, !require.async, function(text){
+ theCache[absMid]= theCache[url]= text;
+ for(var i = 0; i<pendingList.length;){
+ pendingList[i++](text);
+ }
+ delete pending[url];
+ });
+ }
+ }else{
+ finish(text);
+ }
+ }
+ };
+
+ dojo.cache= function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){
+ // * (string string [value]) => (module, url, value)
+ // * (object [value]) => (module, value), url defaults to ""
+ //
+ // * if module is an object, then it must be convertable to a string
+ // * (module, url) module + (url ? ("/" + url) : "") must be a legal argument to require.toUrl
+ // * value may be a string or an object; if an object then may have the properties "value" and/or "sanitize"
+ var key;
+ if(typeof module=="string"){
+ if(/\//.test(module)){
+ // module is a version 1.7+ resolved path
+ key = module;
+ value = url;
+ }else{
+ // module is a version 1.6- argument to dojo.moduleUrl
+ key = require.toUrl(module.replace(/\./g, "/") + (url ? ("/" + url) : ""));
+ }
+ }else{
+ key = module + "";
+ value = url;
+ }
+ var
+ val = (value != undefined && typeof value != "string") ? value.value : value,
+ sanitize = value && value.sanitize;
+
+ if(typeof val == "string"){
+ //We have a string, set cache value
+ theCache[key] = val;
+ return sanitize ? strip(val) : val;
+ }else if(val === null){
+ //Remove cached value
+ delete theCache[key];
+ return null;
+ }else{
+ //Allow cache values to be empty strings. If key property does
+ //not exist, fetch it.
+ if(!(key in theCache)){
+ getText(key, true, function(text){
+ theCache[key]= text;
+ });
+ }
+ return sanitize ? strip(theCache[key]) : theCache[key];
+ }
+ };
+
+ return result;
+
+/*=====
+dojo.cache = function(module, url, value){
+ // summary:
+ // A getter and setter for storing the string content associated with the
+ // module and url arguments.
+ // description:
+ // If module is a string that contains slashes, then it is interpretted as a fully
+ // resolved path (typically a result returned by require.toUrl), and url should not be
+ // provided. This is the preferred signature. If module is a string that does not
+ // contain slashes, then url must also be provided and module and url are used to
+ // call `dojo.moduleUrl()` to generate a module URL. This signature is deprecated.
+ // If value is specified, the cache value for the moduleUrl will be set to
+ // that value. Otherwise, dojo.cache will fetch the moduleUrl and store it
+ // in its internal cache and return that cached value for the URL. To clear
+ // a cache value pass null for value. Since XMLHttpRequest (XHR) is used to fetch the
+ // the URL contents, only modules on the same domain of the page can use this capability.
+ // The build system can inline the cache values though, to allow for xdomain hosting.
+ // module: String||Object
+ // If a String with slashes, a fully resolved path; if a String without slashes, the
+ // module name to use for the base part of the URL, similar to module argument
+ // to `dojo.moduleUrl`. If an Object, something that has a .toString() method that
+ // generates a valid path for the cache item. For example, a dojo._Url object.
+ // url: String
+ // The rest of the path to append to the path derived from the module argument. If
+ // module is an object, then this second argument should be the "value" argument instead.
+ // value: String||Object?
+ // If a String, the value to use in the cache for the module/url combination.
+ // If an Object, it can have two properties: value and sanitize. The value property
+ // should be the value to use in the cache, and sanitize can be set to true or false,
+ // to indicate if XML declarations should be removed from the value and if the HTML
+ // inside a body tag in the value should be extracted as the real value. The value argument
+ // or the value property on the value argument are usually only used by the build system
+ // as it inlines cache content.
+ // example:
+ // To ask dojo.cache to fetch content and store it in the cache (the dojo["cache"] style
+ // of call is used to avoid an issue with the build system erroneously trying to intern
+ // this example. To get the build system to intern your dojo.cache calls, use the
+ // "dojo.cache" style of call):
+ // | //If template.html contains "<h1>Hello</h1>" that will be
+ // | //the value for the text variable.
+ // | var text = dojo["cache"]("my.module", "template.html");
+ // example:
+ // To ask dojo.cache to fetch content and store it in the cache, and sanitize the input
+ // (the dojo["cache"] style of call is used to avoid an issue with the build system
+ // erroneously trying to intern this example. To get the build system to intern your
+ // dojo.cache calls, use the "dojo.cache" style of call):
+ // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the
+ // | //text variable will contain just "<h1>Hello</h1>".
+ // | var text = dojo["cache"]("my.module", "template.html", {sanitize: true});
+ // example:
+ // Same example as previous, but demostrates how an object can be passed in as
+ // the first argument, then the value argument can then be the second argument.
+ // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the
+ // | //text variable will contain just "<h1>Hello</h1>".
+ // | var text = dojo["cache"](new dojo._Url("my/module/template.html"), {sanitize: true});
+ return val; //String
+};
+=====*/
+});
+
diff --git a/lib/dojo/topic.js b/lib/dojo/topic.js
new file mode 100644
index 000000000..2a73d29ba
--- /dev/null
+++ b/lib/dojo/topic.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/topic",["./Evented"],function(_1){var _2=new _1;return {publish:function(_3,_4){return _2.emit.apply(_2,arguments);},subscribe:function(_5,_6){return _2.on.apply(_2,arguments);}};}); \ No newline at end of file
diff --git a/lib/dojo/topic.js.uncompressed.js b/lib/dojo/topic.js.uncompressed.js
new file mode 100644
index 000000000..7fc63c7d5
--- /dev/null
+++ b/lib/dojo/topic.js.uncompressed.js
@@ -0,0 +1,33 @@
+define("dojo/topic", ["./Evented"], function(Evented){
+ // summary:
+ // The export of this module is a pubsub hub
+ // You can also use listen function itself as a pub/sub hub:
+ // | topic.subscribe("some/topic", function(event){
+ // | ... do something with event
+ // | });
+ // | topic.publish("some/topic", {name:"some event", ...});
+
+ var hub = new Evented;
+ return {
+ publish: function(topic, event){
+ // summary:
+ // Publishes a message to a topic on the pub/sub hub. All arguments after
+ // the first will be passed to the subscribers, so any number of arguments
+ // can be provided (not just event).
+ // topic: String
+ // The name of the topic to publish to
+ // event: Object
+ // An event to distribute to the topic listeners
+ return hub.emit.apply(hub, arguments);
+ },
+ subscribe: function(topic, listener){
+ // summary:
+ // Subcribes to a topic on the pub/sub hub
+ // topic: String
+ // The topic to subscribe to
+ // listener: Function
+ // A function to call when a message is published to the given topic
+ return hub.on.apply(hub, arguments);
+ }
+ }
+});
diff --git a/lib/dojo/touch.js b/lib/dojo/touch.js
new file mode 100644
index 000000000..db903de59
--- /dev/null
+++ b/lib/dojo/touch.js
@@ -0,0 +1,8 @@
+/*
+ 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
+*/
+
+//>>built
+define("dojo/touch",["./_base/kernel","./on","./has","./mouse"],function(_1,on,_2,_3){function _4(_5){return function(_6,_7){return on(_6,_5,_7);};};var _8=_2("touch");_1.touch={press:_4(_8?"touchstart":"mousedown"),move:_4(_8?"touchmove":"mousemove"),release:_4(_8?"touchend":"mouseup"),cancel:_8?_4("touchcancel"):_3.leave};return _1.touch;}); \ No newline at end of file
diff --git a/lib/dojo/touch.js.uncompressed.js b/lib/dojo/touch.js.uncompressed.js
new file mode 100644
index 000000000..2b3cf5b10
--- /dev/null
+++ b/lib/dojo/touch.js.uncompressed.js
@@ -0,0 +1,89 @@
+define("dojo/touch", ["./_base/kernel", "./on", "./has", "./mouse"], function(dojo, on, has, mouse){
+// module:
+// dojo/touch
+
+/*=====
+ dojo.touch = {
+ // summary:
+ // This module provides unified touch event handlers by exporting
+ // press, move, release and cancel which can also run well on desktop.
+ // Based on http://dvcs.w3.org/hg/webevents/raw-file/tip/touchevents.html
+ //
+ // example:
+ // 1. Used with dojo.connect()
+ // | dojo.connect(node, dojo.touch.press, function(e){});
+ // | dojo.connect(node, dojo.touch.move, function(e){});
+ // | dojo.connect(node, dojo.touch.release, function(e){});
+ // | dojo.connect(node, dojo.touch.cancel, function(e){});
+ //
+ // 2. Used with dojo.on
+ // | define(["dojo/on", "dojo/touch"], function(on, touch){
+ // | on(node, touch.press, function(e){});
+ // | on(node, touch.move, function(e){});
+ // | on(node, touch.release, function(e){});
+ // | on(node, touch.cancel, function(e){});
+ //
+ // 3. Used with dojo.touch.* directly
+ // | dojo.touch.press(node, function(e){});
+ // | dojo.touch.move(node, function(e){});
+ // | dojo.touch.release(node, function(e){});
+ // | dojo.touch.cancel(node, function(e){});
+
+ press: function(node, listener){
+ // summary:
+ // Register a listener to 'touchstart'|'mousedown' for the given node
+ // node: Dom
+ // Target node to listen to
+ // listener: Function
+ // Callback function
+ // returns:
+ // A handle which will be used to remove the listener by handle.remove()
+ },
+ move: function(node, listener){
+ // summary:
+ // Register a listener to 'touchmove'|'mousemove' for the given node
+ // node: Dom
+ // Target node to listen to
+ // listener: Function
+ // Callback function
+ // returns:
+ // A handle which will be used to remove the listener by handle.remove()
+ },
+ release: function(node, listener){
+ // summary:
+ // Register a listener to 'touchend'|'mouseup' for the given node
+ // node: Dom
+ // Target node to listen to
+ // listener: Function
+ // Callback function
+ // returns:
+ // A handle which will be used to remove the listener by handle.remove()
+ },
+ cancel: function(node, listener){
+ // summary:
+ // Register a listener to 'touchcancel'|'mouseleave' for the given node
+ // node: Dom
+ // Target node to listen to
+ // listener: Function
+ // Callback function
+ // returns:
+ // A handle which will be used to remove the listener by handle.remove()
+ }
+ };
+=====*/
+
+ function _handle(/*String - press | move | release | cancel*/type){
+ return function(node, listener){//called by on(), see dojo.on
+ return on(node, type, listener);
+ };
+ }
+ var touch = has("touch");
+ //device neutral events - dojo.touch.press|move|release|cancel
+ dojo.touch = {
+ press: _handle(touch ? "touchstart": "mousedown"),
+ move: _handle(touch ? "touchmove": "mousemove"),
+ release: _handle(touch ? "touchend": "mouseup"),
+ cancel: touch ? _handle("touchcancel") : mouse.leave
+ };
+ return dojo.touch;
+}); \ No newline at end of file
diff --git a/lib/dojo/tt-rss-layer.js b/lib/dojo/tt-rss-layer.js
index 2c0f3489d..24a099d9a 100644
--- a/lib/dojo/tt-rss-layer.js
+++ b/lib/dojo/tt-rss-layer.js
@@ -11,4 +11,5 @@
http://dojotoolkit.org
*/
-dojo.provide("tt-rss-layer");if(!dojo._hasResource["dojo.date.stamp"]){dojo._hasResource["dojo.date.stamp"]=true;dojo.provide("dojo.date.stamp");dojo.getObject("date.stamp",true,dojo);dojo.date.stamp.fromISOString=function(_1,_2){if(!dojo.date.stamp._isoRegExp){dojo.date.stamp._isoRegExp=/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;}var _3=dojo.date.stamp._isoRegExp.exec(_1),_4=null;if(_3){_3.shift();if(_3[1]){_3[1]--;}if(_3[6]){_3[6]*=1000;}if(_2){_2=new Date(_2);dojo.forEach(dojo.map(["FullYear","Month","Date","Hours","Minutes","Seconds","Milliseconds"],function(_5){return _2["get"+_5]();}),function(_6,_7){_3[_7]=_3[_7]||_6;});}_4=new Date(_3[0]||1970,_3[1]||0,_3[2]||1,_3[3]||0,_3[4]||0,_3[5]||0,_3[6]||0);if(_3[0]<100){_4.setFullYear(_3[0]||1970);}var _8=0,_9=_3[7]&&_3[7].charAt(0);if(_9!="Z"){_8=((_3[8]||0)*60)+(Number(_3[9])||0);if(_9!="-"){_8*=-1;}}if(_9){_8-=_4.getTimezoneOffset();}if(_8){_4.setTime(_4.getTime()+_8*60000);}}return _4;};dojo.date.stamp.toISOString=function(_a,_b){var _c=function(n){return (n<10)?"0"+n:n;};_b=_b||{};var _d=[],_e=_b.zulu?"getUTC":"get",_f="";if(_b.selector!="time"){var _10=_a[_e+"FullYear"]();_f=["0000".substr((_10+"").length)+_10,_c(_a[_e+"Month"]()+1),_c(_a[_e+"Date"]())].join("-");}_d.push(_f);if(_b.selector!="date"){var _11=[_c(_a[_e+"Hours"]()),_c(_a[_e+"Minutes"]()),_c(_a[_e+"Seconds"]())].join(":");var _12=_a[_e+"Milliseconds"]();if(_b.milliseconds){_11+="."+(_12<100?"0":"")+_c(_12);}if(_b.zulu){_11+="Z";}else{if(_b.selector!="time"){var _13=_a.getTimezoneOffset();var _14=Math.abs(_13);_11+=(_13>0?"-":"+")+_c(Math.floor(_14/60))+":"+_c(_14%60);}}_d.push(_11);}return _d.join("T");};}if(!dojo._hasResource["dojo.parser"]){dojo._hasResource["dojo.parser"]=true;dojo.provide("dojo.parser");new Date("X");dojo.parser=new function(){var d=dojo;function _15(_16){if(d.isString(_16)){return "string";}if(typeof _16=="number"){return "number";}if(typeof _16=="boolean"){return "boolean";}if(d.isFunction(_16)){return "function";}if(d.isArray(_16)){return "array";}if(_16 instanceof Date){return "date";}if(_16 instanceof d._Url){return "url";}return "object";};function _17(_18,_19){switch(_19){case "string":return _18;case "number":return _18.length?Number(_18):NaN;case "boolean":return typeof _18=="boolean"?_18:!(_18.toLowerCase()=="false");case "function":if(d.isFunction(_18)){_18=_18.toString();_18=d.trim(_18.substring(_18.indexOf("{")+1,_18.length-1));}try{if(_18===""||_18.search(/[^\w\.]+/i)!=-1){return new Function(_18);}else{return d.getObject(_18,false)||new Function(_18);}}catch(e){return new Function();}case "array":return _18?_18.split(/\s*,\s*/):[];case "date":switch(_18){case "":return new Date("");case "now":return new Date();default:return d.date.stamp.fromISOString(_18);}case "url":return d.baseUrl+_18;default:return d.fromJson(_18);}};var _1a={},_1b={};d.connect(d,"extend",function(){_1b={};});function _1c(cls,_1d){for(var _1e in cls){if(_1e.charAt(0)=="_"){continue;}if(_1e in _1a){continue;}_1d[_1e]=_15(cls[_1e]);}return _1d;};function _1f(_20,_21){var c=_1b[_20];if(!c){var cls=d.getObject(_20),_22=null;if(!cls){return null;}if(!_21){_22=_1c(cls.prototype,{});}c={cls:cls,params:_22};}else{if(!_21&&!c.params){c.params=_1c(c.cls.prototype,{});}}return c;};this._functionFromScript=function(_23,_24){var _25="";var _26="";var _27=(_23.getAttribute(_24+"args")||_23.getAttribute("args"));if(_27){d.forEach(_27.split(/\s*,\s*/),function(_28,idx){_25+="var "+_28+" = arguments["+idx+"]; ";});}var _29=_23.getAttribute("with");if(_29&&_29.length){d.forEach(_29.split(/\s*,\s*/),function(_2a){_25+="with("+_2a+"){";_26+="}";});}return new Function(_25+_23.innerHTML+_26);};this.instantiate=function(_2b,_2c,_2d){var _2e=[],_2c=_2c||{};_2d=_2d||{};var _2f=(_2d.scope||d._scopeName)+"Type",_30="data-"+(_2d.scope||d._scopeName)+"-";d.forEach(_2b,function(obj){if(!obj){return;}var _31,_32,_33,_34,_35,_36;if(obj.node){_31=obj.node;_32=obj.type;_36=obj.fastpath;_33=obj.clsInfo||(_32&&_1f(_32,_36));_34=_33&&_33.cls;_35=obj.scripts;}else{_31=obj;_32=_2f in _2c?_2c[_2f]:_31.getAttribute(_2f);_33=_32&&_1f(_32);_34=_33&&_33.cls;_35=(_34&&(_34._noScript||_34.prototype._noScript)?[]:d.query("> script[type^='dojo/']",_31));}if(!_33){throw new Error("Could not load class '"+_32);}var _37={};if(_2d.defaults){d._mixin(_37,_2d.defaults);}if(obj.inherited){d._mixin(_37,obj.inherited);}if(_36){var _38=_31.getAttribute(_30+"props");if(_38&&_38.length){try{_38=d.fromJson.call(_2d.propsThis,"{"+_38+"}");d._mixin(_37,_38);}catch(e){throw new Error(e.toString()+" in data-dojo-props='"+_38+"'");}}var _39=_31.getAttribute(_30+"attach-point");if(_39){_37.dojoAttachPoint=_39;}var _3a=_31.getAttribute(_30+"attach-event");if(_3a){_37.dojoAttachEvent=_3a;}dojo.mixin(_37,_2c);}else{var _3b=_31.attributes;for(var _3c in _33.params){var _3d=_3c in _2c?{value:_2c[_3c],specified:true}:_3b.getNamedItem(_3c);if(!_3d||(!_3d.specified&&(!dojo.isIE||_3c.toLowerCase()!="value"))){continue;}var _3e=_3d.value;switch(_3c){case "class":_3e="className" in _2c?_2c.className:_31.className;break;case "style":_3e="style" in _2c?_2c.style:(_31.style&&_31.style.cssText);}var _3f=_33.params[_3c];if(typeof _3e=="string"){_37[_3c]=_17(_3e,_3f);}else{_37[_3c]=_3e;}}}var _40=[],_41=[];d.forEach(_35,function(_42){_31.removeChild(_42);var _43=(_42.getAttribute(_30+"event")||_42.getAttribute("event")),_32=_42.getAttribute("type"),nf=d.parser._functionFromScript(_42,_30);if(_43){if(_32=="dojo/connect"){_40.push({event:_43,func:nf});}else{_37[_43]=nf;}}else{_41.push(nf);}});var _44=_34.markupFactory||_34.prototype&&_34.prototype.markupFactory;var _45=_44?_44(_37,_31,_34):new _34(_37,_31);_2e.push(_45);var _46=(_31.getAttribute(_30+"id")||_31.getAttribute("jsId"));if(_46){d.setObject(_46,_45);}d.forEach(_40,function(_47){d.connect(_45,_47.event,null,_47.func);});d.forEach(_41,function(_48){_48.call(_45);});});if(!_2c._started){d.forEach(_2e,function(_49){if(!_2d.noStart&&_49&&dojo.isFunction(_49.startup)&&!_49._started&&(!_49.getParent||!_49.getParent())){_49.startup();}});}return _2e;};this.parse=function(_4a,_4b){var _4c;if(!_4b&&_4a&&_4a.rootNode){_4b=_4a;_4c=_4b.rootNode;}else{_4c=_4a;}_4c=_4c?dojo.byId(_4c):dojo.body();_4b=_4b||{};var _4d=(_4b.scope||d._scopeName)+"Type",_4e="data-"+(_4b.scope||d._scopeName)+"-";function _4f(_50,_51){var _52=dojo.clone(_50.inherited);dojo.forEach(["dir","lang"],function(_53){var val=_50.node.getAttribute(_53);if(val){_52[_53]=val;}});var _54=_50.clsInfo&&!_50.clsInfo.cls.prototype._noScript?_50.scripts:null;var _55=(!_50.clsInfo||!_50.clsInfo.cls.prototype.stopParser)||(_4b&&_4b.template);for(var _56=_50.node.firstChild;_56;_56=_56.nextSibling){if(_56.nodeType==1){var _57,_58=_55&&_56.getAttribute(_4e+"type");if(_58){_57=_58;}else{_57=_55&&_56.getAttribute(_4d);}var _59=_58==_57;if(_57){var _5a={"type":_57,fastpath:_59,clsInfo:_1f(_57,_59),node:_56,scripts:[],inherited:_52};_51.push(_5a);_4f(_5a,_51);}else{if(_54&&_56.nodeName.toLowerCase()=="script"){_57=_56.getAttribute("type");if(_57&&/^dojo\/\w/i.test(_57)){_54.push(_56);}}else{if(_55){_4f({node:_56,inherited:_52},_51);}}}}}};var _5b={};if(_4b&&_4b.inherited){for(var key in _4b.inherited){if(_4b.inherited[key]){_5b[key]=_4b.inherited[key];}}}var _5c=[];_4f({node:_4c,inherited:_5b},_5c);var _5d=_4b&&_4b.template?{template:true}:null;return this.instantiate(_5c,_5d,_4b);};}();(function(){var _5e=function(){if(dojo.config.parseOnLoad){dojo.parser.parse();}};if(dojo.getObject("dijit.wai.onload")===dojo._loaders[0]){dojo._loaders.splice(1,0,_5e);}else{dojo._loaders.unshift(_5e);}})();}if(!dojo._hasResource["dojo.window"]){dojo._hasResource["dojo.window"]=true;dojo.provide("dojo.window");dojo.getObject("window",true,dojo);dojo.window.getBox=function(){var _5f=(dojo.doc.compatMode=="BackCompat")?dojo.body():dojo.doc.documentElement;var _60=dojo._docScroll();return {w:_5f.clientWidth,h:_5f.clientHeight,l:_60.x,t:_60.y};};dojo.window.get=function(doc){if(dojo.isIE&&window!==document.parentWindow){doc.parentWindow.execScript("document._parentWindow = window;","Javascript");var win=doc._parentWindow;doc._parentWindow=null;return win;}return doc.parentWindow||doc.defaultView;};dojo.window.scrollIntoView=function(_61,pos){try{_61=dojo.byId(_61);var doc=_61.ownerDocument||dojo.doc,_62=doc.body||dojo.body(),_63=doc.documentElement||_62.parentNode,_64=dojo.isIE,_65=dojo.isWebKit;if((!(dojo.isMoz||_64||_65||dojo.isOpera)||_61==_62||_61==_63)&&(typeof _61.scrollIntoView!="undefined")){_61.scrollIntoView(false);return;}var _66=doc.compatMode=="BackCompat",_67=(_64>=9&&_61.ownerDocument.parentWindow.frameElement)?((_63.clientHeight>0&&_63.clientWidth>0&&(_62.clientHeight==0||_62.clientWidth==0||_62.clientHeight>_63.clientHeight||_62.clientWidth>_63.clientWidth))?_63:_62):(_66?_62:_63),_68=_65?_62:_67,_69=_67.clientWidth,_6a=_67.clientHeight,rtl=!dojo._isBodyLtr(),_6b=pos||dojo.position(_61),el=_61.parentNode,_6c=function(el){return ((_64<=6||(_64&&_66))?false:(dojo.style(el,"position").toLowerCase()=="fixed"));};if(_6c(_61)){return;}while(el){if(el==_62){el=_68;}var _6d=dojo.position(el),_6e=_6c(el);if(el==_68){_6d.w=_69;_6d.h=_6a;if(_68==_63&&_64&&rtl){_6d.x+=_68.offsetWidth-_6d.w;}if(_6d.x<0||!_64){_6d.x=0;}if(_6d.y<0||!_64){_6d.y=0;}}else{var pb=dojo._getPadBorderExtents(el);_6d.w-=pb.w;_6d.h-=pb.h;_6d.x+=pb.l;_6d.y+=pb.t;var _6f=el.clientWidth,_70=_6d.w-_6f;if(_6f>0&&_70>0){_6d.w=_6f;_6d.x+=(rtl&&(_64||el.clientLeft>pb.l))?_70:0;}_6f=el.clientHeight;_70=_6d.h-_6f;if(_6f>0&&_70>0){_6d.h=_6f;}}if(_6e){if(_6d.y<0){_6d.h+=_6d.y;_6d.y=0;}if(_6d.x<0){_6d.w+=_6d.x;_6d.x=0;}if(_6d.y+_6d.h>_6a){_6d.h=_6a-_6d.y;}if(_6d.x+_6d.w>_69){_6d.w=_69-_6d.x;}}var l=_6b.x-_6d.x,t=_6b.y-Math.max(_6d.y,0),r=l+_6b.w-_6d.w,bot=t+_6b.h-_6d.h;if(r*l>0){var s=Math[l<0?"max":"min"](l,r);if(rtl&&((_64==8&&!_66)||_64>=9)){s=-s;}_6b.x+=el.scrollLeft;el.scrollLeft+=s;_6b.x-=el.scrollLeft;}if(bot*t>0){_6b.y+=el.scrollTop;el.scrollTop+=Math[t<0?"max":"min"](t,bot);_6b.y-=el.scrollTop;}el=(el!=_68)&&!_6e&&el.parentNode;}}catch(error){console.error("scrollIntoView: "+error);_61.scrollIntoView(false);}};}if(!dojo._hasResource["dijit._base.manager"]){dojo._hasResource["dijit._base.manager"]=true;dojo.provide("dijit._base.manager");dojo.declare("dijit.WidgetSet",null,{constructor:function(){this._hash={};this.length=0;},add:function(_71){if(this._hash[_71.id]){throw new Error("Tried to register widget with id=="+_71.id+" but that id is already registered");}this._hash[_71.id]=_71;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(_72,_73){_73=_73||dojo.global;var i=0,id;for(id in this._hash){_72.call(_73,this._hash[id],i++,this._hash);}return this;},filter:function(_74,_75){_75=_75||dojo.global;var res=new dijit.WidgetSet(),i=0,id;for(id in this._hash){var w=this._hash[id];if(_74.call(_75,w,i++,this._hash)){res.add(w);}}return res;},byId:function(id){return this._hash[id];},byClass:function(cls){var res=new dijit.WidgetSet(),id,_76;for(id in this._hash){_76=this._hash[id];if(_76.declaredClass==cls){res.add(_76);}}return res;},toArray:function(){var ar=[];for(var id in this._hash){ar.push(this._hash[id]);}return ar;},map:function(_77,_78){return dojo.map(this.toArray(),_77,_78);},every:function(_79,_7a){_7a=_7a||dojo.global;var x=0,i;for(i in this._hash){if(!_79.call(_7a,this._hash[i],x++,this._hash)){return false;}}return true;},some:function(_7b,_7c){_7c=_7c||dojo.global;var x=0,i;for(i in this._hash){if(_7b.call(_7c,this._hash[i],x++,this._hash)){return true;}}return false;}});(function(){dijit.registry=new dijit.WidgetSet();var _7d=dijit.registry._hash,_7e=dojo.attr,_7f=dojo.hasAttr,_80=dojo.style;dijit.byId=function(id){return typeof id=="string"?_7d[id]:id;};var _81={};dijit.getUniqueId=function(_82){var id;do{id=_82+"_"+(_82 in _81?++_81[_82]:_81[_82]=0);}while(_7d[id]);return dijit._scopeName=="dijit"?id:dijit._scopeName+"_"+id;};dijit.findWidgets=function(_83){var _84=[];function _85(_86){for(var _87=_86.firstChild;_87;_87=_87.nextSibling){if(_87.nodeType==1){var _88=_87.getAttribute("widgetId");if(_88){var _89=_7d[_88];if(_89){_84.push(_89);}}else{_85(_87);}}}};_85(_83);return _84;};dijit._destroyAll=function(){dijit._curFocus=null;dijit._prevFocus=null;dijit._activeStack=[];dojo.forEach(dijit.findWidgets(dojo.body()),function(_8a){if(!_8a._destroyed){if(_8a.destroyRecursive){_8a.destroyRecursive();}else{if(_8a.destroy){_8a.destroy();}}}});};if(dojo.isIE){dojo.addOnWindowUnload(function(){dijit._destroyAll();});}dijit.byNode=function(_8b){return _7d[_8b.getAttribute("widgetId")];};dijit.getEnclosingWidget=function(_8c){while(_8c){var id=_8c.getAttribute&&_8c.getAttribute("widgetId");if(id){return _7d[id];}_8c=_8c.parentNode;}return null;};var _8d=(dijit._isElementShown=function(_8e){var s=_80(_8e);return (s.visibility!="hidden")&&(s.visibility!="collapsed")&&(s.display!="none")&&(_7e(_8e,"type")!="hidden");});dijit.hasDefaultTabStop=function(_8f){switch(_8f.nodeName.toLowerCase()){case "a":return _7f(_8f,"href");case "area":case "button":case "input":case "object":case "select":case "textarea":return true;case "iframe":var _90;try{var _91=_8f.contentDocument;if("designMode" in _91&&_91.designMode=="on"){return true;}_90=_91.body;}catch(e1){try{_90=_8f.contentWindow.document.body;}catch(e2){return false;}}return _90.contentEditable=="true"||(_90.firstChild&&_90.firstChild.contentEditable=="true");default:return _8f.contentEditable=="true";}};var _92=(dijit.isTabNavigable=function(_93){if(_7e(_93,"disabled")){return false;}else{if(_7f(_93,"tabIndex")){return _7e(_93,"tabIndex")>=0;}else{return dijit.hasDefaultTabStop(_93);}}});dijit._getTabNavigable=function(_94){var _95,_96,_97,_98,_99,_9a,_9b={};function _9c(_9d){return _9d&&_9d.tagName.toLowerCase()=="input"&&_9d.type&&_9d.type.toLowerCase()=="radio"&&_9d.name&&_9d.name.toLowerCase();};var _9e=function(_9f){dojo.query("> *",_9f).forEach(function(_a0){if((dojo.isIE&&_a0.scopeName!=="HTML")||!_8d(_a0)){return;}if(_92(_a0)){var _a1=_7e(_a0,"tabIndex");if(!_7f(_a0,"tabIndex")||_a1==0){if(!_95){_95=_a0;}_96=_a0;}else{if(_a1>0){if(!_97||_a1<_98){_98=_a1;_97=_a0;}if(!_99||_a1>=_9a){_9a=_a1;_99=_a0;}}}var rn=_9c(_a0);if(dojo.attr(_a0,"checked")&&rn){_9b[rn]=_a0;}}if(_a0.nodeName.toUpperCase()!="SELECT"){_9e(_a0);}});};if(_8d(_94)){_9e(_94);}function rs(_a2){return _9b[_9c(_a2)]||_a2;};return {first:rs(_95),last:rs(_96),lowest:rs(_97),highest:rs(_99)};};dijit.getFirstInTabbingOrder=function(_a3){var _a4=dijit._getTabNavigable(dojo.byId(_a3));return _a4.lowest?_a4.lowest:_a4.first;};dijit.getLastInTabbingOrder=function(_a5){var _a6=dijit._getTabNavigable(dojo.byId(_a5));return _a6.last?_a6.last:_a6.highest;};dijit.defaultDuration=dojo.config["defaultDuration"]||200;})();}if(!dojo._hasResource["dijit._base.focus"]){dojo._hasResource["dijit._base.focus"]=true;dojo.provide("dijit._base.focus");dojo.mixin(dijit,{_curFocus:null,_prevFocus:null,isCollapsed:function(){return dijit.getBookmark().isCollapsed;},getBookmark:function(){var bm,rg,tg,sel=dojo.doc.selection,cf=dijit._curFocus;if(dojo.global.getSelection){sel=dojo.global.getSelection();if(sel){if(sel.isCollapsed){tg=cf?cf.tagName:"";if(tg){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};}}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){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={};try{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;},moveToBookmark:function(_a7){var _a8=dojo.doc,_a9=_a7.mark;if(_a9){if(dojo.global.getSelection){var sel=dojo.global.getSelection();if(sel&&sel.removeAllRanges){if(_a9.pRange){var r=_a9;var n=r.node;n.selectionStart=r.start;n.selectionEnd=r.end;}else{sel.removeAllRanges();sel.addRange(_a9);}}else{console.warn("No idea how to restore selection for this browser!");}}else{if(_a8.selection&&_a9){var rg;if(_a9.pRange){rg=_a9.range;}else{if(dojo.isArray(_a9)){rg=_a8.body.createControlRange();dojo.forEach(_a9,function(n){rg.addElement(n);});}else{rg=_a8.body.createTextRange();rg.moveToBookmark(_a9);}}rg.select();}}}},getFocus:function(_aa,_ab){var _ac=!dijit._curFocus||(_aa&&dojo.isDescendant(dijit._curFocus,_aa.domNode))?dijit._prevFocus:dijit._curFocus;return {node:_ac,bookmark:(_ac==dijit._curFocus)&&dojo.withGlobal(_ab||dojo.global,dijit.getBookmark),openedForWindow:_ab};},focus:function(_ad){if(!_ad){return;}var _ae="node" in _ad?_ad.node:_ad,_af=_ad.bookmark,_b0=_ad.openedForWindow,_b1=_af?_af.isCollapsed:false;if(_ae){var _b2=(_ae.tagName.toLowerCase()=="iframe")?_ae.contentWindow:_ae;if(_b2&&_b2.focus){try{_b2.focus();}catch(e){}}dijit._onFocusNode(_ae);}if(_af&&dojo.withGlobal(_b0||dojo.global,dijit.isCollapsed)&&!_b1){if(_b0){_b0.focus();}try{dojo.withGlobal(_b0||dojo.global,dijit.moveToBookmark,null,[_af]);}catch(e2){}}},_activeStack:[],registerIframe:function(_b3){return dijit.registerWin(_b3.contentWindow,_b3);},unregisterIframe:function(_b4){dijit.unregisterWin(_b4);},registerWin:function(_b5,_b6){var _b7=function(evt){dijit._justMouseDowned=true;setTimeout(function(){dijit._justMouseDowned=false;},0);if(dojo.isIE&&evt&&evt.srcElement&&evt.srcElement.parentNode==null){return;}dijit._onTouchNode(_b6||evt.target||evt.srcElement,"mouse");};var doc=dojo.isIE?_b5.document.documentElement:_b5.document;if(doc){if(dojo.isIE){_b5.document.body.attachEvent("onmousedown",_b7);var _b8=function(evt){if(evt.srcElement.tagName.toLowerCase()!="#document"&&dijit.isTabNavigable(evt.srcElement)){dijit._onFocusNode(_b6||evt.srcElement);}else{dijit._onTouchNode(_b6||evt.srcElement);}};doc.attachEvent("onactivate",_b8);var _b9=function(evt){dijit._onBlurNode(_b6||evt.srcElement);};doc.attachEvent("ondeactivate",_b9);return function(){_b5.document.detachEvent("onmousedown",_b7);doc.detachEvent("onactivate",_b8);doc.detachEvent("ondeactivate",_b9);doc=null;};}else{doc.body.addEventListener("mousedown",_b7,true);var _ba=function(evt){dijit._onFocusNode(_b6||evt.target);};doc.addEventListener("focus",_ba,true);var _bb=function(evt){dijit._onBlurNode(_b6||evt.target);};doc.addEventListener("blur",_bb,true);return function(){doc.body.removeEventListener("mousedown",_b7,true);doc.removeEventListener("focus",_ba,true);doc.removeEventListener("blur",_bb,true);doc=null;};}}},unregisterWin:function(_bc){_bc&&_bc();},_onBlurNode:function(_bd){dijit._prevFocus=dijit._curFocus;dijit._curFocus=null;if(dijit._justMouseDowned){return;}if(dijit._clearActiveWidgetsTimer){clearTimeout(dijit._clearActiveWidgetsTimer);}dijit._clearActiveWidgetsTimer=setTimeout(function(){delete dijit._clearActiveWidgetsTimer;dijit._setStack([]);dijit._prevFocus=null;},100);},_onTouchNode:function(_be,by){if(dijit._clearActiveWidgetsTimer){clearTimeout(dijit._clearActiveWidgetsTimer);delete dijit._clearActiveWidgetsTimer;}var _bf=[];try{while(_be){var _c0=dojo.attr(_be,"dijitPopupParent");if(_c0){_be=dijit.byId(_c0).domNode;}else{if(_be.tagName&&_be.tagName.toLowerCase()=="body"){if(_be===dojo.body()){break;}_be=dojo.window.get(_be.ownerDocument).frameElement;}else{var id=_be.getAttribute&&_be.getAttribute("widgetId"),_c1=id&&dijit.byId(id);if(_c1&&!(by=="mouse"&&_c1.get("disabled"))){_bf.unshift(id);}_be=_be.parentNode;}}}}catch(e){}dijit._setStack(_bf,by);},_onFocusNode:function(_c2){if(!_c2){return;}if(_c2.nodeType==9){return;}dijit._onTouchNode(_c2);if(_c2==dijit._curFocus){return;}if(dijit._curFocus){dijit._prevFocus=dijit._curFocus;}dijit._curFocus=_c2;dojo.publish("focusNode",[_c2]);},_setStack:function(_c3,by){var _c4=dijit._activeStack;dijit._activeStack=_c3;for(var _c5=0;_c5<Math.min(_c4.length,_c3.length);_c5++){if(_c4[_c5]!=_c3[_c5]){break;}}var _c6;for(var i=_c4.length-1;i>=_c5;i--){_c6=dijit.byId(_c4[i]);if(_c6){_c6._focused=false;_c6.set("focused",false);_c6._hasBeenBlurred=true;if(_c6._onBlur){_c6._onBlur(by);}dojo.publish("widgetBlur",[_c6,by]);}}for(i=_c5;i<_c3.length;i++){_c6=dijit.byId(_c3[i]);if(_c6){_c6._focused=true;_c6.set("focused",true);if(_c6._onFocus){_c6._onFocus(by);}dojo.publish("widgetFocus",[_c6,by]);}}}});dojo.addOnLoad(function(){var _c7=dijit.registerWin(window);if(dojo.isIE){dojo.addOnWindowUnload(function(){dijit.unregisterWin(_c7);_c7=null;});}});}if(!dojo._hasResource["dojo.AdapterRegistry"]){dojo._hasResource["dojo.AdapterRegistry"]=true;dojo.provide("dojo.AdapterRegistry");dojo.AdapterRegistry=function(_c8){this.pairs=[];this.returnWrappers=_c8||false;};dojo.extend(dojo.AdapterRegistry,{register:function(_c9,_ca,_cb,_cc,_cd){this.pairs[((_cd)?"unshift":"push")]([_c9,_ca,_cb,_cc]);},match:function(){for(var i=0;i<this.pairs.length;i++){var _ce=this.pairs[i];if(_ce[1].apply(this,arguments)){if((_ce[3])||(this.returnWrappers)){return _ce[2];}else{return _ce[2].apply(this,arguments);}}}throw new Error("No match found");},unregister:function(_cf){for(var i=0;i<this.pairs.length;i++){var _d0=this.pairs[i];if(_d0[0]==_cf){this.pairs.splice(i,1);return true;}}return false;}});}if(!dojo._hasResource["dijit._base.place"]){dojo._hasResource["dijit._base.place"]=true;dojo.provide("dijit._base.place");dijit.getViewport=function(){return dojo.window.getBox();};dijit.placeOnScreen=function(_d1,pos,_d2,_d3){var _d4=dojo.map(_d2,function(_d5){var c={corner:_d5,pos:{x:pos.x,y:pos.y}};if(_d3){c.pos.x+=_d5.charAt(1)=="L"?_d3.x:-_d3.x;c.pos.y+=_d5.charAt(0)=="T"?_d3.y:-_d3.y;}return c;});return dijit._place(_d1,_d4);};dijit._place=function(_d6,_d7,_d8,_d9){var _da=dojo.window.getBox();if(!_d6.parentNode||String(_d6.parentNode.tagName).toLowerCase()!="body"){dojo.body().appendChild(_d6);}var _db=null;dojo.some(_d7,function(_dc){var _dd=_dc.corner;var pos=_dc.pos;var _de=0;var _df={w:_dd.charAt(1)=="L"?(_da.l+_da.w)-pos.x:pos.x-_da.l,h:_dd.charAt(1)=="T"?(_da.t+_da.h)-pos.y:pos.y-_da.t};if(_d8){var res=_d8(_d6,_dc.aroundCorner,_dd,_df,_d9);_de=typeof res=="undefined"?0:res;}var _e0=_d6.style;var _e1=_e0.display;var _e2=_e0.visibility;_e0.visibility="hidden";_e0.display="";var mb=dojo.marginBox(_d6);_e0.display=_e1;_e0.visibility=_e2;var _e3=Math.max(_da.l,_dd.charAt(1)=="L"?pos.x:(pos.x-mb.w)),_e4=Math.max(_da.t,_dd.charAt(0)=="T"?pos.y:(pos.y-mb.h)),_e5=Math.min(_da.l+_da.w,_dd.charAt(1)=="L"?(_e3+mb.w):pos.x),_e6=Math.min(_da.t+_da.h,_dd.charAt(0)=="T"?(_e4+mb.h):pos.y),_e7=_e5-_e3,_e8=_e6-_e4;_de+=(mb.w-_e7)+(mb.h-_e8);if(_db==null||_de<_db.overflow){_db={corner:_dd,aroundCorner:_dc.aroundCorner,x:_e3,y:_e4,w:_e7,h:_e8,overflow:_de,spaceAvailable:_df};}return !_de;});if(_db.overflow&&_d8){_d8(_d6,_db.aroundCorner,_db.corner,_db.spaceAvailable,_d9);}var l=dojo._isBodyLtr(),s=_d6.style;s.top=_db.y+"px";s[l?"left":"right"]=(l?_db.x:_da.w-_db.x-_db.w)+"px";return _db;};dijit.placeOnScreenAroundNode=function(_e9,_ea,_eb,_ec){_ea=dojo.byId(_ea);var _ed=dojo.position(_ea,true);return dijit._placeOnScreenAroundRect(_e9,_ed.x,_ed.y,_ed.w,_ed.h,_eb,_ec);};dijit.placeOnScreenAroundRectangle=function(_ee,_ef,_f0,_f1){return dijit._placeOnScreenAroundRect(_ee,_ef.x,_ef.y,_ef.width,_ef.height,_f0,_f1);};dijit._placeOnScreenAroundRect=function(_f2,x,y,_f3,_f4,_f5,_f6){var _f7=[];for(var _f8 in _f5){_f7.push({aroundCorner:_f8,corner:_f5[_f8],pos:{x:x+(_f8.charAt(1)=="L"?0:_f3),y:y+(_f8.charAt(0)=="T"?0:_f4)}});}return dijit._place(_f2,_f7,_f6,{w:_f3,h:_f4});};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(_f9,_fa,_fb,_fc){return dijit.placementRegistry.match.apply(dijit.placementRegistry,arguments);};dijit.getPopupAroundAlignment=function(_fd,_fe){var _ff={};dojo.forEach(_fd,function(pos){switch(pos){case "after":_ff[_fe?"BR":"BL"]=_fe?"BL":"BR";break;case "before":_ff[_fe?"BL":"BR"]=_fe?"BR":"BL";break;case "below-alt":_fe=!_fe;case "below":_ff[_fe?"BL":"BR"]=_fe?"TL":"TR";_ff[_fe?"BR":"BL"]=_fe?"TR":"TL";break;case "above-alt":_fe=!_fe;case "above":default:_ff[_fe?"TL":"TR"]=_fe?"BL":"BR";_ff[_fe?"TR":"TL"]=_fe?"BR":"BL";break;}});return _ff;};}if(!dojo._hasResource["dijit._base.window"]){dojo._hasResource["dijit._base.window"]=true;dojo.provide("dijit._base.window");dijit.getDocumentWindow=function(doc){return dojo.window.get(doc);};}if(!dojo._hasResource["dijit._base.popup"]){dojo._hasResource["dijit._base.popup"]=true;dojo.provide("dijit._base.popup");dijit.popup={_stack:[],_beginZIndex:1000,_idGen:1,_createWrapper:function(_100){var _101=_100.declaredClass?_100._popupWrapper:(_100.parentNode&&dojo.hasClass(_100.parentNode,"dijitPopup")),node=_100.domNode||_100;if(!_101){_101=dojo.create("div",{"class":"dijitPopup",style:{display:"none"},role:"presentation"},dojo.body());_101.appendChild(node);var s=node.style;s.display="";s.visibility="";s.position="";s.top="0px";if(_100.declaredClass){_100._popupWrapper=_101;dojo.connect(_100,"destroy",function(){dojo.destroy(_101);delete _100._popupWrapper;});}}return _101;},moveOffScreen:function(_102){var _103=this._createWrapper(_102);dojo.style(_103,{visibility:"hidden",top:"-9999px",display:""});},hide:function(_104){var _105=this._createWrapper(_104);dojo.style(_105,"display","none");},getTopPopup:function(){var _106=this._stack;for(var pi=_106.length-1;pi>0&&_106[pi].parent===_106[pi-1].widget;pi--){}return _106[pi];},open:function(args){var _107=this._stack,_108=args.popup,_109=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"}),_10a=args.around,id=(args.around&&args.around.id)?(args.around.id+"_dropdown"):("popup_"+this._idGen++);while(_107.length&&(!args.parent||!dojo.isDescendant(args.parent.domNode,_107[_107.length-1].widget.domNode))){dijit.popup.close(_107[_107.length-1].widget);}var _10b=this._createWrapper(_108);dojo.attr(_10b,{id:id,style:{zIndex:this._beginZIndex+_107.length},"class":"dijitPopup "+(_108.baseClass||_108["class"]||"").split(" ")[0]+"Popup",dijitPopupParent:args.parent?args.parent.id:""});if(dojo.isIE||dojo.isMoz){if(!_108.bgIframe){_108.bgIframe=new dijit.BackgroundIframe(_10b);}}var best=_10a?dijit.placeOnScreenAroundElement(_10b,_10a,_109,_108.orient?dojo.hitch(_108,"orient"):null):dijit.placeOnScreen(_10b,args,_109=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],args.padding);_10b.style.display="";_10b.style.visibility="visible";_108.domNode.style.visibility="visible";var _10c=[];_10c.push(dojo.connect(_10b,"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 _10d=this.getTopPopup();if(_10d&&_10d.onCancel){_10d.onCancel();}}}}));if(_108.onCancel){_10c.push(dojo.connect(_108,"onCancel",args.onCancel));}_10c.push(dojo.connect(_108,_108.onExecute?"onExecute":"onChange",this,function(){var _10e=this.getTopPopup();if(_10e&&_10e.onExecute){_10e.onExecute();}}));_107.push({widget:_108,parent:args.parent,onExecute:args.onExecute,onCancel:args.onCancel,onClose:args.onClose,handlers:_10c});if(_108.onOpen){_108.onOpen(best);}return best;},close:function(_10f){var _110=this._stack;while((_10f&&dojo.some(_110,function(elem){return elem.widget==_10f;}))||(!_10f&&_110.length)){var top=_110.pop(),_111=top.widget,_112=top.onClose;if(_111.onClose){_111.onClose();}dojo.forEach(top.handlers,dojo.disconnect);if(_111&&_111.domNode){this.hide(_111);}if(_112){_112();}}}};dijit._frames=new function(){var _113=[];this.pop=function(){var _114;if(_113.length){_114=_113.pop();_114.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\");'>";_114=dojo.doc.createElement(html);}else{_114=dojo.create("iframe");_114.src="javascript:\"\"";_114.className="dijitBackgroundIframe";dojo.style(_114,"opacity",0.1);}_114.tabIndex=-1;dijit.setWaiRole(_114,"presentation");}return _114;};this.push=function(_115){_115.style.display="none";_113.push(_115);};}();dijit.BackgroundIframe=function(node){if(!node.id){throw new Error("no id");}if(dojo.isIE||dojo.isMoz){var _116=(this.iframe=dijit._frames.pop());node.appendChild(_116);if(dojo.isIE<7||dojo.isQuirks){this.resize(node);this._conn=dojo.connect(node,"onresize",this,function(){this.resize(node);});}else{dojo.style(_116,{width:"100%",height:"100%"});}}};dojo.extend(dijit.BackgroundIframe,{resize:function(node){if(this.iframe){dojo.style(this.iframe,{width:node.offsetWidth+"px",height:node.offsetHeight+"px"});}},destroy:function(){if(this._conn){dojo.disconnect(this._conn);this._conn=null;}if(this.iframe){dijit._frames.push(this.iframe);delete this.iframe;}}});}if(!dojo._hasResource["dijit._base.scroll"]){dojo._hasResource["dijit._base.scroll"]=true;dojo.provide("dijit._base.scroll");dijit.scrollIntoView=function(node,pos){dojo.window.scrollIntoView(node,pos);};}if(!dojo._hasResource["dojo.uacss"]){dojo._hasResource["dojo.uacss"]=true;dojo.provide("dojo.uacss");(function(){var d=dojo,html=d.doc.documentElement,ie=d.isIE,_117=d.isOpera,maj=Math.floor,ff=d.isFF,_118=d.boxModel.replace(/-/,""),_119={dj_ie:ie,dj_ie6:maj(ie)==6,dj_ie7:maj(ie)==7,dj_ie8:maj(ie)==8,dj_ie9:maj(ie)==9,dj_quirks:d.isQuirks,dj_iequirks:ie&&d.isQuirks,dj_opera:_117,dj_khtml:d.isKhtml,dj_webkit:d.isWebKit,dj_safari:d.isSafari,dj_chrome:d.isChrome,dj_gecko:d.isMozilla,dj_ff3:maj(ff)==3};_119["dj_"+_118]=true;var _11a="";for(var clz in _119){if(_119[clz]){_11a+=clz+" ";}}html.className=d.trim(html.className+" "+_11a);dojo._loaders.unshift(function(){if(!dojo._isBodyLtr()){var _11b="dj_rtl dijitRtl "+_11a.replace(/ /g,"-rtl ");html.className=d.trim(html.className+" "+_11b);}});})();}if(!dojo._hasResource["dijit._base.sniff"]){dojo._hasResource["dijit._base.sniff"]=true;dojo.provide("dijit._base.sniff");}if(!dojo._hasResource["dijit._base.typematic"]){dojo._hasResource["dijit._base.typematic"]=true;dojo.provide("dijit._base.typematic");dijit.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(dojo.hitch(this,"_fireEventAndReload"),this._currentTimeout);},trigger:function(evt,_11c,node,_11d,obj,_11e,_11f,_120){if(obj!=this._obj){this.stop();this._initialDelay=_11f||500;this._subsequentDelay=_11e||0.9;this._minDelay=_120||10;this._obj=obj;this._evt=evt;this._node=node;this._currentTimeout=-1;this._count=-1;this._callback=dojo.hitch(_11c,_11d);this._fireEventAndReload();this._evt=dojo.mixin({faux:true},evt);}},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(node,_121,_122,_123,_124,_125,_126){if(_121.keyCode){_121.charOrCode=_121.keyCode;dojo.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}else{if(_121.charCode){_121.charOrCode=String.fromCharCode(_121.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==_121.charOrCode&&(_121.ctrlKey===undefined||_121.ctrlKey==evt.ctrlKey)&&(_121.altKey===undefined||_121.altKey==evt.altKey)&&(_121.metaKey===undefined||_121.metaKey==(evt.metaKey||false))&&(_121.shiftKey===undefined||_121.shiftKey==evt.shiftKey)){dojo.stopEvent(evt);dijit.typematic.trigger(evt,_122,node,_123,_121,_124,_125,_126);}else{if(dijit.typematic._obj==_121){dijit.typematic.stop();}}}),dojo.connect(node,"onkeyup",this,function(evt){if(dijit.typematic._obj==_121){dijit.typematic.stop();}})];},addMouseListener:function(node,_127,_128,_129,_12a,_12b){var dc=dojo.connect;return [dc(node,"mousedown",this,function(evt){dojo.stopEvent(evt);dijit.typematic.trigger(evt,_127,node,_128,node,_129,_12a,_12b);}),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,_127,node,_128,node,_129,_12a,_12b);setTimeout(dojo.hitch(this,dijit.typematic.stop),50);}})];},addListener:function(_12c,_12d,_12e,_12f,_130,_131,_132,_133){return this.addKeyListener(_12d,_12e,_12f,_130,_131,_132,_133).concat(this.addMouseListener(_12c,_12f,_130,_131,_132,_133));}};}if(!dojo._hasResource["dijit._base.wai"]){dojo._hasResource["dijit._base.wai"]=true;dojo.provide("dijit._base.wai");dijit.wai={onload:function(){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());var cs=dojo.getComputedStyle(div);if(cs){var _134=cs.backgroundImage;var _135=(cs.borderTopColor==cs.borderRightColor)||(_134!=null&&(_134=="none"||_134=="url(invalid-url:)"));dojo[_135?"addClass":"removeClass"](dojo.body(),"dijit_a11y");if(dojo.isIE){div.outerHTML="";}else{dojo.body().removeChild(div);}}}};if(dojo.isIE||dojo.isMoz){dojo._loaders.unshift(dijit.wai.onload);}dojo.mixin(dijit,{hasWaiRole:function(elem,role){var _136=this.getWaiRole(elem);return role?(_136.indexOf(role)>-1):(_136.length>0);},getWaiRole:function(elem){return dojo.trim((dojo.attr(elem,"role")||"").replace("wairole:",""));},setWaiRole:function(elem,role){dojo.attr(elem,"role",role);},removeWaiRole:function(elem,role){var _137=dojo.attr(elem,"role");if(!_137){return;}if(role){var t=dojo.trim((" "+_137+" ").replace(" "+role+" "," "));dojo.attr(elem,"role",t);}else{elem.removeAttribute("role");}},hasWaiState:function(elem,_138){return elem.hasAttribute?elem.hasAttribute("aria-"+_138):!!elem.getAttribute("aria-"+_138);},getWaiState:function(elem,_139){return elem.getAttribute("aria-"+_139)||"";},setWaiState:function(elem,_13a,_13b){elem.setAttribute("aria-"+_13a,_13b);},removeWaiState:function(elem,_13c){elem.removeAttribute("aria-"+_13c);}});}if(!dojo._hasResource["dijit._base"]){dojo._hasResource["dijit._base"]=true;dojo.provide("dijit._base");}if(!dojo._hasResource["dojo.Stateful"]){dojo._hasResource["dojo.Stateful"]=true;dojo.provide("dojo.Stateful");dojo.declare("dojo.Stateful",null,{postscript:function(_13d){if(_13d){dojo.mixin(this,_13d);}},get:function(name){return this[name];},set:function(name,_13e){if(typeof name==="object"){for(var x in name){this.set(x,name[x]);}return this;}var _13f=this[name];this[name]=_13e;if(this._watchCallbacks){this._watchCallbacks(name,_13f,_13e);}return this;},watch:function(name,_140){var _141=this._watchCallbacks;if(!_141){var self=this;_141=this._watchCallbacks=function(name,_142,_143,_144){var _145=function(_146){if(_146){_146=_146.slice();for(var i=0,l=_146.length;i<l;i++){try{_146[i].call(self,name,_142,_143);}catch(e){console.error(e);}}}};_145(_141["_"+name]);if(!_144){_145(_141["*"]);}};}if(!_140&&typeof name==="function"){_140=name;name="*";}else{name="_"+name;}var _147=_141[name];if(typeof _147!=="object"){_147=_141[name]=[];}_147.push(_140);return {unwatch:function(){_147.splice(dojo.indexOf(_147,_140),1);}};}});}if(!dojo._hasResource["dijit._WidgetBase"]){dojo._hasResource["dijit._WidgetBase"]=true;dojo.provide("dijit._WidgetBase");(function(){dojo.declare("dijit._WidgetBase",dojo.Stateful,{id:"",lang:"",dir:"","class":"",style:"",title:"",tooltip:"",baseClass:"",srcNodeRef:null,domNode:null,containerNode:null,attributeMap:{id:"",dir:"",lang:"","class":"",style:"",title:""},_blankGif:(dojo.config.blankGif||dojo.moduleUrl("dojo","resources/blank.gif")).toString(),postscript:function(_148,_149){this.create(_148,_149);},create:function(_14a,_14b){this.srcNodeRef=dojo.byId(_14b);this._connects=[];this._subscribes=[];if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){this.id=this.srcNodeRef.id;}if(_14a){this.params=_14a;dojo._mixin(this,_14a);}this.postMixInProperties();if(!this.id){this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));}dijit.registry.add(this);this.buildRendering();if(this.domNode){this._applyAttributes();var _14c=this.srcNodeRef;if(_14c&&_14c.parentNode&&this.domNode!==_14c){_14c.parentNode.replaceChild(this.domNode,_14c);}}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 _14d=function(attr,_14e){if((_14e.params&&attr in _14e.params)||_14e[attr]){_14e.set(attr,_14e[attr]);}};for(var attr in this.attributeMap){_14d(attr,this);}dojo.forEach(this._getSetterAttributes(),function(a){if(!(a in this.attributeMap)){_14d(a,this);}},this);},_getSetterAttributes:function(){var ctor=this.constructor;if(!ctor._setterAttrs){var r=(ctor._setterAttrs=[]),_14f,_150=ctor.prototype;for(var _151 in _150){if(dojo.isFunction(_150[_151])&&(_14f=_151.match(/^_set([a-zA-Z]*)Attr$/))&&_14f[1]){r.push(_14f[1].charAt(0).toLowerCase()+_14f[1].substr(1));}}}return ctor._setterAttrs;},postMixInProperties:function(){},buildRendering:function(){if(!this.domNode){this.domNode=this.srcNodeRef||dojo.create("div");}if(this.baseClass){var _152=this.baseClass.split(" ");if(!this.isLeftToRight()){_152=_152.concat(dojo.map(_152,function(name){return name+"Rtl";}));}dojo.addClass(this.domNode,_152);}},postCreate:function(){},startup:function(){this._started=true;},destroyRecursive:function(_153){this._beingDestroyed=true;this.destroyDescendants(_153);this.destroy(_153);},destroy:function(_154){this._beingDestroyed=true;this.uninitialize();var d=dojo,dfe=d.forEach,dun=d.unsubscribe;dfe(this._connects,function(_155){dfe(_155,d.disconnect);});dfe(this._subscribes,function(_156){dun(_156);});dfe(this._supportingWidgets||[],function(w){if(w.destroyRecursive){w.destroyRecursive();}else{if(w.destroy){w.destroy();}}});this.destroyRendering(_154);dijit.registry.remove(this.id);this._destroyed=true;},destroyRendering:function(_157){if(this.bgIframe){this.bgIframe.destroy(_157);delete this.bgIframe;}if(this.domNode){if(_157){dojo.removeAttr(this.domNode,"widgetId");}else{dojo.destroy(this.domNode);}delete this.domNode;}if(this.srcNodeRef){if(!_157){dojo.destroy(this.srcNodeRef);}delete this.srcNodeRef;}},destroyDescendants:function(_158){dojo.forEach(this.getChildren(),function(_159){if(_159.destroyRecursive){_159.destroyRecursive(_158);}});},uninitialize:function(){return false;},_setClassAttr:function(_15a){var _15b=this[this.attributeMap["class"]||"domNode"];dojo.replaceClass(_15b,_15a,this["class"]);this._set("class",_15a);},_setStyleAttr:function(_15c){var _15d=this[this.attributeMap.style||"domNode"];if(dojo.isObject(_15c)){dojo.style(_15d,_15c);}else{if(_15d.style.cssText){_15d.style.cssText+="; "+_15c;}else{_15d.style.cssText=_15c;}}this._set("style",_15c);},_attrToDom:function(attr,_15e){var _15f=this.attributeMap[attr];dojo.forEach(dojo.isArray(_15f)?_15f:[_15f],function(_160){var _161=this[_160.node||_160||"domNode"];var type=_160.type||"attribute";switch(type){case "attribute":if(dojo.isFunction(_15e)){_15e=dojo.hitch(this,_15e);}var _162=_160.attribute?_160.attribute:(/^on[A-Z][a-zA-Z]*$/.test(attr)?attr.toLowerCase():attr);dojo.attr(_161,_162,_15e);break;case "innerText":_161.innerHTML="";_161.appendChild(dojo.doc.createTextNode(_15e));break;case "innerHTML":_161.innerHTML=_15e;break;case "class":dojo.replaceClass(_161,_15e,this[attr]);break;}},this);},get:function(name){var _163=this._getAttrNames(name);return this[_163.g]?this[_163.g]():this[name];},set:function(name,_164){if(typeof name==="object"){for(var x in name){this.set(x,name[x]);}return this;}var _165=this._getAttrNames(name);if(this[_165.s]){var _166=this[_165.s].apply(this,Array.prototype.slice.call(arguments,1));}else{if(name in this.attributeMap){this._attrToDom(name,_164);}this._set(name,_164);}return _166||this;},_attrPairNames:{},_getAttrNames:function(name){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(name,_167){var _168=this[name];this[name]=_167;if(this._watchCallbacks&&this._created&&_167!==_168){this._watchCallbacks(name,_168,_167);}},toString:function(){return "[Widget "+this.declaredClass+", "+(this.id||"NO ID")+"]";},getDescendants:function(){return this.containerNode?dojo.query("[widgetId]",this.containerNode).map(dijit.byNode):[];},getChildren:function(){return this.containerNode?dijit.findWidgets(this.containerNode):[];},connect:function(obj,_169,_16a){var _16b=[dojo._connect(obj,_169,this,_16a)];this._connects.push(_16b);return _16b;},disconnect:function(_16c){for(var i=0;i<this._connects.length;i++){if(this._connects[i]==_16c){dojo.forEach(_16c,dojo.disconnect);this._connects.splice(i,1);return;}}},subscribe:function(_16d,_16e){var _16f=dojo.subscribe(_16d,this,_16e);this._subscribes.push(_16f);return _16f;},unsubscribe:function(_170){for(var i=0;i<this._subscribes.length;i++){if(this._subscribes[i]==_170){dojo.unsubscribe(_170);this._subscribes.splice(i,1);return;}}},isLeftToRight:function(){return this.dir?(this.dir=="ltr"):dojo._isBodyLtr();},placeAt:function(_171,_172){if(_171.declaredClass&&_171.addChild){_171.addChild(this,_172);}else{dojo.place(this.domNode,_171,_172);}return this;}});})();}if(!dojo._hasResource["dijit._Widget"]){dojo._hasResource["dijit._Widget"]=true;dojo.provide("dijit._Widget");dojo.connect(dojo,"_connect",function(_173,_174){if(_173&&dojo.isFunction(_173._onConnect)){_173._onConnect(_174);}});dijit._connectOnUseEventHandler=function(_175){};dijit._lastKeyDownNode=null;if(dojo.isIE){(function(){var _176=function(evt){dijit._lastKeyDownNode=evt.srcElement;};dojo.doc.attachEvent("onkeydown",_176);dojo.addOnWindowUnload(function(){dojo.doc.detachEvent("onkeydown",_176);});})();}else{dojo.doc.addEventListener("keydown",function(evt){dijit._lastKeyDownNode=evt.target;},true);}(function(){dojo.declare("dijit._Widget",dijit._WidgetBase,{_deferredConnects:{onClick:"",onDblClick:"",onKeyDown:"",onKeyPress:"",onKeyUp:"",onMouseMove:"",onMouseDown:"",onMouseOut:"",onMouseOver:"",onMouseLeave:"",onMouseEnter:"",onMouseUp:""},onClick:dijit._connectOnUseEventHandler,onDblClick:dijit._connectOnUseEventHandler,onKeyDown:dijit._connectOnUseEventHandler,onKeyPress:dijit._connectOnUseEventHandler,onKeyUp:dijit._connectOnUseEventHandler,onMouseDown:dijit._connectOnUseEventHandler,onMouseMove:dijit._connectOnUseEventHandler,onMouseOut:dijit._connectOnUseEventHandler,onMouseOver:dijit._connectOnUseEventHandler,onMouseLeave:dijit._connectOnUseEventHandler,onMouseEnter:dijit._connectOnUseEventHandler,onMouseUp:dijit._connectOnUseEventHandler,create:function(_177,_178){this._deferredConnects=dojo.clone(this._deferredConnects);for(var attr in this.attributeMap){delete this._deferredConnects[attr];}for(attr in this._deferredConnects){if(this[attr]!==dijit._connectOnUseEventHandler){delete this._deferredConnects[attr];}}this.inherited(arguments);if(this.domNode){for(attr in this.params){this._onConnect(attr);}}},_onConnect:function(_179){if(_179 in this._deferredConnects){var _17a=this[this._deferredConnects[_179]||"domNode"];this.connect(_17a,_179.toLowerCase(),_179);delete this._deferredConnects[_179];}},focused:false,isFocusable:function(){return this.focus&&(dojo.style(this.domNode,"display")!="none");},onFocus:function(){},onBlur:function(){},_onFocus:function(e){this.onFocus();},_onBlur:function(){this.onBlur();},setAttribute:function(attr,_17b){dojo.deprecated(this.declaredClass+"::setAttribute(attr, value) is deprecated. Use set() instead.","","2.0");this.set(attr,_17b);},attr:function(name,_17c){if(dojo.config.isDebug){var _17d=arguments.callee._ach||(arguments.callee._ach={}),_17e=(arguments.callee.caller||"unknown caller").toString();if(!_17d[_17e]){dojo.deprecated(this.declaredClass+"::attr() is deprecated. Use get() or set() instead, called from "+_17e,"","2.0");_17d[_17e]=true;}}var args=arguments.length;if(args>=2||typeof name==="object"){return this.set.apply(this,arguments);}else{return this.get(name);}},nodesWithKeyClick:["input","button"],connect:function(obj,_17f,_180){var d=dojo,dc=d._connect,_181=this.inherited(arguments,[obj,_17f=="ondijitclick"?"onclick":_17f,_180]);if(_17f=="ondijitclick"){if(d.indexOf(this.nodesWithKeyClick,obj.nodeName.toLowerCase())==-1){var m=d.hitch(this,_180);_181.push(dc(obj,"onkeydown",this,function(e){if((e.keyCode==d.keys.ENTER||e.keyCode==d.keys.SPACE)&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){dijit._lastKeyDownNode=e.target;if(!("openDropDown" in this&&obj==this._buttonNode)){e.preventDefault();}}}),dc(obj,"onkeyup",this,function(e){if((e.keyCode==d.keys.ENTER||e.keyCode==d.keys.SPACE)&&e.target==dijit._lastKeyDownNode&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){dijit._lastKeyDownNode=null;return m(e);}}));}}return _181;},_onShow:function(){this.onShow();},onShow:function(){},onHide:function(){},onClose:function(){return true;}});})();}if(!dojo._hasResource["dojo.string"]){dojo._hasResource["dojo.string"]=true;dojo.provide("dojo.string");dojo.getObject("string",true,dojo);dojo.string.rep=function(str,num){if(num<=0||!str){return "";}var buf=[];for(;;){if(num&1){buf.push(str);}if(!(num>>=1)){break;}str+=str;}return buf.join("");};dojo.string.pad=function(text,size,ch,end){if(!ch){ch="0";}var out=String(text),pad=dojo.string.rep(ch,Math.ceil((size-out.length)/ch.length));return end?out+pad:pad+out;};dojo.string.substitute=function(_182,map,_183,_184){_184=_184||dojo.global;_183=_183?dojo.hitch(_184,_183):function(v){return v;};return _182.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_185,key,_186){var _187=dojo.getObject(key,false,map);if(_186){_187=dojo.getObject(_186,false,_184).call(_184,_187,key);}return _183(_187,key).toString();});};dojo.string.trim=String.prototype.trim?dojo.trim:function(str){str=str.replace(/^\s+/,"");for(var i=str.length-1;i>=0;i--){if(/\S/.test(str.charAt(i))){str=str.substring(0,i+1);break;}}return str;};}if(!dojo._hasResource["dojo.cache"]){dojo._hasResource["dojo.cache"]=true;dojo.provide("dojo.cache");var cache={};dojo.cache=function(_188,url,_189){if(typeof _188=="string"){var _18a=dojo.moduleUrl(_188,url);}else{_18a=_188;_189=url;}var key=_18a.toString();var val=_189;if(_189!=undefined&&!dojo.isString(_189)){val=("value" in _189?_189.value:undefined);}var _18b=_189&&_189.sanitize?true:false;if(typeof val=="string"){val=cache[key]=_18b?dojo.cache._sanitize(val):val;}else{if(val===null){delete cache[key];}else{if(!(key in cache)){val=dojo._getText(key);cache[key]=_18b?dojo.cache._sanitize(val):val;}val=cache[key];}}return val;};dojo.cache._sanitize=function(val){if(val){val=val.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _18c=val.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_18c){val=_18c[1];}}else{val="";}return val;};}if(!dojo._hasResource["dijit._Templated"]){dojo._hasResource["dijit._Templated"]=true;dojo.provide("dijit._Templated");dojo.declare("dijit._Templated",null,{templateString:null,templatePath:null,widgetsInTemplate:false,_skipNodeCache:false,_earlyTemplatedStartup:false,constructor:function(){this._attachPoints=[];this._attachEvents=[];},_stringRepl:function(tmpl){var _18d=this.declaredClass,_18e=this;return dojo.string.substitute(tmpl,this,function(_18f,key){if(key.charAt(0)=="!"){_18f=dojo.getObject(key.substr(1),false,_18e);}if(typeof _18f=="undefined"){throw new Error(_18d+" template:"+key);}if(_18f==null){return "";}return key.charAt(0)=="!"?_18f:_18f.toString().replace(/"/g,"&quot;");},this);},buildRendering:function(){var _190=dijit._Templated.getCachedTemplate(this.templatePath,this.templateString,this._skipNodeCache);var node;if(dojo.isString(_190)){node=dojo._toDom(this._stringRepl(_190));if(node.nodeType!=1){throw new Error("Invalid template: "+_190);}}else{node=_190.cloneNode(true);}this.domNode=node;this.inherited(arguments);this._attachTemplateNodes(node);if(this.widgetsInTemplate){var cw=(this._startupWidgets=dojo.parser.parse(node,{noStart:!this._earlyTemplatedStartup,template:true,inherited:{dir:this.dir,lang:this.lang},propsThis:this,scope:"dojo"}));this._supportingWidgets=dijit.findWidgets(node);this._attachTemplateNodes(cw,function(n,p){return n[p];});}this._fillContent(this.srcNodeRef);},_fillContent:function(_191){var dest=this.containerNode;if(_191&&dest){while(_191.hasChildNodes()){dest.appendChild(_191.firstChild);}}},_attachTemplateNodes:function(_192,_193){_193=_193||function(n,p){return n.getAttribute(p);};var _194=dojo.isArray(_192)?_192:(_192.all||_192.getElementsByTagName("*"));var x=dojo.isArray(_192)?0:-1;for(;x<_194.length;x++){var _195=(x==-1)?_192:_194[x];if(this.widgetsInTemplate&&(_193(_195,"dojoType")||_193(_195,"data-dojo-type"))){continue;}var _196=_193(_195,"dojoAttachPoint")||_193(_195,"data-dojo-attach-point");if(_196){var _197,_198=_196.split(/\s*,\s*/);while((_197=_198.shift())){if(dojo.isArray(this[_197])){this[_197].push(_195);}else{this[_197]=_195;}this._attachPoints.push(_197);}}var _199=_193(_195,"dojoAttachEvent")||_193(_195,"data-dojo-attach-event");if(_199){var _19a,_19b=_199.split(/\s*,\s*/);var trim=dojo.trim;while((_19a=_19b.shift())){if(_19a){var _19c=null;if(_19a.indexOf(":")!=-1){var _19d=_19a.split(":");_19a=trim(_19d[0]);_19c=trim(_19d[1]);}else{_19a=trim(_19a);}if(!_19c){_19c=_19a;}this._attachEvents.push(this.connect(_195,_19a,_19c));}}}var role=_193(_195,"waiRole");if(role){dijit.setWaiRole(_195,role);}var _19e=_193(_195,"waiState");if(_19e){dojo.forEach(_19e.split(/\s*,\s*/),function(_19f){if(_19f.indexOf("-")!=-1){var pair=_19f.split("-");dijit.setWaiState(_195,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(){dojo.forEach(this._attachPoints,function(_1a0){delete this[_1a0];},this);this._attachPoints=[];dojo.forEach(this._attachEvents,this.disconnect,this);this._attachEvents=[];this.inherited(arguments);}});dijit._Templated._templateCache={};dijit._Templated.getCachedTemplate=function(_1a1,_1a2,_1a3){var _1a4=dijit._Templated._templateCache;var key=_1a2||_1a1;var _1a5=_1a4[key];if(_1a5){try{if(!_1a5.ownerDocument||_1a5.ownerDocument==dojo.doc){return _1a5;}}catch(e){}dojo.destroy(_1a5);}if(!_1a2){_1a2=dojo.cache(_1a1,{sanitize:true});}_1a2=dojo.string.trim(_1a2);if(_1a3||_1a2.match(/\$\{([^\}]+)\}/g)){return (_1a4[key]=_1a2);}else{var node=dojo._toDom(_1a2);if(node.nodeType!=1){throw new Error("Invalid template: "+_1a2);}return (_1a4[key]=node);}};if(dojo.isIE){dojo.addOnWindowUnload(function(){var _1a6=dijit._Templated._templateCache;for(var key in _1a6){var _1a7=_1a6[key];if(typeof _1a7=="object"){dojo.destroy(_1a7);}delete _1a6[key];}});}dojo.extend(dijit._Widget,{dojoAttachEvent:"",dojoAttachPoint:"",waiRole:"",waiState:""});}if(!dojo._hasResource["dijit._Container"]){dojo._hasResource["dijit._Container"]=true;dojo.provide("dijit._Container");dojo.declare("dijit._Container",null,{isContainer:true,buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}},addChild:function(_1a8,_1a9){var _1aa=this.containerNode;if(_1a9&&typeof _1a9=="number"){var _1ab=this.getChildren();if(_1ab&&_1ab.length>=_1a9){_1aa=_1ab[_1a9-1].domNode;_1a9="after";}}dojo.place(_1a8.domNode,_1aa,_1a9);if(this._started&&!_1a8._started){_1a8.startup();}},removeChild:function(_1ac){if(typeof _1ac=="number"){_1ac=this.getChildren()[_1ac];}if(_1ac){var node=_1ac.domNode;if(node&&node.parentNode){node.parentNode.removeChild(node);}}},hasChildren:function(){return this.getChildren().length>0;},destroyDescendants:function(_1ad){dojo.forEach(this.getChildren(),function(_1ae){_1ae.destroyRecursive(_1ad);});},_getSiblingOfChild:function(_1af,dir){var node=_1af.domNode,_1b0=(dir>0?"nextSibling":"previousSibling");do{node=node[_1b0];}while(node&&(node.nodeType!=1||!dijit.byNode(node)));return node&&dijit.byNode(node);},getIndexOfChild:function(_1b1){return dojo.indexOf(this.getChildren(),_1b1);},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_1b2){_1b2.startup();});this.inherited(arguments);}});}if(!dojo._hasResource["dijit._Contained"]){dojo._hasResource["dijit._Contained"]=true;dojo.provide("dijit._Contained");dojo.declare("dijit._Contained",null,{getParent:function(){var _1b3=dijit.getEnclosingWidget(this.domNode.parentNode);return _1b3&&_1b3.isContainer?_1b3:null;},_getSibling:function(_1b4){var node=this.domNode;do{node=node[_1b4+"Sibling"];}while(node&&node.nodeType!=1);return node&&dijit.byNode(node);},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);}});}if(!dojo._hasResource["dijit.layout._LayoutWidget"]){dojo._hasResource["dijit.layout._LayoutWidget"]=true;dojo.provide("dijit.layout._LayoutWidget");dojo.declare("dijit.layout._LayoutWidget",[dijit._Widget,dijit._Container,dijit._Contained],{baseClass:"dijitLayoutContainer",isLayoutContainer:true,buildRendering:function(){this.inherited(arguments);dojo.addClass(this.domNode,"dijitContainer");},startup:function(){if(this._started){return;}this.inherited(arguments);var _1b5=this.getParent&&this.getParent();if(!(_1b5&&_1b5.isLayoutContainer)){this.resize();this.connect(dojo.isIE?this.domNode:dojo.global,"onresize",function(){this.resize();});}},resize:function(_1b6,_1b7){var node=this.domNode;if(_1b6){dojo.marginBox(node,_1b6);if(_1b6.t){node.style.top=_1b6.t+"px";}if(_1b6.l){node.style.left=_1b6.l+"px";}}var mb=_1b7||{};dojo.mixin(mb,_1b6||{});if(!("h" in mb)||!("w" in mb)){mb=dojo.mixin(dojo.marginBox(node),mb);}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};this.layout();},layout:function(){},_setupChild:function(_1b8){var cls=this.baseClass+"-child "+(_1b8.baseClass?this.baseClass+"-"+_1b8.baseClass:"");dojo.addClass(_1b8.domNode,cls);},addChild:function(_1b9,_1ba){this.inherited(arguments);if(this._started){this._setupChild(_1b9);}},removeChild:function(_1bb){var cls=this.baseClass+"-child"+(_1bb.baseClass?" "+this.baseClass+"-"+_1bb.baseClass:"");dojo.removeClass(_1bb.domNode,cls);this.inherited(arguments);}});dijit.layout.marginBox2contentBox=function(node,mb){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 _1bc=function(word){return word.substring(0,1).toUpperCase()+word.substring(1);};var size=function(_1bd,dim){var _1be=_1bd.resize?_1bd.resize(dim):dojo.marginBox(_1bd.domNode,dim);if(_1be){dojo.mixin(_1bd,_1be);}else{dojo.mixin(_1bd,dojo.marginBox(_1bd.domNode));dojo.mixin(_1bd,dim);}};dijit.layout.layoutChildren=function(_1bf,dim,_1c0,_1c1,_1c2){dim=dojo.mixin({},dim);dojo.addClass(_1bf,"dijitLayoutContainer");_1c0=dojo.filter(_1c0,function(item){return item.region!="center"&&item.layoutAlign!="client";}).concat(dojo.filter(_1c0,function(item){return item.region=="center"||item.layoutAlign=="client";}));dojo.forEach(_1c0,function(_1c3){var elm=_1c3.domNode,pos=(_1c3.region||_1c3.layoutAlign);var _1c4=elm.style;_1c4.left=dim.l+"px";_1c4.top=dim.t+"px";_1c4.position="absolute";dojo.addClass(elm,"dijitAlign"+_1bc(pos));var _1c5={};if(_1c1&&_1c1==_1c3.id){_1c5[_1c3.region=="top"||_1c3.region=="bottom"?"h":"w"]=_1c2;}if(pos=="top"||pos=="bottom"){_1c5.w=dim.w;size(_1c3,_1c5);dim.h-=_1c3.h;if(pos=="top"){dim.t+=_1c3.h;}else{_1c4.top=dim.t+dim.h+"px";}}else{if(pos=="left"||pos=="right"){_1c5.h=dim.h;size(_1c3,_1c5);dim.w-=_1c3.w;if(pos=="left"){dim.l+=_1c3.w;}else{_1c4.left=dim.l+dim.w+"px";}}else{if(pos=="client"||pos=="center"){size(_1c3,dim);}}}});};})();}if(!dojo._hasResource["dijit._CssStateMixin"]){dojo._hasResource["dijit._CssStateMixin"]=true;dojo.provide("dijit._CssStateMixin");dojo.declare("dijit._CssStateMixin",[],{cssStateNodes:{},hovering:false,active:false,_applyAttributes:function(){this.inherited(arguments);dojo.forEach(["onmouseenter","onmouseleave","onmousedown"],function(e){this.connect(this.domNode,e,"_cssMouseEvent");},this);dojo.forEach(["disabled","readOnly","checked","selected","focused","state","hovering","active"],function(attr){this.watch(attr,dojo.hitch(this,"_setStateClass"));},this);for(var ap in this.cssStateNodes){this._trackMouseState(this[ap],this.cssStateNodes[ap]);}this._setStateClass();},_cssMouseEvent:function(_1c6){if(!this.disabled){switch(_1c6.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":this._set("active",true);this._mouseDown=true;var _1c7=this.connect(dojo.body(),"onmouseup",function(){this._mouseDown=false;this._set("active",false);this.disconnect(_1c7);});break;}}},_setStateClass:function(){var _1c8=this.baseClass.split(" ");function _1c9(_1ca){_1c8=_1c8.concat(dojo.map(_1c8,function(c){return c+_1ca;}),"dijit"+_1ca);};if(!this.isLeftToRight()){_1c9("Rtl");}if(this.checked){_1c9("Checked");}if(this.state){_1c9(this.state);}if(this.selected){_1c9("Selected");}if(this.disabled){_1c9("Disabled");}else{if(this.readOnly){_1c9("ReadOnly");}else{if(this.active){_1c9("Active");}else{if(this.hovering){_1c9("Hover");}}}}if(this._focused){_1c9("Focused");}var tn=this.stateNode||this.domNode,_1cb={};dojo.forEach(tn.className.split(" "),function(c){_1cb[c]=true;});if("_stateClasses" in this){dojo.forEach(this._stateClasses,function(c){delete _1cb[c];});}dojo.forEach(_1c8,function(c){_1cb[c]=true;});var _1cc=[];for(var c in _1cb){_1cc.push(c);}tn.className=_1cc.join(" ");this._stateClasses=_1c8;},_trackMouseState:function(node,_1cd){var _1ce=false,_1cf=false,_1d0=false;var self=this,cn=dojo.hitch(this,"connect",node);function _1d1(){var _1d2=("disabled" in self&&self.disabled)||("readonly" in self&&self.readonly);dojo.toggleClass(node,_1cd+"Hover",_1ce&&!_1cf&&!_1d2);dojo.toggleClass(node,_1cd+"Active",_1cf&&!_1d2);dojo.toggleClass(node,_1cd+"Focused",_1d0&&!_1d2);};cn("onmouseenter",function(){_1ce=true;_1d1();});cn("onmouseleave",function(){_1ce=false;_1cf=false;_1d1();});cn("onmousedown",function(){_1cf=true;_1d1();});cn("onmouseup",function(){_1cf=false;_1d1();});cn("onfocus",function(){_1d0=true;_1d1();});cn("onblur",function(){_1d0=false;_1d1();});this.watch("disabled",_1d1);this.watch("readOnly",_1d1);}});}if(!dojo._hasResource["dijit.form._FormWidget"]){dojo._hasResource["dijit.form._FormWidget"]=true;dojo.provide("dijit.form._FormWidget");dojo.declare("dijit.form._FormWidget",[dijit._Widget,dijit._Templated,dijit._CssStateMixin],{name:"",alt:"",value:"",type:"text",tabIndex:"0",disabled:false,intermediateChanges:false,scrollOnFocus:true,attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{value:"focusNode",id:"focusNode",tabIndex:"focusNode",alt:"focusNode",title:"focusNode"}),postMixInProperties:function(){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(_1d3){this._set("disabled",_1d3);dojo.attr(this.focusNode,"disabled",_1d3);if(this.valueNode){dojo.attr(this.valueNode,"disabled",_1d3);}dijit.setWaiState(this.focusNode,"disabled",_1d3);if(_1d3){this._set("hovering",false);this._set("active",false);var _1d4="tabIndex" in this.attributeMap?this.attributeMap.tabIndex:"focusNode";dojo.forEach(dojo.isArray(_1d4)?_1d4:[_1d4],function(_1d5){var node=this[_1d5];if(dojo.isWebKit||dijit.hasDefaultTabStop(node)){node.setAttribute("tabIndex","-1");}else{node.removeAttribute("tabIndex");}},this);}else{if(this.tabIndex!=""){this.focusNode.setAttribute("tabIndex",this.tabIndex);}}},setDisabled:function(_1d6){dojo.deprecated("setDisabled("+_1d6+") is deprecated. Use set('disabled',"+_1d6+") instead.","","2.0");this.set("disabled",_1d6);},_onFocus:function(e){if(this.scrollOnFocus){dojo.window.scrollIntoView(this.domNode);}this.inherited(arguments);},isFocusable:function(){return !this.disabled&&this.focusNode&&(dojo.style(this.domNode,"display")!="none");},focus:function(){if(!this.disabled){dijit.focus(this.focusNode);}},compare:function(val1,val2){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(_1d7){},_onChangeActive:false,_handleOnChange:function(_1d8,_1d9){if(this._lastValueReported==undefined&&(_1d9===null||!this._onChangeActive)){this._resetValue=this._lastValueReported=_1d8;}this._pendingOnChange=this._pendingOnChange||(typeof _1d8!=typeof this._lastValueReported)||(this.compare(_1d8,this._lastValueReported)!=0);if((this.intermediateChanges||_1d9||_1d9===undefined)&&this._pendingOnChange){this._lastValueReported=_1d8;this._pendingOnChange=false;if(this._onChangeActive){if(this._onChangeHandle){clearTimeout(this._onChangeHandle);}this._onChangeHandle=setTimeout(dojo.hitch(this,function(){this._onChangeHandle=null;this.onChange(_1d8);}),0);}}},create:function(){this.inherited(arguments);this._onChangeActive=true;},destroy:function(){if(this._onChangeHandle){clearTimeout(this._onChangeHandle);this.onChange(this._lastValueReported);}this.inherited(arguments);},setValue:function(_1da){dojo.deprecated("dijit.form._FormWidget:setValue("+_1da+") is deprecated. Use set('value',"+_1da+") instead.","","2.0");this.set("value",_1da);},getValue:function(){dojo.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},_onMouseDown:function(e){if(!e.ctrlKey&&dojo.mouseButtons.isLeft(e)&&this.isFocusable()){var _1db=this.connect(dojo.body(),"onmouseup",function(){if(this.isFocusable()){this.focus();}this.disconnect(_1db);});}}});dojo.declare("dijit.form._FormValueWidget",dijit.form._FormWidget,{readOnly:false,attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{value:"",readOnly:"focusNode"}),_setReadOnlyAttr:function(_1dc){dojo.attr(this.focusNode,"readOnly",_1dc);dijit.setWaiState(this.focusNode,"readonly",_1dc);this._set("readOnly",_1dc);},postCreate:function(){this.inherited(arguments);if(dojo.isIE<9||(dojo.isIE&&dojo.isQuirks)){this.connect(this.focusNode||this.domNode,"onkeydown",this._onKeyDown);}if(this._resetValue===undefined){this._lastValueReported=this._resetValue=this.value;}},_setValueAttr:function(_1dd,_1de){this._handleOnChange(_1dd,_1de);},_handleOnChange:function(_1df,_1e0){this._set("value",_1df);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==dojo.keys.ESCAPE&&!(e.ctrlKey||e.altKey||e.metaKey)){var te;if(dojo.isIE){e.preventDefault();te=document.createEventObject();te.keyCode=dojo.keys.ESCAPE;te.shiftKey=e.shiftKey;e.srcElement.fireEvent("onkeypress",te);}}},_layoutHackIE7:function(){if(dojo.isIE==7){var _1e1=this.domNode;var _1e2=_1e1.parentNode;var _1e3=_1e1.firstChild||_1e1;var _1e4=_1e3.style.filter;var _1e5=this;while(_1e2&&_1e2.clientHeight==0){(function ping(){var _1e6=_1e5.connect(_1e2,"onscroll",function(e){_1e5.disconnect(_1e6);_1e3.style.filter=(new Date()).getMilliseconds();setTimeout(function(){_1e3.style.filter=_1e4;},0);});})();_1e2=_1e2.parentNode;}}}});}if(!dojo._hasResource["dijit.dijit"]){dojo._hasResource["dijit.dijit"]=true;dojo.provide("dijit.dijit");}if(!dojo._hasResource["dojo.fx.Toggler"]){dojo._hasResource["dojo.fx.Toggler"]=true;dojo.provide("dojo.fx.Toggler");dojo.declare("dojo.fx.Toggler",null,{node:null,showFunc:dojo.fadeIn,hideFunc:dojo.fadeOut,showDuration:200,hideDuration:200,constructor:function(args){var _1e7=this;dojo.mixin(_1e7,args);_1e7.node=args.node;_1e7._showArgs=dojo.mixin({},args);_1e7._showArgs.node=_1e7.node;_1e7._showArgs.duration=_1e7.showDuration;_1e7.showAnim=_1e7.showFunc(_1e7._showArgs);_1e7._hideArgs=dojo.mixin({},args);_1e7._hideArgs.node=_1e7.node;_1e7._hideArgs.duration=_1e7.hideDuration;_1e7.hideAnim=_1e7.hideFunc(_1e7._hideArgs);dojo.connect(_1e7.showAnim,"beforeBegin",dojo.hitch(_1e7.hideAnim,"stop",true));dojo.connect(_1e7.hideAnim,"beforeBegin",dojo.hitch(_1e7.showAnim,"stop",true));},show:function(_1e8){return this.showAnim.play(_1e8||0);},hide:function(_1e9){return this.hideAnim.play(_1e9||0);}});}if(!dojo._hasResource["dojo.fx"]){dojo._hasResource["dojo.fx"]=true;dojo.provide("dojo.fx");(function(){var d=dojo,_1ea={_fire:function(evt,args){if(this[evt]){this[evt].apply(this,args||[]);}return this;}};var _1eb=function(_1ec){this._index=-1;this._animations=_1ec||[];this._current=this._onAnimateCtx=this._onEndCtx=null;this.duration=0;d.forEach(this._animations,function(a){this.duration+=a.duration;if(a.delay){this.duration+=a.delay;}},this);};d.extend(_1eb,{_onAnimate:function(){this._fire("onAnimate",arguments);},_onEnd:function(){d.disconnect(this._onAnimateCtx);d.disconnect(this._onEndCtx);this._onAnimateCtx=this._onEndCtx=null;if(this._index+1==this._animations.length){this._fire("onEnd");}else{this._current=this._animations[++this._index];this._onAnimateCtx=d.connect(this._current,"onAnimate",this,"_onAnimate");this._onEndCtx=d.connect(this._current,"onEnd",this,"_onEnd");this._current.play(0,true);}},play:function(_1ed,_1ee){if(!this._current){this._current=this._animations[this._index=0];}if(!_1ee&&this._current.status()=="playing"){return this;}var _1ef=d.connect(this._current,"beforeBegin",this,function(){this._fire("beforeBegin");}),_1f0=d.connect(this._current,"onBegin",this,function(arg){this._fire("onBegin",arguments);}),_1f1=d.connect(this._current,"onPlay",this,function(arg){this._fire("onPlay",arguments);d.disconnect(_1ef);d.disconnect(_1f0);d.disconnect(_1f1);});if(this._onAnimateCtx){d.disconnect(this._onAnimateCtx);}this._onAnimateCtx=d.connect(this._current,"onAnimate",this,"_onAnimate");if(this._onEndCtx){d.disconnect(this._onEndCtx);}this._onEndCtx=d.connect(this._current,"onEnd",this,"_onEnd");this._current.play.apply(this._current,arguments);return this;},pause:function(){if(this._current){var e=d.connect(this._current,"onPause",this,function(arg){this._fire("onPause",arguments);d.disconnect(e);});this._current.pause();}return this;},gotoPercent:function(_1f2,_1f3){this.pause();var _1f4=this.duration*_1f2;this._current=null;d.some(this._animations,function(a){if(a.duration<=_1f4){this._current=a;return true;}_1f4-=a.duration;return false;});if(this._current){this._current.gotoPercent(_1f4/this._current.duration,_1f3);}return this;},stop:function(_1f5){if(this._current){if(_1f5){for(;this._index+1<this._animations.length;++this._index){this._animations[this._index].stop(true);}this._current=this._animations[this._index];}var e=d.connect(this._current,"onStop",this,function(arg){this._fire("onStop",arguments);d.disconnect(e);});this._current.stop();}return this;},status:function(){return this._current?this._current.status():"stopped";},destroy:function(){if(this._onAnimateCtx){d.disconnect(this._onAnimateCtx);}if(this._onEndCtx){d.disconnect(this._onEndCtx);}}});d.extend(_1eb,_1ea);dojo.fx.chain=function(_1f6){return new _1eb(_1f6);};var _1f7=function(_1f8){this._animations=_1f8||[];this._connects=[];this._finished=0;this.duration=0;d.forEach(_1f8,function(a){var _1f9=a.duration;if(a.delay){_1f9+=a.delay;}if(this.duration<_1f9){this.duration=_1f9;}this._connects.push(d.connect(a,"onEnd",this,"_onEnd"));},this);this._pseudoAnimation=new d.Animation({curve:[0,1],duration:this.duration});var self=this;d.forEach(["beforeBegin","onBegin","onPlay","onAnimate","onPause","onStop","onEnd"],function(evt){self._connects.push(d.connect(self._pseudoAnimation,evt,function(){self._fire(evt,arguments);}));});};d.extend(_1f7,{_doAction:function(_1fa,args){d.forEach(this._animations,function(a){a[_1fa].apply(a,args);});return this;},_onEnd:function(){if(++this._finished>this._animations.length){this._fire("onEnd");}},_call:function(_1fb,args){var t=this._pseudoAnimation;t[_1fb].apply(t,args);},play:function(_1fc,_1fd){this._finished=0;this._doAction("play",arguments);this._call("play",arguments);return this;},pause:function(){this._doAction("pause",arguments);this._call("pause",arguments);return this;},gotoPercent:function(_1fe,_1ff){var ms=this.duration*_1fe;d.forEach(this._animations,function(a){a.gotoPercent(a.duration<ms?1:(ms/a.duration),_1ff);});this._call("gotoPercent",arguments);return this;},stop:function(_200){this._doAction("stop",arguments);this._call("stop",arguments);return this;},status:function(){return this._pseudoAnimation.status();},destroy:function(){d.forEach(this._connects,dojo.disconnect);}});d.extend(_1f7,_1ea);dojo.fx.combine=function(_201){return new _1f7(_201);};dojo.fx.wipeIn=function(args){var node=args.node=d.byId(args.node),s=node.style,o;var anim=d.animateProperty(d.mixin({properties:{height:{start:function(){o=s.overflow;s.overflow="hidden";if(s.visibility=="hidden"||s.display=="none"){s.height="1px";s.display="";s.visibility="";return 1;}else{var _202=d.style(node,"height");return Math.max(_202,1);}},end:function(){return node.scrollHeight;}}}},args));d.connect(anim,"onEnd",function(){s.height="auto";s.overflow=o;});return anim;};dojo.fx.wipeOut=function(args){var node=args.node=d.byId(args.node),s=node.style,o;var anim=d.animateProperty(d.mixin({properties:{height:{end:1}}},args));d.connect(anim,"beforeBegin",function(){o=s.overflow;s.overflow="hidden";s.display="";});d.connect(anim,"onEnd",function(){s.overflow=o;s.height="auto";s.display="none";});return anim;};dojo.fx.slideTo=function(args){var node=args.node=d.byId(args.node),top=null,left=null;var init=(function(n){return function(){var cs=d.getComputedStyle(n);var pos=cs.position;top=(pos=="absolute"?n.offsetTop:parseInt(cs.top)||0);left=(pos=="absolute"?n.offsetLeft:parseInt(cs.left)||0);if(pos!="absolute"&&pos!="relative"){var ret=d.position(n,true);top=ret.y;left=ret.x;n.style.position="absolute";n.style.top=top+"px";n.style.left=left+"px";}};})(node);init();var anim=d.animateProperty(d.mixin({properties:{top:args.top||0,left:args.left||0}},args));d.connect(anim,"beforeBegin",anim,init);return anim;};})();}if(!dojo._hasResource["dojo.NodeList-fx"]){dojo._hasResource["dojo.NodeList-fx"]=true;dojo.provide("dojo.NodeList-fx");dojo.extend(dojo.NodeList,{_anim:function(obj,_203,args){args=args||{};var a=dojo.fx.combine(this.map(function(item){var _204={node:item};dojo.mixin(_204,args);return obj[_203](_204);}));return args.auto?a.play()&&this:a;},wipeIn:function(args){return this._anim(dojo.fx,"wipeIn",args);},wipeOut:function(args){return this._anim(dojo.fx,"wipeOut",args);},slideTo:function(args){return this._anim(dojo.fx,"slideTo",args);},fadeIn:function(args){return this._anim(dojo,"fadeIn",args);},fadeOut:function(args){return this._anim(dojo,"fadeOut",args);},animateProperty:function(args){return this._anim(dojo,"animateProperty",args);},anim:function(_205,_206,_207,_208,_209){var _20a=dojo.fx.combine(this.map(function(item){return dojo.animateProperty({node:item,properties:_205,duration:_206||350,easing:_207});}));if(_208){dojo.connect(_20a,"onEnd",_208);}return _20a.play(_209||0);}});}if(!dojo._hasResource["dojo.colors"]){dojo._hasResource["dojo.colors"]=true;dojo.provide("dojo.colors");dojo.getObject("colors",true,dojo);(function(){var _20b=function(m1,m2,h){if(h<0){++h;}if(h>1){--h;}var h6=6*h;if(h6<1){return m1+(m2-m1)*h6;}if(2*h<1){return m2;}if(3*h<2){return m1+(m2-m1)*(2/3-h)*6;}return m1;};dojo.colorFromRgb=function(_20c,obj){var m=_20c.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);if(m){var c=m[2].split(/\s*,\s*/),l=c.length,t=m[1],a;if((t=="rgb"&&l==3)||(t=="rgba"&&l==4)){var r=c[0];if(r.charAt(r.length-1)=="%"){a=dojo.map(c,function(x){return parseFloat(x)*2.56;});if(l==4){a[3]=c[3];}return dojo.colorFromArray(a,obj);}return dojo.colorFromArray(c,obj);}if((t=="hsl"&&l==3)||(t=="hsla"&&l==4)){var H=((parseFloat(c[0])%360)+360)%360/360,S=parseFloat(c[1])/100,L=parseFloat(c[2])/100,m2=L<=0.5?L*(S+1):L+S-L*S,m1=2*L-m2;a=[_20b(m1,m2,H+1/3)*256,_20b(m1,m2,H)*256,_20b(m1,m2,H-1/3)*256,1];if(l==4){a[3]=c[3];}return dojo.colorFromArray(a,obj);}}return null;};var _20d=function(c,low,high){c=Number(c);return isNaN(c)?high:c<low?low:c>high?high:c;};dojo.Color.prototype.sanitize=function(){var t=this;t.r=Math.round(_20d(t.r,0,255));t.g=Math.round(_20d(t.g,0,255));t.b=Math.round(_20d(t.b,0,255));t.a=_20d(t.a,0,1);return this;};})();dojo.colors.makeGrey=function(g,a){return dojo.colorFromArray([g,g,g,a]);};dojo.mixin(dojo.Color.named,{aliceblue:[240,248,255],antiquewhite:[250,235,215],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],blanchedalmond:[255,235,205],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],oldlace:[253,245,230],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],thistle:[216,191,216],tomato:[255,99,71],transparent:[0,0,0,0],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],whitesmoke:[245,245,245],yellowgreen:[154,205,50]});}if(!dojo._hasResource["dojo.i18n"]){dojo._hasResource["dojo.i18n"]=true;dojo.provide("dojo.i18n");dojo.getObject("i18n",true,dojo);dojo.i18n.getLocalization=dojo.i18n.getLocalization||function(_20e,_20f,_210){_210=dojo.i18n.normalizeLocale(_210);var _211=_210.split("-");var _212=[_20e,"nls",_20f].join(".");var _213=dojo._loadedModules[_212];if(_213){var _214;for(var i=_211.length;i>0;i--){var loc=_211.slice(0,i).join("_");if(_213[loc]){_214=_213[loc];break;}}if(!_214){_214=_213.ROOT;}if(_214){var _215=function(){};_215.prototype=_214;return new _215();}}throw new Error("Bundle not found: "+_20f+" in "+_20e+" , locale="+_210);};dojo.i18n.normalizeLocale=function(_216){var _217=_216?_216.toLowerCase():dojo.locale;if(_217=="root"){_217="ROOT";}return _217;};dojo.i18n._requireLocalization=function(_218,_219,_21a,_21b){var _21c=dojo.i18n.normalizeLocale(_21a);var _21d=[_218,"nls",_219].join(".");var _21e="";if(_21b){var _21f=_21b.split(",");for(var i=0;i<_21f.length;i++){if(_21c["indexOf"](_21f[i])==0){if(_21f[i].length>_21e.length){_21e=_21f[i];}}}if(!_21e){_21e="ROOT";}}var _220=_21b?_21e:_21c;var _221=dojo._loadedModules[_21d];var _222=null;if(_221){if(dojo.config.localizationComplete&&_221._built){return;}var _223=_220.replace(/-/g,"_");var _224=_21d+"."+_223;_222=dojo._loadedModules[_224];}if(!_222){_221=dojo["provide"](_21d);var syms=dojo._getModuleSymbols(_218);var _225=syms.concat("nls").join("/");var _226;dojo.i18n._searchLocalePath(_220,_21b,function(loc){var _227=loc.replace(/-/g,"_");var _228=_21d+"."+_227;var _229=false;if(!dojo._loadedModules[_228]){dojo["provide"](_228);var _22a=[_225];if(loc!="ROOT"){_22a.push(loc);}_22a.push(_219);var _22b=_22a.join("/")+".js";_229=dojo._loadPath(_22b,null,function(hash){hash=hash.root||hash;var _22c=function(){};_22c.prototype=_226;_221[_227]=new _22c();for(var j in hash){_221[_227][j]=hash[j];}});}else{_229=true;}if(_229&&_221[_227]){_226=_221[_227];}else{_221[_227]=_226;}if(_21b){return true;}});}if(_21b&&_21c!=_21e){_221[_21c.replace(/-/g,"_")]=_221[_21e.replace(/-/g,"_")];}};(function(){var _22d=dojo.config.extraLocale;if(_22d){if(!_22d instanceof Array){_22d=[_22d];}var req=dojo.i18n._requireLocalization;dojo.i18n._requireLocalization=function(m,b,_22e,_22f){req(m,b,_22e,_22f);if(_22e){return;}for(var i=0;i<_22d.length;i++){req(m,b,_22d[i],_22f);}};}})();dojo.i18n._searchLocalePath=function(_230,down,_231){_230=dojo.i18n.normalizeLocale(_230);var _232=_230.split("-");var _233=[];for(var i=_232.length;i>0;i--){_233.push(_232.slice(0,i).join("-"));}_233.push(false);if(down){_233.reverse();}for(var j=_233.length-1;j>=0;j--){var loc=_233[j]||"ROOT";var stop=_231(loc);if(stop){break;}}};dojo.i18n._preloadLocalizations=function(_234,_235){function _236(_237){_237=dojo.i18n.normalizeLocale(_237);dojo.i18n._searchLocalePath(_237,true,function(loc){for(var i=0;i<_235.length;i++){if(_235[i]==loc){dojo["require"](_234+"_"+loc);return true;}}return false;});};_236();var _238=dojo.config.extraLocale||[];for(var i=0;i<_238.length;i++){_236(_238[i]);}};}if(!dojo._hasResource["dijit._PaletteMixin"]){dojo._hasResource["dijit._PaletteMixin"]=true;dojo.provide("dijit._PaletteMixin");dojo.declare("dijit._PaletteMixin",[dijit._CssStateMixin],{defaultTimeout:500,timeoutChangeRate:0.9,value:null,_selectedCell:-1,tabIndex:"0",cellClass:"dijitPaletteCell",dyeClass:"",_preparePalette:function(_239,_23a,_23b){this._cells=[];var url=this._blankGif;_23b=_23b||dojo.getObject(this.dyeClass);for(var row=0;row<_239.length;row++){var _23c=dojo.create("tr",{tabIndex:"-1"},this.gridNode);for(var col=0;col<_239[row].length;col++){var _23d=_239[row][col];if(_23d){var _23e=new _23b(_23d,row,col);var _23f=dojo.create("td",{"class":this.cellClass,tabIndex:"-1",title:_23a[_23d]});_23e.fillCell(_23f,url);this.connect(_23f,"ondijitclick","_onCellClick");this._trackMouseState(_23f,this.cellClass);dojo.place(_23f,_23c);_23f.index=this._cells.length;this._cells.push({node:_23f,dye:_23e});}}}this._xDim=_239[0].length;this._yDim=_239.length;var _240={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:this.isLeftToRight()?1:-1,LEFT_ARROW:this.isLeftToRight()?-1:1};for(var key in _240){this._connects.push(dijit.typematic.addKeyListener(this.domNode,{charOrCode:dojo.keys[key],ctrlKey:false,altKey:false,shiftKey:false},this,function(){var _241=_240[key];return function(_242){this._navigateByKey(_241,_242);};}(),this.timeoutChangeRate,this.defaultTimeout));}},postCreate:function(){this.inherited(arguments);this._setCurrent(this._cells[0].node);},focus:function(){dijit.focus(this._currentFocus);},_onCellClick:function(evt){var _243=evt.currentTarget,_244=this._getDye(_243).getValue();this._setCurrent(_243);setTimeout(dojo.hitch(this,function(){dijit.focus(_243);this._setValueAttr(_244,true);}));dojo.removeClass(_243,"dijitPaletteCellHover");dojo.stopEvent(evt);},_setCurrent:function(node){if("_currentFocus" in this){dojo.attr(this._currentFocus,"tabIndex","-1");}this._currentFocus=node;if(node){dojo.attr(node,"tabIndex",this.tabIndex);}},_setValueAttr:function(_245,_246){if(this._selectedCell>=0){dojo.removeClass(this._cells[this._selectedCell].node,"dijitPaletteCellSelected");}this._selectedCell=-1;if(_245){for(var i=0;i<this._cells.length;i++){if(_245==this._cells[i].dye.getValue()){this._selectedCell=i;dojo.addClass(this._cells[i].node,"dijitPaletteCellSelected");break;}}}this._set("value",this._selectedCell>=0?_245:null);if(_246||_246===undefined){this.onChange(_245);}},onChange:function(_247){},_navigateByKey:function(_248,_249){if(_249==-1){return;}var _24a=this._currentFocus.index+_248;if(_24a<this._cells.length&&_24a>-1){var _24b=this._cells[_24a].node;this._setCurrent(_24b);setTimeout(dojo.hitch(dijit,"focus",_24b),0);}},_getDye:function(cell){return this._cells[cell.index].dye;}});}if(!dojo._hasResource["dijit.ColorPalette"]){dojo._hasResource["dijit.ColorPalette"]=true;dojo.provide("dijit.ColorPalette");dojo.declare("dijit.ColorPalette",[dijit._Widget,dijit._Templated,dijit._PaletteMixin],{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: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(){this.inherited(arguments);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,{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":dojo.moduleUrl("dijit.themes","a11y/colors7x10.png"),"3x4":dojo.moduleUrl("dijit.themes","a11y/colors3x4.png")},constructor:function(_24c,row,col){this._alias=_24c;this._row=row;this._col=col;this.setColor(dojo.Color.named[_24c]);},getValue:function(){return this.toHex();},fillCell:function(cell,_24d){var html=dojo.string.substitute(this.hc?this.hcTemplate:this.template,{color:this.toHex(),blankGif:_24d,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"});dojo.place(html,cell);}});}if(!dojo._hasResource["dojo.dnd.common"]){dojo._hasResource["dojo.dnd.common"]=true;dojo.provide("dojo.dnd.common");dojo.getObject("dnd",true,dojo);dojo.dnd.getCopyKeyState=dojo.isCopyKey;dojo.dnd._uniqueId=0;dojo.dnd.getUniqueId=function(){var id;do{id=dojo._scopeName+"Unique"+(++dojo.dnd._uniqueId);}while(dojo.byId(id));return id;};dojo.dnd._empty={};dojo.dnd.isFormElement=function(e){var t=e.target;if(t.nodeType==3){t=t.parentNode;}return " button textarea input select option ".indexOf(" "+t.tagName.toLowerCase()+" ")>=0;};}if(!dojo._hasResource["dojo.dnd.autoscroll"]){dojo._hasResource["dojo.dnd.autoscroll"]=true;dojo.provide("dojo.dnd.autoscroll");dojo.getObject("dnd",true,dojo);dojo.dnd.getViewport=dojo.window.getBox;dojo.dnd.V_TRIGGER_AUTOSCROLL=32;dojo.dnd.H_TRIGGER_AUTOSCROLL=32;dojo.dnd.V_AUTOSCROLL_VALUE=16;dojo.dnd.H_AUTOSCROLL_VALUE=16;dojo.dnd.autoScroll=function(e){var v=dojo.window.getBox(),dx=0,dy=0;if(e.clientX<dojo.dnd.H_TRIGGER_AUTOSCROLL){dx=-dojo.dnd.H_AUTOSCROLL_VALUE;}else{if(e.clientX>v.w-dojo.dnd.H_TRIGGER_AUTOSCROLL){dx=dojo.dnd.H_AUTOSCROLL_VALUE;}}if(e.clientY<dojo.dnd.V_TRIGGER_AUTOSCROLL){dy=-dojo.dnd.V_AUTOSCROLL_VALUE;}else{if(e.clientY>v.h-dojo.dnd.V_TRIGGER_AUTOSCROLL){dy=dojo.dnd.V_AUTOSCROLL_VALUE;}}window.scrollBy(dx,dy);};dojo.dnd._validNodes={"div":1,"p":1,"td":1};dojo.dnd._validOverflow={"auto":1,"scroll":1};dojo.dnd.autoScrollNodes=function(e){for(var n=e.target;n;){if(n.nodeType==1&&(n.tagName.toLowerCase() in dojo.dnd._validNodes)){var s=dojo.getComputedStyle(n);if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){var b=dojo._getContentBox(n,s),t=dojo.position(n,true);var w=Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL,b.w/2),h=Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL,b.h/2),rx=e.pageX-t.x,ry=e.pageY-t.y,dx=0,dy=0;if(dojo.isWebKit||dojo.isOpera){rx+=dojo.body().scrollLeft;ry+=dojo.body().scrollTop;}if(rx>0&&rx<b.w){if(rx<w){dx=-w;}else{if(rx>b.w-w){dx=w;}}}if(ry>0&&ry<b.h){if(ry<h){dy=-h;}else{if(ry>b.h-h){dy=h;}}}var _24e=n.scrollLeft,_24f=n.scrollTop;n.scrollLeft=n.scrollLeft+dx;n.scrollTop=n.scrollTop+dy;if(_24e!=n.scrollLeft||_24f!=n.scrollTop){return;}}}try{n=n.parentNode;}catch(x){n=null;}}dojo.dnd.autoScroll(e);};}if(!dojo._hasResource["dojo.dnd.Mover"]){dojo._hasResource["dojo.dnd.Mover"]=true;dojo.provide("dojo.dnd.Mover");dojo.declare("dojo.dnd.Mover",null,{constructor:function(node,e,host){this.node=dojo.byId(node);var pos=e.touches?e.touches[0]:e;this.marginBox={l:pos.pageX,t:pos.pageY};this.mouseButton=e.button;var h=(this.host=host),d=node.ownerDocument;this.events=[dojo.connect(d,"onmousemove",this,"onFirstMove"),dojo.connect(d,"ontouchmove",this,"onFirstMove"),dojo.connect(d,"onmousemove",this,"onMouseMove"),dojo.connect(d,"ontouchmove",this,"onMouseMove"),dojo.connect(d,"onmouseup",this,"onMouseUp"),dojo.connect(d,"ontouchend",this,"onMouseUp"),dojo.connect(d,"ondragstart",dojo.stopEvent),dojo.connect(d.body,"onselectstart",dojo.stopEvent)];if(h&&h.onMoveStart){h.onMoveStart(this);}},onMouseMove:function(e){dojo.dnd.autoScroll(e);var m=this.marginBox,pos=e.touches?e.touches[0]:e;this.host.onMove(this,{l:m.l+pos.pageX,t:m.t+pos.pageY},e);dojo.stopEvent(e);},onMouseUp:function(e){if(dojo.isWebKit&&dojo.isMac&&this.mouseButton==2?e.button==0:this.mouseButton==e.button){this.destroy();}dojo.stopEvent(e);},onFirstMove:function(e){var s=this.node.style,l,t,h=this.host;switch(s.position){case "relative":case "absolute":l=Math.round(parseFloat(s.left))||0;t=Math.round(parseFloat(s.top))||0;break;default:s.position="absolute";var m=dojo.marginBox(this.node);var b=dojo.doc.body;var bs=dojo.getComputedStyle(b);var bm=dojo._getMarginBox(b,bs);var bc=dojo._getContentBox(b,bs);l=m.l-(bc.l-bm.l);t=m.t-(bc.t-bm.t);break;}this.marginBox.l=l-this.marginBox.l;this.marginBox.t=t-this.marginBox.t;if(h&&h.onFirstMove){h.onFirstMove(this,e);}dojo.disconnect(this.events.shift());dojo.disconnect(this.events.shift());},destroy:function(){dojo.forEach(this.events,dojo.disconnect);var h=this.host;if(h&&h.onMoveStop){h.onMoveStop(this);}this.events=this.node=this.host=null;}});}if(!dojo._hasResource["dojo.dnd.Moveable"]){dojo._hasResource["dojo.dnd.Moveable"]=true;dojo.provide("dojo.dnd.Moveable");dojo.declare("dojo.dnd.Moveable",null,{handle:"",delay:0,skip:false,constructor:function(node,_250){this.node=dojo.byId(node);if(!_250){_250={};}this.handle=_250.handle?dojo.byId(_250.handle):null;if(!this.handle){this.handle=this.node;}this.delay=_250.delay>0?_250.delay:0;this.skip=_250.skip;this.mover=_250.mover?_250.mover:dojo.dnd.Mover;this.events=[dojo.connect(this.handle,"onmousedown",this,"onMouseDown"),dojo.connect(this.handle,"ontouchstart",this,"onMouseDown"),dojo.connect(this.handle,"ondragstart",this,"onSelectStart"),dojo.connect(this.handle,"onselectstart",this,"onSelectStart")];},markupFactory:function(_251,node){return new dojo.dnd.Moveable(node,_251);},destroy:function(){dojo.forEach(this.events,dojo.disconnect);this.events=this.node=this.handle=null;},onMouseDown:function(e){if(this.skip&&dojo.dnd.isFormElement(e)){return;}if(this.delay){this.events.push(dojo.connect(this.handle,"onmousemove",this,"onMouseMove"),dojo.connect(this.handle,"ontouchmove",this,"onMouseMove"),dojo.connect(this.handle,"onmouseup",this,"onMouseUp"),dojo.connect(this.handle,"ontouchend",this,"onMouseUp"));var pos=e.touches?e.touches[0]:e;this._lastX=pos.pageX;this._lastY=pos.pageY;}else{this.onDragDetected(e);}dojo.stopEvent(e);},onMouseMove:function(e){var pos=e.touches?e.touches[0]:e;if(Math.abs(pos.pageX-this._lastX)>this.delay||Math.abs(pos.pageY-this._lastY)>this.delay){this.onMouseUp(e);this.onDragDetected(e);}dojo.stopEvent(e);},onMouseUp:function(e){for(var i=0;i<2;++i){dojo.disconnect(this.events.pop());}dojo.stopEvent(e);},onSelectStart:function(e){if(!this.skip||!dojo.dnd.isFormElement(e)){dojo.stopEvent(e);}},onDragDetected:function(e){new this.mover(this.node,e,this);},onMoveStart:function(_252){dojo.publish("/dnd/move/start",[_252]);dojo.addClass(dojo.body(),"dojoMove");dojo.addClass(this.node,"dojoMoveItem");},onMoveStop:function(_253){dojo.publish("/dnd/move/stop",[_253]);dojo.removeClass(dojo.body(),"dojoMove");dojo.removeClass(this.node,"dojoMoveItem");},onFirstMove:function(_254,e){},onMove:function(_255,_256,e){this.onMoving(_255,_256);var s=_255.node.style;s.left=_256.l+"px";s.top=_256.t+"px";this.onMoved(_255,_256);},onMoving:function(_257,_258){},onMoved:function(_259,_25a){}});}if(!dojo._hasResource["dojo.dnd.move"]){dojo._hasResource["dojo.dnd.move"]=true;dojo.provide("dojo.dnd.move");dojo.declare("dojo.dnd.move.constrainedMoveable",dojo.dnd.Moveable,{constraints:function(){},within:false,markupFactory:function(_25b,node){return new dojo.dnd.move.constrainedMoveable(node,_25b);},constructor:function(node,_25c){if(!_25c){_25c={};}this.constraints=_25c.constraints;this.within=_25c.within;},onFirstMove:function(_25d){var c=this.constraintBox=this.constraints.call(this,_25d);c.r=c.l+c.w;c.b=c.t+c.h;if(this.within){var mb=dojo._getMarginSize(_25d.node);c.r-=mb.w;c.b-=mb.h;}},onMove:function(_25e,_25f){var c=this.constraintBox,s=_25e.node.style;this.onMoving(_25e,_25f);_25f.l=_25f.l<c.l?c.l:c.r<_25f.l?c.r:_25f.l;_25f.t=_25f.t<c.t?c.t:c.b<_25f.t?c.b:_25f.t;s.left=_25f.l+"px";s.top=_25f.t+"px";this.onMoved(_25e,_25f);}});dojo.declare("dojo.dnd.move.boxConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{box:{},markupFactory:function(_260,node){return new dojo.dnd.move.boxConstrainedMoveable(node,_260);},constructor:function(node,_261){var box=_261&&_261.box;this.constraints=function(){return box;};}});dojo.declare("dojo.dnd.move.parentConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{area:"content",markupFactory:function(_262,node){return new dojo.dnd.move.parentConstrainedMoveable(node,_262);},constructor:function(node,_263){var area=_263&&_263.area;this.constraints=function(){var n=this.node.parentNode,s=dojo.getComputedStyle(n),mb=dojo._getMarginBox(n,s);if(area=="margin"){return mb;}var t=dojo._getMarginExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(area=="border"){return mb;}t=dojo._getBorderExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(area=="padding"){return mb;}t=dojo._getPadExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;return mb;};}});dojo.dnd.constrainedMover=dojo.dnd.move.constrainedMover;dojo.dnd.boxConstrainedMover=dojo.dnd.move.boxConstrainedMover;dojo.dnd.parentConstrainedMover=dojo.dnd.move.parentConstrainedMover;}if(!dojo._hasResource["dojo.dnd.TimedMoveable"]){dojo._hasResource["dojo.dnd.TimedMoveable"]=true;dojo.provide("dojo.dnd.TimedMoveable");(function(){var _264=dojo.dnd.Moveable.prototype.onMove;dojo.declare("dojo.dnd.TimedMoveable",dojo.dnd.Moveable,{timeout:40,constructor:function(node,_265){if(!_265){_265={};}if(_265.timeout&&typeof _265.timeout=="number"&&_265.timeout>=0){this.timeout=_265.timeout;}},markupFactory:function(_266,node){return new dojo.dnd.TimedMoveable(node,_266);},onMoveStop:function(_267){if(_267._timer){clearTimeout(_267._timer);_264.call(this,_267,_267._leftTop);}dojo.dnd.Moveable.prototype.onMoveStop.apply(this,arguments);},onMove:function(_268,_269){_268._leftTop=_269;if(!_268._timer){var _26a=this;_268._timer=setTimeout(function(){_268._timer=null;_264.call(_26a,_268,_268._leftTop);},this.timeout);}}});})();}if(!dojo._hasResource["dijit.form._FormMixin"]){dojo._hasResource["dijit.form._FormMixin"]=true;dojo.provide("dijit.form._FormMixin");dojo.declare("dijit.form._FormMixin",null,{state:"",reset:function(){dojo.forEach(this.getDescendants(),function(_26b){if(_26b.reset){_26b.reset();}});},validate:function(){var _26c=false;return dojo.every(dojo.map(this.getDescendants(),function(_26d){_26d._hasBeenBlurred=true;var _26e=_26d.disabled||!_26d.validate||_26d.validate();if(!_26e&&!_26c){dojo.window.scrollIntoView(_26d.containerNode||_26d.domNode);_26d.focus();_26c=true;}return _26e;}),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(obj){var map={};dojo.forEach(this.getDescendants(),function(_26f){if(!_26f.name){return;}var _270=map[_26f.name]||(map[_26f.name]=[]);_270.push(_26f);});for(var name in map){if(!map.hasOwnProperty(name)){continue;}var _271=map[name],_272=dojo.getObject(name,false,obj);if(_272===undefined){continue;}if(!dojo.isArray(_272)){_272=[_272];}if(typeof _271[0].checked=="boolean"){dojo.forEach(_271,function(w,i){w.set("value",dojo.indexOf(_272,w.value)!=-1);});}else{if(_271[0].multiple){_271[0].set("value",_272);}else{dojo.forEach(_271,function(w,i){w.set("value",_272[i]);});}}}},getValues:function(){dojo.deprecated(this.declaredClass+"::getValues() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},_getValueAttr:function(){var obj={};dojo.forEach(this.getDescendants(),function(_273){var name=_273.name;if(!name||_273.disabled){return;}var _274=_273.get("value");if(typeof _273.checked=="boolean"){if(/Radio/.test(_273.declaredClass)){if(_274!==false){dojo.setObject(name,_274,obj);}else{_274=dojo.getObject(name,false,obj);if(_274===undefined){dojo.setObject(name,null,obj);}}}else{var ary=dojo.getObject(name,false,obj);if(!ary){ary=[];dojo.setObject(name,ary,obj);}if(_274!==false){ary.push(_274);}}}else{var prev=dojo.getObject(name,false,obj);if(typeof prev!="undefined"){if(dojo.isArray(prev)){prev.push(_274);}else{dojo.setObject(name,[prev,_274],obj);}}else{dojo.setObject(name,_274,obj);}}});return obj;},isValid:function(){return this.state=="";},onValidStateChange:function(_275){},_getState:function(){var _276=dojo.map(this._descendants,function(w){return w.get("state")||"";});return dojo.indexOf(_276,"Error")>=0?"Error":dojo.indexOf(_276,"Incomplete")>=0?"Incomplete":"";},disconnectChildren:function(){dojo.forEach(this._childConnections||[],dojo.hitch(this,"disconnect"));dojo.forEach(this._childWatches||[],function(w){w.unwatch();});},connectChildren:function(_277){var _278=this;this.disconnectChildren();this._descendants=this.getDescendants();var set=_277?function(name,val){_278[name]=val;}:dojo.hitch(this,"_set");set("value",this.get("value"));set("state",this._getState());var _279=(this._childConnections=[]),_27a=(this._childWatches=[]);dojo.forEach(dojo.filter(this._descendants,function(item){return item.validate;}),function(_27b){dojo.forEach(["state","disabled"],function(attr){_27a.push(_27b.watch(attr,function(attr,_27c,_27d){_278.set("state",_278._getState());}));});});var _27e=function(){if(_278._onChangeDelayTimer){clearTimeout(_278._onChangeDelayTimer);}_278._onChangeDelayTimer=setTimeout(function(){delete _278._onChangeDelayTimer;_278._set("value",_278.get("value"));},10);};dojo.forEach(dojo.filter(this._descendants,function(item){return item.onChange;}),function(_27f){_279.push(_278.connect(_27f,"onChange",_27e));_27a.push(_27f.watch("disabled",_27e));});},startup:function(){this.inherited(arguments);this.connectChildren(true);this.watch("state",function(attr,_280,_281){this.onValidStateChange(_281=="");});},destroy:function(){this.disconnectChildren();this.inherited(arguments);}});}if(!dojo._hasResource["dijit._DialogMixin"]){dojo._hasResource["dijit._DialogMixin"]=true;dojo.provide("dijit._DialogMixin");dojo.declare("dijit._DialogMixin",null,{attributeMap:dijit._Widget.prototype.attributeMap,execute:function(_282){},onCancel:function(){},onExecute:function(){},_onSubmit:function(){this.onExecute();this.execute(this.get("value"));},_getFocusItems:function(){var _283=dijit._getTabNavigable(this.containerNode);this._firstFocusItem=_283.lowest||_283.first||this.closeButtonNode||this.domNode;this._lastFocusItem=_283.last||_283.highest||this._firstFocusItem;}});}if(!dojo._hasResource["dijit.DialogUnderlay"]){dojo._hasResource["dijit.DialogUnderlay"]=true;dojo.provide("dijit.DialogUnderlay");dojo.declare("dijit.DialogUnderlay",[dijit._Widget,dijit._Templated],{templateString:"<div class='dijitDialogUnderlayWrapper'><div class='dijitDialogUnderlay' dojoAttachPoint='node'></div></div>",dialogId:"","class":"",attributeMap:{id:"domNode"},_setDialogIdAttr:function(id){dojo.attr(this.node,"id",id+"_underlay");this._set("dialogId",id);},_setClassAttr:function(_284){this.node.className="dijitDialogUnderlay "+_284;this._set("class",_284);},postCreate:function(){dojo.body().appendChild(this.domNode);},layout:function(){var is=this.node.style,os=this.domNode.style;os.display="none";var _285=dojo.window.getBox();os.top=_285.t+"px";os.left=_285.l+"px";is.width=_285.w+"px";is.height=_285.h+"px";os.display="block";},show:function(){this.domNode.style.display="block";this.layout();this.bgIframe=new dijit.BackgroundIframe(this.domNode);},hide:function(){this.bgIframe.destroy();delete this.bgIframe;this.domNode.style.display="none";}});}if(!dojo._hasResource["dijit.layout._ContentPaneResizeMixin"]){dojo._hasResource["dijit.layout._ContentPaneResizeMixin"]=true;dojo.provide("dijit.layout._ContentPaneResizeMixin");dojo.declare("dijit.layout._ContentPaneResizeMixin",null,{doLayout:true,isContainer:true,isLayoutContainer:true,_startChildren:function(){dojo.forEach(this.getChildren(),function(_286){_286.startup();_286._started=true;});},startup:function(){if(this._started){return;}var _287=dijit._Contained.prototype.getParent.call(this);this._childOfLayoutWidget=_287&&_287.isLayoutContainer;this._needLayout=!this._childOfLayoutWidget;this.inherited(arguments);this._startChildren();if(this._isShown()){this._onShow();}if(!this._childOfLayoutWidget){this.connect(dojo.isIE?this.domNode:dojo.global,"onresize",function(){this._needLayout=!this._childOfLayoutWidget;this.resize();});}},_checkIfSingleChild:function(){var _288=dojo.query("> *",this.containerNode).filter(function(node){return node.tagName!=="SCRIPT";}),_289=_288.filter(function(node){return dojo.hasAttr(node,"data-dojo-type")||dojo.hasAttr(node,"dojoType")||dojo.hasAttr(node,"widgetId");}),_28a=dojo.filter(_289.map(dijit.byNode),function(_28b){return _28b&&_28b.domNode&&_28b.resize;});if(_288.length==_289.length&&_28a.length==1){this._singleChild=_28a[0];}else{delete this._singleChild;}dojo.toggleClass(this.containerNode,this.baseClass+"SingleChild",!!this._singleChild);},resize:function(_28c,_28d){if(!this._wasShown&&this.open!==false){this._onShow();}this._resizeCalled=true;this._scheduleLayout(_28c,_28d);},_scheduleLayout:function(_28e,_28f){if(this._isShown()){this._layout(_28e,_28f);}else{this._needLayout=true;this._changeSize=_28e;this._resultSize=_28f;}},_layout:function(_290,_291){if(_290){dojo.marginBox(this.domNode,_290);}var cn=this.containerNode;if(cn===this.domNode){var mb=_291||{};dojo.mixin(mb,_290||{});if(!("h" in mb)||!("w" in mb)){mb=dojo.mixin(dojo.marginBox(cn),mb);}this._contentBox=dijit.layout.marginBox2contentBox(cn,mb);}else{this._contentBox=dojo.contentBox(cn);}this._layoutChildren();delete this._needLayout;},_layoutChildren:function(){if(this.doLayout){this._checkIfSingleChild();}if(this._singleChild&&this._singleChild.resize){var cb=this._contentBox||dojo.contentBox(this.containerNode);this._singleChild.resize({w:cb.w,h:cb.h});}else{dojo.forEach(this.getChildren(),function(_292){if(_292.resize){_292.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 node=this.domNode,_293=this.domNode.parentNode;return (node.style.display!="none")&&(node.style.visibility!="hidden")&&!dojo.hasClass(node,"dijitHidden")&&_293&&_293.style&&(_293.style.display!="none");}}},_onShow:function(){if(this._needLayout){this._layout(this._changeSize,this._resultSize);}this.inherited(arguments);this._wasShown=true;}});}if(!dojo._hasResource["dojo.html"]){dojo._hasResource["dojo.html"]=true;dojo.provide("dojo.html");dojo.getObject("html",true,dojo);(function(){var _294=0,d=dojo;dojo.html._secureForInnerHtml=function(cont){return cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig,"");};dojo.html._emptyNode=dojo.empty;dojo.html._setNodeContent=function(node,cont){d.empty(node);if(cont){if(typeof cont=="string"){cont=d._toDom(cont,node.ownerDocument);}if(!cont.nodeType&&d.isArrayLike(cont)){for(var _295=cont.length,i=0;i<cont.length;i=_295==cont.length?i+1:0){d.place(cont[i],node,"last");}}else{d.place(cont,node,"last");}}return node;};dojo.declare("dojo.html._ContentSetter",null,{node:"",content:"",id:"",cleanContent:false,extractContent:false,parseContent:false,parserScope:dojo._scopeName,startup:true,constructor:function(_296,node){dojo.mixin(this,_296||{});node=this.node=dojo.byId(this.node||node);if(!this.id){this.id=["Setter",(node)?node.id||node.tagName:"",_294++].join("_");}},set:function(cont,_297){if(undefined!==cont){this.content=cont;}if(_297){this._mixin(_297);}this.onBegin();this.setContent();this.onEnd();return this.node;},setContent:function(){var node=this.node;if(!node){throw new Error(this.declaredClass+": setContent given no node");}try{node=dojo.html._setNodeContent(node,this.content);}catch(e){var _298=this.onContentError(e);try{node.innerHTML=_298;}catch(e){console.error("Fatal "+this.declaredClass+".setContent could not change content due to "+e.message,e);}}this.node=node;},empty:function(){if(this.parseResults&&this.parseResults.length){dojo.forEach(this.parseResults,function(w){if(w.destroy){w.destroy();}});delete this.parseResults;}dojo.html._emptyNode(this.node);},onBegin:function(){var cont=this.content;if(dojo.isString(cont)){if(this.cleanContent){cont=dojo.html._secureForInnerHtml(cont);}if(this.extractContent){var _299=cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_299){cont=_299[1];}}}this.empty();this.content=cont;return this.node;},onEnd:function(){if(this.parseContent){this._parse();}return this.node;},tearDown:function(){delete this.parseResults;delete this.node;delete this.content;},onContentError:function(err){return "Error occured setting content: "+err;},_mixin:function(_29a){var _29b={},key;for(key in _29a){if(key in _29b){continue;}this[key]=_29a[key];}},_parse:function(){var _29c=this.node;try{var _29d={};dojo.forEach(["dir","lang","textDir"],function(name){if(this[name]){_29d[name]=this[name];}},this);this.parseResults=dojo.parser.parse({rootNode:_29c,noStart:!this.startup,inherited:_29d,scope:this.parserScope});}catch(e){this._onError("Content",e,"Error parsing in _ContentSetter#"+this.id);}},_onError:function(type,err,_29e){var _29f=this["on"+type+"Error"].call(this,err);if(_29e){console.error(_29e,err);}else{if(_29f){dojo.html._setNodeContent(this.node,_29f,true);}}}});dojo.html.set=function(node,cont,_2a0){if(undefined==cont){console.warn("dojo.html.set: no cont argument provided, using empty string");cont="";}if(!_2a0){return dojo.html._setNodeContent(node,cont,true);}else{var op=new dojo.html._ContentSetter(dojo.mixin(_2a0,{content:cont,node:node}));return op.set();}};})();}if(!dojo._hasResource["dijit.layout.ContentPane"]){dojo._hasResource["dijit.layout.ContentPane"]=true;dojo.provide("dijit.layout.ContentPane");dojo.declare("dijit.layout.ContentPane",[dijit._Widget,dijit.layout._ContentPaneResizeMixin],{href:"",extractContent:false,parseOnLoad:true,parserScope:dojo._scopeName,preventCache:false,preload:false,refreshOnShow:false,loadingMessage:"<span class='dijitContentPaneLoading'>${loadingState}</span>",errorMessage:"<span class='dijitContentPaneError'>${errorState}</span>",isLoaded:false,baseClass:"dijitContentPane",ioArgs:{},onLoadDeferred:null,attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{title:[]}),stopParser:true,template:false,create:function(_2a1,_2a2){if((!_2a1||!_2a1.template)&&_2a2&&!("href" in _2a1)&&!("content" in _2a1)){var df=dojo.doc.createDocumentFragment();_2a2=dojo.byId(_2a2);while(_2a2.firstChild){df.appendChild(_2a2.firstChild);}_2a1=dojo.delegate(_2a1,{content:df});}this.inherited(arguments,[_2a1,_2a2]);},postMixInProperties:function(){this.inherited(arguments);var _2a3=dojo.i18n.getLocalization("dijit","loading",this.lang);this.loadingMessage=dojo.string.substitute(this.loadingMessage,_2a3);this.errorMessage=dojo.string.substitute(this.errorMessage,_2a3);},buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}this.domNode.title="";if(!dojo.attr(this.domNode,"role")){dijit.setWaiRole(this.domNode,"group");}},_startChildren:function(){this.inherited(arguments);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(href){dojo.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.","","2.0");return this.set("href",href);},_setHrefAttr:function(href){this.cancel();this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));this.onLoadDeferred.addCallback(dojo.hitch(this,"onLoad"));this._set("href",href);if(this.preload||(this._created&&this._isShown())){this._load();}else{this._hrefChanged=true;}return this.onLoadDeferred;},setContent:function(data){dojo.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.","","2.0");this.set("content",data);},_setContentAttr:function(data){this._set("href","");this.cancel();this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));if(this._created){this.onLoadDeferred.addCallback(dojo.hitch(this,"onLoad"));}this._setContent(data||"");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(_2a4){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 dojo.Deferred(dojo.hitch(this,"cancel"));this.onLoadDeferred.addCallback(dojo.hitch(this,"onLoad"));this._load();return this.onLoadDeferred;},_load:function(){this._setContent(this.onDownloadStart(),true);var self=this;var _2a5={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};if(dojo.isObject(this.ioArgs)){dojo.mixin(_2a5,this.ioArgs);}var hand=(this._xhrDfd=(this.ioMethod||dojo.xhrGet)(_2a5));hand.addCallback(function(html){try{self._isDownloaded=true;self._setContent(html,false);self.onDownloadEnd();}catch(err){self._onError("Content",err);}delete self._xhrDfd;return html;});hand.addErrback(function(err){if(!hand.canceled){self._onError("Download",err);}delete self._xhrDfd;return err;});delete this._hrefChanged;},_onLoadHandler:function(data){this._set("isLoaded",true);try{this.onLoadDeferred.callback(data);}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(){if(this.isLoaded){this._onUnloadHandler();}var _2a6=this._contentSetter;dojo.forEach(this.getChildren(),function(_2a7){if(_2a7.destroyRecursive){_2a7.destroyRecursive();}});if(_2a6){dojo.forEach(_2a6.parseResults,function(_2a8){if(_2a8.destroyRecursive&&_2a8.domNode&&_2a8.domNode.parentNode==dojo.body()){_2a8.destroyRecursive();}});delete _2a6.parseResults;}dojo.html._emptyNode(this.containerNode);delete this._singleChild;},_setContent:function(cont,_2a9){this.destroyDescendants();var _2aa=this._contentSetter;if(!(_2aa&&_2aa instanceof dojo.html._ContentSetter)){_2aa=this._contentSetter=new dojo.html._ContentSetter({node:this.containerNode,_onError:dojo.hitch(this,this._onError),onContentError:dojo.hitch(this,function(e){var _2ab=this.onContentError(e);try{this.containerNode.innerHTML=_2ab;}catch(e){console.error("Fatal "+this.id+" could not change content due to "+e.message,e);}})});}var _2ac=dojo.mixin({cleanContent:this.cleanContent,extractContent:this.extractContent,parseContent:this.parseOnLoad,parserScope:this.parserScope,startup:false,dir:this.dir,lang:this.lang},this._contentSetterParams||{});_2aa.set((dojo.isObject(cont)&&cont.domNode)?cont.domNode:cont,_2ac);delete this._contentSetterParams;if(this.doLayout){this._checkIfSingleChild();}if(!_2a9){if(this._started){this._startChildren();this._scheduleLayout();}this._onLoadHandler(cont);}},_onError:function(type,err,_2ad){this.onLoadDeferred.errback(err);var _2ae=this["on"+type+"Error"].call(this,err);if(_2ad){console.error(_2ad,err);}else{if(_2ae){this._setContent(_2ae,true);}}},onLoad:function(data){},onUnload:function(){},onDownloadStart:function(){return this.loadingMessage;},onContentError:function(_2af){},onDownloadError:function(_2b0){return this.errorMessage;},onDownloadEnd:function(){}});}if(!dojo._hasResource["dijit.TooltipDialog"]){dojo._hasResource["dijit.TooltipDialog"]=true;dojo.provide("dijit.TooltipDialog");dojo.declare("dijit.TooltipDialog",[dijit.layout.ContentPane,dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin],{title:"",doLayout:false,autofocus:true,baseClass:"dijitTooltipDialog",_firstFocusItem:null,_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(_2b1){this.containerNode.title=_2b1;this._set("title",_2b1);},postCreate:function(){this.inherited(arguments);this.connect(this.containerNode,"onkeypress","_onKey");},orient:function(node,_2b2,_2b3){var newC="dijitTooltipAB"+(_2b3.charAt(1)=="L"?"Left":"Right")+" dijitTooltip"+(_2b3.charAt(0)=="T"?"Below":"Above");dojo.replaceClass(this.domNode,newC,this._currentOrientClass||"");this._currentOrientClass=newC;},focus:function(){this._getFocusItems(this.containerNode);dijit.focus(this._firstFocusItem);},onOpen:function(pos){this.orient(this.domNode,pos.aroundCorner,pos.corner);this._onShow();},onClose:function(){this.onHide();},_onKey:function(evt){var node=evt.target;var dk=dojo.keys;if(evt.charOrCode===dk.TAB){this._getFocusItems(this.containerNode);}var _2b4=(this._firstFocusItem==this._lastFocusItem);if(evt.charOrCode==dk.ESCAPE){setTimeout(dojo.hitch(this,"onCancel"),0);dojo.stopEvent(evt);}else{if(node==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===dk.TAB){if(!_2b4){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.charOrCode===dk.TAB&&!evt.shiftKey){if(!_2b4){dijit.focus(this._firstFocusItem);}dojo.stopEvent(evt);}else{if(evt.charOrCode===dk.TAB){evt.stopPropagation();}}}}}});}if(!dojo._hasResource["dijit.Dialog"]){dojo._hasResource["dijit.Dialog"]=true;dojo.provide("dijit.Dialog");dojo.declare("dijit._DialogBase",[dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin,dijit._CssStateMixin],{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:false,duration:dijit.defaultDuration,refocus:true,autofocus:true,_firstFocusItem:null,_lastFocusItem:null,doLayout:false,draggable:true,"aria-describedby":"",postMixInProperties:function(){var _2b5=dojo.i18n.getLocalization("dijit","common");dojo.mixin(this,_2b5);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(){this._position();if(this.autofocus&&dijit._DialogLevelManager.isTop(this)){this._getFocusItems(this.domNode);dijit.focus(this._firstFocusItem);}this.inherited(arguments);},_endDrag:function(e){if(e&&e.node&&e.node===this.domNode){this._relativePosition=dojo.position(e.node);}},_setup:function(){var node=this.domNode;if(this.titleBar&&this.draggable){this._moveable=(dojo.isIE==6)?new dojo.dnd.TimedMoveable(node,{handle:this.titleBar}):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(){this._checkIfSingleChild();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 _2b6=dojo.window.getBox();if(mb.w>=_2b6.w||mb.h>=_2b6.h){var w=Math.min(mb.w,Math.floor(_2b6.w*0.75)),h=Math.min(mb.h,Math.floor(_2b6.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"});}}else{if(this._singleChild&&this._singleChild.resize){this._singleChild.resize();}}},_position:function(){if(!dojo.hasClass(dojo.body(),"dojoMove")){var node=this.domNode,_2b7=dojo.window.getBox(),p=this._relativePosition,bb=p?null:dojo._getBorderBox(node),l=Math.floor(_2b7.l+(p?p.x:(_2b7.w-bb.w)/2)),t=Math.floor(_2b7.t+(p?p.y:(_2b7.h-bb.h)/2));dojo.style(node,{left:l+"px",top:t+"px"});}},_onKey:function(evt){if(evt.charOrCode){var dk=dojo.keys;var node=evt.target;if(evt.charOrCode===dk.TAB){this._getFocusItems(this.domNode);}var _2b8=(this._firstFocusItem==this._lastFocusItem);if(node==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===dk.TAB){if(!_2b8){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.charOrCode===dk.TAB&&!evt.shiftKey){if(!_2b8){dijit.focus(this._firstFocusItem);}dojo.stopEvent(evt);}else{while(node){if(node==this.domNode||dojo.hasClass(node,"dijitPopup")){if(evt.charOrCode==dk.ESCAPE){this.onCancel();}else{return;}}node=node.parentNode;}if(evt.charOrCode!==dk.TAB){dojo.stopEvent(evt);}else{if(!dojo.isOpera){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(dojo.connect(window,"onscroll",this,"layout"));this._modalconnects.push(dojo.connect(window,"onresize",this,function(){var _2b9=dojo.window.getBox();if(!this._oldViewport||_2b9.h!=this._oldViewport.h||_2b9.w!=this._oldViewport.w){this.layout();this._oldViewport=_2b9;}}));this._modalconnects.push(dojo.connect(this.domNode,"onkeypress",this,"_onKey"));dojo.style(this.domNode,{opacity:0,display:""});this._set("open",true);this._onShow();this._size();this._position();var _2ba;this._fadeInDeferred=new dojo.Deferred(dojo.hitch(this,function(){_2ba.stop();delete this._fadeInDeferred;}));_2ba=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)){this._getFocusItems(this.domNode);dijit.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 _2bb;this._fadeOutDeferred=new dojo.Deferred(dojo.hitch(this,function(){_2bb.stop();delete this._fadeOutDeferred;}));_2bb=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(){if(this.domNode.style.display!="none"){if(dijit._underlay){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={show:function(_2bc,_2bd){var ds=dijit._dialogStack;ds[ds.length-1].focus=dijit.getFocus(_2bc);var _2be=dijit._underlay;if(!_2be||_2be._destroyed){_2be=dijit._underlay=new dijit.DialogUnderlay(_2bd);}else{_2be.set(_2bc.underlayAttrs);}var _2bf=ds[ds.length-1].dialog?ds[ds.length-1].zIndex+2:950;if(ds.length==1){_2be.show();}dojo.style(dijit._underlay.domNode,"zIndex",_2bf-1);dojo.style(_2bc.domNode,"zIndex",_2bf);ds.push({dialog:_2bc,underlayAttrs:_2bd,zIndex:_2bf});},hide:function(_2c0){var ds=dijit._dialogStack;if(ds[ds.length-1].dialog==_2c0){ds.pop();var pd=ds[ds.length-1];if(ds.length==1){if(!dijit._underlay._destroyed){dijit._underlay.hide();}}else{dojo.style(dijit._underlay.domNode,"zIndex",pd.zIndex-1);dijit._underlay.set(pd.underlayAttrs);}if(_2c0.refocus){var _2c1=pd.focus;if(!_2c1||(pd.dialog&&!dojo.isDescendant(_2c1.node,pd.dialog.domNode))){pd.dialog._getFocusItems(pd.dialog.domNode);_2c1=pd.dialog._firstFocusItem;}try{dijit.focus(_2c1);}catch(e){}}}else{var idx=dojo.indexOf(dojo.map(ds,function(elem){return elem.dialog;}),_2c0);if(idx!=-1){ds.splice(idx,1);}}},isTop:function(_2c2){var ds=dijit._dialogStack;return ds[ds.length-1].dialog==_2c2;}};dijit._dialogStack=[{dialog:null,focus:null,underlayAttrs:null}];}if(!dojo._hasResource["dijit._HasDropDown"]){dojo._hasResource["dijit._HasDropDown"]=true;dojo.provide("dijit._HasDropDown");dojo.declare("dijit._HasDropDown",null,{_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;}dojo.stopEvent(e);this._docHandler=this.connect(dojo.doc,"onmouseup","_onDropDownMouseUp");this.toggleDropDown();},_onDropDownMouseUp:function(e){if(e&&this._docHandler){this.disconnect(this._docHandler);}var _2c3=this.dropDown,_2c4=false;if(e&&this._opened){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&&!_2c4){if(dojo.hasClass(t,"dijitPopup")){_2c4=true;}else{t=t.parentNode;}}if(_2c4){t=e.target;if(_2c3.onItemClick){var _2c5;while(t&&!(_2c5=dijit.byNode(t))){t=t.parentNode;}if(_2c5&&_2c5.onClick&&_2c5.getParent){_2c5.getParent().onItemClick(_2c5,e);}}return;}}}if(this._opened&&_2c3.focus&&_2c3.autoFocus!==false){window.setTimeout(dojo.hitch(_2c3,"focus"),1);}},_onDropDownClick:function(e){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;var _2c6={"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"+_2c6+"ArrowButton");},postCreate:function(){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){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,_2c7=e.target;if(d&&this._opened&&d.handleKey){if(d.handleKey(e)===false){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==" ")&&((_2c7.tagName||"").toLowerCase()!=="input"||(_2c7.type&&_2c7.type.toLowerCase()!=="text"))))){this._toggleOnKeyUp=true;dojo.stopEvent(e);}}},_onKeyUp:function(){if(this._toggleOnKeyUp){delete this._toggleOnKeyUp;this.toggleDropDown();var d=this.dropDown;if(d&&d.focus){setTimeout(dojo.hitch(d,"focus"),1);}}},_onBlur:function(){var _2c8=dijit._curFocus&&this.dropDown&&dojo.isDescendant(dijit._curFocus,this.dropDown.domNode);this.closeDropDown(_2c8);this.inherited(arguments);},isLoaded:function(){return true;},loadDropDown:function(_2c9){_2c9();},toggleDropDown:function(){if(this.disabled||this.readOnly){return;}if(!this._opened){if(!this.isLoaded()){this.loadDropDown(dojo.hitch(this,"openDropDown"));return;}else{this.openDropDown();}}else{this.closeDropDown();}},openDropDown:function(){var _2ca=this.dropDown,_2cb=_2ca.domNode,_2cc=this._aroundNode||this.domNode,self=this;if(!this._preparedNode){this._preparedNode=true;if(_2cb.style.width){this._explicitDDWidth=true;}if(_2cb.style.height){this._explicitDDHeight=true;}}if(this.maxHeight||this.forceWidth||this.autoWidth){var _2cd={display:"",visibility:"hidden"};if(!this._explicitDDWidth){_2cd.width="";}if(!this._explicitDDHeight){_2cd.height="";}dojo.style(_2cb,_2cd);var _2ce=this.maxHeight;if(_2ce==-1){var _2cf=dojo.window.getBox(),_2d0=dojo.position(_2cc,false);_2ce=Math.floor(Math.max(_2d0.y,_2cf.h-(_2d0.y+_2d0.h)));}if(_2ca.startup&&!_2ca._started){_2ca.startup();}dijit.popup.moveOffScreen(_2ca);var mb=dojo._getMarginSize(_2cb);var _2d1=(_2ce&&mb.h>_2ce);dojo.style(_2cb,{overflowX:"hidden",overflowY:_2d1?"auto":"hidden"});if(_2d1){mb.h=_2ce;if("w" in mb){mb.w+=16;}}else{delete mb.h;}if(this.forceWidth){mb.w=_2cc.offsetWidth;}else{if(this.autoWidth){mb.w=Math.max(mb.w,_2cc.offsetWidth);}else{delete mb.w;}}if(dojo.isFunction(_2ca.resize)){_2ca.resize(mb);}else{dojo.marginBox(_2cb,mb);}}var _2d2=dijit.popup.open({parent:this,popup:_2ca,around:_2cc,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;return _2d2;},closeDropDown:function(_2d3){if(this._opened){if(_2d3){this.focus();}dijit.popup.close(this.dropDown);this._opened=false;}}});}if(!dojo._hasResource["dijit.form.Button"]){dojo._hasResource["dijit.form.Button"]=true;dojo.provide("dijit.form.Button");dojo.declare("dijit.form.Button",dijit.form._FormWidget,{label:"",showLabel:true,iconClass:"",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(e){if(this.disabled){return false;}this._clicked();return this.onClick(e);},_onButtonClick:function(e){if(this._onClick(e)===false){e.preventDefault();}else{if(this.type=="submit"&&!(this.valueNode||this.focusNode).form){for(var node=this.domNode;node.parentNode;node=node.parentNode){var _2d4=dijit.byNode(node);if(_2d4&&typeof _2d4._onSubmit=="function"){_2d4._onSubmit(e);break;}}}else{if(this.valueNode){this.valueNode.click();e.preventDefault();}}}},buildRendering:function(){this.inherited(arguments);dojo.setSelectable(this.focusNode,false);},_fillContent:function(_2d5){if(_2d5&&(!this.params||!("label" in this.params))){this.set("label",_2d5.innerHTML);}},_setShowLabelAttr:function(val){if(this.containerNode){dojo.toggleClass(this.containerNode,"dijitDisplayNone",!val);}this._set("showLabel",val);},onClick:function(e){return true;},_clicked:function(e){},setLabel:function(_2d6){dojo.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_2d6);},_setLabelAttr:function(_2d7){this._set("label",_2d7);this.containerNode.innerHTML=_2d7;if(this.showLabel==false&&!this.params.title){this.titleNode.title=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");}},_setIconClassAttr:function(val){var _2d8=this.iconClass||"dijitNoIcon",_2d9=val||"dijitNoIcon";dojo.replaceClass(this.iconNode,_2d9,_2d8);this._set("iconClass",val);}});dojo.declare("dijit.form.DropDownButton",[dijit.form.Button,dijit._Container,dijit._HasDropDown],{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(){if(this.srcNodeRef){var _2da=dojo.query("*",this.srcNodeRef);dijit.form.DropDownButton.superclass._fillContent.call(this,_2da[0]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}if(!this.dropDown&&this.dropDownContainer){var _2db=dojo.query("[widgetId]",this.dropDownContainer)[0];this.dropDown=dijit.byNode(_2db);delete this.dropDownContainer;}if(this.dropDown){dijit.popup.hide(this.dropDown);}this.inherited(arguments);},isLoaded:function(){var _2dc=this.dropDown;return (!!_2dc&&(!_2dc.href||_2dc.isLoaded));},loadDropDown:function(){var _2dd=this.dropDown;if(!_2dd){return;}if(!this.isLoaded()){var _2de=dojo.connect(_2dd,"onLoad",this,function(){dojo.disconnect(_2de);this.openDropDown();});_2dd.refresh();}else{this.openDropDown();}},isFocusable:function(){return this.inherited(arguments)&&!this._mouseDown;}});dojo.declare("dijit.form.ComboButton",dijit.form.DropDownButton,{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:"",baseClass:"dijitComboButton",cssStateNodes:{"buttonNode":"dijitButtonNode","titleNode":"dijitButtonContents","_popupStateNode":"dijitDownArrowButton"},_focusedNode:null,_onButtonKeyPress:function(evt){if(evt.charOrCode==dojo.keys[this.isLeftToRight()?"RIGHT_ARROW":"LEFT_ARROW"]){dijit.focus(this._popupStateNode);dojo.stopEvent(evt);}},_onArrowKeyPress:function(evt){if(evt.charOrCode==dojo.keys[this.isLeftToRight()?"LEFT_ARROW":"RIGHT_ARROW"]){dijit.focus(this.titleNode);dojo.stopEvent(evt);}},focus:function(_2df){if(!this.disabled){dijit.focus(_2df=="start"?this.titleNode:this._popupStateNode);}}});dojo.declare("dijit.form.ToggleButton",dijit.form.Button,{baseClass:"dijitToggleButton",checked:false,attributeMap:dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap),{checked:"focusNode"}),_clicked:function(evt){this.set("checked",!this.checked);},_setCheckedAttr:function(_2e0,_2e1){this._set("checked",_2e0);dojo.attr(this.focusNode||this.domNode,"checked",_2e0);dijit.setWaiState(this.focusNode||this.domNode,"pressed",_2e0);this._handleOnChange(_2e0,_2e1);},setChecked:function(_2e2){dojo.deprecated("setChecked("+_2e2+") is deprecated. Use set('checked',"+_2e2+") instead.","","2.0");this.set("checked",_2e2);},reset:function(){this._hasBeenBlurred=false;this.set("checked",this.params.checked||false);}});}if(!dojo._hasResource["dijit.form.ToggleButton"]){dojo._hasResource["dijit.form.ToggleButton"]=true;dojo.provide("dijit.form.ToggleButton");}if(!dojo._hasResource["dijit.form.CheckBox"]){dojo._hasResource["dijit.form.CheckBox"]=true;dojo.provide("dijit.form.CheckBox");dojo.declare("dijit.form.CheckBox",dijit.form.ToggleButton,{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:"checkbox",value:"on",readOnly:false,attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{readOnly:"focusNode"}),_setReadOnlyAttr:function(_2e3){this._set("readOnly",_2e3);dojo.attr(this.focusNode,"readOnly",_2e3);dijit.setWaiState(this.focusNode,"readonly",_2e3);},_setValueAttr:function(_2e4,_2e5){if(typeof _2e4=="string"){this._set("value",_2e4);dojo.attr(this.focusNode,"value",_2e4);_2e4=true;}if(this._created){this.set("checked",_2e4,_2e5);}},_getValueAttr:function(){return (this.checked?this.value:false);},_setLabelAttr:undefined,postMixInProperties:function(){if(this.value==""){this.value="on";}this.checkedAttrSetting=this.checked?"checked":"";this.inherited(arguments);},_fillContent:function(_2e6){},reset:function(){this._hasBeenBlurred=false;this.set("checked",this.params.checked||false);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(e){if(this.readOnly){dojo.stopEvent(e);return false;}return this.inherited(arguments);}});dojo.declare("dijit.form.RadioButton",dijit.form.CheckBox,{type:"radio",baseClass:"dijitRadio",_setCheckedAttr:function(_2e7){this.inherited(arguments);if(!this._created){return;}if(_2e7){var _2e8=this;dojo.query("INPUT[type=radio]",this.focusNode.form||dojo.doc).forEach(function(_2e9){if(_2e9.name==_2e8.name&&_2e9!=_2e8.focusNode&&_2e9.form==_2e8.focusNode.form){var _2ea=dijit.getEnclosingWidget(_2e9);if(_2ea&&_2ea.checked){_2ea.set("checked",false);}}});}},_clicked:function(e){if(!this.checked){this.set("checked",true);}}});}if(!dojo._hasResource["dijit.form.DropDownButton"]){dojo._hasResource["dijit.form.DropDownButton"]=true;dojo.provide("dijit.form.DropDownButton");}if(!dojo._hasResource["dojo.regexp"]){dojo._hasResource["dojo.regexp"]=true;dojo.provide("dojo.regexp");dojo.getObject("regexp",true,dojo);dojo.regexp.escapeString=function(str,_2eb){return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(ch){if(_2eb&&_2eb.indexOf(ch)!=-1){return ch;}return "\\"+ch;});};dojo.regexp.buildGroupRE=function(arr,re,_2ec){if(!(arr instanceof Array)){return re(arr);}var b=[];for(var i=0;i<arr.length;i++){b.push(re(arr[i]));}return dojo.regexp.group(b.join("|"),_2ec);};dojo.regexp.group=function(_2ed,_2ee){return "("+(_2ee?"?:":"")+_2ed+")";};}if(!dojo._hasResource["dojo.data.util.sorter"]){dojo._hasResource["dojo.data.util.sorter"]=true;dojo.provide("dojo.data.util.sorter");dojo.getObject("data.util.sorter",true,dojo);dojo.data.util.sorter.basicComparator=function(a,b){var r=-1;if(a===null){a=undefined;}if(b===null){b=undefined;}if(a==b){r=0;}else{if(a>b||a==null){r=1;}}return r;};dojo.data.util.sorter.createSortFunction=function(_2ef,_2f0){var _2f1=[];function _2f2(attr,dir,comp,s){return function(_2f3,_2f4){var a=s.getValue(_2f3,attr);var b=s.getValue(_2f4,attr);return dir*comp(a,b);};};var _2f5;var map=_2f0.comparatorMap;var bc=dojo.data.util.sorter.basicComparator;for(var i=0;i<_2ef.length;i++){_2f5=_2ef[i];var attr=_2f5.attribute;if(attr){var dir=(_2f5.descending)?-1:1;var comp=bc;if(map){if(typeof attr!=="string"&&("toString" in attr)){attr=attr.toString();}comp=map[attr]||bc;}_2f1.push(_2f2(attr,dir,comp,_2f0));}}return function(rowA,rowB){var i=0;while(i<_2f1.length){var ret=_2f1[i++](rowA,rowB);if(ret!==0){return ret;}}return 0;};};}if(!dojo._hasResource["dojo.data.util.simpleFetch"]){dojo._hasResource["dojo.data.util.simpleFetch"]=true;dojo.provide("dojo.data.util.simpleFetch");dojo.getObject("data.util.simpleFetch",true,dojo);dojo.data.util.simpleFetch.fetch=function(_2f6){_2f6=_2f6||{};if(!_2f6.store){_2f6.store=this;}var self=this;var _2f7=function(_2f8,_2f9){if(_2f9.onError){var _2fa=_2f9.scope||dojo.global;_2f9.onError.call(_2fa,_2f8,_2f9);}};var _2fb=function(_2fc,_2fd){var _2fe=_2fd.abort||null;var _2ff=false;var _300=_2fd.start?_2fd.start:0;var _301=(_2fd.count&&(_2fd.count!==Infinity))?(_300+_2fd.count):_2fc.length;_2fd.abort=function(){_2ff=true;if(_2fe){_2fe.call(_2fd);}};var _302=_2fd.scope||dojo.global;if(!_2fd.store){_2fd.store=self;}if(_2fd.onBegin){_2fd.onBegin.call(_302,_2fc.length,_2fd);}if(_2fd.sort){_2fc.sort(dojo.data.util.sorter.createSortFunction(_2fd.sort,self));}if(_2fd.onItem){for(var i=_300;(i<_2fc.length)&&(i<_301);++i){var item=_2fc[i];if(!_2ff){_2fd.onItem.call(_302,item,_2fd);}}}if(_2fd.onComplete&&!_2ff){var _303=null;if(!_2fd.onItem){_303=_2fc.slice(_300,_301);}_2fd.onComplete.call(_302,_303,_2fd);}};this._fetchItems(_2f6,_2fb,_2f7);return _2f6;};}if(!dojo._hasResource["dojo.data.util.filter"]){dojo._hasResource["dojo.data.util.filter"]=true;dojo.provide("dojo.data.util.filter");dojo.getObject("data.util.filter",true,dojo);dojo.data.util.filter.patternToRegExp=function(_304,_305){var rxp="^";var c=null;for(var i=0;i<_304.length;i++){c=_304.charAt(i);switch(c){case "\\":rxp+=c;i++;rxp+=_304.charAt(i);break;case "*":rxp+=".*";break;case "?":rxp+=".";break;case "$":case "^":case "/":case "+":case ".":case "|":case "(":case ")":case "{":case "}":case "[":case "]":rxp+="\\";default:rxp+=c;}}rxp+="$";if(_305){return new RegExp(rxp,"mi");}else{return new RegExp(rxp,"m");}};}if(!dojo._hasResource["dijit.form.TextBox"]){dojo._hasResource["dijit.form.TextBox"]=true;dojo.provide("dijit.form.TextBox");dojo.declare("dijit.form.TextBox",dijit.form._FormValueWidget,{trim:false,uppercase:false,lowercase:false,propercase:false,maxLength:"",selectOnClick:false,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":"",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");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(){return this.parse(this.get("displayedValue"),this.constraints);},_setValueAttr:function(_306,_307,_308){var _309;if(_306!==undefined){_309=this.filter(_306);if(typeof _308!="string"){if(_309!==null&&((typeof _309!="number")||!isNaN(_309))){_308=this.filter(this.format(_309,this.constraints));}else{_308="";}}}if(_308!=null&&_308!=undefined&&((typeof _308)!="number"||!isNaN(_308))&&this.textbox.value!=_308){this.textbox.value=_308;this._set("displayedValue",this.get("displayedValue"));}this._updatePlaceHolder();this.inherited(arguments,[_309,_307]);},displayedValue:"",getDisplayedValue:function(){dojo.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use set('displayedValue') instead.","","2.0");return this.get("displayedValue");},_getDisplayedValueAttr:function(){return this.filter(this.textbox.value);},setDisplayedValue:function(_30a){dojo.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.","","2.0");this.set("displayedValue",_30a);},_setDisplayedValueAttr:function(_30b){if(_30b===null||_30b===undefined){_30b="";}else{if(typeof _30b!="string"){_30b=String(_30b);}}this.textbox.value=_30b;this._setValueAttr(this.get("value"),undefined);this._set("displayedValue",this.get("displayedValue"));},format:function(_30c,_30d){return ((_30c==null||_30c==undefined)?"":(_30c.toString?_30c.toString():_30c));},parse:function(_30e,_30f){return _30e;},_refreshState:function(){},_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 _310=this;setTimeout(function(){_310._handleOnChange(_310.get("value"),false);},0);}this._refreshState();this._set("displayedValue",this.get("displayedValue"));},postCreate:function(){if(dojo.isIE){setTimeout(dojo.hitch(this,function(){var s=dojo.getComputedStyle(this.domNode);if(s){var ff=s.fontFamily;if(ff){var _311=this.domNode.getElementsByTagName("INPUT");if(_311){for(var i=0;i<_311.length;i++){_311[i].style.fontFamily=ff;}}}}}),0);}this.textbox.setAttribute("value",this.textbox.value);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:"",filter:function(val){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;}this._updatePlaceHolder();},_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);var _312;if(dojo.isIE){var _313=dojo.doc.selection.createRange();var _314=_313.parentElement();_312=_314==this.textbox&&_313.text.length==0;}else{_312=this.textbox.selectionStart==this.textbox.selectionEnd;}if(_312){dijit.selectInputText(this.textbox);}});}this._updatePlaceHolder();this.inherited(arguments);this._refreshState();},reset:function(){this.textbox.value="";this.inherited(arguments);}});dijit.selectInputText=function(_315,_316,stop){var _317=dojo.global;var _318=dojo.doc;_315=dojo.byId(_315);if(isNaN(_316)){_316=0;}if(isNaN(stop)){stop=_315.value?_315.value.length:0;}dijit.focus(_315);if(_318["selection"]&&dojo.body()["createTextRange"]){if(_315.createTextRange){var r=_315.createTextRange();r.collapse(true);r.moveStart("character",-99999);r.moveStart("character",_316);r.moveEnd("character",stop-_316);r.select();}}else{if(_317["getSelection"]){if(_315.setSelectionRange){_315.setSelectionRange(_316,stop);}}}};}if(!dojo._hasResource["dijit.Tooltip"]){dojo._hasResource["dijit.Tooltip"]=true;dojo.provide("dijit.Tooltip");dojo.declare("dijit._MasterTooltip",[dijit._Widget,dijit._Templated],{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);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(_319,_31a,_31b,rtl){if(this.aroundNode&&this.aroundNode===_31a){return;}this.domNode.width="auto";if(this.fadeOut.status()=="playing"){this._onDeck=arguments;return;}this.containerNode.innerHTML=_319;var pos=dijit.placeOnScreenAroundElement(this.domNode,_31a,dijit.getPopupAroundAlignment((_31b&&_31b.length)?_31b:dijit.Tooltip.defaultPosition,!rtl),dojo.hitch(this,"orient"));dojo.style(this.domNode,"opacity",0);this.fadeIn.play();this.isShowingNow=true;this.aroundNode=_31a;},orient:function(node,_31c,_31d,_31e,_31f){this.connectorNode.style.top="";var _320=_31e.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"}[_31c+"-"+_31d];this.domNode.style.width="auto";var size=dojo.contentBox(this.domNode);var _321=Math.min((Math.max(_320,1)),size.w);var _322=_321<size.w;this.domNode.style.width=_321+"px";if(_322){this.containerNode.style.overflow="auto";var _323=this.containerNode.scrollWidth;this.containerNode.style.overflow="visible";if(_323>_321){_323=_323+dojo.style(this.domNode,"paddingLeft")+dojo.style(this.domNode,"paddingRight");this.domNode.style.width=_323+"px";}}if(_31d.charAt(0)=="B"&&_31c.charAt(0)=="B"){var mb=dojo.marginBox(node);var _324=this.connectorNode.offsetHeight;if(mb.h>_31e.h){var _325=_31e.h-(_31f.h/2)-(_324/2);this.connectorNode.style.top=_325+"px";this.connectorNode.style.bottom="";}else{this.connectorNode.style.bottom=Math.min(Math.max(_31f.h/2-_324/2,0),mb.h-_324)+"px";this.connectorNode.style.top="";}}else{this.connectorNode.style.top="";this.connectorNode.style.bottom="";}return Math.max(0,size.w-_320);},_onShow:function(){if(dojo.isIE){this.domNode.style.filter="";}},hide:function(_326){if(this._onDeck&&this._onDeck[1]==_326){this._onDeck=null;}else{if(this.aroundNode===_326){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;}}});dijit.showTooltip=function(_327,_328,_329,rtl){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.show(_327,_328,_329,rtl);};dijit.hideTooltip=function(_32a){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.hide(_32a);};dojo.declare("dijit.Tooltip",dijit._Widget,{label:"",showDelay:400,connectId:[],position:[],_setConnectIdAttr:function(_32b){dojo.forEach(this._connections||[],function(_32c){dojo.forEach(_32c,dojo.hitch(this,"disconnect"));},this);var ary=dojo.isArrayLike(_32b)?_32b:(_32b?[_32b]:[]);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",_32b);this._connectIds=ary;},addTarget:function(node){var id=node.id||node;if(dojo.indexOf(this._connectIds,id)==-1){this.set("connectId",this._connectIds.concat(id));}},removeTarget:function(node){var id=node.id||node,idx=dojo.indexOf(this._connectIds,id);if(idx>=0){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);var ids=this.connectId;dojo.forEach(dojo.isArrayLike(ids)?ids:[ids],this.addTarget,this);},_onTargetMouseEnter:function(e){this._onHover(e);},_onTargetMouseLeave:function(e){this._onUnHover(e);},_onTargetFocus:function(e){this._focus=true;this._onHover(e);},_onTargetBlur:function(e){this._focus=false;this._onUnHover(e);},_onHover:function(e){if(!this._showTimer){var _32d=e.target;this._showTimer=setTimeout(dojo.hitch(this,function(){this.open(_32d);}),this.showDelay);}},_onUnHover:function(e){if(this._focus){return;}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}this.close();},open:function(_32e){if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}dijit.showTooltip(this.label||this.domNode.innerHTML,_32e,this.position,!this.isLeftToRight());this._connectNode=_32e;this.onShow(_32e,this.position);},close:function(){if(this._connectNode){dijit.hideTooltip(this._connectNode);delete this._connectNode;this.onHide();}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}},onShow:function(_32f,_330){},onHide:function(){},uninitialize:function(){this.close();this.inherited(arguments);}});dijit.Tooltip.defaultPosition=["after","before"];}if(!dojo._hasResource["dijit.form.ValidationTextBox"]){dojo._hasResource["dijit.form.ValidationTextBox"]=true;dojo.provide("dijit.form.ValidationTextBox");dojo.declare("dijit.form.ValidationTextBox",dijit.form.TextBox,{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:false,promptMessage:"",invalidMessage:"$_unset_$",missingMessage:"$_unset_$",message:"",constraints:{},regExp:".*",regExpGen:function(_331){return this.regExp;},state:"",tooltipPosition:[],_setValueAttr:function(){this.inherited(arguments);this.validate(this._focused);},validator:function(_332,_333){return (new RegExp("^(?:"+this.regExpGen(_333)+")"+(this.required?"":"?")+"$")).test(_332)&&(!this.required||!this._isEmpty(_332))&&(this._isEmpty(_332)||this.parse(_332,_333)!==undefined);},_isValidSubset:function(){return this.textbox.value.search(this._partialre)==0;},isValid:function(_334){return this.validator(this.textbox.value,this.constraints);},_isEmpty:function(_335){return (this.trim?/^\s*$/:/^$/).test(_335);},getErrorMessage:function(_336){return (this.required&&this._isEmpty(this.textbox.value))?this.missingMessage:this.invalidMessage;},getPromptMessage:function(_337){return this.promptMessage;},_maskValidSubsetError:true,validate:function(_338){var _339="";var _33a=this.disabled||this.isValid(_338);if(_33a){this._maskValidSubsetError=true;}var _33b=this._isEmpty(this.textbox.value);var _33c=!_33a&&_338&&this._isValidSubset();this._set("state",_33a?"":(((((!this._hasBeenBlurred||_338)&&_33b)||_33c)&&this._maskValidSubsetError)?"Incomplete":"Error"));dijit.setWaiState(this.focusNode,"invalid",_33a?"false":"true");if(this.state=="Error"){this._maskValidSubsetError=_338&&_33c;_339=this.getErrorMessage(_338);}else{if(this.state=="Incomplete"){_339=this.getPromptMessage(_338);this._maskValidSubsetError=!this._hasBeenBlurred||_338;}else{if(_33b){_339=this.getPromptMessage(_338);}}}this.set("message",_339);return _33a;},displayMessage:function(_33d){dijit.hideTooltip(this.domNode);if(_33d&&this._focused){dijit.showTooltip(_33d,this.domNode,this.tooltipPosition,!this.isLeftToRight());}},_refreshState:function(){this.validate(this._focused);this.inherited(arguments);},constructor:function(){this.constraints={};},_setConstraintsAttr:function(_33e){if(!_33e.locale&&this.lang){_33e.locale=this.lang;}this._set("constraints",_33e);this._computePartialRE();},_computePartialRE:function(){var p=this.regExpGen(this.constraints);this.regExp=p;var _33f="";if(p!=".*"){this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,function(re){switch(re.charAt(0)){case "{":case "+":case "?":case "*":case "^":case "$":case "|":case "(":_33f+=re;break;case ")":_33f+="|$)";break;default:_33f+="(?:"+re+"|$)";break;}});}try{"".search(_33f);}catch(e){_33f=this.regExp;console.warn("RegExp error in "+this.declaredClass+": "+this.regExp);}this._partialre="^(?:"+_33f+")$";},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);},_setDisabledAttr:function(_340){this.inherited(arguments);this._refreshState();},_setRequiredAttr:function(_341){this._set("required",_341);dijit.setWaiState(this.focusNode,"required",_341);this._refreshState();},_setMessageAttr:function(_342){this._set("message",_342);this.displayMessage(_342);},reset:function(){this._maskValidSubsetError=true;this.inherited(arguments);},_onBlur:function(){this.displayMessage("");this.inherited(arguments);}});dojo.declare("dijit.form.MappedTextBox",dijit.form.ValidationTextBox,{postMixInProperties:function(){this.inherited(arguments);this.nameAttrSetting="";},serialize:function(val,_343){return val.toString?val.toString():"";},toString:function(){var val=this.filter(this.get("value"));return val!=null?(typeof val=="string"?val:this.serialize(val,this.constraints)):"";},validate:function(){this.valueNode.value=this.toString();return this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);this.valueNode=dojo.place("<input type='hidden'"+(this.name?" name='"+this.name.replace(/'/g,"&quot;")+"'":"")+"/>",this.textbox,"after");},reset:function(){this.valueNode.value="";this.inherited(arguments);}});dojo.declare("dijit.form.RangeBoundTextBox",dijit.form.MappedTextBox,{rangeMessage:"",rangeCheck:function(_344,_345){return ("min" in _345?(this.compare(_344,_345.min)>=0):true)&&("max" in _345?(this.compare(_344,_345.max)<=0):true);},isInRange:function(_346){return this.rangeCheck(this.get("value"),this.constraints);},_isDefinitelyOutOfRange:function(){var val=this.get("value");var _347=false;var _348=false;if("min" in this.constraints){var min=this.constraints.min;min=this.compare(val,((typeof min=="number")&&min>=0&&val!=0)?0:min);_347=(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);_348=(typeof max=="number")&&max>0;}return _347||_348;},_isValidSubset:function(){return this.inherited(arguments)&&!this._isDefinitelyOutOfRange();},isValid:function(_349){return this.inherited(arguments)&&((this._isEmpty(this.textbox.value)&&!this.required)||this.isInRange(_349));},getErrorMessage:function(_34a){var v=this.get("value");if(v!==null&&v!==""&&v!==undefined&&(typeof v!="number"||!isNaN(v))&&!this.isInRange(_34a)){return this.rangeMessage;}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(_34b){this.inherited(arguments);if(this.focusNode){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(_34c,_34d){dijit.setWaiState(this.focusNode,"valuenow",_34c);this.inherited(arguments);}});}if(!dojo._hasResource["dijit.form.ComboBox"]){dojo._hasResource["dijit.form.ComboBox"]=true;dojo.provide("dijit.form.ComboBox");dojo.declare("dijit.form.ComboBoxMixin",dijit._HasDropDown,{item:null,pageSize:Infinity,store:null,fetchProperties:{},query:{},autoComplete:true,highlightMatch:"first",searchDelay:100,searchAttr:"name",labelAttr:"",labelType:"text",queryExpr:"${0}*",ignoreCase: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:"dijit.form._ComboBoxMenu",cssStateNodes:{"_buttonNode":"dijitDownArrowButton"},maxHeight:-1,_stopClickEvents:false,_getCaretPos:function(_34e){var pos=0;if(typeof (_34e.selectionStart)=="number"){pos=_34e.selectionStart;}else{if(dojo.isIE){var tr=dojo.doc.selection.createRange().duplicate();var ntr=_34e.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(_34f,_350){_350=parseInt(_350);dijit.selectInputText(_34f,_350,_350);},_setDisabledAttr:function(_351){this.inherited(arguments);dijit.setWaiState(this.domNode,"disabled",_351);},_abortQuery:function(){if(this.searchTimer){clearTimeout(this.searchTimer);this.searchTimer=null;}if(this._fetchHandle){if(this._fetchHandle.abort){this._fetchHandle.abort();}this._fetchHandle=null;}},_onInput:function(evt){if(!this.searchTimer&&(evt.type=="paste"||evt.type=="input")&&this._lastInput!=this.textbox.value){this.searchTimer=setTimeout(dojo.hitch(this,function(){this._onKey({charOrCode:229});}),100);}this.inherited(arguments);},_onKey:function(evt){var key=evt.charOrCode;if(evt.altKey||((evt.ctrlKey||evt.metaKey)&&(key!="x"&&key!="v"))||key==dojo.keys.SHIFT){return;}var _352=false;var pw=this.dropDown;var dk=dojo.keys;var _353=null;this._prev_key_backspace=false;this._abortQuery();this.inherited(arguments);if(this._opened){_353=pw.getHighlightedOption();}switch(key){case dk.PAGE_DOWN:case dk.DOWN_ARROW:case dk.PAGE_UP:case dk.UP_ARROW:if(this._opened){this._announceOption(_353);}dojo.stopEvent(evt);break;case dk.ENTER:if(_353){if(_353==pw.nextButton){this._nextSearch(1);dojo.stopEvent(evt);break;}else{if(_353==pw.previousButton){this._nextSearch(-1);dojo.stopEvent(evt);break;}}}else{this._setBlurValue();this._setCaretPos(this.focusNode,this.focusNode.value.length);}if(this._opened||this._fetchHandle){evt.preventDefault();}case dk.TAB:var _354=this.get("displayedValue");if(pw&&(_354==pw._messages["previousMessage"]||_354==pw._messages["nextMessage"])){break;}if(_353){this._selectOption();}if(this._opened){this._lastQuery=null;this.closeDropDown();}break;case " ":if(_353){dojo.stopEvent(evt);this._selectOption();this.closeDropDown();}else{_352=true;}break;case dk.DELETE:case dk.BACKSPACE:this._prev_key_backspace=true;_352=true;break;default:_352=typeof key=="string"||key==229;}if(_352){this.item=undefined;this.searchTimer=setTimeout(dojo.hitch(this,"_startSearchFromInput"),1);}},_autoCompleteText:function(text){var fn=this.focusNode;dijit.selectInputText(fn,fn.value.length);var _355=this.ignoreCase?"toLowerCase":"substr";if(text[_355](0).indexOf(this.focusNode.value[_355](0))==0){var cpos=this._getCaretPos(fn);if((cpos+1)>fn.value.length){fn.value=text;dijit.selectInputText(fn,cpos);}}else{fn.value=text;dijit.selectInputText(fn);}},_openResultList:function(_356,_357){this._fetchHandle=null;if(this.disabled||this.readOnly||(_357.query[this.searchAttr]!=this._lastQuery)){return;}var _358=this.dropDown._highlighted_option&&dojo.hasClass(this.dropDown._highlighted_option,"dijitMenuItemSelected");this.dropDown.clearResultList();if(!_356.length&&!this._maxOptions){this.closeDropDown();return;}_357._maxOptions=this._maxOptions;var _359=this.dropDown.createOptions(_356,_357,dojo.hitch(this,"_getMenuLabelFromItem"));this._showResultList();if(_357.direction){if(1==_357.direction){this.dropDown.highlightFirstOption();}else{if(-1==_357.direction){this.dropDown.highlightLastOption();}}if(_358){this._announceOption(this.dropDown.getHighlightedOption());}}else{if(this.autoComplete&&!this._prev_key_backspace&&!/^[*]+$/.test(_357.query[this.searchAttr])){this._announceOption(_359[1]);}}},_showResultList:function(){this.closeDropDown(true);this.displayMessage("");this.openDropDown();dijit.setWaiState(this.domNode,"expanded","true");},loadDropDown:function(_35a){this._startSearchAll();},isLoaded:function(){return false;},closeDropDown:function(){this._abortQuery();if(this._opened){this.inherited(arguments);dijit.setWaiState(this.domNode,"expanded","false");dijit.removeWaiState(this.focusNode,"activedescendant");}},_setBlurValue:function(){var _35b=this.get("displayedValue");var pw=this.dropDown;if(pw&&(_35b==pw._messages["previousMessage"]||_35b==pw._messages["nextMessage"])){this._setValueAttr(this._lastValueReported,true);}else{if(typeof this.item=="undefined"){this.item=null;this.set("displayedValue",_35b);}else{if(this.value!=this._lastValueReported){dijit.form._FormValueWidget.prototype._setValueAttr.call(this,this.value,true);}this._refreshState();}}},_onBlur:function(){this.closeDropDown();this.inherited(arguments);},_setItemAttr:function(item,_35c,_35d){if(!_35d){_35d=this.store.getValue(item,this.searchAttr);}var _35e=this._getValueField()!=this.searchAttr?this.store.getIdentity(item):_35d;this._set("item",item);dijit.form.ComboBox.superclass._setValueAttr.call(this,_35e,_35c,_35d);},_announceOption:function(node){if(!node){return;}var _35f;if(node==this.dropDown.nextButton||node==this.dropDown.previousButton){_35f=node.innerHTML;this.item=undefined;this.value="";}else{_35f=this.store.getValue(node.item,this.searchAttr).toString();this.set("item",node.item,false,_35f);}this.focusNode.value=this.focusNode.value.substring(0,this._lastInput.length);dijit.setWaiState(this.focusNode,"activedescendant",dojo.attr(node,"id"));this._autoCompleteText(_35f);},_selectOption:function(evt){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);},_startSearchAll:function(){this._startSearch("");},_startSearchFromInput:function(){this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g,"\\$1"));},_getQueryString:function(text){return dojo.string.substitute(this.queryExpr,[text]);},_startSearch:function(key){if(!this.dropDown){var _360=this.id+"_popup",_361=dojo.getObject(this.dropDownClass,false);this.dropDown=new _361({onChange:dojo.hitch(this,this._selectOption),id:_360,dir:this.dir});dijit.removeWaiState(this.focusNode,"activedescendant");dijit.setWaiState(this.textbox,"owns",_360);}var _362=dojo.clone(this.query);this._lastInput=key;this._lastQuery=_362[this.searchAttr]=this._getQueryString(key);this.searchTimer=setTimeout(dojo.hitch(this,function(_363,_364){this.searchTimer=null;var _365={queryOptions:{ignoreCase:this.ignoreCase,deep:true},query:_363,onBegin:dojo.hitch(this,"_setMaxOptions"),onComplete:dojo.hitch(this,"_openResultList"),onError:function(_366){_364._fetchHandle=null;console.error("dijit.form.ComboBox: "+_366);_364.closeDropDown();},start:0,count:this.pageSize};dojo.mixin(_365,_364.fetchProperties);this._fetchHandle=_364.store.fetch(_365);var _367=function(_368,_369){_368.start+=_368.count*_369;_368.direction=_369;this._fetchHandle=this.store.fetch(_368);this.focus();};this._nextSearch=this.dropDown.onPage=dojo.hitch(this,_367,this._fetchHandle);},_362,this),this.searchDelay);},_setMaxOptions:function(size,_36a){this._maxOptions=size;},_getValueField:function(){return this.searchAttr;},constructor:function(){this.query={};this.fetchProperties={};},postMixInProperties:function(){if(!this.store){var _36b=this.srcNodeRef;this.store=new dijit.form._ComboBoxDataStore(_36b);if(!("value" in this.params)){var item=(this.item=this.store.fetchSelectedItem());if(item){var _36c=this._getValueField();this.value=this.store.getValue(item,_36c);}}}this.inherited(arguments);},postCreate:function(){var _36d=dojo.query("label[for=\""+this.id+"\"]");if(_36d.length){_36d[0].id=(this.id+"_label");dijit.setWaiState(this.domNode,"labelledby",_36d[0].id);}this.inherited(arguments);},_setHasDownArrowAttr:function(val){this.hasDownArrow=val;this._buttonNode.style.display=val?"":"none";},_getMenuLabelFromItem:function(item){var _36e=this.labelFunc(item,this.store),_36f=this.labelType;if(this.highlightMatch!="none"&&this.labelType=="text"&&this._lastInput){_36e=this.doHighlight(_36e,this._escapeHtml(this._lastInput));_36f="html";}return {html:_36f=="html",label:_36e};},doHighlight:function(_370,find){var _371=(this.ignoreCase?"i":"")+(this.highlightMatch=="all"?"g":""),i=this.queryExpr.indexOf("${0}");find=dojo.regexp.escapeString(find);return this._escapeHtml(_370).replace(new RegExp((i==0?"^":"")+"("+find+")"+(i==(this.queryExpr.length-4)?"$":""),_371),"<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(item,_372){return _372.getValue(item,this.labelAttr||this.searchAttr).toString();}});dojo.declare("dijit.form._ComboBoxMenu",[dijit._Widget,dijit._Templated,dijit._CssStateMixin],{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:null,baseClass:"dijitComboBoxMenu",postMixInProperties:function(){this.inherited(arguments);this._messages=dojo.i18n.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(_373){this.value=_373;this.onChange(_373);},onChange:function(_374){},onPage:function(_375){},onClose:function(){this._blurOptionNode();},_createOption:function(item,_376){var _377=dojo.create("li",{"class":"dijitReset dijitMenuItem"+(this.isLeftToRight()?"":" dijitMenuItemRtl"),role:"option"});var _378=_376(item);if(_378.html){_377.innerHTML=_378.label;}else{_377.appendChild(dojo.doc.createTextNode(_378.label));}if(_377.innerHTML==""){_377.innerHTML="&nbsp;";}_377.item=item;return _377;},createOptions:function(_379,_37a,_37b){this.previousButton.style.display=(_37a.start==0)?"none":"";dojo.attr(this.previousButton,"id",this.id+"_prev");dojo.forEach(_379,function(item,i){var _37c=this._createOption(item,_37b);dojo.attr(_37c,"id",this.id+i);this.domNode.insertBefore(_37c,this.nextButton);},this);var _37d=false;if(_37a._maxOptions&&_37a._maxOptions!=-1){if((_37a.start+_37a.count)<_37a._maxOptions){_37d=true;}else{if((_37a.start+_37a.count)>_37a._maxOptions&&_37a.count==_379.length){_37d=true;}}}else{if(_37a.count==_379.length){_37d=true;}}this.nextButton.style.display=_37d?"":"none";dojo.attr(this.nextButton,"id",this.id+"_next");return this.domNode.childNodes;},clearResultList:function(){while(this.domNode.childNodes.length>2){this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);}this._blurOptionNode();},_onMouseDown:function(evt){dojo.stopEvent(evt);},_onMouseUp:function(evt){if(evt.target===this.domNode||!this._highlighted_option){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(!tgt.item){tgt=tgt.parentNode;}this._setValueAttr({target:tgt},true);}}}},_onMouseOver:function(evt){if(evt.target===this.domNode){return;}var tgt=evt.target;if(!(tgt==this.previousButton||tgt==this.nextButton)){while(!tgt.item){tgt=tgt.parentNode;}}this._focusOptionNode(tgt);},_onMouseOut:function(evt){if(evt.target===this.domNode){return;}this._blurOptionNode();},_focusOptionNode:function(node){if(this._highlighted_option!=node){this._blurOptionNode();this._highlighted_option=node;dojo.addClass(this._highlighted_option,"dijitMenuItemSelected");}},_blurOptionNode:function(){if(this._highlighted_option){dojo.removeClass(this._highlighted_option,"dijitMenuItemSelected");this._highlighted_option=null;}},_highlightNextOption:function(){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();}}dojo.window.scrollIntoView(this._highlighted_option);},highlightFirstOption:function(){var _37e=this.domNode.firstChild;var _37f=_37e.nextSibling;this._focusOptionNode(_37f.style.display=="none"?_37e:_37f);dojo.window.scrollIntoView(this._highlighted_option);},highlightLastOption:function(){this._focusOptionNode(this.domNode.lastChild.previousSibling);dojo.window.scrollIntoView(this._highlighted_option);},_highlightPrevOption:function(){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(up){var _380=0;var _381=this.domNode.scrollTop;var _382=dojo.style(this.domNode,"height");if(!this.getHighlightedOption()){this._highlightNextOption();}while(_380<_382){if(up){if(!this.getHighlightedOption().previousSibling||this._highlighted_option.previousSibling.style.display=="none"){break;}this._highlightPrevOption();}else{if(!this.getHighlightedOption().nextSibling||this._highlighted_option.nextSibling.style.display=="none"){break;}this._highlightNextOption();}var _383=this.domNode.scrollTop;_380+=(_383-_381)*(up?-1:1);_381=_383;}},pageUp:function(){this._page(true);},pageDown:function(){this._page(false);},getHighlightedOption:function(){var ho=this._highlighted_option;return (ho&&ho.parentNode)?ho:null;},handleKey:function(evt){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],{_setValueAttr:function(_384,_385,_386){this._set("item",null);if(!_384){_384="";}dijit.form.ValidationTextBox.prototype._setValueAttr.call(this,_384,_385,_386);}});dojo.declare("dijit.form._ComboBoxDataStore",null,{constructor:function(root){this.root=root;if(root.tagName!="SELECT"&&root.firstChild){root=dojo.query("select",root);if(root.length>0){root=root[0];}else{this.root.innerHTML="<SELECT>"+this.root.innerHTML+"</SELECT>";root=this.root.firstChild;}this.root=root;}dojo.query("> option",root).forEach(function(node){node.innerHTML=dojo.trim(node.innerHTML);});},getValue:function(item,_387,_388){return (_387=="value")?item.value:(item.innerText||item.textContent||"");},isItemLoaded:function(_389){return true;},getFeatures:function(){return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true};},_fetchItems:function(args,_38a,_38b){if(!args.query){args.query={};}if(!args.query.name){args.query.name="";}if(!args.queryOptions){args.queryOptions={};}var _38c=dojo.data.util.filter.patternToRegExp(args.query.name,args.queryOptions.ignoreCase),_38d=dojo.query("> option",this.root).filter(function(_38e){return (_38e.innerText||_38e.textContent||"").match(_38c);});if(args.sort){_38d.sort(dojo.data.util.sorter.createSortFunction(args.sort,this));}_38a(_38d,args);},close:function(_38f){return;},getLabel:function(item){return item.innerHTML;},getIdentity:function(item){return dojo.attr(item,"value");},fetchItemByIdentity:function(args){var item=dojo.query("> option[value='"+args.identity+"']",this.root)[0];args.onItem(item);},fetchSelectedItem:function(){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.extend(dijit.form._ComboBoxDataStore,dojo.data.util.simpleFetch);}if(!dojo._hasResource["dijit.form.FilteringSelect"]){dojo._hasResource["dijit.form.FilteringSelect"]=true;dojo.provide("dijit.form.FilteringSelect");dojo.declare("dijit.form.FilteringSelect",[dijit.form.MappedTextBox,dijit.form.ComboBoxMixin],{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(_390,_391,_392){if((_391&&_391.query[this.searchAttr]!=this._lastQuery)||(!_391&&_390.length&&this.store.getIdentity(_390[0])!=this._lastQuery)){return;}if(!_390.length){this.valueNode.value="";dijit.form.TextBox.superclass._setValueAttr.call(this,"",_392||(_392===undefined&&!this._focused));this._set("item",null);this.validate(this._focused);}else{this.set("item",_390[0],_392);}},_openResultList:function(_393,_394){if(_394.query[this.searchAttr]!=this._lastQuery){return;}dijit.form.ComboBoxMixin.prototype._openResultList.apply(this,arguments);if(this.item===undefined){this.validate(true);}},_getValueAttr:function(){return this.valueNode.value;},_getValueField:function(){return "value";},_setValueAttr:function(_395,_396){if(!this._onChangeActive){_396=null;}this._lastQuery=_395;if(_395===null||_395===""){this._setDisplayedValueAttr("",_396);return;}var self=this;this.store.fetchItemByIdentity({identity:_395,onItem:function(item){self._callbackSetLabel(item?[item]:[],undefined,_396);}});},_setItemAttr:function(item,_397,_398){this.inherited(arguments);this.valueNode.value=this.value;this._lastDisplayedValue=this.textbox.value;},_getDisplayQueryString:function(text){return text.replace(/([\\\*\?])/g,"\\$1");},_setDisplayedValueAttr:function(_399,_39a){if(_399==null){_399="";}if(!this._created){if(!("displayedValue" in this.params)){return;}_39a=false;}if(this.store){this.closeDropDown();var _39b=dojo.clone(this.query);this._lastQuery=_39b[this.searchAttr]=this._getDisplayQueryString(_399);this.textbox.value=_399;this._lastDisplayedValue=_399;this._set("displayedValue",_399);var _39c=this;var _39d={query:_39b,queryOptions:{ignoreCase:this.ignoreCase,deep:true},onComplete:function(_39e,_39f){_39c._fetchHandle=null;dojo.hitch(_39c,"_callbackSetLabel")(_39e,_39f,_39a);},onError:function(_3a0){_39c._fetchHandle=null;console.error("dijit.form.FilteringSelect: "+_3a0);dojo.hitch(_39c,"_callbackSetLabel")([],undefined,false);}};dojo.mixin(_39d,this.fetchProperties);this._fetchHandle=this.store.fetch(_39d);}},undo:function(){this.set("displayedValue",this._lastDisplayedValue);}});}if(!dojo._hasResource["dijit.form.Form"]){dojo._hasResource["dijit.form.Form"]=true;dojo.provide("dijit.form.Form");dojo.declare("dijit.form.Form",[dijit._Widget,dijit._Templated,dijit.form._FormMixin,dijit.layout._ContentPaneResizeMixin],{name:"",action:"",method:"",encType:"","accept-charset":"",accept:"",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(){this.nameAttrSetting=this.name?("name='"+this.name+"'"):"";this.inherited(arguments);},execute:function(_3a1){},onExecute:function(){},_setEncTypeAttr:function(_3a2){this.encType=_3a2;dojo.attr(this.domNode,"encType",_3a2);if(dojo.isIE){this.domNode.encoding=_3a2;}},postCreate:function(){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(e){var faux={returnValue:true,preventDefault:function(){this.returnValue=false;},stopPropagation:function(){},currentTarget:e?e.target:this.domNode,target:e?e.target:this.domNode};if(!(this.onReset(faux)===false)&&faux.returnValue){this.inherited(arguments,[]);}},onReset:function(e){return true;},_onReset:function(e){this.reset(e);dojo.stopEvent(e);return false;},_onSubmit:function(e){var fp=dijit.form.Form.prototype;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){dojo.stopEvent(e);}},onSubmit:function(e){return this.isValid();},submit:function(){if(!(this.onSubmit()===false)){this.containerNode.submit();}}});}if(!dojo._hasResource["dijit.form.RadioButton"]){dojo._hasResource["dijit.form.RadioButton"]=true;dojo.provide("dijit.form.RadioButton");}if(!dojo._hasResource["dijit.form._FormSelectWidget"]){dojo._hasResource["dijit.form._FormSelectWidget"]=true;dojo.provide("dijit.form._FormSelectWidget");dojo.declare("dijit.form._FormSelectWidget",dijit.form._FormValueWidget,{multiple:false,options:null,store:null,query:null,queryOptions:null,onFetch:null,sortByLabel:true,loadChildrenOnOpen:false,getOptions:function(_3a3){var _3a4=_3a3,opts=this.options||[],l=opts.length;if(_3a4===undefined){return opts;}if(dojo.isArray(_3a4)){return dojo.map(_3a4,"return this.getOptions(item);",this);}if(dojo.isObject(_3a3)){if(!dojo.some(this.options,function(o,idx){if(o===_3a4||(o.value&&o.value===_3a4.value)){_3a4=idx;return true;}return false;})){_3a4=-1;}}if(typeof _3a4=="string"){for(var i=0;i<l;i++){if(opts[i].value===_3a4){_3a4=i;break;}}}if(typeof _3a4=="number"&&_3a4>=0&&_3a4<l){return this.options[_3a4];}return null;},addOption:function(_3a5){if(!dojo.isArray(_3a5)){_3a5=[_3a5];}dojo.forEach(_3a5,function(i){if(i&&dojo.isObject(i)){this.options.push(i);}},this);this._loadChildren();},removeOption:function(_3a6){if(!dojo.isArray(_3a6)){_3a6=[_3a6];}var _3a7=this.getOptions(_3a6);dojo.forEach(_3a7,function(i){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(_3a8){if(!dojo.isArray(_3a8)){_3a8=[_3a8];}dojo.forEach(_3a8,function(i){var _3a9=this.getOptions(i),k;if(_3a9){for(k in i){_3a9[k]=i[k];}}},this);this._loadChildren();},setStore:function(_3aa,_3ab,_3ac){var _3ad=this.store;_3ac=_3ac||{};if(_3ad!==_3aa){dojo.forEach(this._notifyConnections||[],dojo.disconnect);delete this._notifyConnections;if(_3aa&&_3aa.getFeatures()["dojo.data.api.Notification"]){this._notifyConnections=[dojo.connect(_3aa,"onNew",this,"_onNewItem"),dojo.connect(_3aa,"onDelete",this,"_onDeleteItem"),dojo.connect(_3aa,"onSet",this,"_onSetItem")];}this._set("store",_3aa);}this._onChangeActive=false;if(this.options&&this.options.length){this.removeOption(this.options);}if(_3aa){this._loadingStore=true;_3aa.fetch(dojo.delegate(_3ac,{onComplete:function(_3ae,opts){if(this.sortByLabel&&!_3ac.sort&&_3ae.length){_3ae.sort(dojo.data.util.sorter.createSortFunction([{attribute:_3aa.getLabelAttributes(_3ae[0])[0]}],_3aa));}if(_3ac.onFetch){_3ae=_3ac.onFetch.call(this,_3ae,opts);}dojo.forEach(_3ae,function(i){this._addOptionForItem(i);},this);this._loadingStore=false;this.set("value","_pendingValue" in this?this._pendingValue:_3ab);delete this._pendingValue;if(!this.loadChildrenOnOpen){this._loadChildren();}else{this._pseudoLoadChildren(_3ae);}this._fetchedWith=opts;this._lastValueReported=this.multiple?[]:null;this._onChangeActive=true;this.onSetStore();this._handleOnChange(this.value);},scope:this}));}else{delete this._fetchedWith;}return _3ad;},_setValueAttr:function(_3af,_3b0){if(this._loadingStore){this._pendingValue=_3af;return;}var opts=this.getOptions()||[];if(!dojo.isArray(_3af)){_3af=[_3af];}dojo.forEach(_3af,function(i,idx){if(!dojo.isObject(i)){i=i+"";}if(typeof i==="string"){_3af[idx]=dojo.filter(opts,function(node){return node.value===i;})[0]||{value:"",label:""};}},this);_3af=dojo.filter(_3af,function(i){return i&&i.value;});if(!this.multiple&&(!_3af[0]||!_3af[0].value)&&opts.length){_3af[0]=opts[0];}dojo.forEach(opts,function(i){i.selected=dojo.some(_3af,function(v){return v.value===i.value;});});var val=dojo.map(_3af,function(i){return i.value;}),disp=dojo.map(_3af,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,_3b0);},_getDisplayedValueAttr:function(){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(){if(this._loadingStore){return;}dojo.forEach(this._getChildren(),function(_3b1){_3b1.destroyRecursive();});dojo.forEach(this.options,this._addOptionItem,this);this._updateSelection();},_updateSelection:function(){this._set("value",this._getValueFromOpts());var val=this.value;if(!dojo.isArray(val)){val=[val];}if(val&&val[0]){dojo.forEach(this._getChildren(),function(_3b2){var _3b3=dojo.some(val,function(v){return _3b2.option&&(v===_3b2.option.value);});dojo.toggleClass(_3b2.domNode,this.baseClass+"SelectedOption",_3b3);dijit.setWaiState(_3b2.domNode,"selected",_3b3);},this);}},_getValueFromOpts:function(){var opts=this.getOptions()||[];if(!this.multiple&&opts.length){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){return dojo.map(dojo.filter(opts,function(i){return i.selected;}),function(i){return i.value;})||[];}}return "";},_onNewItem:function(item,_3b4){if(!_3b4||!_3b4.parent){this._addOptionForItem(item);}},_onDeleteItem:function(item){var _3b5=this.store;this.removeOption(_3b5.getIdentity(item));},_onSetItem:function(item){this.updateOption(this._getOptionObjForItem(item));},_getOptionObjForItem:function(item){var _3b6=this.store,_3b7=_3b6.getLabel(item),_3b8=(_3b7?_3b6.getIdentity(item):null);return {value:_3b8,label:_3b7,item:item};},_addOptionForItem:function(item){var _3b9=this.store;if(!_3b9.isItemLoaded(item)){_3b9.loadItem({item:item,onComplete:function(i){this._addOptionForItem(item);},scope:this});return;}var _3ba=this._getOptionObjForItem(item);this.addOption(_3ba);},constructor:function(_3bb){this._oValue=(_3bb||{}).value||null;},buildRendering:function(){this.inherited(arguments);dojo.setSelectable(this.focusNode,false);},_fillContent: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),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(){this.inherited(arguments);this.connect(this,"onChange","_updateSelection");this.connect(this,"startup","_loadChildren");this._setValueAttr(this.value,null);},startup:function(){this.inherited(arguments);var _3bc=this.store,_3bd={};dojo.forEach(["query","queryOptions","onFetch"],function(i){if(this[i]){_3bd[i]=this[i];}delete this[i];},this);if(_3bc&&_3bc.getFeatures()["dojo.data.api.Identity"]){this.store=null;this.setStore(_3bc,this._oValue,_3bd);}},destroy:function(){dojo.forEach(this._notifyConnections||[],dojo.disconnect);this.inherited(arguments);},_addOptionItem:function(_3be){},_removeOptionItem:function(_3bf){},_setDisplay:function(_3c0){},_getChildren:function(){return [];},_getSelectedOptionsAttr:function(){return this.getOptions(this.get("value"));},_pseudoLoadChildren:function(_3c1){},onSetStore:function(){}});}if(!dojo._hasResource["dijit._KeyNavContainer"]){dojo._hasResource["dijit._KeyNavContainer"]=true;dojo.provide("dijit._KeyNavContainer");dojo.declare("dijit._KeyNavContainer",dijit._Container,{tabIndex:"0",_keyNavCodes:{},connectKeyNavHandlers:function(_3c2,_3c3){var _3c4=(this._keyNavCodes={});var prev=dojo.hitch(this,this.focusPrev);var next=dojo.hitch(this,this.focusNext);dojo.forEach(_3c2,function(code){_3c4[code]=prev;});dojo.forEach(_3c3,function(code){_3c4[code]=next;});_3c4[dojo.keys.HOME]=dojo.hitch(this,"focusFirstChild");_3c4[dojo.keys.END]=dojo.hitch(this,"focusLastChild");this.connect(this.domNode,"onkeypress","_onContainerKeypress");this.connect(this.domNode,"onfocus","_onContainerFocus");},startupKeyNavChildren:function(){dojo.forEach(this.getChildren(),dojo.hitch(this,"_startupChild"));},addChild:function(_3c5,_3c6){dijit._KeyNavContainer.superclass.addChild.apply(this,arguments);this._startupChild(_3c5);},focus:function(){this.focusFirstChild();},focusFirstChild:function(){var _3c7=this._getFirstFocusableChild();if(_3c7){this.focusChild(_3c7);}},focusLastChild:function(){var _3c8=this._getLastFocusableChild();if(_3c8){this.focusChild(_3c8);}},focusNext:function(){var _3c9=this._getNextFocusableChild(this.focusedChild,1);this.focusChild(_3c9);},focusPrev:function(){var _3ca=this._getNextFocusableChild(this.focusedChild,-1);this.focusChild(_3ca,true);},focusChild:function(_3cb,last){if(this.focusedChild&&_3cb!==this.focusedChild){this._onChildBlur(this.focusedChild);}_3cb.set("tabIndex",this.tabIndex);_3cb.focus(last?"end":"start");this._set("focusedChild",_3cb);},_startupChild:function(_3cc){_3cc.set("tabIndex","-1");this.connect(_3cc,"_onFocus",function(){_3cc.set("tabIndex",this.tabIndex);});this.connect(_3cc,"_onBlur",function(){_3cc.set("tabIndex","-1");});},_onContainerFocus:function(evt){if(evt.target!==this.domNode){return;}this.focusFirstChild();dojo.attr(this.domNode,"tabIndex","-1");},_onBlur:function(evt){if(this.tabIndex){dojo.attr(this.domNode,"tabIndex",this.tabIndex);}this.inherited(arguments);},_onContainerKeypress:function(evt){if(evt.ctrlKey||evt.altKey){return;}var func=this._keyNavCodes[evt.charOrCode];if(func){func();dojo.stopEvent(evt);}},_onChildBlur:function(_3cd){},_getFirstFocusableChild:function(){return this._getNextFocusableChild(null,1);},_getLastFocusableChild:function(){return this._getNextFocusableChild(null,-1);},_getNextFocusableChild:function(_3ce,dir){if(_3ce){_3ce=this._getSiblingOfChild(_3ce,dir);}var _3cf=this.getChildren();for(var i=0;i<_3cf.length;i++){if(!_3ce){_3ce=_3cf[(dir>0)?0:(_3cf.length-1)];}if(_3ce.isFocusable()){return _3ce;}_3ce=this._getSiblingOfChild(_3ce,dir);}return null;}});}if(!dojo._hasResource["dijit.MenuItem"]){dojo._hasResource["dijit.MenuItem"]=true;dojo.provide("dijit.MenuItem");dojo.declare("dijit.MenuItem",[dijit._Widget,dijit._Templated,dijit._Contained,dijit._CssStateMixin],{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:"",iconClass:"",accelKey:"",disabled:false,_fillContent:function(_3d0){if(_3d0&&!("label" in this.params)){this.set("label",_3d0.innerHTML);}},buildRendering:function(){this.inherited(arguments);var _3d1=this.id+"_text";dojo.attr(this.containerNode,"id",_3d1);if(this.accelKeyNode){dojo.attr(this.accelKeyNode,"id",this.id+"_accel");_3d1+=" "+this.id+"_accel";}dijit.setWaiState(this.domNode,"labelledby",_3d1);dojo.setSelectable(this.domNode,false);},_onHover:function(){this.getParent().onItemHover(this);},_onUnhover:function(){this.getParent().onItemUnhover(this);this._set("hovering",false);},_onClick:function(evt){this.getParent().onItemClick(this,evt);dojo.stopEvent(evt);},onClick:function(evt){},focus:function(){try{if(dojo.isIE==8){this.containerNode.focus();}dijit.focus(this.focusNode);}catch(e){}},_onFocus:function(){this._setSelected(true);this.getParent()._onItemFocus(this);this.inherited(arguments);},_setSelected:function(_3d2){dojo.toggleClass(this.domNode,"dijitMenuItemSelected",_3d2);},setLabel:function(_3d3){dojo.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_3d3);},setDisabled:function(_3d4){dojo.deprecated("dijit.Menu.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_3d4);},_setDisabledAttr:function(_3d5){dijit.setWaiState(this.focusNode,"disabled",_3d5?"true":"false");this._set("disabled",_3d5);},_setAccelKeyAttr:function(_3d6){this.accelKeyNode.style.display=_3d6?"":"none";this.accelKeyNode.innerHTML=_3d6;dojo.attr(this.containerNode,"colSpan",_3d6?"1":"2");this._set("accelKey",_3d6);}});}if(!dojo._hasResource["dijit.PopupMenuItem"]){dojo._hasResource["dijit.PopupMenuItem"]=true;dojo.provide("dijit.PopupMenuItem");dojo.declare("dijit.PopupMenuItem",dijit.MenuItem,{_fillContent:function(){if(this.srcNodeRef){var _3d7=dojo.query("*",this.srcNodeRef);dijit.PopupMenuItem.superclass._fillContent.call(this,_3d7[0]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}this.inherited(arguments);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){if(!this.popup._destroyed){this.popup.destroyRecursive();}delete this.popup;}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.CheckedMenuItem"]){dojo._hasResource["dijit.CheckedMenuItem"]=true;dojo.provide("dijit.CheckedMenuItem");dojo.declare("dijit.CheckedMenuItem",dijit.MenuItem,{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:false,_setCheckedAttr:function(_3d8){dojo.toggleClass(this.domNode,"dijitCheckedMenuItemChecked",_3d8);dijit.setWaiState(this.domNode,"checked",_3d8);this._set("checked",_3d8);},onChange:function(_3d9){},_onClick:function(e){if(!this.disabled){this.set("checked",!this.checked);this.onChange(this.checked);}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.MenuSeparator"]){dojo._hasResource["dijit.MenuSeparator"]=true;dojo.provide("dijit.MenuSeparator");dojo.declare("dijit.MenuSeparator",[dijit._Widget,dijit._Templated,dijit._Contained],{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(){return false;}});}if(!dojo._hasResource["dijit.Menu"]){dojo._hasResource["dijit.Menu"]=true;dojo.provide("dijit.Menu");dojo.declare("dijit._MenuBase",[dijit._Widget,dijit._Templated,dijit._KeyNavContainer],{parentMenu:null,popupDelay:500,startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_3da){_3da.startup();});this.startupKeyNavChildren();this.inherited(arguments);},onExecute:function(){},onCancel:function(_3db){},_moveToPopup:function(evt){if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){this.focusedChild._onClick(evt);}else{var _3dc=this._getTopMenu();if(_3dc&&_3dc._isMenuBar){_3dc.focusNext();}}},_onPopupHover:function(evt){if(this.currentPopup&&this.currentPopup._pendingClose_timer){var _3dd=this.currentPopup.parentMenu;if(_3dd.focusedChild){_3dd.focusedChild._setSelected(false);}_3dd.focusedChild=this.currentPopup.from_item;_3dd.focusedChild._setSelected(true);this._stopPendingCloseTimer(this.currentPopup);}},onItemHover:function(item){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(this.focusedChild){this.focusChild(item);}this._hoveredChild=item;},_onChildBlur:function(item){this._stopPopupTimer();item._setSelected(false);var _3de=item.popup;if(_3de){this._stopPendingCloseTimer(_3de);_3de._pendingClose_timer=setTimeout(function(){_3de._pendingClose_timer=null;if(_3de.parentMenu){_3de.parentMenu.currentPopup=null;}dijit.popup.close(_3de);},this.popupDelay);}},onItemUnhover:function(item){if(this.isActive){this._stopPopupTimer();}if(this._hoveredChild==item){this._hoveredChild=null;}},_stopPopupTimer:function(){if(this.hover_timer){clearTimeout(this.hover_timer);this.hover_timer=null;}},_stopPendingCloseTimer:function(_3df){if(_3df._pendingClose_timer){clearTimeout(_3df._pendingClose_timer);_3df._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(item,evt){if(typeof this.isShowingNow=="undefined"){this._markActive();}this.focusChild(item);if(item.disabled){return false;}if(item.popup){this._openPopup();}else{this.onExecute();item.onClick(evt);}},_openPopup:function(){this._stopPopupTimer();var _3e0=this.focusedChild;if(!_3e0){return;}var _3e1=_3e0.popup;if(_3e1.isShowingNow){return;}if(this.currentPopup){this._stopPendingCloseTimer(this.currentPopup);dijit.popup.close(this.currentPopup);}_3e1.parentMenu=this;_3e1.from_item=_3e0;var self=this;dijit.popup.open({parent:this,popup:_3e1,around:_3e0.domNode,orient:this._orient||(this.isLeftToRight()?{"TR":"TL","TL":"TR","BR":"BL","BL":"BR"}:{"TL":"TR","TR":"TL","BL":"BR","BR":"BL"}),onCancel:function(){self.focusChild(_3e0);self._cleanUp();_3e0._setSelected(true);self.focusedChild=_3e0;},onExecute:dojo.hitch(this,"_cleanUp")});this.currentPopup=_3e1;_3e1.connect(_3e1.domNode,"onmouseenter",dojo.hitch(self,"_onPopupHover"));if(_3e1.focus){_3e1._focus_timer=setTimeout(dojo.hitch(_3e1,function(){this._focus_timer=null;this.focus();}),0);}},_markActive:function(){this.isActive=true;dojo.replaceClass(this.domNode,"dijitMenuActive","dijitMenuPassive");},onOpen:function(e){this.isShowingNow=true;this._markActive();},_markInactive:function(){this.isActive=false;dojo.replaceClass(this.domNode,"dijitMenuPassive","dijitMenuActive");},onClose:function(){this._stopFocusTimer();this._markInactive();this.isShowingNow=false;this.parentMenu=null;},_closeChild:function(){this._stopPopupTimer();var _3e2=this.focusedChild&&this.focusedChild.from_item;if(this.currentPopup){if(dijit._curFocus&&dojo.isDescendant(dijit._curFocus,this.currentPopup.domNode)){this.focusedChild.focusNode.focus();}dijit.popup.close(this.currentPopup);this.currentPopup=null;}if(this.focusedChild){this.focusedChild._setSelected(false);this.focusedChild._onUnhover();this.focusedChild=null;}},_onItemFocus:function(item){if(this._hoveredChild&&this._hoveredChild!=item){this._hoveredChild._onUnhover();}},_onBlur:function(){this._cleanUp();this.inherited(arguments);},_cleanUp:function(){this._closeChild();if(typeof this.isShowingNow=="undefined"){this._markInactive();}}});dojo.declare("dijit.Menu",dijit._MenuBase,{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:[],contextMenuForWindow:false,leftClickToOpen:false,refocus:true,postCreate:function(){if(this.contextMenuForWindow){this.bindDomNode(dojo.body());}else{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(evt){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;}},_iframeContentWindow:function(_3e3){var win=dojo.window.get(this._iframeContentDocument(_3e3))||this._iframeContentDocument(_3e3)["__parent__"]||(_3e3.name&&dojo.doc.frames[_3e3.name])||null;return win;},_iframeContentDocument:function(_3e4){var doc=_3e4.contentDocument||(_3e4.contentWindow&&_3e4.contentWindow.document)||(_3e4.name&&dojo.doc.frames[_3e4.name]&&dojo.doc.frames[_3e4.name].document)||null;return doc;},bindDomNode:function(node){node=dojo.byId(node);var cn;if(node.tagName.toLowerCase()=="iframe"){var _3e5=node,win=this._iframeContentWindow(_3e5);cn=dojo.withGlobal(win,dojo.body);}else{cn=(node==dojo.body()?dojo.doc.documentElement:node);}var _3e6={node:node,iframe:_3e5};dojo.attr(node,"_dijitMenu"+this.id,this._bindings.push(_3e6));var _3e7=dojo.hitch(this,function(cn){return [dojo.connect(cn,this.leftClickToOpen?"onclick":"oncontextmenu",this,function(evt){dojo.stopEvent(evt);this._scheduleOpen(evt.target,_3e5,{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,_3e5);}})];});_3e6.connects=cn?_3e7(cn):[];if(_3e5){_3e6.onloadHandler=dojo.hitch(this,function(){var win=this._iframeContentWindow(_3e5);cn=dojo.withGlobal(win,dojo.body);_3e6.connects=_3e7(cn);});if(_3e5.addEventListener){_3e5.addEventListener("load",_3e6.onloadHandler,false);}else{_3e5.attachEvent("onload",_3e6.onloadHandler);}}},unBindDomNode:function(_3e8){var node;try{node=dojo.byId(_3e8);}catch(e){return;}var _3e9="_dijitMenu"+this.id;if(node&&dojo.hasAttr(node,_3e9)){var bid=dojo.attr(node,_3e9)-1,b=this._bindings[bid];dojo.forEach(b.connects,dojo.disconnect);var _3ea=b.iframe;if(_3ea){if(_3ea.removeEventListener){_3ea.removeEventListener("load",b.onloadHandler,false);}else{_3ea.detachEvent("onload",b.onloadHandler);}}dojo.removeAttr(node,_3e9);delete this._bindings[bid];}},_scheduleOpen:function(_3eb,_3ec,_3ed){if(!this._openTimer){this._openTimer=setTimeout(dojo.hitch(this,function(){delete this._openTimer;this._openMyself({target:_3eb,iframe:_3ec,coords:_3ed});}),1);}},_openMyself:function(args){var _3ee=args.target,_3ef=args.iframe,_3f0=args.coords;if(_3f0){if(_3ef){var od=_3ee.ownerDocument,ifc=dojo.position(_3ef,true),win=this._iframeContentWindow(_3ef),_3f1=dojo.withGlobal(win,"_docScroll",dojo);var cs=dojo.getComputedStyle(_3ef),tp=dojo._toPixelValue,left=(dojo.isIE&&dojo.isQuirks?0:tp(_3ef,cs.paddingLeft))+(dojo.isIE&&dojo.isQuirks?tp(_3ef,cs.borderLeftWidth):0),top=(dojo.isIE&&dojo.isQuirks?0:tp(_3ef,cs.paddingTop))+(dojo.isIE&&dojo.isQuirks?tp(_3ef,cs.borderTopWidth):0);_3f0.x+=ifc.x+left-_3f1.x;_3f0.y+=ifc.y+top-_3f1.y;}}else{_3f0=dojo.position(_3ee,true);_3f0.x+=10;_3f0.y+=10;}var self=this;var _3f2=dijit.getFocus(this);function _3f3(){if(self.refocus){dijit.focus(_3f2);}dijit.popup.close(self);};dijit.popup.open({popup:this,x:_3f0.x,y:_3f0.y,onExecute:_3f3,onCancel:_3f3,orient:this.isLeftToRight()?"L":"R"});this.focus();this._onBlur=function(){this.inherited("_onBlur",arguments);dijit.popup.close(this);};},uninitialize:function(){dojo.forEach(this._bindings,function(b){if(b){this.unBindDomNode(b.node);}},this);this.inherited(arguments);}});}if(!dojo._hasResource["dijit.form.Select"]){dojo._hasResource["dijit.form.Select"]=true;dojo.provide("dijit.form.Select");dojo.declare("dijit.form._SelectMenu",dijit.Menu,{buildRendering:function(){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(){this.inherited(arguments);this.connect(this.domNode,"onmousemove",dojo.stopEvent);},resize:function(mb){if(mb){dojo.marginBox(this.domNode,mb);if("w" in mb){this.menuTableNode.style.width="100%";}}}});dojo.declare("dijit.form.Select",[dijit.form._FormSelectWidget,dijit._HasDropDown],{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:dojo.mixin(dojo.clone(dijit.form._FormSelectWidget.prototype.attributeMap),{style:"tableNode"}),required:false,state:"",message:"",tooltipPosition:[],emptyLabel:"&nbsp;",_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 dijit.form._SelectMenu({id:this.id+"_menu"});dojo.addClass(this.dropDown.domNode,this.baseClass+"Menu");},_getMenuItemForOption:function(_3f4){if(!_3f4.value&&!_3f4.label){return new dijit.MenuSeparator();}else{var _3f5=dojo.hitch(this,"_setValueAttr",_3f4);var item=new dijit.MenuItem({option:_3f4,label:_3f4.label||this.emptyLabel,onClick:_3f5,disabled:_3f4.disabled||false});dijit.setWaiRole(item.focusNode,"listitem");return item;}},_addOptionItem:function(_3f6){if(this.dropDown){this.dropDown.addChild(this._getMenuItemForOption(_3f6));}},_getChildren:function(){if(!this.dropDown){return [];}return this.dropDown.getChildren();},_loadChildren:function(_3f7){if(_3f7===true){if(this.dropDown){delete this.dropDown.focusedChild;}if(this.options.length){this.inherited(arguments);}else{dojo.forEach(this._getChildren(),function(_3f8){_3f8.destroyRecursive();});var item=new dijit.MenuItem({label:"&nbsp;"});this.dropDown.addChild(item);}}else{this._updateSelection();}this._isLoaded=false;this._childrenLoaded=true;if(!this._loadingStore){this._setValueAttr(this.value);}},_setValueAttr:function(_3f9){this.inherited(arguments);dojo.attr(this.valueNode,"value",this.get("value"));},_setDisplay:function(_3fa){var lbl=_3fa||this.emptyLabel;this.containerNode.innerHTML="<span class=\"dijitReset dijitInline "+this.baseClass+"Label\">"+lbl+"</span>";dijit.setWaiState(this.focusNode,"valuetext",lbl);},validate:function(_3fb){var _3fc=this.isValid(_3fb);this._set("state",_3fc?"":"Error");dijit.setWaiState(this.focusNode,"invalid",_3fc?"false":"true");var _3fd=_3fc?"":this._missingMsg;if(this.message!==_3fd){this._set("message",_3fd);dijit.hideTooltip(this.domNode);if(_3fd){dijit.showTooltip(_3fd,this.domNode,this.tooltipPosition,!this.isLeftToRight());}}return _3fc;},isValid:function(_3fe){return (!this.required||this.value===0||!(/^\s*$/.test(this.value||"")));},reset:function(){this.inherited(arguments);dijit.hideTooltip(this.domNode);this._set("state","");this._set("message","");},postMixInProperties:function(){this.inherited(arguments);this._missingMsg=dojo.i18n.getLocalization("dijit.form","validate",this.lang).missingMessage;},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onmousemove",dojo.stopEvent);},_setStyleAttr:function(_3ff){this.inherited(arguments);dojo.toggleClass(this.domNode,this.baseClass+"FixedWidth",!!this.tableNode.style.width);},isLoaded:function(){return this._isLoaded;},loadDropDown:function(_400){this._loadChildren(true);this._isLoaded=true;_400();},closeDropDown:function(){this.inherited(arguments);if(this.dropDown&&this.dropDown.menuTableNode){this.dropDown.menuTableNode.style.width="";}},uninitialize:function(_401){if(this.dropDown&&!this.dropDown._destroyed){this.dropDown.destroyRecursive(_401);delete this.dropDown;}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.form.SimpleTextarea"]){dojo._hasResource["dijit.form.SimpleTextarea"]=true;dojo.provide("dijit.form.SimpleTextarea");dojo.declare("dijit.form.SimpleTextarea",dijit.form.TextBox,{baseClass:"dijitTextBox dijitTextArea",attributeMap:dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap,{rows:"textbox",cols:"textbox"}),rows:"3",cols:"20",templateString:"<textarea ${!nameAttrSetting} dojoAttachPoint='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(dojo.isIE&&this.cols){dojo.addClass(this.textbox,"dijitTextAreaCols");}},filter:function(_402){if(_402){_402=_402.replace(/\r/g,"");}return this.inherited(arguments);},_previousValue:"",_onInput:function(e){if(this.maxLength){var _403=parseInt(this.maxLength);var _404=this.textbox.value.replace(/\r/g,"");var _405=_404.length-_403;if(_405>0){if(e){dojo.stopEvent(e);}var _406=this.textbox;if(_406.selectionStart){var pos=_406.selectionStart;var cr=0;if(dojo.isOpera){cr=(this.textbox.value.substring(0,pos).match(/\r/g)||[]).length;}this.textbox.value=_404.substring(0,pos-_405-cr)+_404.substring(pos-cr);_406.setSelectionRange(pos-_405,pos-_405);}else{if(dojo.doc.selection){_406.focus();var _407=dojo.doc.selection.createRange();_407.moveStart("character",-_405);_407.text="";_407.select();}}}this._previousValue=this.textbox.value;}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.InlineEditBox"]){dojo._hasResource["dijit.InlineEditBox"]=true;dojo.provide("dijit.InlineEditBox");dojo.declare("dijit.InlineEditBox",dijit._Widget,{editing:false,autoSave:true,buttonSave:"",buttonCancel:"",renderAsHtml:false,editor:"dijit.form.TextBox",editorWrapper:"dijit._InlineEditor",editorParams:{},disabled:false,onChange:function(_408){},onCancel:function(){},width:"100%",value:"",noValueIndicator:dojo.isIE<=6?"<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(){this.editorParams={};},postMixInProperties:function(){this.inherited(arguments);this.displayNode=this.srcNodeRef;var _409={ondijitclick:"_onClick",onmouseover:"_onMouseOver",onmouseout:"_onMouseOut",onfocus:"_onMouseOver",onblur:"_onMouseOut"};for(var name in _409){this.connect(this.displayNode,name,_409[name]);}dijit.setWaiRole(this.displayNode,"button");if(!this.displayNode.getAttribute("tabIndex")){this.displayNode.setAttribute("tabIndex",0);}if(!this.value&&!("value" in this.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(_40a){dojo.deprecated("dijit.InlineEditBox.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_40a);},_setDisabledAttr:function(_40b){dijit.setWaiState(this.domNode,"disabled",_40b);if(_40b){this.displayNode.removeAttribute("tabIndex");}else{this.displayNode.setAttribute("tabIndex",0);}dojo.toggleClass(this.displayNode,"dijitInlineEditBoxDisplayModeDisabled",_40b);this._set("disabled",_40b);},_onMouseOver:function(){if(!this.disabled){dojo.addClass(this.displayNode,"dijitInlineEditBoxDisplayModeHover");}},_onMouseOut:function(){dojo.removeClass(this.displayNode,"dijitInlineEditBoxDisplayModeHover");},_onClick:function(e){if(this.disabled){return;}if(e){dojo.stopEvent(e);}this._onMouseOut();setTimeout(dojo.hitch(this,"edit"),0);},edit:function(){if(this.disabled||this.editing){return;}this.editing=true;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{var _40c=dojo.create("span",null,this.domNode,"before");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")},_40c);if(!this._started){this.startup();}}var ww=this.wrapperWidget;if(dojo.isIE){dijit.focus(dijit.getFocus());}dojo.style(this.displayNode,{position:"absolute",opacity:"0",display:"none"});dojo.style(ww.domNode,{position:this._savedPosition,visibility:"visible",opacity:"1"});dojo.attr(this.displayNode,"tabIndex","-1");setTimeout(dojo.hitch(this,function(){ww.focus();ww._resetValue=ww.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(_40d){var ww=this.wrapperWidget;dojo.style(ww.domNode,{position:"absolute",visibility:"hidden",opacity:"0"});dojo.style(this.displayNode,{position:this._savedPosition,opacity:this._savedOpacity,display:""});dojo.attr(this.displayNode,"tabIndex",this._savedTabIndex);if(_40d){dijit.focus(this.displayNode);}},save:function(_40e){if(this.disabled||!this.editing){return;}this.editing=false;var ww=this.wrapperWidget;var _40f=ww.getValue();this.set("value",_40f);this._showText(_40e);},setValue:function(val){dojo.deprecated("dijit.InlineEditBox.setValue() is deprecated. Use set('value', ...) instead.","","2.0");return this.set("value",val);},_setValueAttr:function(val){val=dojo.trim(val);var _410=this.renderAsHtml?val:val.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;").replace(/\n/g,"<br>");this.displayNode.innerHTML=_410||this.noValueIndicator;this._set("value",val);if(this._started){setTimeout(dojo.hitch(this,"onChange",val),0);}},getValue:function(){dojo.deprecated("dijit.InlineEditBox.getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},cancel:function(_411){if(this.disabled||!this.editing){return;}this.editing=false;setTimeout(dojo.hitch(this,"onCancel"),0);this._showText(_411);}});dojo.declare("dijit._InlineEditor",[dijit._Widget,dijit._Templated],{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);var cls=typeof this.editor=="string"?dojo.getObject(this.editor):this.editor;var _412=this.sourceStyle,_413="line-height:"+_412.lineHeight+";",_414=dojo.getComputedStyle(this.domNode);dojo.forEach(["Weight","Family","Size","Style"],function(prop){var _415=_412["font"+prop],_416=_414["font"+prop];if(_416!=_415){_413+="font-"+prop+":"+_412["font"+prop]+";";}},this);dojo.forEach(["marginTop","marginBottom","marginLeft","marginRight"],function(prop){this.domNode.style[prop]=_412[prop];},this);var _417=this.inlineEditBox.width;if(_417=="100%"){_413+="width:100%;";this.domNode.style.display="block";}else{_413+="width:"+(_417+(Number(_417)==_417?"px":""))+";";}var _418=dojo.delegate(this.inlineEditBox.editorParams,{style:_413,dir:this.dir,lang:this.lang});_418["displayedValue" in cls.prototype?"displayedValue":"value"]=this.value;this.editWidget=new cls(_418,this.editorPlaceholder);if(this.inlineEditBox.autoSave){dojo.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(val){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==dojo.keys.ESCAPE){dojo.stopEvent(e);this.cancel(true);}else{if(e.charOrCode==dojo.keys.ENTER&&e.target.tagName=="INPUT"){dojo.stopEvent(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()){dojo.style(this.inlineEditBox.displayNode,{display:""});dijit.focus(this.inlineEditBox.displayNode);}},enableSave:function(){return (this.editWidget.isValid?this.editWidget.isValid():true);},focus:function(){this.editWidget.focus();setTimeout(dojo.hitch(this,function(){if(this.editWidget.focusNode&&this.editWidget.focusNode.tagName=="INPUT"){dijit.selectInputText(this.editWidget.focusNode);}}),0);}});}if(!dojo._hasResource["dojo.cookie"]){dojo._hasResource["dojo.cookie"]=true;dojo.provide("dojo.cookie");dojo.cookie=function(name,_419,_41a){var c=document.cookie;if(arguments.length==1){var _41b=c.match(new RegExp("(?:^|; )"+dojo.regexp.escapeString(name)+"=([^;]*)"));return _41b?decodeURIComponent(_41b[1]):undefined;}else{_41a=_41a||{};var exp=_41a.expires;if(typeof exp=="number"){var d=new Date();d.setTime(d.getTime()+exp*24*60*60*1000);exp=_41a.expires=d;}if(exp&&exp.toUTCString){_41a.expires=exp.toUTCString();}_419=encodeURIComponent(_419);var _41c=name+"="+_419,_41d;for(_41d in _41a){_41c+="; "+_41d;var _41e=_41a[_41d];if(_41e!==true){_41c+="="+_41e;}}document.cookie=_41c;}};dojo.cookie.isSupported=function(){if(!("cookieEnabled" in navigator)){this("__djCookieTest__","CookiesAllowed");navigator.cookieEnabled=this("__djCookieTest__")=="CookiesAllowed";if(navigator.cookieEnabled){this("__djCookieTest__","",{expires:-1});}}return navigator.cookieEnabled;};}if(!dojo._hasResource["dijit.layout.StackController"]){dojo._hasResource["dijit.layout.StackController"]=true;dojo.provide("dijit.layout.StackController");dojo.declare("dijit.layout.StackController",[dijit._Widget,dijit._Templated,dijit._Container],{templateString:"<span role='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",containerId:"",buttonWidget:"dijit.layout._StackButton",constructor:function(){this.pane2button={};this.pane2connects={};this.pane2watches={};},buildRendering:function(){this.inherited(arguments);dijit.setWaiRole(this.domNode,"tablist");},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(info){dojo.forEach(info.children,this.onAddChild,this);if(info.selected){this.onSelectChild(info.selected);}},destroy:function(){for(var pane in this.pane2button){this.onRemoveChild(dijit.byId(pane));}this.inherited(arguments);},onAddChild:function(page,_41f){var cls=dojo.getObject(this.buttonWidget);var _420=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(_420.focusNode,"selected","false");var _421=["title","showTitle","iconClass","closable","tooltip"],_422=["label","showLabel","iconClass","closeButton","title"];this.pane2watches[page.id]=dojo.map(_421,function(_423,idx){return page.watch(_423,function(name,_424,_425){_420.set(_422[idx],_425);});});this.pane2connects[page.id]=[this.connect(_420,"onClick",dojo.hitch(this,"onButtonClick",page)),this.connect(_420,"onClickCloseButton",dojo.hitch(this,"onCloseButtonClick",page))];this.addChild(_420,_41f);this.pane2button[page.id]=_420;page.controlButton=_420;if(!this._currentChild){_420.focusNode.setAttribute("tabIndex","0");dijit.setWaiState(_420.focusNode,"selected","true");this._currentChild=page;}if(!this.isLeftToRight()&&dojo.isIE&&this._rectifyRtlTabList){this._rectifyRtlTabList();}},onRemoveChild:function(page){if(this._currentChild===page){this._currentChild=null;}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 _426=this.pane2button[page.id];if(_426){this.removeChild(_426);delete this.pane2button[page.id];_426.destroy();}delete page.controlButton;},onSelectChild:function(page){if(!page){return;}if(this._currentChild){var _427=this.pane2button[this._currentChild.id];_427.set("checked",false);dijit.setWaiState(_427.focusNode,"selected","false");_427.focusNode.setAttribute("tabIndex","-1");}var _428=this.pane2button[page.id];_428.set("checked",true);dijit.setWaiState(_428.focusNode,"selected","true");this._currentChild=page;_428.focusNode.setAttribute("tabIndex","0");var _429=dijit.byId(this.containerId);dijit.setWaiState(_429.containerNode,"labelledby",_428.id);},onButtonClick:function(page){var _42a=dijit.byId(this.containerId);_42a.selectChild(page);},onCloseButtonClick:function(page){var _42b=dijit.byId(this.containerId);_42b.closeChild(page);if(this._currentChild){var b=this.pane2button[this._currentChild.id];if(b){dijit.focus(b.focusNode||b.domNode);}}},adjacent:function(_42c){if(!this.isLeftToRight()&&(!this.tabPosition||/top|bottom/.test(this.tabPosition))){_42c=!_42c;}var _42d=this.getChildren();var _42e=dojo.indexOf(_42d,this.pane2button[this._currentChild.id]);var _42f=_42c?1:_42d.length-1;return _42d[(_42e+_42f)%_42d.length];},onkeypress:function(e){if(this.disabled||e.altKey){return;}var _430=null;if(e.ctrlKey||!e._djpage){var k=dojo.keys;switch(e.charOrCode){case k.LEFT_ARROW:case k.UP_ARROW:if(!e._djpage){_430=false;}break;case k.PAGE_UP:if(e.ctrlKey){_430=false;}break;case k.RIGHT_ARROW:case k.DOWN_ARROW:if(!e._djpage){_430=true;}break;case k.PAGE_DOWN:if(e.ctrlKey){_430=true;}break;case k.HOME:case k.END:var _431=this.getChildren();if(_431&&_431.length){_431[e.charOrCode==k.HOME?0:_431.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);}}}}if(_430!==null){this.adjacent(_430).onClick();dojo.stopEvent(e);}}},onContainerKeyPress:function(info){info.e._djpage=info.page;this.onkeypress(info.e);}});dojo.declare("dijit.layout._StackButton",dijit.form.ToggleButton,{tabIndex:"-1",buildRendering:function(evt){this.inherited(arguments);dijit.setWaiRole((this.focusNode||this.domNode),"tab");},onClick:function(evt){dijit.focus(this.focusNode);},onClickCloseButton:function(evt){evt.stopPropagation();}});}if(!dojo._hasResource["dijit.layout.StackContainer"]){dojo._hasResource["dijit.layout.StackContainer"]=true;dojo.provide("dijit.layout.StackContainer");dojo.declare("dijit.layout.StackContainer",dijit.layout._LayoutWidget,{doLayout:true,persist:false,baseClass:"dijitStackContainer",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 _432=this.getChildren();dojo.forEach(_432,this._setupChild,this);if(this.persist){this.selectedChildWidget=dijit.byId(dojo.cookie(this.id+"_selectedChild"));}else{dojo.some(_432,function(_433){if(_433.selected){this.selectedChildWidget=_433;}return _433.selected;},this);}var _434=this.selectedChildWidget;if(!_434&&_432[0]){_434=this.selectedChildWidget=_432[0];_434.selected=true;}dojo.publish(this.id+"-startup",[{children:_432,selected:_434}]);this.inherited(arguments);},resize:function(){var _435=this.selectedChildWidget;if(_435&&!this._hasBeenShown){this._hasBeenShown=true;this._showChild(_435);}this.inherited(arguments);},_setupChild:function(_436){this.inherited(arguments);dojo.replaceClass(_436.domNode,"dijitHidden","dijitVisible");_436.domNode.title="";},addChild:function(_437,_438){this.inherited(arguments);if(this._started){dojo.publish(this.id+"-addChild",[_437,_438]);this.layout();if(!this.selectedChildWidget){this.selectChild(_437);}}},removeChild:function(page){this.inherited(arguments);if(this._started){dojo.publish(this.id+"-removeChild",[page]);}if(this._beingDestroyed){return;}if(this.selectedChildWidget===page){this.selectedChildWidget=undefined;if(this._started){var _439=this.getChildren();if(_439.length){this.selectChild(_439[0]);}}}if(this._started){this.layout();}},selectChild:function(page,_43a){page=dijit.byId(page);if(this.selectedChildWidget!=page){var d=this._transition(page,this.selectedChildWidget,_43a);this._set("selectedChildWidget",page);dojo.publish(this.id+"-selectChild",[page]);if(this.persist){dojo.cookie(this.id+"_selectedChild",this.selectedChildWidget.id);}}return d;},_transition:function(_43b,_43c,_43d){if(_43c){this._hideChild(_43c);}var d=this._showChild(_43b);if(_43b.resize){if(this.doLayout){_43b.resize(this._containerContentBox||this._contentBox);}else{_43b.resize();}}return d;},_adjacent:function(_43e){var _43f=this.getChildren();var _440=dojo.indexOf(_43f,this.selectedChildWidget);_440+=_43e?1:_43f.length-1;return _43f[_440%_43f.length];},forward:function(){return this.selectChild(this._adjacent(true),true);},back:function(){return this.selectChild(this._adjacent(false),true);},_onKeyPress:function(e){dojo.publish(this.id+"-containerKeyPress",[{e:e,page:this}]);},layout:function(){if(this.doLayout&&this.selectedChildWidget&&this.selectedChildWidget.resize){this.selectedChildWidget.resize(this._containerContentBox||this._contentBox);}},_showChild:function(page){var _441=this.getChildren();page.isFirstChild=(page==_441[0]);page.isLastChild=(page==_441[_441.length-1]);page._set("selected",true);dojo.replaceClass(page.domNode,"dijitVisible","dijitHidden");return page._onShow()||true;},_hideChild:function(page){page._set("selected",false);dojo.replaceClass(page.domNode,"dijitHidden","dijitVisible");page.onHide();},closeChild:function(page){var _442=page.onClose(this,page);if(_442){this.removeChild(page);page.destroyRecursive();}},destroyDescendants:function(_443){dojo.forEach(this.getChildren(),function(_444){this.removeChild(_444);_444.destroyRecursive(_443);},this);}});dojo.extend(dijit._Widget,{selected:false,closable:false,iconClass:"",showTitle:true});}if(!dojo._hasResource["dijit.layout.AccordionPane"]){dojo._hasResource["dijit.layout.AccordionPane"]=true;dojo.provide("dijit.layout.AccordionPane");dojo.declare("dijit.layout.AccordionPane",dijit.layout.ContentPane,{constructor:function(){dojo.deprecated("dijit.layout.AccordionPane deprecated, use ContentPane instead","","2.0");},onSelected:function(){}});}if(!dojo._hasResource["dijit.layout.AccordionContainer"]){dojo._hasResource["dijit.layout.AccordionContainer"]=true;dojo.provide("dijit.layout.AccordionContainer");dojo.declare("dijit.layout.AccordionContainer",dijit.layout.StackContainer,{duration:dijit.defaultDuration,buttonWidget:"dijit.layout._AccordionButton",baseClass:"dijitAccordionContainer",buildRendering:function(){this.inherited(arguments);this.domNode.style.overflow="hidden";dijit.setWaiRole(this.domNode,"tablist");},startup:function(){if(this._started){return;}this.inherited(arguments);if(this.selectedChildWidget){var _445=this.selectedChildWidget.containerNode.style;_445.display="";_445.overflow="auto";this.selectedChildWidget._wrapperWidget.set("selected",true);}},layout:function(){var _446=this.selectedChildWidget;if(!_446){return;}var _447=_446._wrapperWidget.domNode,_448=dojo._getMarginExtents(_447),_449=dojo._getPadBorderExtents(_447),_44a=_446._wrapperWidget.containerNode,_44b=dojo._getMarginExtents(_44a),_44c=dojo._getPadBorderExtents(_44a),_44d=this._contentBox;var _44e=0;dojo.forEach(this.getChildren(),function(_44f){if(_44f!=_446){_44e+=dojo._getMarginSize(_44f._wrapperWidget.domNode).h;}});this._verticalSpace=_44d.h-_44e-_448.h-_449.h-_44b.h-_44c.h-_446._buttonWidget.getTitleHeight();this._containerContentBox={h:this._verticalSpace,w:this._contentBox.w-_448.w-_449.w-_44b.w-_44c.w};if(_446){_446.resize(this._containerContentBox);}},_setupChild:function(_450){_450._wrapperWidget=new dijit.layout._AccordionInnerContainer({contentWidget:_450,buttonWidget:this.buttonWidget,id:_450.id+"_wrapper",dir:_450.dir,lang:_450.lang,parent:this});this.inherited(arguments);},addChild:function(_451,_452){if(this._started){dojo.place(_451.domNode,this.containerNode,_452);if(!_451._started){_451.startup();}this._setupChild(_451);dojo.publish(this.id+"-addChild",[_451,_452]);this.layout();if(!this.selectedChildWidget){this.selectChild(_451);}}else{this.inherited(arguments);}},removeChild:function(_453){if(_453._wrapperWidget){dojo.place(_453.domNode,_453._wrapperWidget.domNode,"after");_453._wrapperWidget.destroy();delete _453._wrapperWidget;}dojo.removeClass(_453.domNode,"dijitHidden");this.inherited(arguments);},getChildren:function(){return dojo.map(this.inherited(arguments),function(_454){return _454.declaredClass=="dijit.layout._AccordionInnerContainer"?_454.contentWidget:_454;},this);},destroy:function(){if(this._animation){this._animation.stop();}dojo.forEach(this.getChildren(),function(_455){if(_455._wrapperWidget){_455._wrapperWidget.destroy();}else{_455.destroyRecursive();}});this.inherited(arguments);},_showChild:function(_456){_456._wrapperWidget.containerNode.style.display="block";return this.inherited(arguments);},_hideChild:function(_457){_457._wrapperWidget.containerNode.style.display="none";this.inherited(arguments);},_transition:function(_458,_459,_45a){if(dojo.isIE<8){_45a=false;}if(this._animation){this._animation.stop(true);delete this._animation;}var self=this;if(_458){_458._wrapperWidget.set("selected",true);var d=this._showChild(_458);if(this.doLayout&&_458.resize){_458.resize(this._containerContentBox);}}if(_459){_459._wrapperWidget.set("selected",false);if(!_45a){this._hideChild(_459);}}if(_45a){var _45b=_458._wrapperWidget.containerNode,_45c=_459._wrapperWidget.containerNode;var _45d=_458._wrapperWidget.containerNode,_45e=dojo._getMarginExtents(_45d),_45f=dojo._getPadBorderExtents(_45d),_460=_45e.h+_45f.h;_45c.style.height=(self._verticalSpace-_460)+"px";this._animation=new dojo.Animation({node:_45b,duration:this.duration,curve:[1,this._verticalSpace-_460-1],onAnimate:function(_461){_461=Math.floor(_461);_45b.style.height=_461+"px";_45c.style.height=(self._verticalSpace-_460-_461)+"px";},onEnd:function(){delete self._animation;_45b.style.height="auto";_459._wrapperWidget.containerNode.style.display="none";_45c.style.height="auto";self._hideChild(_459);}});this._animation.onStop=this._animation.onEnd;this._animation.play();}return d;},_onKeyPress:function(e,_462){if(this.disabled||e.altKey||!(_462||e.ctrlKey)){return;}var k=dojo.keys,c=e.charOrCode;if((_462&&(c==k.LEFT_ARROW||c==k.UP_ARROW))||(e.ctrlKey&&c==k.PAGE_UP)){this._adjacent(false)._buttonWidget._onTitleClick();dojo.stopEvent(e);}else{if((_462&&(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],{baseClass:"dijitAccordionInnerContainer",isContainer:true,isLayoutContainer:true,buildRendering:function(){this.domNode=dojo.place("<div class='"+this.baseClass+"'>",this.contentWidget.domNode,"after");var _463=this.contentWidget,cls=dojo.getObject(this.buttonWidget);this.button=_463._buttonWidget=(new cls({contentWidget:_463,label:_463.title,title:_463.tooltip,dir:_463.dir,lang:_463.lang,iconClass:_463.iconClass,id:_463.id+"_button",parent:this.parent})).placeAt(this.domNode);this.containerNode=dojo.place("<div class='dijitAccordionChildWrapper' style='display:none'>",this.domNode);dojo.place(this.contentWidget.domNode,this.containerNode);},postCreate:function(){this.inherited(arguments);var _464=this.button;this._contentWidgetWatches=[this.contentWidget.watch("title",dojo.hitch(this,function(name,_465,_466){_464.set("label",_466);})),this.contentWidget.watch("tooltip",dojo.hitch(this,function(name,_467,_468){_464.set("title",_468);})),this.contentWidget.watch("iconClass",dojo.hitch(this,function(name,_469,_46a){_464.set("iconClass",_46a);}))];},_setSelectedAttr:function(_46b){this._set("selected",_46b);this.button.set("selected",_46b);if(_46b){var cw=this.contentWidget;if(cw.onSelected){cw.onSelected();}}},startup:function(){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(){this.contentWidget.destroyRecursive();}});dojo.declare("dijit.layout._AccordionButton",[dijit._Widget,dijit._Templated,dijit._CssStateMixin],{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(){return this.parent;},buildRendering:function(){this.inherited(arguments);var _46c=this.id.replace(" ","_");dojo.attr(this.titleTextNode,"id",_46c+"_title");dijit.setWaiState(this.focusNode,"labelledby",dojo.attr(this.titleTextNode,"id"));dojo.setSelectable(this.domNode,false);},getTitleHeight:function(){return dojo._getMarginSize(this.domNode).h;},_onTitleClick:function(){var _46d=this.getParent();_46d.selectChild(this.contentWidget,true);dijit.focus(this.focusNode);},_onTitleKeyPress:function(evt){return this.getParent()._onKeyPress(evt,this.contentWidget);},_setSelectedAttr:function(_46e){this._set("selected",_46e);dijit.setWaiState(this.focusNode,"expanded",_46e);dijit.setWaiState(this.focusNode,"selected",_46e);this.focusNode.setAttribute("tabIndex",_46e?"0":"-1");}});}if(!dojo._hasResource["dijit.layout.BorderContainer"]){dojo._hasResource["dijit.layout.BorderContainer"]=true;dojo.provide("dijit.layout.BorderContainer");dojo.declare("dijit.layout.BorderContainer",dijit.layout._LayoutWidget,{design:"headline",gutters:true,liveSplitters:true,persist:false,baseClass:"dijitBorderContainer",_splitterClass:"dijit.layout._Splitter",postMixInProperties:function(){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(_46f){var _470=_46f.region;if(_470){this.inherited(arguments);dojo.addClass(_46f.domNode,this.baseClass+"Pane");var ltr=this.isLeftToRight();if(_470=="leading"){_470=ltr?"left":"right";}if(_470=="trailing"){_470=ltr?"right":"left";}if(_470!="center"&&(_46f.splitter||this.gutters)&&!_46f._splitterWidget){var _471=dojo.getObject(_46f.splitter?this._splitterClass:"dijit.layout._Gutter");var _472=new _471({id:_46f.id+"_splitter",container:this,child:_46f,region:_470,live:this.liveSplitters});_472.isSplitter=true;_46f._splitterWidget=_472;dojo.place(_472.domNode,_46f.domNode,"after");_472.startup();}_46f.region=_470;}},layout:function(){this._layoutChildren();},addChild:function(_473,_474){this.inherited(arguments);if(this._started){this.layout();}},removeChild:function(_475){var _476=_475.region;var _477=_475._splitterWidget;if(_477){_477.destroy();delete _475._splitterWidget;}this.inherited(arguments);if(this._started){this._layoutChildren();}dojo.removeClass(_475.domNode,this.baseClass+"Pane");dojo.style(_475.domNode,{top:"auto",bottom:"auto",left:"auto",right:"auto",position:"static"});dojo.style(_475.domNode,_476=="top"||_476=="bottom"?"width":"height","auto");},getChildren:function(){return dojo.filter(this.inherited(arguments),function(_478){return !_478.isSplitter;});},getSplitter:function(_479){return dojo.filter(this.getChildren(),function(_47a){return _47a.region==_479;})[0]._splitterWidget;},resize:function(_47b,_47c){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(_47d,_47e){if(!this._borderBox||!this._borderBox.h){return;}var _47f=dojo.map(this.getChildren(),function(_480,idx){return {pane:_480,weight:[_480.region=="center"?Infinity:0,_480.layoutPriority,(this.design=="sidebar"?1:-1)*(/top|bottom/.test(_480.region)?1:-1),idx]};},this);_47f.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 _481=[];dojo.forEach(_47f,function(_482){var pane=_482.pane;_481.push(pane);if(pane._splitterWidget){_481.push(pane._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};dijit.layout.layoutChildren(this.domNode,dim,_481,_47d,_47e);},destroyRecursive:function(){dojo.forEach(this.getChildren(),function(_483){var _484=_483._splitterWidget;if(_484){_484.destroy();}delete _483._splitterWidget;});this.inherited(arguments);}});dojo.extend(dijit._Widget,{region:"",layoutPriority:0,splitter:false,minSize:0,maxSize:Infinity});dojo.declare("dijit.layout._Splitter",[dijit._Widget,dijit._Templated],{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){var _485=dojo.cookie(this._cookieName);if(_485){this.child.domNode.style[this.horizontal?"height":"width"]=_485;}}},_computeMaxSize:function(){var dim=this.horizontal?"h":"w",_486=dojo.marginBox(this.child.domNode)[dim],_487=dojo.filter(this.container.getChildren(),function(_488){return _488.region=="center";})[0],_489=dojo.marginBox(_487.domNode)[dim];return Math.min(this.child.maxSize,_486+_489);},_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");if(this.fake){dojo.destroy(this.fake);}if(!(this._resize=this.live)){(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");}var _48a=this._factor,_48b=this.horizontal,axis=_48b?"pageY":"pageX",_48c=e[axis],_48d=this.domNode.style,dim=_48b?"h":"w",_48e=dojo.marginBox(this.child.domNode)[dim],max=this._computeMaxSize(),min=this.child.minSize||20,_48f=this.region,_490=_48f=="top"||_48f=="bottom"?"top":"left",_491=parseInt(_48d[_490],10),_492=this._resize,_493=dojo.hitch(this.container,"_layoutChildren",this.child.id),de=dojo.doc;this._handlers=(this._handlers||[]).concat([dojo.connect(de,"onmousemove",this._drag=function(e,_494){var _495=e[axis]-_48c,_496=_48a*_495+_48e,_497=Math.max(Math.min(_496,max),min);if(_492||_494){_493(_497);}_48d[_490]=_495+_491+_48a*(_497-_496)+"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);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(e){this._resize=true;var _498=this.horizontal;var tick=1;var dk=dojo.keys;switch(e.charOrCode){case _498?dk.UP_ARROW:dk.LEFT_ARROW:tick*=-1;case _498?dk.DOWN_ARROW:dk.RIGHT_ARROW:break;default:return;}var _499=dojo._getMarginSize(this.child.domNode)[_498?"h":"w"]+this._factor*tick;this.container._layoutChildren(this.child.id,Math.max(Math.min(_499,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],{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"));}});}if(!dojo._hasResource["dijit.layout._TabContainerBase"]){dojo._hasResource["dijit.layout._TabContainerBase"]=true;dojo.provide("dijit.layout._TabContainerBase");dojo.declare("dijit.layout._TabContainerBase",[dijit.layout.StackContainer,dijit._Templated],{tabPosition:"top",baseClass:"dijitTabContainer",tabStrip:false,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(){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);this.tablist=this._makeController(this.tablistNode);if(!this.doLayout){dojo.addClass(this.domNode,"dijitTabContainerNoLayout");}if(this.nested){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(tab){dojo.addClass(tab.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 _49a=this.tabPosition.replace(/-h/,"");this.tablist.layoutAlign=_49a;var _49b=[this.tablist,{domNode:this.tablistSpacer,layoutAlign:_49a},{domNode:this.containerNode,layoutAlign:"client"}];dijit.layout.layoutChildren(this.domNode,this._contentBox,_49b);this._containerContentBox=dijit.layout.marginBox2contentBox(this.containerNode,_49b[2]);if(sc&&sc.resize){sc.resize(this._containerContentBox);}}else{if(this.tablist.resize){var s=this.tablist.domNode.style;s.width="0";var _49c=dojo.contentBox(this.domNode).w;s.width="";this.tablist.resize({w:_49c});}if(sc&&sc.resize){sc.resize();}}},destroy:function(){if(this.tablist){this.tablist.destroy();}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.layout.TabController"]){dojo._hasResource["dijit.layout.TabController"]=true;dojo.provide("dijit.layout.TabController");dojo.declare("dijit.layout.TabController",dijit.layout.StackController,{templateString:"<div role='tablist' dojoAttachEvent='onkeypress:onkeypress'></div>",tabPosition:"top",buttonWidget:"dijit.layout._TabButton",_rectifyRtlTabList:function(){if(0>=this.tabPosition.indexOf("-h")){return;}if(!this.pane2button){return;}var _49d=0;for(var pane in this.pane2button){var ow=this.pane2button[pane].innerDiv.scrollWidth;_49d=Math.max(_49d,ow);}for(pane in this.pane2button){this.pane2button[pane].innerDiv.style.width=_49d+"px";}}});dojo.declare("dijit.layout._TabButton",dijit.layout._StackButton,{baseClass:"dijitTab",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"),scrollOnFocus:false,buildRendering:function(){this.inherited(arguments);dojo.setSelectable(this.containerNode,false);},startup:function(){this.inherited(arguments);var n=this.domNode;setTimeout(function(){n.className=n.className;},1);},_setCloseButtonAttr:function(disp){this._set("closeButton",disp);dojo.toggleClass(this.innerDiv,"dijitClosable",disp);this.closeNode.style.display=disp?"":"none";if(disp){var _49e=dojo.i18n.getLocalization("dijit","common");if(this.closeNode){dojo.attr(this.closeNode,"title",_49e.itemClose);}var _49e=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:_49e.itemClose,dir:this.dir,lang:this.lang,onClick:dojo.hitch(this,"onClickCloseButton")}));}else{if(this._closeMenu){this._closeMenu.destroyRecursive();delete this._closeMenu;}}},_setLabelAttr:function(_49f){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);}});}if(!dojo._hasResource["dijit.layout.ScrollingTabController"]){dojo._hasResource["dijit.layout.ScrollingTabController"]=true;dojo.provide("dijit.layout.ScrollingTabController");dojo.declare("dijit.layout.ScrollingTabController",dijit.layout.TabController,{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:true,useSlider:true,tabStripClass:"",widgetsInTemplate:true,_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);dojo.style(this.domNode,"visibility","visible");this._postStartup=true;},onAddChild:function(page,_4a0){this.inherited(arguments);dojo.forEach(["label","iconClass"],function(attr){this.pane2watches[page.id].push(this.pane2button[page.id].watch(attr,dojo.hitch(this,function(name,_4a1,_4a2){if(this._postStartup&&this._dim){this.resize(this._dim);}})));},this);dojo.style(this.containerNode,"width",(dojo.style(this.containerNode,"width")+200)+"px");},onRemoveChild:function(page,_4a3){var _4a4=this.pane2button[page.id];if(this._selectedTab===_4a4.domNode){this._selectedTab=null;}this.inherited(arguments);},_initButtons:function(){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 _4a5=this.getChildren();if(_4a5.length){var _4a6=_4a5[this.isLeftToRight()?0:_4a5.length-1].domNode,_4a7=_4a5[this.isLeftToRight()?_4a5.length-1:0].domNode;return _4a7.offsetLeft+dojo.style(_4a7,"width")-_4a6.offsetLeft;}else{return 0;}},_enableBtn:function(_4a8){var _4a9=this._getTabsWidth();_4a8=_4a8||dojo.style(this.scrollNode,"width");return _4a9>0&&_4a8<_4a9;},resize:function(dim){if(this.domNode.offsetWidth==0){return;}this._dim=dim;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);var _4aa=this._enableBtn(this._contentBox.w);this._buttons.style("display",_4aa?"":"none");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"}]);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;}this._setButtonClass(this._getScroll());this._postResize=true;return {h:this._contentBox.h,w:dim.w};},_getScroll:function(){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){if(this.isLeftToRight()||dojo.isIE<8||(dojo.isIE&&dojo.isQuirks)||dojo.isWebKit){return val;}else{var _4ab=dojo.style(this.containerNode,"width")-dojo.style(this.scrollNode,"width");return (dojo.isIE==8?-1:1)*(val-_4ab);}},onSelectChild:function(page){var tab=this.pane2button[page.id];if(!tab||!page){return;}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(){var _4ac=this.getChildren(),_4ad=dojo.style(this.scrollNode,"width"),_4ae=dojo.style(this.containerNode,"width"),_4af=_4ae-_4ad,_4b0=this._getTabsWidth();if(_4ac.length&&_4b0>_4ad){return {min:this.isLeftToRight()?0:_4ac[_4ac.length-1].domNode.offsetLeft,max:this.isLeftToRight()?(_4ac[_4ac.length-1].domNode.offsetLeft+dojo.style(_4ac[_4ac.length-1].domNode,"width"))-_4ad:_4af};}else{var _4b1=this.isLeftToRight()?0:_4af;return {min:_4b1,max:_4b1};}},_getScrollForSelectedTab:function(){var w=this.scrollNode,n=this._selectedTab,_4b2=dojo.style(this.scrollNode,"width"),_4b3=this._getScrollBounds();var pos=(n.offsetLeft+dojo.style(n,"width")/2)-_4b2/2;pos=Math.min(Math.max(pos,_4b3.min),_4b3.max);return pos;},createSmoothScroll:function(x){if(arguments.length>0){var _4b4=this._getScrollBounds();x=Math.min(Math.max(x,_4b4.min),_4b4.max);}else{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;this._setButtonClass(x);return anim;},_getBtnNode:function(e){var n=e.target;while(n&&!dojo.hasClass(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(_4b5,node){if(node&&dojo.hasClass(node,"dijitTabDisabled")){return;}var _4b6=dojo.style(this.scrollNode,"width");var d=(_4b6*0.75)*_4b5;var to=this._getScroll()+d;this._setButtonClass(to);this.createSmoothScroll(to).play();},_setButtonClass:function(_4b7){var _4b8=this._getScrollBounds();this._leftBtn.set("disabled",_4b7<=_4b8.min);this._rightBtn.set("disabled",_4b7>=_4b8.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"),tabIndex:"",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],{containerId:"",tabIndex:"-1",isLoaded:function(){return false;},loadDropDown:function(_4b9){this.dropDown=new dijit.Menu({id:this.containerId+"_menu",dir:this.dir,lang:this.lang});var _4ba=dijit.byId(this.containerId);dojo.forEach(_4ba.getChildren(),function(page){var _4bb=new dijit.MenuItem({id:page.id+"_stcMi",label:page.title,iconClass:page.iconClass,dir:page.dir,lang:page.lang,onClick:function(){_4ba.selectChild(page);}});this.dropDown.addChild(_4bb);},this);_4b9();},closeDropDown:function(_4bc){this.inherited(arguments);if(this.dropDown){this.dropDown.destroyRecursive();delete this.dropDown;}}});}if(!dojo._hasResource["dijit.layout.TabContainer"]){dojo._hasResource["dijit.layout.TabContainer"]=true;dojo.provide("dijit.layout.TabContainer");dojo.declare("dijit.layout.TabContainer",dijit.layout._TabContainerBase,{useMenu:true,useSlider:true,controllerWidget:"",_makeController:function(_4bd){var cls=this.baseClass+"-tabs"+(this.doLayout?"":" dijitTabNoLayout"),_4be=dojo.getObject(this.controllerWidget);return new _4be({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},_4bd);},postMixInProperties:function(){this.inherited(arguments);if(!this.controllerWidget){this.controllerWidget=(this.tabPosition=="top"||this.tabPosition=="bottom")&&!this.nested?"dijit.layout.ScrollingTabController":"dijit.layout.TabController";}}});}if(!dojo._hasResource["dojo.number"]){dojo._hasResource["dojo.number"]=true;dojo.provide("dojo.number");dojo.getObject("number",true,dojo);dojo.number.format=function(_4bf,_4c0){_4c0=dojo.mixin({},_4c0||{});var _4c1=dojo.i18n.normalizeLocale(_4c0.locale),_4c2=dojo.i18n.getLocalization("dojo.cldr","number",_4c1);_4c0.customs=_4c2;var _4c3=_4c0.pattern||_4c2[(_4c0.type||"decimal")+"Format"];if(isNaN(_4bf)||Math.abs(_4bf)==Infinity){return null;}return dojo.number._applyPattern(_4bf,_4c3,_4c0);};dojo.number._numberPatternRE=/[#0,]*[#0](?:\.0*#*)?/;dojo.number._applyPattern=function(_4c4,_4c5,_4c6){_4c6=_4c6||{};var _4c7=_4c6.customs.group,_4c8=_4c6.customs.decimal,_4c9=_4c5.split(";"),_4ca=_4c9[0];_4c5=_4c9[(_4c4<0)?1:0]||("-"+_4ca);if(_4c5.indexOf("%")!=-1){_4c4*=100;}else{if(_4c5.indexOf("‰")!=-1){_4c4*=1000;}else{if(_4c5.indexOf("¤")!=-1){_4c7=_4c6.customs.currencyGroup||_4c7;_4c8=_4c6.customs.currencyDecimal||_4c8;_4c5=_4c5.replace(/\u00a4{1,3}/,function(_4cb){var prop=["symbol","currency","displayName"][_4cb.length-1];return _4c6[prop]||_4c6.currency||"";});}else{if(_4c5.indexOf("E")!=-1){throw new Error("exponential notation not supported");}}}}var _4cc=dojo.number._numberPatternRE;var _4cd=_4ca.match(_4cc);if(!_4cd){throw new Error("unable to find a number expression in pattern: "+_4c5);}if(_4c6.fractional===false){_4c6.places=0;}return _4c5.replace(_4cc,dojo.number._formatAbsolute(_4c4,_4cd[0],{decimal:_4c8,group:_4c7,places:_4c6.places,round:_4c6.round}));};dojo.number.round=function(_4ce,_4cf,_4d0){var _4d1=10/(_4d0||10);return (_4d1*+_4ce).toFixed(_4cf)/_4d1;};if((0.9).toFixed()==0){(function(){var _4d2=dojo.number.round;dojo.number.round=function(v,p,m){var d=Math.pow(10,-p||0),a=Math.abs(v);if(!v||a>=d||a*Math.pow(10,p+1)<5){d=0;}return _4d2(v,p,m)+(v>0?d:-d);};})();}dojo.number._formatAbsolute=function(_4d3,_4d4,_4d5){_4d5=_4d5||{};if(_4d5.places===true){_4d5.places=0;}if(_4d5.places===Infinity){_4d5.places=6;}var _4d6=_4d4.split("."),_4d7=typeof _4d5.places=="string"&&_4d5.places.indexOf(","),_4d8=_4d5.places;if(_4d7){_4d8=_4d5.places.substring(_4d7+1);}else{if(!(_4d8>=0)){_4d8=(_4d6[1]||[]).length;}}if(!(_4d5.round<0)){_4d3=dojo.number.round(_4d3,_4d8,_4d5.round);}var _4d9=String(Math.abs(_4d3)).split("."),_4da=_4d9[1]||"";if(_4d6[1]||_4d5.places){if(_4d7){_4d5.places=_4d5.places.substring(0,_4d7);}var pad=_4d5.places!==undefined?_4d5.places:(_4d6[1]&&_4d6[1].lastIndexOf("0")+1);if(pad>_4da.length){_4d9[1]=dojo.string.pad(_4da,pad,"0",true);}if(_4d8<_4da.length){_4d9[1]=_4da.substr(0,_4d8);}}else{if(_4d9[1]){_4d9.pop();}}var _4db=_4d6[0].replace(",","");pad=_4db.indexOf("0");if(pad!=-1){pad=_4db.length-pad;if(pad>_4d9[0].length){_4d9[0]=dojo.string.pad(_4d9[0],pad);}if(_4db.indexOf("#")==-1){_4d9[0]=_4d9[0].substr(_4d9[0].length-pad);}}var _4dc=_4d6[0].lastIndexOf(","),_4dd,_4de;if(_4dc!=-1){_4dd=_4d6[0].length-_4dc-1;var _4df=_4d6[0].substr(0,_4dc);_4dc=_4df.lastIndexOf(",");if(_4dc!=-1){_4de=_4df.length-_4dc-1;}}var _4e0=[];for(var _4e1=_4d9[0];_4e1;){var off=_4e1.length-_4dd;_4e0.push((off>0)?_4e1.substr(off):_4e1);_4e1=(off>0)?_4e1.slice(0,off):"";if(_4de){_4dd=_4de;delete _4de;}}_4d9[0]=_4e0.reverse().join(_4d5.group||",");return _4d9.join(_4d5.decimal||".");};dojo.number.regexp=function(_4e2){return dojo.number._parseInfo(_4e2).regexp;};dojo.number._parseInfo=function(_4e3){_4e3=_4e3||{};var _4e4=dojo.i18n.normalizeLocale(_4e3.locale),_4e5=dojo.i18n.getLocalization("dojo.cldr","number",_4e4),_4e6=_4e3.pattern||_4e5[(_4e3.type||"decimal")+"Format"],_4e7=_4e5.group,_4e8=_4e5.decimal,_4e9=1;if(_4e6.indexOf("%")!=-1){_4e9/=100;}else{if(_4e6.indexOf("‰")!=-1){_4e9/=1000;}else{var _4ea=_4e6.indexOf("¤")!=-1;if(_4ea){_4e7=_4e5.currencyGroup||_4e7;_4e8=_4e5.currencyDecimal||_4e8;}}}var _4eb=_4e6.split(";");if(_4eb.length==1){_4eb.push("-"+_4eb[0]);}var re=dojo.regexp.buildGroupRE(_4eb,function(_4ec){_4ec="(?:"+dojo.regexp.escapeString(_4ec,".")+")";return _4ec.replace(dojo.number._numberPatternRE,function(_4ed){var _4ee={signed:false,separator:_4e3.strict?_4e7:[_4e7,""],fractional:_4e3.fractional,decimal:_4e8,exponent:false},_4ef=_4ed.split("."),_4f0=_4e3.places;if(_4ef.length==1&&_4e9!=1){_4ef[1]="###";}if(_4ef.length==1||_4f0===0){_4ee.fractional=false;}else{if(_4f0===undefined){_4f0=_4e3.pattern?_4ef[1].lastIndexOf("0")+1:Infinity;}if(_4f0&&_4e3.fractional==undefined){_4ee.fractional=true;}if(!_4e3.places&&(_4f0<_4ef[1].length)){_4f0+=","+_4ef[1].length;}_4ee.places=_4f0;}var _4f1=_4ef[0].split(",");if(_4f1.length>1){_4ee.groupSize=_4f1.pop().length;if(_4f1.length>1){_4ee.groupSize2=_4f1.pop().length;}}return "("+dojo.number._realNumberRegexp(_4ee)+")";});},true);if(_4ea){re=re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g,function(_4f2,_4f3,_4f4,_4f5){var prop=["symbol","currency","displayName"][_4f4.length-1],_4f6=dojo.regexp.escapeString(_4e3[prop]||_4e3.currency||"");_4f3=_4f3?"[\\s\\xa0]":"";_4f5=_4f5?"[\\s\\xa0]":"";if(!_4e3.strict){if(_4f3){_4f3+="*";}if(_4f5){_4f5+="*";}return "(?:"+_4f3+_4f6+_4f5+")?";}return _4f3+_4f6+_4f5;});}return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_4e7,decimal:_4e8,factor:_4e9};};dojo.number.parse=function(_4f7,_4f8){var info=dojo.number._parseInfo(_4f8),_4f9=(new RegExp("^"+info.regexp+"$")).exec(_4f7);if(!_4f9){return NaN;}var _4fa=_4f9[1];if(!_4f9[1]){if(!_4f9[2]){return NaN;}_4fa=_4f9[2];info.factor*=-1;}_4fa=_4fa.replace(new RegExp("["+info.group+"\\s\\xa0"+"]","g"),"").replace(info.decimal,".");return _4fa*info.factor;};dojo.number._realNumberRegexp=function(_4fb){_4fb=_4fb||{};if(!("places" in _4fb)){_4fb.places=Infinity;}if(typeof _4fb.decimal!="string"){_4fb.decimal=".";}if(!("fractional" in _4fb)||/^0/.test(_4fb.places)){_4fb.fractional=[true,false];}if(!("exponent" in _4fb)){_4fb.exponent=[true,false];}if(!("eSigned" in _4fb)){_4fb.eSigned=[true,false];}var _4fc=dojo.number._integerRegexp(_4fb),_4fd=dojo.regexp.buildGroupRE(_4fb.fractional,function(q){var re="";if(q&&(_4fb.places!==0)){re="\\"+_4fb.decimal;if(_4fb.places==Infinity){re="(?:"+re+"\\d+)?";}else{re+="\\d{"+_4fb.places+"}";}}return re;},true);var _4fe=dojo.regexp.buildGroupRE(_4fb.exponent,function(q){if(q){return "([eE]"+dojo.number._integerRegexp({signed:_4fb.eSigned})+")";}return "";});var _4ff=_4fc+_4fd;if(_4fd){_4ff="(?:(?:"+_4ff+")|(?:"+_4fd+"))";}return _4ff+_4fe;};dojo.number._integerRegexp=function(_500){_500=_500||{};if(!("signed" in _500)){_500.signed=[true,false];}if(!("separator" in _500)){_500.separator="";}else{if(!("groupSize" in _500)){_500.groupSize=3;}}var _501=dojo.regexp.buildGroupRE(_500.signed,function(q){return q?"[-+]":"";},true);var _502=dojo.regexp.buildGroupRE(_500.separator,function(sep){if(!sep){return "(?:\\d+)";}sep=dojo.regexp.escapeString(sep);if(sep==" "){sep="\\s";}else{if(sep==" "){sep="\\s\\xa0";}}var grp=_500.groupSize,grp2=_500.groupSize2;if(grp2){var _503="(?:0|[1-9]\\d{0,"+(grp2-1)+"}(?:["+sep+"]\\d{"+grp2+"})*["+sep+"]\\d{"+grp+"})";return ((grp-grp2)>0)?"(?:"+_503+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_503;}return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";},true);return _501+_502;};}if(!dojo._hasResource["dijit.ProgressBar"]){dojo._hasResource["dijit.ProgressBar"]=true;dojo.provide("dijit.ProgressBar");dojo.declare("dijit.ProgressBar",[dijit._Widget,dijit._Templated],{progress:"0",value:"",maximum:100,places:0,indeterminate:false,label:"",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: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(_504){dojo.mixin(this,_504||{});var tip=this.internalProgress,ap=this.domNode;var _505=1;if(this.indeterminate){dijit.removeWaiState(ap,"valuenow");dijit.removeWaiState(ap,"valuemin");dijit.removeWaiState(ap,"valuemax");}else{if(String(this.progress).indexOf("%")!=-1){_505=Math.min(parseFloat(this.progress)/100,1);this.progress=_505*this.maximum;}else{this.progress=Math.min(this.progress,this.maximum);_505=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(_505);dojo.toggleClass(this.domNode,"dijitProgressBarIndeterminate",this.indeterminate);tip.style.width=(_505*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(_506){this._set("label",_506);this.update();},_setIndeterminateAttr:function(_507){this.indeterminate=_507;this.update();},report:function(_508){return this.label?this.label:(this.indeterminate?"&nbsp;":dojo.number.format(_508,{type:"percent",places:this.places,locale:this.lang}));},onChange:function(){}});}if(!dojo._hasResource["dijit.ToolbarSeparator"]){dojo._hasResource["dijit.ToolbarSeparator"]=true;dojo.provide("dijit.ToolbarSeparator");dojo.declare("dijit.ToolbarSeparator",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dijitToolbarSeparator dijitInline\" role=\"presentation\"></div>",buildRendering:function(){this.inherited(arguments);dojo.setSelectable(this.domNode,false);},isFocusable:function(){return false;}});}if(!dojo._hasResource["dijit.Toolbar"]){dojo._hasResource["dijit.Toolbar"]=true;dojo.provide("dijit.Toolbar");dojo.declare("dijit.Toolbar",[dijit._Widget,dijit._Templated,dijit._KeyNavContainer],{templateString:"<div class=\"dijit\" role=\"toolbar\" tabIndex=\"${tabIndex}\" dojoAttachPoint=\"containerNode\">"+"</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);}});}if(!dojo._hasResource["dojo.DeferredList"]){dojo._hasResource["dojo.DeferredList"]=true;dojo.provide("dojo.DeferredList");dojo.DeferredList=function(list,_509,_50a,_50b,_50c){var _50d=[];dojo.Deferred.call(this);var self=this;if(list.length===0&&!_509){this.resolve([0,[]]);}var _50e=0;dojo.forEach(list,function(item,i){item.then(function(_50f){if(_509){self.resolve([i,_50f]);}else{_510(true,_50f);}},function(_511){if(_50a){self.reject(_511);}else{_510(false,_511);}if(_50b){return null;}throw _511;});function _510(_512,_513){_50d[i]=[_512,_513];_50e++;if(_50e===list.length){self.resolve(_50d);}};});};dojo.DeferredList.prototype=new dojo.Deferred();dojo.DeferredList.prototype.gatherResults=function(_514){var d=new dojo.DeferredList(_514,false,true,false);d.addCallback(function(_515){var ret=[];dojo.forEach(_515,function(_516){ret.push(_516[1]);});return ret;});return d;};}if(!dojo._hasResource["dijit.tree.TreeStoreModel"]){dojo._hasResource["dijit.tree.TreeStoreModel"]=true;dojo.provide("dijit.tree.TreeStoreModel");dojo.declare("dijit.tree.TreeStoreModel",null,{store:null,childrenAttrs:["children"],newItemIdAttr:"id",labelAttr:"",root:null,query:null,deferItemLoadingUntilExpand:false,constructor:function(args){dojo.mixin(this,args);this.connects=[];var _517=this.store;if(!_517.getFeatures()["dojo.data.api.Identity"]){throw new Error("dijit.Tree: store must support dojo.data.Identity");}if(_517.getFeatures()["dojo.data.api.Notification"]){this.connects=this.connects.concat([dojo.connect(_517,"onNew",this,"onNewItem"),dojo.connect(_517,"onDelete",this,"onDeleteItem"),dojo.connect(_517,"onSet",this,"onSetItem")]);}},destroy:function(){dojo.forEach(this.connects,dojo.disconnect);},getRoot:function(_518,_519){if(this.root){_518(this.root);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_51a){if(_51a.length!=1){throw new Error(this.declaredClass+": query "+dojo.toJson(this.query)+" returned "+_51a.length+" items, but must return exactly one item");}this.root=_51a[0];_518(this.root);}),onError:_519});}},mayHaveChildren:function(item){return dojo.some(this.childrenAttrs,function(attr){return this.store.hasAttribute(item,attr);},this);},getChildren:function(_51b,_51c,_51d){var _51e=this.store;if(!_51e.isItemLoaded(_51b)){var _51f=dojo.hitch(this,arguments.callee);_51e.loadItem({item:_51b,onItem:function(_520){_51f(_520,_51c,_51d);},onError:_51d});return;}var _521=[];for(var i=0;i<this.childrenAttrs.length;i++){var vals=_51e.getValues(_51b,this.childrenAttrs[i]);_521=_521.concat(vals);}var _522=0;if(!this.deferItemLoadingUntilExpand){dojo.forEach(_521,function(item){if(!_51e.isItemLoaded(item)){_522++;}});}if(_522==0){_51c(_521);}else{dojo.forEach(_521,function(item,idx){if(!_51e.isItemLoaded(item)){_51e.loadItem({item:item,onItem:function(item){_521[idx]=item;if(--_522==0){_51c(_521);}},onError:_51d});}});}},isItem:function(_523){return this.store.isItem(_523);},fetchItemByIdentity:function(_524){this.store.fetchItemByIdentity(_524);},getIdentity:function(item){return this.store.getIdentity(item);},getLabel:function(item){if(this.labelAttr){return this.store.getValue(item,this.labelAttr);}else{return this.store.getLabel(item);}},newItem:function(args,_525,_526){var _527={parent:_525,attribute:this.childrenAttrs[0]},_528;if(this.newItemIdAttr&&args[this.newItemIdAttr]){this.fetchItemByIdentity({identity:args[this.newItemIdAttr],scope:this,onItem:function(item){if(item){this.pasteItem(item,null,_525,true,_526);}else{_528=this.store.newItem(args,_527);if(_528&&(_526!=undefined)){this.pasteItem(_528,_525,_525,false,_526);}}}});}else{_528=this.store.newItem(args,_527);if(_528&&(_526!=undefined)){this.pasteItem(_528,_525,_525,false,_526);}}},pasteItem:function(_529,_52a,_52b,_52c,_52d){var _52e=this.store,_52f=this.childrenAttrs[0];if(_52a){dojo.forEach(this.childrenAttrs,function(attr){if(_52e.containsValue(_52a,attr,_529)){if(!_52c){var _530=dojo.filter(_52e.getValues(_52a,attr),function(x){return x!=_529;});_52e.setValues(_52a,attr,_530);}_52f=attr;}});}if(_52b){if(typeof _52d=="number"){var _531=_52e.getValues(_52b,_52f).slice();_531.splice(_52d,0,_529);_52e.setValues(_52b,_52f,_531);}else{_52e.setValues(_52b,_52f,_52e.getValues(_52b,_52f).concat(_529));}}},onChange:function(item){},onChildrenChange:function(_532,_533){},onDelete:function(_534,_535){},onNewItem:function(item,_536){if(!_536){return;}this.getChildren(_536.item,dojo.hitch(this,function(_537){this.onChildrenChange(_536.item,_537);}));},onDeleteItem:function(item){this.onDelete(item);},onSetItem:function(item,_538,_539,_53a){if(dojo.indexOf(this.childrenAttrs,_538)!=-1){this.getChildren(item,dojo.hitch(this,function(_53b){this.onChildrenChange(item,_53b);}));}else{this.onChange(item);}}});}if(!dojo._hasResource["dijit.tree.ForestStoreModel"]){dojo._hasResource["dijit.tree.ForestStoreModel"]=true;dojo.provide("dijit.tree.ForestStoreModel");dojo.declare("dijit.tree.ForestStoreModel",dijit.tree.TreeStoreModel,{rootId:"$root$",rootLabel:"ROOT",query:null,constructor:function(_53c){this.root={store:this,root:true,id:_53c.rootId,label:_53c.rootLabel,children:_53c.rootChildren};},mayHaveChildren:function(item){return item===this.root||this.inherited(arguments);},getChildren:function(_53d,_53e,_53f){if(_53d===this.root){if(this.root.children){_53e(this.root.children);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_540){this.root.children=_540;_53e(_540);}),onError:_53f});}}else{this.inherited(arguments);}},isItem:function(_541){return (_541===this.root)?true:this.inherited(arguments);},fetchItemByIdentity:function(_542){if(_542.identity==this.root.id){var _543=_542.scope?_542.scope:dojo.global;if(_542.onItem){_542.onItem.call(_543,this.root);}}else{this.inherited(arguments);}},getIdentity:function(item){return (item===this.root)?this.root.id:this.inherited(arguments);},getLabel:function(item){return (item===this.root)?this.root.label:this.inherited(arguments);},newItem:function(args,_544,_545){if(_544===this.root){this.onNewRootItem(args);return this.store.newItem(args);}else{return this.inherited(arguments);}},onNewRootItem:function(args){},pasteItem:function(_546,_547,_548,_549,_54a){if(_547===this.root){if(!_549){this.onLeaveRoot(_546);}}dijit.tree.TreeStoreModel.prototype.pasteItem.call(this,_546,_547===this.root?null:_547,_548===this.root?null:_548,_549,_54a);if(_548===this.root){this.onAddToRoot(_546);}},onAddToRoot:function(item){console.log(this,": item ",item," added to root");},onLeaveRoot:function(item){console.log(this,": item ",item," removed from root");},_requeryTop:function(){var _54b=this.root.children||[];this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_54c){this.root.children=_54c;if(_54b.length!=_54c.length||dojo.some(_54b,function(item,idx){return _54c[idx]!=item;})){this.onChildrenChange(this.root,_54c);}})});},onNewItem:function(item,_54d){this._requeryTop();this.inherited(arguments);},onDeleteItem:function(item){if(dojo.indexOf(this.root.children,item)!=-1){this._requeryTop();}this.inherited(arguments);},onSetItem:function(item,_54e,_54f,_550){this._requeryTop();this.inherited(arguments);}});}if(!dojo._hasResource["dojo.dnd.Container"]){dojo._hasResource["dojo.dnd.Container"]=true;dojo.provide("dojo.dnd.Container");dojo.declare("dojo.dnd.Container",null,{skipForm:false,constructor:function(node,_551){this.node=dojo.byId(node);if(!_551){_551={};}this.creator=_551.creator||null;this.skipForm=_551.skipForm;this.parent=_551.dropParent&&dojo.byId(_551.dropParent);this.map={};this.current=null;this.containerState="";dojo.addClass(this.node,"dojoDndContainer");if(!(_551&&_551._skipStartup)){this.startup();}this.events=[dojo.connect(this.node,"onmouseover",this,"onMouseOver"),dojo.connect(this.node,"onmouseout",this,"onMouseOut"),dojo.connect(this.node,"ondragstart",this,"onSelectStart"),dojo.connect(this.node,"onselectstart",this,"onSelectStart")];},creator:function(){},getItem:function(key){return this.map[key];},setItem:function(key,data){this.map[key]=data;},delItem:function(key){delete this.map[key];},forInItems:function(f,o){o=o||dojo.global;var m=this.map,e=dojo.dnd._empty;for(var i in m){if(i in e){continue;}f.call(o,m[i],i,this);}return o;},clearItems:function(){this.map={};},getAllNodes:function(){return dojo.query("> .dojoDndItem",this.parent);},sync:function(){var map={};this.getAllNodes().forEach(function(node){if(node.id){var item=this.getItem(node.id);if(item){map[node.id]=item;return;}}else{node.id=dojo.dnd.getUniqueId();}var type=node.getAttribute("dndType"),data=node.getAttribute("dndData");map[node.id]={data:data||node.innerHTML,type:type?type.split(/\s*,\s*/):["text"]};},this);this.map=map;return this;},insertNodes:function(data,_552,_553){if(!this.parent.firstChild){_553=null;}else{if(_552){if(!_553){_553=this.parent.firstChild;}}else{if(_553){_553=_553.nextSibling;}}}if(_553){for(var i=0;i<data.length;++i){var t=this._normalizedCreator(data[i]);this.setItem(t.node.id,{data:t.data,type:t.type});this.parent.insertBefore(t.node,_553);}}else{for(var i=0;i<data.length;++i){var t=this._normalizedCreator(data[i]);this.setItem(t.node.id,{data:t.data,type:t.type});this.parent.appendChild(t.node);}}return this;},destroy:function(){dojo.forEach(this.events,dojo.disconnect);this.clearItems();this.node=this.parent=this.current=null;},markupFactory:function(_554,node){_554._skipStartup=true;return new dojo.dnd.Container(node,_554);},startup:function(){if(!this.parent){this.parent=this.node;if(this.parent.tagName.toLowerCase()=="table"){var c=this.parent.getElementsByTagName("tbody");if(c&&c.length){this.parent=c[0];}}}this.defaultCreator=dojo.dnd._defaultCreator(this.parent);this.sync();},onMouseOver:function(e){var n=e.relatedTarget;while(n){if(n==this.node){break;}try{n=n.parentNode;}catch(x){n=null;}}if(!n){this._changeState("Container","Over");this.onOverEvent();}n=this._getChildByEvent(e);if(this.current==n){return;}if(this.current){this._removeItemClass(this.current,"Over");}if(n){this._addItemClass(n,"Over");}this.current=n;},onMouseOut:function(e){for(var n=e.relatedTarget;n;){if(n==this.node){return;}try{n=n.parentNode;}catch(x){n=null;}}if(this.current){this._removeItemClass(this.current,"Over");this.current=null;}this._changeState("Container","");this.onOutEvent();},onSelectStart:function(e){if(!this.skipForm||!dojo.dnd.isFormElement(e)){dojo.stopEvent(e);}},onOverEvent:function(){},onOutEvent:function(){},_changeState:function(type,_555){var _556="dojoDnd"+type;var _557=type.toLowerCase()+"State";dojo.replaceClass(this.node,_556+_555,_556+this[_557]);this[_557]=_555;},_addItemClass:function(node,type){dojo.addClass(node,"dojoDndItem"+type);},_removeItemClass:function(node,type){dojo.removeClass(node,"dojoDndItem"+type);},_getChildByEvent:function(e){var node=e.target;if(node){for(var _558=node.parentNode;_558;node=_558,_558=node.parentNode){if(_558==this.parent&&dojo.hasClass(node,"dojoDndItem")){return node;}}}return null;},_normalizedCreator:function(item,hint){var t=(this.creator||this.defaultCreator).call(this,item,hint);if(!dojo.isArray(t.type)){t.type=["text"];}if(!t.node.id){t.node.id=dojo.dnd.getUniqueId();}dojo.addClass(t.node,"dojoDndItem");return t;}});dojo.dnd._createNode=function(tag){if(!tag){return dojo.dnd._createSpan;}return function(text){return dojo.create(tag,{innerHTML:text});};};dojo.dnd._createTrTd=function(text){var tr=dojo.create("tr");dojo.create("td",{innerHTML:text},tr);return tr;};dojo.dnd._createSpan=function(text){return dojo.create("span",{innerHTML:text});};dojo.dnd._defaultCreatorNodes={ul:"li",ol:"li",div:"div",p:"div"};dojo.dnd._defaultCreator=function(node){var tag=node.tagName.toLowerCase();var c=tag=="tbody"||tag=="thead"?dojo.dnd._createTrTd:dojo.dnd._createNode(dojo.dnd._defaultCreatorNodes[tag]);return function(item,hint){var _559=item&&dojo.isObject(item),data,type,n;if(_559&&item.tagName&&item.nodeType&&item.getAttribute){data=item.getAttribute("dndData")||item.innerHTML;type=item.getAttribute("dndType");type=type?type.split(/\s*,\s*/):["text"];n=item;}else{data=(_559&&item.data)?item.data:item;type=(_559&&item.type)?item.type:["text"];n=(hint=="avatar"?dojo.dnd._createSpan:c)(String(data));}if(!n.id){n.id=dojo.dnd.getUniqueId();}return {node:n,data:data,type:type};};};}if(!dojo._hasResource["dijit.tree._dndContainer"]){dojo._hasResource["dijit.tree._dndContainer"]=true;dojo.provide("dijit.tree._dndContainer");dojo.getObject("tree",true,dojo);dijit.tree._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");}}}};dojo.declare("dijit.tree._dndContainer",null,{constructor:function(tree,_55a){this.tree=tree;this.node=tree.domNode;dojo.mixin(this,_55a);this.map={};this.current=null;this.containerState="";dojo.addClass(this.node,"dojoDndContainer");this.events=[dojo.connect(this.node,"onmouseenter",this,"onOverEvent"),dojo.connect(this.node,"onmouseleave",this,"onOutEvent"),dojo.connect(this.tree,"_onNodeMouseEnter",this,"onMouseOver"),dojo.connect(this.tree,"_onNodeMouseLeave",this,"onMouseOut"),dojo.connect(this.node,"ondragstart",dojo,"stopEvent"),dojo.connect(this.node,"onselectstart",dojo,"stopEvent")];},getItem:function(key){var _55b=this.selection[key],ret={data:_55b,type:["treeNode"]};return ret;},destroy:function(){dojo.forEach(this.events,dojo.disconnect);this.node=this.parent=null;},onMouseOver:function(_55c,evt){this.current=_55c;},onMouseOut:function(_55d,evt){this.current=null;},_changeState:function(type,_55e){var _55f="dojoDnd"+type;var _560=type.toLowerCase()+"State";dojo.replaceClass(this.node,_55f+_55e,_55f+this[_560]);this[_560]=_55e;},_addItemClass:function(node,type){dojo.addClass(node,"dojoDndItem"+type);},_removeItemClass:function(node,type){dojo.removeClass(node,"dojoDndItem"+type);},onOverEvent:function(){this._changeState("Container","Over");},onOutEvent:function(){this._changeState("Container","");}});}if(!dojo._hasResource["dijit.tree._dndSelector"]){dojo._hasResource["dijit.tree._dndSelector"]=true;dojo.provide("dijit.tree._dndSelector");dojo.declare("dijit.tree._dndSelector",dijit.tree._dndContainer,{constructor:function(tree,_561){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:false,getSelectedTreeNodes:function(){var _562=[],sel=this.selection;for(var i in sel){_562.push(sel[i]);}return _562;},selectNone:function(){this.setSelection([]);return this;},destroy:function(){this.inherited(arguments);this.selection=this.anchor=null;},addTreeNode:function(node,_563){this.setSelection(this.getSelectedTreeNodes().concat([node]));if(_563){this.anchor=node;}return node;},removeTreeNode:function(node){this.setSelection(this._setDifference(this.getSelectedTreeNodes(),[node]));return node;},isTreeNodeSelected:function(node){return node.id&&!!this.selection[node.id];},setSelection:function(_564){var _565=this.getSelectedTreeNodes();dojo.forEach(this._setDifference(_565,_564),dojo.hitch(this,function(node){node.setSelected(false);if(this.anchor==node){delete this.anchor;}delete this.selection[node.id];}));dojo.forEach(this._setDifference(_564,_565),dojo.hitch(this,function(node){node.setSelected(true);this.selection[node.id]=node;}));this._updateSelectionProperties();},_setDifference:function(xs,ys){dojo.forEach(ys,function(y){y.__exclude__=true;});var ret=dojo.filter(xs,function(x){return !x.__exclude__;});dojo.forEach(ys,function(y){delete y["__exclude__"];});return ret;},_updateSelectionProperties:function(){var _566=this.getSelectedTreeNodes();var _567=[],_568=[];dojo.forEach(_566,function(node){_568.push(node);_567.push(node.getTreePath());});var _569=dojo.map(_568,function(node){return node.item;});this.tree._set("paths",_567);this.tree._set("path",_567[0]||[]);this.tree._set("selectedNodes",_568);this.tree._set("selectedNode",_568[0]||null);this.tree._set("selectedItems",_569);this.tree._set("selectedItem",_569[0]||null);},onMouseDown:function(e){if(!this.current||this.tree.isExpandoNode(e.target,this.current)){return;}if(e.button==dojo.mouseButtons.RIGHT){return;}dojo.stopEvent(e);var _56a=this.current,copy=dojo.isCopyKey(e),id=_56a.id;if(!this.singular&&!e.shiftKey&&this.selection[id]){this._doDeselect=true;return;}else{this._doDeselect=false;}this.userSelect(_56a,copy,e.shiftKey);},onMouseUp:function(e){if(!this._doDeselect){return;}this._doDeselect=false;this.userSelect(this.current,dojo.isCopyKey(e),e.shiftKey);},onMouseMove:function(e){this._doDeselect=false;},userSelect:function(node,_56b,_56c){if(this.singular){if(this.anchor==node&&_56b){this.selectNone();}else{this.setSelection([node]);this.anchor=node;}}else{if(_56c&&this.anchor){var cr=dijit.tree._compareNodes(this.anchor.rowNode,node.rowNode),_56d,end,_56e=this.anchor;if(cr<0){_56d=_56e;end=node;}else{_56d=node;end=_56e;}nodes=[];while(_56d!=end){nodes.push(_56d);_56d=this.tree._getNextNode(_56d);}nodes.push(end);this.setSelection(nodes);}else{if(this.selection[node.id]&&_56b){this.removeTreeNode(node);}else{if(_56b){this.addTreeNode(node,true);}else{this.setSelection([node]);this.anchor=node;}}}}},forInSelectedItems:function(f,o){o=o||dojo.global;for(var id in this.selection){f.call(o,this.getItem(id),id,this);}}});}if(!dojo._hasResource["dijit.Tree"]){dojo._hasResource["dijit.Tree"]=true;dojo.provide("dijit.Tree");dojo.declare("dijit._TreeNode",[dijit._Widget,dijit._Templated,dijit._Container,dijit._Contained,dijit._CssStateMixin],{item:null,isTreeNode:true,label:"",isExpandable:null,isExpanded:false,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",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);this._setExpando();this._updateItemClasses(this.item);if(this.isExpandable){dijit.setWaiState(this.labelNode,"expanded",this.isExpanded);}this.setSelected(false);},_setIndentAttr:function(_56f){var _570=(Math.max(_56f,0)*this.tree._nodePixelIndent)+"px";dojo.style(this.domNode,"backgroundPosition",_570+" 0px");dojo.style(this.rowNode,this.isLeftToRight()?"paddingLeft":"paddingRight",_570);dojo.forEach(this.getChildren(),function(_571){_571.set("indent",_56f+1);});this._set("indent",_56f);},markProcessing:function(){this.state="LOADING";this._setExpando(true);},unmarkProcessing:function(){this._setExpando(false);},_updateItemClasses:function(item){var tree=this.tree,_572=tree.model;if(tree._v10Compat&&item===_572.root){item=null;}this._applyClassAndStyle(item,"icon","Icon");this._applyClassAndStyle(item,"label","Label");this._applyClassAndStyle(item,"row","Row");},_applyClassAndStyle:function(item,_573,_574){var _575="_"+_573+"Class";var _576=_573+"Node";var _577=this[_575];this[_575]=this.tree["get"+_574+"Class"](item,this.isExpanded);dojo.replaceClass(this[_576],this[_575]||"",_577||"");dojo.style(this[_576],this.tree["get"+_574+"Style"](item,this.isExpanded)||{});},_updateLayout:function(){var _578=this.getParent();if(!_578||_578.rowNode.style.display=="none"){dojo.addClass(this.domNode,"dijitTreeIsRoot");}else{dojo.toggleClass(this.domNode,"dijitTreeIsLast",!this.getNextSibling());}},_setExpando:function(_579){var _57a=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"],_57b=["*","-","+","*"],idx=_579?0:(this.isExpandable?(this.isExpanded?1:2):3);dojo.replaceClass(this.expandoNode,_57a[idx],_57a);this.expandoNodeText.innerHTML=_57b[idx];},expand:function(){if(this._expandDeferred){return this._expandDeferred;}this._wipeOut&&this._wipeOut.stop();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,_57c=dojo.fx.wipeIn({node:this.containerNode,duration:dijit.defaultDuration,onEnd:function(){def.callback(true);}});def=(this._expandDeferred=new dojo.Deferred(function(){_57c.stop();}));_57c.play();return def;},collapse:function(){if(!this.isExpanded){return;}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:0,setChildItems:function(_57d){var tree=this.tree,_57e=tree.model,defs=[];dojo.forEach(this.getChildren(),function(_57f){dijit._Container.prototype.removeChild.call(this,_57f);},this);this.state="LOADED";if(_57d&&_57d.length>0){this.isExpandable=true;dojo.forEach(_57d,function(item){var id=_57e.getIdentity(item),_580=tree._itemNodesMap[id],node;if(_580){for(var i=0;i<_580.length;i++){if(_580[i]&&!_580[i].getParent()){node=_580[i];node.set("indent",this.indent+1);break;}}}if(!node){node=this.tree._createTreeNode({item:item,tree:tree,isExpandable:_57e.mayHaveChildren(item),label:tree.getLabel(item),tooltip:tree.getTooltip(item),dir:tree.dir,lang:tree.lang,indent:this.indent+1});if(_580){_580.push(node);}else{tree._itemNodesMap[id]=[node];}}this.addChild(node);if(this.tree.autoExpand||this.tree._state(item)){defs.push(tree._expandNode(node));}},this);dojo.forEach(this.getChildren(),function(_581,idx){_581._updateLayout();});}else{this.isExpandable=false;}if(this._setExpando){this._setExpando(false);}this._updateItemClasses(this.item);if(this==tree.rootNode){var fc=this.tree.showRoot?this:this.getChildren()[0];if(fc){fc.setFocusable(true);tree.lastFocused=fc;}else{tree.domNode.setAttribute("tabIndex","0");}}return new dojo.DeferredList(defs);},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(node){this.inherited(arguments);var _582=this.getChildren();if(_582.length==0){this.isExpandable=false;this.collapse();}dojo.forEach(_582,function(_583){_583._updateLayout();});},makeExpandable:function(){this.isExpandable=true;this._setExpando(false);},_onLabelFocus:function(evt){this.tree._onNodeFocus(this);},setSelected:function(_584){dijit.setWaiState(this.labelNode,"selected",_584);dojo.toggleClass(this.rowNode,"dijitTreeRowSelected",_584);},setFocusable:function(_585){this.labelNode.setAttribute("tabIndex",_585?"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);}});dojo.declare("dijit.Tree",[dijit._Widget,dijit._Templated],{store:null,model:null,query:null,label:"",showRoot:true,childrenAttr:["children"],paths:[],path:[],selectedItems:null,selectedItem:null,openOnClick:false,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:true,autoExpand:false,dndController:"dijit.tree._dndSelector",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(_586,_587){dojo.publish(this.id,[dojo.mixin({tree:this,event:_586},_587||{})]);},postMixInProperties:function(){this.tree=this;if(this.autoExpand){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();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(dojo.isString(this.dndController)){this.dndController=dojo.getObject(this.dndController);}var _588={};for(var i=0;i<this.dndParams.length;i++){if(this[this.dndParams[i]]){_588[this.dndParams[i]]=this[this.dndParams[i]];}}this.dndController=new this.dndController(this,_588);}},_store2model:function(){this._v10Compat=true;dojo.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");var _589={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};if(this.params.mayHaveChildren){_589.mayHaveChildren=dojo.hitch(this,"mayHaveChildren");}if(this.params.getItemChildren){_589.getChildren=dojo.hitch(this,function(item,_58a,_58b){this.getItemChildren((this._v10Compat&&item===this.model.root)?null:item,_58a,_58b);});}this.model=new dijit.tree.ForestStoreModel(_589);this.showRoot=Boolean(this.label);},onLoad:function(){},_load:function(){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";dijit.setWaiRole(this.domNode,"presentation");dijit.setWaiRole(rn.labelNode,"presentation");dijit.setWaiRole(rn.containerNode,"tree");}this.domNode.appendChild(rn.domNode);var _58c=this.model.getIdentity(item);if(this._itemNodesMap[_58c]){this._itemNodesMap[_58c].push(rn);}else{this._itemNodesMap[_58c]=[rn];}rn._updateLayout();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(item){if(!item){return [];}var _58d=dojo.isString(item)?item:this.model.getIdentity(item);return [].concat(this._itemNodesMap[_58d]);},_setSelectedItemAttr:function(item){this.set("selectedItems",[item]);},_setSelectedItemsAttr:function(_58e){var tree=this;this._loadDeferred.addCallback(dojo.hitch(this,function(){var _58f=dojo.map(_58e,function(item){return (!item||dojo.isString(item))?item:tree.model.getIdentity(item);});var _590=[];dojo.forEach(_58f,function(id){_590=_590.concat(tree._itemNodesMap[id]||[]);});this.set("selectedNodes",_590);}));},_setPathAttr:function(path){if(path.length){return this.set("paths",[path]);}else{return this.set("paths",[]);}},_setPathsAttr:function(_591){var tree=this;return new dojo.DeferredList(dojo.map(_591,function(path){var d=new dojo.Deferred();path=dojo.map(path,function(item){return dojo.isString(item)?item:tree.model.getIdentity(item);});if(path.length){tree._loadDeferred.addCallback(function(){_592(path,[tree.rootNode],d);});}else{d.errback("Empty path");}return d;})).addCallback(_593);function _592(path,_594,def){var _595=path.shift();var _596=dojo.filter(_594,function(node){return node.getIdentity()==_595;})[0];if(!!_596){if(path.length){tree._expandNode(_596).addCallback(function(){_592(path,_596.getChildren(),def);});}else{def.callback(_596);}}else{def.errback("Could not expand path at "+_595);}};function _593(_597){tree.set("selectedNodes",dojo.map(dojo.filter(_597,function(x){return x[0];}),function(x){return x[1];}));};},_setSelectedNodeAttr:function(node){this.set("selectedNodes",[node]);},_setSelectedNodesAttr:function(_598){this._loadDeferred.addCallback(dojo.hitch(this,function(){this.dndController.setSelection(_598);}));},mayHaveChildren:function(item){},getItemChildren:function(_599,_59a){},getLabel:function(item){return this.model.getLabel(item);},getIconClass:function(item,_59b){return (!item||this.model.mayHaveChildren(item))?(_59b?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";},getLabelClass:function(item,_59c){},getRowClass:function(item,_59d){},getIconStyle:function(item,_59e){},getLabelStyle:function(item,_59f){},getRowStyle:function(item,_5a0){},getTooltip:function(item){return "";},_onKeyPress:function(e){if(e.altKey){return;}var dk=dojo.keys;var _5a1=dijit.getEnclosingWidget(e.target);if(!_5a1){return;}var key=e.charOrCode;if(typeof key=="string"&&key!=" "){if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){this._onLetterKeyNav({node:_5a1,key:key.toLowerCase()});dojo.stopEvent(e);}}else{if(this._curSearch){clearTimeout(this._curSearch.timer);delete this._curSearch;}var map=this._keyHandlerMap;if(!map){map={};map[dk.ENTER]="_onEnterKey";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:_5a1,item:_5a1.item,evt:e});dojo.stopEvent(e);}}},_onEnterKey:function(_5a2){this._publish("execute",{item:_5a2.item,node:_5a2.node});this.dndController.userSelect(_5a2.node,dojo.isCopyKey(_5a2.evt),_5a2.evt.shiftKey);this.onClick(_5a2.item,_5a2.node,_5a2.evt);},_onDownArrow:function(_5a3){var node=this._getNextNode(_5a3.node);if(node&&node.isTreeNode){this.focusNode(node);}},_onUpArrow:function(_5a4){var node=_5a4.node;var _5a5=node.getPreviousSibling();if(_5a5){node=_5a5;while(node.isExpandable&&node.isExpanded&&node.hasChildren()){var _5a6=node.getChildren();node=_5a6[_5a6.length-1];}}else{var _5a7=node.getParent();if(!(!this.showRoot&&_5a7===this.rootNode)){node=_5a7;}}if(node&&node.isTreeNode){this.focusNode(node);}},_onRightArrow:function(_5a8){var node=_5a8.node;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(_5a9){var node=_5a9.node;if(node.isExpandable&&node.isExpanded){this._collapseNode(node);}else{var _5aa=node.getParent();if(_5aa&&_5aa.isTreeNode&&!(!this.showRoot&&_5aa===this.rootNode)){this.focusNode(_5aa);}}},_onHomeKey:function(){var node=this._getRootOrFirstNode();if(node){this.focusNode(node);}},_onEndKey:function(_5ab){var node=this.rootNode;while(node.isExpanded){var c=node.getChildren();node=c[c.length-1];}if(node&&node.isTreeNode){this.focusNode(node);}},multiCharSearchDuration:250,_onLetterKeyNav:function(_5ac){var cs=this._curSearch;if(cs){cs.pattern=cs.pattern+_5ac.key;clearTimeout(cs.timer);}else{cs=this._curSearch={pattern:_5ac.key,startNode:_5ac.node};}var self=this;cs.timer=setTimeout(function(){delete self._curSearch;},this.multiCharSearchDuration);var node=cs.startNode;do{node=this._getNextNode(node);if(!node){node=this._getRootOrFirstNode();}}while(node!==cs.startNode&&(node.label.toLowerCase().substr(0,cs.pattern.length)!=cs.pattern));if(node&&node.isTreeNode){if(node!==cs.startNode){this.focusNode(node);}}},isExpandoNode:function(node,_5ad){return dojo.isDescendant(node,_5ad.expandoNode);},_onClick:function(_5ae,e){var _5af=e.target,_5b0=this.isExpandoNode(_5af,_5ae);if((this.openOnClick&&_5ae.isExpandable)||_5b0){if(_5ae.isExpandable){this._onExpandoClick({node:_5ae});}}else{this._publish("execute",{item:_5ae.item,node:_5ae,evt:e});this.onClick(_5ae.item,_5ae,e);this.focusNode(_5ae);}dojo.stopEvent(e);},_onDblClick:function(_5b1,e){var _5b2=e.target,_5b3=(_5b2==_5b1.expandoNode||_5b2==_5b1.expandoNodeText);if((this.openOnDblClick&&_5b1.isExpandable)||_5b3){if(_5b1.isExpandable){this._onExpandoClick({node:_5b1});}}else{this._publish("execute",{item:_5b1.item,node:_5b1,evt:e});this.onDblClick(_5b1.item,_5b1,e);this.focusNode(_5b1);}dojo.stopEvent(e);},_onExpandoClick:function(_5b4){var node=_5b4.node;this.focusNode(node);if(node.isExpanded){this._collapseNode(node);}else{this._expandNode(node);}},onClick:function(item,node,evt){},onDblClick:function(item,node,evt){},onOpen:function(item,node){},onClose:function(item,node){},_getNextNode:function(node){if(node.isExpandable&&node.isExpanded&&node.hasChildren()){return node.getChildren()[0];}else{while(node&&node.isTreeNode){var _5b5=node.getNextSibling();if(_5b5){return _5b5;}node=node.getParent();}return null;}},_getRootOrFirstNode:function(){return this.showRoot?this.rootNode:this.rootNode.getChildren()[0];},_collapseNode:function(node){if(node._expandNodeDeferred){delete node._expandNodeDeferred;}if(node.isExpandable){if(node.state=="LOADING"){return;}node.collapse();this.onClose(node.item,node);if(node.item){this._state(node.item,false);this._saveState();}}},_expandNode:function(node,_5b6){if(node._expandNodeDeferred&&!_5b6){return node._expandNodeDeferred;}var _5b7=this.model,item=node.item,_5b8=this;switch(node.state){case "UNCHECKED":node.markProcessing();var def=(node._expandNodeDeferred=new dojo.Deferred());_5b7.getChildren(item,function(_5b9){node.unmarkProcessing();var scid=node.setChildItems(_5b9);var ed=_5b8._expandNode(node,true);scid.addCallback(function(){ed.addCallback(function(){def.callback();});});},function(err){console.error(_5b8,": error loading root children: ",err);});break;default:def=(node._expandNodeDeferred=node.expand());this.onOpen(node.item,node);if(item){this._state(item,true);this._saveState();}}return def;},focusNode:function(node){dijit.focus(node.labelNode);},_onNodeFocus:function(node){if(node&&node!=this.lastFocused){if(this.lastFocused&&!this.lastFocused._destroyed){this.lastFocused.setFocusable(false);}node.setFocusable(true);this.lastFocused=node;}},_onNodeMouseEnter:function(node){},_onNodeMouseLeave:function(node){},_onItemChange:function(item){var _5ba=this.model,_5bb=_5ba.getIdentity(item),_5bc=this._itemNodesMap[_5bb];if(_5bc){var _5bd=this.getLabel(item),_5be=this.getTooltip(item);dojo.forEach(_5bc,function(node){node.set({item:item,label:_5bd,tooltip:_5be});node._updateItemClasses(item);});}},_onItemChildrenChange:function(_5bf,_5c0){var _5c1=this.model,_5c2=_5c1.getIdentity(_5bf),_5c3=this._itemNodesMap[_5c2];if(_5c3){dojo.forEach(_5c3,function(_5c4){_5c4.setChildItems(_5c0);});}},_onItemDelete:function(item){var _5c5=this.model,_5c6=_5c5.getIdentity(item),_5c7=this._itemNodesMap[_5c6];if(_5c7){dojo.forEach(_5c7,function(node){this.dndController.removeTreeNode(node);var _5c8=node.getParent();if(_5c8){_5c8.removeChild(node);}node.destroyRecursive();},this);delete this._itemNodesMap[_5c6];}},_initState:function(){if(this.persist){var _5c9=dojo.cookie(this.cookieName);this._openedItemIds={};if(_5c9){dojo.forEach(_5c9.split(","),function(item){this._openedItemIds[item]=true;},this);}}},_state:function(item,_5ca){if(!this.persist){return false;}var id=this.model.getIdentity(item);if(arguments.length===1){return this._openedItemIds[id];}if(_5ca){this._openedItemIds[id]=true;}else{delete this._openedItemIds[id];}},_saveState:function(){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(){this.destroy();},resize:function(_5cb){if(_5cb){dojo.marginBox(this.domNode,_5cb);}this._nodePixelIndent=dojo._getMarginSize(this.tree.indentDetector).w;if(this.tree.rootNode){this.tree.rootNode.set("indent",this.showRoot?0:-1);}},_createTreeNode:function(args){return new dijit._TreeNode(args);}});}if(!dojo._hasResource["dojo.dnd.Avatar"]){dojo._hasResource["dojo.dnd.Avatar"]=true;dojo.provide("dojo.dnd.Avatar");dojo.declare("dojo.dnd.Avatar",null,{constructor:function(_5cc){this.manager=_5cc;this.construct();},construct:function(){this.isA11y=dojo.hasClass(dojo.body(),"dijit_a11y");var a=dojo.create("table",{"class":"dojoDndAvatar",style:{position:"absolute",zIndex:"1999",margin:"0px"}}),_5cd=this.manager.source,node,b=dojo.create("tbody",null,a),tr=dojo.create("tr",null,b),td=dojo.create("td",null,tr),icon=this.isA11y?dojo.create("span",{id:"a11yIcon",innerHTML:this.manager.copy?"+":"<"},td):null,span=dojo.create("span",{innerHTML:_5cd.generateText?this._generateText():""},td),k=Math.min(5,this.manager.nodes.length),i=0;dojo.attr(tr,{"class":"dojoDndAvatarHeader",style:{opacity:0.9}});for(;i<k;++i){if(_5cd.creator){node=_5cd._normalizedCreator(_5cd.getItem(this.manager.nodes[i].id).data,"avatar").node;}else{node=this.manager.nodes[i].cloneNode(true);if(node.tagName.toLowerCase()=="tr"){var _5ce=dojo.create("table"),_5cf=dojo.create("tbody",null,_5ce);_5cf.appendChild(node);node=_5ce;}}node.id="";tr=dojo.create("tr",null,b);td=dojo.create("td",null,tr);td.appendChild(node);dojo.attr(tr,{"class":"dojoDndAvatarItem",style:{opacity:(9-i)/10}});}this.node=a;},destroy:function(){dojo.destroy(this.node);this.node=false;},update:function(){dojo[(this.manager.canDropFlag?"add":"remove")+"Class"](this.node,"dojoDndAvatarCanDrop");if(this.isA11y){var icon=dojo.byId("a11yIcon");var text="+";if(this.manager.canDropFlag&&!this.manager.copy){text="< ";}else{if(!this.manager.canDropFlag&&!this.manager.copy){text="o";}else{if(!this.manager.canDropFlag){text="x";}}}icon.innerHTML=text;}dojo.query(("tr.dojoDndAvatarHeader td span"+(this.isA11y?" span":"")),this.node).forEach(function(node){node.innerHTML=this._generateText();},this);},_generateText:function(){return this.manager.nodes.length.toString();}});}if(!dojo._hasResource["dojo.dnd.Manager"]){dojo._hasResource["dojo.dnd.Manager"]=true;dojo.provide("dojo.dnd.Manager");dojo.declare("dojo.dnd.Manager",null,{constructor:function(){this.avatar=null;this.source=null;this.nodes=[];this.copy=true;this.target=null;this.canDropFlag=false;this.events=[];},OFFSET_X:16,OFFSET_Y:16,overSource:function(_5d0){if(this.avatar){this.target=(_5d0&&_5d0.targetState!="Disabled")?_5d0:null;this.canDropFlag=Boolean(this.target);this.avatar.update();}dojo.publish("/dnd/source/over",[_5d0]);},outSource:function(_5d1){if(this.avatar){if(this.target==_5d1){this.target=null;this.canDropFlag=false;this.avatar.update();dojo.publish("/dnd/source/over",[null]);}}else{dojo.publish("/dnd/source/over",[null]);}},startDrag:function(_5d2,_5d3,copy){this.source=_5d2;this.nodes=_5d3;this.copy=Boolean(copy);this.avatar=this.makeAvatar();dojo.body().appendChild(this.avatar.node);dojo.publish("/dnd/start",[_5d2,_5d3,this.copy]);this.events=[dojo.connect(dojo.doc,"onmousemove",this,"onMouseMove"),dojo.connect(dojo.doc,"onmouseup",this,"onMouseUp"),dojo.connect(dojo.doc,"onkeydown",this,"onKeyDown"),dojo.connect(dojo.doc,"onkeyup",this,"onKeyUp"),dojo.connect(dojo.doc,"ondragstart",dojo.stopEvent),dojo.connect(dojo.body(),"onselectstart",dojo.stopEvent)];var c="dojoDnd"+(copy?"Copy":"Move");dojo.addClass(dojo.body(),c);},canDrop:function(flag){var _5d4=Boolean(this.target&&flag);if(this.canDropFlag!=_5d4){this.canDropFlag=_5d4;this.avatar.update();}},stopDrag:function(){dojo.removeClass(dojo.body(),["dojoDndCopy","dojoDndMove"]);dojo.forEach(this.events,dojo.disconnect);this.events=[];this.avatar.destroy();this.avatar=null;this.source=this.target=null;this.nodes=[];},makeAvatar:function(){return new dojo.dnd.Avatar(this);},updateAvatar:function(){this.avatar.update();},onMouseMove:function(e){var a=this.avatar;if(a){dojo.dnd.autoScrollNodes(e);var s=a.node.style;s.left=(e.pageX+this.OFFSET_X)+"px";s.top=(e.pageY+this.OFFSET_Y)+"px";var copy=Boolean(this.source.copyState(dojo.isCopyKey(e)));if(this.copy!=copy){this._setCopyStatus(copy);}}},onMouseUp:function(e){if(this.avatar){if(this.target&&this.canDropFlag){var copy=Boolean(this.source.copyState(dojo.isCopyKey(e))),_5d5=[this.source,this.nodes,copy,this.target,e];dojo.publish("/dnd/drop/before",_5d5);dojo.publish("/dnd/drop",_5d5);}else{dojo.publish("/dnd/cancel");}this.stopDrag();}},onKeyDown:function(e){if(this.avatar){switch(e.keyCode){case dojo.keys.CTRL:var copy=Boolean(this.source.copyState(true));if(this.copy!=copy){this._setCopyStatus(copy);}break;case dojo.keys.ESCAPE:dojo.publish("/dnd/cancel");this.stopDrag();break;}}},onKeyUp:function(e){if(this.avatar&&e.keyCode==dojo.keys.CTRL){var copy=Boolean(this.source.copyState(false));if(this.copy!=copy){this._setCopyStatus(copy);}}},_setCopyStatus:function(copy){this.copy=copy;this.source._markDndStatus(this.copy);this.updateAvatar();dojo.replaceClass(dojo.body(),"dojoDnd"+(this.copy?"Copy":"Move"),"dojoDnd"+(this.copy?"Move":"Copy"));}});dojo.dnd._manager=null;dojo.dnd.manager=function(){if(!dojo.dnd._manager){dojo.dnd._manager=new dojo.dnd.Manager();}return dojo.dnd._manager;};}if(!dojo._hasResource["dijit.tree.dndSource"]){dojo._hasResource["dijit.tree.dndSource"]=true;dojo.provide("dijit.tree.dndSource");dojo.declare("dijit.tree.dndSource",dijit.tree._dndSelector,{isSource:true,accept:["text","treeNode"],copyOnly:false,dragThreshold:5,betweenThreshold:0,constructor:function(tree,_5d6){if(!_5d6){_5d6={};}dojo.mixin(this,_5d6);this.isSource=typeof _5d6.isSource=="undefined"?true:_5d6.isSource;var type=_5d6.accept instanceof Array?_5d6.accept:["text","treeNode"];this.accept=null;if(type.length){this.accept={};for(var i=0;i<type.length;++i){this.accept[type[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){dojo.addClass(this.node,"dojoDndSource");}this.targetState="";if(this.accept){dojo.addClass(this.node,"dojoDndTarget");}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")];},checkAcceptance:function(_5d7,_5d8){return true;},copyState:function(_5d9){return this.copyOnly||_5d9;},destroy:function(){this.inherited("destroy",arguments);dojo.forEach(this.topics,dojo.unsubscribe);this.targetAnchor=null;},_onDragMouse:function(e){var m=dojo.dnd.manager(),_5da=this.targetAnchor,_5db=this.current,_5dc=this.dropPosition;var _5dd="Over";if(_5db&&this.betweenThreshold>0){if(!this.targetBox||_5da!=_5db){this.targetBox=dojo.position(_5db.rowNode,true);}if((e.pageY-this.targetBox.y)<=this.betweenThreshold){_5dd="Before";}else{if((e.pageY-this.targetBox.y)>=(this.targetBox.h-this.betweenThreshold)){_5dd="After";}}}if(_5db!=_5da||_5dd!=_5dc){if(_5da){this._removeItemClass(_5da.rowNode,_5dc);}if(_5db){this._addItemClass(_5db.rowNode,_5dd);}if(!_5db){m.canDrop(false);}else{if(_5db==this.tree.rootNode&&_5dd!="Over"){m.canDrop(false);}else{if(m.source==this&&(_5db.id in this.selection)){m.canDrop(false);}else{if(this.checkItemAcceptance(_5db.rowNode,m.source,_5dd.toLowerCase())&&!this._isParentChildDrop(m.source,_5db.rowNode)){m.canDrop(true);}else{m.canDrop(false);}}}}this.targetAnchor=_5db;this.dropPosition=_5dd;}},onMouseMove:function(e){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 _5de=this.getSelectedTreeNodes();if(_5de.length){if(_5de.length>1){var seen=this.selection,i=0,r=[],n,p;nextitem:while((n=_5de[i++])){for(p=n.getParent();p&&p!==this.tree;p=p.getParent()){if(seen[p.id]){continue nextitem;}}r.push(n);}_5de=r;}_5de=dojo.map(_5de,function(n){return n.domNode;});m.startDrag(this,_5de,this.copyState(dojo.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(_5df,_5e0,_5e1){return true;},onDndSourceOver:function(_5e2){if(this!=_5e2){this.mouseDown=false;this._unmarkTargetAnchor();}else{if(this.isDragging){var m=dojo.dnd.manager();m.canDrop(false);}}},onDndStart:function(_5e3,_5e4,copy){if(this.isSource){this._changeState("Source",this==_5e3?(copy?"Copied":"Moved"):"");}var _5e5=this.checkAcceptance(_5e3,_5e4);this._changeState("Target",_5e5?"":"Disabled");if(this==_5e3){dojo.dnd.manager().overSource(this);}this.isDragging=true;},itemCreator:function(_5e6,_5e7,_5e8){return dojo.map(_5e6,function(node){return {"id":node.id,"name":node.textContent||node.innerText||""};});},onDndDrop:function(_5e9,_5ea,copy){if(this.containerState=="Over"){var tree=this.tree,_5eb=tree.model,_5ec=this.targetAnchor,_5ed=false;this.isDragging=false;var _5ee=_5ec;var _5ef;var _5f0;_5ef=(_5ee&&_5ee.item)||tree.item;if(this.dropPosition=="Before"||this.dropPosition=="After"){_5ef=(_5ee.getParent()&&_5ee.getParent().item)||tree.item;_5f0=_5ee.getIndexInParent();if(this.dropPosition=="After"){_5f0=_5ee.getIndexInParent()+1;}}else{_5ef=(_5ee&&_5ee.item)||tree.item;}var _5f1;dojo.forEach(_5ea,function(node,idx){var _5f2=_5e9.getItem(node.id);if(dojo.indexOf(_5f2.type,"treeNode")!=-1){var _5f3=_5f2.data,_5f4=_5f3.item,_5f5=_5f3.getParent().item;}if(_5e9==this){if(typeof _5f0=="number"){if(_5ef==_5f5&&_5f3.getIndexInParent()<_5f0){_5f0-=1;}}_5eb.pasteItem(_5f4,_5f5,_5ef,copy,_5f0);}else{if(_5eb.isItem(_5f4)){_5eb.pasteItem(_5f4,_5f5,_5ef,copy,_5f0);}else{if(!_5f1){_5f1=this.itemCreator(_5ea,_5ec.rowNode,_5e9);}_5eb.newItem(_5f1[idx],_5ef,_5f0);}}},this);this.tree._expandNode(_5ee);}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);dojo.dnd.manager().overSource(this);},onOutEvent:function(){this._unmarkTargetAnchor();var m=dojo.dnd.manager();if(this.isDragging){m.canDrop(false);}m.outSource(this);this.inherited(arguments);},_isParentChildDrop:function(_5f6,_5f7){if(!_5f6.tree||_5f6.tree!=this.tree){return false;}var root=_5f6.tree.domNode;var ids=_5f6.selection;var node=_5f7.parentNode;while(node!=root&&!ids[node.id]){node=node.parentNode;}return node.id&&ids[node.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(copy){this._changeState("Source",copy?"Copied":"Moved");}});}if(!dojo._hasResource["dojo.data.ItemFileReadStore"]){dojo._hasResource["dojo.data.ItemFileReadStore"]=true;dojo.provide("dojo.data.ItemFileReadStore");dojo.declare("dojo.data.ItemFileReadStore",null,{constructor:function(_5f8){this._arrayOfAllItems=[];this._arrayOfTopLevelItems=[];this._loadFinished=false;this._jsonFileUrl=_5f8.url;this._ccUrl=_5f8.url;this.url=_5f8.url;this._jsonData=_5f8.data;this.data=null;this._datatypeMap=_5f8.typeMap||{};if(!this._datatypeMap["Date"]){this._datatypeMap["Date"]={type:Date,deserialize:function(_5f9){return dojo.date.stamp.fromISOString(_5f9);}};}this._features={"dojo.data.api.Read":true,"dojo.data.api.Identity":true};this._itemsByIdentity=null;this._storeRefPropName="_S";this._itemNumPropName="_0";this._rootItemPropName="_RI";this._reverseRefMap="_RRM";this._loadInProgress=false;this._queuedFetches=[];if(_5f8.urlPreventCache!==undefined){this.urlPreventCache=_5f8.urlPreventCache?true:false;}if(_5f8.hierarchical!==undefined){this.hierarchical=_5f8.hierarchical?true:false;}if(_5f8.clearOnClose){this.clearOnClose=true;}if("failOk" in _5f8){this.failOk=_5f8.failOk?true:false;}},url:"",_ccUrl:"",data:null,typeMap:null,clearOnClose:false,urlPreventCache:false,failOk:false,hierarchical:true,_assertIsItem:function(item){if(!this.isItem(item)){throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");}},_assertIsAttribute:function(_5fa){if(typeof _5fa!=="string"){throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");}},getValue:function(item,_5fb,_5fc){var _5fd=this.getValues(item,_5fb);return (_5fd.length>0)?_5fd[0]:_5fc;},getValues:function(item,_5fe){this._assertIsItem(item);this._assertIsAttribute(_5fe);return (item[_5fe]||[]).slice(0);},getAttributes:function(item){this._assertIsItem(item);var _5ff=[];for(var key in item){if((key!==this._storeRefPropName)&&(key!==this._itemNumPropName)&&(key!==this._rootItemPropName)&&(key!==this._reverseRefMap)){_5ff.push(key);}}return _5ff;},hasAttribute:function(item,_600){this._assertIsItem(item);this._assertIsAttribute(_600);return (_600 in item);},containsValue:function(item,_601,_602){var _603=undefined;if(typeof _602==="string"){_603=dojo.data.util.filter.patternToRegExp(_602,false);}return this._containsValue(item,_601,_602,_603);},_containsValue:function(item,_604,_605,_606){return dojo.some(this.getValues(item,_604),function(_607){if(_607!==null&&!dojo.isObject(_607)&&_606){if(_607.toString().match(_606)){return true;}}else{if(_605===_607){return true;}}});},isItem:function(_608){if(_608&&_608[this._storeRefPropName]===this){if(this._arrayOfAllItems[_608[this._itemNumPropName]]===_608){return true;}}return false;},isItemLoaded:function(_609){return this.isItem(_609);},loadItem:function(_60a){this._assertIsItem(_60a.item);},getFeatures:function(){return this._features;},getLabel:function(item){if(this._labelAttr&&this.isItem(item)){return this.getValue(item,this._labelAttr);}return undefined;},getLabelAttributes:function(item){if(this._labelAttr){return [this._labelAttr];}return null;},_fetchItems:function(_60b,_60c,_60d){var self=this,_60e=function(_60f,_610){var _611=[],i,key;if(_60f.query){var _612,_613=_60f.queryOptions?_60f.queryOptions.ignoreCase:false;var _614={};for(key in _60f.query){_612=_60f.query[key];if(typeof _612==="string"){_614[key]=dojo.data.util.filter.patternToRegExp(_612,_613);}else{if(_612 instanceof RegExp){_614[key]=_612;}}}for(i=0;i<_610.length;++i){var _615=true;var _616=_610[i];if(_616===null){_615=false;}else{for(key in _60f.query){_612=_60f.query[key];if(!self._containsValue(_616,key,_612,_614[key])){_615=false;}}}if(_615){_611.push(_616);}}_60c(_611,_60f);}else{for(i=0;i<_610.length;++i){var item=_610[i];if(item!==null){_611.push(item);}}_60c(_611,_60f);}};if(this._loadFinished){_60e(_60b,this._getItemsArray(_60b.queryOptions));}else{if(this._jsonFileUrl!==this._ccUrl){dojo.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){if(this._loadInProgress){this._queuedFetches.push({args:_60b,filter:_60e});}else{this._loadInProgress=true;var _617={url:self._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _618=dojo.xhrGet(_617);_618.addCallback(function(data){try{self._getItemsFromLoadedData(data);self._loadFinished=true;self._loadInProgress=false;_60e(_60b,self._getItemsArray(_60b.queryOptions));self._handleQueuedFetches();}catch(e){self._loadFinished=true;self._loadInProgress=false;_60d(e,_60b);}});_618.addErrback(function(_619){self._loadInProgress=false;_60d(_619,_60b);});var _61a=null;if(_60b.abort){_61a=_60b.abort;}_60b.abort=function(){var df=_618;if(df&&df.fired===-1){df.cancel();df=null;}if(_61a){_61a.call(_60b);}};}}else{if(this._jsonData){try{this._loadFinished=true;this._getItemsFromLoadedData(this._jsonData);this._jsonData=null;_60e(_60b,this._getItemsArray(_60b.queryOptions));}catch(e){_60d(e,_60b);}}else{_60d(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."),_60b);}}}},_handleQueuedFetches:function(){if(this._queuedFetches.length>0){for(var i=0;i<this._queuedFetches.length;i++){var _61b=this._queuedFetches[i],_61c=_61b.args,_61d=_61b.filter;if(_61d){_61d(_61c,this._getItemsArray(_61c.queryOptions));}else{this.fetchItemByIdentity(_61c);}}this._queuedFetches=[];}},_getItemsArray:function(_61e){if(_61e&&_61e.deep){return this._arrayOfAllItems;}return this._arrayOfTopLevelItems;},close:function(_61f){if(this.clearOnClose&&this._loadFinished&&!this._loadInProgress){if(((this._jsonFileUrl==""||this._jsonFileUrl==null)&&(this.url==""||this.url==null))&&this.data==null){console.debug("dojo.data.ItemFileReadStore: WARNING! Data reload "+" information has not been provided."+" Please set 'url' or 'data' to the appropriate value before"+" the next fetch");}this._arrayOfAllItems=[];this._arrayOfTopLevelItems=[];this._loadFinished=false;this._itemsByIdentity=null;this._loadInProgress=false;this._queuedFetches=[];}},_getItemsFromLoadedData:function(_620){var _621=false,self=this;function _622(_623){var _624=((_623!==null)&&(typeof _623==="object")&&(!dojo.isArray(_623)||_621)&&(!dojo.isFunction(_623))&&(_623.constructor==Object||dojo.isArray(_623))&&(typeof _623._reference==="undefined")&&(typeof _623._type==="undefined")&&(typeof _623._value==="undefined")&&self.hierarchical);return _624;};function _625(_626){self._arrayOfAllItems.push(_626);for(var _627 in _626){var _628=_626[_627];if(_628){if(dojo.isArray(_628)){var _629=_628;for(var k=0;k<_629.length;++k){var _62a=_629[k];if(_622(_62a)){_625(_62a);}}}else{if(_622(_628)){_625(_628);}}}}};this._labelAttr=_620.label;var i,item;this._arrayOfAllItems=[];this._arrayOfTopLevelItems=_620.items;for(i=0;i<this._arrayOfTopLevelItems.length;++i){item=this._arrayOfTopLevelItems[i];if(dojo.isArray(item)){_621=true;}_625(item);item[this._rootItemPropName]=true;}var _62b={},key;for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];for(key in item){if(key!==this._rootItemPropName){var _62c=item[key];if(_62c!==null){if(!dojo.isArray(_62c)){item[key]=[_62c];}}else{item[key]=[null];}}_62b[key]=key;}}while(_62b[this._storeRefPropName]){this._storeRefPropName+="_";}while(_62b[this._itemNumPropName]){this._itemNumPropName+="_";}while(_62b[this._reverseRefMap]){this._reverseRefMap+="_";}var _62d;var _62e=_620.identifier;if(_62e){this._itemsByIdentity={};this._features["dojo.data.api.Identity"]=_62e;for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];_62d=item[_62e];var _62f=_62d[0];if(!Object.hasOwnProperty.call(this._itemsByIdentity,_62f)){this._itemsByIdentity[_62f]=item;}else{if(this._jsonFileUrl){throw new Error("dojo.data.ItemFileReadStore: The json data as specified by: ["+this._jsonFileUrl+"] is malformed. Items within the list have identifier: ["+_62e+"]. Value collided: ["+_62f+"]");}else{if(this._jsonData){throw new Error("dojo.data.ItemFileReadStore: The json data provided by the creation arguments is malformed. Items within the list have identifier: ["+_62e+"]. Value collided: ["+_62f+"]");}}}}}else{this._features["dojo.data.api.Identity"]=Number;}for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];item[this._storeRefPropName]=this;item[this._itemNumPropName]=i;}for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];for(key in item){_62d=item[key];for(var j=0;j<_62d.length;++j){_62c=_62d[j];if(_62c!==null&&typeof _62c=="object"){if(("_type" in _62c)&&("_value" in _62c)){var type=_62c._type;var _630=this._datatypeMap[type];if(!_630){throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '"+type+"'");}else{if(dojo.isFunction(_630)){_62d[j]=new _630(_62c._value);}else{if(dojo.isFunction(_630.deserialize)){_62d[j]=_630.deserialize(_62c._value);}else{throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");}}}}if(_62c._reference){var _631=_62c._reference;if(!dojo.isObject(_631)){_62d[j]=this._getItemByIdentity(_631);}else{for(var k=0;k<this._arrayOfAllItems.length;++k){var _632=this._arrayOfAllItems[k],_633=true;for(var _634 in _631){if(_632[_634]!=_631[_634]){_633=false;}}if(_633){_62d[j]=_632;}}}if(this.referenceIntegrity){var _635=_62d[j];if(this.isItem(_635)){this._addReferenceToMap(_635,item,key);}}}else{if(this.isItem(_62c)){if(this.referenceIntegrity){this._addReferenceToMap(_62c,item,key);}}}}}}}},_addReferenceToMap:function(_636,_637,_638){},getIdentity:function(item){var _639=this._features["dojo.data.api.Identity"];if(_639===Number){return item[this._itemNumPropName];}else{var _63a=item[_639];if(_63a){return _63a[0];}}return null;},fetchItemByIdentity:function(_63b){var item,_63c;if(!this._loadFinished){var self=this;if(this._jsonFileUrl!==this._ccUrl){dojo.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null&&this._jsonData==null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){if(this._loadInProgress){this._queuedFetches.push({args:_63b});}else{this._loadInProgress=true;var _63d={url:self._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _63e=dojo.xhrGet(_63d);_63e.addCallback(function(data){var _63f=_63b.scope?_63b.scope:dojo.global;try{self._getItemsFromLoadedData(data);self._loadFinished=true;self._loadInProgress=false;item=self._getItemByIdentity(_63b.identity);if(_63b.onItem){_63b.onItem.call(_63f,item);}self._handleQueuedFetches();}catch(error){self._loadInProgress=false;if(_63b.onError){_63b.onError.call(_63f,error);}}});_63e.addErrback(function(_640){self._loadInProgress=false;if(_63b.onError){var _641=_63b.scope?_63b.scope:dojo.global;_63b.onError.call(_641,_640);}});}}else{if(this._jsonData){self._getItemsFromLoadedData(self._jsonData);self._jsonData=null;self._loadFinished=true;item=self._getItemByIdentity(_63b.identity);if(_63b.onItem){_63c=_63b.scope?_63b.scope:dojo.global;_63b.onItem.call(_63c,item);}}}}else{item=this._getItemByIdentity(_63b.identity);if(_63b.onItem){_63c=_63b.scope?_63b.scope:dojo.global;_63b.onItem.call(_63c,item);}}},_getItemByIdentity:function(_642){var item=null;if(this._itemsByIdentity&&Object.hasOwnProperty.call(this._itemsByIdentity,_642)){item=this._itemsByIdentity[_642];}else{if(Object.hasOwnProperty.call(this._arrayOfAllItems,_642)){item=this._arrayOfAllItems[_642];}}if(item===undefined){item=null;}return item;},getIdentityAttributes:function(item){var _643=this._features["dojo.data.api.Identity"];if(_643===Number){return null;}else{return [_643];}},_forceLoad:function(){var self=this;if(this._jsonFileUrl!==this._ccUrl){dojo.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){var _644={url:this._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk,sync:true};var _645=dojo.xhrGet(_644);_645.addCallback(function(data){try{if(self._loadInProgress!==true&&!self._loadFinished){self._getItemsFromLoadedData(data);self._loadFinished=true;}else{if(self._loadInProgress){throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress.");}}}catch(e){console.log(e);throw e;}});_645.addErrback(function(_646){throw _646;});}else{if(this._jsonData){self._getItemsFromLoadedData(self._jsonData);self._jsonData=null;self._loadFinished=true;}}}});dojo.extend(dojo.data.ItemFileReadStore,dojo.data.util.simpleFetch);}if(!dojo._hasResource["dojo.data.ItemFileWriteStore"]){dojo._hasResource["dojo.data.ItemFileWriteStore"]=true;dojo.provide("dojo.data.ItemFileWriteStore");dojo.declare("dojo.data.ItemFileWriteStore",dojo.data.ItemFileReadStore,{constructor:function(_647){this._features["dojo.data.api.Write"]=true;this._features["dojo.data.api.Notification"]=true;this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};if(!this._datatypeMap["Date"].serialize){this._datatypeMap["Date"].serialize=function(obj){return dojo.date.stamp.toISOString(obj,{zulu:true});};}if(_647&&(_647.referenceIntegrity===false)){this.referenceIntegrity=false;}this._saveInProgress=false;},referenceIntegrity:true,_assert:function(_648){if(!_648){throw new Error("assertion failed in ItemFileWriteStore");}},_getIdentifierAttribute:function(){var _649=this.getFeatures()["dojo.data.api.Identity"];return _649;},newItem:function(_64a,_64b){this._assert(!this._saveInProgress);if(!this._loadFinished){this._forceLoad();}if(typeof _64a!="object"&&typeof _64a!="undefined"){throw new Error("newItem() was passed something other than an object");}var _64c=null;var _64d=this._getIdentifierAttribute();if(_64d===Number){_64c=this._arrayOfAllItems.length;}else{_64c=_64a[_64d];if(typeof _64c==="undefined"){throw new Error("newItem() was not passed an identity for the new item");}if(dojo.isArray(_64c)){throw new Error("newItem() was not passed an single-valued identity");}}if(this._itemsByIdentity){this._assert(typeof this._itemsByIdentity[_64c]==="undefined");}this._assert(typeof this._pending._newItems[_64c]==="undefined");this._assert(typeof this._pending._deletedItems[_64c]==="undefined");var _64e={};_64e[this._storeRefPropName]=this;_64e[this._itemNumPropName]=this._arrayOfAllItems.length;if(this._itemsByIdentity){this._itemsByIdentity[_64c]=_64e;_64e[_64d]=[_64c];}this._arrayOfAllItems.push(_64e);var _64f=null;if(_64b&&_64b.parent&&_64b.attribute){_64f={item:_64b.parent,attribute:_64b.attribute,oldValue:undefined};var _650=this.getValues(_64b.parent,_64b.attribute);if(_650&&_650.length>0){var _651=_650.slice(0,_650.length);if(_650.length===1){_64f.oldValue=_650[0];}else{_64f.oldValue=_650.slice(0,_650.length);}_651.push(_64e);this._setValueOrValues(_64b.parent,_64b.attribute,_651,false);_64f.newValue=this.getValues(_64b.parent,_64b.attribute);}else{this._setValueOrValues(_64b.parent,_64b.attribute,_64e,false);_64f.newValue=_64e;}}else{_64e[this._rootItemPropName]=true;this._arrayOfTopLevelItems.push(_64e);}this._pending._newItems[_64c]=_64e;for(var key in _64a){if(key===this._storeRefPropName||key===this._itemNumPropName){throw new Error("encountered bug in ItemFileWriteStore.newItem");}var _652=_64a[key];if(!dojo.isArray(_652)){_652=[_652];}_64e[key]=_652;if(this.referenceIntegrity){for(var i=0;i<_652.length;i++){var val=_652[i];if(this.isItem(val)){this._addReferenceToMap(val,_64e,key);}}}}this.onNew(_64e,_64f);return _64e;},_removeArrayElement:function(_653,_654){var _655=dojo.indexOf(_653,_654);if(_655!=-1){_653.splice(_655,1);return true;}return false;},deleteItem:function(item){this._assert(!this._saveInProgress);this._assertIsItem(item);var _656=item[this._itemNumPropName];var _657=this.getIdentity(item);if(this.referenceIntegrity){var _658=this.getAttributes(item);if(item[this._reverseRefMap]){item["backup_"+this._reverseRefMap]=dojo.clone(item[this._reverseRefMap]);}dojo.forEach(_658,function(_659){dojo.forEach(this.getValues(item,_659),function(_65a){if(this.isItem(_65a)){if(!item["backupRefs_"+this._reverseRefMap]){item["backupRefs_"+this._reverseRefMap]=[];}item["backupRefs_"+this._reverseRefMap].push({id:this.getIdentity(_65a),attr:_659});this._removeReferenceFromMap(_65a,item,_659);}},this);},this);var _65b=item[this._reverseRefMap];if(_65b){for(var _65c in _65b){var _65d=null;if(this._itemsByIdentity){_65d=this._itemsByIdentity[_65c];}else{_65d=this._arrayOfAllItems[_65c];}if(_65d){for(var _65e in _65b[_65c]){var _65f=this.getValues(_65d,_65e)||[];var _660=dojo.filter(_65f,function(_661){return !(this.isItem(_661)&&this.getIdentity(_661)==_657);},this);this._removeReferenceFromMap(item,_65d,_65e);if(_660.length<_65f.length){this._setValueOrValues(_65d,_65e,_660,true);}}}}}}this._arrayOfAllItems[_656]=null;item[this._storeRefPropName]=null;if(this._itemsByIdentity){delete this._itemsByIdentity[_657];}this._pending._deletedItems[_657]=item;if(item[this._rootItemPropName]){this._removeArrayElement(this._arrayOfTopLevelItems,item);}this.onDelete(item);return true;},setValue:function(item,_662,_663){return this._setValueOrValues(item,_662,_663,true);},setValues:function(item,_664,_665){return this._setValueOrValues(item,_664,_665,true);},unsetAttribute:function(item,_666){return this._setValueOrValues(item,_666,[],true);},_setValueOrValues:function(item,_667,_668,_669){this._assert(!this._saveInProgress);this._assertIsItem(item);this._assert(dojo.isString(_667));this._assert(typeof _668!=="undefined");var _66a=this._getIdentifierAttribute();if(_667==_66a){throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");}var _66b=this._getValueOrValues(item,_667);var _66c=this.getIdentity(item);if(!this._pending._modifiedItems[_66c]){var _66d={};for(var key in item){if((key===this._storeRefPropName)||(key===this._itemNumPropName)||(key===this._rootItemPropName)){_66d[key]=item[key];}else{if(key===this._reverseRefMap){_66d[key]=dojo.clone(item[key]);}else{_66d[key]=item[key].slice(0,item[key].length);}}}this._pending._modifiedItems[_66c]=_66d;}var _66e=false;if(dojo.isArray(_668)&&_668.length===0){_66e=delete item[_667];_668=undefined;if(this.referenceIntegrity&&_66b){var _66f=_66b;if(!dojo.isArray(_66f)){_66f=[_66f];}for(var i=0;i<_66f.length;i++){var _670=_66f[i];if(this.isItem(_670)){this._removeReferenceFromMap(_670,item,_667);}}}}else{var _671;if(dojo.isArray(_668)){var _672=_668;_671=_668.slice(0,_668.length);}else{_671=[_668];}if(this.referenceIntegrity){if(_66b){var _66f=_66b;if(!dojo.isArray(_66f)){_66f=[_66f];}var map={};dojo.forEach(_66f,function(_673){if(this.isItem(_673)){var id=this.getIdentity(_673);map[id.toString()]=true;}},this);dojo.forEach(_671,function(_674){if(this.isItem(_674)){var id=this.getIdentity(_674);if(map[id.toString()]){delete map[id.toString()];}else{this._addReferenceToMap(_674,item,_667);}}},this);for(var rId in map){var _675;if(this._itemsByIdentity){_675=this._itemsByIdentity[rId];}else{_675=this._arrayOfAllItems[rId];}this._removeReferenceFromMap(_675,item,_667);}}else{for(var i=0;i<_671.length;i++){var _670=_671[i];if(this.isItem(_670)){this._addReferenceToMap(_670,item,_667);}}}}item[_667]=_671;_66e=true;}if(_669){this.onSet(item,_667,_66b,_668);}return _66e;},_addReferenceToMap:function(_676,_677,_678){var _679=this.getIdentity(_677);var _67a=_676[this._reverseRefMap];if(!_67a){_67a=_676[this._reverseRefMap]={};}var _67b=_67a[_679];if(!_67b){_67b=_67a[_679]={};}_67b[_678]=true;},_removeReferenceFromMap:function(_67c,_67d,_67e){var _67f=this.getIdentity(_67d);var _680=_67c[this._reverseRefMap];var _681;if(_680){for(_681 in _680){if(_681==_67f){delete _680[_681][_67e];if(this._isEmpty(_680[_681])){delete _680[_681];}}}if(this._isEmpty(_680)){delete _67c[this._reverseRefMap];}}},_dumpReferenceMap:function(){var i;for(i=0;i<this._arrayOfAllItems.length;i++){var item=this._arrayOfAllItems[i];if(item&&item[this._reverseRefMap]){console.log("Item: ["+this.getIdentity(item)+"] is referenced by: "+dojo.toJson(item[this._reverseRefMap]));}}},_getValueOrValues:function(item,_682){var _683=undefined;if(this.hasAttribute(item,_682)){var _684=this.getValues(item,_682);if(_684.length==1){_683=_684[0];}else{_683=_684;}}return _683;},_flatten:function(_685){if(this.isItem(_685)){var item=_685;var _686=this.getIdentity(item);var _687={_reference:_686};return _687;}else{if(typeof _685==="object"){for(var type in this._datatypeMap){var _688=this._datatypeMap[type];if(dojo.isObject(_688)&&!dojo.isFunction(_688)){if(_685 instanceof _688.type){if(!_688.serialize){throw new Error("ItemFileWriteStore: No serializer defined for type mapping: ["+type+"]");}return {_type:type,_value:_688.serialize(_685)};}}else{if(_685 instanceof _688){return {_type:type,_value:_685.toString()};}}}}return _685;}},_getNewFileContentString:function(){var _689={};var _68a=this._getIdentifierAttribute();if(_68a!==Number){_689.identifier=_68a;}if(this._labelAttr){_689.label=this._labelAttr;}_689.items=[];for(var i=0;i<this._arrayOfAllItems.length;++i){var item=this._arrayOfAllItems[i];if(item!==null){var _68b={};for(var key in item){if(key!==this._storeRefPropName&&key!==this._itemNumPropName&&key!==this._reverseRefMap&&key!==this._rootItemPropName){var _68c=key;var _68d=this.getValues(item,_68c);if(_68d.length==1){_68b[_68c]=this._flatten(_68d[0]);}else{var _68e=[];for(var j=0;j<_68d.length;++j){_68e.push(this._flatten(_68d[j]));_68b[_68c]=_68e;}}}}_689.items.push(_68b);}}var _68f=true;return dojo.toJson(_689,_68f);},_isEmpty:function(_690){var _691=true;if(dojo.isObject(_690)){var i;for(i in _690){_691=false;break;}}else{if(dojo.isArray(_690)){if(_690.length>0){_691=false;}}}return _691;},save:function(_692){this._assert(!this._saveInProgress);this._saveInProgress=true;var self=this;var _693=function(){self._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};self._saveInProgress=false;if(_692&&_692.onComplete){var _694=_692.scope||dojo.global;_692.onComplete.call(_694);}};var _695=function(err){self._saveInProgress=false;if(_692&&_692.onError){var _696=_692.scope||dojo.global;_692.onError.call(_696,err);}};if(this._saveEverything){var _697=this._getNewFileContentString();this._saveEverything(_693,_695,_697);}if(this._saveCustom){this._saveCustom(_693,_695);}if(!this._saveEverything&&!this._saveCustom){_693();}},revert:function(){this._assert(!this._saveInProgress);var _698;for(_698 in this._pending._modifiedItems){var _699=this._pending._modifiedItems[_698];var _69a=null;if(this._itemsByIdentity){_69a=this._itemsByIdentity[_698];}else{_69a=this._arrayOfAllItems[_698];}_699[this._storeRefPropName]=this;for(key in _69a){delete _69a[key];}dojo.mixin(_69a,_699);}var _69b;for(_698 in this._pending._deletedItems){_69b=this._pending._deletedItems[_698];_69b[this._storeRefPropName]=this;var _69c=_69b[this._itemNumPropName];if(_69b["backup_"+this._reverseRefMap]){_69b[this._reverseRefMap]=_69b["backup_"+this._reverseRefMap];delete _69b["backup_"+this._reverseRefMap];}this._arrayOfAllItems[_69c]=_69b;if(this._itemsByIdentity){this._itemsByIdentity[_698]=_69b;}if(_69b[this._rootItemPropName]){this._arrayOfTopLevelItems.push(_69b);}}for(_698 in this._pending._deletedItems){_69b=this._pending._deletedItems[_698];if(_69b["backupRefs_"+this._reverseRefMap]){dojo.forEach(_69b["backupRefs_"+this._reverseRefMap],function(_69d){var _69e;if(this._itemsByIdentity){_69e=this._itemsByIdentity[_69d.id];}else{_69e=this._arrayOfAllItems[_69d.id];}this._addReferenceToMap(_69e,_69b,_69d.attr);},this);delete _69b["backupRefs_"+this._reverseRefMap];}}for(_698 in this._pending._newItems){var _69f=this._pending._newItems[_698];_69f[this._storeRefPropName]=null;this._arrayOfAllItems[_69f[this._itemNumPropName]]=null;if(_69f[this._rootItemPropName]){this._removeArrayElement(this._arrayOfTopLevelItems,_69f);}if(this._itemsByIdentity){delete this._itemsByIdentity[_698];}}this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};return true;},isDirty:function(item){if(item){var _6a0=this.getIdentity(item);return new Boolean(this._pending._newItems[_6a0]||this._pending._modifiedItems[_6a0]||this._pending._deletedItems[_6a0]).valueOf();}else{if(!this._isEmpty(this._pending._newItems)||!this._isEmpty(this._pending._modifiedItems)||!this._isEmpty(this._pending._deletedItems)){return true;}return false;}},onSet:function(item,_6a1,_6a2,_6a3){},onNew:function(_6a4,_6a5){},onDelete:function(_6a6){},close:function(_6a7){if(this.clearOnClose){if(!this.isDirty()){this.inherited(arguments);}else{throw new Error("dojo.data.ItemFileWriteStore: There are unsaved changes present in the store. Please save or revert the changes before invoking close.");}}}});}dojo.i18n._preloadLocalizations("dojo.nls.tt-rss-layer",["ROOT","ar","ca","cs","da","de","de-de","el","en","en-gb","en-us","es","es-es","fi","fi-fi","fr","fr-fr","he","he-il","hu","it","it-it","ja","ja-jp","ko","ko-kr","nb","nl","nl-nl","pl","pt","pt-br","pt-pt","ru","sk","sl","sv","th","tr","xx","zh","zh-cn","zh-tw"]);
+//>>built
+require({cache:{"dijit/form/TextBox":function(){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;});},"dijit/_base/scroll":function(){define("dijit/_base/scroll",["dojo/window",".."],function(_19,_1a){_1a.scrollIntoView=function(_1b,pos){_19.scrollIntoView(_1b,pos);};});},"dijit/_TemplatedMixin":function(){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(_1c,_1d,_1e,_1f,_20,_21,_22,_23,has,_24,win){var _25=_22("dijit._TemplatedMixin",null,{templateString:null,templatePath:null,_skipNodeCache:false,_earlyTemplatedStartup:false,constructor:function(){this._attachPoints=[];this._attachEvents=[];},_stringRepl:function(_26){var _27=this.declaredClass,_28=this;return _1f.substitute(_26,this,function(_29,key){if(key.charAt(0)=="!"){_29=_1c.getObject(key.substr(1),false,_28);}if(typeof _29=="undefined"){throw new Error(_27+" template:"+key);}if(_29==null){return "";}return key.charAt(0)=="!"?_29:_29.toString().replace(/"/g,"&quot;");},this);},buildRendering:function(){if(!this.templateString){this.templateString=_20(this.templatePath,{sanitize:true});}var _2a=_25.getCachedTemplate(this.templateString,this._skipNodeCache);var _2b;if(_1c.isString(_2a)){_2b=_23.toDom(this._stringRepl(_2a));if(_2b.nodeType!=1){throw new Error("Invalid template: "+_2a);}}else{_2b=_2a.cloneNode(true);}this.domNode=_2b;this.inherited(arguments);this._attachTemplateNodes(_2b,function(n,p){return n.getAttribute(p);});this._beforeFillContent();this._fillContent(this.srcNodeRef);},_beforeFillContent:function(){},_fillContent:function(_2c){var _2d=this.containerNode;if(_2c&&_2d){while(_2c.hasChildNodes()){_2d.appendChild(_2c.firstChild);}}},_attachTemplateNodes:function(_2e,_2f){var _30=_1c.isArray(_2e)?_2e:(_2e.all||_2e.getElementsByTagName("*"));var x=_1c.isArray(_2e)?0:-1;for(;x<_30.length;x++){var _31=(x==-1)?_2e:_30[x];if(this.widgetsInTemplate&&(_2f(_31,"dojoType")||_2f(_31,"data-dojo-type"))){continue;}var _32=_2f(_31,"dojoAttachPoint")||_2f(_31,"data-dojo-attach-point");if(_32){var _33,_34=_32.split(/\s*,\s*/);while((_33=_34.shift())){if(_1c.isArray(this[_33])){this[_33].push(_31);}else{this[_33]=_31;}this._attachPoints.push(_33);}}var _35=_2f(_31,"dojoAttachEvent")||_2f(_31,"data-dojo-attach-event");if(_35){var _36,_37=_35.split(/\s*,\s*/);var _38=_1c.trim;while((_36=_37.shift())){if(_36){var _39=null;if(_36.indexOf(":")!=-1){var _3a=_36.split(":");_36=_38(_3a[0]);_39=_38(_3a[1]);}else{_36=_38(_36);}if(!_39){_39=_36;}this._attachEvents.push(this.connect(_31,_1d[_36]||_36,_39));}}}}},destroyRendering:function(){_21.forEach(this._attachPoints,function(_3b){delete this[_3b];},this);this._attachPoints=[];_21.forEach(this._attachEvents,this.disconnect,this);this._attachEvents=[];this.inherited(arguments);}});_25._templateCache={};_25.getCachedTemplate=function(_3c,_3d){var _3e=_25._templateCache;var key=_3c;var _3f=_3e[key];if(_3f){try{if(!_3f.ownerDocument||_3f.ownerDocument==win.doc){return _3f;}}catch(e){}_23.destroy(_3f);}_3c=_1f.trim(_3c);if(_3d||_3c.match(/\$\{([^\}]+)\}/g)){return (_3e[key]=_3c);}else{var _40=_23.toDom(_3c);if(_40.nodeType!=1){throw new Error("Invalid template: "+_3c);}return (_3e[key]=_40);}};if(has("ie")){_24.addOnWindowUnload(function(){var _41=_25._templateCache;for(var key in _41){var _42=_41[key];if(typeof _42=="object"){_23.destroy(_42);}delete _41[key];}});}_1c.extend(_1e,{dojoAttachEvent:"",dojoAttachPoint:""});return _25;});},"dijit/_CssStateMixin":function(){define("dijit/_CssStateMixin",["dojo/touch","dojo/_base/array","dojo/_base/declare","dojo/dom-class","dojo/_base/lang","dojo/_base/window"],function(_43,_44,_45,_46,_47,win){return _45("dijit._CssStateMixin",[],{cssStateNodes:{},hovering:false,active:false,_applyAttributes:function(){this.inherited(arguments);_44.forEach(["onmouseenter","onmouseleave",_43.press],function(e){this.connect(this.domNode,e,"_cssMouseEvent");},this);_44.forEach(["disabled","readOnly","checked","selected","focused","state","hovering","active"],function(_48){this.watch(_48,_47.hitch(this,"_setStateClass"));},this);for(var ap in this.cssStateNodes){this._trackMouseState(this[ap],this.cssStateNodes[ap]);}this._setStateClass();},_cssMouseEvent:function(_49){if(!this.disabled){switch(_49.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 _4a=this.connect(win.body(),_43.release,function(){this._mouseDown=false;this._set("active",false);this.disconnect(_4a);});break;}}},_setStateClass:function(){var _4b=this.baseClass.split(" ");function _4c(_4d){_4b=_4b.concat(_44.map(_4b,function(c){return c+_4d;}),"dijit"+_4d);};if(!this.isLeftToRight()){_4c("Rtl");}var _4e=this.checked=="mixed"?"Mixed":(this.checked?"Checked":"");if(this.checked){_4c(_4e);}if(this.state){_4c(this.state);}if(this.selected){_4c("Selected");}if(this.disabled){_4c("Disabled");}else{if(this.readOnly){_4c("ReadOnly");}else{if(this.active){_4c("Active");}else{if(this.hovering){_4c("Hover");}}}}if(this.focused){_4c("Focused");}var tn=this.stateNode||this.domNode,_4f={};_44.forEach(tn.className.split(" "),function(c){_4f[c]=true;});if("_stateClasses" in this){_44.forEach(this._stateClasses,function(c){delete _4f[c];});}_44.forEach(_4b,function(c){_4f[c]=true;});var _50=[];for(var c in _4f){_50.push(c);}tn.className=_50.join(" ");this._stateClasses=_4b;},_trackMouseState:function(_51,_52){var _53=false,_54=false,_55=false;var _56=this,cn=_47.hitch(this,"connect",_51);function _57(){var _58=("disabled" in _56&&_56.disabled)||("readonly" in _56&&_56.readonly);_46.toggle(_51,_52+"Hover",_53&&!_54&&!_58);_46.toggle(_51,_52+"Active",_54&&!_58);_46.toggle(_51,_52+"Focused",_55&&!_58);};cn("onmouseenter",function(){_53=true;_57();});cn("onmouseleave",function(){_53=false;_54=false;_57();});cn(_43.press,function(){_54=true;_57();});cn(_43.release,function(){_54=false;_57();});cn("onfocus",function(){_55=true;_57();});cn("onblur",function(){_55=false;_57();});this.watch("disabled",_57);this.watch("readOnly",_57);}});});},"dijit/DialogUnderlay":function(){define("dijit/DialogUnderlay",["dojo/_base/declare","dojo/dom-attr","dojo/_base/window","dojo/window","./_Widget","./_TemplatedMixin","./BackgroundIframe"],function(_59,_5a,win,_5b,_5c,_5d,_5e){return _59("dijit.DialogUnderlay",[_5c,_5d],{templateString:"<div class='dijitDialogUnderlayWrapper'><div class='dijitDialogUnderlay' data-dojo-attach-point='node'></div></div>",dialogId:"","class":"",_setDialogIdAttr:function(id){_5a.set(this.node,"id",id+"_underlay");this._set("dialogId",id);},_setClassAttr:function(_5f){this.node.className="dijitDialogUnderlay "+_5f;this._set("class",_5f);},postCreate:function(){win.body().appendChild(this.domNode);},layout:function(){var is=this.node.style,os=this.domNode.style;os.display="none";var _60=_5b.getBox();os.top=_60.t+"px";os.left=_60.l+"px";is.width=_60.w+"px";is.height=_60.h+"px";os.display="block";},show:function(){this.domNode.style.display="block";this.layout();this.bgIframe=new _5e(this.domNode);},hide:function(){this.bgIframe.destroy();delete this.bgIframe;this.domNode.style.display="none";}});});},"dijit/layout/ScrollingTabController":function(){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(_61,_62,_63,_64,_65,fx,_66,_67,has,_68,_69,_6a,_6b,_6c,_6d,_6e,_6f,_70,_71){var _72=_62("dijit.layout.ScrollingTabController",[_6b,_6d],{baseClass:"dijitTabController dijitScrollingTabController",templateString:_69,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";_63.add(n,"tabStrip-disabled");}_63.add(this.tablistWrapper,this.tabStripClass);},onStartup:function(){this.inherited(arguments);_65.set(this.domNode,"visibility","");this._postStartup=true;},onAddChild:function(_73,_74){this.inherited(arguments);_61.forEach(["label","iconClass"],function(_75){this.pane2watches[_73.id].push(this.pane2button[_73.id].watch(_75,_66.hitch(this,function(){if(this._postStartup&&this._dim){this.resize(this._dim);}})));},this);_65.set(this.containerNode,"width",(_65.get(this.containerNode,"width")+200)+"px");},onRemoveChild:function(_76,_77){var _78=this.pane2button[_76.id];if(this._selectedTab===_78.domNode){this._selectedTab=null;}this.inherited(arguments);},_initButtons:function(){this._btnWidth=0;this._buttons=_67("> .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+=_64.getMarginSize(btn).w;return true;}else{_65.set(btn,"display","none");return false;}},this);},_getTabsWidth:function(){var _79=this.getChildren();if(_79.length){var _7a=_79[this.isLeftToRight()?0:_79.length-1].domNode,_7b=_79[this.isLeftToRight()?_79.length-1:0].domNode;return _7b.offsetLeft+_65.get(_7b,"width")-_7a.offsetLeft;}else{return 0;}},_enableBtn:function(_7c){var _7d=this._getTabsWidth();_7c=_7c||_65.get(this.scrollNode,"width");return _7d>0&&_7c<_7d;},resize:function(dim){this._dim=dim;this.scrollNode.style.height="auto";var cb=this._contentBox=_6c.marginBox2contentBox(this.domNode,{h:0,w:dim.w});cb.h=this.scrollNode.offsetHeight;_64.setContentSize(this.domNode,cb);var _7e=this._enableBtn(this._contentBox.w);this._buttons.style("display",_7e?"":"none");this._leftBtn.layoutAlign="left";this._rightBtn.layoutAlign="right";this._menuBtn.layoutAlign=this.isLeftToRight()?"right":"left";_6c.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()||has("ie")<8||(has("ie")&&has("quirks"))||has("webkit"))?this.scrollNode.scrollLeft:_65.get(this.containerNode,"width")-_65.get(this.scrollNode,"width")+(has("ie")==8?-1:1)*this.scrollNode.scrollLeft;},_convertToScrollLeft:function(val){if(this.isLeftToRight()||has("ie")<8||(has("ie")&&has("quirks"))||has("webkit")){return val;}else{var _7f=_65.get(this.containerNode,"width")-_65.get(this.scrollNode,"width");return (has("ie")==8?-1:1)*(val-_7f);}},onSelectChild:function(_80){var tab=this.pane2button[_80.id];if(!tab||!_80){return;}var _81=tab.domNode;if(_81!=this._selectedTab){this._selectedTab=_81;if(this._postResize){var sl=this._getScroll();if(sl>_81.offsetLeft||sl+_65.get(this.scrollNode,"width")<_81.offsetLeft+_65.get(_81,"width")){this.createSmoothScroll().play();}}}this.inherited(arguments);},_getScrollBounds:function(){var _82=this.getChildren(),_83=_65.get(this.scrollNode,"width"),_84=_65.get(this.containerNode,"width"),_85=_84-_83,_86=this._getTabsWidth();if(_82.length&&_86>_83){return {min:this.isLeftToRight()?0:_82[_82.length-1].domNode.offsetLeft,max:this.isLeftToRight()?(_82[_82.length-1].domNode.offsetLeft+_65.get(_82[_82.length-1].domNode,"width"))-_83:_85};}else{var _87=this.isLeftToRight()?0:_85;return {min:_87,max:_87};}},_getScrollForSelectedTab:function(){var w=this.scrollNode,n=this._selectedTab,_88=_65.get(this.scrollNode,"width"),_89=this._getScrollBounds();var pos=(n.offsetLeft+_65.get(n,"width")/2)-_88/2;pos=Math.min(Math.max(pos,_89.min),_89.max);return pos;},createSmoothScroll:function(x){if(arguments.length>0){var _8a=this._getScrollBounds();x=Math.min(Math.max(x,_8a.min),_8a.max);}else{x=this._getScrollForSelectedTab();}if(this._anim&&this._anim.status()=="playing"){this._anim.stop();}var _8b=this,w=this.scrollNode,_8c=new fx.Animation({beforeBegin:function(){if(this.curve){delete this.curve;}var _8d=w.scrollLeft,_8e=_8b._convertToScrollLeft(x);_8c.curve=new fx._Line(_8d,_8e);},onAnimate:function(val){w.scrollLeft=val;}});this._anim=_8c;this._setButtonClass(x);return _8c;},_getBtnNode:function(e){var n=e.target;while(n&&!_63.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(_8f,_90){if(_90&&_63.contains(_90,"dijitTabDisabled")){return;}var _91=_65.get(this.scrollNode,"width");var d=(_91*0.75)*_8f;var to=this._getScroll()+d;this._setButtonClass(to);this.createSmoothScroll(to).play();},_setButtonClass:function(_92){var _93=this._getScrollBounds();this._leftBtn.set("disabled",_92<=_93.min);this._rightBtn.set("disabled",_92>=_93.max);}});var _94=_62("dijit.layout._ScrollingTabControllerButtonMixin",null,{baseClass:"dijitTab tabStripButton",templateString:_6a,tabIndex:"",isFocusable:function(){return false;}});_62("dijit.layout._ScrollingTabControllerButton",[_70,_94]);_62("dijit.layout._ScrollingTabControllerMenuButton",[_70,_71,_94],{containerId:"",tabIndex:"-1",isLoaded:function(){return false;},loadDropDown:function(_95){this.dropDown=new _6e({id:this.containerId+"_menu",dir:this.dir,lang:this.lang,textDir:this.textDir});var _96=_68.byId(this.containerId);_61.forEach(_96.getChildren(),function(_97){var _98=new _6f({id:_97.id+"_stcMi",label:_97.title,iconClass:_97.iconClass,dir:_97.dir,lang:_97.lang,textDir:_97.textDir,onClick:function(){_96.selectChild(_97);}});this.dropDown.addChild(_98);},this);_95();},closeDropDown:function(_99){this.inherited(arguments);if(this.dropDown){this.dropDown.destroyRecursive();delete this.dropDown;}}});return _72;});},"dijit/place":function(){define("dijit/place",["dojo/_base/array","dojo/dom-geometry","dojo/dom-style","dojo/_base/kernel","dojo/_base/window","dojo/window","."],function(_9a,_9b,_9c,_9d,win,_9e,_9f){function _a0(_a1,_a2,_a3,_a4){var _a5=_9e.getBox();if(!_a1.parentNode||String(_a1.parentNode.tagName).toLowerCase()!="body"){win.body().appendChild(_a1);}var _a6=null;_9a.some(_a2,function(_a7){var _a8=_a7.corner;var pos=_a7.pos;var _a9=0;var _aa={w:{"L":_a5.l+_a5.w-pos.x,"R":pos.x-_a5.l,"M":_a5.w}[_a8.charAt(1)],h:{"T":_a5.t+_a5.h-pos.y,"B":pos.y-_a5.t,"M":_a5.h}[_a8.charAt(0)]};if(_a3){var res=_a3(_a1,_a7.aroundCorner,_a8,_aa,_a4);_a9=typeof res=="undefined"?0:res;}var _ab=_a1.style;var _ac=_ab.display;var _ad=_ab.visibility;if(_ab.display=="none"){_ab.visibility="hidden";_ab.display="";}var mb=_9b.getMarginBox(_a1);_ab.display=_ac;_ab.visibility=_ad;var _ae={"L":pos.x,"R":pos.x-mb.w,"M":Math.max(_a5.l,Math.min(_a5.l+_a5.w,pos.x+(mb.w>>1))-mb.w)}[_a8.charAt(1)],_af={"T":pos.y,"B":pos.y-mb.h,"M":Math.max(_a5.t,Math.min(_a5.t+_a5.h,pos.y+(mb.h>>1))-mb.h)}[_a8.charAt(0)],_b0=Math.max(_a5.l,_ae),_b1=Math.max(_a5.t,_af),_b2=Math.min(_a5.l+_a5.w,_ae+mb.w),_b3=Math.min(_a5.t+_a5.h,_af+mb.h),_b4=_b2-_b0,_b5=_b3-_b1;_a9+=(mb.w-_b4)+(mb.h-_b5);if(_a6==null||_a9<_a6.overflow){_a6={corner:_a8,aroundCorner:_a7.aroundCorner,x:_b0,y:_b1,w:_b4,h:_b5,overflow:_a9,spaceAvailable:_aa};}return !_a9;});if(_a6.overflow&&_a3){_a3(_a1,_a6.aroundCorner,_a6.corner,_a6.spaceAvailable,_a4);}var l=_9b.isBodyLtr(),s=_a1.style;s.top=_a6.y+"px";s[l?"left":"right"]=(l?_a6.x:_a5.w-_a6.x-_a6.w)+"px";s[l?"right":"left"]="auto";return _a6;};return (_9f.place={at:function(_b6,pos,_b7,_b8){var _b9=_9a.map(_b7,function(_ba){var c={corner:_ba,pos:{x:pos.x,y:pos.y}};if(_b8){c.pos.x+=_ba.charAt(1)=="L"?_b8.x:-_b8.x;c.pos.y+=_ba.charAt(0)=="T"?_b8.y:-_b8.y;}return c;});return _a0(_b6,_b9);},around:function(_bb,_bc,_bd,_be,_bf){var _c0=(typeof _bc=="string"||"offsetWidth" in _bc)?_9b.position(_bc,true):_bc;if(_bc.parentNode){var _c1=_bc.parentNode;while(_c1&&_c1.nodeType==1&&_c1.nodeName!="BODY"){var _c2=_9b.position(_c1,true);var _c3=_9c.getComputedStyle(_c1).overflow;if(_c3=="hidden"||_c3=="auto"||_c3=="scroll"){var _c4=Math.min(_c0.y+_c0.h,_c2.y+_c2.h);var _c5=Math.min(_c0.x+_c0.w,_c2.x+_c2.w);_c0.x=Math.max(_c0.x,_c2.x);_c0.y=Math.max(_c0.y,_c2.y);_c0.h=_c4-_c0.y;_c0.w=_c5-_c0.x;}_c1=_c1.parentNode;}}var x=_c0.x,y=_c0.y,_c6="w" in _c0?_c0.w:(_c0.w=_c0.width),_c7="h" in _c0?_c0.h:(_9d.deprecated("place.around: dijit.place.__Rectangle: { x:"+x+", y:"+y+", height:"+_c0.height+", width:"+_c6+" } has been deprecated. Please use { x:"+x+", y:"+y+", h:"+_c0.height+", w:"+_c6+" }","","2.0"),_c0.h=_c0.height);var _c8=[];function _c9(_ca,_cb){_c8.push({aroundCorner:_ca,corner:_cb,pos:{x:{"L":x,"R":x+_c6,"M":x+(_c6>>1)}[_ca.charAt(1)],y:{"T":y,"B":y+_c7,"M":y+(_c7>>1)}[_ca.charAt(0)]}});};_9a.forEach(_bd,function(pos){var ltr=_be;switch(pos){case "above-centered":_c9("TM","BM");break;case "below-centered":_c9("BM","TM");break;case "after-centered":ltr=!ltr;case "before-centered":_c9(ltr?"ML":"MR",ltr?"MR":"ML");break;case "after":ltr=!ltr;case "before":_c9(ltr?"TL":"TR",ltr?"TR":"TL");_c9(ltr?"BL":"BR",ltr?"BR":"BL");break;case "below-alt":ltr=!ltr;case "below":_c9(ltr?"BL":"BR",ltr?"TL":"TR");_c9(ltr?"BR":"BL",ltr?"TR":"TL");break;case "above-alt":ltr=!ltr;case "above":_c9(ltr?"TL":"TR",ltr?"BL":"BR");_c9(ltr?"TR":"TL",ltr?"BR":"BL");break;default:_c9(pos.aroundCorner,pos.corner);}});var _cc=_a0(_bb,_c8,_bf,{w:_c6,h:_c7});_cc.aroundNodePos=_c0;return _cc;}});});},"dijit/_HasDropDown":function(){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(_cd,_ce,_cf,dom,_d0,_d1,_d2,_d3,has,_d4,_d5,_d6,win,_d7,_d8,_d9,_da,_db){return _cd("dijit._HasDropDown",_db,{_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(win.doc,_d6.release,"_onDropDownMouseUp");this.toggleDropDown();},_onDropDownMouseUp:function(e){if(e&&this._docHandler){this.disconnect(this._docHandler);}var _dc=this.dropDown,_dd=false;if(e&&this._opened){var c=_d2.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&&!_dd){if(_d1.contains(t,"dijitPopup")){_dd=true;}else{t=t.parentNode;}}if(_dd){t=e.target;if(_dc.onItemClick){var _de;while(t&&!(_de=_d8.byNode(t))){t=t.parentNode;}if(_de&&_de.onClick&&_de.getParent){_de.getParent().onItemClick(_de,e);}}return;}}}if(this._opened){if(_dc.focus&&_dc.autoFocus!==false){window.setTimeout(_d5.hitch(_dc,"focus"),1);}}else{setTimeout(_d5.hitch(this,"focus"),0);}if(has("ios")){this._justGotMouseUp=true;setTimeout(_d5.hitch(this,function(){this._justGotMouseUp=false;}),0);}},_onDropDownClick:function(e){if(has("ios")&&!this._justGotMouseUp){this._onDropDownMouseDown(e);this._onDropDownMouseUp(e);}if(this._stopClickEvents){_cf.stop(e);}},buildRendering:function(){this.inherited(arguments);this._buttonNode=this._buttonNode||this.focusNode||this.domNode;this._popupStateNode=this._popupStateNode||this.focusNode||this._buttonNode;var _df={"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";_d1.add(this._arrowWrapperNode||this._buttonNode,"dijit"+_df+"ArrowButton");},postCreate:function(){this.inherited(arguments);this.connect(this._buttonNode,_d6.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,_e0=e.target;if(d&&this._opened&&d.handleKey){if(d.handleKey(e)===false){_cf.stop(e);return;}}if(d&&this._opened&&e.charOrCode==_d4.ESCAPE){this.closeDropDown();_cf.stop(e);}else{if(!this._opened&&(e.charOrCode==_d4.DOWN_ARROW||((e.charOrCode==_d4.ENTER||e.charOrCode==" ")&&((_e0.tagName||"").toLowerCase()!=="input"||(_e0.type&&_e0.type.toLowerCase()!=="text"))))){this._toggleOnKeyUp=true;_cf.stop(e);}}},_onKeyUp:function(){if(this._toggleOnKeyUp){delete this._toggleOnKeyUp;this.toggleDropDown();var d=this.dropDown;if(d&&d.focus){setTimeout(_d5.hitch(d,"focus"),1);}}},_onBlur:function(){var _e1=_d9.curNode&&this.dropDown&&dom.isDescendant(_d9.curNode,this.dropDown.domNode);this.closeDropDown(_e1);this.inherited(arguments);},isLoaded:function(){return true;},loadDropDown:function(_e2){_e2();},loadAndOpenDropDown:function(){var d=new _ce(),_e3=_d5.hitch(this,function(){this.openDropDown();d.resolve(this.dropDown);});if(!this.isLoaded()){this.loadDropDown(_e3);}else{_e3();}return d;},toggleDropDown:function(){if(this.disabled||this.readOnly){return;}if(!this._opened){this.loadAndOpenDropDown();}else{this.closeDropDown();}},openDropDown:function(){var _e4=this.dropDown,_e5=_e4.domNode,_e6=this._aroundNode||this.domNode,_e7=this;if(!this._preparedNode){this._preparedNode=true;if(_e5.style.width){this._explicitDDWidth=true;}if(_e5.style.height){this._explicitDDHeight=true;}}if(this.maxHeight||this.forceWidth||this.autoWidth){var _e8={display:"",visibility:"hidden"};if(!this._explicitDDWidth){_e8.width="";}if(!this._explicitDDHeight){_e8.height="";}_d3.set(_e5,_e8);var _e9=this.maxHeight;if(_e9==-1){var _ea=_d7.getBox(),_eb=_d2.position(_e6,false);_e9=Math.floor(Math.max(_eb.y,_ea.h-(_eb.y+_eb.h)));}_da.moveOffScreen(_e4);if(_e4.startup&&!_e4._started){_e4.startup();}var mb=_d2.getMarginSize(_e5);var _ec=(_e9&&mb.h>_e9);_d3.set(_e5,{overflowX:"hidden",overflowY:_ec?"auto":"hidden"});if(_ec){mb.h=_e9;if("w" in mb){mb.w+=16;}}else{delete mb.h;}if(this.forceWidth){mb.w=_e6.offsetWidth;}else{if(this.autoWidth){mb.w=Math.max(mb.w,_e6.offsetWidth);}else{delete mb.w;}}if(_d5.isFunction(_e4.resize)){_e4.resize(mb);}else{_d2.setMarginBox(_e5,mb);}}var _ed=_da.open({parent:this,popup:_e4,around:_e6,orient:this.dropDownPosition,onExecute:function(){_e7.closeDropDown(true);},onCancel:function(){_e7.closeDropDown(true);},onClose:function(){_d0.set(_e7._popupStateNode,"popupActive",false);_d1.remove(_e7._popupStateNode,"dijitHasDropDownOpen");_e7._opened=false;}});_d0.set(this._popupStateNode,"popupActive","true");_d1.add(_e7._popupStateNode,"dijitHasDropDownOpen");this._opened=true;return _ed;},closeDropDown:function(_ee){if(this._opened){if(_ee){this.focus();}_da.close(this.dropDown);this._opened=false;}}});});},"dijit/tree/TreeStoreModel":function(){define("dijit/tree/TreeStoreModel",["dojo/_base/array","dojo/aspect","dojo/_base/declare","dojo/_base/json","dojo/_base/lang"],function(_ef,_f0,_f1,_f2,_f3){return _f1("dijit.tree.TreeStoreModel",null,{store:null,childrenAttrs:["children"],newItemIdAttr:"id",labelAttr:"",root:null,query:null,deferItemLoadingUntilExpand:false,constructor:function(_f4){_f3.mixin(this,_f4);this.connects=[];var _f5=this.store;if(!_f5.getFeatures()["dojo.data.api.Identity"]){throw new Error("dijit.Tree: store must support dojo.data.Identity");}if(_f5.getFeatures()["dojo.data.api.Notification"]){this.connects=this.connects.concat([_f0.after(_f5,"onNew",_f3.hitch(this,"onNewItem"),true),_f0.after(_f5,"onDelete",_f3.hitch(this,"onDeleteItem"),true),_f0.after(_f5,"onSet",_f3.hitch(this,"onSetItem"),true)]);}},destroy:function(){var h;while(h=this.connects.pop()){h.remove();}},getRoot:function(_f6,_f7){if(this.root){_f6(this.root);}else{this.store.fetch({query:this.query,onComplete:_f3.hitch(this,function(_f8){if(_f8.length!=1){throw new Error(this.declaredClass+": query "+_f2.stringify(this.query)+" returned "+_f8.length+" items, but must return exactly one item");}this.root=_f8[0];_f6(this.root);}),onError:_f7});}},mayHaveChildren:function(_f9){return _ef.some(this.childrenAttrs,function(_fa){return this.store.hasAttribute(_f9,_fa);},this);},getChildren:function(_fb,_fc,_fd){var _fe=this.store;if(!_fe.isItemLoaded(_fb)){var _ff=_f3.hitch(this,arguments.callee);_fe.loadItem({item:_fb,onItem:function(_100){_ff(_100,_fc,_fd);},onError:_fd});return;}var _101=[];for(var i=0;i<this.childrenAttrs.length;i++){var vals=_fe.getValues(_fb,this.childrenAttrs[i]);_101=_101.concat(vals);}var _102=0;if(!this.deferItemLoadingUntilExpand){_ef.forEach(_101,function(item){if(!_fe.isItemLoaded(item)){_102++;}});}if(_102==0){_fc(_101);}else{_ef.forEach(_101,function(item,idx){if(!_fe.isItemLoaded(item)){_fe.loadItem({item:item,onItem:function(item){_101[idx]=item;if(--_102==0){_fc(_101);}},onError:_fd});}});}},isItem:function(_103){return this.store.isItem(_103);},fetchItemByIdentity:function(_104){this.store.fetchItemByIdentity(_104);},getIdentity:function(item){return this.store.getIdentity(item);},getLabel:function(item){if(this.labelAttr){return this.store.getValue(item,this.labelAttr);}else{return this.store.getLabel(item);}},newItem:function(args,_105,_106){var _107={parent:_105,attribute:this.childrenAttrs[0]},_108;if(this.newItemIdAttr&&args[this.newItemIdAttr]){this.fetchItemByIdentity({identity:args[this.newItemIdAttr],scope:this,onItem:function(item){if(item){this.pasteItem(item,null,_105,true,_106);}else{_108=this.store.newItem(args,_107);if(_108&&(_106!=undefined)){this.pasteItem(_108,_105,_105,false,_106);}}}});}else{_108=this.store.newItem(args,_107);if(_108&&(_106!=undefined)){this.pasteItem(_108,_105,_105,false,_106);}}},pasteItem:function(_109,_10a,_10b,_10c,_10d){var _10e=this.store,_10f=this.childrenAttrs[0];if(_10a){_ef.forEach(this.childrenAttrs,function(attr){if(_10e.containsValue(_10a,attr,_109)){if(!_10c){var _110=_ef.filter(_10e.getValues(_10a,attr),function(x){return x!=_109;});_10e.setValues(_10a,attr,_110);}_10f=attr;}});}if(_10b){if(typeof _10d=="number"){var _111=_10e.getValues(_10b,_10f).slice();_111.splice(_10d,0,_109);_10e.setValues(_10b,_10f,_111);}else{_10e.setValues(_10b,_10f,_10e.getValues(_10b,_10f).concat(_109));}}},onChange:function(){},onChildrenChange:function(){},onDelete:function(){},onNewItem:function(item,_112){if(!_112){return;}this.getChildren(_112.item,_f3.hitch(this,function(_113){this.onChildrenChange(_112.item,_113);}));},onDeleteItem:function(item){this.onDelete(item);},onSetItem:function(item,_114){if(_ef.indexOf(this.childrenAttrs,_114)!=-1){this.getChildren(item,_f3.hitch(this,function(_115){this.onChildrenChange(item,_115);}));}else{this.onChange(item);}}});});},"dijit/_MenuBase":function(){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,_116,_117,_118,_119,_11a,dom,_11b,_11c,lang,_11d){return _11a("dijit._MenuBase",[_117,_119,_118],{parentMenu:null,popupDelay:500,onExecute:function(){},onCancel:function(){},_moveToPopup:function(evt){if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){this.focusedChild._onClick(evt);}else{var _11e=this._getTopMenu();if(_11e&&_11e._isMenuBar){_11e.focusNext();}}},_onPopupHover:function(){if(this.currentPopup&&this.currentPopup._pendingClose_timer){var _11f=this.currentPopup.parentMenu;if(_11f.focusedChild){_11f.focusedChild._setSelected(false);}_11f.focusedChild=this.currentPopup.from_item;_11f.focusedChild._setSelected(true);this._stopPendingCloseTimer(this.currentPopup);}},onItemHover:function(item){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(this.focusedChild){this.focusChild(item);}this._hoveredChild=item;},_onChildBlur:function(item){this._stopPopupTimer();item._setSelected(false);var _120=item.popup;if(_120){this._stopPendingCloseTimer(_120);_120._pendingClose_timer=setTimeout(function(){_120._pendingClose_timer=null;if(_120.parentMenu){_120.parentMenu.currentPopup=null;}pm.close(_120);},this.popupDelay);}},onItemUnhover:function(item){if(this.isActive){this._stopPopupTimer();}if(this._hoveredChild==item){this._hoveredChild=null;}},_stopPopupTimer:function(){if(this.hover_timer){clearTimeout(this.hover_timer);this.hover_timer=null;}},_stopPendingCloseTimer:function(_121){if(_121._pendingClose_timer){clearTimeout(_121._pendingClose_timer);_121._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(item,evt){if(typeof this.isShowingNow=="undefined"){this._markActive();}this.focusChild(item);if(item.disabled){return false;}if(item.popup){this._openPopup();}else{this.onExecute();item.onClick(evt);}},_openPopup:function(){this._stopPopupTimer();var _122=this.focusedChild;if(!_122){return;}var _123=_122.popup;if(_123.isShowingNow){return;}if(this.currentPopup){this._stopPendingCloseTimer(this.currentPopup);pm.close(this.currentPopup);}_123.parentMenu=this;_123.from_item=_122;var self=this;pm.open({parent:this,popup:_123,around:_122.domNode,orient:this._orient||["after","before"],onCancel:function(){self.focusChild(_122);self._cleanUp();_122._setSelected(true);self.focusedChild=_122;},onExecute:lang.hitch(this,"_cleanUp")});this.currentPopup=_123;_123.connect(_123.domNode,"onmouseenter",lang.hitch(self,"_onPopupHover"));if(_123.focus){_123._focus_timer=setTimeout(lang.hitch(_123,function(){this._focus_timer=null;this.focus();}),0);}},_markActive:function(){this.isActive=true;_11c.replace(this.domNode,"dijitMenuActive","dijitMenuPassive");},onOpen:function(){this.isShowingNow=true;this._markActive();},_markInactive:function(){this.isActive=false;_11c.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(_11d.indexOf(this._focusManager.activeStack,this.id)>=0){_11b.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(item){if(this._hoveredChild&&this._hoveredChild!=item){this._hoveredChild._onUnhover();}},_onBlur:function(){this._cleanUp();this.inherited(arguments);},_cleanUp:function(){this._closeChild();if(typeof this.isShowingNow=="undefined"){this._markInactive();}}});});},"dijit/focus":function(){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(_124,_125,dom,_126,_127,_128,lang,on,_129,has,_12a,_12b,win,_12c,a11y,_12d,_12e){var _12f=_125([_12a,_128],{curNode:null,activeStack:[],constructor:function(){var _130=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);}});_124.before(_127,"empty",_130);_124.before(_127,"destroy",_130);},registerIframe:function(_131){return this.registerWin(_131.contentWindow,_131);},registerWin:function(_132,_133){var _134=this;var _135=function(evt){_134._justMouseDowned=true;setTimeout(function(){_134._justMouseDowned=false;},0);if(has("ie")&&evt&&evt.srcElement&&evt.srcElement.parentNode==null){return;}_134._onTouchNode(_133||evt.target||evt.srcElement,"mouse");};var doc=has("ie")?_132.document.documentElement:_132.document;if(doc){if(has("ie")){_132.document.body.attachEvent("onmousedown",_135);var _136=function(evt){var tag=evt.srcElement.tagName.toLowerCase();if(tag=="#document"||tag=="body"){return;}if(a11y.isTabNavigable(evt.srcElement)){_134._onFocusNode(_133||evt.srcElement);}else{_134._onTouchNode(_133||evt.srcElement);}};doc.attachEvent("onactivate",_136);var _137=function(evt){_134._onBlurNode(_133||evt.srcElement);};doc.attachEvent("ondeactivate",_137);return {remove:function(){_132.document.detachEvent("onmousedown",_135);doc.detachEvent("onactivate",_136);doc.detachEvent("ondeactivate",_137);doc=null;}};}else{doc.body.addEventListener("mousedown",_135,true);doc.body.addEventListener("touchstart",_135,true);var _138=function(evt){_134._onFocusNode(_133||evt.target);};doc.addEventListener("focus",_138,true);var _139=function(evt){_134._onBlurNode(_133||evt.target);};doc.addEventListener("blur",_139,true);return {remove:function(){doc.body.removeEventListener("mousedown",_135,true);doc.body.removeEventListener("touchstart",_135,true);doc.removeEventListener("focus",_138,true);doc.removeEventListener("blur",_139,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(lang.hitch(this,function(){delete this._clearActiveWidgetsTimer;this._setStack([]);this.prevNode=null;}),100);},_onTouchNode:function(node,by){if(this._clearActiveWidgetsTimer){clearTimeout(this._clearActiveWidgetsTimer);delete this._clearActiveWidgetsTimer;}var _13a=[];try{while(node){var _13b=_126.get(node,"dijitPopupParent");if(_13b){node=_12d.byId(_13b).domNode;}else{if(node.tagName&&node.tagName.toLowerCase()=="body"){if(node===win.body()){break;}node=_12c.get(node.ownerDocument).frameElement;}else{var id=node.getAttribute&&node.getAttribute("widgetId"),_13c=id&&_12d.byId(id);if(_13c&&!(by=="mouse"&&_13c.get("disabled"))){_13a.unshift(id);}node=node.parentNode;}}}}catch(e){}this._setStack(_13a,by);},_onFocusNode:function(node){if(!node){return;}if(node.nodeType==9){return;}this._onTouchNode(node);if(node==this.curNode){return;}this.set("curNode",node);},_setStack:function(_13d,by){var _13e=this.activeStack;this.set("activeStack",_13d);for(var _13f=0;_13f<Math.min(_13e.length,_13d.length);_13f++){if(_13e[_13f]!=_13d[_13f]){break;}}var _140;for(var i=_13e.length-1;i>=_13f;i--){_140=_12d.byId(_13e[i]);if(_140){_140._hasBeenBlurred=true;_140.set("focused",false);if(_140._focusManager==this){_140._onBlur(by);}this.emit("widget-blur",_140,by);}}for(i=_13f;i<_13d.length;i++){_140=_12d.byId(_13d[i]);if(_140){_140.set("focused",true);if(_140._focusManager==this){_140._onFocus(by);}this.emit("widget-focus",_140,by);}}},focus:function(node){if(node){try{node.focus();}catch(e){}}}});var _141=new _12f();_129(function(){var _142=_141.registerWin(win.doc.parentWindow||win.doc.defaultView);if(has("ie")){_12b.addOnWindowUnload(function(){_142.remove();_142=null;});}});_12e.focus=function(node){_141.focus(node);};for(var attr in _141){if(!/^_/.test(attr)){_12e.focus[attr]=typeof _141[attr]=="function"?lang.hitch(_141,attr):_141[attr];}}_141.watch(function(attr,_143,_144){_12e.focus[attr]=_144;});return _141;});},"dojo/i18n":function(){define("dojo/i18n",["./_base/kernel","require","./has","./_base/array","./_base/config","./_base/lang","./_base/xhr","./json"],function(dojo,_145,has,_146,_147,lang,xhr,json){has.add("dojo-preload-i18n-Api",1);true||has.add("dojo-v1x-i18n-Api",1);var _148=dojo.i18n={},_149=/(^.*(^|\/)nls)(\/|$)([^\/]*)\/?([^\/]*)/,_14a=function(root,_14b,_14c,_14d){for(var _14e=[_14c+_14d],_14f=_14b.split("-"),_150="",i=0;i<_14f.length;i++){_150+=(_150?"-":"")+_14f[i];if(!root||root[_150]){_14e.push(_14c+_150+"/"+_14d);}}return _14e;},_151={},_152=dojo.getL10nName=function(_153,_154,_155){_155=_155?_155.toLowerCase():dojo.locale;_153="dojo/i18n!"+_153.replace(/\./g,"/");_154=_154.replace(/\./g,"/");return (/root/i.test(_155))?(_153+"/nls/"+_154):(_153+"/nls/"+_155+"/"+_154);},_156=function(_157,_158,_159,_15a,_15b,load){_157([_158],function(root){var _15c=lang.clone(root.root),_15d=_14a(!root._v1x&&root,_15b,_159,_15a);_157(_15d,function(){for(var i=1;i<_15d.length;i++){_15c=lang.mixin(lang.clone(_15c),arguments[i]);}var _15e=_158+"/"+_15b;_151[_15e]=_15c;load();});});},_15f=function(id,_160){return /^\./.test(id)?_160(id):id;},_161=function(_162){var list=_147.extraLocale||[];list=lang.isArray(list)?list:[list];list.push(_162);return list;},load=function(id,_163,load){if(has("dojo-preload-i18n-Api")){var _164=id.split("*"),_165=_164[1]=="preload";if(_165){if(!_151[id]){_151[id]=1;_166(_164[2],json.parse(_164[3]),1);}load(1);}if(_165||_167(id,_163,load)){return;}}var _168=_149.exec(id),_169=_168[1]+"/",_16a=_168[5]||_168[4],_16b=_169+_16a,_16c=(_168[5]&&_168[4]),_16d=_16c||dojo.locale,_16e=_16b+"/"+_16d,_16f=_16c?[_16d]:_161(_16d),_170=_16f.length,_171=function(){if(!--_170){load(lang.delegate(_151[_16e]));}};_146.forEach(_16f,function(_172){var _173=_16b+"/"+_172;if(has("dojo-preload-i18n-Api")){_174(_173);}if(!_151[_173]){_156(_163,_16b,_169,_16a,_172,_171);}else{_171();}});};if(has("dojo-unit-tests")){var _175=_148.unitTests=[];}if(has("dojo-preload-i18n-Api")||1){var _176=_148.normalizeLocale=function(_177){var _178=_177?_177.toLowerCase():dojo.locale;return _178=="root"?"ROOT":_178;},isXd=function(mid){return (1&&1)?_145.isXdUrl(_145.toUrl(mid+".js")):true;},_179=0,_17a=[],_166=_148._preloadLocalizations=function(_17b,_17c,_17d){function _17e(_17f,func){var _180=_17f.split("-");while(_180.length){if(func(_180.join("-"))){return true;}_180.pop();}return func("ROOT");};function _181(_182){_182=_176(_182);_17e(_182,function(loc){if(_146.indexOf(_17c,loc)>=0){var mid=_17b.replace(/\./g,"/")+"_"+loc;_179++;(isXd(mid)||_17d?_145:_186)([mid],function(_183){for(var p in _183){_151[p+"/"+_182]=_183[p];}--_179;while(!_179&&_17a.length){load.apply(null,_17a.shift());}});return true;}return false;});};_181();_146.forEach(dojo.config.extraLocale,_181);},_167=function(id,_184,load){if(_179){_17a.push([id,_184,load]);}return _179;};}if(1){var _185=new Function("__bundle","__checkForLegacyModules","__mid","var define = function(){define.called = 1;},"+" require = function(){define.called = 1;};"+"try{"+"define.called = 0;"+"eval(__bundle);"+"if(define.called==1)"+"return 1;"+"if((__checkForLegacyModules = __checkForLegacyModules(__mid)))"+"return __checkForLegacyModules;"+"}catch(e){}"+"try{"+"return eval('('+__bundle+')');"+"}catch(e){"+"return e;"+"}"),_186=function(deps,_187){var _188=[];_146.forEach(deps,function(mid){var url=_145.toUrl(mid+".js");function load(text){var _189=_185(text,_174,mid);if(_189===1){_145([mid],function(_18a){_188.push(_151[url]=_18a);});}else{if(_189 instanceof Error){console.error("failed to evaluate i18n bundle; url="+url,_189);_189={};}_188.push(_151[url]=(/nls\/[^\/]+\/[^\/]+$/.test(url)?_189:{root:_189,_v1x:1}));}};if(_151[url]){_188.push(_151[url]);}else{var _18b=_145.syncLoadNls(mid);if(_18b){_188.push(_18b);}else{if(!xhr){try{_145.getText(url,true,load);}catch(e){_188.push(_151[url]={});}}else{xhr.get({url:url,sync:true,load:load,error:function(){_188.push(_151[url]={});}});}}}});_187&&_187.apply(null,_188);},_174=function(_18c){for(var _18d,_18e=_18c.split("/"),_18f=dojo.global[_18e[0]],i=1;_18f&&i<_18e.length-1;_18f=_18f[_18e[i++]]){}if(_18f){_18d=_18f[_18e[i]];if(!_18d){_18d=_18f[_18e[i].replace(/-/g,"_")];}if(_18d){_151[_18c]=_18d;}}return _18d;};_148.getLocalization=function(_190,_191,_192){var _193,_194=_152(_190,_191,_192).substring(10);load(_194,(!isXd(_194)?_186:_145),function(_195){_193=_195;});return _193;};if(has("dojo-unit-tests")){_175.push(function(doh){doh.register("tests.i18n.unit",function(t){var _196;_196=_185("{prop:1}");t.is({prop:1},_196);t.is(undefined,_196[1]);_196=_185("({prop:1})");t.is({prop:1},_196);t.is(undefined,_196[1]);_196=_185("{'prop-x':1}");t.is({"prop-x":1},_196);t.is(undefined,_196[1]);_196=_185("({'prop-x':1})");t.is({"prop-x":1},_196);t.is(undefined,_196[1]);_196=_185("define({'prop-x':1})");t.is(1,_196);_196=_185("this is total nonsense and should throw an error");t.is(_196 instanceof Error,true);});});}}return lang.mixin(_148,{dynamic:true,normalize:_15f,load:load,cache:_151});});},"dijit/hccss":function(){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(_197,_198,_199,_19a,_19b,_19c,has,win){if(has("ie")||has("mozilla")){_19c(90,function(){var div=_19a.create("div",{id:"a11yTestNode",style:{cssText:"border: 1px solid;"+"border-color:red green;"+"position: absolute;"+"height: 5px;"+"top: -999px;"+"background-image: url(\""+(_198.blankGif||_197.toUrl("dojo/resources/blank.gif"))+"\");"}},win.body());var cs=_19b.getComputedStyle(div);if(cs){var _19d=cs.backgroundImage;var _19e=(cs.borderTopColor==cs.borderRightColor)||(_19d!=null&&(_19d=="none"||_19d=="url(invalid-url:)"));if(_19e){_199.add(win.body(),"dijit_a11y");}if(has("ie")){div.outerHTML="";}else{win.body().removeChild(div);}}});}});},"dijit/tree/ForestStoreModel":function(){define("dijit/tree/ForestStoreModel",["dojo/_base/array","dojo/_base/declare","dojo/_base/lang","dojo/_base/window","./TreeStoreModel"],function(_19f,_1a0,lang,win,_1a1){return _1a0("dijit.tree.ForestStoreModel",_1a1,{rootId:"$root$",rootLabel:"ROOT",query:null,constructor:function(_1a2){this.root={store:this,root:true,id:_1a2.rootId,label:_1a2.rootLabel,children:_1a2.rootChildren};},mayHaveChildren:function(item){return item===this.root||this.inherited(arguments);},getChildren:function(_1a3,_1a4,_1a5){if(_1a3===this.root){if(this.root.children){_1a4(this.root.children);}else{this.store.fetch({query:this.query,onComplete:lang.hitch(this,function(_1a6){this.root.children=_1a6;_1a4(_1a6);}),onError:_1a5});}}else{this.inherited(arguments);}},isItem:function(_1a7){return (_1a7===this.root)?true:this.inherited(arguments);},fetchItemByIdentity:function(_1a8){if(_1a8.identity==this.root.id){var _1a9=_1a8.scope?_1a8.scope:win.global;if(_1a8.onItem){_1a8.onItem.call(_1a9,this.root);}}else{this.inherited(arguments);}},getIdentity:function(item){return (item===this.root)?this.root.id:this.inherited(arguments);},getLabel:function(item){return (item===this.root)?this.root.label:this.inherited(arguments);},newItem:function(args,_1aa,_1ab){if(_1aa===this.root){this.onNewRootItem(args);return this.store.newItem(args);}else{return this.inherited(arguments);}},onNewRootItem:function(){},pasteItem:function(_1ac,_1ad,_1ae,_1af,_1b0){if(_1ad===this.root){if(!_1af){this.onLeaveRoot(_1ac);}}this.inherited(arguments,[_1ac,_1ad===this.root?null:_1ad,_1ae===this.root?null:_1ae,_1af,_1b0]);if(_1ae===this.root){this.onAddToRoot(_1ac);}},onAddToRoot:function(item){},onLeaveRoot:function(item){},_requeryTop:function(){var _1b1=this.root.children||[];this.store.fetch({query:this.query,onComplete:lang.hitch(this,function(_1b2){this.root.children=_1b2;if(_1b1.length!=_1b2.length||_19f.some(_1b1,function(item,idx){return _1b2[idx]!=item;})){this.onChildrenChange(this.root,_1b2);}})});},onNewItem:function(item,_1b3){this._requeryTop();this.inherited(arguments);},onDeleteItem:function(item){if(_19f.indexOf(this.root.children,item)!=-1){this._requeryTop();}this.inherited(arguments);},onSetItem:function(item,_1b4,_1b5,_1b6){this._requeryTop();this.inherited(arguments);}});});},"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","dijit/form/_ComboBoxMenuMixin":function(){define("dijit/form/_ComboBoxMenuMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/i18n","dojo/_base/window","dojo/i18n!./nls/ComboBox"],function(_1b7,_1b8,_1b9,i18n,win){return _1b8("dijit.form._ComboBoxMenuMixin",null,{_messages:null,postMixInProperties:function(){this.inherited(arguments);this._messages=i18n.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(_1ba){this.value=_1ba;this.onChange(_1ba);},onClick:function(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);}}},onChange:function(){},onPage:function(){},onClose:function(){this._setSelectedAttr(null);},_createOption:function(item,_1bb){var _1bc=this._createMenuItem();var _1bd=_1bb(item);if(_1bd.html){_1bc.innerHTML=_1bd.label;}else{_1bc.appendChild(win.doc.createTextNode(_1bd.label));}if(_1bc.innerHTML==""){_1bc.innerHTML="&#160;";}this.applyTextDir(_1bc,(_1bc.innerText||_1bc.textContent||""));_1bc.item=item;return _1bc;},createOptions:function(_1be,_1bf,_1c0){this.previousButton.style.display=(_1bf.start==0)?"none":"";_1b9.set(this.previousButton,"id",this.id+"_prev");_1b7.forEach(_1be,function(item,i){var _1c1=this._createOption(item,_1c0);_1b9.set(_1c1,"id",this.id+i);this.nextButton.parentNode.insertBefore(_1c1,this.nextButton);},this);var _1c2=false;if(_1be.total&&!_1be.total.then&&_1be.total!=-1){if((_1bf.start+_1bf.count)<_1be.total){_1c2=true;}else{if((_1bf.start+_1bf.count)>_1be.total&&_1bf.count==_1be.length){_1c2=true;}}}else{if(_1bf.count==_1be.length){_1c2=true;}}this.nextButton.style.display=_1c2?"":"none";_1b9.set(this.nextButton,"id",this.id+"_next");return this.containerNode.childNodes;},clearResultList:function(){var _1c3=this.containerNode;while(_1c3.childNodes.length>2){_1c3.removeChild(_1c3.childNodes[_1c3.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();}});});},"dojo/parser":function(){define("dojo/parser",["./_base/kernel","./_base/lang","./_base/array","./_base/html","./_base/window","./_base/url","./_base/json","./aspect","./date/stamp","./query","./on","./ready"],function(dojo,_1c4,_1c5,_1c6,_1c7,_1c8,_1c9,_1ca,_1cb,_1cc,don){new Date("X");var _1cd={"dom-attributes-explicit":document.createElement("div").attributes.length<40};function has(_1ce){return _1cd[_1ce];};dojo.parser=new function(){var _1cf={};function _1d0(_1d1){var map={};for(var name in _1d1){if(name.charAt(0)=="_"){continue;}map[name.toLowerCase()]=name;}return map;};_1ca.after(_1c4,"extend",function(){_1cf={};},true);var _1d2={};this._functionFromScript=function(_1d3,_1d4){var _1d5="";var _1d6="";var _1d7=(_1d3.getAttribute(_1d4+"args")||_1d3.getAttribute("args"));if(_1d7){_1c5.forEach(_1d7.split(/\s*,\s*/),function(part,idx){_1d5+="var "+part+" = arguments["+idx+"]; ";});}var _1d8=_1d3.getAttribute("with");if(_1d8&&_1d8.length){_1c5.forEach(_1d8.split(/\s*,\s*/),function(part){_1d5+="with("+part+"){";_1d6+="}";});}return new Function(_1d5+_1d3.innerHTML+_1d6);};this.instantiate=function(_1d9,_1da,args){var _1db=[],_1da=_1da||{};args=args||{};var _1dc=(args.scope||dojo._scopeName)+"Type",_1dd="data-"+(args.scope||dojo._scopeName)+"-",_1de=_1dd+"type",_1df=_1dd+"props",_1e0=_1dd+"attach-point",_1e1=_1dd+"attach-event",_1e2=_1dd+"id";var _1e3={};_1c5.forEach([_1df,_1de,_1dc,_1e2,"jsId",_1e0,_1e1,"dojoAttachPoint","dojoAttachEvent","class","style"],function(name){_1e3[name.toLowerCase()]=name.replace(args.scope,"dojo");});_1c5.forEach(_1d9,function(obj){if(!obj){return;}var node=obj.node||obj,type=_1dc in _1da?_1da[_1dc]:obj.node?obj.type:(node.getAttribute(_1de)||node.getAttribute(_1dc)),ctor=_1d2[type]||(_1d2[type]=_1c4.getObject(type)),_1e4=ctor&&ctor.prototype;if(!ctor){throw new Error("Could not load class '"+type);}var _1e5={};if(args.defaults){_1c4.mixin(_1e5,args.defaults);}if(obj.inherited){_1c4.mixin(_1e5,obj.inherited);}var _1e6;if(has("dom-attributes-explicit")){_1e6=node.attributes;}else{var _1e7=/^input$|^img$/i.test(node.nodeName)?node:node.cloneNode(false),_1e8=_1e7.outerHTML.replace(/=[^\s"']+|="[^"]*"|='[^']*'/g,"").replace(/^\s*<[a-zA-Z0-9]*/,"").replace(/>.*$/,"");_1e6=_1c5.map(_1e8.split(/\s+/),function(name){var _1e9=name.toLowerCase();return {name:name,value:(node.nodeName=="LI"&&name=="value")||_1e9=="enctype"?node.getAttribute(_1e9):node.getAttributeNode(_1e9).value,specified:true};});}var i=0,item;while(item=_1e6[i++]){if(!item||!item.specified){continue;}var name=item.name,_1ea=name.toLowerCase(),_1eb=item.value;if(_1ea in _1e3){switch(_1e3[_1ea]){case "data-dojo-props":var _1ec=_1eb;break;case "data-dojo-id":case "jsId":var _1ed=_1eb;break;case "data-dojo-attach-point":case "dojoAttachPoint":_1e5.dojoAttachPoint=_1eb;break;case "data-dojo-attach-event":case "dojoAttachEvent":_1e5.dojoAttachEvent=_1eb;break;case "class":_1e5["class"]=node.className;break;case "style":_1e5["style"]=node.style&&node.style.cssText;break;}}else{if(!(name in _1e4)){var map=(_1cf[type]||(_1cf[type]=_1d0(_1e4)));name=map[_1ea]||name;}if(name in _1e4){switch(typeof _1e4[name]){case "string":_1e5[name]=_1eb;break;case "number":_1e5[name]=_1eb.length?Number(_1eb):NaN;break;case "boolean":_1e5[name]=_1eb.toLowerCase()!="false";break;case "function":if(_1eb===""||_1eb.search(/[^\w\.]+/i)!=-1){_1e5[name]=new Function(_1eb);}else{_1e5[name]=_1c4.getObject(_1eb,false)||new Function(_1eb);}break;default:var pVal=_1e4[name];_1e5[name]=(pVal&&"length" in pVal)?(_1eb?_1eb.split(/\s*,\s*/):[]):(pVal instanceof Date)?(_1eb==""?new Date(""):_1eb=="now"?new Date():_1cb.fromISOString(_1eb)):(pVal instanceof dojo._Url)?(dojo.baseUrl+_1eb):_1c9.fromJson(_1eb);}}else{_1e5[name]=_1eb;}}}if(_1ec){try{_1ec=_1c9.fromJson.call(args.propsThis,"{"+_1ec+"}");_1c4.mixin(_1e5,_1ec);}catch(e){throw new Error(e.toString()+" in data-dojo-props='"+_1ec+"'");}}_1c4.mixin(_1e5,_1da);var _1ee=obj.node?obj.scripts:(ctor&&(ctor._noScript||_1e4._noScript)?[]:_1cc("> script[type^='dojo/']",node));var _1ef=[],_1f0=[],_1f1=[],on=[];if(_1ee){for(i=0;i<_1ee.length;i++){var _1f2=_1ee[i];node.removeChild(_1f2);var _1f3=(_1f2.getAttribute(_1dd+"event")||_1f2.getAttribute("event")),prop=_1f2.getAttribute(_1dd+"prop"),type=_1f2.getAttribute("type"),nf=this._functionFromScript(_1f2,_1dd);if(_1f3){if(type=="dojo/connect"){_1ef.push({event:_1f3,func:nf});}else{if(type=="dojo/on"){on.push({event:_1f3,func:nf});}else{_1e5[_1f3]=nf;}}}else{if(type=="dojo/watch"){_1f1.push({prop:prop,func:nf});}else{_1f0.push(nf);}}}}var _1f4=ctor.markupFactory||_1e4.markupFactory;var _1f5=_1f4?_1f4(_1e5,node,ctor):new ctor(_1e5,node);_1db.push(_1f5);if(_1ed){_1c4.setObject(_1ed,_1f5);}for(i=0;i<_1ef.length;i++){_1ca.after(_1f5,_1ef[i].event,dojo.hitch(_1f5,_1ef[i].func),true);}for(i=0;i<_1f0.length;i++){_1f0[i].call(_1f5);}for(i=0;i<_1f1.length;i++){_1f5.watch(_1f1[i].prop,_1f1[i].func);}for(i=0;i<on.length;i++){don(_1f5,on[i].event,on[i].func);}},this);if(!_1da._started){_1c5.forEach(_1db,function(_1f6){if(!args.noStart&&_1f6&&_1c4.isFunction(_1f6.startup)&&!_1f6._started){_1f6.startup();}});}return _1db;};this.parse=function(_1f7,args){var root;if(!args&&_1f7&&_1f7.rootNode){args=_1f7;root=args.rootNode;}else{root=_1f7;}root=root?_1c6.byId(root):_1c7.body();args=args||{};var _1f8=(args.scope||dojo._scopeName)+"Type",_1f9="data-"+(args.scope||dojo._scopeName)+"-",_1fa=_1f9+"type",_1fb=_1f9+"textdir";var list=[];var node=root.firstChild;var _1fc=args&&args.inherited;if(!_1fc){function _1fd(node,attr){return (node.getAttribute&&node.getAttribute(attr))||(node!==_1c7.doc&&node!==_1c7.doc.documentElement&&node.parentNode?_1fd(node.parentNode,attr):null);};_1fc={dir:_1fd(root,"dir"),lang:_1fd(root,"lang"),textDir:_1fd(root,_1fb)};for(var key in _1fc){if(!_1fc[key]){delete _1fc[key];}}}var _1fe={inherited:_1fc};var _1ff;var _200;function _201(_202){if(!_202.inherited){_202.inherited={};var node=_202.node,_203=_201(_202.parent);var _204={dir:node.getAttribute("dir")||_203.dir,lang:node.getAttribute("lang")||_203.lang,textDir:node.getAttribute(_1fb)||_203.textDir};for(var key in _204){if(_204[key]){_202.inherited[key]=_204[key];}}}return _202.inherited;};while(true){if(!node){if(!_1fe||!_1fe.node){break;}node=_1fe.node.nextSibling;_1ff=_1fe.scripts;_200=false;_1fe=_1fe.parent;continue;}if(node.nodeType!=1){node=node.nextSibling;continue;}if(_1ff&&node.nodeName.toLowerCase()=="script"){type=node.getAttribute("type");if(type&&/^dojo\/\w/i.test(type)){_1ff.push(node);}node=node.nextSibling;continue;}if(_200){node=node.nextSibling;continue;}var type=node.getAttribute(_1fa)||node.getAttribute(_1f8);var _205=node.firstChild;if(!type&&(!_205||(_205.nodeType==3&&!_205.nextSibling))){node=node.nextSibling;continue;}var _206={node:node,scripts:_1ff,parent:_1fe};var ctor=type&&(_1d2[type]||(_1d2[type]=_1c4.getObject(type))),_207=ctor&&!ctor.prototype._noScript?[]:null;if(type){list.push({"type":type,node:node,scripts:_207,inherited:_201(_206)});}node=_205;_1ff=_207;_200=ctor&&ctor.prototype.stopParser&&!(args&&args.template);_1fe=_206;}var _208=args&&args.template?{template:true}:null;return this.instantiate(list,_208,args);};}();if(dojo.config.parseOnLoad){dojo.ready(100,dojo.parser,"parse");}return dojo.parser;});},"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","dojo/dnd/Manager":function(){define("dojo/dnd/Manager",["../main","../Evented","./common","./autoscroll","./Avatar"],function(dojo,_209){var _20a=dojo.declare("dojo.dnd.Manager",[_209],{constructor:function(){this.avatar=null;this.source=null;this.nodes=[];this.copy=true;this.target=null;this.canDropFlag=false;this.events=[];},OFFSET_X:16,OFFSET_Y:16,overSource:function(_20b){if(this.avatar){this.target=(_20b&&_20b.targetState!="Disabled")?_20b:null;this.canDropFlag=Boolean(this.target);this.avatar.update();}dojo.publish("/dnd/source/over",[_20b]);},outSource:function(_20c){if(this.avatar){if(this.target==_20c){this.target=null;this.canDropFlag=false;this.avatar.update();dojo.publish("/dnd/source/over",[null]);}}else{dojo.publish("/dnd/source/over",[null]);}},startDrag:function(_20d,_20e,copy){this.source=_20d;this.nodes=_20e;this.copy=Boolean(copy);this.avatar=this.makeAvatar();dojo.body().appendChild(this.avatar.node);dojo.publish("/dnd/start",[_20d,_20e,this.copy]);this.events=[dojo.connect(dojo.doc,"onmousemove",this,"onMouseMove"),dojo.connect(dojo.doc,"onmouseup",this,"onMouseUp"),dojo.connect(dojo.doc,"onkeydown",this,"onKeyDown"),dojo.connect(dojo.doc,"onkeyup",this,"onKeyUp"),dojo.connect(dojo.doc,"ondragstart",dojo.stopEvent),dojo.connect(dojo.body(),"onselectstart",dojo.stopEvent)];var c="dojoDnd"+(copy?"Copy":"Move");dojo.addClass(dojo.body(),c);},canDrop:function(flag){var _20f=Boolean(this.target&&flag);if(this.canDropFlag!=_20f){this.canDropFlag=_20f;this.avatar.update();}},stopDrag:function(){dojo.removeClass(dojo.body(),["dojoDndCopy","dojoDndMove"]);dojo.forEach(this.events,dojo.disconnect);this.events=[];this.avatar.destroy();this.avatar=null;this.source=this.target=null;this.nodes=[];},makeAvatar:function(){return new dojo.dnd.Avatar(this);},updateAvatar:function(){this.avatar.update();},onMouseMove:function(e){var a=this.avatar;if(a){dojo.dnd.autoScrollNodes(e);var s=a.node.style;s.left=(e.pageX+this.OFFSET_X)+"px";s.top=(e.pageY+this.OFFSET_Y)+"px";var copy=Boolean(this.source.copyState(dojo.isCopyKey(e)));if(this.copy!=copy){this._setCopyStatus(copy);}}},onMouseUp:function(e){if(this.avatar){if(this.target&&this.canDropFlag){var copy=Boolean(this.source.copyState(dojo.isCopyKey(e))),_210=[this.source,this.nodes,copy,this.target,e];dojo.publish("/dnd/drop/before",_210);dojo.publish("/dnd/drop",_210);}else{dojo.publish("/dnd/cancel");}this.stopDrag();}},onKeyDown:function(e){if(this.avatar){switch(e.keyCode){case dojo.keys.CTRL:var copy=Boolean(this.source.copyState(true));if(this.copy!=copy){this._setCopyStatus(copy);}break;case dojo.keys.ESCAPE:dojo.publish("/dnd/cancel");this.stopDrag();break;}}},onKeyUp:function(e){if(this.avatar&&e.keyCode==dojo.keys.CTRL){var copy=Boolean(this.source.copyState(false));if(this.copy!=copy){this._setCopyStatus(copy);}}},_setCopyStatus:function(copy){this.copy=copy;this.source._markDndStatus(this.copy);this.updateAvatar();dojo.replaceClass(dojo.body(),"dojoDnd"+(this.copy?"Copy":"Move"),"dojoDnd"+(this.copy?"Move":"Copy"));}});dojo.dnd._manager=null;_20a.manager=dojo.dnd.manager=function(){if(!dojo.dnd._manager){dojo.dnd._manager=new dojo.dnd.Manager();}return dojo.dnd._manager;};return _20a;});},"dijit/form/ToggleButton":function(){define("dijit/form/ToggleButton",["dojo/_base/declare","dojo/_base/kernel","./Button","./_ToggleButtonMixin"],function(_211,_212,_213,_214){return _211("dijit.form.ToggleButton",[_213,_214],{baseClass:"dijitToggleButton",setChecked:function(_215){_212.deprecated("setChecked("+_215+") is deprecated. Use set('checked',"+_215+") instead.","","2.0");this.set("checked",_215);}});});},"dojo/date/stamp":function(){define("dojo/date/stamp",["../_base/kernel","../_base/lang","../_base/array"],function(dojo,lang,_216){lang.getObject("date.stamp",true,dojo);dojo.date.stamp.fromISOString=function(_217,_218){if(!dojo.date.stamp._isoRegExp){dojo.date.stamp._isoRegExp=/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;}var _219=dojo.date.stamp._isoRegExp.exec(_217),_21a=null;if(_219){_219.shift();if(_219[1]){_219[1]--;}if(_219[6]){_219[6]*=1000;}if(_218){_218=new Date(_218);_216.forEach(_216.map(["FullYear","Month","Date","Hours","Minutes","Seconds","Milliseconds"],function(prop){return _218["get"+prop]();}),function(_21b,_21c){_219[_21c]=_219[_21c]||_21b;});}_21a=new Date(_219[0]||1970,_219[1]||0,_219[2]||1,_219[3]||0,_219[4]||0,_219[5]||0,_219[6]||0);if(_219[0]<100){_21a.setFullYear(_219[0]||1970);}var _21d=0,_21e=_219[7]&&_219[7].charAt(0);if(_21e!="Z"){_21d=((_219[8]||0)*60)+(Number(_219[9])||0);if(_21e!="-"){_21d*=-1;}}if(_21e){_21d-=_21a.getTimezoneOffset();}if(_21d){_21a.setTime(_21a.getTime()+_21d*60000);}}return _21a;};dojo.date.stamp.toISOString=function(_21f,_220){var _221=function(n){return (n<10)?"0"+n:n;};_220=_220||{};var _222=[],_223=_220.zulu?"getUTC":"get",date="";if(_220.selector!="time"){var year=_21f[_223+"FullYear"]();date=["0000".substr((year+"").length)+year,_221(_21f[_223+"Month"]()+1),_221(_21f[_223+"Date"]())].join("-");}_222.push(date);if(_220.selector!="date"){var time=[_221(_21f[_223+"Hours"]()),_221(_21f[_223+"Minutes"]()),_221(_21f[_223+"Seconds"]())].join(":");var _224=_21f[_223+"Milliseconds"]();if(_220.milliseconds){time+="."+(_224<100?"0":"")+_221(_224);}if(_220.zulu){time+="Z";}else{if(_220.selector!="time"){var _225=_21f.getTimezoneOffset();var _226=Math.abs(_225);time+=(_225>0?"-":"+")+_221(Math.floor(_226/60))+":"+_221(_226%60);}}_222.push(time);}return _222.join("T");};return dojo.date.stamp;});},"dojo/Stateful":function(){define("dojo/Stateful",["./_base/kernel","./_base/declare","./_base/lang","./_base/array"],function(dojo,_227,lang,_228){return dojo.declare("dojo.Stateful",null,{postscript:function(_229){if(_229){lang.mixin(this,_229);}},get:function(name){return this[name];},set:function(name,_22a){if(typeof name==="object"){for(var x in name){this.set(x,name[x]);}return this;}var _22b=this[name];this[name]=_22a;if(this._watchCallbacks){this._watchCallbacks(name,_22b,_22a);}return this;},watch:function(name,_22c){var _22d=this._watchCallbacks;if(!_22d){var self=this;_22d=this._watchCallbacks=function(name,_22e,_22f,_230){var _231=function(_232){if(_232){_232=_232.slice();for(var i=0,l=_232.length;i<l;i++){try{_232[i].call(self,name,_22e,_22f);}catch(e){console.error(e);}}}};_231(_22d["_"+name]);if(!_230){_231(_22d["*"]);}};}if(!_22c&&typeof name==="function"){_22c=name;name="*";}else{name="_"+name;}var _233=_22d[name];if(typeof _233!=="object"){_233=_22d[name]=[];}_233.push(_22c);return {unwatch:function(){_233.splice(_228.indexOf(_233,_22c),1);}};}});});},"dijit/layout/AccordionContainer":function(){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(_234,_235,_236,_237,fx,dom,_238,_239,_23a,_23b,_23c,keys,lang,has,_23d,_23e,_23f,_240,_241,_242,_243,_244,_245,_246,_247){var _248=_236("dijit.layout._AccordionButton",[_241,_243,_244],{templateString:_247,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 _249=this.id.replace(" ","_");_238.set(this.titleTextNode,"id",_249+"_title");this.focusNode.setAttribute("aria-labelledby",_238.get(this.titleTextNode,"id"));dom.setSelectable(this.domNode,false);},getTitleHeight:function(){return _23b.getMarginSize(this.domNode).h;},_onTitleClick:function(){var _24a=this.getParent();_24a.selectChild(this.contentWidget,true);_23e.focus(this.focusNode);},_onTitleKeyPress:function(evt){return this.getParent()._onKeyPress(evt,this.contentWidget);},_setSelectedAttr:function(_24b){this._set("selected",_24b);this.focusNode.setAttribute("aria-expanded",_24b);this.focusNode.setAttribute("aria-selected",_24b);this.focusNode.setAttribute("tabIndex",_24b?"0":"-1");}});var _24c=_236("dijit.layout._AccordionInnerContainer",[_241,_244],{baseClass:"dijitAccordionInnerContainer",isLayoutContainer:true,buildRendering:function(){this.domNode=_23a.place("<div class='"+this.baseClass+"' role='presentation'>",this.contentWidget.domNode,"after");var _24d=this.contentWidget,cls=lang.isString(this.buttonWidget)?lang.getObject(this.buttonWidget):this.buttonWidget;this.button=_24d._buttonWidget=(new cls({contentWidget:_24d,label:_24d.title,title:_24d.tooltip,dir:_24d.dir,lang:_24d.lang,textDir:_24d.textDir,iconClass:_24d.iconClass,id:_24d.id+"_button",parent:this.parent})).placeAt(this.domNode);this.containerNode=_23a.place("<div class='dijitAccordionChildWrapper' style='display:none'>",this.domNode);_23a.place(this.contentWidget.domNode,this.containerNode);},postCreate:function(){this.inherited(arguments);var _24e=this.button;this._contentWidgetWatches=[this.contentWidget.watch("title",lang.hitch(this,function(name,_24f,_250){_24e.set("label",_250);})),this.contentWidget.watch("tooltip",lang.hitch(this,function(name,_251,_252){_24e.set("title",_252);})),this.contentWidget.watch("iconClass",lang.hitch(this,function(name,_253,_254){_24e.set("iconClass",_254);}))];},_setSelectedAttr:function(_255){this._set("selected",_255);this.button.set("selected",_255);if(_255){var cw=this.contentWidget;if(cw.onSelected){cw.onSelected();}}},startup:function(){this.contentWidget.startup();},destroy:function(){this.button.destroyRecursive();_235.forEach(this._contentWidgetWatches||[],function(w){w.unwatch();});delete this.contentWidget._buttonWidget;delete this.contentWidget._wrapperWidget;this.inherited(arguments);},destroyDescendants:function(_256){this.contentWidget.destroyRecursive(_256);}});var _257=_236("dijit.layout.AccordionContainer",_245,{duration:_23f.defaultDuration,buttonWidget:_248,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 _258=this.selectedChildWidget.containerNode.style;_258.display="";_258.overflow="auto";this.selectedChildWidget._wrapperWidget.set("selected",true);}},layout:function(){var _259=this.selectedChildWidget;if(!_259){return;}var _25a=_259._wrapperWidget.domNode,_25b=_23b.getMarginExtents(_25a),_25c=_23b.getPadBorderExtents(_25a),_25d=_259._wrapperWidget.containerNode,_25e=_23b.getMarginExtents(_25d),_25f=_23b.getPadBorderExtents(_25d),_260=this._contentBox;var _261=0;_235.forEach(this.getChildren(),function(_262){if(_262!=_259){_261+=_23b.getMarginSize(_262._wrapperWidget.domNode).h;}});this._verticalSpace=_260.h-_261-_25b.h-_25c.h-_25e.h-_25f.h-_259._buttonWidget.getTitleHeight();this._containerContentBox={h:this._verticalSpace,w:this._contentBox.w-_25b.w-_25c.w-_25e.w-_25f.w};if(_259){_259.resize(this._containerContentBox);}},_setupChild:function(_263){_263._wrapperWidget=_24c({contentWidget:_263,buttonWidget:this.buttonWidget,id:_263.id+"_wrapper",dir:_263.dir,lang:_263.lang,textDir:_263.textDir,parent:this});this.inherited(arguments);},addChild:function(_264,_265){if(this._started){var _266=this.containerNode;if(_265&&typeof _265=="number"){var _267=_241.prototype.getChildren.call(this);if(_267&&_267.length>=_265){_266=_267[_265-1].domNode;_265="after";}}_23a.place(_264.domNode,_266,_265);if(!_264._started){_264.startup();}this._setupChild(_264);_23d.publish(this.id+"-addChild",_264,_265);this.layout();if(!this.selectedChildWidget){this.selectChild(_264);}}else{this.inherited(arguments);}},removeChild:function(_268){if(_268._wrapperWidget){_23a.place(_268.domNode,_268._wrapperWidget.domNode,"after");_268._wrapperWidget.destroy();delete _268._wrapperWidget;}_239.remove(_268.domNode,"dijitHidden");this.inherited(arguments);},getChildren:function(){return _235.map(this.inherited(arguments),function(_269){return _269.declaredClass=="dijit.layout._AccordionInnerContainer"?_269.contentWidget:_269;},this);},destroy:function(){if(this._animation){this._animation.stop();}_235.forEach(this.getChildren(),function(_26a){if(_26a._wrapperWidget){_26a._wrapperWidget.destroy();}else{_26a.destroyRecursive();}});this.inherited(arguments);},_showChild:function(_26b){_26b._wrapperWidget.containerNode.style.display="block";return this.inherited(arguments);},_hideChild:function(_26c){_26c._wrapperWidget.containerNode.style.display="none";this.inherited(arguments);},_transition:function(_26d,_26e,_26f){if(has("ie")<8){_26f=false;}if(this._animation){this._animation.stop(true);delete this._animation;}var self=this;if(_26d){_26d._wrapperWidget.set("selected",true);var d=this._showChild(_26d);if(this.doLayout&&_26d.resize){_26d.resize(this._containerContentBox);}}if(_26e){_26e._wrapperWidget.set("selected",false);if(!_26f){this._hideChild(_26e);}}if(_26f){var _270=_26d._wrapperWidget.containerNode,_271=_26e._wrapperWidget.containerNode;var _272=_26d._wrapperWidget.containerNode,_273=_23b.getMarginExtents(_272),_274=_23b.getPadBorderExtents(_272),_275=_273.h+_274.h;_271.style.height=(self._verticalSpace-_275)+"px";this._animation=new fx.Animation({node:_270,duration:this.duration,curve:[1,this._verticalSpace-_275-1],onAnimate:function(_276){_276=Math.floor(_276);_270.style.height=_276+"px";_271.style.height=(self._verticalSpace-_275-_276)+"px";},onEnd:function(){delete self._animation;_270.style.height="auto";_26e._wrapperWidget.containerNode.style.display="none";_271.style.height="auto";self._hideChild(_26e);}});this._animation.onStop=this._animation.onEnd;this._animation.play();}return d;},_onKeyPress:function(e,_277){if(this.disabled||e.altKey||!(_277||e.ctrlKey)){return;}var c=e.charOrCode;if((_277&&(c==keys.LEFT_ARROW||c==keys.UP_ARROW))||(e.ctrlKey&&c==keys.PAGE_UP)){this._adjacent(false)._buttonWidget._onTitleClick();_237.stop(e);}else{if((_277&&(c==keys.RIGHT_ARROW||c==keys.DOWN_ARROW))||(e.ctrlKey&&(c==keys.PAGE_DOWN||c==keys.TAB))){this._adjacent(true)._buttonWidget._onTitleClick();_237.stop(e);}}}});if(!_23c.isAsync){_240(0,function(){var _278=["dijit/layout/AccordionPane"];_234(_278);});}_257._InnerContainer=_24c;_257._Button=_248;return _257;});},"dijit/form/_AutoCompleterMixin":function(){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(_279,_27a,_27b,_27c,_27d,_27e,keys,lang,_27f,_280,has,_281,win,_282,_283,_284){return _27b("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(_285){var pos=0;if(typeof (_285.selectionStart)=="number"){pos=_285.selectionStart;}else{if(has("ie")){var tr=win.doc.selection.createRange().duplicate();var ntr=_285.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(_286,_287){_287=parseInt(_287);_284.selectInputText(_286,_287,_287);},_setDisabledAttr:function(_288){this.inherited(arguments);this.domNode.setAttribute("aria-disabled",_288);},_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==keys.SHIFT){return;}var _289=false;var pw=this.dropDown;var _28a=null;this._prev_key_backspace=false;this._abortQuery();this.inherited(arguments);if(this._opened){_28a=pw.getHighlightedOption();}switch(key){case keys.PAGE_DOWN:case keys.DOWN_ARROW:case keys.PAGE_UP:case keys.UP_ARROW:if(this._opened){this._announceOption(_28a);}_27e.stop(evt);break;case keys.ENTER:if(_28a){if(_28a==pw.nextButton){this._nextSearch(1);_27e.stop(evt);break;}else{if(_28a==pw.previousButton){this._nextSearch(-1);_27e.stop(evt);break;}}}else{this._setBlurValue();this._setCaretPos(this.focusNode,this.focusNode.value.length);}if(this._opened||this._fetchHandle){_27e.stop(evt);}case keys.TAB:var _28b=this.get("displayedValue");if(pw&&(_28b==pw._messages["previousMessage"]||_28b==pw._messages["nextMessage"])){break;}if(_28a){this._selectOption(_28a);}case keys.ESCAPE:if(this._opened){this._lastQuery=null;this.closeDropDown();}break;case " ":if(_28a){_27e.stop(evt);this._selectOption(_28a);this.closeDropDown();}else{_289=true;}break;case keys.DELETE:case keys.BACKSPACE:this._prev_key_backspace=true;_289=true;break;default:_289=typeof key=="string"||key==229;}if(_289){this.item=undefined;this.searchTimer=setTimeout(lang.hitch(this,"_startSearchFromInput"),1);}},_autoCompleteText:function(text){var fn=this.focusNode;_284.selectInputText(fn,fn.value.length);var _28c=this.ignoreCase?"toLowerCase":"substr";if(text[_28c](0).indexOf(this.focusNode.value[_28c](0))==0){var cpos=this.autoComplete?this._getCaretPos(fn):fn.value.length;if((cpos+1)>fn.value.length){fn.value=text;_284.selectInputText(fn,cpos);}}else{fn.value=text;_284.selectInputText(fn);}},_openResultList:function(_28d,_28e,_28f){this._fetchHandle=null;if(this.disabled||this.readOnly||(_28e[this.searchAttr]!==this._lastQuery)){return;}var _290=this.dropDown.getHighlightedOption();this.dropDown.clearResultList();if(!_28d.length&&_28f.start==0){this.closeDropDown();return;}var _291=this.dropDown.createOptions(_28d,_28f,lang.hitch(this,"_getMenuLabelFromItem"));this._showResultList();if(_28f.direction){if(1==_28f.direction){this.dropDown.highlightFirstOption();}else{if(-1==_28f.direction){this.dropDown.highlightLastOption();}}if(_290){this._announceOption(this.dropDown.getHighlightedOption());}}else{if(this.autoComplete&&!this._prev_key_backspace&&!/^[*]+$/.test(_28e[this.searchAttr].toString())){this._announceOption(_291[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 _292=this.get("displayedValue");var pw=this.dropDown;if(pw&&(_292==pw._messages["previousMessage"]||_292==pw._messages["nextMessage"])){this._setValueAttr(this._lastValueReported,true);}else{if(typeof this.item=="undefined"){this.item=null;this.set("displayedValue",_292);}else{if(this.value!=this._lastValueReported){this._handleOnChange(this.value,true);}this._refreshState();}}},_setItemAttr:function(item,_293,_294){var _295="";if(item){if(!_294){_294=this.store._oldAPI?this.store.getValue(item,this.searchAttr):item[this.searchAttr];}_295=this._getValueField()!=this.searchAttr?this.store.getIdentity(item):_294;}this.set("value",_295,_293,_294,item);},_announceOption:function(node){if(!node){return;}var _296;if(node==this.dropDown.nextButton||node==this.dropDown.previousButton){_296=node.innerHTML;this.item=undefined;this.value="";}else{_296=(this.store._oldAPI?this.store.getValue(node.item,this.searchAttr):node.item[this.searchAttr]).toString();this.set("item",node.item,false,_296);}this.focusNode.value=this.focusNode.value.substring(0,this._lastInput.length);this.focusNode.setAttribute("aria-activedescendant",_27d.get(node,"id"));this._autoCompleteText(_296);},_selectOption:function(_297){this.closeDropDown();if(_297){this._announceOption(_297);}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(text){return _281.substitute(this.queryExpr,[text]);},_startSearch:function(key){if(!this.dropDown){var _298=this.id+"_popup",_299=lang.isString(this.dropDownClass)?lang.getObject(this.dropDownClass,false):this.dropDownClass;this.dropDown=new _299({onChange:lang.hitch(this,this._selectOption),id:_298,dir:this.dir,textDir:this.textDir});this.focusNode.removeAttribute("aria-activedescendant");this.textbox.setAttribute("aria-owns",_298);}this._lastInput=key;var _29a=lang.clone(this.query);var _29b={start:0,count:this.pageSize,queryOptions:{ignoreCase:this.ignoreCase,deep:true}};lang.mixin(_29b,this.fetchProperties);var qs=this._getQueryString(key),q;if(this.store._oldAPI){q=qs;}else{q=_27a.patternToRegExp(qs,this.ignoreCase);q.toString=function(){return qs;};}this._lastQuery=_29a[this.searchAttr]=q;var _29c=this,_29d=function(){var _29e=_29c._fetchHandle=_29c.store.query(_29a,_29b);_27c.when(_29e,function(res){_29c._fetchHandle=null;res.total=_29e.total;_29c._openResultList(res,_29a,_29b);},function(err){_29c._fetchHandle=null;if(!_29c._cancelingQuery){console.error(_29c.declaredClass+" "+err.toString());_29c.closeDropDown();}});};this.searchTimer=setTimeout(lang.hitch(this,function(_29f,_2a0){this.searchTimer=null;_29d();this._nextSearch=this.dropDown.onPage=function(_2a1){_29b.start+=_29b.count*_2a1;_29b.direction=_2a1;_29d();_2a0.focus();};},_29a,this),this.searchDelay);},_getValueField:function(){return this.searchAttr;},constructor:function(){this.query={};this.fetchProperties={};},postMixInProperties:function(){if(!this.store){var _2a2=this.srcNodeRef;var list=this.list;if(list){this.store=_283.byId(list);}else{this.store=new _282({},_2a2);}if(!("value" in this.params)){var item=(this.item=this.store.fetchSelectedItem());if(item){var _2a3=this._getValueField();this.value=this.store._oldAPI?this.store.getValue(item,_2a3):item[_2a3];}}}this.inherited(arguments);},postCreate:function(){var _2a4=_27f("label[for=\""+this.id+"\"]");if(_2a4.length){_2a4[0].id=(this.id+"_label");this.domNode.setAttribute("aria-labelledby",_2a4[0].id);}this.inherited(arguments);},_getMenuLabelFromItem:function(item){var _2a5=this.labelFunc(item,this.store),_2a6=this.labelType;if(this.highlightMatch!="none"&&this.labelType=="text"&&this._lastInput){_2a5=this.doHighlight(_2a5,this._escapeHtml(this._lastInput));_2a6="html";}return {html:_2a6=="html",label:_2a5};},doHighlight:function(_2a7,find){var _2a8=(this.ignoreCase?"i":"")+(this.highlightMatch=="all"?"g":""),i=this.queryExpr.indexOf("${0}");find=_280.escapeString(find);return this._escapeHtml(_2a7).replace(new RegExp((i==0?"^":"")+"("+find+")"+(i==(this.queryExpr.length-4)?"$":""),_2a8),"<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(item,_2a9){return (_2a9._oldAPI?_2a9.getValue(item,this.labelAttr||this.searchAttr):item[this.labelAttr||this.searchAttr]).toString();},_setValueAttr:function(_2aa,_2ab,_2ac,item){this._set("item",item||null);if(!_2aa){_2aa="";}this.inherited(arguments);},_setTextDirAttr:function(_2ad){this.inherited(arguments);if(this.dropDown){this.dropDown._set("textDir",_2ad);}}});});},"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","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>","dijit/form/MappedTextBox":function(){define("dijit/form/MappedTextBox",["dojo/_base/declare","dojo/dom-construct","./ValidationTextBox"],function(_2ae,_2af,_2b0){return _2ae("dijit.form.MappedTextBox",_2b0,{postMixInProperties:function(){this.inherited(arguments);this.nameAttrSetting="";},_setNameAttr:null,serialize:function(val){return val.toString?val.toString():"";},toString:function(){var val=this.filter(this.get("value"));return val!=null?(typeof val=="string"?val:this.serialize(val,this.constraints)):"";},validate:function(){this.valueNode.value=this.toString();return this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);this.valueNode=_2af.place("<input type='hidden'"+(this.name?" name='"+this.name.replace(/'/g,"&quot;")+"'":"")+"/>",this.textbox,"after");},reset:function(){this.valueNode.value="";this.inherited(arguments);}});});},"dijit/form/ComboBoxMixin":function(){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(_2b1,_2b2,_2b3,lang,_2b4,_2b5,_2b6,_2b7,_2b8){return _2b1("dijit.form.ComboBoxMixin",[_2b7,_2b5],{dropDownClass:_2b6,hasDownArrow:true,templateString:_2b8,baseClass:"dijitTextBox dijitComboBox",cssStateNodes:{"_buttonNode":"dijitDownArrowButton"},_setHasDownArrowAttr:function(val){this._set("hasDownArrow",val);this._buttonNode.style.display=val?"":"none";},_showResultList:function(){this.displayMessage("");this.inherited(arguments);},_setStoreAttr:function(_2b9){if(!_2b9.get){lang.mixin(_2b9,{_oldAPI:true,get:function(id){var _2ba=new _2b2();this.fetchItemByIdentity({identity:id,onItem:function(_2bb){_2ba.resolve(_2bb);},onError:function(_2bc){_2ba.reject(_2bc);}});return _2ba.promise;},query:function(_2bd,_2be){var _2bf=new _2b2(function(){_2c0.abort&&_2c0.abort();});var _2c0=this.fetch(lang.mixin({query:_2bd,onBegin:function(_2c1){_2bf.total=_2c1;},onComplete:function(_2c2){_2bf.resolve(_2c2);},onError:function(_2c3){_2bf.reject(_2c3);}},_2be));return _2b4(_2bf);}});}this._set("store",_2b9);},postMixInProperties:function(){if(this.params.store){this._setStoreAttr(this.params.store);}this.inherited(arguments);if(!this.params.store){var _2c4=this.declaredClass;lang.mixin(this.store,{getValue:function(item,attr){_2b3.deprecated(_2c4+".store.getValue(item, attr) is deprecated for builtin store. Use item.attr directly","","2.0");return item[attr];},getLabel:function(item){_2b3.deprecated(_2c4+".store.getLabel(item) is deprecated for builtin store. Use item.label directly","","2.0");return item.name;},fetch:function(args){_2b3.deprecated(_2c4+".store.fetch() is deprecated for builtin store.","Use store.query()","2.0");var shim=["dojo/data/ObjectStore"];require(shim,lang.hitch(this,function(_2c5){new _2c5({objectStore:this}).fetch(args);}));}});}}});});},"dijit/form/_TextBoxMixin":function(){define("dijit/form/_TextBoxMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom","dojo/_base/event","dojo/keys","dojo/_base/lang",".."],function(_2c6,_2c7,dom,_2c8,keys,lang,_2c9){var _2ca=_2c7("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(_2cb,_2cc,_2cd){var _2ce;if(_2cb!==undefined){_2ce=this.filter(_2cb);if(typeof _2cd!="string"){if(_2ce!==null&&((typeof _2ce!="number")||!isNaN(_2ce))){_2cd=this.filter(this.format(_2ce,this.constraints));}else{_2cd="";}}}if(_2cd!=null&&_2cd!=undefined&&((typeof _2cd)!="number"||!isNaN(_2cd))&&this.textbox.value!=_2cd){this.textbox.value=_2cd;this._set("displayedValue",this.get("displayedValue"));}if(this.textDir=="auto"){this.applyTextDir(this.focusNode,_2cd);}this.inherited(arguments,[_2ce,_2cc]);},displayedValue:"",_getDisplayedValueAttr:function(){return this.filter(this.textbox.value);},_setDisplayedValueAttr:function(_2cf){if(_2cf===null||_2cf===undefined){_2cf="";}else{if(typeof _2cf!="string"){_2cf=String(_2cf);}}this.textbox.value=_2cf;this._setValueAttr(this.get("value"),undefined);this._set("displayedValue",this.get("displayedValue"));if(this.textDir=="auto"){this.applyTextDir(this.focusNode,_2cf);}},format:function(_2d0){return ((_2d0==null||_2d0==undefined)?"":(_2d0.toString?_2d0.toString():_2d0));},parse:function(_2d1){return _2d1;},_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 _2d2=function(e){var _2d3=e.charOrCode||e.keyCode||229;if(e.type=="keydown"){switch(_2d3){case keys.SHIFT:case keys.ALT:case keys.CTRL:case keys.META:case keys.CAPS_LOCK:return;default:if(_2d3>=65&&_2d3<=90){return;}}}if(e.type=="keypress"&&typeof _2d3!="string"){return;}if(e.type=="input"){if(this.__skipInputEvent){this.__skipInputEvent=false;return;}}else{this.__skipInputEvent=true;}var faux=lang.mixin({},e,{charOrCode:_2d3,wasConsumed:false,preventDefault:function(){faux.wasConsumed=true;e.preventDefault();},stopPropagation:function(){e.stopPropagation();}});if(this.onInput(faux)===false){_2c8.stop(faux);}if(faux.wasConsumed){return;}setTimeout(lang.hitch(this,"_onInput",faux),0);};_2c6.forEach(["onkeydown","onkeypress","onpaste","oncut","oninput","oncompositionend"],function(_2d4){this.connect(this.textbox,_2d4,_2d2);},this);},_blankValue:"",filter:function(val){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(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()){_2ca.selectInputText(this.textbox);}});}this.inherited(arguments);this._refreshState();},reset:function(){this.textbox.value="";this.inherited(arguments);},_setTextDirAttr:function(_2d5){if(!this._created||this.textDir!=_2d5){this._set("textDir",_2d5);this.applyTextDir(this.focusNode,this.focusNode.value);}}});_2ca._setSelectionRange=_2c9._setSelectionRange=function(_2d6,_2d7,stop){if(_2d6.setSelectionRange){_2d6.setSelectionRange(_2d7,stop);}};_2ca.selectInputText=_2c9.selectInputText=function(_2d8,_2d9,stop){_2d8=dom.byId(_2d8);if(isNaN(_2d9)){_2d9=0;}if(isNaN(stop)){stop=_2d8.value?_2d8.value.length:0;}try{_2d8.focus();_2ca._setSelectionRange(_2d8,_2d9,stop);}catch(e){}};return _2ca;});},"dijit/form/SimpleTextarea":function(){define("dijit/form/SimpleTextarea",["dojo/_base/declare","dojo/dom-class","dojo/_base/sniff","dojo/_base/window","./TextBox"],function(_2da,_2db,has,win,_2dc){return _2da("dijit.form.SimpleTextarea",_2dc,{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(has("ie")&&this.cols){_2db.add(this.textbox,"dijitTextAreaCols");}},filter:function(_2dd){if(_2dd){_2dd=_2dd.replace(/\r/g,"");}return this.inherited(arguments);},_onInput:function(e){if(this.maxLength){var _2de=parseInt(this.maxLength);var _2df=this.textbox.value.replace(/\r/g,"");var _2e0=_2df.length-_2de;if(_2e0>0){var _2e1=this.textbox;if(_2e1.selectionStart){var pos=_2e1.selectionStart;var cr=0;if(has("opera")){cr=(this.textbox.value.substring(0,pos).match(/\r/g)||[]).length;}this.textbox.value=_2df.substring(0,pos-_2e0-cr)+_2df.substring(pos-cr);_2e1.setSelectionRange(pos-_2e0,pos-_2e0);}else{if(win.doc.selection){_2e1.focus();var _2e2=win.doc.selection.createRange();_2e2.moveStart("character",-_2e0);_2e2.text="";_2e2.select();}}}}this.inherited(arguments);}});});},"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","dijit/_base/window":function(){define("dijit/_base/window",["dojo/window",".."],function(_2e3,_2e4){_2e4.getDocumentWindow=function(doc){return _2e3.get(doc);};});},"dijit/form/RadioButton":function(){define("dijit/form/RadioButton",["dojo/_base/declare","./CheckBox","./_RadioButtonMixin"],function(_2e5,_2e6,_2e7){return _2e5("dijit.form.RadioButton",[_2e6,_2e7],{baseClass:"dijitRadio"});});},"dijit/main":function(){define("dijit/main",["dojo/_base/kernel"],function(dojo){return dojo.dijit;});},"dijit/_OnDijitClickMixin":function(){define("dijit/_OnDijitClickMixin",["dojo/on","dojo/_base/array","dojo/keys","dojo/_base/declare","dojo/_base/sniff","dojo/_base/unload","dojo/_base/window"],function(on,_2e8,keys,_2e9,has,_2ea,win){var _2eb=null;if(has("ie")){(function(){var _2ec=function(evt){_2eb=evt.srcElement;};win.doc.attachEvent("onkeydown",_2ec);_2ea.addOnWindowUnload(function(){win.doc.detachEvent("onkeydown",_2ec);});})();}else{win.doc.addEventListener("keydown",function(evt){_2eb=evt.target;},true);}var _2ed=function(node,_2ee){if(/input|button/i.test(node.nodeName)){return on(node,"click",_2ee);}else{function _2ef(e){return (e.keyCode==keys.ENTER||e.keyCode==keys.SPACE)&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey;};var _2f0=[on(node,"keypress",function(e){if(_2ef(e)){_2eb=e.target;e.preventDefault();}}),on(node,"keyup",function(e){if(_2ef(e)&&e.target==_2eb){_2eb=null;_2ee.call(this,e);}}),on(node,"click",function(e){_2ee.call(this,e);})];return {remove:function(){_2e8.forEach(_2f0,function(h){h.remove();});}};}};return _2e9("dijit._OnDijitClickMixin",null,{connect:function(obj,_2f1,_2f2){return this.inherited(arguments,[obj,_2f1=="ondijitclick"?_2ed:_2f1,_2f2]);}});});},"dijit/InlineEditBox":function(){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(_2f3,_2f4,_2f5,_2f6,_2f7,_2f8,_2f9,i18n,_2fa,keys,lang,has,fm,_2fb,_2fc,_2fd,_2fe,_2ff,_300,_301,_302){var _303=_2f4("dijit._InlineEditor",[_2fb,_2fc,_2fd],{templateString:_302,postMixInProperties:function(){this.inherited(arguments);this.messages=i18n.getLocalization("dijit","common",this.lang);_2f3.forEach(["buttonSave","buttonCancel"],function(prop){if(!this[prop]){this[prop]=this.messages[prop];}},this);},buildRendering:function(){this.inherited(arguments);var cls=typeof this.editor=="string"?lang.getObject(this.editor):this.editor;var _304=this.sourceStyle,_305="line-height:"+_304.lineHeight+";",_306=_2f8.getComputedStyle(this.domNode);_2f3.forEach(["Weight","Family","Size","Style"],function(prop){var _307=_304["font"+prop],_308=_306["font"+prop];if(_308!=_307){_305+="font-"+prop+":"+_304["font"+prop]+";";}},this);_2f3.forEach(["marginTop","marginBottom","marginLeft","marginRight"],function(prop){this.domNode.style[prop]=_304[prop];},this);var _309=this.inlineEditBox.width;if(_309=="100%"){_305+="width:100%;";this.domNode.style.display="block";}else{_305+="width:"+(_309+(Number(_309)==_309?"px":""))+";";}var _30a=lang.delegate(this.inlineEditBox.editorParams,{style:_305,dir:this.dir,lang:this.lang,textDir:this.textDir});_30a["displayedValue" in cls.prototype?"displayedValue":"value"]=this.value;this.editWidget=new cls(_30a,this.editorPlaceholder);if(this.inlineEditBox.autoSave){_2f7.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==keys.ESCAPE){_2f9.stop(e);this.cancel(true);}else{if(e.charOrCode==keys.ENTER&&e.target.tagName=="INPUT"){_2f9.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(lang.hitch(this,function(){if(this.editWidget.focusNode&&this.editWidget.focusNode.tagName=="INPUT"){_300.selectInputText(this.editWidget.focusNode);}}),0);}});var _30b=_2f4("dijit.InlineEditBox",_2fb,{editing:false,autoSave:true,buttonSave:"",buttonCancel:"",renderAsHtml:false,editor:_301,editorWrapper:_303,editorParams:{},disabled:false,onChange:function(){},onCancel:function(){},width:"100%",value:"",noValueIndicator:has("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 _30c={ondijitclick:"_onClick",onmouseover:"_onMouseOver",onmouseout:"_onMouseOut",onfocus:"_onMouseOver",onblur:"_onMouseOut"};for(var name in _30c){this.connect(this.displayNode,name,_30c[name]);}this.displayNode.setAttribute("role","button");if(!this.displayNode.getAttribute("tabIndex")){this.displayNode.setAttribute("tabIndex",0);}if(!this.value&&!("value" in this.params)){this.value=lang.trim(this.renderAsHtml?this.displayNode.innerHTML:(this.displayNode.innerText||this.displayNode.textContent||""));}if(!this.value){this.displayNode.innerHTML=this.noValueIndicator;}_2f6.add(this.displayNode,"dijitInlineEditBoxDisplayMode");},setDisabled:function(_30d){_2fa.deprecated("dijit.InlineEditBox.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_30d);},_setDisabledAttr:function(_30e){this.domNode.setAttribute("aria-disabled",_30e);if(_30e){this.displayNode.removeAttribute("tabIndex");}else{this.displayNode.setAttribute("tabIndex",0);}_2f6.toggle(this.displayNode,"dijitInlineEditBoxDisplayModeDisabled",_30e);this._set("disabled",_30e);},_onMouseOver:function(){if(!this.disabled){_2f6.add(this.displayNode,"dijitInlineEditBoxDisplayModeHover");}},_onMouseOut:function(){_2f6.remove(this.displayNode,"dijitInlineEditBoxDisplayModeHover");},_onClick:function(e){if(this.disabled){return;}if(e){_2f9.stop(e);}this._onMouseOut();setTimeout(lang.hitch(this,"edit"),0);},edit:function(){if(this.disabled||this.editing){return;}this._set("editing",true);this._savedPosition=_2f8.get(this.displayNode,"position")||"static";this._savedOpacity=_2f8.get(this.displayNode,"opacity")||"1";this._savedTabIndex=_2f5.get(this.displayNode,"tabIndex")||"0";if(this.wrapperWidget){var ew=this.wrapperWidget.editWidget;ew.set("displayedValue" in ew?"displayedValue":"value",this.value);}else{var _30f=_2f7.create("span",null,this.domNode,"before");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:_2f8.getComputedStyle(this.displayNode),save:lang.hitch(this,"save"),cancel:lang.hitch(this,"cancel"),textDir:this.textDir},_30f);if(!this._started){this.startup();}}var ww=this.wrapperWidget;_2f8.set(this.displayNode,{position:"absolute",opacity:"0"});_2f8.set(ww.domNode,{position:this._savedPosition,visibility:"visible",opacity:"1"});_2f5.set(this.displayNode,"tabIndex","-1");setTimeout(lang.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(_310){var ww=this.wrapperWidget;_2f8.set(ww.domNode,{position:"absolute",visibility:"hidden",opacity:"0"});_2f8.set(this.displayNode,{position:this._savedPosition,opacity:this._savedOpacity});_2f5.set(this.displayNode,"tabIndex",this._savedTabIndex);if(_310){fm.focus(this.displayNode);}},save:function(_311){if(this.disabled||!this.editing){return;}this._set("editing",false);var ww=this.wrapperWidget;var _312=ww.getValue();this.set("value",_312);this._showText(_311);},setValue:function(val){_2fa.deprecated("dijit.InlineEditBox.setValue() is deprecated. Use set('value', ...) instead.","","2.0");return this.set("value",val);},_setValueAttr:function(val){val=lang.trim(val);var _313=this.renderAsHtml?val:val.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;").replace(/\n/g,"<br>");this.displayNode.innerHTML=_313||this.noValueIndicator;this._set("value",val);if(this._started){setTimeout(lang.hitch(this,"onChange",val),0);}if(this.textDir=="auto"){this.applyTextDir(this.displayNode,this.displayNode.innerText);}},getValue:function(){_2fa.deprecated("dijit.InlineEditBox.getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},cancel:function(_314){if(this.disabled||!this.editing){return;}this._set("editing",false);setTimeout(lang.hitch(this,"onCancel"),0);this._showText(_314);},_setTextDirAttr:function(_315){if(!this._created||this.textDir!=_315){this._set("textDir",_315);this.applyTextDir(this.displayNode,this.displayNode.innerText);this.displayNode.align=this.dir=="rtl"?"right":"left";}}});_30b._InlineEditor=_303;return _30b;});},"dojo/selector/acme":function(){define("dojo/selector/acme",["../_base/kernel","../has","../dom","../_base/sniff","../_base/array","../_base/lang","../_base/window"],function(dojo,has,dom){var trim=dojo.trim;var each=dojo.forEach;var _316=function(){return dojo.doc;};var _317=((dojo.isWebKit||dojo.isMozilla)&&((_316().compatMode)=="BackCompat"));var _318=">~+";var _319=false;var _31a=function(){return true;};var _31b=function(_31c){if(_318.indexOf(_31c.slice(-1))>=0){_31c+=" * ";}else{_31c+=" ";}var ts=function(s,e){return trim(_31c.slice(s,e));};var _31d=[];var _31e=-1,_31f=-1,_320=-1,_321=-1,_322=-1,inId=-1,_323=-1,lc="",cc="",_324;var x=0,ql=_31c.length,_325=null,_326=null;var _327=function(){if(_323>=0){var tv=(_323==x)?null:ts(_323,x);_325[(_318.indexOf(tv)<0)?"tag":"oper"]=tv;_323=-1;}};var _328=function(){if(inId>=0){_325.id=ts(inId,x).replace(/\\/g,"");inId=-1;}};var _329=function(){if(_322>=0){_325.classes.push(ts(_322+1,x).replace(/\\/g,""));_322=-1;}};var _32a=function(){_328();_327();_329();};var _32b=function(){_32a();if(_321>=0){_325.pseudos.push({name:ts(_321+1,x)});}_325.loops=(_325.pseudos.length||_325.attrs.length||_325.classes.length);_325.oquery=_325.query=ts(_324,x);_325.otag=_325.tag=(_325["oper"])?null:(_325.tag||"*");if(_325.tag){_325.tag=_325.tag.toUpperCase();}if(_31d.length&&(_31d[_31d.length-1].oper)){_325.infixOper=_31d.pop();_325.query=_325.infixOper.query+" "+_325.query;}_31d.push(_325);_325=null;};for(;lc=cc,cc=_31c.charAt(x),x<ql;x++){if(lc=="\\"){continue;}if(!_325){_324=x;_325={query:null,pseudos:[],attrs:[],classes:[],tag:null,oper:null,id:null,getTag:function(){return (_319)?this.otag:this.tag;}};_323=x;}if(_31e>=0){if(cc=="]"){if(!_326.attr){_326.attr=ts(_31e+1,x);}else{_326.matchFor=ts((_320||_31e+1),x);}var cmf=_326.matchFor;if(cmf){if((cmf.charAt(0)=="\"")||(cmf.charAt(0)=="'")){_326.matchFor=cmf.slice(1,-1);}}_325.attrs.push(_326);_326=null;_31e=_320=-1;}else{if(cc=="="){var _32c=("|~^$*".indexOf(lc)>=0)?lc:"";_326.type=_32c+cc;_326.attr=ts(_31e+1,x-_32c.length);_320=x+1;}}}else{if(_31f>=0){if(cc==")"){if(_321>=0){_326.value=ts(_31f+1,x);}_321=_31f=-1;}}else{if(cc=="#"){_32a();inId=x+1;}else{if(cc=="."){_32a();_322=x;}else{if(cc==":"){_32a();_321=x;}else{if(cc=="["){_32a();_31e=x;_326={};}else{if(cc=="("){if(_321>=0){_326={name:ts(_321+1,x),value:null};_325.pseudos.push(_326);}_31f=x;}else{if((cc==" ")&&(lc!=cc)){_32b();}}}}}}}}}return _31d;};var _32d=function(_32e,_32f){if(!_32e){return _32f;}if(!_32f){return _32e;}return function(){return _32e.apply(window,arguments)&&_32f.apply(window,arguments);};};var _330=function(i,arr){var r=arr||[];if(i){r.push(i);}return r;};var _331=function(n){return (1==n.nodeType);};var _332="";var _333=function(elem,attr){if(!elem){return _332;}if(attr=="class"){return elem.className||_332;}if(attr=="for"){return elem.htmlFor||_332;}if(attr=="style"){return elem.style.cssText||_332;}return (_319?elem.getAttribute(attr):elem.getAttribute(attr,2))||_332;};var _334={"*=":function(attr,_335){return function(elem){return (_333(elem,attr).indexOf(_335)>=0);};},"^=":function(attr,_336){return function(elem){return (_333(elem,attr).indexOf(_336)==0);};},"$=":function(attr,_337){return function(elem){var ea=" "+_333(elem,attr);return (ea.lastIndexOf(_337)==(ea.length-_337.length));};},"~=":function(attr,_338){var tval=" "+_338+" ";return function(elem){var ea=" "+_333(elem,attr)+" ";return (ea.indexOf(tval)>=0);};},"|=":function(attr,_339){var _33a=_339+"-";return function(elem){var ea=_333(elem,attr);return ((ea==_339)||(ea.indexOf(_33a)==0));};},"=":function(attr,_33b){return function(elem){return (_333(elem,attr)==_33b);};}};var _33c=(typeof _316().firstChild.nextElementSibling=="undefined");var _33d=!_33c?"nextElementSibling":"nextSibling";var _33e=!_33c?"previousElementSibling":"previousSibling";var _33f=(_33c?_331:_31a);var _340=function(node){while(node=node[_33e]){if(_33f(node)){return false;}}return true;};var _341=function(node){while(node=node[_33d]){if(_33f(node)){return false;}}return true;};var _342=function(node){var root=node.parentNode;var i=0,tret=root.children||root.childNodes,ci=(node["_i"]||-1),cl=(root["_l"]||-1);if(!tret){return -1;}var l=tret.length;if(cl==l&&ci>=0&&cl>=0){return ci;}root["_l"]=l;ci=-1;for(var te=root["firstElementChild"]||root["firstChild"];te;te=te[_33d]){if(_33f(te)){te["_i"]=++i;if(node===te){ci=i;}}}return ci;};var _343=function(elem){return !((_342(elem))%2);};var _344=function(elem){return ((_342(elem))%2);};var _345={"checked":function(name,_346){return function(elem){return !!("checked" in elem?elem.checked:elem.selected);};},"first-child":function(){return _340;},"last-child":function(){return _341;},"only-child":function(name,_347){return function(node){return _340(node)&&_341(node);};},"empty":function(name,_348){return function(elem){var cn=elem.childNodes;var cnl=elem.childNodes.length;for(var x=cnl-1;x>=0;x--){var nt=cn[x].nodeType;if((nt===1)||(nt==3)){return false;}}return true;};},"contains":function(name,_349){var cz=_349.charAt(0);if(cz=="\""||cz=="'"){_349=_349.slice(1,-1);}return function(elem){return (elem.innerHTML.indexOf(_349)>=0);};},"not":function(name,_34a){var p=_31b(_34a)[0];var _34b={el:1};if(p.tag!="*"){_34b.tag=1;}if(!p.classes.length){_34b.classes=1;}var ntf=_34c(p,_34b);return function(elem){return (!ntf(elem));};},"nth-child":function(name,_34d){var pi=parseInt;if(_34d=="odd"){return _344;}else{if(_34d=="even"){return _343;}}if(_34d.indexOf("n")!=-1){var _34e=_34d.split("n",2);var pred=_34e[0]?((_34e[0]=="-")?-1:pi(_34e[0])):1;var idx=_34e[1]?pi(_34e[1]):0;var lb=0,ub=-1;if(pred>0){if(idx<0){idx=(idx%pred)&&(pred+(idx%pred));}else{if(idx>0){if(idx>=pred){lb=idx-idx%pred;}idx=idx%pred;}}}else{if(pred<0){pred*=-1;if(idx>0){ub=idx;idx=idx%pred;}}}if(pred>0){return function(elem){var i=_342(elem);return (i>=lb)&&(ub<0||i<=ub)&&((i%pred)==idx);};}else{_34d=idx;}}var _34f=pi(_34d);return function(elem){return (_342(elem)==_34f);};}};var _350=(dojo.isIE&&(dojo.isIE<9||dojo.isQuirks))?function(cond){var clc=cond.toLowerCase();if(clc=="class"){cond="className";}return function(elem){return (_319?elem.getAttribute(cond):elem[cond]||elem[clc]);};}:function(cond){return function(elem){return (elem&&elem.getAttribute&&elem.hasAttribute(cond));};};var _34c=function(_351,_352){if(!_351){return _31a;}_352=_352||{};var ff=null;if(!("el" in _352)){ff=_32d(ff,_331);}if(!("tag" in _352)){if(_351.tag!="*"){ff=_32d(ff,function(elem){return (elem&&(elem.tagName==_351.getTag()));});}}if(!("classes" in _352)){each(_351.classes,function(_353,idx,arr){var re=new RegExp("(?:^|\\s)"+_353+"(?:\\s|$)");ff=_32d(ff,function(elem){return re.test(elem.className);});ff.count=idx;});}if(!("pseudos" in _352)){each(_351.pseudos,function(_354){var pn=_354.name;if(_345[pn]){ff=_32d(ff,_345[pn](pn,_354.value));}});}if(!("attrs" in _352)){each(_351.attrs,function(attr){var _355;var a=attr.attr;if(attr.type&&_334[attr.type]){_355=_334[attr.type](a,attr.matchFor);}else{if(a.length){_355=_350(a);}}if(_355){ff=_32d(ff,_355);}});}if(!("id" in _352)){if(_351.id){ff=_32d(ff,function(elem){return (!!elem&&(elem.id==_351.id));});}}if(!ff){if(!("default" in _352)){ff=_31a;}}return ff;};var _356=function(_357){return function(node,ret,bag){while(node=node[_33d]){if(_33c&&(!_331(node))){continue;}if((!bag||_358(node,bag))&&_357(node)){ret.push(node);}break;}return ret;};};var _359=function(_35a){return function(root,ret,bag){var te=root[_33d];while(te){if(_33f(te)){if(bag&&!_358(te,bag)){break;}if(_35a(te)){ret.push(te);}}te=te[_33d];}return ret;};};var _35b=function(_35c){_35c=_35c||_31a;return function(root,ret,bag){var te,x=0,tret=root.children||root.childNodes;while(te=tret[x++]){if(_33f(te)&&(!bag||_358(te,bag))&&(_35c(te,x))){ret.push(te);}}return ret;};};var _35d=function(node,root){var pn=node.parentNode;while(pn){if(pn==root){break;}pn=pn.parentNode;}return !!pn;};var _35e={};var _35f=function(_360){var _361=_35e[_360.query];if(_361){return _361;}var io=_360.infixOper;var oper=(io?io.oper:"");var _362=_34c(_360,{el:1});var qt=_360.tag;var _363=("*"==qt);var ecs=_316()["getElementsByClassName"];if(!oper){if(_360.id){_362=(!_360.loops&&_363)?_31a:_34c(_360,{el:1,id:1});_361=function(root,arr){var te=dom.byId(_360.id,(root.ownerDocument||root));if(!te||!_362(te)){return;}if(9==root.nodeType){return _330(te,arr);}else{if(_35d(te,root)){return _330(te,arr);}}};}else{if(ecs&&/\{\s*\[native code\]\s*\}/.test(String(ecs))&&_360.classes.length&&!_317){_362=_34c(_360,{el:1,classes:1,id:1});var _364=_360.classes.join(" ");_361=function(root,arr,bag){var ret=_330(0,arr),te,x=0;var tret=root.getElementsByClassName(_364);while((te=tret[x++])){if(_362(te,root)&&_358(te,bag)){ret.push(te);}}return ret;};}else{if(!_363&&!_360.loops){_361=function(root,arr,bag){var ret=_330(0,arr),te,x=0;var tret=root.getElementsByTagName(_360.getTag());while((te=tret[x++])){if(_358(te,bag)){ret.push(te);}}return ret;};}else{_362=_34c(_360,{el:1,tag:1,id:1});_361=function(root,arr,bag){var ret=_330(0,arr),te,x=0;var tret=root.getElementsByTagName(_360.getTag());while((te=tret[x++])){if(_362(te,root)&&_358(te,bag)){ret.push(te);}}return ret;};}}}}else{var _365={el:1};if(_363){_365.tag=1;}_362=_34c(_360,_365);if("+"==oper){_361=_356(_362);}else{if("~"==oper){_361=_359(_362);}else{if(">"==oper){_361=_35b(_362);}}}}return _35e[_360.query]=_361;};var _366=function(root,_367){var _368=_330(root),qp,x,te,qpl=_367.length,bag,ret;for(var i=0;i<qpl;i++){ret=[];qp=_367[i];x=_368.length-1;if(x>0){bag={};ret.nozip=true;}var gef=_35f(qp);for(var j=0;(te=_368[j]);j++){gef(te,ret,bag);}if(!ret.length){break;}_368=ret;}return ret;};var _369={},_36a={};var _36b=function(_36c){var _36d=_31b(trim(_36c));if(_36d.length==1){var tef=_35f(_36d[0]);return function(root){var r=tef(root,[]);if(r){r.nozip=true;}return r;};}return function(root){return _366(root,_36d);};};var nua=navigator.userAgent;var wk="WebKit/";var _36e=(dojo.isWebKit&&(nua.indexOf(wk)>0)&&(parseFloat(nua.split(wk)[1])>528));var _36f=dojo.isIE?"commentStrip":"nozip";var qsa="querySelectorAll";var _370=(!!_316()[qsa]&&(!dojo.isSafari||(dojo.isSafari>3.1)||_36e));var _371=/n\+\d|([^ ])?([>~+])([^ =])?/g;var _372=function(_373,pre,ch,post){return ch?(pre?pre+" ":"")+ch+(post?" "+post:""):_373;};var _374=function(_375,_376){_375=_375.replace(_371,_372);if(_370){var _377=_36a[_375];if(_377&&!_376){return _377;}}var _378=_369[_375];if(_378){return _378;}var qcz=_375.charAt(0);var _379=(-1==_375.indexOf(" "));if((_375.indexOf("#")>=0)&&(_379)){_376=true;}var _37a=(_370&&(!_376)&&(_318.indexOf(qcz)==-1)&&(!dojo.isIE||(_375.indexOf(":")==-1))&&(!(_317&&(_375.indexOf(".")>=0)))&&(_375.indexOf(":contains")==-1)&&(_375.indexOf(":checked")==-1)&&(_375.indexOf("|=")==-1));if(_37a){var tq=(_318.indexOf(_375.charAt(_375.length-1))>=0)?(_375+" *"):_375;return _36a[_375]=function(root){try{if(!((9==root.nodeType)||_379)){throw "";}var r=root[qsa](tq);r[_36f]=true;return r;}catch(e){return _374(_375,true)(root);}};}else{var _37b=_375.split(/\s*,\s*/);return _369[_375]=((_37b.length<2)?_36b(_375):function(root){var _37c=0,ret=[],tp;while((tp=_37b[_37c++])){ret=ret.concat(_36b(tp)(root));}return ret;});}};var _37d=0;var _37e=dojo.isIE?function(node){if(_319){return (node.getAttribute("_uid")||node.setAttribute("_uid",++_37d)||_37d);}else{return node.uniqueID;}}:function(node){return (node._uid||(node._uid=++_37d));};var _358=function(node,bag){if(!bag){return 1;}var id=_37e(node);if(!bag[id]){return bag[id]=1;}return 0;};var _37f="_zipIdx";var _380=function(arr){if(arr&&arr.nozip){return arr;}var ret=[];if(!arr||!arr.length){return ret;}if(arr[0]){ret.push(arr[0]);}if(arr.length<2){return ret;}_37d++;if(dojo.isIE&&_319){var _381=_37d+"";arr[0].setAttribute(_37f,_381);for(var x=1,te;te=arr[x];x++){if(arr[x].getAttribute(_37f)!=_381){ret.push(te);}te.setAttribute(_37f,_381);}}else{if(dojo.isIE&&arr.commentStrip){try{for(var x=1,te;te=arr[x];x++){if(_331(te)){ret.push(te);}}}catch(e){}}else{if(arr[0]){arr[0][_37f]=_37d;}for(var x=1,te;te=arr[x];x++){if(arr[x][_37f]!=_37d){ret.push(te);}te[_37f]=_37d;}}}return ret;};var _382=function(_383,root){root=root||_316();var od=root.ownerDocument||root.documentElement;_319=(root.contentType&&root.contentType=="application/xml")||(dojo.isOpera&&(root.doctype||od.toString()=="[object XMLDocument]"))||(!!od)&&(dojo.isIE?od.xml:(root.xmlVersion||od.xmlVersion));var r=_374(_383)(root);if(r&&r.nozip){return r;}return _380(r);};_382.filter=function(_384,_385,root){var _386=[],_387=_31b(_385),_388=(_387.length==1&&!/[^\w#\.]/.test(_385))?_34c(_387[0]):function(node){return dojo.query(_385,root).indexOf(node)!=-1;};for(var x=0,te;te=_384[x];x++){if(_388(te)){_386.push(te);}}return _386;};return _382;});},"dojo/dnd/autoscroll":function(){define("dojo/dnd/autoscroll",["../main","../window"],function(dojo){dojo.getObject("dnd",true,dojo);dojo.dnd.getViewport=dojo.window.getBox;dojo.dnd.V_TRIGGER_AUTOSCROLL=32;dojo.dnd.H_TRIGGER_AUTOSCROLL=32;dojo.dnd.V_AUTOSCROLL_VALUE=16;dojo.dnd.H_AUTOSCROLL_VALUE=16;dojo.dnd.autoScroll=function(e){var v=dojo.window.getBox(),dx=0,dy=0;if(e.clientX<dojo.dnd.H_TRIGGER_AUTOSCROLL){dx=-dojo.dnd.H_AUTOSCROLL_VALUE;}else{if(e.clientX>v.w-dojo.dnd.H_TRIGGER_AUTOSCROLL){dx=dojo.dnd.H_AUTOSCROLL_VALUE;}}if(e.clientY<dojo.dnd.V_TRIGGER_AUTOSCROLL){dy=-dojo.dnd.V_AUTOSCROLL_VALUE;}else{if(e.clientY>v.h-dojo.dnd.V_TRIGGER_AUTOSCROLL){dy=dojo.dnd.V_AUTOSCROLL_VALUE;}}window.scrollBy(dx,dy);};dojo.dnd._validNodes={"div":1,"p":1,"td":1};dojo.dnd._validOverflow={"auto":1,"scroll":1};dojo.dnd.autoScrollNodes=function(e){var b,t,w,h,rx,ry,dx=0,dy=0,_389,_38a;for(var n=e.target;n;){if(n.nodeType==1&&(n.tagName.toLowerCase() in dojo.dnd._validNodes)){var s=dojo.getComputedStyle(n),_38b=(s.overflow.toLowerCase() in dojo.dnd._validOverflow),_38c=(s.overflowX.toLowerCase() in dojo.dnd._validOverflow),_38d=(s.overflowY.toLowerCase() in dojo.dnd._validOverflow);if(_38b||_38c||_38d){b=dojo._getContentBox(n,s);t=dojo.position(n,true);}if(_38b||_38c){w=Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL,b.w/2);rx=e.pageX-t.x;if(dojo.isWebKit||dojo.isOpera){rx+=dojo.body().scrollLeft;}dx=0;if(rx>0&&rx<b.w){if(rx<w){dx=-w;}else{if(rx>b.w-w){dx=w;}}_389=n.scrollLeft;n.scrollLeft=n.scrollLeft+dx;}}if(_38b||_38d){h=Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL,b.h/2);ry=e.pageY-t.y;if(dojo.isWebKit||dojo.isOpera){ry+=dojo.body().scrollTop;}dy=0;if(ry>0&&ry<b.h){if(ry<h){dy=-h;}else{if(ry>b.h-h){dy=h;}}_38a=n.scrollTop;n.scrollTop=n.scrollTop+dy;}}if(dx||dy){return;}}try{n=n.parentNode;}catch(x){n=null;}}dojo.dnd.autoScroll(e);};return dojo.dnd;});},"dojo/data/ItemFileWriteStore":function(){define("dojo/data/ItemFileWriteStore",["../_base/lang","../_base/declare","../_base/array","../_base/json","../_base/window","./ItemFileReadStore","../date/stamp"],function(lang,_38e,_38f,_390,_391,_392,_393){return _38e("dojo.data.ItemFileWriteStore",_392,{constructor:function(_394){this._features["dojo.data.api.Write"]=true;this._features["dojo.data.api.Notification"]=true;this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};if(!this._datatypeMap["Date"].serialize){this._datatypeMap["Date"].serialize=function(obj){return _393.toISOString(obj,{zulu:true});};}if(_394&&(_394.referenceIntegrity===false)){this.referenceIntegrity=false;}this._saveInProgress=false;},referenceIntegrity:true,_assert:function(_395){if(!_395){throw new Error("assertion failed in ItemFileWriteStore");}},_getIdentifierAttribute:function(){return this.getFeatures()["dojo.data.api.Identity"];},newItem:function(_396,_397){this._assert(!this._saveInProgress);if(!this._loadFinished){this._forceLoad();}if(typeof _396!="object"&&typeof _396!="undefined"){throw new Error("newItem() was passed something other than an object");}var _398=null;var _399=this._getIdentifierAttribute();if(_399===Number){_398=this._arrayOfAllItems.length;}else{_398=_396[_399];if(typeof _398==="undefined"){throw new Error("newItem() was not passed an identity for the new item");}if(lang.isArray(_398)){throw new Error("newItem() was not passed an single-valued identity");}}if(this._itemsByIdentity){this._assert(typeof this._itemsByIdentity[_398]==="undefined");}this._assert(typeof this._pending._newItems[_398]==="undefined");this._assert(typeof this._pending._deletedItems[_398]==="undefined");var _39a={};_39a[this._storeRefPropName]=this;_39a[this._itemNumPropName]=this._arrayOfAllItems.length;if(this._itemsByIdentity){this._itemsByIdentity[_398]=_39a;_39a[_399]=[_398];}this._arrayOfAllItems.push(_39a);var _39b=null;if(_397&&_397.parent&&_397.attribute){_39b={item:_397.parent,attribute:_397.attribute,oldValue:undefined};var _39c=this.getValues(_397.parent,_397.attribute);if(_39c&&_39c.length>0){var _39d=_39c.slice(0,_39c.length);if(_39c.length===1){_39b.oldValue=_39c[0];}else{_39b.oldValue=_39c.slice(0,_39c.length);}_39d.push(_39a);this._setValueOrValues(_397.parent,_397.attribute,_39d,false);_39b.newValue=this.getValues(_397.parent,_397.attribute);}else{this._setValueOrValues(_397.parent,_397.attribute,_39a,false);_39b.newValue=_39a;}}else{_39a[this._rootItemPropName]=true;this._arrayOfTopLevelItems.push(_39a);}this._pending._newItems[_398]=_39a;for(var key in _396){if(key===this._storeRefPropName||key===this._itemNumPropName){throw new Error("encountered bug in ItemFileWriteStore.newItem");}var _39e=_396[key];if(!lang.isArray(_39e)){_39e=[_39e];}_39a[key]=_39e;if(this.referenceIntegrity){for(var i=0;i<_39e.length;i++){var val=_39e[i];if(this.isItem(val)){this._addReferenceToMap(val,_39a,key);}}}}this.onNew(_39a,_39b);return _39a;},_removeArrayElement:function(_39f,_3a0){var _3a1=_38f.indexOf(_39f,_3a0);if(_3a1!=-1){_39f.splice(_3a1,1);return true;}return false;},deleteItem:function(item){this._assert(!this._saveInProgress);this._assertIsItem(item);var _3a2=item[this._itemNumPropName];var _3a3=this.getIdentity(item);if(this.referenceIntegrity){var _3a4=this.getAttributes(item);if(item[this._reverseRefMap]){item["backup_"+this._reverseRefMap]=lang.clone(item[this._reverseRefMap]);}_38f.forEach(_3a4,function(_3a5){_38f.forEach(this.getValues(item,_3a5),function(_3a6){if(this.isItem(_3a6)){if(!item["backupRefs_"+this._reverseRefMap]){item["backupRefs_"+this._reverseRefMap]=[];}item["backupRefs_"+this._reverseRefMap].push({id:this.getIdentity(_3a6),attr:_3a5});this._removeReferenceFromMap(_3a6,item,_3a5);}},this);},this);var _3a7=item[this._reverseRefMap];if(_3a7){for(var _3a8 in _3a7){var _3a9=null;if(this._itemsByIdentity){_3a9=this._itemsByIdentity[_3a8];}else{_3a9=this._arrayOfAllItems[_3a8];}if(_3a9){for(var _3aa in _3a7[_3a8]){var _3ab=this.getValues(_3a9,_3aa)||[];var _3ac=_38f.filter(_3ab,function(_3ad){return !(this.isItem(_3ad)&&this.getIdentity(_3ad)==_3a3);},this);this._removeReferenceFromMap(item,_3a9,_3aa);if(_3ac.length<_3ab.length){this._setValueOrValues(_3a9,_3aa,_3ac,true);}}}}}}this._arrayOfAllItems[_3a2]=null;item[this._storeRefPropName]=null;if(this._itemsByIdentity){delete this._itemsByIdentity[_3a3];}this._pending._deletedItems[_3a3]=item;if(item[this._rootItemPropName]){this._removeArrayElement(this._arrayOfTopLevelItems,item);}this.onDelete(item);return true;},setValue:function(item,_3ae,_3af){return this._setValueOrValues(item,_3ae,_3af,true);},setValues:function(item,_3b0,_3b1){return this._setValueOrValues(item,_3b0,_3b1,true);},unsetAttribute:function(item,_3b2){return this._setValueOrValues(item,_3b2,[],true);},_setValueOrValues:function(item,_3b3,_3b4,_3b5){this._assert(!this._saveInProgress);this._assertIsItem(item);this._assert(lang.isString(_3b3));this._assert(typeof _3b4!=="undefined");var _3b6=this._getIdentifierAttribute();if(_3b3==_3b6){throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");}var _3b7=this._getValueOrValues(item,_3b3);var _3b8=this.getIdentity(item);if(!this._pending._modifiedItems[_3b8]){var _3b9={};for(var key in item){if((key===this._storeRefPropName)||(key===this._itemNumPropName)||(key===this._rootItemPropName)){_3b9[key]=item[key];}else{if(key===this._reverseRefMap){_3b9[key]=lang.clone(item[key]);}else{_3b9[key]=item[key].slice(0,item[key].length);}}}this._pending._modifiedItems[_3b8]=_3b9;}var _3ba=false;if(lang.isArray(_3b4)&&_3b4.length===0){_3ba=delete item[_3b3];_3b4=undefined;if(this.referenceIntegrity&&_3b7){var _3bb=_3b7;if(!lang.isArray(_3bb)){_3bb=[_3bb];}for(var i=0;i<_3bb.length;i++){var _3bc=_3bb[i];if(this.isItem(_3bc)){this._removeReferenceFromMap(_3bc,item,_3b3);}}}}else{var _3bd;if(lang.isArray(_3b4)){_3bd=_3b4.slice(0,_3b4.length);}else{_3bd=[_3b4];}if(this.referenceIntegrity){if(_3b7){var _3bb=_3b7;if(!lang.isArray(_3bb)){_3bb=[_3bb];}var map={};_38f.forEach(_3bb,function(_3be){if(this.isItem(_3be)){var id=this.getIdentity(_3be);map[id.toString()]=true;}},this);_38f.forEach(_3bd,function(_3bf){if(this.isItem(_3bf)){var id=this.getIdentity(_3bf);if(map[id.toString()]){delete map[id.toString()];}else{this._addReferenceToMap(_3bf,item,_3b3);}}},this);for(var rId in map){var _3c0;if(this._itemsByIdentity){_3c0=this._itemsByIdentity[rId];}else{_3c0=this._arrayOfAllItems[rId];}this._removeReferenceFromMap(_3c0,item,_3b3);}}else{for(var i=0;i<_3bd.length;i++){var _3bc=_3bd[i];if(this.isItem(_3bc)){this._addReferenceToMap(_3bc,item,_3b3);}}}}item[_3b3]=_3bd;_3ba=true;}if(_3b5){this.onSet(item,_3b3,_3b7,_3b4);}return _3ba;},_addReferenceToMap:function(_3c1,_3c2,_3c3){var _3c4=this.getIdentity(_3c2);var _3c5=_3c1[this._reverseRefMap];if(!_3c5){_3c5=_3c1[this._reverseRefMap]={};}var _3c6=_3c5[_3c4];if(!_3c6){_3c6=_3c5[_3c4]={};}_3c6[_3c3]=true;},_removeReferenceFromMap:function(_3c7,_3c8,_3c9){var _3ca=this.getIdentity(_3c8);var _3cb=_3c7[this._reverseRefMap];var _3cc;if(_3cb){for(_3cc in _3cb){if(_3cc==_3ca){delete _3cb[_3cc][_3c9];if(this._isEmpty(_3cb[_3cc])){delete _3cb[_3cc];}}}if(this._isEmpty(_3cb)){delete _3c7[this._reverseRefMap];}}},_dumpReferenceMap:function(){var i;for(i=0;i<this._arrayOfAllItems.length;i++){var item=this._arrayOfAllItems[i];if(item&&item[this._reverseRefMap]){}}},_getValueOrValues:function(item,_3cd){var _3ce=undefined;if(this.hasAttribute(item,_3cd)){var _3cf=this.getValues(item,_3cd);if(_3cf.length==1){_3ce=_3cf[0];}else{_3ce=_3cf;}}return _3ce;},_flatten:function(_3d0){if(this.isItem(_3d0)){return {_reference:this.getIdentity(_3d0)};}else{if(typeof _3d0==="object"){for(var type in this._datatypeMap){var _3d1=this._datatypeMap[type];if(lang.isObject(_3d1)&&!lang.isFunction(_3d1)){if(_3d0 instanceof _3d1.type){if(!_3d1.serialize){throw new Error("ItemFileWriteStore: No serializer defined for type mapping: ["+type+"]");}return {_type:type,_value:_3d1.serialize(_3d0)};}}else{if(_3d0 instanceof _3d1){return {_type:type,_value:_3d0.toString()};}}}}return _3d0;}},_getNewFileContentString:function(){var _3d2={};var _3d3=this._getIdentifierAttribute();if(_3d3!==Number){_3d2.identifier=_3d3;}if(this._labelAttr){_3d2.label=this._labelAttr;}_3d2.items=[];for(var i=0;i<this._arrayOfAllItems.length;++i){var item=this._arrayOfAllItems[i];if(item!==null){var _3d4={};for(var key in item){if(key!==this._storeRefPropName&&key!==this._itemNumPropName&&key!==this._reverseRefMap&&key!==this._rootItemPropName){var _3d5=this.getValues(item,key);if(_3d5.length==1){_3d4[key]=this._flatten(_3d5[0]);}else{var _3d6=[];for(var j=0;j<_3d5.length;++j){_3d6.push(this._flatten(_3d5[j]));_3d4[key]=_3d6;}}}}_3d2.items.push(_3d4);}}var _3d7=true;return _390.toJson(_3d2,_3d7);},_isEmpty:function(_3d8){var _3d9=true;if(lang.isObject(_3d8)){var i;for(i in _3d8){_3d9=false;break;}}else{if(lang.isArray(_3d8)){if(_3d8.length>0){_3d9=false;}}}return _3d9;},save:function(_3da){this._assert(!this._saveInProgress);this._saveInProgress=true;var self=this;var _3db=function(){self._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};self._saveInProgress=false;if(_3da&&_3da.onComplete){var _3dc=_3da.scope||_391.global;_3da.onComplete.call(_3dc);}};var _3dd=function(err){self._saveInProgress=false;if(_3da&&_3da.onError){var _3de=_3da.scope||_391.global;_3da.onError.call(_3de,err);}};if(this._saveEverything){var _3df=this._getNewFileContentString();this._saveEverything(_3db,_3dd,_3df);}if(this._saveCustom){this._saveCustom(_3db,_3dd);}if(!this._saveEverything&&!this._saveCustom){_3db();}},revert:function(){this._assert(!this._saveInProgress);var _3e0;for(_3e0 in this._pending._modifiedItems){var _3e1=this._pending._modifiedItems[_3e0];var _3e2=null;if(this._itemsByIdentity){_3e2=this._itemsByIdentity[_3e0];}else{_3e2=this._arrayOfAllItems[_3e0];}_3e1[this._storeRefPropName]=this;for(var key in _3e2){delete _3e2[key];}lang.mixin(_3e2,_3e1);}var _3e3;for(_3e0 in this._pending._deletedItems){_3e3=this._pending._deletedItems[_3e0];_3e3[this._storeRefPropName]=this;var _3e4=_3e3[this._itemNumPropName];if(_3e3["backup_"+this._reverseRefMap]){_3e3[this._reverseRefMap]=_3e3["backup_"+this._reverseRefMap];delete _3e3["backup_"+this._reverseRefMap];}this._arrayOfAllItems[_3e4]=_3e3;if(this._itemsByIdentity){this._itemsByIdentity[_3e0]=_3e3;}if(_3e3[this._rootItemPropName]){this._arrayOfTopLevelItems.push(_3e3);}}for(_3e0 in this._pending._deletedItems){_3e3=this._pending._deletedItems[_3e0];if(_3e3["backupRefs_"+this._reverseRefMap]){_38f.forEach(_3e3["backupRefs_"+this._reverseRefMap],function(_3e5){var _3e6;if(this._itemsByIdentity){_3e6=this._itemsByIdentity[_3e5.id];}else{_3e6=this._arrayOfAllItems[_3e5.id];}this._addReferenceToMap(_3e6,_3e3,_3e5.attr);},this);delete _3e3["backupRefs_"+this._reverseRefMap];}}for(_3e0 in this._pending._newItems){var _3e7=this._pending._newItems[_3e0];_3e7[this._storeRefPropName]=null;this._arrayOfAllItems[_3e7[this._itemNumPropName]]=null;if(_3e7[this._rootItemPropName]){this._removeArrayElement(this._arrayOfTopLevelItems,_3e7);}if(this._itemsByIdentity){delete this._itemsByIdentity[_3e0];}}this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};return true;},isDirty:function(item){if(item){var _3e8=this.getIdentity(item);return new Boolean(this._pending._newItems[_3e8]||this._pending._modifiedItems[_3e8]||this._pending._deletedItems[_3e8]).valueOf();}else{return !this._isEmpty(this._pending._newItems)||!this._isEmpty(this._pending._modifiedItems)||!this._isEmpty(this._pending._deletedItems);}},onSet:function(item,_3e9,_3ea,_3eb){},onNew:function(_3ec,_3ed){},onDelete:function(_3ee){},close:function(_3ef){if(this.clearOnClose){if(!this.isDirty()){this.inherited(arguments);}else{throw new Error("dojo.data.ItemFileWriteStore: There are unsaved changes present in the store. Please save or revert the changes before invoking close.");}}}});});},"dijit/form/_RadioButtonMixin":function(){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(_3f0,_3f1,_3f2,_3f3,lang,_3f4,win,_3f5){return _3f1("dijit.form._RadioButtonMixin",null,{type:"radio",_getRelatedWidgets:function(){var ary=[];_3f4("input[type=radio]",this.focusNode.form||win.doc).forEach(lang.hitch(this,function(_3f6){if(_3f6.name==this.name&&_3f6.form==this.focusNode.form){var _3f7=_3f5.getEnclosingWidget(_3f6);if(_3f7){ary.push(_3f7);}}}));return ary;},_setCheckedAttr:function(_3f8){this.inherited(arguments);if(!this._created){return;}if(_3f8){_3f0.forEach(this._getRelatedWidgets(),lang.hitch(this,function(_3f9){if(_3f9!=this&&_3f9.checked){_3f9.set("checked",false);}}));}},_onClick:function(e){if(this.checked||this.disabled){_3f3.stop(e);return false;}if(this.readOnly){_3f3.stop(e);_3f0.forEach(this._getRelatedWidgets(),lang.hitch(this,function(_3fa){_3f2.set(this.focusNode||this.domNode,"checked",_3fa.checked);}));return false;}return this.inherited(arguments);}});});},"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","dojo/dnd/TimedMoveable":function(){define("dojo/dnd/TimedMoveable",["../main","./Moveable"],function(dojo){var _3fb=dojo.dnd.Moveable.prototype.onMove;dojo.declare("dojo.dnd.TimedMoveable",dojo.dnd.Moveable,{timeout:40,constructor:function(node,_3fc){if(!_3fc){_3fc={};}if(_3fc.timeout&&typeof _3fc.timeout=="number"&&_3fc.timeout>=0){this.timeout=_3fc.timeout;}},onMoveStop:function(_3fd){if(_3fd._timer){clearTimeout(_3fd._timer);_3fb.call(this,_3fd,_3fd._leftTop);}dojo.dnd.Moveable.prototype.onMoveStop.apply(this,arguments);},onMove:function(_3fe,_3ff){_3fe._leftTop=_3ff;if(!_3fe._timer){var _400=this;_3fe._timer=setTimeout(function(){_3fe._timer=null;_3fb.call(_400,_3fe,_3fe._leftTop);},this.timeout);}}});return dojo.dnd.TimedMoveable;});},"dojo/NodeList-fx":function(){define("dojo/NodeList-fx",["dojo/_base/NodeList","./_base/lang","./_base/connect","./_base/fx","./fx"],function(_401,lang,_402,_403,_404){lang.extend(_401,{_anim:function(obj,_405,args){args=args||{};var a=_404.combine(this.map(function(item){var _406={node:item};lang.mixin(_406,args);return obj[_405](_406);}));return args.auto?a.play()&&this:a;},wipeIn:function(args){return this._anim(_404,"wipeIn",args);},wipeOut:function(args){return this._anim(_404,"wipeOut",args);},slideTo:function(args){return this._anim(_404,"slideTo",args);},fadeIn:function(args){return this._anim(_403,"fadeIn",args);},fadeOut:function(args){return this._anim(_403,"fadeOut",args);},animateProperty:function(args){return this._anim(_403,"animateProperty",args);},anim:function(_407,_408,_409,_40a,_40b){var _40c=_404.combine(this.map(function(item){return _403.animateProperty({node:item,properties:_407,duration:_408||350,easing:_409});}));if(_40a){_402.connect(_40c,"onEnd",_40a);}return _40c.play(_40b||0);}});return _401;});},"dijit/form/_ListMouseMixin":function(){define("dijit/form/_ListMouseMixin",["dojo/_base/declare","dojo/_base/event","dojo/touch","./_ListBase"],function(_40d,_40e,_40f,_410){return _40d("dijit.form._ListMouseMixin",_410,{postCreate:function(){this.inherited(arguments);this.connect(this.domNode,_40f.press,"_onMouseDown");this.connect(this.domNode,_40f.release,"_onMouseUp");this.connect(this.domNode,"onmouseover","_onMouseOver");this.connect(this.domNode,"onmouseout","_onMouseOut");},_onMouseDown:function(evt){_40e.stop(evt);if(this._hoveredNode){this.onUnhover(this._hoveredNode);this._hoveredNode=null;}this._isDragging=true;this._setSelectedAttr(this._getTarget(evt));},_onMouseUp:function(evt){_40e.stop(evt);this._isDragging=false;var _411=this._getSelectedAttr();var _412=this._getTarget(evt);var _413=this._hoveredNode;if(_411&&_412==_411){this.onClick(_411);}else{if(_413&&_412==_413){this._setSelectedAttr(_413);this.onClick(_413);}}},_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(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);}}}}});});},"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","dojo/cookie":function(){define("dojo/cookie",["./_base/kernel","./regexp"],function(dojo,_414){dojo.cookie=function(name,_415,_416){var c=document.cookie,ret;if(arguments.length==1){var _417=c.match(new RegExp("(?:^|; )"+_414.escapeString(name)+"=([^;]*)"));ret=_417?decodeURIComponent(_417[1]):undefined;}else{_416=_416||{};var exp=_416.expires;if(typeof exp=="number"){var d=new Date();d.setTime(d.getTime()+exp*24*60*60*1000);exp=_416.expires=d;}if(exp&&exp.toUTCString){_416.expires=exp.toUTCString();}_415=encodeURIComponent(_415);var _418=name+"="+_415,_419;for(_419 in _416){_418+="; "+_419;var _41a=_416[_419];if(_41a!==true){_418+="="+_41a;}}document.cookie=_418;}return ret;};dojo.cookie.isSupported=function(){if(!("cookieEnabled" in navigator)){this("__djCookieTest__","CookiesAllowed");navigator.cookieEnabled=this("__djCookieTest__")=="CookiesAllowed";if(navigator.cookieEnabled){this("__djCookieTest__","",{expires:-1});}}return navigator.cookieEnabled;};return dojo.cookie;});},"dojo/cache":function(){define("dojo/cache",["./_base/kernel","./text"],function(dojo,text){return dojo.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","dijit/ProgressBar":function(){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(_41b,_41c,_41d,lang,_41e,_41f,_420,_421){return _41c("dijit.ProgressBar",[_41f,_420],{progress:"0",value:"",maximum:100,places:0,indeterminate:false,label:"",name:"",templateString:_421,_indeterminateHighContrastImagePath:_41b.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(_422){lang.mixin(this,_422||{});var tip=this.internalProgress,ap=this.domNode;var _423=1;if(this.indeterminate){ap.removeAttribute("aria-valuenow");ap.removeAttribute("aria-valuemin");ap.removeAttribute("aria-valuemax");}else{if(String(this.progress).indexOf("%")!=-1){_423=Math.min(parseFloat(this.progress)/100,1);this.progress=_423*this.maximum;}else{this.progress=Math.min(this.progress,this.maximum);_423=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(_423);_41d.toggle(this.domNode,"dijitProgressBarIndeterminate",this.indeterminate);tip.style.width=(_423*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(_424){this._set("label",_424);this.update();},_setIndeterminateAttr:function(_425){this.indeterminate=_425;this.update();},report:function(_426){return this.label?this.label:(this.indeterminate?"&#160;":_41e.format(_426,{type:"percent",places:this.places,locale:this.lang}));},onChange:function(){}});});},"dijit/_base/popup":function(){define("dijit/_base/popup",["dojo/dom-class","../popup","../BackgroundIframe"],function(_427,_428){var _429=_428._createWrapper;_428._createWrapper=function(_42a){if(!_42a.declaredClass){_42a={_popupWrapper:(_42a.parentNode&&_427.contains(_42a.parentNode,"dijitPopup"))?_42a.parentNode:null,domNode:_42a,destroy:function(){}};}return _429.call(this,_42a);};var _42b=_428.open;_428.open=function(args){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 _42b.call(this,args);};return _428;});},"dijit/ColorPalette":function(){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(_42c,_42d,_42e,_42f,_430,i18n,_431,_432,_433,_434,win,_435){var _436=_432("dijit.ColorPalette",[_42e,_42f,_430],{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:_42d,baseClass:"dijitColorPalette",_dyeFactory:function(_437,row,col){return new this._dyeClass(_437,row,col);},buildRendering:function(){this.inherited(arguments);this._dyeClass=_432(_436._Color,{hc:_433.contains(win.body(),"dijit_a11y"),palette:this.palette});this._preparePalette(this._palettes[this.palette],i18n.getLocalization("dojo","colors",this.lang));}});_436._Color=_432("dijit._Color",_431,{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":_42c.toUrl("./themes/a11y/colors7x10.png"),"3x4":_42c.toUrl("./themes/a11y/colors3x4.png")},constructor:function(_438,row,col){this._alias=_438;this._row=row;this._col=col;this.setColor(_431.named[_438]);},getValue:function(){return this.toHex();},fillCell:function(cell,_439){var html=_435.substitute(this.hc?this.hcTemplate:this.template,{color:this.toHex(),blankGif:_439,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"});_434.place(html,cell);}});return _436;});},"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","dojo/_base/url":function(){define("dojo/_base/url",["./kernel"],function(dojo){var ore=new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),ire=new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"),_43a=function(){var n=null,_43b=arguments,uri=[_43b[0]];for(var i=1;i<_43b.length;i++){if(!_43b[i]){continue;}var _43c=new _43a(_43b[i]+""),_43d=new _43a(uri[0]+"");if(_43c.path==""&&!_43c.scheme&&!_43c.authority&&!_43c.query){if(_43c.fragment!=n){_43d.fragment=_43c.fragment;}_43c=_43d;}else{if(!_43c.scheme){_43c.scheme=_43d.scheme;if(!_43c.authority){_43c.authority=_43d.authority;if(_43c.path.charAt(0)!="/"){var path=_43d.path.substring(0,_43d.path.lastIndexOf("/")+1)+_43c.path;var segs=path.split("/");for(var j=0;j<segs.length;j++){if(segs[j]=="."){if(j==segs.length-1){segs[j]="";}else{segs.splice(j,1);j--;}}else{if(j>0&&!(j==1&&segs[0]=="")&&segs[j]==".."&&segs[j-1]!=".."){if(j==(segs.length-1)){segs.splice(j,1);segs[j-1]="";}else{segs.splice(j-1,2);j-=2;}}}}_43c.path=segs.join("/");}}}}uri=[];if(_43c.scheme){uri.push(_43c.scheme,":");}if(_43c.authority){uri.push("//",_43c.authority);}uri.push(_43c.path);if(_43c.query){uri.push("?",_43c.query);}if(_43c.fragment){uri.push("#",_43c.fragment);}}this.uri=uri.join("");var r=this.uri.match(ore);this.scheme=r[2]||(r[1]?"":n);this.authority=r[4]||(r[3]?"":n);this.path=r[5];this.query=r[7]||(r[6]?"":n);this.fragment=r[9]||(r[8]?"":n);if(this.authority!=n){r=this.authority.match(ire);this.user=r[3]||n;this.password=r[4]||n;this.host=r[6]||r[7];this.port=r[9]||n;}};_43a.prototype.toString=function(){return this.uri;};return dojo._Url=_43a;});},"dojo/text":function(){define("dojo/text",["./_base/kernel","require","./has","./_base/xhr"],function(dojo,_43e,has,xhr){var _43f;if(1){_43f=function(url,sync,load){xhr("GET",{url:url,sync:!!sync,load:load});};}else{if(_43e.getText){_43f=_43e.getText;}else{console.error("dojo/text plugin failed to load because loader does not support getText");}}var _440={},_441=function(text){if(text){text=text.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _442=text.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_442){text=_442[1];}}else{text="";}return text;},_443={},_444={},_445={dynamic:true,normalize:function(id,_446){var _447=id.split("!"),url=_447[0];return (/^\./.test(url)?_446(url):url)+(_447[1]?"!"+_447[1]:"");},load:function(id,_448,load){var _449=id.split("!"),_44a=_449.length>1,_44b=_449[0],url=_448.toUrl(_449[0]),text=_443,_44c=function(text){load(_44a?_441(text):text);};if(_44b in _440){text=_440[_44b];}else{if(url in _448.cache){text=_448.cache[url];}else{if(url in _440){text=_440[url];}}}if(text===_443){if(_444[url]){_444[url].push(_44c);}else{var _44d=_444[url]=[_44c];_43f(url,!_448.async,function(text){_440[_44b]=_440[url]=text;for(var i=0;i<_44d.length;){_44d[i++](text);}delete _444[url];});}}else{_44c(text);}}};dojo.cache=function(_44e,url,_44f){var key;if(typeof _44e=="string"){if(/\//.test(_44e)){key=_44e;_44f=url;}else{key=_43e.toUrl(_44e.replace(/\./g,"/")+(url?("/"+url):""));}}else{key=_44e+"";_44f=url;}var val=(_44f!=undefined&&typeof _44f!="string")?_44f.value:_44f,_450=_44f&&_44f.sanitize;if(typeof val=="string"){_440[key]=val;return _450?_441(val):val;}else{if(val===null){delete _440[key];return null;}else{if(!(key in _440)){_43f(key,true,function(text){_440[key]=text;});}return _450?_441(_440[key]):_440[key];}}};return _445;});},"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","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","dojo/uacss":function(){define("dojo/uacss",["./dom-geometry","./_base/lang","./ready","./_base/sniff","./_base/window"],function(_451,lang,_452,has,_453){var html=_453.doc.documentElement,ie=has("ie"),_454=has("opera"),maj=Math.floor,ff=has("ff"),_455=_451.boxModel.replace(/-/,""),_456={"dj_ie":ie,"dj_ie6":maj(ie)==6,"dj_ie7":maj(ie)==7,"dj_ie8":maj(ie)==8,"dj_ie9":maj(ie)==9,"dj_quirks":has("quirks"),"dj_iequirks":ie&&has("quirks"),"dj_opera":_454,"dj_khtml":has("khtml"),"dj_webkit":has("webkit"),"dj_safari":has("safari"),"dj_chrome":has("chrome"),"dj_gecko":has("mozilla"),"dj_ff3":maj(ff)==3};_456["dj_"+_455]=true;var _457="";for(var clz in _456){if(_456[clz]){_457+=clz+" ";}}html.className=lang.trim(html.className+" "+_457);_452(90,function(){if(!_451.isBodyLtr()){var _458="dj_rtl dijitRtl "+_457.replace(/ /g,"-rtl ");html.className=lang.trim(html.className+" "+_458+"dj_rtl dijitRtl "+_457.replace(/ /g,"-rtl "));}});return has;});},"dijit/Tooltip":function(){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(_459,_45a,fx,dom,_45b,_45c,_45d,lang,has,win,_45e,_45f,_460,_461,_462,_463,_464){var _465=_45a("dijit._MasterTooltip",[_460,_461],{duration:_45e.defaultDuration,templateString:_463,postCreate:function(){win.body().appendChild(this.domNode);this.bgIframe=new _462(this.domNode);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(_466,_467,_468,rtl,_469){if(this.aroundNode&&this.aroundNode===_467&&this.containerNode.innerHTML==_466){return;}this.domNode.width="auto";if(this.fadeOut.status()=="playing"){this._onDeck=arguments;return;}this.containerNode.innerHTML=_466;this.set("textDir",_469);this.containerNode.align=rtl?"right":"left";var pos=_45f.around(this.domNode,_467,_468&&_468.length?_468:_46a.defaultPosition,!rtl,lang.hitch(this,"orient"));var _46b=pos.aroundNodePos;if(pos.corner.charAt(0)=="M"&&pos.aroundCorner.charAt(0)=="M"){this.connectorNode.style.top=_46b.y+((_46b.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=_46b.x+((_46b.w-this.connectorNode.offsetWidth)>>1)-pos.x+"px";}}_45d.set(this.domNode,"opacity",0);this.fadeIn.play();this.isShowingNow=true;this.aroundNode=_467;},orient:function(node,_46c,_46d,_46e,_46f){this.connectorNode.style.top="";var _470=_46e.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"}[_46c+"-"+_46d];this.domNode.style.width="auto";var size=_45c.getContentBox(this.domNode);var _471=Math.min((Math.max(_470,1)),size.w);var _472=_471<size.w;this.domNode.style.width=_471+"px";if(_472){this.containerNode.style.overflow="auto";var _473=this.containerNode.scrollWidth;this.containerNode.style.overflow="visible";if(_473>_471){_473=_473+_45d.get(this.domNode,"paddingLeft")+_45d.get(this.domNode,"paddingRight");this.domNode.style.width=_473+"px";}}if(_46d.charAt(0)=="B"&&_46c.charAt(0)=="B"){var mb=_45c.getMarginBox(node);var _474=this.connectorNode.offsetHeight;if(mb.h>_46e.h){var _475=_46e.h-((_46f.h+_474)>>1);this.connectorNode.style.top=_475+"px";this.connectorNode.style.bottom="";}else{this.connectorNode.style.bottom=Math.min(Math.max(_46f.h/2-_474/2,0),mb.h-_474)+"px";this.connectorNode.style.top="";}}else{this.connectorNode.style.top="";this.connectorNode.style.bottom="";}return Math.max(0,size.w-_470);},_onShow:function(){if(has("ie")){this.domNode.style.filter="";}},hide:function(_476){if(this._onDeck&&this._onDeck[1]==_476){this._onDeck=null;}else{if(this.aroundNode===_476){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(node){this.applyTextDir(node,has("ie")?node.outerText:node.textContent);_459.forEach(node.children,function(_477){this._setAutoTextDir(_477);},this);},_setTextDirAttr:function(_478){this._set("textDir",typeof _478!="undefined"?_478:"");if(_478=="auto"){this._setAutoTextDir(this.containerNode);}else{this.containerNode.dir=this.textDir;}}});_464.showTooltip=function(_479,_47a,_47b,rtl,_47c){if(_47b){_47b=_459.map(_47b,function(val){return {after:"after-centered",before:"before-centered"}[val]||val;});}if(!_46a._masterTT){_464._masterTT=_46a._masterTT=new _465();}return _46a._masterTT.show(_479,_47a,_47b,rtl,_47c);};_464.hideTooltip=function(_47d){return _46a._masterTT&&_46a._masterTT.hide(_47d);};var _46a=_45a("dijit.Tooltip",_460,{label:"",showDelay:400,connectId:[],position:[],_setConnectIdAttr:function(_47e){_459.forEach(this._connections||[],function(_47f){_459.forEach(_47f,lang.hitch(this,"disconnect"));},this);this._connectIds=_459.filter(lang.isArrayLike(_47e)?_47e:(_47e?[_47e]:[]),function(id){return dom.byId(id);});this._connections=_459.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",_47e);},addTarget:function(node){var id=node.id||node;if(_459.indexOf(this._connectIds,id)==-1){this.set("connectId",this._connectIds.concat(id));}},removeTarget:function(node){var id=node.id||node,idx=_459.indexOf(this._connectIds,id);if(idx>=0){this._connectIds.splice(idx,1);this.set("connectId",this._connectIds);}},buildRendering:function(){this.inherited(arguments);_45b.add(this.domNode,"dijitTooltipData");},startup:function(){this.inherited(arguments);var ids=this.connectId;_459.forEach(lang.isArrayLike(ids)?ids:[ids],this.addTarget,this);},_onHover:function(e){if(!this._showTimer){var _480=e.target;this._showTimer=setTimeout(lang.hitch(this,function(){this.open(_480);}),this.showDelay);}},_onUnHover:function(){if(this._focus){return;}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}this.close();},open:function(_481){if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}_46a.show(this.label||this.domNode.innerHTML,_481,this.position,!this.isLeftToRight(),this.textDir);this._connectNode=_481;this.onShow(_481,this.position);},close:function(){if(this._connectNode){_46a.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);}});_46a._MasterTooltip=_465;_46a.show=_464.showTooltip;_46a.hide=_464.hideTooltip;_46a.defaultPosition=["after-centered","before-centered"];return _46a;});},"dojo/string":function(){define("dojo/string",["./_base/kernel","./_base/lang"],function(dojo,lang){lang.getObject("string",true,dojo);dojo.string.rep=function(str,num){if(num<=0||!str){return "";}var buf=[];for(;;){if(num&1){buf.push(str);}if(!(num>>=1)){break;}str+=str;}return buf.join("");};dojo.string.pad=function(text,size,ch,end){if(!ch){ch="0";}var out=String(text),pad=dojo.string.rep(ch,Math.ceil((size-out.length)/ch.length));return end?out+pad:pad+out;};dojo.string.substitute=function(_482,map,_483,_484){_484=_484||dojo.global;_483=_483?lang.hitch(_484,_483):function(v){return v;};return _482.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_485,key,_486){var _487=lang.getObject(key,false,map);if(_486){_487=lang.getObject(_486,false,_484).call(_484,_487,key);}return _483(_487,key).toString();});};dojo.string.trim=String.prototype.trim?lang.trim:function(str){str=str.replace(/^\s+/,"");for(var i=str.length-1;i>=0;i--){if(/\S/.test(str.charAt(i))){str=str.substring(0,i+1);break;}}return str;};return dojo.string;});},"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>","dijit/dijit":function(){define("dijit/dijit",[".","./_base","dojo/parser","./_Widget","./_TemplatedMixin","./_Container","./layout/_LayoutWidget","./form/_FormWidget","./form/_FormValueWidget"],function(_488){return _488;});},"dijit/form/DropDownButton":function(){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(_489,lang,_48a,_48b,_48c,_48d,_48e,_48f,_490){return _489("dijit.form.DropDownButton",[_48d,_48e,_48f],{baseClass:"dijitDropDownButton",templateString:_490,_fillContent:function(){if(this.srcNodeRef){var _491=_48a("*",this.srcNodeRef);this.inherited(arguments,[_491[0]]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}if(!this.dropDown&&this.dropDownContainer){var _492=_48a("[widgetId]",this.dropDownContainer)[0];this.dropDown=_48b.byNode(_492);delete this.dropDownContainer;}if(this.dropDown){_48c.hide(this.dropDown);}this.inherited(arguments);},isLoaded:function(){var _493=this.dropDown;return (!!_493&&(!_493.href||_493.isLoaded));},loadDropDown:function(_494){var _495=this.dropDown;var _496=_495.on("load",lang.hitch(this,function(){_496.remove();_494();}));_495.refresh();},isFocusable:function(){return this.inherited(arguments)&&!this._mouseDown;}});});},"dijit/form/_FormValueMixin":function(){define("dijit/form/_FormValueMixin",["dojo/_base/declare","dojo/dom-attr","dojo/keys","dojo/_base/sniff","./_FormWidgetMixin"],function(_497,_498,keys,has,_499){return _497("dijit.form._FormValueMixin",_499,{readOnly:false,_setReadOnlyAttr:function(_49a){_498.set(this.focusNode,"readOnly",_49a);this.focusNode.setAttribute("aria-readonly",_49a);this._set("readOnly",_49a);},postCreate:function(){this.inherited(arguments);if(has("ie")){this.connect(this.focusNode||this.domNode,"onkeydown",this._onKeyDown);}if(this._resetValue===undefined){this._lastValueReported=this._resetValue=this.value;}},_setValueAttr:function(_49b,_49c){this._handleOnChange(_49b,_49c);},_handleOnChange:function(_49d,_49e){this._set("value",_49d);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==keys.ESCAPE&&!(e.ctrlKey||e.altKey||e.metaKey)){var te;if(has("ie")<9||(has("ie")&&has("quirks"))){e.preventDefault();te=document.createEventObject();te.keyCode=keys.ESCAPE;te.shiftKey=e.shiftKey;e.srcElement.fireEvent("onkeypress",te);}}}});});},"dijit/form/_FormWidgetMixin":function(){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(_49f,_4a0,_4a1,_4a2,lang,_4a3,has,win,_4a4,a11y){return _4a0("dijit.form._FormWidgetMixin",null,{name:"",alt:"",value:"",type:"text",tabIndex:"0",_setTabIndexAttr:"focusNode",disabled:false,intermediateChanges:false,scrollOnFocus:true,_setIdAttr:"focusNode",_setDisabledAttr:function(_4a5){this._set("disabled",_4a5);_4a1.set(this.focusNode,"disabled",_4a5);if(this.valueNode){_4a1.set(this.valueNode,"disabled",_4a5);}this.focusNode.setAttribute("aria-disabled",_4a5?"true":"false");if(_4a5){this._set("hovering",false);this._set("active",false);var _4a6="tabIndex" in this.attributeMap?this.attributeMap.tabIndex:("_setTabIndexAttr" in this)?this._setTabIndexAttr:"focusNode";_49f.forEach(lang.isArray(_4a6)?_4a6:[_4a6],function(_4a7){var node=this[_4a7];if(has("webkit")||a11y.hasDefaultTabStop(node)){node.setAttribute("tabIndex","-1");}else{node.removeAttribute("tabIndex");}},this);}else{if(this.tabIndex!=""){this.set("tabIndex",this.tabIndex);}}},_onFocus:function(by){if(by=="mouse"&&this.isFocusable()){var _4a8=this.connect(this.focusNode,"onfocus",function(){this.disconnect(_4a9);this.disconnect(_4a8);});var _4a9=this.connect(win.body(),"onmouseup",function(){this.disconnect(_4a9);this.disconnect(_4a8);if(this.focused){this.focus();}});}if(this.scrollOnFocus){this.defer(function(){_4a4.scrollIntoView(this.domNode);});}this.inherited(arguments);},isFocusable:function(){return !this.disabled&&this.focusNode&&(_4a2.get(this.domNode,"display")!="none");},focus:function(){if(!this.disabled&&this.focusNode.focus){try{this.focusNode.focus();}catch(e){}}},compare:function(val1,val2){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(){},_onChangeActive:false,_handleOnChange:function(_4aa,_4ab){if(this._lastValueReported==undefined&&(_4ab===null||!this._onChangeActive)){this._resetValue=this._lastValueReported=_4aa;}this._pendingOnChange=this._pendingOnChange||(typeof _4aa!=typeof this._lastValueReported)||(this.compare(_4aa,this._lastValueReported)!=0);if((this.intermediateChanges||_4ab||_4ab===undefined)&&this._pendingOnChange){this._lastValueReported=_4aa;this._pendingOnChange=false;if(this._onChangeActive){if(this._onChangeHandle){this._onChangeHandle.remove();}this._onChangeHandle=this.defer(function(){this._onChangeHandle=null;this.onChange(_4aa);});}}},create:function(){this.inherited(arguments);this._onChangeActive=true;},destroy:function(){if(this._onChangeHandle){this._onChangeHandle.remove();this.onChange(this._lastValueReported);}this.inherited(arguments);}});});},"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","dijit/layout/_ContentPaneResizeMixin":function(){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(_4ac,_4ad,_4ae,_4af,_4b0,lang,_4b1,has,win,_4b2,_4b3,_4b4){return _4ad("dijit.layout._ContentPaneResizeMixin",null,{doLayout:true,isLayoutContainer:true,startup:function(){if(this._started){return;}var _4b5=this.getParent();this._childOfLayoutWidget=_4b5&&_4b5.isLayoutContainer;this._needLayout=!this._childOfLayoutWidget;this.inherited(arguments);if(this._isShown()){this._onShow();}if(!this._childOfLayoutWidget){this.connect(has("ie")?this.domNode:win.global,"onresize",function(){this._needLayout=!this._childOfLayoutWidget;this.resize();});}},_checkIfSingleChild:function(){var _4b6=_4b1("> *",this.containerNode).filter(function(node){return node.tagName!=="SCRIPT";}),_4b7=_4b6.filter(function(node){return _4ae.has(node,"data-dojo-type")||_4ae.has(node,"dojoType")||_4ae.has(node,"widgetId");}),_4b8=_4ac.filter(_4b7.map(_4b2.byNode),function(_4b9){return _4b9&&_4b9.domNode&&_4b9.resize;});if(_4b6.length==_4b7.length&&_4b8.length==1){this._singleChild=_4b8[0];}else{delete this._singleChild;}_4af.toggle(this.containerNode,this.baseClass+"SingleChild",!!this._singleChild);},resize:function(_4ba,_4bb){if(!this._wasShown&&this.open!==false){this._onShow();}this._resizeCalled=true;this._scheduleLayout(_4ba,_4bb);},_scheduleLayout:function(_4bc,_4bd){if(this._isShown()){this._layout(_4bc,_4bd);}else{this._needLayout=true;this._changeSize=_4bc;this._resultSize=_4bd;}},_layout:function(_4be,_4bf){if(_4be){_4b0.setMarginBox(this.domNode,_4be);}var cn=this.containerNode;if(cn===this.domNode){var mb=_4bf||{};lang.mixin(mb,_4be||{});if(!("h" in mb)||!("w" in mb)){mb=lang.mixin(_4b0.getMarginBox(cn),mb);}this._contentBox=_4b3.marginBox2contentBox(cn,mb);}else{this._contentBox=_4b0.getContentBox(cn);}this._layoutChildren();delete this._needLayout;},_layoutChildren:function(){if(this.doLayout){this._checkIfSingleChild();}if(this._singleChild&&this._singleChild.resize){var cb=this._contentBox||_4b0.getContentBox(this.containerNode);this._singleChild.resize({w:cb.w,h:cb.h});}else{_4ac.forEach(this.getChildren(),function(_4c0){if(_4c0.resize){_4c0.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 node=this.domNode,_4c1=this.domNode.parentNode;return (node.style.display!="none")&&(node.style.visibility!="hidden")&&!_4af.contains(node,"dijitHidden")&&_4c1&&_4c1.style&&(_4c1.style.display!="none");}}},_onShow:function(){if(this._needLayout){this._layout(this._changeSize,this._resultSize);}this.inherited(arguments);this._wasShown=true;}});});},"dijit/WidgetSet":function(){define("dijit/WidgetSet",["dojo/_base/array","dojo/_base/declare","dojo/_base/window","./registry"],function(_4c2,_4c3,win,_4c4){var _4c5=_4c3("dijit.WidgetSet",null,{constructor:function(){this._hash={};this.length=0;},add:function(_4c6){if(this._hash[_4c6.id]){throw new Error("Tried to register widget with id=="+_4c6.id+" but that id is already registered");}this._hash[_4c6.id]=_4c6;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(func,_4c7){_4c7=_4c7||win.global;var i=0,id;for(id in this._hash){func.call(_4c7,this._hash[id],i++,this._hash);}return this;},filter:function(_4c8,_4c9){_4c9=_4c9||win.global;var res=new _4c5(),i=0,id;for(id in this._hash){var w=this._hash[id];if(_4c8.call(_4c9,w,i++,this._hash)){res.add(w);}}return res;},byId:function(id){return this._hash[id];},byClass:function(cls){var res=new _4c5(),id,_4ca;for(id in this._hash){_4ca=this._hash[id];if(_4ca.declaredClass==cls){res.add(_4ca);}}return res;},toArray:function(){var ar=[];for(var id in this._hash){ar.push(this._hash[id]);}return ar;},map:function(func,_4cb){return _4c2.map(this.toArray(),func,_4cb);},every:function(func,_4cc){_4cc=_4cc||win.global;var x=0,i;for(i in this._hash){if(!func.call(_4cc,this._hash[i],x++,this._hash)){return false;}}return true;},some:function(func,_4cd){_4cd=_4cd||win.global;var x=0,i;for(i in this._hash){if(func.call(_4cd,this._hash[i],x++,this._hash)){return true;}}return false;}});_4c2.forEach(["forEach","filter","byClass","map","every","some"],function(func){_4c4[func]=_4c5.prototype[func];});return _4c5;});},"dojo/dnd/Moveable":function(){define("dojo/dnd/Moveable",["../main","../Evented","../touch","./Mover"],function(dojo,_4ce,_4cf){dojo.declare("dojo.dnd.Moveable",[_4ce],{handle:"",delay:0,skip:false,constructor:function(node,_4d0){this.node=dojo.byId(node);if(!_4d0){_4d0={};}this.handle=_4d0.handle?dojo.byId(_4d0.handle):null;if(!this.handle){this.handle=this.node;}this.delay=_4d0.delay>0?_4d0.delay:0;this.skip=_4d0.skip;this.mover=_4d0.mover?_4d0.mover:dojo.dnd.Mover;this.events=[dojo.connect(this.handle,_4cf.press,this,"onMouseDown"),dojo.connect(this.handle,"ondragstart",this,"onSelectStart"),dojo.connect(this.handle,"onselectstart",this,"onSelectStart")];},markupFactory:function(_4d1,node,ctor){return new ctor(node,_4d1);},destroy:function(){dojo.forEach(this.events,dojo.disconnect);this.events=this.node=this.handle=null;},onMouseDown:function(e){if(this.skip&&dojo.dnd.isFormElement(e)){return;}if(this.delay){this.events.push(dojo.connect(this.handle,_4cf.move,this,"onMouseMove"),dojo.connect(this.handle,_4cf.release,this,"onMouseUp"));this._lastX=e.pageX;this._lastY=e.pageY;}else{this.onDragDetected(e);}dojo.stopEvent(e);},onMouseMove:function(e){if(Math.abs(e.pageX-this._lastX)>this.delay||Math.abs(e.pageY-this._lastY)>this.delay){this.onMouseUp(e);this.onDragDetected(e);}dojo.stopEvent(e);},onMouseUp:function(e){for(var i=0;i<2;++i){dojo.disconnect(this.events.pop());}dojo.stopEvent(e);},onSelectStart:function(e){if(!this.skip||!dojo.dnd.isFormElement(e)){dojo.stopEvent(e);}},onDragDetected:function(e){new this.mover(this.node,e,this);},onMoveStart:function(_4d2){dojo.publish("/dnd/move/start",[_4d2]);dojo.addClass(dojo.body(),"dojoMove");dojo.addClass(this.node,"dojoMoveItem");},onMoveStop:function(_4d3){dojo.publish("/dnd/move/stop",[_4d3]);dojo.removeClass(dojo.body(),"dojoMove");dojo.removeClass(this.node,"dojoMoveItem");},onFirstMove:function(_4d4,e){},onMove:function(_4d5,_4d6,e){this.onMoving(_4d5,_4d6);var s=_4d5.node.style;s.left=_4d6.l+"px";s.top=_4d6.t+"px";this.onMoved(_4d5,_4d6);},onMoving:function(_4d7,_4d8){},onMoved:function(_4d9,_4da){}});return dojo.dnd.Moveable;});},"dojo/store/util/SimpleQueryEngine":function(){define("dojo/store/util/SimpleQueryEngine",["../../_base/array"],function(_4db){return function(_4dc,_4dd){switch(typeof _4dc){default:throw new Error("Can not query with a "+typeof _4dc);case "object":case "undefined":var _4de=_4dc;_4dc=function(_4df){for(var key in _4de){var _4e0=_4de[key];if(_4e0&&_4e0.test){if(!_4e0.test(_4df[key])){return false;}}else{if(_4e0!=_4df[key]){return false;}}}return true;};break;case "string":if(!this[_4dc]){throw new Error("No filter function "+_4dc+" was found in store");}_4dc=this[_4dc];case "function":}function _4e1(_4e2){var _4e3=_4db.filter(_4e2,_4dc);if(_4dd&&_4dd.sort){_4e3.sort(function(a,b){for(var sort,i=0;sort=_4dd.sort[i];i++){var _4e4=a[sort.attribute];var _4e5=b[sort.attribute];if(_4e4!=_4e5){return !!sort.descending==_4e4>_4e5?-1:1;}}return 0;});}if(_4dd&&(_4dd.start||_4dd.count)){var _4e6=_4e3.length;_4e3=_4e3.slice(_4dd.start||0,(_4dd.start||0)+(_4dd.count||Infinity));_4e3.total=_4e6;}return _4e3;};_4e1.matches=_4dc;return _4e1;};});},"dijit/typematic":function(){define("dijit/typematic",["dojo/_base/array","dojo/_base/connect","dojo/_base/event","dojo/_base/kernel","dojo/_base/lang","dojo/on","dojo/_base/sniff","."],function(_4e7,_4e8,_4e9,_4ea,lang,on,has,_4eb){var _4ec=(_4eb.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(lang.hitch(this,"_fireEventAndReload"),this._currentTimeout);},trigger:function(evt,_4ed,node,_4ee,obj,_4ef,_4f0,_4f1){if(obj!=this._obj){this.stop();this._initialDelay=_4f0||500;this._subsequentDelay=_4ef||0.9;this._minDelay=_4f1||10;this._obj=obj;this._evt=evt;this._node=node;this._currentTimeout=-1;this._count=-1;this._callback=lang.hitch(_4ed,_4ee);this._fireEventAndReload();this._evt=lang.mixin({faux:true},evt);}},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(node,_4f2,_4f3,_4f4,_4f5,_4f6,_4f7){if(_4f2.keyCode){_4f2.charOrCode=_4f2.keyCode;_4ea.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}else{if(_4f2.charCode){_4f2.charOrCode=String.fromCharCode(_4f2.charCode);_4ea.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}}var _4f8=[on(node,_4e8._keypress,lang.hitch(this,function(evt){if(evt.charOrCode==_4f2.charOrCode&&(_4f2.ctrlKey===undefined||_4f2.ctrlKey==evt.ctrlKey)&&(_4f2.altKey===undefined||_4f2.altKey==evt.altKey)&&(_4f2.metaKey===undefined||_4f2.metaKey==(evt.metaKey||false))&&(_4f2.shiftKey===undefined||_4f2.shiftKey==evt.shiftKey)){_4e9.stop(evt);_4ec.trigger(evt,_4f3,node,_4f4,_4f2,_4f5,_4f6,_4f7);}else{if(_4ec._obj==_4f2){_4ec.stop();}}})),on(node,"keyup",lang.hitch(this,function(){if(_4ec._obj==_4f2){_4ec.stop();}}))];return {remove:function(){_4e7.forEach(_4f8,function(h){h.remove();});}};},addMouseListener:function(node,_4f9,_4fa,_4fb,_4fc,_4fd){var _4fe=[on(node,"mousedown",lang.hitch(this,function(evt){_4e9.stop(evt);_4ec.trigger(evt,_4f9,node,_4fa,node,_4fb,_4fc,_4fd);})),on(node,"mouseup",lang.hitch(this,function(evt){if(this._obj){_4e9.stop(evt);}_4ec.stop();})),on(node,"mouseout",lang.hitch(this,function(evt){_4e9.stop(evt);_4ec.stop();})),on(node,"mousemove",lang.hitch(this,function(evt){evt.preventDefault();})),on(node,"dblclick",lang.hitch(this,function(evt){_4e9.stop(evt);if(has("ie")){_4ec.trigger(evt,_4f9,node,_4fa,node,_4fb,_4fc,_4fd);setTimeout(lang.hitch(this,_4ec.stop),50);}}))];return {remove:function(){_4e7.forEach(_4fe,function(h){h.remove();});}};},addListener:function(_4ff,_500,_501,_502,_503,_504,_505,_506){var _507=[this.addKeyListener(_500,_501,_502,_503,_504,_505,_506),this.addMouseListener(_4ff,_502,_503,_504,_505,_506)];return {remove:function(){_4e7.forEach(_507,function(h){h.remove();});}};}});return _4ec;});},"dijit/MenuItem":function(){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(_508,dom,_509,_50a,_50b,_50c,has,_50d,_50e,_50f,_510,_511){return _508("dijit.MenuItem",[_50d,_50e,_50f,_510],{templateString:_511,baseClass:"dijitMenuItem",label:"",_setLabelAttr:{node:"containerNode",type:"innerHTML"},iconClass:"dijitNoIcon",_setIconClassAttr:{node:"iconNode",type:"class"},accelKey:"",disabled:false,_fillContent:function(_512){if(_512&&!("label" in this.params)){this.set("label",_512.innerHTML);}},buildRendering:function(){this.inherited(arguments);var _513=this.id+"_text";_509.set(this.containerNode,"id",_513);if(this.accelKeyNode){_509.set(this.accelKeyNode,"id",this.id+"_accel");_513+=" "+this.id+"_accel";}this.domNode.setAttribute("aria-labelledby",_513);dom.setSelectable(this.domNode,false);},_onHover:function(){this.getParent().onItemHover(this);},_onUnhover:function(){this.getParent().onItemUnhover(this);this._set("hovering",false);},_onClick:function(evt){this.getParent().onItemClick(this,evt);_50b.stop(evt);},onClick:function(){},focus:function(){try{if(has("ie")==8){this.containerNode.focus();}this.focusNode.focus();}catch(e){}},_onFocus:function(){this._setSelected(true);this.getParent()._onItemFocus(this);this.inherited(arguments);},_setSelected:function(_514){_50a.toggle(this.domNode,"dijitMenuItemSelected",_514);},setLabel:function(_515){_50c.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_515);},setDisabled:function(_516){_50c.deprecated("dijit.Menu.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_516);},_setDisabledAttr:function(_517){this.focusNode.setAttribute("aria-disabled",_517?"true":"false");this._set("disabled",_517);},_setAccelKeyAttr:function(_518){this.accelKeyNode.style.display=_518?"":"none";this.accelKeyNode.innerHTML=_518;_509.set(this.containerNode,"colSpan",_518?"1":"2");this._set("accelKey",_518);}});});},"dijit/layout/TabController":function(){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(_519,dom,_51a,_51b,i18n,lang,_51c,Menu,_51d,_51e){var _51f=_519("dijit.layout._TabButton",_51c.StackButton,{baseClass:"dijitTab",cssStateNodes:{closeNode:"dijitTabCloseButton"},templateString:_51e,scrollOnFocus:false,buildRendering:function(){this.inherited(arguments);dom.setSelectable(this.containerNode,false);},startup:function(){this.inherited(arguments);var n=this.domNode;setTimeout(function(){n.className=n.className;},1);},_setCloseButtonAttr:function(disp){this._set("closeButton",disp);_51b.toggle(this.innerDiv,"dijitClosable",disp);this.closeNode.style.display=disp?"":"none";if(disp){var _520=i18n.getLocalization("dijit","common");if(this.closeNode){_51a.set(this.closeNode,"title",_520.itemClose);}this._closeMenu=new Menu({id:this.id+"_Menu",dir:this.dir,lang:this.lang,textDir:this.textDir,targetNodeIds:[this.domNode]});this._closeMenu.addChild(new _51d({label:_520.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(_521){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 _522=_519("dijit.layout.TabController",_51c,{baseClass:"dijitTabController",templateString:"<div role='tablist' data-dojo-attach-event='onkeypress:onkeypress'></div>",tabPosition:"top",buttonWidget:_51f,_rectifyRtlTabList:function(){if(0>=this.tabPosition.indexOf("-h")){return;}if(!this.pane2button){return;}var _523=0;for(var pane in this.pane2button){var ow=this.pane2button[pane].innerDiv.scrollWidth;_523=Math.max(_523,ow);}for(pane in this.pane2button){this.pane2button[pane].innerDiv.style.width=_523+"px";}}});_522.TabButton=_51f;return _522;});},"dijit/layout/_LayoutWidget":function(){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(lang,_524,_525,_526,_527,_528,_529,_52a,has,win){return _527("dijit.layout._LayoutWidget",[_524,_525,_526],{baseClass:"dijitLayoutContainer",isLayoutContainer:true,buildRendering:function(){this.inherited(arguments);_528.add(this.domNode,"dijitContainer");},startup:function(){if(this._started){return;}this.inherited(arguments);var _52b=this.getParent&&this.getParent();if(!(_52b&&_52b.isLayoutContainer)){this.resize();this.connect(win.global,"onresize",function(){this.resize();});}},resize:function(_52c,_52d){var node=this.domNode;if(_52c){_529.setMarginBox(node,_52c);}var mb=_52d||{};lang.mixin(mb,_52c||{});if(!("h" in mb)||!("w" in mb)){mb=lang.mixin(_529.getMarginBox(node),mb);}var cs=_52a.getComputedStyle(node);var me=_529.getMarginExtents(node,cs);var be=_529.getBorderExtents(node,cs);var bb=(this._borderBox={w:mb.w-(me.w+be.w),h:mb.h-(me.h+be.h)});var pe=_529.getPadExtents(node,cs);this._contentBox={l:_52a.toPixelValue(node,cs.paddingLeft),t:_52a.toPixelValue(node,cs.paddingTop),w:bb.w-pe.w,h:bb.h-pe.h};this.layout();},layout:function(){},_setupChild:function(_52e){var cls=this.baseClass+"-child "+(_52e.baseClass?this.baseClass+"-"+_52e.baseClass:"");_528.add(_52e.domNode,cls);},addChild:function(_52f,_530){this.inherited(arguments);if(this._started){this._setupChild(_52f);}},removeChild:function(_531){var cls=this.baseClass+"-child"+(_531.baseClass?" "+this.baseClass+"-"+_531.baseClass:"");_528.remove(_531.domNode,cls);this.inherited(arguments);}});});},"dijit/popup":function(){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(_532,_533,_534,_535,dom,_536,_537,_538,_539,_53a,keys,lang,on,has,win,_53b,_53c,_53d){var _53e=_535(null,{_stack:[],_beginZIndex:1000,_idGen:1,_createWrapper:function(_53f){var _540=_53f._popupWrapper,node=_53f.domNode;if(!_540){_540=_537.create("div",{"class":"dijitPopup",style:{display:"none"},role:"presentation"},win.body());_540.appendChild(node);var s=node.style;s.display="";s.visibility="";s.position="";s.top="0px";_53f._popupWrapper=_540;_533.after(_53f,"destroy",function(){_537.destroy(_540);delete _53f._popupWrapper;});}return _540;},moveOffScreen:function(_541){var _542=this._createWrapper(_541);_539.set(_542,{visibility:"hidden",top:"-9999px",display:""});},hide:function(_543){var _544=this._createWrapper(_543);_539.set(_544,"display","none");},getTopPopup:function(){var _545=this._stack;for(var pi=_545.length-1;pi>0&&_545[pi].parent===_545[pi-1].widget;pi--){}return _545[pi];},open:function(args){var _546=this._stack,_547=args.popup,_548=args.orient||["below","below-alt","above","above-alt"],ltr=args.parent?args.parent.isLeftToRight():_538.isBodyLtr(),_549=args.around,id=(args.around&&args.around.id)?(args.around.id+"_dropdown"):("popup_"+this._idGen++);while(_546.length&&(!args.parent||!dom.isDescendant(args.parent.domNode,_546[_546.length-1].widget.domNode))){this.close(_546[_546.length-1].widget);}var _54a=this._createWrapper(_547);_536.set(_54a,{id:id,style:{zIndex:this._beginZIndex+_546.length},"class":"dijitPopup "+(_547.baseClass||_547["class"]||"").split(" ")[0]+"Popup",dijitPopupParent:args.parent?args.parent.id:""});if(has("ie")||has("mozilla")){if(!_547.bgIframe){_547.bgIframe=new _53c(_54a);}}var best=_549?_53b.around(_54a,_549,_548,ltr,_547.orient?lang.hitch(_547,"orient"):null):_53b.at(_54a,args,_548=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],args.padding);_54a.style.display="";_54a.style.visibility="visible";_547.domNode.style.visibility="visible";var _54b=[];_54b.push(on(_54a,_534._keypress,lang.hitch(this,function(evt){if(evt.charOrCode==keys.ESCAPE&&args.onCancel){_53a.stop(evt);args.onCancel();}else{if(evt.charOrCode===keys.TAB){_53a.stop(evt);var _54c=this.getTopPopup();if(_54c&&_54c.onCancel){_54c.onCancel();}}}})));if(_547.onCancel&&args.onCancel){_54b.push(_547.on("cancel",args.onCancel));}_54b.push(_547.on(_547.onExecute?"execute":"change",lang.hitch(this,function(){var _54d=this.getTopPopup();if(_54d&&_54d.onExecute){_54d.onExecute();}})));_546.push({widget:_547,parent:args.parent,onExecute:args.onExecute,onCancel:args.onCancel,onClose:args.onClose,handlers:_54b});if(_547.onOpen){_547.onOpen(best);}return best;},close:function(_54e){var _54f=this._stack;while((_54e&&_532.some(_54f,function(elem){return elem.widget==_54e;}))||(!_54e&&_54f.length)){var top=_54f.pop(),_550=top.widget,_551=top.onClose;if(_550.onClose){_550.onClose();}var h;while(h=top.handlers.pop()){h.remove();}if(_550&&_550.domNode){this.hide(_550);}if(_551){_551();}}}});return (_53d.popup=new _53e());});},"dijit/_base/manager":function(){define("dijit/_base/manager",["dojo/_base/array","dojo/_base/config","../registry",".."],function(_552,_553,_554,_555){_552.forEach(["byId","getUniqueId","findWidgets","_destroyAll","byNode","getEnclosingWidget"],function(name){_555[name]=_554[name];});_555.defaultDuration=_553["defaultDuration"]||200;return _555;});},"dijit/layout/StackController":function(){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(_556,_557,_558,keys,lang,has,_559,_55a,_55b,_55c,_55d,_55e){var _55f=_557("dijit.layout._StackButton",_55e,{tabIndex:"-1",closeButton:false,_setCheckedAttr:function(_560,_561){this.inherited(arguments);this.focusNode.removeAttribute("aria-pressed");},buildRendering:function(evt){this.inherited(arguments);(this.focusNode||this.domNode).setAttribute("role","tab");},onClick:function(){_559.focus(this.focusNode);},onClickCloseButton:function(evt){evt.stopPropagation();}});var _562=_557("dijit.layout.StackController",[_55b,_55c,_55d],{baseClass:"dijitStackController",templateString:"<span role='tablist' data-dojo-attach-event='onkeypress'></span>",containerId:"",buttonWidget:_55f,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(info){_556.forEach(info.children,this.onAddChild,this);if(info.selected){this.onSelectChild(info.selected);}},destroy:function(){for(var pane in this.pane2button){this.onRemoveChild(_55a.byId(pane));}this.inherited(arguments);},onAddChild:function(page,_563){var cls=lang.isString(this.buttonWidget)?lang.getObject(this.buttonWidget):this.buttonWidget;var _564=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});_564.focusNode.setAttribute("aria-selected","false");var _565=["title","showTitle","iconClass","closable","tooltip"],_566=["label","showLabel","iconClass","closeButton","title"];this.pane2watches[page.id]=_556.map(_565,function(_567,idx){return page.watch(_567,function(name,_568,_569){_564.set(_566[idx],_569);});});this.pane2connects[page.id]=[this.connect(_564,"onClick",lang.hitch(this,"onButtonClick",page)),this.connect(_564,"onClickCloseButton",lang.hitch(this,"onCloseButtonClick",page))];this.addChild(_564,_563);this.pane2button[page.id]=_564;page.controlButton=_564;if(!this._currentChild){_564.focusNode.setAttribute("tabIndex","0");_564.focusNode.setAttribute("aria-selected","true");this._currentChild=page;}if(!this.isLeftToRight()&&has("ie")&&this._rectifyRtlTabList){this._rectifyRtlTabList();}},onRemoveChild:function(page){if(this._currentChild===page){this._currentChild=null;}_556.forEach(this.pane2connects[page.id],lang.hitch(this,"disconnect"));delete this.pane2connects[page.id];_556.forEach(this.pane2watches[page.id],function(w){w.unwatch();});delete this.pane2watches[page.id];var _56a=this.pane2button[page.id];if(_56a){this.removeChild(_56a);delete this.pane2button[page.id];_56a.destroy();}delete page.controlButton;},onSelectChild:function(page){if(!page){return;}if(this._currentChild){var _56b=this.pane2button[this._currentChild.id];_56b.set("checked",false);_56b.focusNode.setAttribute("aria-selected","false");_56b.focusNode.setAttribute("tabIndex","-1");}var _56c=this.pane2button[page.id];_56c.set("checked",true);_56c.focusNode.setAttribute("aria-selected","true");this._currentChild=page;_56c.focusNode.setAttribute("tabIndex","0");var _56d=_55a.byId(this.containerId);_56d.containerNode.setAttribute("aria-labelledby",_56c.id);},onButtonClick:function(page){if(this._currentChild.id===page.id){var _56e=this.pane2button[page.id];_56e.set("checked",true);}var _56f=_55a.byId(this.containerId);_56f.selectChild(page);},onCloseButtonClick:function(page){var _570=_55a.byId(this.containerId);_570.closeChild(page);if(this._currentChild){var b=this.pane2button[this._currentChild.id];if(b){_559.focus(b.focusNode||b.domNode);}}},adjacent:function(_571){if(!this.isLeftToRight()&&(!this.tabPosition||/top|bottom/.test(this.tabPosition))){_571=!_571;}var _572=this.getChildren();var _573=_556.indexOf(_572,this.pane2button[this._currentChild.id]);var _574=_571?1:_572.length-1;return _572[(_573+_574)%_572.length];},onkeypress:function(e){if(this.disabled||e.altKey){return;}var _575=null;if(e.ctrlKey||!e._djpage){switch(e.charOrCode){case keys.LEFT_ARROW:case keys.UP_ARROW:if(!e._djpage){_575=false;}break;case keys.PAGE_UP:if(e.ctrlKey){_575=false;}break;case keys.RIGHT_ARROW:case keys.DOWN_ARROW:if(!e._djpage){_575=true;}break;case keys.PAGE_DOWN:if(e.ctrlKey){_575=true;}break;case keys.HOME:case keys.END:var _576=this.getChildren();if(_576&&_576.length){_576[e.charOrCode==keys.HOME?0:_576.length-1].onClick();}_558.stop(e);break;case keys.DELETE:if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}_558.stop(e);break;default:if(e.ctrlKey){if(e.charOrCode===keys.TAB){this.adjacent(!e.shiftKey).onClick();_558.stop(e);}else{if(e.charOrCode=="w"){if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}_558.stop(e);}}}}if(_575!==null){this.adjacent(_575).onClick();_558.stop(e);}}},onContainerKeyPress:function(info){info.e._djpage=info.page;this.onkeypress(info.e);}});_562.StackButton=_55f;return _562;});},"dojo/dnd/Mover":function(){define("dojo/dnd/Mover",["../main","../Evented","../touch","./common","./autoscroll"],function(dojo,_577,_578){dojo.declare("dojo.dnd.Mover",[_577],{constructor:function(node,e,host){this.node=dojo.byId(node);this.marginBox={l:e.pageX,t:e.pageY};this.mouseButton=e.button;var h=(this.host=host),d=node.ownerDocument;this.events=[dojo.connect(d,_578.move,this,"onFirstMove"),dojo.connect(d,_578.move,this,"onMouseMove"),dojo.connect(d,_578.release,this,"onMouseUp"),dojo.connect(d,"ondragstart",dojo.stopEvent),dojo.connect(d.body,"onselectstart",dojo.stopEvent)];if(h&&h.onMoveStart){h.onMoveStart(this);}},onMouseMove:function(e){dojo.dnd.autoScroll(e);var m=this.marginBox;this.host.onMove(this,{l:m.l+e.pageX,t:m.t+e.pageY},e);dojo.stopEvent(e);},onMouseUp:function(e){if(dojo.isWebKit&&dojo.isMac&&this.mouseButton==2?e.button==0:this.mouseButton==e.button){this.destroy();}dojo.stopEvent(e);},onFirstMove:function(e){var s=this.node.style,l,t,h=this.host;switch(s.position){case "relative":case "absolute":l=Math.round(parseFloat(s.left))||0;t=Math.round(parseFloat(s.top))||0;break;default:s.position="absolute";var m=dojo.marginBox(this.node);var b=dojo.doc.body;var bs=dojo.getComputedStyle(b);var bm=dojo._getMarginBox(b,bs);var bc=dojo._getContentBox(b,bs);l=m.l-(bc.l-bm.l);t=m.t-(bc.t-bm.t);break;}this.marginBox.l=l-this.marginBox.l;this.marginBox.t=t-this.marginBox.t;if(h&&h.onFirstMove){h.onFirstMove(this,e);}dojo.disconnect(this.events.shift());},destroy:function(){dojo.forEach(this.events,dojo.disconnect);var h=this.host;if(h&&h.onMoveStop){h.onMoveStop(this);}this.events=this.node=this.host=null;}});return dojo.dnd.Mover;});},"dijit/layout/TabContainer":function(){define("dijit/layout/TabContainer",["dojo/_base/lang","dojo/_base/declare","./_TabContainerBase","./TabController","./ScrollingTabController"],function(lang,_579,_57a,_57b,_57c){return _579("dijit.layout.TabContainer",_57a,{useMenu:true,useSlider:true,controllerWidget:"",_makeController:function(_57d){var cls=this.baseClass+"-tabs"+(this.doLayout?"":" dijitTabNoLayout"),_57b=lang.getObject(this.controllerWidget);return new _57b({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},_57d);},postMixInProperties:function(){this.inherited(arguments);if(!this.controllerWidget){this.controllerWidget=(this.tabPosition=="top"||this.tabPosition=="bottom")&&!this.nested?"dijit.layout.ScrollingTabController":"dijit.layout.TabController";}}});});},"dijit/BackgroundIframe":function(){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(_57e,_57f,_580,_581,_582,lang,on,has,win){var _583=new function(){var _584=[];this.pop=function(){var _585;if(_584.length){_585=_584.pop();_585.style.display="";}else{if(has("ie")<9){var burl=_580["dojoBlankHtmlUrl"]||_57e.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\");'>";_585=win.doc.createElement(html);}else{_585=_581.create("iframe");_585.src="javascript:\"\"";_585.className="dijitBackgroundIframe";_585.setAttribute("role","presentation");_582.set(_585,"opacity",0.1);}_585.tabIndex=-1;}return _585;};this.push=function(_586){_586.style.display="none";_584.push(_586);};}();_57f.BackgroundIframe=function(node){if(!node.id){throw new Error("no id");}if(has("ie")||has("mozilla")){var _587=(this.iframe=_583.pop());node.appendChild(_587);if(has("ie")<7||has("quirks")){this.resize(node);this._conn=on(node,"resize",lang.hitch(this,function(){this.resize(node);}));}else{_582.set(_587,{width:"100%",height:"100%"});}}};lang.extend(_57f.BackgroundIframe,{resize:function(node){if(this.iframe){_582.set(this.iframe,{width:node.offsetWidth+"px",height:node.offsetHeight+"px"});}},destroy:function(){if(this._conn){this._conn.remove();this._conn=null;}if(this.iframe){_583.push(this.iframe);delete this.iframe;}}});return _57f.BackgroundIframe;});},"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","dojo/dnd/Avatar":function(){define("dojo/dnd/Avatar",["../main","./common"],function(dojo){dojo.declare("dojo.dnd.Avatar",null,{constructor:function(_588){this.manager=_588;this.construct();},construct:function(){this.isA11y=dojo.hasClass(dojo.body(),"dijit_a11y");var a=dojo.create("table",{"class":"dojoDndAvatar",style:{position:"absolute",zIndex:"1999",margin:"0px"}}),_589=this.manager.source,node,b=dojo.create("tbody",null,a),tr=dojo.create("tr",null,b),td=dojo.create("td",null,tr),icon=this.isA11y?dojo.create("span",{id:"a11yIcon",innerHTML:this.manager.copy?"+":"<"},td):null,span=dojo.create("span",{innerHTML:_589.generateText?this._generateText():""},td),k=Math.min(5,this.manager.nodes.length),i=0;dojo.attr(tr,{"class":"dojoDndAvatarHeader",style:{opacity:0.9}});for(;i<k;++i){if(_589.creator){node=_589._normalizedCreator(_589.getItem(this.manager.nodes[i].id).data,"avatar").node;}else{node=this.manager.nodes[i].cloneNode(true);if(node.tagName.toLowerCase()=="tr"){var _58a=dojo.create("table"),_58b=dojo.create("tbody",null,_58a);_58b.appendChild(node);node=_58a;}}node.id="";tr=dojo.create("tr",null,b);td=dojo.create("td",null,tr);td.appendChild(node);dojo.attr(tr,{"class":"dojoDndAvatarItem",style:{opacity:(9-i)/10}});}this.node=a;},destroy:function(){dojo.destroy(this.node);this.node=false;},update:function(){dojo[(this.manager.canDropFlag?"add":"remove")+"Class"](this.node,"dojoDndAvatarCanDrop");if(this.isA11y){var icon=dojo.byId("a11yIcon");var text="+";if(this.manager.canDropFlag&&!this.manager.copy){text="< ";}else{if(!this.manager.canDropFlag&&!this.manager.copy){text="o";}else{if(!this.manager.canDropFlag){text="x";}}}icon.innerHTML=text;}dojo.query(("tr.dojoDndAvatarHeader td span"+(this.isA11y?" span":"")),this.node).forEach(function(node){node.innerHTML=this._generateText();},this);},_generateText:function(){return this.manager.nodes.length.toString();}});return dojo.dnd.Avatar;});},"dijit/form/Button":function(){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(_58c,_58d,_58e,_58f,lang,_590,_591,_592,_593){if(!_58f.isAsync){_590(0,function(){var _594=["dijit/form/DropDownButton","dijit/form/ComboButton","dijit/form/ToggleButton"];_58c(_594);});}return _58d("dijit.form.Button",[_591,_592],{showLabel:true,iconClass:"dijitNoIcon",_setIconClassAttr:{node:"iconNode",type:"class"},baseClass:"dijitButton",templateString:_593,_setValueAttr:"valueNode",_onClick:function(e){var ok=this.inherited(arguments);if(ok){if(this.valueNode){this.valueNode.click();e.preventDefault();}}return ok;},_fillContent:function(_595){if(_595&&(!this.params||!("label" in this.params))){var _596=lang.trim(_595.innerHTML);if(_596){this.label=_596;}}},_setShowLabelAttr:function(val){if(this.containerNode){_58e.toggle(this.containerNode,"dijitDisplayNone",!val);}this._set("showLabel",val);},setLabel:function(_597){_58f.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_597);},_setLabelAttr:function(_598){this.inherited(arguments);if(!this.showLabel&&!("title" in this.params)){this.titleNode.title=lang.trim(this.containerNode.innerText||this.containerNode.textContent||"");}}});});},"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","dojo/dnd/move":function(){define("dojo/dnd/move",["../main","./Mover","./Moveable"],function(dojo){dojo.declare("dojo.dnd.move.constrainedMoveable",dojo.dnd.Moveable,{constraints:function(){},within:false,constructor:function(node,_599){if(!_599){_599={};}this.constraints=_599.constraints;this.within=_599.within;},onFirstMove:function(_59a){var c=this.constraintBox=this.constraints.call(this,_59a);c.r=c.l+c.w;c.b=c.t+c.h;if(this.within){var mb=dojo._getMarginSize(_59a.node);c.r-=mb.w;c.b-=mb.h;}},onMove:function(_59b,_59c){var c=this.constraintBox,s=_59b.node.style;this.onMoving(_59b,_59c);_59c.l=_59c.l<c.l?c.l:c.r<_59c.l?c.r:_59c.l;_59c.t=_59c.t<c.t?c.t:c.b<_59c.t?c.b:_59c.t;s.left=_59c.l+"px";s.top=_59c.t+"px";this.onMoved(_59b,_59c);}});dojo.declare("dojo.dnd.move.boxConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{box:{},constructor:function(node,_59d){var box=_59d&&_59d.box;this.constraints=function(){return box;};}});dojo.declare("dojo.dnd.move.parentConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{area:"content",constructor:function(node,_59e){var area=_59e&&_59e.area;this.constraints=function(){var n=this.node.parentNode,s=dojo.getComputedStyle(n),mb=dojo._getMarginBox(n,s);if(area=="margin"){return mb;}var t=dojo._getMarginExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(area=="border"){return mb;}t=dojo._getBorderExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(area=="padding"){return mb;}t=dojo._getPadExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;return mb;};}});dojo.dnd.constrainedMover=dojo.dnd.move.constrainedMover;dojo.dnd.boxConstrainedMover=dojo.dnd.move.boxConstrainedMover;dojo.dnd.parentConstrainedMover=dojo.dnd.move.parentConstrainedMover;return dojo.dnd.move;});},"dijit/_WidgetBase":function(){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(_59f,_5a0,_5a1,_5a2,_5a3,_5a4,dom,_5a5,_5a6,_5a7,_5a8,_5a9,_5aa,lang,on,_5ab,_5ac,_5ad,win,_5ae){if(!_5aa.isAsync){_5ab(0,function(){var _5af=["dijit/_base/manager"];_59f(_5af);});}var _5b0={};function _5b1(obj){var ret={};for(var attr in obj){ret[attr.toLowerCase()]=true;}return ret;};function _5b2(attr){return function(val){_5a5[val?"set":"remove"](this.domNode,attr,val);this._set(attr,val);};};return _5a4("dijit._WidgetBase",_5ac,{id:"",_setIdAttr:"domNode",lang:"",_setLangAttr:_5b2("lang"),dir:"",_setDirAttr:_5b2("dir"),textDir:"","class":"",_setClassAttr:{node:"domNode",type:"class"},style:"",title:"",tooltip:"",baseClass:"",srcNodeRef:null,domNode:null,containerNode:null,attributeMap:{},_blankGif:_5a2.blankGif||_59f.toUrl("dojo/resources/blank.gif"),postscript:function(_5b3,_5b4){this.create(_5b3,_5b4);},create:function(_5b5,_5b6){this.srcNodeRef=dom.byId(_5b6);this._connects=[];this._supportingWidgets=[];if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){this.id=this.srcNodeRef.id;}if(_5b5){this.params=_5b5;lang.mixin(this,_5b5);}this.postMixInProperties();if(!this.id){this.id=_5ae.getUniqueId(this.declaredClass.replace(/\./g,"_"));}_5ae.add(this);this.buildRendering();if(this.domNode){this._applyAttributes();var _5b7=this.srcNodeRef;if(_5b7&&_5b7.parentNode&&this.domNode!==_5b7){_5b7.parentNode.replaceChild(this.domNode,_5b7);}}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 ctor=this.constructor,list=ctor._setterAttrs;if(!list){list=(ctor._setterAttrs=[]);for(var attr in this.attributeMap){list.push(attr);}var _5b8=ctor.prototype;for(var _5b9 in _5b8){if(_5b9 in this.attributeMap){continue;}var _5ba="_set"+_5b9.replace(/^[a-z]|-[a-zA-Z]/g,function(c){return c.charAt(c.length-1).toUpperCase();})+"Attr";if(_5ba in _5b8){list.push(_5b9);}}}_5a0.forEach(list,function(attr){if(this.params&&attr in this.params){}else{if(this[attr]){this.set(attr,this[attr]);}}},this);for(var _5bb in this.params){this.set(_5bb,this[_5bb]);}},postMixInProperties:function(){},buildRendering:function(){if(!this.domNode){this.domNode=this.srcNodeRef||_5a7.create("div");}if(this.baseClass){var _5bc=this.baseClass.split(" ");if(!this.isLeftToRight()){_5bc=_5bc.concat(_5a0.map(_5bc,function(name){return name+"Rtl";}));}_5a6.add(this.domNode,_5bc);}},postCreate:function(){},startup:function(){if(this._started){return;}this._started=true;_5a0.forEach(this.getChildren(),function(obj){if(!obj._started&&!obj._destroyed&&lang.isFunction(obj.startup)){obj.startup();obj._started=true;}});},destroyRecursive:function(_5bd){this._beingDestroyed=true;this.destroyDescendants(_5bd);this.destroy(_5bd);},destroy:function(_5be){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(_5be);_5ae.remove(this.id);this._destroyed=true;},destroyRendering:function(_5bf){if(this.bgIframe){this.bgIframe.destroy(_5bf);delete this.bgIframe;}if(this.domNode){if(_5bf){_5a5.remove(this.domNode,"widgetId");}else{_5a7.destroy(this.domNode);}delete this.domNode;}if(this.srcNodeRef){if(!_5bf){_5a7.destroy(this.srcNodeRef);}delete this.srcNodeRef;}},destroyDescendants:function(_5c0){_5a0.forEach(this.getChildren(),function(_5c1){if(_5c1.destroyRecursive){_5c1.destroyRecursive(_5c0);}});},uninitialize:function(){return false;},_setStyleAttr:function(_5c2){var _5c3=this.domNode;if(lang.isObject(_5c2)){_5a9.set(_5c3,_5c2);}else{if(_5c3.style.cssText){_5c3.style.cssText+="; "+_5c2;}else{_5c3.style.cssText=_5c2;}}this._set("style",_5c2);},_attrToDom:function(attr,_5c4,_5c5){_5c5=arguments.length>=3?_5c5:this.attributeMap[attr];_5a0.forEach(lang.isArray(_5c5)?_5c5:[_5c5],function(_5c6){var _5c7=this[_5c6.node||_5c6||"domNode"];var type=_5c6.type||"attribute";switch(type){case "attribute":if(lang.isFunction(_5c4)){_5c4=lang.hitch(this,_5c4);}var _5c8=_5c6.attribute?_5c6.attribute:(/^on[A-Z][a-zA-Z]*$/.test(attr)?attr.toLowerCase():attr);_5a5.set(_5c7,_5c8,_5c4);break;case "innerText":_5c7.innerHTML="";_5c7.appendChild(win.doc.createTextNode(_5c4));break;case "innerHTML":_5c7.innerHTML=_5c4;break;case "class":_5a6.replace(_5c7,_5c4,this[attr]);break;}},this);},get:function(name){var _5c9=this._getAttrNames(name);return this[_5c9.g]?this[_5c9.g]():this[name];},set:function(name,_5ca){if(typeof name==="object"){for(var x in name){this.set(x,name[x]);}return this;}var _5cb=this._getAttrNames(name),_5cc=this[_5cb.s];if(lang.isFunction(_5cc)){var _5cd=_5cc.apply(this,Array.prototype.slice.call(arguments,1));}else{var _5ce=this.focusNode&&!lang.isFunction(this.focusNode)?"focusNode":"domNode",tag=this[_5ce].tagName,_5cf=_5b0[tag]||(_5b0[tag]=_5b1(this[_5ce])),map=name in this.attributeMap?this.attributeMap[name]:_5cb.s in this?this[_5cb.s]:((_5cb.l in _5cf&&typeof _5ca!="function")||/^aria-|^data-|^role$/.test(name))?_5ce:null;if(map!=null){this._attrToDom(name,_5ca,map);}this._set(name,_5ca);}return _5cd||this;},_attrPairNames:{},_getAttrNames:function(name){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",g:"_get"+uc+"Attr",l:uc.toLowerCase()});},_set:function(name,_5d0){var _5d1=this[name];this[name]=_5d0;if(this._watchCallbacks&&this._created&&_5d0!==_5d1){this._watchCallbacks(name,_5d1,_5d0);}},on:function(type,func){return _5a1.after(this,this._onMap(type),func,true);},_onMap:function(type){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()];},toString:function(){return "[Widget "+this.declaredClass+", "+(this.id||"NO ID")+"]";},getChildren:function(){return this.containerNode?_5ae.findWidgets(this.containerNode):[];},getParent:function(){return _5ae.getEnclosingWidget(this.domNode.parentNode);},connect:function(obj,_5d2,_5d3){var _5d4=_5a3.connect(obj,_5d2,this,_5d3);this._connects.push(_5d4);return _5d4;},disconnect:function(_5d5){var i=_5a0.indexOf(this._connects,_5d5);if(i!=-1){_5d5.remove();this._connects.splice(i,1);}},subscribe:function(t,_5d6){var _5d7=_5ad.subscribe(t,lang.hitch(this,_5d6));this._connects.push(_5d7);return _5d7;},unsubscribe:function(_5d8){this.disconnect(_5d8);},isLeftToRight:function(){return this.dir?(this.dir=="ltr"):_5a8.isBodyLtr();},isFocusable:function(){return this.focus&&(_5a9.get(this.domNode,"display")!="none");},placeAt:function(_5d9,_5da){if(_5d9.declaredClass&&_5d9.addChild){_5d9.addChild(this,_5da);}else{_5a7.place(this.domNode,_5d9,_5da);}return this;},getTextDir:function(text,_5db){return _5db;},applyTextDir:function(){},defer:function(fcn,_5dc){var _5dd=setTimeout(lang.hitch(this,function(){_5dd=null;if(!this._destroyed){lang.hitch(this,fcn)();}}),_5dc||0);return {remove:function(){if(_5dd){clearTimeout(_5dd);_5dd=null;}return null;}};}});});},"dijit/form/Form":function(){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(_5de,_5df,_5e0,_5e1,has,_5e2,_5e3,_5e4,_5e5){return _5de("dijit.form.Form",[_5e2,_5e3,_5e4,_5e5],{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(_5e6){this.encType=_5e6;_5df.set(this.domNode,"encType",_5e6);if(has("ie")){this.domNode.encoding=_5e6;}},reset:function(e){var faux={returnValue:true,preventDefault:function(){this.returnValue=false;},stopPropagation:function(){},currentTarget:e?e.target:this.domNode,target:e?e.target:this.domNode};if(!(this.onReset(faux)===false)&&faux.returnValue){this.inherited(arguments,[]);}},onReset:function(){return true;},_onReset:function(e){this.reset(e);_5e0.stop(e);return false;},_onSubmit:function(e){var fp=this.constructor.prototype;if(this.execute!=fp.execute||this.onExecute!=fp.onExecute){_5e1.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.","","2.0");this.onExecute();this.execute(this.getValues());}if(this.onSubmit(e)===false){_5e0.stop(e);}},onSubmit:function(){return this.isValid();},submit:function(){if(!(this.onSubmit()===false)){this.containerNode.submit();}}});});},"dijit/layout/_TabContainerBase":function(){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(_5e7,_5e8,_5e9,_5ea,_5eb,_5ec,_5ed,_5ee){return _5eb("dijit.layout._TabContainerBase",[_5e8,_5ea],{tabPosition:"top",baseClass:"dijitTabContainer",tabStrip:false,nested:false,templateString:_5e7,postMixInProperties:function(){this.baseClass+=this.tabPosition.charAt(0).toUpperCase()+this.tabPosition.substr(1).replace(/-.*/,"");this.srcNodeRef&&_5ee.set(this.srcNodeRef,"visibility","hidden");this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);this.tablist=this._makeController(this.tablistNode);if(!this.doLayout){_5ec.add(this.domNode,"dijitTabContainerNoLayout");}if(this.nested){_5ec.add(this.domNode,"dijitTabContainerNested");_5ec.add(this.tablist.containerNode,"dijitTabContainerTabListNested");_5ec.add(this.tablistSpacer,"dijitTabContainerSpacerNested");_5ec.add(this.containerNode,"dijitTabPaneWrapperNested");}else{_5ec.add(this.domNode,"tabStrip-"+(this.tabStrip?"enabled":"disabled"));}},_setupChild:function(tab){_5ec.add(tab.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 _5ef=this.tabPosition.replace(/-h/,"");this.tablist.layoutAlign=_5ef;var _5f0=[this.tablist,{domNode:this.tablistSpacer,layoutAlign:_5ef},{domNode:this.containerNode,layoutAlign:"client"}];_5e9.layoutChildren(this.domNode,this._contentBox,_5f0);this._containerContentBox=_5e9.marginBox2contentBox(this.containerNode,_5f0[2]);if(sc&&sc.resize){sc.resize(this._containerContentBox);}}else{if(this.tablist.resize){var s=this.tablist.domNode.style;s.width="0";var _5f1=_5ed.getContentBox(this.domNode).w;s.width="";this.tablist.resize({w:_5f1});}if(sc&&sc.resize){sc.resize();}}},destroy:function(){if(this.tablist){this.tablist.destroy();}this.inherited(arguments);}});});},"dojo/store/Memory":function(){define("dojo/store/Memory",["../_base/declare","./util/QueryResults","./util/SimpleQueryEngine"],function(_5f2,_5f3,_5f4){return _5f2("dojo.store.Memory",null,{constructor:function(_5f5){for(var i in _5f5){this[i]=_5f5[i];}this.setData(this.data||[]);},data:null,idProperty:"id",index:null,queryEngine:_5f4,get:function(id){return this.data[this.index[id]];},getIdentity:function(_5f6){return _5f6[this.idProperty];},put:function(_5f7,_5f8){var data=this.data,_5f9=this.index,_5fa=this.idProperty;var id=(_5f8&&"id" in _5f8)?_5f8.id:_5fa in _5f7?_5f7[_5fa]:Math.random();if(id in _5f9){if(_5f8&&_5f8.overwrite===false){throw new Error("Object already exists");}data[_5f9[id]]=_5f7;}else{_5f9[id]=data.push(_5f7)-1;}return id;},add:function(_5fb,_5fc){(_5fc=_5fc||{}).overwrite=false;return this.put(_5fb,_5fc);},remove:function(id){var _5fd=this.index;var data=this.data;if(id in _5fd){data.splice(_5fd[id],1);this.setData(data);return true;}},query:function(_5fe,_5ff){return _5f3(this.queryEngine(_5fe,_5ff)(this.data));},setData:function(data){if(data.items){this.idProperty=data.identifier;data=this.data=data.items;}else{this.data=data;}this.index={};for(var i=0,l=data.length;i<l;i++){this.index[data[i][this.idProperty]]=i;}}});});},"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","dijit/_base/sniff":function(){define("dijit/_base/sniff",["dojo/uacss"],function(){});},"dijit/Toolbar":function(){define("dijit/Toolbar",["require","dojo/_base/declare","dojo/_base/kernel","dojo/keys","dojo/ready","./_Widget","./_KeyNavContainer","./_TemplatedMixin"],function(_600,_601,_602,keys,_603,_604,_605,_606){if(!_602.isAsync){_603(0,function(){var _607=["dijit/ToolbarSeparator"];_600(_607);});}return _601("dijit.Toolbar",[_604,_606,_605],{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]);}});});},"dijit/layout/StackContainer":function(){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(_608,_609,_60a,_60b,_60c,lang,_60d,_60e,_60f,_610,_611){if(!_60c.isAsync){_60d(0,function(){var _612=["dijit/layout/StackController"];require(_612);});}lang.extend(_610,{selected:false,closable:false,iconClass:"dijitNoIcon",showTitle:true});return _60a("dijit.layout.StackContainer",_611,{doLayout:true,persist:false,baseClass:"dijitStackContainer",buildRendering:function(){this.inherited(arguments);_60b.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 _613=this.getChildren();_608.forEach(_613,this._setupChild,this);if(this.persist){this.selectedChildWidget=_60f.byId(_609(this.id+"_selectedChild"));}else{_608.some(_613,function(_614){if(_614.selected){this.selectedChildWidget=_614;}return _614.selected;},this);}var _615=this.selectedChildWidget;if(!_615&&_613[0]){_615=this.selectedChildWidget=_613[0];_615.selected=true;}_60e.publish(this.id+"-startup",{children:_613,selected:_615});this.inherited(arguments);},resize:function(){if(!this._hasBeenShown){this._hasBeenShown=true;var _616=this.selectedChildWidget;if(_616){this._showChild(_616);}}this.inherited(arguments);},_setupChild:function(_617){this.inherited(arguments);_60b.replace(_617.domNode,"dijitHidden","dijitVisible");_617.domNode.title="";},addChild:function(_618,_619){this.inherited(arguments);if(this._started){_60e.publish(this.id+"-addChild",_618,_619);this.layout();if(!this.selectedChildWidget){this.selectChild(_618);}}},removeChild:function(page){this.inherited(arguments);if(this._started){_60e.publish(this.id+"-removeChild",page);}if(this._descendantsBeingDestroyed){return;}if(this.selectedChildWidget===page){this.selectedChildWidget=undefined;if(this._started){var _61a=this.getChildren();if(_61a.length){this.selectChild(_61a[0]);}}}if(this._started){this.layout();}},selectChild:function(page,_61b){page=_60f.byId(page);if(this.selectedChildWidget!=page){var d=this._transition(page,this.selectedChildWidget,_61b);this._set("selectedChildWidget",page);_60e.publish(this.id+"-selectChild",page);if(this.persist){_609(this.id+"_selectedChild",this.selectedChildWidget.id);}}return d;},_transition:function(_61c,_61d){if(_61d){this._hideChild(_61d);}var d=this._showChild(_61c);if(_61c.resize){if(this.doLayout){_61c.resize(this._containerContentBox||this._contentBox);}else{_61c.resize();}}return d;},_adjacent:function(_61e){var _61f=this.getChildren();var _620=_608.indexOf(_61f,this.selectedChildWidget);_620+=_61e?1:_61f.length-1;return _61f[_620%_61f.length];},forward:function(){return this.selectChild(this._adjacent(true),true);},back:function(){return this.selectChild(this._adjacent(false),true);},_onKeyPress:function(e){_60e.publish(this.id+"-containerKeyPress",{e:e,page:this});},layout:function(){var _621=this.selectedChildWidget;if(_621&&_621.resize){if(this.doLayout){_621.resize(this._containerContentBox||this._contentBox);}else{_621.resize();}}},_showChild:function(page){var _622=this.getChildren();page.isFirstChild=(page==_622[0]);page.isLastChild=(page==_622[_622.length-1]);page._set("selected",true);_60b.replace(page.domNode,"dijitVisible","dijitHidden");return (page._onShow&&page._onShow())||true;},_hideChild:function(page){page._set("selected",false);_60b.replace(page.domNode,"dijitHidden","dijitVisible");page.onHide&&page.onHide();},closeChild:function(page){var _623=page.onClose(this,page);if(_623){this.removeChild(page);page.destroyRecursive();}},destroyDescendants:function(_624){this._descendantsBeingDestroyed=true;this.selectedChildWidget=undefined;_608.forEach(this.getChildren(),function(_625){if(!_624){this.removeChild(_625);}_625.destroyRecursive(_624);},this);this._descendantsBeingDestroyed=false;}});});},"dojo/regexp":function(){define("dojo/regexp",["./_base/kernel","./_base/lang"],function(dojo,lang){lang.getObject("regexp",true,dojo);dojo.regexp.escapeString=function(str,_626){return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(ch){if(_626&&_626.indexOf(ch)!=-1){return ch;}return "\\"+ch;});};dojo.regexp.buildGroupRE=function(arr,re,_627){if(!(arr instanceof Array)){return re(arr);}var b=[];for(var i=0;i<arr.length;i++){b.push(re(arr[i]));}return dojo.regexp.group(b.join("|"),_627);};dojo.regexp.group=function(_628,_629){return "("+(_629?"?:":"")+_628+")";};return dojo.regexp;});},"dijit/form/_FormMixin":function(){define("dijit/form/_FormMixin",["dojo/_base/array","dojo/_base/declare","dojo/_base/kernel","dojo/_base/lang","dojo/window"],function(_62a,_62b,_62c,lang,_62d){return _62b("dijit.form._FormMixin",null,{state:"",_getDescendantFormWidgets:function(_62e){var res=[];_62a.forEach(_62e||this.getChildren(),function(_62f){if("value" in _62f){res.push(_62f);}else{res=res.concat(this._getDescendantFormWidgets(_62f.getChildren()));}},this);return res;},reset:function(){_62a.forEach(this._getDescendantFormWidgets(),function(_630){if(_630.reset){_630.reset();}});},validate:function(){var _631=false;return _62a.every(_62a.map(this._getDescendantFormWidgets(),function(_632){_632._hasBeenBlurred=true;var _633=_632.disabled||!_632.validate||_632.validate();if(!_633&&!_631){_62d.scrollIntoView(_632.containerNode||_632.domNode);_632.focus();_631=true;}return _633;}),function(item){return item;});},setValues:function(val){_62c.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.","","2.0");return this.set("value",val);},_setValueAttr:function(obj){var map={};_62a.forEach(this._getDescendantFormWidgets(),function(_634){if(!_634.name){return;}var _635=map[_634.name]||(map[_634.name]=[]);_635.push(_634);});for(var name in map){if(!map.hasOwnProperty(name)){continue;}var _636=map[name],_637=lang.getObject(name,false,obj);if(_637===undefined){continue;}if(!lang.isArray(_637)){_637=[_637];}if(typeof _636[0].checked=="boolean"){_62a.forEach(_636,function(w){w.set("value",_62a.indexOf(_637,w.value)!=-1);});}else{if(_636[0].multiple){_636[0].set("value",_637);}else{_62a.forEach(_636,function(w,i){w.set("value",_637[i]);});}}}},getValues:function(){_62c.deprecated(this.declaredClass+"::getValues() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},_getValueAttr:function(){var obj={};_62a.forEach(this._getDescendantFormWidgets(),function(_638){var name=_638.name;if(!name||_638.disabled){return;}var _639=_638.get("value");if(typeof _638.checked=="boolean"){if(/Radio/.test(_638.declaredClass)){if(_639!==false){lang.setObject(name,_639,obj);}else{_639=lang.getObject(name,false,obj);if(_639===undefined){lang.setObject(name,null,obj);}}}else{var ary=lang.getObject(name,false,obj);if(!ary){ary=[];lang.setObject(name,ary,obj);}if(_639!==false){ary.push(_639);}}}else{var prev=lang.getObject(name,false,obj);if(typeof prev!="undefined"){if(lang.isArray(prev)){prev.push(_639);}else{lang.setObject(name,[prev,_639],obj);}}else{lang.setObject(name,_639,obj);}}});return obj;},isValid:function(){return this.state=="";},onValidStateChange:function(){},_getState:function(){var _63a=_62a.map(this._descendants,function(w){return w.get("state")||"";});return _62a.indexOf(_63a,"Error")>=0?"Error":_62a.indexOf(_63a,"Incomplete")>=0?"Incomplete":"";},disconnectChildren:function(){_62a.forEach(this._childConnections||[],lang.hitch(this,"disconnect"));_62a.forEach(this._childWatches||[],function(w){w.unwatch();});},connectChildren:function(_63b){var _63c=this;this.disconnectChildren();this._descendants=this._getDescendantFormWidgets();var set=_63b?function(name,val){_63c[name]=val;}:lang.hitch(this,"_set");set("value",this.get("value"));set("state",this._getState());var _63d=(this._childConnections=[]),_63e=(this._childWatches=[]);_62a.forEach(_62a.filter(this._descendants,function(item){return item.validate;}),function(_63f){_62a.forEach(["state","disabled"],function(attr){_63e.push(_63f.watch(attr,function(){_63c.set("state",_63c._getState());}));});});var _640=function(){if(_63c._onChangeDelayTimer){clearTimeout(_63c._onChangeDelayTimer);}_63c._onChangeDelayTimer=setTimeout(function(){delete _63c._onChangeDelayTimer;_63c._set("value",_63c.get("value"));},10);};_62a.forEach(_62a.filter(this._descendants,function(item){return item.onChange;}),function(_641){_63d.push(_63c.connect(_641,"onChange",_640));_63e.push(_641.watch("disabled",_640));});},startup:function(){this.inherited(arguments);this.connectChildren(true);this.watch("state",function(attr,_642,_643){this.onValidStateChange(_643=="");});},destroy:function(){this.disconnectChildren();this.inherited(arguments);}});});},"dijit/DropDownMenu":function(){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(_644,_645,keys,_646,_647,_648){return _644("dijit.DropDownMenu",[_648,_647],{templateString:_646,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(evt){if(evt.ctrlKey||evt.altKey){return;}switch(evt.charOrCode){case this._openSubMenuKey:this._moveToPopup(evt);_645.stop(evt);break;case this._closeSubMenuKey:if(this.parentMenu){if(this.parentMenu._isMenuBar){this.parentMenu.focusPrev();}else{this.onCancel(false);}}else{_645.stop(evt);}break;}}});});},"dojo/data/util/simpleFetch":function(){define("dojo/data/util/simpleFetch",["dojo/_base/lang","dojo/_base/window","./sorter"],function(lang,_649,_64a){var _64b=lang.getObject("dojo.data.util.simpleFetch",true);_64b.fetch=function(_64c){_64c=_64c||{};if(!_64c.store){_64c.store=this;}var self=this;var _64d=function(_64e,_64f){if(_64f.onError){var _650=_64f.scope||_649.global;_64f.onError.call(_650,_64e,_64f);}};var _651=function(_652,_653){var _654=_653.abort||null;var _655=false;var _656=_653.start?_653.start:0;var _657=(_653.count&&(_653.count!==Infinity))?(_656+_653.count):_652.length;_653.abort=function(){_655=true;if(_654){_654.call(_653);}};var _658=_653.scope||_649.global;if(!_653.store){_653.store=self;}if(_653.onBegin){_653.onBegin.call(_658,_652.length,_653);}if(_653.sort){_652.sort(_64a.createSortFunction(_653.sort,self));}if(_653.onItem){for(var i=_656;(i<_652.length)&&(i<_657);++i){var item=_652[i];if(!_655){_653.onItem.call(_658,item,_653);}}}if(_653.onComplete&&!_655){var _659=null;if(!_653.onItem){_659=_652.slice(_656,_657);}_653.onComplete.call(_658,_659,_653);}};this._fetchItems(_64c,_651,_64d);return _64c;};return _64b;});},"dijit/Menu":function(){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(_65a,_65b,_65c,_65d,dom,_65e,_65f,_660,_661,keys,lang,on,has,win,_662,pm,_663,_664){if(!_661.isAsync){_664(0,function(){var _665=["dijit/MenuItem","dijit/PopupMenuItem","dijit/CheckedMenuItem","dijit/MenuSeparator"];_65a(_665);});}return _65c("dijit.Menu",_663,{constructor:function(){this._bindings=[];},targetNodeIds:[],contextMenuForWindow:false,leftClickToOpen:false,refocus:true,postCreate:function(){if(this.contextMenuForWindow){this.bindDomNode(win.body());}else{_65b.forEach(this.targetNodeIds,this.bindDomNode,this);}this.inherited(arguments);},_iframeContentWindow:function(_666){return _662.get(this._iframeContentDocument(_666))||this._iframeContentDocument(_666)["__parent__"]||(_666.name&&win.doc.frames[_666.name])||null;},_iframeContentDocument:function(_667){return _667.contentDocument||(_667.contentWindow&&_667.contentWindow.document)||(_667.name&&win.doc.frames[_667.name]&&win.doc.frames[_667.name].document)||null;},bindDomNode:function(node){node=dom.byId(node);var cn;if(node.tagName.toLowerCase()=="iframe"){var _668=node,_669=this._iframeContentWindow(_668);cn=win.withGlobal(_669,win.body);}else{cn=(node==win.body()?win.doc.documentElement:node);}var _66a={node:node,iframe:_668};_65e.set(node,"_dijitMenu"+this.id,this._bindings.push(_66a));var _66b=lang.hitch(this,function(cn){return [on(cn,this.leftClickToOpen?"click":"contextmenu",lang.hitch(this,function(evt){_65d.stop(evt);this._scheduleOpen(evt.target,_668,{x:evt.pageX,y:evt.pageY});})),on(cn,"keydown",lang.hitch(this,function(evt){if(evt.shiftKey&&evt.keyCode==keys.F10){_65d.stop(evt);this._scheduleOpen(evt.target,_668);}}))];});_66a.connects=cn?_66b(cn):[];if(_668){_66a.onloadHandler=lang.hitch(this,function(){var _66c=this._iframeContentWindow(_668);cn=win.withGlobal(_66c,win.body);_66a.connects=_66b(cn);});if(_668.addEventListener){_668.addEventListener("load",_66a.onloadHandler,false);}else{_668.attachEvent("onload",_66a.onloadHandler);}}},unBindDomNode:function(_66d){var node;try{node=dom.byId(_66d);}catch(e){return;}var _66e="_dijitMenu"+this.id;if(node&&_65e.has(node,_66e)){var bid=_65e.get(node,_66e)-1,b=this._bindings[bid],h;while(h=b.connects.pop()){h.remove();}var _66f=b.iframe;if(_66f){if(_66f.removeEventListener){_66f.removeEventListener("load",b.onloadHandler,false);}else{_66f.detachEvent("onload",b.onloadHandler);}}_65e.remove(node,_66e);delete this._bindings[bid];}},_scheduleOpen:function(_670,_671,_672){if(!this._openTimer){this._openTimer=setTimeout(lang.hitch(this,function(){delete this._openTimer;this._openMyself({target:_670,iframe:_671,coords:_672});}),1);}},_openMyself:function(args){var _673=args.target,_674=args.iframe,_675=args.coords;if(_675){if(_674){var ifc=_65f.position(_674,true),_676=this._iframeContentWindow(_674),_677=win.withGlobal(_676,"_docScroll",dojo);var cs=_660.getComputedStyle(_674),tp=_660.toPixelValue,left=(has("ie")&&has("quirks")?0:tp(_674,cs.paddingLeft))+(has("ie")&&has("quirks")?tp(_674,cs.borderLeftWidth):0),top=(has("ie")&&has("quirks")?0:tp(_674,cs.paddingTop))+(has("ie")&&has("quirks")?tp(_674,cs.borderTopWidth):0);_675.x+=ifc.x+left-_677.x;_675.y+=ifc.y+top-_677.y;}}else{_675=_65f.position(_673,true);_675.x+=10;_675.y+=10;}var self=this;var _678=this._focusManager.get("prevNode");var _679=this._focusManager.get("curNode");var _67a=!_679||(dom.isDescendant(_679,this.domNode))?_678:_679;function _67b(){if(self.refocus&&_67a){_67a.focus();}pm.close(self);};pm.open({popup:this,x:_675.x,y:_675.y,onExecute:_67b,onCancel:_67b,orient:this.isLeftToRight()?"L":"R"});this.focus();this._onBlur=function(){this.inherited("_onBlur",arguments);pm.close(this);};},uninitialize:function(){_65b.forEach(this._bindings,function(b){if(b){this.unBindDomNode(b.node);}},this);this.inherited(arguments);}});});},"dijit/form/_CheckBoxMixin":function(){define("dijit/form/_CheckBoxMixin",["dojo/_base/declare","dojo/dom-attr","dojo/_base/event"],function(_67c,_67d,_67e){return _67c("dijit.form._CheckBoxMixin",null,{type:"checkbox",value:"on",readOnly:false,_aria_attr:"aria-checked",_setReadOnlyAttr:function(_67f){this._set("readOnly",_67f);_67d.set(this.focusNode,"readOnly",_67f);this.focusNode.setAttribute("aria-readonly",_67f);},_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");_67d.set(this.focusNode,"value",this.value);},_onClick:function(e){if(this.readOnly){_67e.stop(e);return false;}return this.inherited(arguments);}});});},"dijit/layout/ContentPane":function(){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(_680,lang,_681,_682,_683,html,_684,_685,_686,_687,dom,_688,win,xhr,i18n){return _686("dijit.layout.ContentPane",[_681,_682],{href:"",content:"",extractContent:false,parseOnLoad:true,parserScope:_680._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(_689,_68a){if((!_689||!_689.template)&&_68a&&!("href" in _689)&&!("content" in _689)){var df=win.doc.createDocumentFragment();_68a=dom.byId(_68a);while(_68a.firstChild){df.appendChild(_68a.firstChild);}_689=lang.delegate(_689,{content:df});}this.inherited(arguments,[_689,_68a]);},postMixInProperties:function(){this.inherited(arguments);var _68b=i18n.getLocalization("dijit","loading",this.lang);this.loadingMessage=_683.substitute(this.loadingMessage,_68b);this.errorMessage=_683.substitute(this.errorMessage,_68b);},buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}this.domNode.title="";if(!_688.get(this.domNode,"role")){this.domNode.setAttribute("role","group");}},startup:function(){this.inherited(arguments);if(this._contentSetter){_685.forEach(this._contentSetter.parseResults,function(obj){if(!obj._started&&!obj._destroyed&&lang.isFunction(obj.startup)){obj.startup();obj._started=true;}},this);}},setHref:function(href){_680.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.","","2.0");return this.set("href",href);},_setHrefAttr:function(href){this.cancel();this.onLoadDeferred=new _687(lang.hitch(this,"cancel"));this.onLoadDeferred.addCallback(lang.hitch(this,"onLoad"));this._set("href",href);if(this.preload||(this._created&&this._isShown())){this._load();}else{this._hrefChanged=true;}return this.onLoadDeferred;},setContent:function(data){_680.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.","","2.0");this.set("content",data);},_setContentAttr:function(data){this._set("href","");this.cancel();this.onLoadDeferred=new _687(lang.hitch(this,"cancel"));if(this._created){this.onLoadDeferred.addCallback(lang.hitch(this,"onLoad"));}this._setContent(data||"");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(_68c){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 _687(lang.hitch(this,"cancel"));this.onLoadDeferred.addCallback(lang.hitch(this,"onLoad"));this._load();return this.onLoadDeferred;},_load:function(){this._setContent(this.onDownloadStart(),true);var self=this;var _68d={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};if(lang.isObject(this.ioArgs)){lang.mixin(_68d,this.ioArgs);}var hand=(this._xhrDfd=(this.ioMethod||xhr.get)(_68d));hand.addCallback(function(html){try{self._isDownloaded=true;self._setContent(html,false);self.onDownloadEnd();}catch(err){self._onError("Content",err);}delete self._xhrDfd;return html;});hand.addErrback(function(err){if(!hand.canceled){self._onError("Download",err);}delete self._xhrDfd;return err;});delete this._hrefChanged;},_onLoadHandler:function(data){this._set("isLoaded",true);try{this.onLoadDeferred.callback(data);}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(_68e){if(this.isLoaded){this._onUnloadHandler();}var _68f=this._contentSetter;_685.forEach(this.getChildren(),function(_690){if(_690.destroyRecursive){_690.destroyRecursive(_68e);}});if(_68f){_685.forEach(_68f.parseResults,function(_691){if(_691.destroyRecursive&&_691.domNode&&_691.domNode.parentNode==win.body()){_691.destroyRecursive(_68e);}});delete _68f.parseResults;}if(!_68e){html._emptyNode(this.containerNode);}delete this._singleChild;},_setContent:function(cont,_692){this.destroyDescendants();var _693=this._contentSetter;if(!(_693&&_693 instanceof html._ContentSetter)){_693=this._contentSetter=new html._ContentSetter({node:this.containerNode,_onError:lang.hitch(this,this._onError),onContentError:lang.hitch(this,function(e){var _694=this.onContentError(e);try{this.containerNode.innerHTML=_694;}catch(e){console.error("Fatal "+this.id+" could not change content due to "+e.message,e);}})});}var _695=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||{});_693.set((lang.isObject(cont)&&cont.domNode)?cont.domNode:cont,_695);delete this._contentSetterParams;if(this.doLayout){this._checkIfSingleChild();}if(!_692){if(this._started){delete this._started;this.startup();this._scheduleLayout();}this._onLoadHandler(cont);}},_onError:function(type,err,_696){this.onLoadDeferred.errback(err);var _697=this["on"+type+"Error"].call(this,err);if(_696){console.error(_696,err);}else{if(_697){this._setContent(_697,true);}}},onLoad:function(){},onUnload:function(){},onDownloadStart:function(){return this.loadingMessage;},onContentError:function(){},onDownloadError:function(){return this.errorMessage;},onDownloadEnd:function(){}});});},"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","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","dijit/layout/utils":function(){define("dijit/layout/utils",["dojo/_base/array","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/lang",".."],function(_698,_699,_69a,_69b,lang,_69c){var _69d=lang.getObject("layout",true,_69c);_69d.marginBox2contentBox=function(node,mb){var cs=_69b.getComputedStyle(node);var me=_69a.getMarginExtents(node,cs);var pb=_69a.getPadBorderExtents(node,cs);return {l:_69b.toPixelValue(node,cs.paddingLeft),t:_69b.toPixelValue(node,cs.paddingTop),w:mb.w-(me.w+pb.w),h:mb.h-(me.h+pb.h)};};function _69e(word){return word.substring(0,1).toUpperCase()+word.substring(1);};function size(_69f,dim){var _6a0=_69f.resize?_69f.resize(dim):_69a.setMarginBox(_69f.domNode,dim);if(_6a0){lang.mixin(_69f,_6a0);}else{lang.mixin(_69f,_69a.getMarginBox(_69f.domNode));lang.mixin(_69f,dim);}};_69d.layoutChildren=function(_6a1,dim,_6a2,_6a3,_6a4){dim=lang.mixin({},dim);_699.add(_6a1,"dijitLayoutContainer");_6a2=_698.filter(_6a2,function(item){return item.region!="center"&&item.layoutAlign!="client";}).concat(_698.filter(_6a2,function(item){return item.region=="center"||item.layoutAlign=="client";}));_698.forEach(_6a2,function(_6a5){var elm=_6a5.domNode,pos=(_6a5.region||_6a5.layoutAlign);if(!pos){throw new Error("No region setting for "+_6a5.id);}var _6a6=elm.style;_6a6.left=dim.l+"px";_6a6.top=dim.t+"px";_6a6.position="absolute";_699.add(elm,"dijitAlign"+_69e(pos));var _6a7={};if(_6a3&&_6a3==_6a5.id){_6a7[_6a5.region=="top"||_6a5.region=="bottom"?"h":"w"]=_6a4;}if(pos=="top"||pos=="bottom"){_6a7.w=dim.w;size(_6a5,_6a7);dim.h-=_6a5.h;if(pos=="top"){dim.t+=_6a5.h;}else{_6a6.top=dim.t+dim.h+"px";}}else{if(pos=="left"||pos=="right"){_6a7.h=dim.h;size(_6a5,_6a7);dim.w-=_6a5.w;if(pos=="left"){dim.l+=_6a5.w;}else{_6a6.left=dim.l+dim.w+"px";}}else{if(pos=="client"||pos=="center"){size(_6a5,dim);}}}});};return {marginBox2contentBox:_69d.marginBox2contentBox,layoutChildren:_69d.layoutChildren};});},"dijit/_Contained":function(){define("dijit/_Contained",["dojo/_base/declare","./registry"],function(_6a8,_6a9){return _6a8("dijit._Contained",null,{_getSibling:function(_6aa){var node=this.domNode;do{node=node[_6aa+"Sibling"];}while(node&&node.nodeType!=1);return node&&_6a9.byNode(node);},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);}});});},"dijit/_KeyNavContainer":function(){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(_6ab,_6ac,_6ad,_6ae,keys,_6af,_6b0,_6b1,lang){return _6af("dijit._KeyNavContainer",[_6ad,_6ac],{tabIndex:"0",connectKeyNavHandlers:function(_6b2,_6b3){var _6b4=(this._keyNavCodes={});var prev=lang.hitch(this,"focusPrev");var next=lang.hitch(this,"focusNext");_6ae.forEach(_6b2,function(code){_6b4[code]=prev;});_6ae.forEach(_6b3,function(code){_6b4[code]=next;});_6b4[keys.HOME]=lang.hitch(this,"focusFirstChild");_6b4[keys.END]=lang.hitch(this,"focusLastChild");this.connect(this.domNode,"onkeypress","_onContainerKeypress");this.connect(this.domNode,"onfocus","_onContainerFocus");},startupKeyNavChildren:function(){_6ab.deprecated("startupKeyNavChildren() call no longer needed","","2.0");},startup:function(){this.inherited(arguments);_6ae.forEach(this.getChildren(),lang.hitch(this,"_startupChild"));},addChild:function(_6b5,_6b6){this.inherited(arguments);this._startupChild(_6b5);},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(_6b7,last){if(!_6b7){return;}if(this.focusedChild&&_6b7!==this.focusedChild){this._onChildBlur(this.focusedChild);}_6b7.set("tabIndex",this.tabIndex);_6b7.focus(last?"end":"start");this._set("focusedChild",_6b7);},_startupChild:function(_6b8){_6b8.set("tabIndex","-1");this.connect(_6b8,"_onFocus",function(){_6b8.set("tabIndex",this.tabIndex);});this.connect(_6b8,"_onBlur",function(){_6b8.set("tabIndex","-1");});},_onContainerFocus:function(evt){if(evt.target!==this.domNode||this.focusedChild){return;}this.focusFirstChild();_6b1.set(this.domNode,"tabIndex","-1");},_onBlur:function(evt){if(this.tabIndex){_6b1.set(this.domNode,"tabIndex",this.tabIndex);}this.focusedChild=null;this.inherited(arguments);},_onContainerKeypress:function(evt){if(evt.ctrlKey||evt.altKey){return;}var func=this._keyNavCodes[evt.charOrCode];if(func){func();_6b0.stop(evt);}},_onChildBlur:function(){},_getFirstFocusableChild:function(){return this._getNextFocusableChild(null,1);},_getLastFocusableChild:function(){return this._getNextFocusableChild(null,-1);},_getNextFocusableChild:function(_6b9,dir){if(_6b9){_6b9=this._getSiblingOfChild(_6b9,dir);}var _6ba=this.getChildren();for(var i=0;i<_6ba.length;i++){if(!_6b9){_6b9=_6ba[(dir>0)?0:(_6ba.length-1)];}if(_6b9.isFocusable()){return _6b9;}_6b9=this._getSiblingOfChild(_6b9,dir);}return null;}});});},"dijit/form/DataList":function(){define("dijit/form/DataList",["dojo/_base/declare","dojo/dom","dojo/_base/lang","dojo/query","dojo/store/Memory","../registry"],function(_6bb,dom,lang,_6bc,_6bd,_6be){function _6bf(_6c0){return {id:_6c0.value,value:_6c0.value,name:lang.trim(_6c0.innerText||_6c0.textContent||"")};};return _6bb("dijit.form.DataList",_6bd,{constructor:function(_6c1,_6c2){this.domNode=dom.byId(_6c2);lang.mixin(this,_6c1);if(this.id){_6be.add(this);}this.domNode.style.display="none";this.inherited(arguments,[{data:_6bc("option",this.domNode).map(_6bf)}]);},destroy:function(){_6be.remove(this.id);},fetchSelectedItem:function(){var _6c3=_6bc("> option[selected]",this.domNode)[0]||_6bc("> option",this.domNode)[0];return _6c3&&_6bf(_6c3);}});});},"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","dijit/form/CheckBox":function(){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(_6c4,_6c5,_6c6,_6c7,_6c8,_6c9,_6ca,_6cb,_6cc){if(!_6c7.isAsync){_6c9(0,function(){var _6cd=["dijit/form/RadioButton"];_6c4(_6cd);});}return _6c5("dijit.form.CheckBox",[_6ca,_6cb],{templateString:_6cc,baseClass:"dijitCheckBox",_setValueAttr:function(_6ce,_6cf){if(typeof _6ce=="string"){this._set("value",_6ce);_6c6.set(this.focusNode,"value",_6ce);_6ce=true;}if(this._created){this.set("checked",_6ce,_6cf);}},_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){_6c8("label[for='"+this.id+"']").addClass("dijitFocusedLabel");}this.inherited(arguments);},_onBlur:function(){if(this.id){_6c8("label[for='"+this.id+"']").removeClass("dijitFocusedLabel");}this.inherited(arguments);}});});},"dijit/tree/_dndSelector":function(){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(_6d0,_6d1,_6d2,lang,_6d3,on,_6d4,win,_6d5){return _6d2("dijit.tree._dndSelector",_6d5,{constructor:function(){this.selection={};this.anchor=null;this.tree.domNode.setAttribute("aria-multiselect",!this.singular);this.events.push(on(this.tree.domNode,_6d4.press,lang.hitch(this,"onMouseDown")),on(this.tree.domNode,_6d4.release,lang.hitch(this,"onMouseUp")),on(this.tree.domNode,_6d4.move,lang.hitch(this,"onMouseMove")));},singular:false,getSelectedTreeNodes:function(){var _6d6=[],sel=this.selection;for(var i in sel){_6d6.push(sel[i]);}return _6d6;},selectNone:function(){this.setSelection([]);return this;},destroy:function(){this.inherited(arguments);this.selection=this.anchor=null;},addTreeNode:function(node,_6d7){this.setSelection(this.getSelectedTreeNodes().concat([node]));if(_6d7){this.anchor=node;}return node;},removeTreeNode:function(node){this.setSelection(this._setDifference(this.getSelectedTreeNodes(),[node]));return node;},isTreeNodeSelected:function(node){return node.id&&!!this.selection[node.id];},setSelection:function(_6d8){var _6d9=this.getSelectedTreeNodes();_6d0.forEach(this._setDifference(_6d9,_6d8),lang.hitch(this,function(node){node.setSelected(false);if(this.anchor==node){delete this.anchor;}delete this.selection[node.id];}));_6d0.forEach(this._setDifference(_6d8,_6d9),lang.hitch(this,function(node){node.setSelected(true);this.selection[node.id]=node;}));this._updateSelectionProperties();},_setDifference:function(xs,ys){_6d0.forEach(ys,function(y){y.__exclude__=true;});var ret=_6d0.filter(xs,function(x){return !x.__exclude__;});_6d0.forEach(ys,function(y){delete y["__exclude__"];});return ret;},_updateSelectionProperties:function(){var _6da=this.getSelectedTreeNodes();var _6db=[],_6dc=[];_6d0.forEach(_6da,function(node){_6dc.push(node);_6db.push(node.getTreePath());});var _6dd=_6d0.map(_6dc,function(node){return node.item;});this.tree._set("paths",_6db);this.tree._set("path",_6db[0]||[]);this.tree._set("selectedNodes",_6dc);this.tree._set("selectedNode",_6dc[0]||null);this.tree._set("selectedItems",_6dd);this.tree._set("selectedItem",_6dd[0]||null);},onMouseDown:function(e){if(!this.current||this.tree.isExpandoNode(e.target,this.current)){return;}if(!_6d3.isLeft(e)){return;}e.preventDefault();var _6de=this.current,copy=_6d1.isCopyKey(e),id=_6de.id;if(!this.singular&&!e.shiftKey&&this.selection[id]){this._doDeselect=true;return;}else{this._doDeselect=false;}this.userSelect(_6de,copy,e.shiftKey);},onMouseUp:function(e){if(!this._doDeselect){return;}this._doDeselect=false;this.userSelect(this.current,_6d1.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(node,_6df,_6e0){if(this.singular){if(this.anchor==node&&_6df){this.selectNone();}else{this.setSelection([node]);this.anchor=node;}}else{if(_6e0&&this.anchor){var cr=this._compareNodes(this.anchor.rowNode,node.rowNode),_6e1,end,_6e2=this.anchor;if(cr<0){_6e1=_6e2;end=node;}else{_6e1=node;end=_6e2;}var _6e3=[];while(_6e1!=end){_6e3.push(_6e1);_6e1=this.tree._getNextNode(_6e1);}_6e3.push(end);this.setSelection(_6e3);}else{if(this.selection[node.id]&&_6df){this.removeTreeNode(node);}else{if(_6df){this.addTreeNode(node,true);}else{this.setSelection([node]);this.anchor=node;}}}}},getItem:function(key){var _6e4=this.selection[key];return {data:_6e4,type:["treeNode"]};},forInSelectedItems:function(f,o){o=o||win.global;for(var id in this.selection){f.call(o,this.getItem(id),id,this);}}});});},"dijit/_Container":function(){define("dijit/_Container",["dojo/_base/array","dojo/_base/declare","dojo/dom-construct","./registry"],function(_6e5,_6e6,_6e7,_6e8){return _6e6("dijit._Container",null,{buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}},addChild:function(_6e9,_6ea){var _6eb=this.containerNode;if(_6ea&&typeof _6ea=="number"){var _6ec=this.getChildren();if(_6ec&&_6ec.length>=_6ea){_6eb=_6ec[_6ea-1].domNode;_6ea="after";}}_6e7.place(_6e9.domNode,_6eb,_6ea);if(this._started&&!_6e9._started){_6e9.startup();}},removeChild:function(_6ed){if(typeof _6ed=="number"){_6ed=this.getChildren()[_6ed];}if(_6ed){var node=_6ed.domNode;if(node&&node.parentNode){node.parentNode.removeChild(node);}}},hasChildren:function(){return this.getChildren().length>0;},_getSiblingOfChild:function(_6ee,dir){var node=_6ee.domNode,_6ef=(dir>0?"nextSibling":"previousSibling");do{node=node[_6ef];}while(node&&(node.nodeType!=1||!_6e8.byNode(node)));return node&&_6e8.byNode(node);},getIndexOfChild:function(_6f0){return _6e5.indexOf(this.getChildren(),_6f0);}});});},"dojo/data/ItemFileReadStore":function(){define("dojo/data/ItemFileReadStore",["../_base/kernel","../_base/lang","../_base/declare","../_base/array","../_base/xhr","../Evented","../_base/window","./util/filter","./util/simpleFetch","../date/stamp"],function(_6f1,lang,_6f2,_6f3,xhr,_6f4,_6f5,_6f6,_6f7,_6f8){var _6f9=_6f2("dojo.data.ItemFileReadStore",[_6f4],{constructor:function(_6fa){this._arrayOfAllItems=[];this._arrayOfTopLevelItems=[];this._loadFinished=false;this._jsonFileUrl=_6fa.url;this._ccUrl=_6fa.url;this.url=_6fa.url;this._jsonData=_6fa.data;this.data=null;this._datatypeMap=_6fa.typeMap||{};if(!this._datatypeMap["Date"]){this._datatypeMap["Date"]={type:Date,deserialize:function(_6fb){return _6f8.fromISOString(_6fb);}};}this._features={"dojo.data.api.Read":true,"dojo.data.api.Identity":true};this._itemsByIdentity=null;this._storeRefPropName="_S";this._itemNumPropName="_0";this._rootItemPropName="_RI";this._reverseRefMap="_RRM";this._loadInProgress=false;this._queuedFetches=[];if(_6fa.urlPreventCache!==undefined){this.urlPreventCache=_6fa.urlPreventCache?true:false;}if(_6fa.hierarchical!==undefined){this.hierarchical=_6fa.hierarchical?true:false;}if(_6fa.clearOnClose){this.clearOnClose=true;}if("failOk" in _6fa){this.failOk=_6fa.failOk?true:false;}},url:"",_ccUrl:"",data:null,typeMap:null,clearOnClose:false,urlPreventCache:false,failOk:false,hierarchical:true,_assertIsItem:function(item){if(!this.isItem(item)){throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");}},_assertIsAttribute:function(_6fc){if(typeof _6fc!=="string"){throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");}},getValue:function(item,_6fd,_6fe){var _6ff=this.getValues(item,_6fd);return (_6ff.length>0)?_6ff[0]:_6fe;},getValues:function(item,_700){this._assertIsItem(item);this._assertIsAttribute(_700);return (item[_700]||[]).slice(0);},getAttributes:function(item){this._assertIsItem(item);var _701=[];for(var key in item){if((key!==this._storeRefPropName)&&(key!==this._itemNumPropName)&&(key!==this._rootItemPropName)&&(key!==this._reverseRefMap)){_701.push(key);}}return _701;},hasAttribute:function(item,_702){this._assertIsItem(item);this._assertIsAttribute(_702);return (_702 in item);},containsValue:function(item,_703,_704){var _705=undefined;if(typeof _704==="string"){_705=_6f6.patternToRegExp(_704,false);}return this._containsValue(item,_703,_704,_705);},_containsValue:function(item,_706,_707,_708){return _6f3.some(this.getValues(item,_706),function(_709){if(_709!==null&&!lang.isObject(_709)&&_708){if(_709.toString().match(_708)){return true;}}else{if(_707===_709){return true;}}});},isItem:function(_70a){if(_70a&&_70a[this._storeRefPropName]===this){if(this._arrayOfAllItems[_70a[this._itemNumPropName]]===_70a){return true;}}return false;},isItemLoaded:function(_70b){return this.isItem(_70b);},loadItem:function(_70c){this._assertIsItem(_70c.item);},getFeatures:function(){return this._features;},getLabel:function(item){if(this._labelAttr&&this.isItem(item)){return this.getValue(item,this._labelAttr);}return undefined;},getLabelAttributes:function(item){if(this._labelAttr){return [this._labelAttr];}return null;},_fetchItems:function(_70d,_70e,_70f){var self=this,_710=function(_711,_712){var _713=[],i,key;if(_711.query){var _714,_715=_711.queryOptions?_711.queryOptions.ignoreCase:false;var _716={};for(key in _711.query){_714=_711.query[key];if(typeof _714==="string"){_716[key]=_6f6.patternToRegExp(_714,_715);}else{if(_714 instanceof RegExp){_716[key]=_714;}}}for(i=0;i<_712.length;++i){var _717=true;var _718=_712[i];if(_718===null){_717=false;}else{for(key in _711.query){_714=_711.query[key];if(!self._containsValue(_718,key,_714,_716[key])){_717=false;}}}if(_717){_713.push(_718);}}_70e(_713,_711);}else{for(i=0;i<_712.length;++i){var item=_712[i];if(item!==null){_713.push(item);}}_70e(_713,_711);}};if(this._loadFinished){_710(_70d,this._getItemsArray(_70d.queryOptions));}else{if(this._jsonFileUrl!==this._ccUrl){_6f1.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){if(this._loadInProgress){this._queuedFetches.push({args:_70d,filter:_710});}else{this._loadInProgress=true;var _719={url:self._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _71a=xhr.get(_719);_71a.addCallback(function(data){try{self._getItemsFromLoadedData(data);self._loadFinished=true;self._loadInProgress=false;_710(_70d,self._getItemsArray(_70d.queryOptions));self._handleQueuedFetches();}catch(e){self._loadFinished=true;self._loadInProgress=false;_70f(e,_70d);}});_71a.addErrback(function(_71b){self._loadInProgress=false;_70f(_71b,_70d);});var _71c=null;if(_70d.abort){_71c=_70d.abort;}_70d.abort=function(){var df=_71a;if(df&&df.fired===-1){df.cancel();df=null;}if(_71c){_71c.call(_70d);}};}}else{if(this._jsonData){try{this._loadFinished=true;this._getItemsFromLoadedData(this._jsonData);this._jsonData=null;_710(_70d,this._getItemsArray(_70d.queryOptions));}catch(e){_70f(e,_70d);}}else{_70f(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."),_70d);}}}},_handleQueuedFetches:function(){if(this._queuedFetches.length>0){for(var i=0;i<this._queuedFetches.length;i++){var _71d=this._queuedFetches[i],_71e=_71d.args,_71f=_71d.filter;if(_71f){_71f(_71e,this._getItemsArray(_71e.queryOptions));}else{this.fetchItemByIdentity(_71e);}}this._queuedFetches=[];}},_getItemsArray:function(_720){if(_720&&_720.deep){return this._arrayOfAllItems;}return this._arrayOfTopLevelItems;},close:function(_721){if(this.clearOnClose&&this._loadFinished&&!this._loadInProgress){if(((this._jsonFileUrl==""||this._jsonFileUrl==null)&&(this.url==""||this.url==null))&&this.data==null){}this._arrayOfAllItems=[];this._arrayOfTopLevelItems=[];this._loadFinished=false;this._itemsByIdentity=null;this._loadInProgress=false;this._queuedFetches=[];}},_getItemsFromLoadedData:function(_722){var _723=false,self=this;function _724(_725){return (_725!==null)&&(typeof _725==="object")&&(!lang.isArray(_725)||_723)&&(!lang.isFunction(_725))&&(_725.constructor==Object||lang.isArray(_725))&&(typeof _725._reference==="undefined")&&(typeof _725._type==="undefined")&&(typeof _725._value==="undefined")&&self.hierarchical;};function _726(_727){self._arrayOfAllItems.push(_727);for(var _728 in _727){var _729=_727[_728];if(_729){if(lang.isArray(_729)){var _72a=_729;for(var k=0;k<_72a.length;++k){var _72b=_72a[k];if(_724(_72b)){_726(_72b);}}}else{if(_724(_729)){_726(_729);}}}}};this._labelAttr=_722.label;var i,item;this._arrayOfAllItems=[];this._arrayOfTopLevelItems=_722.items;for(i=0;i<this._arrayOfTopLevelItems.length;++i){item=this._arrayOfTopLevelItems[i];if(lang.isArray(item)){_723=true;}_726(item);item[this._rootItemPropName]=true;}var _72c={},key;for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];for(key in item){if(key!==this._rootItemPropName){var _72d=item[key];if(_72d!==null){if(!lang.isArray(_72d)){item[key]=[_72d];}}else{item[key]=[null];}}_72c[key]=key;}}while(_72c[this._storeRefPropName]){this._storeRefPropName+="_";}while(_72c[this._itemNumPropName]){this._itemNumPropName+="_";}while(_72c[this._reverseRefMap]){this._reverseRefMap+="_";}var _72e;var _72f=_722.identifier;if(_72f){this._itemsByIdentity={};this._features["dojo.data.api.Identity"]=_72f;for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];_72e=item[_72f];var _730=_72e[0];if(!Object.hasOwnProperty.call(this._itemsByIdentity,_730)){this._itemsByIdentity[_730]=item;}else{if(this._jsonFileUrl){throw new Error("dojo.data.ItemFileReadStore: The json data as specified by: ["+this._jsonFileUrl+"] is malformed. Items within the list have identifier: ["+_72f+"]. Value collided: ["+_730+"]");}else{if(this._jsonData){throw new Error("dojo.data.ItemFileReadStore: The json data provided by the creation arguments is malformed. Items within the list have identifier: ["+_72f+"]. Value collided: ["+_730+"]");}}}}}else{this._features["dojo.data.api.Identity"]=Number;}for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];item[this._storeRefPropName]=this;item[this._itemNumPropName]=i;}for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];for(key in item){_72e=item[key];for(var j=0;j<_72e.length;++j){_72d=_72e[j];if(_72d!==null&&typeof _72d=="object"){if(("_type" in _72d)&&("_value" in _72d)){var type=_72d._type;var _731=this._datatypeMap[type];if(!_731){throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '"+type+"'");}else{if(lang.isFunction(_731)){_72e[j]=new _731(_72d._value);}else{if(lang.isFunction(_731.deserialize)){_72e[j]=_731.deserialize(_72d._value);}else{throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");}}}}if(_72d._reference){var _732=_72d._reference;if(!lang.isObject(_732)){_72e[j]=this._getItemByIdentity(_732);}else{for(var k=0;k<this._arrayOfAllItems.length;++k){var _733=this._arrayOfAllItems[k],_734=true;for(var _735 in _732){if(_733[_735]!=_732[_735]){_734=false;}}if(_734){_72e[j]=_733;}}}if(this.referenceIntegrity){var _736=_72e[j];if(this.isItem(_736)){this._addReferenceToMap(_736,item,key);}}}else{if(this.isItem(_72d)){if(this.referenceIntegrity){this._addReferenceToMap(_72d,item,key);}}}}}}}},_addReferenceToMap:function(_737,_738,_739){},getIdentity:function(item){var _73a=this._features["dojo.data.api.Identity"];if(_73a===Number){return item[this._itemNumPropName];}else{var _73b=item[_73a];if(_73b){return _73b[0];}}return null;},fetchItemByIdentity:function(_73c){var item,_73d;if(!this._loadFinished){var self=this;if(this._jsonFileUrl!==this._ccUrl){_6f1.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null&&this._jsonData==null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){if(this._loadInProgress){this._queuedFetches.push({args:_73c});}else{this._loadInProgress=true;var _73e={url:self._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _73f=xhr.get(_73e);_73f.addCallback(function(data){var _740=_73c.scope?_73c.scope:_6f5.global;try{self._getItemsFromLoadedData(data);self._loadFinished=true;self._loadInProgress=false;item=self._getItemByIdentity(_73c.identity);if(_73c.onItem){_73c.onItem.call(_740,item);}self._handleQueuedFetches();}catch(error){self._loadInProgress=false;if(_73c.onError){_73c.onError.call(_740,error);}}});_73f.addErrback(function(_741){self._loadInProgress=false;if(_73c.onError){var _742=_73c.scope?_73c.scope:_6f5.global;_73c.onError.call(_742,_741);}});}}else{if(this._jsonData){self._getItemsFromLoadedData(self._jsonData);self._jsonData=null;self._loadFinished=true;item=self._getItemByIdentity(_73c.identity);if(_73c.onItem){_73d=_73c.scope?_73c.scope:_6f5.global;_73c.onItem.call(_73d,item);}}}}else{item=this._getItemByIdentity(_73c.identity);if(_73c.onItem){_73d=_73c.scope?_73c.scope:_6f5.global;_73c.onItem.call(_73d,item);}}},_getItemByIdentity:function(_743){var item=null;if(this._itemsByIdentity){if(Object.hasOwnProperty.call(this._itemsByIdentity,_743)){item=this._itemsByIdentity[_743];}}else{if(Object.hasOwnProperty.call(this._arrayOfAllItems,_743)){item=this._arrayOfAllItems[_743];}}if(item===undefined){item=null;}return item;},getIdentityAttributes:function(item){var _744=this._features["dojo.data.api.Identity"];if(_744===Number){return null;}else{return [_744];}},_forceLoad:function(){var self=this;if(this._jsonFileUrl!==this._ccUrl){_6f1.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){var _745={url:this._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk,sync:true};var _746=xhr.get(_745);_746.addCallback(function(data){try{if(self._loadInProgress!==true&&!self._loadFinished){self._getItemsFromLoadedData(data);self._loadFinished=true;}else{if(self._loadInProgress){throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress.");}}}catch(e){throw e;}});_746.addErrback(function(_747){throw _747;});}else{if(this._jsonData){self._getItemsFromLoadedData(self._jsonData);self._jsonData=null;self._loadFinished=true;}}}});lang.extend(_6f9,_6f7);return _6f9;});},"dojo/html":function(){define("dojo/html",["./_base/kernel","./_base/lang","./_base/array","./_base/declare","./dom","./dom-construct","./parser"],function(dojo,lang,_748,_749,dom,_74a,_74b){lang.getObject("html",true,dojo);var _74c=0;dojo.html._secureForInnerHtml=function(cont){return cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig,"");};dojo.html._emptyNode=_74a.empty;dojo.html._setNodeContent=function(node,cont){_74a.empty(node);if(cont){if(typeof cont=="string"){cont=_74a.toDom(cont,node.ownerDocument);}if(!cont.nodeType&&lang.isArrayLike(cont)){for(var _74d=cont.length,i=0;i<cont.length;i=_74d==cont.length?i+1:0){_74a.place(cont[i],node,"last");}}else{_74a.place(cont,node,"last");}}return node;};_749("dojo.html._ContentSetter",null,{node:"",content:"",id:"",cleanContent:false,extractContent:false,parseContent:false,parserScope:dojo._scopeName,startup:true,constructor:function(_74e,node){lang.mixin(this,_74e||{});node=this.node=dom.byId(this.node||node);if(!this.id){this.id=["Setter",(node)?node.id||node.tagName:"",_74c++].join("_");}},set:function(cont,_74f){if(undefined!==cont){this.content=cont;}if(_74f){this._mixin(_74f);}this.onBegin();this.setContent();this.onEnd();return this.node;},setContent:function(){var node=this.node;if(!node){throw new Error(this.declaredClass+": setContent given no node");}try{node=dojo.html._setNodeContent(node,this.content);}catch(e){var _750=this.onContentError(e);try{node.innerHTML=_750;}catch(e){console.error("Fatal "+this.declaredClass+".setContent could not change content due to "+e.message,e);}}this.node=node;},empty:function(){if(this.parseResults&&this.parseResults.length){_748.forEach(this.parseResults,function(w){if(w.destroy){w.destroy();}});delete this.parseResults;}dojo.html._emptyNode(this.node);},onBegin:function(){var cont=this.content;if(lang.isString(cont)){if(this.cleanContent){cont=dojo.html._secureForInnerHtml(cont);}if(this.extractContent){var _751=cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_751){cont=_751[1];}}}this.empty();this.content=cont;return this.node;},onEnd:function(){if(this.parseContent){this._parse();}return this.node;},tearDown:function(){delete this.parseResults;delete this.node;delete this.content;},onContentError:function(err){return "Error occured setting content: "+err;},_mixin:function(_752){var _753={},key;for(key in _752){if(key in _753){continue;}this[key]=_752[key];}},_parse:function(){var _754=this.node;try{var _755={};_748.forEach(["dir","lang","textDir"],function(name){if(this[name]){_755[name]=this[name];}},this);this.parseResults=_74b.parse({rootNode:_754,noStart:!this.startup,inherited:_755,scope:this.parserScope});}catch(e){this._onError("Content",e,"Error parsing in _ContentSetter#"+this.id);}},_onError:function(type,err,_756){var _757=this["on"+type+"Error"].call(this,err);if(_756){console.error(_756,err);}else{if(_757){dojo.html._setNodeContent(this.node,_757,true);}}}});dojo.html.set=function(node,cont,_758){if(undefined==cont){console.warn("dojo.html.set: no cont argument provided, using empty string");cont="";}if(!_758){return dojo.html._setNodeContent(node,cont,true);}else{var op=new dojo.html._ContentSetter(lang.mixin(_758,{content:cont,node:node}));return op.set();}};return dojo.html;});},"dijit/_PaletteMixin":function(){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(_759,_75a,_75b,_75c,_75d,keys,lang,_75e,_75f,_760){return _759("dijit._PaletteMixin",[_75e],{defaultTimeout:500,timeoutChangeRate:0.9,value:"",_selectedCell:-1,tabIndex:"0",cellClass:"dijitPaletteCell",dyeClass:"",summary:"",_setSummaryAttr:"paletteTableNode",_dyeFactory:function(_761){var _762=lang.getObject(this.dyeClass);return new _762(_761);},_preparePalette:function(_763,_764){this._cells=[];var url=this._blankGif;this.connect(this.gridNode,"ondijitclick","_onCellClick");for(var row=0;row<_763.length;row++){var _765=_75c.create("tr",{tabIndex:"-1"},this.gridNode);for(var col=0;col<_763[row].length;col++){var _766=_763[row][col];if(_766){var _767=this._dyeFactory(_766,row,col);var _768=_75c.create("td",{"class":this.cellClass,tabIndex:"-1",title:_764[_766],role:"gridcell"});_767.fillCell(_768,url);_75c.place(_768,_765);_768.index=this._cells.length;this._cells.push({node:_768,dye:_767});}}}this._xDim=_763[0].length;this._yDim=_763.length;var _769={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:this.isLeftToRight()?1:-1,LEFT_ARROW:this.isLeftToRight()?-1:1};for(var key in _769){this._connects.push(_760.addKeyListener(this.domNode,{charOrCode:keys[key],ctrlKey:false,altKey:false,shiftKey:false},this,function(){var _76a=_769[key];return function(_76b){this._navigateByKey(_76a,_76b);};}(),this.timeoutChangeRate,this.defaultTimeout));}},postCreate:function(){this.inherited(arguments);this._setCurrent(this._cells[0].node);},focus:function(){_75f.focus(this._currentFocus);},_onCellClick:function(evt){var _76c=evt.target;while(_76c.tagName!="TD"){if(!_76c.parentNode||_76c==this.gridNode){return;}_76c=_76c.parentNode;}var _76d=this._getDye(_76c).getValue();this._setCurrent(_76c);_75f.focus(_76c);this._setValueAttr(_76d,true);_75d.stop(evt);},_setCurrent:function(node){if("_currentFocus" in this){_75a.set(this._currentFocus,"tabIndex","-1");}this._currentFocus=node;if(node){_75a.set(node,"tabIndex",this.tabIndex);}},_setValueAttr:function(_76e,_76f){if(this._selectedCell>=0){_75b.remove(this._cells[this._selectedCell].node,this.cellClass+"Selected");}this._selectedCell=-1;if(_76e){for(var i=0;i<this._cells.length;i++){if(_76e==this._cells[i].dye.getValue()){this._selectedCell=i;_75b.add(this._cells[i].node,this.cellClass+"Selected");break;}}}this._set("value",this._selectedCell>=0?_76e:null);if(_76f||_76f===undefined){this.onChange(_76e);}},onChange:function(){},_navigateByKey:function(_770,_771){if(_771==-1){return;}var _772=this._currentFocus.index+_770;if(_772<this._cells.length&&_772>-1){var _773=this._cells[_772].node;this._setCurrent(_773);setTimeout(lang.hitch(dijit,"focus",_773),0);}},_getDye:function(cell){return this._cells[cell.index].dye;}});});},"dijit/form/ValidationTextBox":function(){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(_774,i18n,_775,_776,_777){return _774("dijit.form.ValidationTextBox",_775,{templateString:_777,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(_778,_779){return (new RegExp("^(?:"+this.regExpGen(_779)+")"+(this.required?"":"?")+"$")).test(_778)&&(!this.required||!this._isEmpty(_778))&&(this._isEmpty(_778)||this.parse(_778,_779)!==undefined);},_isValidSubset:function(){return this.textbox.value.search(this._partialre)==0;},isValid:function(){return this.validator(this.textbox.value,this.constraints);},_isEmpty:function(_77a){return (this.trim?/^\s*$/:/^$/).test(_77a);},getErrorMessage:function(){return (this.required&&this._isEmpty(this.textbox.value))?this.missingMessage:this.invalidMessage;},getPromptMessage:function(){return this.promptMessage;},_maskValidSubsetError:true,validate:function(_77b){var _77c="";var _77d=this.disabled||this.isValid(_77b);if(_77d){this._maskValidSubsetError=true;}var _77e=this._isEmpty(this.textbox.value);var _77f=!_77d&&_77b&&this._isValidSubset();this._set("state",_77d?"":(((((!this._hasBeenBlurred||_77b)&&_77e)||_77f)&&this._maskValidSubsetError)?"Incomplete":"Error"));this.focusNode.setAttribute("aria-invalid",_77d?"false":"true");if(this.state=="Error"){this._maskValidSubsetError=_77b&&_77f;_77c=this.getErrorMessage(_77b);}else{if(this.state=="Incomplete"){_77c=this.getPromptMessage(_77b);this._maskValidSubsetError=!this._hasBeenBlurred||_77b;}else{if(_77e){_77c=this.getPromptMessage(_77b);}}}this.set("message",_77c);return _77d;},displayMessage:function(_780){if(_780&&this.focused){_776.show(_780,this.domNode,this.tooltipPosition,!this.isLeftToRight());}else{_776.hide(this.domNode);}},_refreshState:function(){this.validate(this.focused);this.inherited(arguments);},constructor:function(){this.constraints={};},_setConstraintsAttr:function(_781){if(!_781.locale&&this.lang){_781.locale=this.lang;}this._set("constraints",_781);this._computePartialRE();},_computePartialRE:function(){var p=this.regExpGen(this.constraints);this.regExp=p;var _782="";if(p!=".*"){this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,function(re){switch(re.charAt(0)){case "{":case "+":case "?":case "*":case "^":case "$":case "|":case "(":_782+=re;break;case ")":_782+="|$)";break;default:_782+="(?:"+re+"|$)";break;}});}try{"".search(_782);}catch(e){_782=this.regExp;console.warn("RegExp error in "+this.declaredClass+": "+this.regExp);}this._partialre="^(?:"+_782+")$";},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);},_setDisabledAttr:function(_783){this.inherited(arguments);this._refreshState();},_setRequiredAttr:function(_784){this._set("required",_784);this.focusNode.setAttribute("aria-required",_784);this._refreshState();},_setMessageAttr:function(_785){this._set("message",_785);this.displayMessage(_785);},reset:function(){this._maskValidSubsetError=true;this.inherited(arguments);},_onBlur:function(){this.displayMessage("");this.inherited(arguments);}});});},"dijit/_base/typematic":function(){define("dijit/_base/typematic",["../typematic"],function(){});},"dijit/_base":function(){define("dijit/_base",[".","./a11y","./WidgetSet","./_base/focus","./_base/manager","./_base/place","./_base/popup","./_base/scroll","./_base/sniff","./_base/typematic","./_base/wai","./_base/window"],function(_786){return _786._base;});},"dijit/layout/BorderContainer":function(){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(_787,_788,_789,_78a,_78b,_78c,_78d,_78e,keys,lang,on,_78f,win,_790,_791,_792,_793,_794){var _795=_789("dijit.layout._Splitter",[_791,_792],{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);_78a.add(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V"));if(this.container.persist){var _796=_788(this._cookieName);if(_796){this.child.domNode.style[this.horizontal?"height":"width"]=_796;}}},_computeMaxSize:function(){var dim=this.horizontal?"h":"w",_797=_78c.getMarginBox(this.child.domNode)[dim],_798=_787.filter(this.container.getChildren(),function(_799){return _799.region=="center";})[0],_79a=_78c.getMarginBox(_798.domNode)[dim];return Math.min(this.child.maxSize,_797+_79a);},_startDrag:function(e){if(!this.cover){this.cover=win.doc.createElement("div");_78a.add(this.cover,"dijitSplitterCover");_78b.place(this.cover,this.child.domNode,"after");}_78a.add(this.cover,"dijitSplitterCoverActive");if(this.fake){_78b.destroy(this.fake);}if(!(this._resize=this.live)){(this.fake=this.domNode.cloneNode(true)).removeAttribute("id");_78a.add(this.domNode,"dijitSplitterShadow");_78b.place(this.fake,this.domNode,"after");}_78a.add(this.domNode,"dijitSplitterActive dijitSplitter"+(this.horizontal?"H":"V")+"Active");if(this.fake){_78a.remove(this.fake,"dijitSplitterHover dijitSplitter"+(this.horizontal?"H":"V")+"Hover");}var _79b=this._factor,_79c=this.horizontal,axis=_79c?"pageY":"pageX",_79d=e[axis],_79e=this.domNode.style,dim=_79c?"h":"w",_79f=_78c.getMarginBox(this.child.domNode)[dim],max=this._computeMaxSize(),min=this.child.minSize||20,_7a0=this.region,_7a1=_7a0=="top"||_7a0=="bottom"?"top":"left",_7a2=parseInt(_79e[_7a1],10),_7a3=this._resize,_7a4=lang.hitch(this.container,"_layoutChildren",this.child.id),de=win.doc;this._handlers=this._handlers.concat([on(de,_78f.move,this._drag=function(e,_7a5){var _7a6=e[axis]-_79d,_7a7=_79b*_7a6+_79f,_7a8=Math.max(Math.min(_7a7,max),min);if(_7a3||_7a5){_7a4(_7a8);}_79e[_7a1]=_7a6+_7a2+_79b*(_7a8-_7a7)+"px";}),on(de,"dragstart",_78e.stop),on(win.body(),"selectstart",_78e.stop),on(de,_78f.release,lang.hitch(this,"_stopDrag"))]);_78e.stop(e);},_onMouse:function(e){var o=(e.type=="mouseover"||e.type=="mouseenter");_78a.toggle(this.domNode,"dijitSplitterHover",o);_78a.toggle(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Hover",o);},_stopDrag:function(e){try{if(this.cover){_78a.remove(this.cover,"dijitSplitterCoverActive");}if(this.fake){_78b.destroy(this.fake);}_78a.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){_788(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 _7a9=this.horizontal;var tick=1;switch(e.charOrCode){case _7a9?keys.UP_ARROW:keys.LEFT_ARROW:tick*=-1;case _7a9?keys.DOWN_ARROW:keys.RIGHT_ARROW:break;default:return;}var _7aa=_78c.getMarginSize(this.child.domNode)[_7a9?"h":"w"]+this._factor*tick;this.container._layoutChildren(this.child.id,Math.max(Math.min(_7aa,this._computeMaxSize()),this.child.minSize));_78e.stop(e);},destroy:function(){this._cleanupHandlers();delete this.child;delete this.container;delete this.cover;delete this.fake;this.inherited(arguments);}});var _7ab=_789("dijit.layout._Gutter",[_791,_792],{templateString:"<div class=\"dijitGutter\" role=\"presentation\"></div>",postMixInProperties:function(){this.inherited(arguments);this.horizontal=/top|bottom/.test(this.region);},buildRendering:function(){this.inherited(arguments);_78a.add(this.domNode,"dijitGutter"+(this.horizontal?"H":"V"));}});var _7ac=_789("dijit.layout.BorderContainer",_793,{design:"headline",gutters:true,liveSplitters:true,persist:false,baseClass:"dijitBorderContainer",_splitterClass:_795,postMixInProperties:function(){if(!this.gutters){this.baseClass+="NoGutter";}this.inherited(arguments);},startup:function(){if(this._started){return;}_787.forEach(this.getChildren(),this._setupChild,this);this.inherited(arguments);},_setupChild:function(_7ad){var _7ae=_7ad.region;if(_7ae){this.inherited(arguments);_78a.add(_7ad.domNode,this.baseClass+"Pane");var ltr=this.isLeftToRight();if(_7ae=="leading"){_7ae=ltr?"left":"right";}if(_7ae=="trailing"){_7ae=ltr?"right":"left";}if(_7ae!="center"&&(_7ad.splitter||this.gutters)&&!_7ad._splitterWidget){var _7af=_7ad.splitter?this._splitterClass:_7ab;if(lang.isString(_7af)){_7af=lang.getObject(_7af);}var _7b0=new _7af({id:_7ad.id+"_splitter",container:this,child:_7ad,region:_7ae,live:this.liveSplitters});_7b0.isSplitter=true;_7ad._splitterWidget=_7b0;_78b.place(_7b0.domNode,_7ad.domNode,"after");_7b0.startup();}_7ad.region=_7ae;}},layout:function(){this._layoutChildren();},addChild:function(_7b1,_7b2){this.inherited(arguments);if(this._started){this.layout();}},removeChild:function(_7b3){var _7b4=_7b3.region;var _7b5=_7b3._splitterWidget;if(_7b5){_7b5.destroy();delete _7b3._splitterWidget;}this.inherited(arguments);if(this._started){this._layoutChildren();}_78a.remove(_7b3.domNode,this.baseClass+"Pane");_78d.set(_7b3.domNode,{top:"auto",bottom:"auto",left:"auto",right:"auto",position:"static"});_78d.set(_7b3.domNode,_7b4=="top"||_7b4=="bottom"?"width":"height","auto");},getChildren:function(){return _787.filter(this.inherited(arguments),function(_7b6){return !_7b6.isSplitter;});},getSplitter:function(_7b7){return _787.filter(this.getChildren(),function(_7b8){return _7b8.region==_7b7;})[0]._splitterWidget;},resize:function(_7b9,_7ba){if(!this.cs||!this.pe){var node=this.domNode;this.cs=_78d.getComputedStyle(node);this.pe=_78c.getPadExtents(node,this.cs);this.pe.r=_78d.toPixelValue(node,this.cs.paddingRight);this.pe.b=_78d.toPixelValue(node,this.cs.paddingBottom);_78d.set(node,"padding","0px");}this.inherited(arguments);},_layoutChildren:function(_7bb,_7bc){if(!this._borderBox||!this._borderBox.h){return;}var _7bd=_787.map(this.getChildren(),function(_7be,idx){return {pane:_7be,weight:[_7be.region=="center"?Infinity:0,_7be.layoutPriority,(this.design=="sidebar"?1:-1)*(/top|bottom/.test(_7be.region)?1:-1),idx]};},this);_7bd.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 _7bf=[];_787.forEach(_7bd,function(_7c0){var pane=_7c0.pane;_7bf.push(pane);if(pane._splitterWidget){_7bf.push(pane._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};_794.layoutChildren(this.domNode,dim,_7bf,_7bb,_7bc);},destroyRecursive:function(){_787.forEach(this.getChildren(),function(_7c1){var _7c2=_7c1._splitterWidget;if(_7c2){_7c2.destroy();}delete _7c1._splitterWidget;});this.inherited(arguments);}});lang.extend(_790,{region:"",layoutPriority:0,splitter:false,minSize:0,maxSize:Infinity});_7ac._Splitter=_795;_7ac._Gutter=_7ab;return _7ac;});},"dojo/window":function(){define("dojo/window",["./_base/lang","./_base/sniff","./_base/window","./dom","./dom-geometry","./dom-style"],function(lang,has,_7c3,dom,geom,_7c4){var _7c5=lang.getObject("dojo.window",true);_7c5.getBox=function(){var _7c6=(_7c3.doc.compatMode=="BackCompat")?_7c3.body():_7c3.doc.documentElement,_7c7=geom.docScroll(),w,h;if(has("touch")){var _7c8=_7c3.doc.parentWindow||_7c3.doc.defaultView;w=_7c8.innerWidth||_7c6.clientWidth;h=_7c8.innerHeight||_7c6.clientHeight;}else{w=_7c6.clientWidth;h=_7c6.clientHeight;}return {l:_7c7.x,t:_7c7.y,w:w,h:h};};_7c5.get=function(doc){if(has("ie")&&_7c5!==document.parentWindow){doc.parentWindow.execScript("document._parentWindow = window;","Javascript");var win=doc._parentWindow;doc._parentWindow=null;return win;}return doc.parentWindow||doc.defaultView;};_7c5.scrollIntoView=function(node,pos){try{node=dom.byId(node);var doc=node.ownerDocument||_7c3.doc,body=doc.body||_7c3.body(),html=doc.documentElement||body.parentNode,isIE=has("ie"),isWK=has("webkit");if((!(has("mozilla")||isIE||isWK||has("opera"))||node==body||node==html)&&(typeof node.scrollIntoView!="undefined")){node.scrollIntoView(false);return;}var _7c9=doc.compatMode=="BackCompat",_7ca=(isIE>=9&&node.ownerDocument.parentWindow.frameElement)?((html.clientHeight>0&&html.clientWidth>0&&(body.clientHeight==0||body.clientWidth==0||body.clientHeight>html.clientHeight||body.clientWidth>html.clientWidth))?html:body):(_7c9?body:html),_7cb=isWK?body:_7ca,_7cc=_7ca.clientWidth,_7cd=_7ca.clientHeight,rtl=!geom.isBodyLtr(),_7ce=pos||geom.position(node),el=node.parentNode,_7cf=function(el){return ((isIE<=6||(isIE&&_7c9))?false:(_7c4.get(el,"position").toLowerCase()=="fixed"));};if(_7cf(node)){return;}while(el){if(el==body){el=_7cb;}var _7d0=geom.position(el),_7d1=_7cf(el);if(el==_7cb){_7d0.w=_7cc;_7d0.h=_7cd;if(_7cb==html&&isIE&&rtl){_7d0.x+=_7cb.offsetWidth-_7d0.w;}if(_7d0.x<0||!isIE){_7d0.x=0;}if(_7d0.y<0||!isIE){_7d0.y=0;}}else{var pb=geom.getPadBorderExtents(el);_7d0.w-=pb.w;_7d0.h-=pb.h;_7d0.x+=pb.l;_7d0.y+=pb.t;var _7d2=el.clientWidth,_7d3=_7d0.w-_7d2;if(_7d2>0&&_7d3>0){_7d0.w=_7d2;_7d0.x+=(rtl&&(isIE||el.clientLeft>pb.l))?_7d3:0;}_7d2=el.clientHeight;_7d3=_7d0.h-_7d2;if(_7d2>0&&_7d3>0){_7d0.h=_7d2;}}if(_7d1){if(_7d0.y<0){_7d0.h+=_7d0.y;_7d0.y=0;}if(_7d0.x<0){_7d0.w+=_7d0.x;_7d0.x=0;}if(_7d0.y+_7d0.h>_7cd){_7d0.h=_7cd-_7d0.y;}if(_7d0.x+_7d0.w>_7cc){_7d0.w=_7cc-_7d0.x;}}var l=_7ce.x-_7d0.x,t=_7ce.y-Math.max(_7d0.y,0),r=l+_7ce.w-_7d0.w,bot=t+_7ce.h-_7d0.h;if(r*l>0){var s=Math[l<0?"max":"min"](l,r);if(rtl&&((isIE==8&&!_7c9)||isIE>=9)){s=-s;}_7ce.x+=el.scrollLeft;el.scrollLeft+=s;_7ce.x-=el.scrollLeft;}if(bot*t>0){_7ce.y+=el.scrollTop;el.scrollTop+=Math[t<0?"max":"min"](t,bot);_7ce.y-=el.scrollTop;}el=(el!=_7cb)&&!_7d1&&el.parentNode;}}catch(error){console.error("scrollIntoView: "+error);node.scrollIntoView(false);}};return _7c5;});},"dojo/number":function(){define("dojo/number",["./_base/kernel","./_base/lang","./i18n","./i18n!./cldr/nls/number","./string","./regexp"],function(dojo,lang,i18n,_7d4,_7d5,_7d6){lang.getObject("number",true,dojo);dojo.number.format=function(_7d7,_7d8){_7d8=lang.mixin({},_7d8||{});var _7d9=i18n.normalizeLocale(_7d8.locale),_7da=i18n.getLocalization("dojo.cldr","number",_7d9);_7d8.customs=_7da;var _7db=_7d8.pattern||_7da[(_7d8.type||"decimal")+"Format"];if(isNaN(_7d7)||Math.abs(_7d7)==Infinity){return null;}return dojo.number._applyPattern(_7d7,_7db,_7d8);};dojo.number._numberPatternRE=/[#0,]*[#0](?:\.0*#*)?/;dojo.number._applyPattern=function(_7dc,_7dd,_7de){_7de=_7de||{};var _7df=_7de.customs.group,_7e0=_7de.customs.decimal,_7e1=_7dd.split(";"),_7e2=_7e1[0];_7dd=_7e1[(_7dc<0)?1:0]||("-"+_7e2);if(_7dd.indexOf("%")!=-1){_7dc*=100;}else{if(_7dd.indexOf("‰")!=-1){_7dc*=1000;}else{if(_7dd.indexOf("¤")!=-1){_7df=_7de.customs.currencyGroup||_7df;_7e0=_7de.customs.currencyDecimal||_7e0;_7dd=_7dd.replace(/\u00a4{1,3}/,function(_7e3){var prop=["symbol","currency","displayName"][_7e3.length-1];return _7de[prop]||_7de.currency||"";});}else{if(_7dd.indexOf("E")!=-1){throw new Error("exponential notation not supported");}}}}var _7e4=dojo.number._numberPatternRE;var _7e5=_7e2.match(_7e4);if(!_7e5){throw new Error("unable to find a number expression in pattern: "+_7dd);}if(_7de.fractional===false){_7de.places=0;}return _7dd.replace(_7e4,dojo.number._formatAbsolute(_7dc,_7e5[0],{decimal:_7e0,group:_7df,places:_7de.places,round:_7de.round}));};dojo.number.round=function(_7e6,_7e7,_7e8){var _7e9=10/(_7e8||10);return (_7e9*+_7e6).toFixed(_7e7)/_7e9;};if((0.9).toFixed()==0){var _7ea=dojo.number.round;dojo.number.round=function(v,p,m){var d=Math.pow(10,-p||0),a=Math.abs(v);if(!v||a>=d||a*Math.pow(10,p+1)<5){d=0;}return _7ea(v,p,m)+(v>0?d:-d);};}dojo.number._formatAbsolute=function(_7eb,_7ec,_7ed){_7ed=_7ed||{};if(_7ed.places===true){_7ed.places=0;}if(_7ed.places===Infinity){_7ed.places=6;}var _7ee=_7ec.split("."),_7ef=typeof _7ed.places=="string"&&_7ed.places.indexOf(","),_7f0=_7ed.places;if(_7ef){_7f0=_7ed.places.substring(_7ef+1);}else{if(!(_7f0>=0)){_7f0=(_7ee[1]||[]).length;}}if(!(_7ed.round<0)){_7eb=dojo.number.round(_7eb,_7f0,_7ed.round);}var _7f1=String(Math.abs(_7eb)).split("."),_7f2=_7f1[1]||"";if(_7ee[1]||_7ed.places){if(_7ef){_7ed.places=_7ed.places.substring(0,_7ef);}var pad=_7ed.places!==undefined?_7ed.places:(_7ee[1]&&_7ee[1].lastIndexOf("0")+1);if(pad>_7f2.length){_7f1[1]=_7d5.pad(_7f2,pad,"0",true);}if(_7f0<_7f2.length){_7f1[1]=_7f2.substr(0,_7f0);}}else{if(_7f1[1]){_7f1.pop();}}var _7f3=_7ee[0].replace(",","");pad=_7f3.indexOf("0");if(pad!=-1){pad=_7f3.length-pad;if(pad>_7f1[0].length){_7f1[0]=_7d5.pad(_7f1[0],pad);}if(_7f3.indexOf("#")==-1){_7f1[0]=_7f1[0].substr(_7f1[0].length-pad);}}var _7f4=_7ee[0].lastIndexOf(","),_7f5,_7f6;if(_7f4!=-1){_7f5=_7ee[0].length-_7f4-1;var _7f7=_7ee[0].substr(0,_7f4);_7f4=_7f7.lastIndexOf(",");if(_7f4!=-1){_7f6=_7f7.length-_7f4-1;}}var _7f8=[];for(var _7f9=_7f1[0];_7f9;){var off=_7f9.length-_7f5;_7f8.push((off>0)?_7f9.substr(off):_7f9);_7f9=(off>0)?_7f9.slice(0,off):"";if(_7f6){_7f5=_7f6;delete _7f6;}}_7f1[0]=_7f8.reverse().join(_7ed.group||",");return _7f1.join(_7ed.decimal||".");};dojo.number.regexp=function(_7fa){return dojo.number._parseInfo(_7fa).regexp;};dojo.number._parseInfo=function(_7fb){_7fb=_7fb||{};var _7fc=i18n.normalizeLocale(_7fb.locale),_7fd=i18n.getLocalization("dojo.cldr","number",_7fc),_7fe=_7fb.pattern||_7fd[(_7fb.type||"decimal")+"Format"],_7ff=_7fd.group,_800=_7fd.decimal,_801=1;if(_7fe.indexOf("%")!=-1){_801/=100;}else{if(_7fe.indexOf("‰")!=-1){_801/=1000;}else{var _802=_7fe.indexOf("¤")!=-1;if(_802){_7ff=_7fd.currencyGroup||_7ff;_800=_7fd.currencyDecimal||_800;}}}var _803=_7fe.split(";");if(_803.length==1){_803.push("-"+_803[0]);}var re=_7d6.buildGroupRE(_803,function(_804){_804="(?:"+_7d6.escapeString(_804,".")+")";return _804.replace(dojo.number._numberPatternRE,function(_805){var _806={signed:false,separator:_7fb.strict?_7ff:[_7ff,""],fractional:_7fb.fractional,decimal:_800,exponent:false},_807=_805.split("."),_808=_7fb.places;if(_807.length==1&&_801!=1){_807[1]="###";}if(_807.length==1||_808===0){_806.fractional=false;}else{if(_808===undefined){_808=_7fb.pattern?_807[1].lastIndexOf("0")+1:Infinity;}if(_808&&_7fb.fractional==undefined){_806.fractional=true;}if(!_7fb.places&&(_808<_807[1].length)){_808+=","+_807[1].length;}_806.places=_808;}var _809=_807[0].split(",");if(_809.length>1){_806.groupSize=_809.pop().length;if(_809.length>1){_806.groupSize2=_809.pop().length;}}return "("+dojo.number._realNumberRegexp(_806)+")";});},true);if(_802){re=re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g,function(_80a,_80b,_80c,_80d){var prop=["symbol","currency","displayName"][_80c.length-1],_80e=_7d6.escapeString(_7fb[prop]||_7fb.currency||"");_80b=_80b?"[\\s\\xa0]":"";_80d=_80d?"[\\s\\xa0]":"";if(!_7fb.strict){if(_80b){_80b+="*";}if(_80d){_80d+="*";}return "(?:"+_80b+_80e+_80d+")?";}return _80b+_80e+_80d;});}return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_7ff,decimal:_800,factor:_801};};dojo.number.parse=function(_80f,_810){var info=dojo.number._parseInfo(_810),_811=(new RegExp("^"+info.regexp+"$")).exec(_80f);if(!_811){return NaN;}var _812=_811[1];if(!_811[1]){if(!_811[2]){return NaN;}_812=_811[2];info.factor*=-1;}_812=_812.replace(new RegExp("["+info.group+"\\s\\xa0"+"]","g"),"").replace(info.decimal,".");return _812*info.factor;};dojo.number._realNumberRegexp=function(_813){_813=_813||{};if(!("places" in _813)){_813.places=Infinity;}if(typeof _813.decimal!="string"){_813.decimal=".";}if(!("fractional" in _813)||/^0/.test(_813.places)){_813.fractional=[true,false];}if(!("exponent" in _813)){_813.exponent=[true,false];}if(!("eSigned" in _813)){_813.eSigned=[true,false];}var _814=dojo.number._integerRegexp(_813),_815=_7d6.buildGroupRE(_813.fractional,function(q){var re="";if(q&&(_813.places!==0)){re="\\"+_813.decimal;if(_813.places==Infinity){re="(?:"+re+"\\d+)?";}else{re+="\\d{"+_813.places+"}";}}return re;},true);var _816=_7d6.buildGroupRE(_813.exponent,function(q){if(q){return "([eE]"+dojo.number._integerRegexp({signed:_813.eSigned})+")";}return "";});var _817=_814+_815;if(_815){_817="(?:(?:"+_817+")|(?:"+_815+"))";}return _817+_816;};dojo.number._integerRegexp=function(_818){_818=_818||{};if(!("signed" in _818)){_818.signed=[true,false];}if(!("separator" in _818)){_818.separator="";}else{if(!("groupSize" in _818)){_818.groupSize=3;}}var _819=_7d6.buildGroupRE(_818.signed,function(q){return q?"[-+]":"";},true);var _81a=_7d6.buildGroupRE(_818.separator,function(sep){if(!sep){return "(?:\\d+)";}sep=_7d6.escapeString(sep);if(sep==" "){sep="\\s";}else{if(sep==" "){sep="\\s\\xa0";}}var grp=_818.groupSize,grp2=_818.groupSize2;if(grp2){var _81b="(?:0|[1-9]\\d{0,"+(grp2-1)+"}(?:["+sep+"]\\d{"+grp2+"})*["+sep+"]\\d{"+grp+"})";return ((grp-grp2)>0)?"(?:"+_81b+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_81b;}return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";},true);return _819+_81a;};return dojo.number;});},"dijit/_FocusMixin":function(){define("dijit/_FocusMixin",["./focus","./_WidgetBase","dojo/_base/declare","dojo/_base/lang"],function(_81c,_81d,_81e,lang){lang.extend(_81d,{focused:false,onFocus:function(){},onBlur:function(){},_onFocus:function(){this.onFocus();},_onBlur:function(){this.onBlur();}});return _81e("dijit._FocusMixin",null,{_focusManager:_81c});});},"dojo/data/util/filter":function(){define("dojo/data/util/filter",["dojo/_base/lang"],function(lang){var _81f=lang.getObject("dojo.data.util.filter",true);_81f.patternToRegExp=function(_820,_821){var rxp="^";var c=null;for(var i=0;i<_820.length;i++){c=_820.charAt(i);switch(c){case "\\":rxp+=c;i++;rxp+=_820.charAt(i);break;case "*":rxp+=".*";break;case "?":rxp+=".";break;case "$":case "^":case "/":case "+":case ".":case "|":case "(":case ")":case "{":case "}":case "[":case "]":rxp+="\\";default:rxp+=c;}}rxp+="$";if(_821){return new RegExp(rxp,"mi");}else{return new RegExp(rxp,"m");}};return _81f;});},"dijit/_WidgetsInTemplateMixin":function(){define("dijit/_WidgetsInTemplateMixin",["dojo/_base/array","dojo/_base/declare","dojo/parser","dijit/registry"],function(_822,_823,_824,_825){return _823("dijit._WidgetsInTemplateMixin",null,{_earlyTemplatedStartup:false,widgetsInTemplate:true,_beforeFillContent:function(){if(this.widgetsInTemplate){var node=this.domNode;var cw=(this._startupWidgets=_824.parse(node,{noStart:!this._earlyTemplatedStartup,template:true,inherited:{dir:this.dir,lang:this.lang,textDir:this.textDir},propsThis:this,scope:"dojo"}));this._supportingWidgets=_825.findWidgets(node);this._attachTemplateNodes(cw,function(n,p){return n[p];});}},startup:function(){_822.forEach(this._startupWidgets,function(w){if(w&&!w._started&&w.startup){w.startup();}});this.inherited(arguments);}});});},"dojo/fx/Toggler":function(){define("dojo/fx/Toggler",["../_base/lang","../_base/declare","../_base/fx","../_base/connect"],function(lang,_826,_827,_828){return _826("dojo.fx.Toggler",null,{node:null,showFunc:_827.fadeIn,hideFunc:_827.fadeOut,showDuration:200,hideDuration:200,constructor:function(args){var _829=this;lang.mixin(_829,args);_829.node=args.node;_829._showArgs=lang.mixin({},args);_829._showArgs.node=_829.node;_829._showArgs.duration=_829.showDuration;_829.showAnim=_829.showFunc(_829._showArgs);_829._hideArgs=lang.mixin({},args);_829._hideArgs.node=_829.node;_829._hideArgs.duration=_829.hideDuration;_829.hideAnim=_829.hideFunc(_829._hideArgs);_828.connect(_829.showAnim,"beforeBegin",lang.hitch(_829.hideAnim,"stop",true));_828.connect(_829.hideAnim,"beforeBegin",lang.hitch(_829.showAnim,"stop",true));},show:function(_82a){return this.showAnim.play(_82a||0);},hide:function(_82b){return this.hideAnim.play(_82b||0);}});});},"dijit/form/FilteringSelect":function(){define("dijit/form/FilteringSelect",["dojo/data/util/filter","dojo/_base/declare","dojo/_base/Deferred","dojo/_base/lang","./MappedTextBox","./ComboBoxMixin"],function(_82c,_82d,_82e,lang,_82f,_830){return _82d("dijit.form.FilteringSelect",[_82f,_830],{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(_831,_832,_833,_834){if((_832&&_832[this.searchAttr]!==this._lastQuery)||(!_832&&_831.length&&this.store.getIdentity(_831[0])!=this._lastQuery)){return;}if(!_831.length){this.set("value","",_834||(_834===undefined&&!this.focused),this.textbox.value,null);}else{this.set("item",_831[0],_834);}},_openResultList:function(_835,_836,_837){if(_836[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(_838,_839,_83a,item){if(!this._onChangeActive){_839=null;}if(item===undefined){if(_838===null||_838===""){_838="";if(!lang.isString(_83a)){this._setDisplayedValueAttr(_83a||"",_839);return;}}var self=this;this._lastQuery=_838;_82e.when(this.store.get(_838),function(item){self._callbackSetLabel(item?[item]:[],undefined,undefined,_839);});}else{this.valueNode.value=_838;this.inherited(arguments);}},_setItemAttr:function(item,_83b,_83c){this.inherited(arguments);this._lastDisplayedValue=this.textbox.value;},_getDisplayQueryString:function(text){return text.replace(/([\\\*\?])/g,"\\$1");},_setDisplayedValueAttr:function(_83d,_83e){if(_83d==null){_83d="";}if(!this._created){if(!("displayedValue" in this.params)){return;}_83e=false;}if(this.store){this.closeDropDown();var _83f=lang.clone(this.query);var qs=this._getDisplayQueryString(_83d),q;if(this.store._oldAPI){q=qs;}else{q=_82c.patternToRegExp(qs,this.ignoreCase);q.toString=function(){return qs;};}this._lastQuery=_83f[this.searchAttr]=q;this.textbox.value=_83d;this._lastDisplayedValue=_83d;this._set("displayedValue",_83d);var _840=this;var _841={ignoreCase:this.ignoreCase,deep:true};lang.mixin(_841,this.fetchProperties);this._fetchHandle=this.store.query(_83f,_841);_82e.when(this._fetchHandle,function(_842){_840._fetchHandle=null;_840._callbackSetLabel(_842||[],_83f,_841,_83e);},function(err){_840._fetchHandle=null;if(!_840._cancelingQuery){console.error("dijit.form.FilteringSelect: "+err.toString());}});}},undo:function(){this.set("displayedValue",this._lastDisplayedValue);}});});},"dojo/data/util/sorter":function(){define("dojo/data/util/sorter",["dojo/_base/lang"],function(lang){var _843=lang.getObject("dojo.data.util.sorter",true);_843.basicComparator=function(a,b){var r=-1;if(a===null){a=undefined;}if(b===null){b=undefined;}if(a==b){r=0;}else{if(a>b||a==null){r=1;}}return r;};_843.createSortFunction=function(_844,_845){var _846=[];function _847(attr,dir,comp,s){return function(_848,_849){var a=s.getValue(_848,attr);var b=s.getValue(_849,attr);return dir*comp(a,b);};};var _84a;var map=_845.comparatorMap;var bc=_843.basicComparator;for(var i=0;i<_844.length;i++){_84a=_844[i];var attr=_84a.attribute;if(attr){var dir=(_84a.descending)?-1:1;var comp=bc;if(map){if(typeof attr!=="string"&&("toString" in attr)){attr=attr.toString();}comp=map[attr]||bc;}_846.push(_847(attr,dir,comp,_845));}}return function(rowA,rowB){var i=0;while(i<_846.length){var ret=_846[i++](rowA,rowB);if(ret!==0){return ret;}}return 0;};};return _843;});},"dijit/form/_ButtonMixin":function(){define("dijit/form/_ButtonMixin",["dojo/_base/declare","dojo/dom","dojo/_base/event","../registry"],function(_84b,dom,_84c,_84d){return _84b("dijit.form._ButtonMixin",null,{label:"",type:"button",_onClick:function(e){if(this.disabled){_84c.stop(e);return false;}var _84e=this.onClick(e)===false;if(!_84e&&this.type=="submit"&&!(this.valueNode||this.focusNode).form){for(var node=this.domNode;node.parentNode;node=node.parentNode){var _84f=_84d.byNode(node);if(_84f&&typeof _84f._onSubmit=="function"){_84f._onSubmit(e);_84e=true;break;}}}if(_84e){e.preventDefault();}return !_84e;},postCreate:function(){this.inherited(arguments);dom.setSelectable(this.focusNode,false);},onClick:function(){return true;},_setLabelAttr:function(_850){this._set("label",_850);(this.containerNode||this.focusNode).innerHTML=_850;}});});},"dojo/colors":function(){define("dojo/colors",["./_base/kernel","./_base/lang","./_base/Color","./_base/array"],function(dojo,lang,_851,_852){var _853=lang.getObject("dojo.colors",true);var _854=function(m1,m2,h){if(h<0){++h;}if(h>1){--h;}var h6=6*h;if(h6<1){return m1+(m2-m1)*h6;}if(2*h<1){return m2;}if(3*h<2){return m1+(m2-m1)*(2/3-h)*6;}return m1;};dojo.colorFromRgb=_851.fromRgb=function(_855,obj){var m=_855.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);if(m){var c=m[2].split(/\s*,\s*/),l=c.length,t=m[1],a;if((t=="rgb"&&l==3)||(t=="rgba"&&l==4)){var r=c[0];if(r.charAt(r.length-1)=="%"){a=_852.map(c,function(x){return parseFloat(x)*2.56;});if(l==4){a[3]=c[3];}return _851.fromArray(a,obj);}return _851.fromArray(c,obj);}if((t=="hsl"&&l==3)||(t=="hsla"&&l==4)){var H=((parseFloat(c[0])%360)+360)%360/360,S=parseFloat(c[1])/100,L=parseFloat(c[2])/100,m2=L<=0.5?L*(S+1):L+S-L*S,m1=2*L-m2;a=[_854(m1,m2,H+1/3)*256,_854(m1,m2,H)*256,_854(m1,m2,H-1/3)*256,1];if(l==4){a[3]=c[3];}return _851.fromArray(a,obj);}}return null;};var _856=function(c,low,high){c=Number(c);return isNaN(c)?high:c<low?low:c>high?high:c;};_851.prototype.sanitize=function(){var t=this;t.r=Math.round(_856(t.r,0,255));t.g=Math.round(_856(t.g,0,255));t.b=Math.round(_856(t.b,0,255));t.a=_856(t.a,0,1);return this;};_853.makeGrey=_851.makeGrey=function(g,a){return _851.fromArray([g,g,g,a]);};lang.mixin(_851.named,{"aliceblue":[240,248,255],"antiquewhite":[250,235,215],"aquamarine":[127,255,212],"azure":[240,255,255],"beige":[245,245,220],"bisque":[255,228,196],"blanchedalmond":[255,235,205],"blueviolet":[138,43,226],"brown":[165,42,42],"burlywood":[222,184,135],"cadetblue":[95,158,160],"chartreuse":[127,255,0],"chocolate":[210,105,30],"coral":[255,127,80],"cornflowerblue":[100,149,237],"cornsilk":[255,248,220],"crimson":[220,20,60],"cyan":[0,255,255],"darkblue":[0,0,139],"darkcyan":[0,139,139],"darkgoldenrod":[184,134,11],"darkgray":[169,169,169],"darkgreen":[0,100,0],"darkgrey":[169,169,169],"darkkhaki":[189,183,107],"darkmagenta":[139,0,139],"darkolivegreen":[85,107,47],"darkorange":[255,140,0],"darkorchid":[153,50,204],"darkred":[139,0,0],"darksalmon":[233,150,122],"darkseagreen":[143,188,143],"darkslateblue":[72,61,139],"darkslategray":[47,79,79],"darkslategrey":[47,79,79],"darkturquoise":[0,206,209],"darkviolet":[148,0,211],"deeppink":[255,20,147],"deepskyblue":[0,191,255],"dimgray":[105,105,105],"dimgrey":[105,105,105],"dodgerblue":[30,144,255],"firebrick":[178,34,34],"floralwhite":[255,250,240],"forestgreen":[34,139,34],"gainsboro":[220,220,220],"ghostwhite":[248,248,255],"gold":[255,215,0],"goldenrod":[218,165,32],"greenyellow":[173,255,47],"grey":[128,128,128],"honeydew":[240,255,240],"hotpink":[255,105,180],"indianred":[205,92,92],"indigo":[75,0,130],"ivory":[255,255,240],"khaki":[240,230,140],"lavender":[230,230,250],"lavenderblush":[255,240,245],"lawngreen":[124,252,0],"lemonchiffon":[255,250,205],"lightblue":[173,216,230],"lightcoral":[240,128,128],"lightcyan":[224,255,255],"lightgoldenrodyellow":[250,250,210],"lightgray":[211,211,211],"lightgreen":[144,238,144],"lightgrey":[211,211,211],"lightpink":[255,182,193],"lightsalmon":[255,160,122],"lightseagreen":[32,178,170],"lightskyblue":[135,206,250],"lightslategray":[119,136,153],"lightslategrey":[119,136,153],"lightsteelblue":[176,196,222],"lightyellow":[255,255,224],"limegreen":[50,205,50],"linen":[250,240,230],"magenta":[255,0,255],"mediumaquamarine":[102,205,170],"mediumblue":[0,0,205],"mediumorchid":[186,85,211],"mediumpurple":[147,112,219],"mediumseagreen":[60,179,113],"mediumslateblue":[123,104,238],"mediumspringgreen":[0,250,154],"mediumturquoise":[72,209,204],"mediumvioletred":[199,21,133],"midnightblue":[25,25,112],"mintcream":[245,255,250],"mistyrose":[255,228,225],"moccasin":[255,228,181],"navajowhite":[255,222,173],"oldlace":[253,245,230],"olivedrab":[107,142,35],"orange":[255,165,0],"orangered":[255,69,0],"orchid":[218,112,214],"palegoldenrod":[238,232,170],"palegreen":[152,251,152],"paleturquoise":[175,238,238],"palevioletred":[219,112,147],"papayawhip":[255,239,213],"peachpuff":[255,218,185],"peru":[205,133,63],"pink":[255,192,203],"plum":[221,160,221],"powderblue":[176,224,230],"rosybrown":[188,143,143],"royalblue":[65,105,225],"saddlebrown":[139,69,19],"salmon":[250,128,114],"sandybrown":[244,164,96],"seagreen":[46,139,87],"seashell":[255,245,238],"sienna":[160,82,45],"skyblue":[135,206,235],"slateblue":[106,90,205],"slategray":[112,128,144],"slategrey":[112,128,144],"snow":[255,250,250],"springgreen":[0,255,127],"steelblue":[70,130,180],"tan":[210,180,140],"thistle":[216,191,216],"tomato":[255,99,71],"turquoise":[64,224,208],"violet":[238,130,238],"wheat":[245,222,179],"whitesmoke":[245,245,245],"yellowgreen":[154,205,50]});return _851;});},"dijit/registry":function(){define("dijit/registry",["dojo/_base/array","dojo/_base/sniff","dojo/_base/unload","dojo/_base/window","."],function(_857,has,_858,win,_859){var _85a={},hash={};var _85b={length:0,add:function(_85c){if(hash[_85c.id]){throw new Error("Tried to register widget with id=="+_85c.id+" but that id is already registered");}hash[_85c.id]=_85c;this.length++;},remove:function(id){if(hash[id]){delete hash[id];this.length--;}},byId:function(id){return typeof id=="string"?hash[id]:id;},byNode:function(node){return hash[node.getAttribute("widgetId")];},toArray:function(){var ar=[];for(var id in hash){ar.push(hash[id]);}return ar;},getUniqueId:function(_85d){var id;do{id=_85d+"_"+(_85d in _85a?++_85a[_85d]:_85a[_85d]=0);}while(hash[id]);return _859._scopeName=="dijit"?id:_859._scopeName+"_"+id;},findWidgets:function(root){var _85e=[];function _85f(root){for(var node=root.firstChild;node;node=node.nextSibling){if(node.nodeType==1){var _860=node.getAttribute("widgetId");if(_860){var _861=hash[_860];if(_861){_85e.push(_861);}}else{_85f(node);}}}};_85f(root);return _85e;},_destroyAll:function(){_859._curFocus=null;_859._prevFocus=null;_859._activeStack=[];_857.forEach(_85b.findWidgets(win.body()),function(_862){if(!_862._destroyed){if(_862.destroyRecursive){_862.destroyRecursive();}else{if(_862.destroy){_862.destroy();}}}});},getEnclosingWidget:function(node){while(node){var id=node.getAttribute&&node.getAttribute("widgetId");if(id){return hash[id];}node=node.parentNode;}return null;},_hash:hash};if(has("ie")){_858.addOnWindowUnload(function(){_85b._destroyAll();});}_859.registry=_85b;return _85b;});},"dijit/tree/_dndContainer":function(){define("dijit/tree/_dndContainer",["dojo/aspect","dojo/_base/declare","dojo/dom-class","dojo/_base/event","dojo/_base/lang","dojo/mouse","dojo/on"],function(_863,_864,_865,_866,lang,_867,on){return _864("dijit.tree._dndContainer",null,{constructor:function(tree,_868){this.tree=tree;this.node=tree.domNode;lang.mixin(this,_868);this.current=null;this.containerState="";_865.add(this.node,"dojoDndContainer");this.events=[on(this.node,_867.enter,lang.hitch(this,"onOverEvent")),on(this.node,_867.leave,lang.hitch(this,"onOutEvent")),_863.after(this.tree,"_onNodeMouseEnter",lang.hitch(this,"onMouseOver"),true),_863.after(this.tree,"_onNodeMouseLeave",lang.hitch(this,"onMouseOut"),true),on(this.node,"dragstart",lang.hitch(_866,"stop")),on(this.node,"selectstart",lang.hitch(_866,"stop"))];},destroy:function(){var h;while(h=this.events.pop()){h.remove();}this.node=this.parent=null;},onMouseOver:function(_869){this.current=_869;},onMouseOut:function(){this.current=null;},_changeState:function(type,_86a){var _86b="dojoDnd"+type;var _86c=type.toLowerCase()+"State";_865.replace(this.node,_86b+_86a,_86b+this[_86c]);this[_86c]=_86a;},_addItemClass:function(node,type){_865.add(node,"dojoDndItem"+type);},_removeItemClass:function(node,type){_865.remove(node,"dojoDndItem"+type);},onOverEvent:function(){this._changeState("Container","Over");},onOutEvent:function(){this._changeState("Container","");}});});},"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","dijit/_base/wai":function(){define("dijit/_base/wai",["dojo/dom-attr","dojo/_base/lang","..","../hccss"],function(_86d,lang,_86e){lang.mixin(_86e,{hasWaiRole:function(elem,role){var _86f=this.getWaiRole(elem);return role?(_86f.indexOf(role)>-1):(_86f.length>0);},getWaiRole:function(elem){return lang.trim((_86d.get(elem,"role")||"").replace("wairole:",""));},setWaiRole:function(elem,role){_86d.set(elem,"role",role);},removeWaiRole:function(elem,role){var _870=_86d.get(elem,"role");if(!_870){return;}if(role){var t=lang.trim((" "+_870+" ").replace(" "+role+" "," "));_86d.set(elem,"role",t);}else{elem.removeAttribute("role");}},hasWaiState:function(elem,_871){return elem.hasAttribute?elem.hasAttribute("aria-"+_871):!!elem.getAttribute("aria-"+_871);},getWaiState:function(elem,_872){return elem.getAttribute("aria-"+_872)||"";},setWaiState:function(elem,_873,_874){elem.setAttribute("aria-"+_873,_874);},removeWaiState:function(elem,_875){elem.removeAttribute("aria-"+_875);}});return _86e;});},"dijit/form/_FormSelectWidget":function(){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(_876,_877,_878,_879,dom,_87a,_87b,lang,_87c,_87d){return _879("dijit.form._FormSelectWidget",_87d,{multiple:false,options:null,store:null,query:null,queryOptions:null,onFetch:null,sortByLabel:true,loadChildrenOnOpen:false,getOptions:function(_87e){var _87f=_87e,opts=this.options||[],l=opts.length;if(_87f===undefined){return opts;}if(lang.isArray(_87f)){return _876.map(_87f,"return this.getOptions(item);",this);}if(lang.isObject(_87e)){if(!_876.some(this.options,function(o,idx){if(o===_87f||(o.value&&o.value===_87f.value)){_87f=idx;return true;}return false;})){_87f=-1;}}if(typeof _87f=="string"){for(var i=0;i<l;i++){if(opts[i].value===_87f){_87f=i;break;}}}if(typeof _87f=="number"&&_87f>=0&&_87f<l){return this.options[_87f];}return null;},addOption:function(_880){if(!lang.isArray(_880)){_880=[_880];}_876.forEach(_880,function(i){if(i&&lang.isObject(i)){this.options.push(i);}},this);this._loadChildren();},removeOption:function(_881){if(!lang.isArray(_881)){_881=[_881];}var _882=this.getOptions(_881);_876.forEach(_882,function(i){if(i){this.options=_876.filter(this.options,function(node){return (node.value!==i.value||node.label!==i.label);});this._removeOptionItem(i);}},this);this._loadChildren();},updateOption:function(_883){if(!lang.isArray(_883)){_883=[_883];}_876.forEach(_883,function(i){var _884=this.getOptions(i),k;if(_884){for(k in i){_884[k]=i[k];}}},this);this._loadChildren();},setStore:function(_885,_886,_887){var _888=this.store;_887=_887||{};if(_888!==_885){var h;while(h=this._notifyConnections.pop()){h.remove();}if(_885&&_885.getFeatures()["dojo.data.api.Notification"]){this._notifyConnections=[_877.after(_885,"onNew",lang.hitch(this,"_onNewItem"),true),_877.after(_885,"onDelete",lang.hitch(this,"_onDeleteItem"),true),_877.after(_885,"onSet",lang.hitch(this,"_onSetItem"),true)];}this._set("store",_885);}this._onChangeActive=false;if(this.options&&this.options.length){this.removeOption(this.options);}if(_885){this._loadingStore=true;_885.fetch(lang.delegate(_887,{onComplete:function(_889,opts){if(this.sortByLabel&&!_887.sort&&_889.length){_889.sort(_878.createSortFunction([{attribute:_885.getLabelAttributes(_889[0])[0]}],_885));}if(_887.onFetch){_889=_887.onFetch.call(this,_889,opts);}_876.forEach(_889,function(i){this._addOptionForItem(i);},this);this._loadingStore=false;this.set("value","_pendingValue" in this?this._pendingValue:_886);delete this._pendingValue;if(!this.loadChildrenOnOpen){this._loadChildren();}else{this._pseudoLoadChildren(_889);}this._fetchedWith=opts;this._lastValueReported=this.multiple?[]:null;this._onChangeActive=true;this.onSetStore();this._handleOnChange(this.value);},scope:this}));}else{delete this._fetchedWith;}return _888;},_setValueAttr:function(_88a,_88b){if(this._loadingStore){this._pendingValue=_88a;return;}var opts=this.getOptions()||[];if(!lang.isArray(_88a)){_88a=[_88a];}_876.forEach(_88a,function(i,idx){if(!lang.isObject(i)){i=i+"";}if(typeof i==="string"){_88a[idx]=_876.filter(opts,function(node){return node.value===i;})[0]||{value:"",label:""};}},this);_88a=_876.filter(_88a,function(i){return i&&i.value;});if(!this.multiple&&(!_88a[0]||!_88a[0].value)&&opts.length){_88a[0]=opts[0];}_876.forEach(opts,function(i){i.selected=_876.some(_88a,function(v){return v.value===i.value;});});var val=_876.map(_88a,function(i){return i.value;}),disp=_876.map(_88a,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,_88b);},_getDisplayedValueAttr:function(){var val=this.get("value");if(!lang.isArray(val)){val=[val];}var ret=_876.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;}_876.forEach(this._getChildren(),function(_88c){_88c.destroyRecursive();});_876.forEach(this.options,this._addOptionItem,this);this._updateSelection();},_updateSelection:function(){this._set("value",this._getValueFromOpts());var val=this.value;if(!lang.isArray(val)){val=[val];}if(val&&val[0]){_876.forEach(this._getChildren(),function(_88d){var _88e=_876.some(val,function(v){return _88d.option&&(v===_88d.option.value);});_87a.toggle(_88d.domNode,this.baseClass+"SelectedOption",_88e);_88d.domNode.setAttribute("aria-selected",_88e);},this);}},_getValueFromOpts:function(){var opts=this.getOptions()||[];if(!this.multiple&&opts.length){var opt=_876.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){return _876.map(_876.filter(opts,function(i){return i.selected;}),function(i){return i.value;})||[];}}return "";},_onNewItem:function(item,_88f){if(!_88f||!_88f.parent){this._addOptionForItem(item);}},_onDeleteItem:function(item){var _890=this.store;this.removeOption(_890.getIdentity(item));},_onSetItem:function(item){this.updateOption(this._getOptionObjForItem(item));},_getOptionObjForItem:function(item){var _891=this.store,_892=_891.getLabel(item),_893=(_892?_891.getIdentity(item):null);return {value:_893,label:_892,item:item};},_addOptionForItem:function(item){var _894=this.store;if(!_894.isItemLoaded(item)){_894.loadItem({item:item,onItem:function(i){this._addOptionForItem(i);},scope:this});return;}var _895=this._getOptionObjForItem(item);this.addOption(_895);},constructor:function(_896){this._oValue=(_896||{}).value||null;this._notifyConnections=[];},buildRendering:function(){this.inherited(arguments);dom.setSelectable(this.focusNode,false);},_fillContent:function(){var opts=this.options;if(!opts){opts=this.options=this.srcNodeRef?_87c("> *",this.srcNodeRef).map(function(node){if(node.getAttribute("type")==="separator"){return {value:"",label:"",selected:false,disabled:false};}return {value:(node.getAttribute("data-"+_87b._scopeName+"-value")||node.getAttribute("value")),label:String(node.innerHTML),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(){this.inherited(arguments);this.connect(this,"onChange","_updateSelection");this.connect(this,"startup","_loadChildren");this._setValueAttr(this.value,null);},startup:function(){this.inherited(arguments);var _897=this.store,_898={};_876.forEach(["query","queryOptions","onFetch"],function(i){if(this[i]){_898[i]=this[i];}delete this[i];},this);if(_897&&_897.getFeatures()["dojo.data.api.Identity"]){this.store=null;this.setStore(_897,this._oValue,_898);}},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(){}});});},"dijit/form/Select":function(){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(_899,_89a,_89b,_89c,_89d,_89e,_89f,i18n,lang,_8a0,_8a1,Menu,_8a2,_8a3,_8a4,_8a5){var _8a6=_89a("dijit.form._SelectMenu",Menu,{buildRendering:function(){this.inherited(arguments);var o=(this.menuTableNode=this.domNode);var n=(this.domNode=_89d.create("div",{style:{overflowX:"hidden",overflowY:"scroll"}}));if(o.parentNode){o.parentNode.replaceChild(n,o);}_89c.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",_89f.stop);},resize:function(mb){if(mb){_89e.setMarginBox(this.domNode,mb);if("w" in mb){this.menuTableNode.style.width="100%";}}}});var _8a7=_89a("dijit.form.Select",[_8a0,_8a1],{baseClass:"dijitSelect",templateString:_8a5,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 _8a6({id:this.id+"_menu"});_89c.add(this.dropDown.domNode,this.baseClass+"Menu");},_getMenuItemForOption:function(_8a8){if(!_8a8.value&&!_8a8.label){return new _8a3();}else{var _8a9=lang.hitch(this,"_setValueAttr",_8a8);var item=new _8a2({option:_8a8,label:_8a8.label||this.emptyLabel,onClick:_8a9,disabled:_8a8.disabled||false});item.focusNode.setAttribute("role","listitem");return item;}},_addOptionItem:function(_8aa){if(this.dropDown){this.dropDown.addChild(this._getMenuItemForOption(_8aa));}},_getChildren:function(){if(!this.dropDown){return [];}return this.dropDown.getChildren();},_loadChildren:function(_8ab){if(_8ab===true){if(this.dropDown){delete this.dropDown.focusedChild;}if(this.options.length){this.inherited(arguments);}else{_899.forEach(this._getChildren(),function(_8ac){_8ac.destroyRecursive();});var item=new _8a2({label:"&#160;"});this.dropDown.addChild(item);}}else{this._updateSelection();}this._isLoaded=false;this._childrenLoaded=true;if(!this._loadingStore){this._setValueAttr(this.value);}},_setValueAttr:function(_8ad){this.inherited(arguments);_89b.set(this.valueNode,"value",this.get("value"));this.validate(this.focused);},_setDisabledAttr:function(_8ae){this.inherited(arguments);this.validate(this.focused);},_setRequiredAttr:function(_8af){this._set("required",_8af);this.focusNode.setAttribute("aria-required",_8af);this.validate(this.focused);},_setDisplay:function(_8b0){var lbl=_8b0||this.emptyLabel;this.containerNode.innerHTML="<span class=\"dijitReset dijitInline "+this.baseClass+"Label\">"+lbl+"</span>";this.focusNode.setAttribute("aria-valuetext",lbl);},validate:function(_8b1){var _8b2=this.disabled||this.isValid(_8b1);this._set("state",_8b2?"":"Incomplete");this.focusNode.setAttribute("aria-invalid",_8b2?"false":"true");var _8b3=_8b2?"":this._missingMsg;if(_8b3&&this.focused&&this._hasBeenBlurred){_8a4.show(_8b3,this.domNode,this.tooltipPosition,!this.isLeftToRight());}else{_8a4.hide(this.domNode);}this._set("message",_8b3);return _8b2;},isValid:function(){return (!this.required||this.value===0||!(/^\s*$/.test(this.value||"")));},reset:function(){this.inherited(arguments);_8a4.hide(this.domNode);this.validate(this.focused);},postMixInProperties:function(){this.inherited(arguments);this._missingMsg=i18n.getLocalization("dijit.form","validate",this.lang).missingMessage;},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onmousemove",_89f.stop);},_setStyleAttr:function(_8b4){this.inherited(arguments);_89c.toggle(this.domNode,this.baseClass+"FixedWidth",!!this.domNode.style.width);},isLoaded:function(){return this._isLoaded;},loadDropDown:function(_8b5){this._loadChildren(true);this._isLoaded=true;_8b5();},closeDropDown:function(){this.inherited(arguments);if(this.dropDown&&this.dropDown.menuTableNode){this.dropDown.menuTableNode.style.width="";}},uninitialize:function(_8b6){if(this.dropDown&&!this.dropDown._destroyed){this.dropDown.destroyRecursive(_8b6);delete this.dropDown;}this.inherited(arguments);},_onFocus:function(){this.validate(true);this.inherited(arguments);},_onBlur:function(){_8a4.hide(this.domNode);this.inherited(arguments);}});_8a7._Menu=_8a6;return _8a7;});},"dojo/store/util/QueryResults":function(){define("dojo/store/util/QueryResults",["../../_base/array","../../_base/lang","../../_base/Deferred"],function(_8b7,lang,_8b8){var util=lang.getObject("dojo.store.util",true);util.QueryResults=function(_8b9){if(!_8b9){return _8b9;}if(_8b9.then){_8b9=lang.delegate(_8b9);}function _8ba(_8bb){if(!_8b9[_8bb]){_8b9[_8bb]=function(){var args=arguments;return _8b8.when(_8b9,function(_8bc){Array.prototype.unshift.call(args,_8bc);return util.QueryResults(_8b7[_8bb].apply(_8b7,args));});};}};_8ba("forEach");_8ba("filter");_8ba("map");if(!_8b9.total){_8b9.total=_8b8.when(_8b9,function(_8bd){return _8bd.length;});}return _8b9;};return util.QueryResults;});},"dijit/form/_ListBase":function(){define("dijit/form/_ListBase",["dojo/_base/declare","dojo/window"],function(_8be,_8bf){return _8be("dijit.form._ListBase",null,{selected:null,_getTarget:function(evt){var tgt=evt.target;var _8c0=this.containerNode;if(tgt==_8c0||tgt==this.domNode){return null;}while(tgt&&tgt.parentNode!=_8c0){tgt=tgt.parentNode;}return tgt;},selectFirstNode:function(){var _8c1=this.containerNode.firstChild;while(_8c1&&_8c1.style.display=="none"){_8c1=_8c1.nextSibling;}this._setSelectedAttr(_8c1);},selectLastNode:function(){var last=this.containerNode.lastChild;while(last&&last.style.display=="none"){last=last.previousSibling;}this._setSelectedAttr(last);},selectNextNode:function(){var _8c2=this._getSelectedAttr();if(!_8c2){this.selectFirstNode();}else{var next=_8c2.nextSibling;while(next&&next.style.display=="none"){next=next.nextSibling;}if(!next){this.selectFirstNode();}else{this._setSelectedAttr(next);}}},selectPreviousNode:function(){var _8c3=this._getSelectedAttr();if(!_8c3){this.selectLastNode();}else{var prev=_8c3.previousSibling;while(prev&&prev.style.display=="none"){prev=prev.previousSibling;}if(!prev){this.selectLastNode();}else{this._setSelectedAttr(prev);}}},_setSelectedAttr:function(node){if(this.selected!=node){var _8c4=this._getSelectedAttr();if(_8c4){this.onDeselect(_8c4);this.selected=null;}if(node&&node.parentNode==this.containerNode){this.selected=node;_8bf.scrollIntoView(node);this.onSelect(node);}}else{if(node){this.onSelect(node);}}},_getSelectedAttr:function(){var v=this.selected;return (v&&v.parentNode==this.containerNode)?v:(this.selected=null);}});});},"dijit/form/_FormWidget":function(){define("dijit/form/_FormWidget",["dojo/_base/declare","dojo/_base/kernel","dojo/ready","../_Widget","../_CssStateMixin","../_TemplatedMixin","./_FormWidgetMixin"],function(_8c5,_8c6,_8c7,_8c8,_8c9,_8ca,_8cb){if(!_8c6.isAsync){_8c7(0,function(){var _8cc=["dijit/form/_FormValueWidget"];require(_8cc);});}return _8c5("dijit.form._FormWidget",[_8c8,_8ca,_8c9,_8cb],{setDisabled:function(_8cd){_8c6.deprecated("setDisabled("+_8cd+") is deprecated. Use set('disabled',"+_8cd+") instead.","","2.0");this.set("disabled",_8cd);},setValue:function(_8ce){_8c6.deprecated("dijit.form._FormWidget:setValue("+_8ce+") is deprecated. Use set('value',"+_8ce+") instead.","","2.0");this.set("value",_8ce);},getValue:function(){_8c6.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});});},"dojo/DeferredList":function(){define("dojo/DeferredList",["./_base/kernel","./_base/Deferred","./_base/array"],function(dojo,_8cf,_8d0){dojo.DeferredList=function(list,_8d1,_8d2,_8d3,_8d4){var _8d5=[];_8cf.call(this);var self=this;if(list.length===0&&!_8d1){this.resolve([0,[]]);}var _8d6=0;_8d0.forEach(list,function(item,i){item.then(function(_8d7){if(_8d1){self.resolve([i,_8d7]);}else{_8d8(true,_8d7);}},function(_8d9){if(_8d2){self.reject(_8d9);}else{_8d8(false,_8d9);}if(_8d3){return null;}throw _8d9;});function _8d8(_8da,_8db){_8d5[i]=[_8da,_8db];_8d6++;if(_8d6===list.length){self.resolve(_8d5);}};});};dojo.DeferredList.prototype=new _8cf();dojo.DeferredList.prototype.gatherResults=function(_8dc){var d=new dojo.DeferredList(_8dc,false,true,false);d.addCallback(function(_8dd){var ret=[];_8d0.forEach(_8dd,function(_8de){ret.push(_8de[1]);});return ret;});return d;};return dojo.DeferredList;});},"dojo/dnd/common":function(){define("dojo/dnd/common",["../main"],function(dojo){dojo.getObject("dnd",true,dojo);dojo.dnd.getCopyKeyState=dojo.isCopyKey;dojo.dnd._uniqueId=0;dojo.dnd.getUniqueId=function(){var id;do{id=dojo._scopeName+"Unique"+(++dojo.dnd._uniqueId);}while(dojo.byId(id));return id;};dojo.dnd._empty={};dojo.dnd.isFormElement=function(e){var t=e.target;if(t.nodeType==3){t=t.parentNode;}return " button textarea input select option ".indexOf(" "+t.tagName.toLowerCase()+" ")>=0;};return dojo.dnd;});},"dijit/_base/place":function(){define("dijit/_base/place",["dojo/_base/array","dojo/_base/lang","dojo/window","../place",".."],function(_8df,lang,_8e0,_8e1,_8e2){_8e2.getViewport=function(){return _8e0.getBox();};_8e2.placeOnScreen=_8e1.at;_8e2.placeOnScreenAroundElement=function(node,_8e3,_8e4,_8e5){var _8e6;if(lang.isArray(_8e4)){_8e6=_8e4;}else{_8e6=[];for(var key in _8e4){_8e6.push({aroundCorner:key,corner:_8e4[key]});}}return _8e1.around(node,_8e3,_8e6,true,_8e5);};_8e2.placeOnScreenAroundNode=_8e2.placeOnScreenAroundElement;_8e2.placeOnScreenAroundRectangle=_8e2.placeOnScreenAroundElement;_8e2.getPopupAroundAlignment=function(_8e7,_8e8){var _8e9={};_8df.forEach(_8e7,function(pos){var ltr=_8e8;switch(pos){case "after":_8e9[_8e8?"BR":"BL"]=_8e8?"BL":"BR";break;case "before":_8e9[_8e8?"BL":"BR"]=_8e8?"BR":"BL";break;case "below-alt":ltr=!ltr;case "below":_8e9[ltr?"BL":"BR"]=ltr?"TL":"TR";_8e9[ltr?"BR":"BL"]=ltr?"TR":"TL";break;case "above-alt":ltr=!ltr;case "above":default:_8e9[ltr?"TL":"TR"]=ltr?"BL":"BR";_8e9[ltr?"TR":"TL"]=ltr?"BR":"BL";break;}});return _8e9;};return _8e2;});},"dijit/MenuSeparator":function(){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(_8ea,dom,_8eb,_8ec,_8ed,_8ee){return _8ea("dijit.MenuSeparator",[_8eb,_8ec,_8ed],{templateString:_8ee,buildRendering:function(){this.inherited(arguments);dom.setSelectable(this.domNode,false);},isFocusable:function(){return false;}});});},"dijit/form/_ComboBoxMenu":function(){define("dijit/form/_ComboBoxMenu",["dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dojo/dom-style","dojo/keys","../_WidgetBase","../_TemplatedMixin","./_ComboBoxMenuMixin","./_ListMouseMixin"],function(_8ef,_8f0,_8f1,_8f2,keys,_8f3,_8f4,_8f5,_8f6){return _8ef("dijit.form._ComboBoxMenu",[_8f3,_8f4,_8f6,_8f5],{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()){_8f0.add(this.previousButton,"dijitMenuItemRtl");_8f0.add(this.nextButton,"dijitMenuItemRtl");}},_createMenuItem:function(){return _8f1.create("div",{"class":"dijitReset dijitMenuItem"+(this.isLeftToRight()?"":" dijitMenuItemRtl"),role:"option"});},onHover:function(node){_8f0.add(node,"dijitMenuItemHover");},onUnhover:function(node){_8f0.remove(node,"dijitMenuItemHover");},onSelect:function(node){_8f0.add(node,"dijitMenuItemSelected");},onDeselect:function(node){_8f0.remove(node,"dijitMenuItemSelected");},_page:function(up){var _8f7=0;var _8f8=this.domNode.scrollTop;var _8f9=_8f2.get(this.domNode,"height");if(!this.getHighlightedOption()){this.selectNextNode();}while(_8f7<_8f9){var _8fa=this.getHighlightedOption();if(up){if(!_8fa.previousSibling||_8fa.previousSibling.style.display=="none"){break;}this.selectPreviousNode();}else{if(!_8fa.nextSibling||_8fa.nextSibling.style.display=="none"){break;}this.selectNextNode();}var _8fb=this.domNode.scrollTop;_8f7+=(_8fb-_8f8)*(up?-1:1);_8f8=_8fb;}},handleKey:function(evt){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;}}});});},"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>","dijit/Dialog":function(){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(_8fc,_8fd,_8fe,_8ff,_900,dom,_901,_902,_903,_904,fx,i18n,_905,keys,lang,on,_906,has,win,_907,_908,_909,_90a,_90b,_90c,_90d,_90e,_90f,_910,_911,_912,_913,_914){var _915=_8ff("dijit._DialogBase",[_90d,_90f,_910,_90e],{templateString:_913,baseClass:"dijitDialog",cssStateNodes:{closeButtonNode:"dijitDialogCloseIcon"},_setTitleAttr:[{node:"titleNode",type:"innerHTML"},{node:"titleBar",type:"attribute"}],open:false,duration:_90b.defaultDuration,refocus:true,autofocus:true,_firstFocusItem:null,_lastFocusItem:null,doLayout:false,draggable:true,"aria-describedby":"",postMixInProperties:function(){var _916=i18n.getLocalization("dijit","common");lang.mixin(this,_916);this.inherited(arguments);},postCreate:function(){_903.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&&_917.isTop(this)){this._getFocusItems(this.domNode);_90a.focus(this._firstFocusItem);}this.inherited(arguments);},_endDrag:function(){var _918=_902.position(this.domNode),_919=_907.getBox();_918.y=Math.min(Math.max(_918.y,0),(_919.h-_918.h));_918.x=Math.min(Math.max(_918.x,0),(_919.w-_918.w));this._relativePosition=_918;this._position();},_setup:function(){var node=this.domNode;if(this.titleBar&&this.draggable){this._moveable=new ((has("ie")==6)?_909:_908)(node,{handle:this.titleBar});this.connect(this._moveable,"onMoveStop","_endDrag");}else{_901.add(node,"dijitDialogFixed");}this.underlayAttrs={dialogId:this.id,"class":_8fd.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{_903.set(this.containerNode,{width:"auto",height:"auto"});}var bb=_902.position(this.domNode);var _91a=_907.getBox();if(bb.w>=_91a.w||bb.h>=_91a.h){var w=Math.min(bb.w,Math.floor(_91a.w*0.75)),h=Math.min(bb.h,Math.floor(_91a.h*0.75));if(this._singleChild&&this._singleChild.resize){this._singleChildOriginalStyle=this._singleChild.domNode.style.cssText;this._singleChild.resize({w:w,h:h});}else{_903.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(!_901.contains(win.body(),"dojoMove")){var node=this.domNode,_91b=_907.getBox(),p=this._relativePosition,bb=p?null:_902.position(node),l=Math.floor(_91b.l+(p?p.x:(_91b.w-bb.w)/2)),t=Math.floor(_91b.t+(p?p.y:(_91b.h-bb.h)/2));_903.set(node,{left:l+"px",top:t+"px"});}},_onKey:function(evt){if(evt.charOrCode){var node=evt.target;if(evt.charOrCode===keys.TAB){this._getFocusItems(this.domNode);}var _91c=(this._firstFocusItem==this._lastFocusItem);if(node==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===keys.TAB){if(!_91c){_90a.focus(this._lastFocusItem);}_904.stop(evt);}else{if(node==this._lastFocusItem&&evt.charOrCode===keys.TAB&&!evt.shiftKey){if(!_91c){_90a.focus(this._firstFocusItem);}_904.stop(evt);}else{while(node){if(node==this.domNode||_901.contains(node,"dijitPopup")){if(evt.charOrCode==keys.ESCAPE){this.onCancel();}else{return;}}node=node.parentNode;}if(evt.charOrCode!==keys.TAB){_904.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",lang.hitch(this,"layout")));this._modalconnects.push(on(window,"resize",lang.hitch(this,function(){var _91d=_907.getBox();if(!this._oldViewport||_91d.h!=this._oldViewport.h||_91d.w!=this._oldViewport.w){this.layout();this._oldViewport=_91d;}})));this._modalconnects.push(on(this.domNode,_8fe._keypress,lang.hitch(this,"_onKey")));_903.set(this.domNode,{opacity:0,display:""});this._set("open",true);this._onShow();this._size();this._position();var _91e;this._fadeInDeferred=new _900(lang.hitch(this,function(){_91e.stop();delete this._fadeInDeferred;}));_91e=fx.fadeIn({node:this.domNode,duration:this.duration,beforeBegin:lang.hitch(this,function(){_917.show(this,this.underlayAttrs);}),onEnd:lang.hitch(this,function(){if(this.autofocus&&_917.isTop(this)){this._getFocusItems(this.domNode);_90a.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 _91f;this._fadeOutDeferred=new _900(lang.hitch(this,function(){_91f.stop();delete this._fadeOutDeferred;}));this._fadeOutDeferred.then(lang.hitch(this,"onHide"));_91f=fx.fadeOut({node:this.domNode,duration:this.duration,onEnd:lang.hitch(this,function(){this.domNode.style.display="none";_917.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(_914._underlay){_914._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();}_917.hide(this);this.inherited(arguments);}});var _920=_8ff("dijit.Dialog",[_912,_915],{});_920._DialogBase=_915;var _917=_920._DialogLevelManager={_beginZIndex:950,show:function(_921,_922){ds[ds.length-1].focus=_90a.curNode;var _923=_914._underlay;if(!_923||_923._destroyed){_923=_914._underlay=new _911(_922);}else{_923.set(_921.underlayAttrs);}var _924=ds[ds.length-1].dialog?ds[ds.length-1].zIndex+2:_920._DialogLevelManager._beginZIndex;if(ds.length==1){_923.show();}_903.set(_914._underlay.domNode,"zIndex",_924-1);_903.set(_921.domNode,"zIndex",_924);ds.push({dialog:_921,underlayAttrs:_922,zIndex:_924});},hide:function(_925){if(ds[ds.length-1].dialog==_925){ds.pop();var pd=ds[ds.length-1];if(ds.length==1){if(!_914._underlay._destroyed){_914._underlay.hide();}}else{_903.set(_914._underlay.domNode,"zIndex",pd.zIndex-1);_914._underlay.set(pd.underlayAttrs);}if(_925.refocus){var _926=pd.focus;if(pd.dialog&&(!_926||!dom.isDescendant(_926,pd.dialog.domNode))){pd.dialog._getFocusItems(pd.dialog.domNode);_926=pd.dialog._firstFocusItem;}if(_926){try{_926.focus();}catch(e){}}}}else{var idx=_8fd.indexOf(_8fd.map(ds,function(elem){return elem.dialog;}),_925);if(idx!=-1){ds.splice(idx,1);}}},isTop:function(_927){return ds[ds.length-1].dialog==_927;}};var ds=_920._dialogStack=[{dialog:null,focus:null,underlayAttrs:null}];if(!_905.isAsync){_906(0,function(){var _928=["dijit/TooltipDialog"];_8fc(_928);});}return _920;});},"dijit/_base/focus":function(){define("dijit/_base/focus",["dojo/_base/array","dojo/dom","dojo/_base/lang","dojo/topic","dojo/_base/window","../focus",".."],function(_929,dom,lang,_92a,win,_92b,_92c){lang.mixin(_92c,{_curFocus:null,_prevFocus:null,isCollapsed:function(){return _92c.getBookmark().isCollapsed;},getBookmark:function(){var bm,rg,tg,sel=win.doc.selection,cf=_92b.curNode;if(win.global.getSelection){sel=win.global.getSelection();if(sel){if(sel.isCollapsed){tg=cf?cf.tagName:"";if(tg){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};}}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){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={};try{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;},moveToBookmark:function(_92d){var _92e=win.doc,mark=_92d.mark;if(mark){if(win.global.getSelection){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(_92e.selection&&mark){var rg;if(mark.pRange){rg=mark.range;}else{if(lang.isArray(mark)){rg=_92e.body.createControlRange();_929.forEach(mark,function(n){rg.addElement(n);});}else{rg=_92e.body.createTextRange();rg.moveToBookmark(mark);}}rg.select();}}}},getFocus:function(menu,_92f){var node=!_92b.curNode||(menu&&dom.isDescendant(_92b.curNode,menu.domNode))?_92c._prevFocus:_92b.curNode;return {node:node,bookmark:node&&(node==_92b.curNode)&&win.withGlobal(_92f||win.global,_92c.getBookmark),openedForWindow:_92f};},_activeStack:[],registerIframe:function(_930){return _92b.registerIframe(_930);},unregisterIframe:function(_931){_931&&_931.remove();},registerWin:function(_932,_933){return _92b.registerWin(_932,_933);},unregisterWin:function(_934){_934&&_934.remove();}});_92b.focus=function(_935){if(!_935){return;}var node="node" in _935?_935.node:_935,_936=_935.bookmark,_937=_935.openedForWindow,_938=_936?_936.isCollapsed:false;if(node){var _939=(node.tagName.toLowerCase()=="iframe")?node.contentWindow:node;if(_939&&_939.focus){try{_939.focus();}catch(e){}}_92b._onFocusNode(node);}if(_936&&win.withGlobal(_937||win.global,_92c.isCollapsed)&&!_938){if(_937){_937.focus();}try{win.withGlobal(_937||win.global,_92c.moveToBookmark,null,[_936]);}catch(e2){}}};_92b.watch("curNode",function(name,_93a,_93b){_92c._curFocus=_93b;_92c._prevFocus=_93a;if(_93b){_92a.publish("focusNode",_93b);}});_92b.watch("activeStack",function(name,_93c,_93d){_92c._activeStack=_93d;});_92b.on("widget-blur",function(_93e,by){_92a.publish("widgetBlur",_93e,by);});_92b.on("widget-focus",function(_93f,by){_92a.publish("widgetFocus",_93f,by);});return _92c;});},"dijit/tree/dndSource":function(){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(_940,_941,_942,_943,_944,lang,on,_945,_946,_947,_948){return _942("dijit.tree.dndSource",_948,{isSource:true,accept:["text","treeNode"],copyOnly:false,dragThreshold:5,betweenThreshold:0,constructor:function(tree,_949){if(!_949){_949={};}lang.mixin(this,_949);this.isSource=typeof _949.isSource=="undefined"?true:_949.isSource;var type=_949.accept instanceof Array?_949.accept:["text","treeNode"];this.accept=null;if(type.length){this.accept={};for(var i=0;i<type.length;++i){this.accept[type[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){_943.add(this.node,"dojoDndSource");}this.targetState="";if(this.accept){_943.add(this.node,"dojoDndTarget");}this.topics=[_946.subscribe("/dnd/source/over",lang.hitch(this,"onDndSourceOver")),_946.subscribe("/dnd/start",lang.hitch(this,"onDndStart")),_946.subscribe("/dnd/drop",lang.hitch(this,"onDndDrop")),_946.subscribe("/dnd/cancel",lang.hitch(this,"onDndCancel"))];},checkAcceptance:function(){return true;},copyState:function(_94a){return this.copyOnly||_94a;},destroy:function(){this.inherited(arguments);var h;while(h=this.topics.pop()){h.remove();}this.targetAnchor=null;},_onDragMouse:function(e){var m=_947.manager(),_94b=this.targetAnchor,_94c=this.current,_94d=this.dropPosition;var _94e="Over";if(_94c&&this.betweenThreshold>0){if(!this.targetBox||_94b!=_94c){this.targetBox=_944.position(_94c.rowNode,true);}if((e.pageY-this.targetBox.y)<=this.betweenThreshold){_94e="Before";}else{if((e.pageY-this.targetBox.y)>=(this.targetBox.h-this.betweenThreshold)){_94e="After";}}}if(_94c!=_94b||_94e!=_94d){if(_94b){this._removeItemClass(_94b.rowNode,_94d);}if(_94c){this._addItemClass(_94c.rowNode,_94e);}if(!_94c){m.canDrop(false);}else{if(_94c==this.tree.rootNode&&_94e!="Over"){m.canDrop(false);}else{var _94f=this.tree.model,_950=false;if(m.source==this){for(var _951 in this.selection){var _952=this.selection[_951];if(_952.item===_94c.item){_950=true;break;}}}if(_950){m.canDrop(false);}else{if(this.checkItemAcceptance(_94c.rowNode,m.source,_94e.toLowerCase())&&!this._isParentChildDrop(m.source,_94c.rowNode)){m.canDrop(true);}else{m.canDrop(false);}}}}this.targetAnchor=_94c;this.dropPosition=_94e;}},onMouseMove:function(e){if(this.isDragging&&this.targetState=="Disabled"){return;}this.inherited(arguments);var m=_947.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 _953=this.getSelectedTreeNodes();if(_953.length){if(_953.length>1){var seen=this.selection,i=0,r=[],n,p;nextitem:while((n=_953[i++])){for(p=n.getParent();p&&p!==this.tree;p=p.getParent()){if(seen[p.id]){continue nextitem;}}r.push(n);}_953=r;}_953=_940.map(_953,function(n){return n.domNode;});m.startDrag(this,_953,this.copyState(_941.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(_954){if(this!=_954){this.mouseDown=false;this._unmarkTargetAnchor();}else{if(this.isDragging){var m=_947.manager();m.canDrop(false);}}},onDndStart:function(_955,_956,copy){if(this.isSource){this._changeState("Source",this==_955?(copy?"Copied":"Moved"):"");}var _957=this.checkAcceptance(_955,_956);this._changeState("Target",_957?"":"Disabled");if(this==_955){_947.manager().overSource(this);}this.isDragging=true;},itemCreator:function(_958){return _940.map(_958,function(node){return {"id":node.id,"name":node.textContent||node.innerText||""};});},onDndDrop:function(_959,_95a,copy){if(this.containerState=="Over"){var tree=this.tree,_95b=tree.model,_95c=this.targetAnchor;this.isDragging=false;var _95d;var _95e;_95d=(_95c&&_95c.item)||tree.item;if(this.dropPosition=="Before"||this.dropPosition=="After"){_95d=(_95c.getParent()&&_95c.getParent().item)||tree.item;_95e=_95c.getIndexInParent();if(this.dropPosition=="After"){_95e=_95c.getIndexInParent()+1;}}else{_95d=(_95c&&_95c.item)||tree.item;}var _95f;_940.forEach(_95a,function(node,idx){var _960=_959.getItem(node.id);if(_940.indexOf(_960.type,"treeNode")!=-1){var _961=_960.data,_962=_961.item,_963=_961.getParent().item;}if(_959==this){if(typeof _95e=="number"){if(_95d==_963&&_961.getIndexInParent()<_95e){_95e-=1;}}_95b.pasteItem(_962,_963,_95d,copy,_95e);}else{if(_95b.isItem(_962)){_95b.pasteItem(_962,_963,_95d,copy,_95e);}else{if(!_95f){_95f=this.itemCreator(_95a,_95c.rowNode,_959);}_95b.newItem(_95f[idx],_95d,_95e);}}},this);this.tree._expandNode(_95c);}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);_947.manager().overSource(this);},onOutEvent:function(){this._unmarkTargetAnchor();var m=_947.manager();if(this.isDragging){m.canDrop(false);}m.outSource(this);this.inherited(arguments);},_isParentChildDrop:function(_964,_965){if(!_964.tree||_964.tree!=this.tree){return false;}var root=_964.tree.domNode;var ids=_964.selection;var node=_965.parentNode;while(node!=root&&!ids[node.id]){node=node.parentNode;}return node.id&&ids[node.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(copy){this._changeState("Source",copy?"Copied":"Moved");}});});},"dijit/a11y":function(){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(_966,_967,_968,dom,_969,_96a,has,_96b,_96c){var _96d=(_96c._isElementShown=function(elem){var s=_96a.get(elem);return (s.visibility!="hidden")&&(s.visibility!="collapsed")&&(s.display!="none")&&(_969.get(elem,"type")!="hidden");});_96c.hasDefaultTabStop=function(elem){switch(elem.nodeName.toLowerCase()){case "a":return _969.has(elem,"href");case "area":case "button":case "input":case "object":case "select":case "textarea":return true;case "iframe":var body;try{var _96e=elem.contentDocument;if("designMode" in _96e&&_96e.designMode=="on"){return true;}body=_96e.body;}catch(e1){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 _96f=(_96c.isTabNavigable=function(elem){if(_969.get(elem,"disabled")){return false;}else{if(_969.has(elem,"tabIndex")){return _969.get(elem,"tabIndex")>=0;}else{return _96c.hasDefaultTabStop(elem);}}});_96c._getTabNavigable=function(root){var _970,last,_971,_972,_973,_974,_975={};function _976(node){return node&&node.tagName.toLowerCase()=="input"&&node.type&&node.type.toLowerCase()=="radio"&&node.name&&node.name.toLowerCase();};var _977=function(_978){for(var _979=_978.firstChild;_979;_979=_979.nextSibling){if(_979.nodeType!=1||(has("ie")&&_979.scopeName!=="HTML")||!_96d(_979)){continue;}if(_96f(_979)){var _97a=_969.get(_979,"tabIndex");if(!_969.has(_979,"tabIndex")||_97a==0){if(!_970){_970=_979;}last=_979;}else{if(_97a>0){if(!_971||_97a<_972){_972=_97a;_971=_979;}if(!_973||_97a>=_974){_974=_97a;_973=_979;}}}var rn=_976(_979);if(_969.get(_979,"checked")&&rn){_975[rn]=_979;}}if(_979.nodeName.toUpperCase()!="SELECT"){_977(_979);}}};if(_96d(root)){_977(root);}function rs(node){return _975[_976(node)]||node;};return {first:rs(_970),last:rs(last),lowest:rs(_971),highest:rs(_973)};};_96c.getFirstInTabbingOrder=function(root){var _97b=_96c._getTabNavigable(dom.byId(root));return _97b.lowest?_97b.lowest:_97b.first;};_96c.getLastInTabbingOrder=function(root){var _97c=_96c._getTabNavigable(dom.byId(root));return _97c.last?_97c.last:_97c.highest;};return {hasDefaultTabStop:_96c.hasDefaultTabStop,isTabNavigable:_96c.isTabNavigable,_getTabNavigable:_96c._getTabNavigable,getFirstInTabbingOrder:_96c.getFirstInTabbingOrder,getLastInTabbingOrder:_96c.getLastInTabbingOrder};});},"dijit/form/_ToggleButtonMixin":function(){define("dijit/form/_ToggleButtonMixin",["dojo/_base/declare","dojo/dom-attr"],function(_97d,_97e){return _97d("dijit.form._ToggleButtonMixin",null,{checked:false,_aria_attr:"aria-pressed",_onClick:function(evt){var _97f=this.checked;this._set("checked",!_97f);var ret=this.inherited(arguments);this.set("checked",ret?this.checked:_97f);return ret;},_setCheckedAttr:function(_980,_981){this._set("checked",_980);_97e.set(this.focusNode||this.domNode,"checked",_980);(this.focusNode||this.domNode).setAttribute(this._aria_attr,_980?"true":"false");this._handleOnChange(_980,_981);},reset:function(){this._hasBeenBlurred=false;this.set("checked",this.params.checked||false);}});});},"dijit/_Widget":function(){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(_982,_983,_984,_985,_986,lang,_987,_988,_989,_98a,_98b,_98c){function _98d(){};function _98e(_98f){return function(obj,_990,_991,_992){if(obj&&typeof _990=="string"&&obj[_990]==_98d){return obj.on(_990.substring(2).toLowerCase(),lang.hitch(_991,_992));}return _98f.apply(_984,arguments);};};_982.around(_984,"connect",_98e);if(_986.connect){_982.around(_986,"connect",_98e);}var _993=_985("dijit._Widget",[_98a,_98b,_98c],{onClick:_98d,onDblClick:_98d,onKeyDown:_98d,onKeyPress:_98d,onKeyUp:_98d,onMouseDown:_98d,onMouseMove:_98d,onMouseOut:_98d,onMouseOver:_98d,onMouseLeave:_98d,onMouseEnter:_98d,onMouseUp:_98d,constructor:function(_994){this._toConnect={};for(var name in _994){if(this[name]===_98d){this._toConnect[name.replace(/^on/,"").toLowerCase()]=_994[name];delete _994[name];}}},postCreate:function(){this.inherited(arguments);for(var name in this._toConnect){this.on(name,this._toConnect[name]);}delete this._toConnect;},on:function(type,func){if(this[this._onMap(type)]===_98d){return _984.connect(this.domNode,type.toLowerCase(),this,func);}return this.inherited(arguments);},_setFocusedAttr:function(val){this._focused=val;this._set("focused",val);},setAttribute:function(attr,_995){_986.deprecated(this.declaredClass+"::setAttribute(attr, value) is deprecated. Use set() instead.","","2.0");this.set(attr,_995);},attr:function(name,_996){if(_983.isDebug){var _997=arguments.callee._ach||(arguments.callee._ach={}),_998=(arguments.callee.caller||"unknown caller").toString();if(!_997[_998]){_986.deprecated(this.declaredClass+"::attr() is deprecated. Use get() or set() instead, called from "+_998,"","2.0");_997[_998]=true;}}var args=arguments.length;if(args>=2||typeof name==="object"){return this.set.apply(this,arguments);}else{return this.get(name);}},getDescendants:function(){_986.deprecated(this.declaredClass+"::getDescendants() is deprecated. Use getChildren() instead.","","2.0");return this.containerNode?_987("[widgetId]",this.containerNode).map(_989.byNode):[];},_onShow:function(){this.onShow();},onShow:function(){},onHide:function(){},onClose:function(){return true;}});if(!_986.isAsync){_988(0,function(){var _999=["dijit/_base"];require(_999);});}return _993;});},"dojo/touch":function(){define("dojo/touch",["./_base/kernel","./on","./has","./mouse"],function(dojo,on,has,_99a){function _99b(type){return function(node,_99c){return on(node,type,_99c);};};var _99d=has("touch");dojo.touch={press:_99b(_99d?"touchstart":"mousedown"),move:_99b(_99d?"touchmove":"mousemove"),release:_99b(_99d?"touchend":"mouseup"),cancel:_99d?_99b("touchcancel"):_99a.leave};return dojo.touch;});},"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","dojo/fx":function(){define("dojo/fx",["./_base/lang","./Evented","./_base/kernel","./_base/array","./_base/connect","./_base/fx","./dom","./dom-style","./dom-geometry","./ready","require"],function(lang,_99e,dojo,_99f,_9a0,_9a1,dom,_9a2,geom,_9a3,_9a4){if(!dojo.isAsync){_9a3(0,function(){var _9a5=["./fx/Toggler"];_9a4(_9a5);});}var _9a6=dojo.fx={};var _9a7={_fire:function(evt,args){if(this[evt]){this[evt].apply(this,args||[]);}return this;}};var _9a8=function(_9a9){this._index=-1;this._animations=_9a9||[];this._current=this._onAnimateCtx=this._onEndCtx=null;this.duration=0;_99f.forEach(this._animations,function(a){this.duration+=a.duration;if(a.delay){this.duration+=a.delay;}},this);};_9a8.prototype=new _99e();lang.extend(_9a8,{_onAnimate:function(){this._fire("onAnimate",arguments);},_onEnd:function(){_9a0.disconnect(this._onAnimateCtx);_9a0.disconnect(this._onEndCtx);this._onAnimateCtx=this._onEndCtx=null;if(this._index+1==this._animations.length){this._fire("onEnd");}else{this._current=this._animations[++this._index];this._onAnimateCtx=_9a0.connect(this._current,"onAnimate",this,"_onAnimate");this._onEndCtx=_9a0.connect(this._current,"onEnd",this,"_onEnd");this._current.play(0,true);}},play:function(_9aa,_9ab){if(!this._current){this._current=this._animations[this._index=0];}if(!_9ab&&this._current.status()=="playing"){return this;}var _9ac=_9a0.connect(this._current,"beforeBegin",this,function(){this._fire("beforeBegin");}),_9ad=_9a0.connect(this._current,"onBegin",this,function(arg){this._fire("onBegin",arguments);}),_9ae=_9a0.connect(this._current,"onPlay",this,function(arg){this._fire("onPlay",arguments);_9a0.disconnect(_9ac);_9a0.disconnect(_9ad);_9a0.disconnect(_9ae);});if(this._onAnimateCtx){_9a0.disconnect(this._onAnimateCtx);}this._onAnimateCtx=_9a0.connect(this._current,"onAnimate",this,"_onAnimate");if(this._onEndCtx){_9a0.disconnect(this._onEndCtx);}this._onEndCtx=_9a0.connect(this._current,"onEnd",this,"_onEnd");this._current.play.apply(this._current,arguments);return this;},pause:function(){if(this._current){var e=_9a0.connect(this._current,"onPause",this,function(arg){this._fire("onPause",arguments);_9a0.disconnect(e);});this._current.pause();}return this;},gotoPercent:function(_9af,_9b0){this.pause();var _9b1=this.duration*_9af;this._current=null;_99f.some(this._animations,function(a){if(a.duration<=_9b1){this._current=a;return true;}_9b1-=a.duration;return false;});if(this._current){this._current.gotoPercent(_9b1/this._current.duration,_9b0);}return this;},stop:function(_9b2){if(this._current){if(_9b2){for(;this._index+1<this._animations.length;++this._index){this._animations[this._index].stop(true);}this._current=this._animations[this._index];}var e=_9a0.connect(this._current,"onStop",this,function(arg){this._fire("onStop",arguments);_9a0.disconnect(e);});this._current.stop();}return this;},status:function(){return this._current?this._current.status():"stopped";},destroy:function(){if(this._onAnimateCtx){_9a0.disconnect(this._onAnimateCtx);}if(this._onEndCtx){_9a0.disconnect(this._onEndCtx);}}});lang.extend(_9a8,_9a7);_9a6.chain=function(_9b3){return new _9a8(_9b3);};var _9b4=function(_9b5){this._animations=_9b5||[];this._connects=[];this._finished=0;this.duration=0;_99f.forEach(_9b5,function(a){var _9b6=a.duration;if(a.delay){_9b6+=a.delay;}if(this.duration<_9b6){this.duration=_9b6;}this._connects.push(_9a0.connect(a,"onEnd",this,"_onEnd"));},this);this._pseudoAnimation=new _9a1.Animation({curve:[0,1],duration:this.duration});var self=this;_99f.forEach(["beforeBegin","onBegin","onPlay","onAnimate","onPause","onStop","onEnd"],function(evt){self._connects.push(_9a0.connect(self._pseudoAnimation,evt,function(){self._fire(evt,arguments);}));});};lang.extend(_9b4,{_doAction:function(_9b7,args){_99f.forEach(this._animations,function(a){a[_9b7].apply(a,args);});return this;},_onEnd:function(){if(++this._finished>this._animations.length){this._fire("onEnd");}},_call:function(_9b8,args){var t=this._pseudoAnimation;t[_9b8].apply(t,args);},play:function(_9b9,_9ba){this._finished=0;this._doAction("play",arguments);this._call("play",arguments);return this;},pause:function(){this._doAction("pause",arguments);this._call("pause",arguments);return this;},gotoPercent:function(_9bb,_9bc){var ms=this.duration*_9bb;_99f.forEach(this._animations,function(a){a.gotoPercent(a.duration<ms?1:(ms/a.duration),_9bc);});this._call("gotoPercent",arguments);return this;},stop:function(_9bd){this._doAction("stop",arguments);this._call("stop",arguments);return this;},status:function(){return this._pseudoAnimation.status();},destroy:function(){_99f.forEach(this._connects,_9a0.disconnect);}});lang.extend(_9b4,_9a7);_9a6.combine=function(_9be){return new _9b4(_9be);};_9a6.wipeIn=function(args){var node=args.node=dom.byId(args.node),s=node.style,o;var anim=_9a1.animateProperty(lang.mixin({properties:{height:{start:function(){o=s.overflow;s.overflow="hidden";if(s.visibility=="hidden"||s.display=="none"){s.height="1px";s.display="";s.visibility="";return 1;}else{var _9bf=_9a2.get(node,"height");return Math.max(_9bf,1);}},end:function(){return node.scrollHeight;}}}},args));var fini=function(){s.height="auto";s.overflow=o;};_9a0.connect(anim,"onStop",fini);_9a0.connect(anim,"onEnd",fini);return anim;};_9a6.wipeOut=function(args){var node=args.node=dom.byId(args.node),s=node.style,o;var anim=_9a1.animateProperty(lang.mixin({properties:{height:{end:1}}},args));_9a0.connect(anim,"beforeBegin",function(){o=s.overflow;s.overflow="hidden";s.display="";});var fini=function(){s.overflow=o;s.height="auto";s.display="none";};_9a0.connect(anim,"onStop",fini);_9a0.connect(anim,"onEnd",fini);return anim;};_9a6.slideTo=function(args){var node=args.node=dom.byId(args.node),top=null,left=null;var init=(function(n){return function(){var cs=_9a2.getComputedStyle(n);var pos=cs.position;top=(pos=="absolute"?n.offsetTop:parseInt(cs.top)||0);left=(pos=="absolute"?n.offsetLeft:parseInt(cs.left)||0);if(pos!="absolute"&&pos!="relative"){var ret=geom.position(n,true);top=ret.y;left=ret.x;n.style.position="absolute";n.style.top=top+"px";n.style.left=left+"px";}};})(node);init();var anim=_9a1.animateProperty(lang.mixin({properties:{top:args.top||0,left:args.left||0}},args));_9a0.connect(anim,"beforeBegin",anim,init);return anim;};return _9a6;});},"dijit/_DialogMixin":function(){define("dijit/_DialogMixin",["dojo/_base/declare","./a11y"],function(_9c0,a11y){return _9c0("dijit._DialogMixin",null,{execute:function(){},onCancel:function(){},onExecute:function(){},_onSubmit:function(){this.onExecute();this.execute(this.get("value"));},_getFocusItems:function(){var _9c1=a11y._getTabNavigable(this.containerNode);this._firstFocusItem=_9c1.lowest||_9c1.first||this.closeButtonNode||this.domNode;this._lastFocusItem=_9c1.last||_9c1.highest||this._firstFocusItem;}});});},"dijit/Tree":function(){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(_9c2,_9c3,_9c4,_9c5,_9c6,_9c7,dom,_9c8,_9c9,_9ca,_9cb,_9cc,_9cd,keys,lang,_9ce,_9cf,_9d0,_9d1,_9d2,_9d3,_9d4,_9d5,_9d6,_9d7,_9d8,_9d9,_9da,_9db){var _9dc=_9c5("dijit._TreeNode",[_9d2,_9d3,_9d4,_9d5,_9d6],{item:null,isTreeNode:true,label:"",_setLabelAttr:{node:"labelNode",type:"innerText"},isExpandable:null,isExpanded:false,state:"UNCHECKED",templateString:_9d7,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(_9dd){var _9de=(Math.max(_9dd,0)*this.tree._nodePixelIndent)+"px";_9ca.set(this.domNode,"backgroundPosition",_9de+" 0px");_9ca.set(this.rowNode,this.isLeftToRight()?"paddingLeft":"paddingRight",_9de);_9c2.forEach(this.getChildren(),function(_9df){_9df.set("indent",_9dd+1);});this._set("indent",_9dd);},markProcessing:function(){this.state="LOADING";this._setExpando(true);},unmarkProcessing:function(){this._setExpando(false);},_updateItemClasses:function(item){var tree=this.tree,_9e0=tree.model;if(tree._v10Compat&&item===_9e0.root){item=null;}this._applyClassAndStyle(item,"icon","Icon");this._applyClassAndStyle(item,"label","Label");this._applyClassAndStyle(item,"row","Row");},_applyClassAndStyle:function(item,_9e1,_9e2){var _9e3="_"+_9e1+"Class";var _9e4=_9e1+"Node";var _9e5=this[_9e3];this[_9e3]=this.tree["get"+_9e2+"Class"](item,this.isExpanded);_9c8.replace(this[_9e4],this[_9e3]||"",_9e5||"");_9ca.set(this[_9e4],this.tree["get"+_9e2+"Style"](item,this.isExpanded)||{});},_updateLayout:function(){var _9e6=this.getParent();if(!_9e6||!_9e6.rowNode||_9e6.rowNode.style.display=="none"){_9c8.add(this.domNode,"dijitTreeIsRoot");}else{_9c8.toggle(this.domNode,"dijitTreeIsLast",!this.getNextSibling());}},_setExpando:function(_9e7){var _9e8=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"],_9e9=["*","-","+","*"],idx=_9e7?0:(this.isExpandable?(this.isExpanded?1:2):3);_9c8.replace(this.expandoNode,_9e8[idx],_9e8);this.expandoNodeText.innerHTML=_9e9[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");}_9c8.add(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);if(this==this.tree.rootNode){this.tree.domNode.setAttribute("aria-expanded","true");}var def,_9ea=_9cc.wipeIn({node:this.containerNode,duration:_9d1.defaultDuration,onEnd:function(){def.callback(true);}});def=(this._expandDeferred=new _9c6(function(){_9ea.stop();}));_9ea.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");}_9c8.remove(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);if(!this._wipeOut){this._wipeOut=_9cc.wipeOut({node:this.containerNode,duration:_9d1.defaultDuration});}this._wipeOut.play();},indent:0,setChildItems:function(_9eb){var tree=this.tree,_9ec=tree.model,defs=[];_9c2.forEach(this.getChildren(),function(_9ed){_9d4.prototype.removeChild.call(this,_9ed);},this);this.state="LOADED";if(_9eb&&_9eb.length>0){this.isExpandable=true;_9c2.forEach(_9eb,function(item){var id=_9ec.getIdentity(item),_9ee=tree._itemNodesMap[id],node;if(_9ee){for(var i=0;i<_9ee.length;i++){if(_9ee[i]&&!_9ee[i].getParent()){node=_9ee[i];node.set("indent",this.indent+1);break;}}}if(!node){node=this.tree._createTreeNode({item:item,tree:tree,isExpandable:_9ec.mayHaveChildren(item),label:tree.getLabel(item),tooltip:tree.getTooltip(item),dir:tree.dir,lang:tree.lang,textDir:tree.textDir,indent:this.indent+1});if(_9ee){_9ee.push(node);}else{tree._itemNodesMap[id]=[node];}}this.addChild(node);if(this.tree.autoExpand||this.tree._state(node)){defs.push(tree._expandNode(node));}},this);_9c2.forEach(this.getChildren(),function(_9ef){_9ef._updateLayout();});}else{this.isExpandable=false;}if(this._setExpando){this._setExpando(false);}this._updateItemClasses(this.item);if(this==tree.rootNode){var fc=this.tree.showRoot?this:this.getChildren()[0];if(fc){fc.setFocusable(true);tree.lastFocused=fc;}else{tree.domNode.setAttribute("tabIndex","0");}}return new _9c7(defs);},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(node){this.inherited(arguments);var _9f0=this.getChildren();if(_9f0.length==0){this.isExpandable=false;this.collapse();}_9c2.forEach(_9f0,function(_9f1){_9f1._updateLayout();});},makeExpandable:function(){this.isExpandable=true;this._setExpando(false);},_onLabelFocus:function(){this.tree._onNodeFocus(this);},setSelected:function(_9f2){this.labelNode.setAttribute("aria-selected",_9f2);_9c8.toggle(this.rowNode,"dijitTreeRowSelected",_9f2);},setFocusable:function(_9f3){this.labelNode.setAttribute("tabIndex",_9f3?"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(_9f4){if(_9f4&&((this.textDir!=_9f4)||!this._created)){this._set("textDir",_9f4);this.applyTextDir(this.labelNode,this.labelNode.innerText||this.labelNode.textContent||"");_9c2.forEach(this.getChildren(),function(_9f5){_9f5.set("textDir",_9f4);},this);}}});var Tree=_9c5("dijit.Tree",[_9d2,_9d3],{store:null,model:null,query:null,label:"",showRoot:true,childrenAttr:["children"],paths:[],path:[],selectedItems:null,selectedItem:null,openOnClick:false,openOnDblClick:false,templateString:_9d8,persist:true,autoExpand:false,dndController:_9db,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(_9f6,_9f7){_9ce.publish(this.id,lang.mixin({tree:this,event:_9f6},_9f7||{}));},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 _9c6();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(lang.isString(this.dndController)){this.dndController=lang.getObject(this.dndController);}var _9f8={};for(var i=0;i<this.dndParams.length;i++){if(this[this.dndParams[i]]){_9f8[this.dndParams[i]]=this[this.dndParams[i]];}}this.dndController=new this.dndController(this,_9f8);}},_store2model:function(){this._v10Compat=true;_9cd.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");var _9f9={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};if(this.params.mayHaveChildren){_9f9.mayHaveChildren=lang.hitch(this,"mayHaveChildren");}if(this.params.getItemChildren){_9f9.getChildren=lang.hitch(this,function(item,_9fa,_9fb){this.getItemChildren((this._v10Compat&&item===this.model.root)?null:item,_9fa,_9fb);});}this.model=new _9da(_9f9);this.showRoot=Boolean(this.label);},onLoad:function(){},_load:function(){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";this.domNode.setAttribute("role","presentation");rn.labelNode.setAttribute("role","presentation");rn.containerNode.setAttribute("role","tree");}this.domNode.appendChild(rn.domNode);var _9fc=this.model.getIdentity(item);if(this._itemNodesMap[_9fc]){this._itemNodesMap[_9fc].push(rn);}else{this._itemNodesMap[_9fc]=[rn];}rn._updateLayout();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){if(!item){return [];}var _9fd=lang.isString(item)?item:this.model.getIdentity(item);return [].concat(this._itemNodesMap[_9fd]);},_setSelectedItemAttr:function(item){this.set("selectedItems",[item]);},_setSelectedItemsAttr:function(_9fe){var tree=this;this._loadDeferred.addCallback(lang.hitch(this,function(){var _9ff=_9c2.map(_9fe,function(item){return (!item||lang.isString(item))?item:tree.model.getIdentity(item);});var _a00=[];_9c2.forEach(_9ff,function(id){_a00=_a00.concat(tree._itemNodesMap[id]||[]);});this.set("selectedNodes",_a00);}));},_setPathAttr:function(path){if(path.length){return this.set("paths",[path]);}else{return this.set("paths",[]);}},_setPathsAttr:function(_a01){var tree=this;return new _9c7(_9c2.map(_a01,function(path){var d=new _9c6();path=_9c2.map(path,function(item){return lang.isString(item)?item:tree.model.getIdentity(item);});if(path.length){tree._loadDeferred.addCallback(function(){_a02(path,[tree.rootNode],d);});}else{d.errback("Empty path");}return d;})).addCallback(_a03);function _a02(path,_a04,def){var _a05=path.shift();var _a06=_9c2.filter(_a04,function(node){return node.getIdentity()==_a05;})[0];if(!!_a06){if(path.length){tree._expandNode(_a06).addCallback(function(){_a02(path,_a06.getChildren(),def);});}else{def.callback(_a06);}}else{def.errback("Could not expand path at "+_a05);}};function _a03(_a07){tree.set("selectedNodes",_9c2.map(_9c2.filter(_a07,function(x){return x[0];}),function(x){return x[1];}));};},_setSelectedNodeAttr:function(node){this.set("selectedNodes",[node]);},_setSelectedNodesAttr:function(_a08){this._loadDeferred.addCallback(lang.hitch(this,function(){this.dndController.setSelection(_a08);}));},mayHaveChildren:function(){},getItemChildren:function(){},getLabel:function(item){return this.model.getLabel(item);},getIconClass:function(item,_a09){return (!item||this.model.mayHaveChildren(item))?(_a09?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";},getLabelClass:function(){},getRowClass:function(){},getIconStyle:function(){},getLabelStyle:function(){},getRowStyle:function(){},getTooltip:function(){return "";},_onKeyPress:function(e){if(e.altKey){return;}var _a0a=_9d0.getEnclosingWidget(e.target);if(!_a0a){return;}var key=e.charOrCode;if(typeof key=="string"&&key!=" "){if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){this._onLetterKeyNav({node:_a0a,key:key.toLowerCase()});_9cb.stop(e);}}else{if(this._curSearch){clearTimeout(this._curSearch.timer);delete this._curSearch;}var map=this._keyHandlerMap;if(!map){map={};map[keys.ENTER]="_onEnterKey";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:_a0a,item:_a0a.item,evt:e});_9cb.stop(e);}}},_onEnterKey:function(_a0b){this._publish("execute",{item:_a0b.item,node:_a0b.node});this.dndController.userSelect(_a0b.node,_9c3.isCopyKey(_a0b.evt),_a0b.evt.shiftKey);this.onClick(_a0b.item,_a0b.node,_a0b.evt);},_onDownArrow:function(_a0c){var node=this._getNextNode(_a0c.node);if(node&&node.isTreeNode){this.focusNode(node);}},_onUpArrow:function(_a0d){var node=_a0d.node;var _a0e=node.getPreviousSibling();if(_a0e){node=_a0e;while(node.isExpandable&&node.isExpanded&&node.hasChildren()){var _a0f=node.getChildren();node=_a0f[_a0f.length-1];}}else{var _a10=node.getParent();if(!(!this.showRoot&&_a10===this.rootNode)){node=_a10;}}if(node&&node.isTreeNode){this.focusNode(node);}},_onRightArrow:function(_a11){var node=_a11.node;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(_a12){var node=_a12.node;if(node.isExpandable&&node.isExpanded){this._collapseNode(node);}else{var _a13=node.getParent();if(_a13&&_a13.isTreeNode&&!(!this.showRoot&&_a13===this.rootNode)){this.focusNode(_a13);}}},_onHomeKey:function(){var node=this._getRootOrFirstNode();if(node){this.focusNode(node);}},_onEndKey:function(){var node=this.rootNode;while(node.isExpanded){var c=node.getChildren();node=c[c.length-1];}if(node&&node.isTreeNode){this.focusNode(node);}},multiCharSearchDuration:250,_onLetterKeyNav:function(_a14){var cs=this._curSearch;if(cs){cs.pattern=cs.pattern+_a14.key;clearTimeout(cs.timer);}else{cs=this._curSearch={pattern:_a14.key,startNode:_a14.node};}var self=this;cs.timer=setTimeout(function(){delete self._curSearch;},this.multiCharSearchDuration);var node=cs.startNode;do{node=this._getNextNode(node);if(!node){node=this._getRootOrFirstNode();}}while(node!==cs.startNode&&(node.label.toLowerCase().substr(0,cs.pattern.length)!=cs.pattern));if(node&&node.isTreeNode){if(node!==cs.startNode){this.focusNode(node);}}},isExpandoNode:function(node,_a15){return dom.isDescendant(node,_a15.expandoNode);},_onClick:function(_a16,e){var _a17=e.target,_a18=this.isExpandoNode(_a17,_a16);if((this.openOnClick&&_a16.isExpandable)||_a18){if(_a16.isExpandable){this._onExpandoClick({node:_a16});}}else{this._publish("execute",{item:_a16.item,node:_a16,evt:e});this.onClick(_a16.item,_a16,e);this.focusNode(_a16);}_9cb.stop(e);},_onDblClick:function(_a19,e){var _a1a=e.target,_a1b=(_a1a==_a19.expandoNode||_a1a==_a19.expandoNodeText);if((this.openOnDblClick&&_a19.isExpandable)||_a1b){if(_a19.isExpandable){this._onExpandoClick({node:_a19});}}else{this._publish("execute",{item:_a19.item,node:_a19,evt:e});this.onDblClick(_a19.item,_a19,e);this.focusNode(_a19);}_9cb.stop(e);},_onExpandoClick:function(_a1c){var node=_a1c.node;this.focusNode(node);if(node.isExpanded){this._collapseNode(node);}else{this._expandNode(node);}},onClick:function(){},onDblClick:function(){},onOpen:function(){},onClose:function(){},_getNextNode:function(node){if(node.isExpandable&&node.isExpanded&&node.hasChildren()){return node.getChildren()[0];}else{while(node&&node.isTreeNode){var _a1d=node.getNextSibling();if(_a1d){return _a1d;}node=node.getParent();}return null;}},_getRootOrFirstNode:function(){return this.showRoot?this.rootNode:this.rootNode.getChildren()[0];},_collapseNode:function(node){if(node._expandNodeDeferred){delete node._expandNodeDeferred;}if(node.isExpandable){if(node.state=="LOADING"){return;}node.collapse();this.onClose(node.item,node);this._state(node,false);}},_expandNode:function(node,_a1e){if(node._expandNodeDeferred&&!_a1e){return node._expandNodeDeferred;}var _a1f=this.model,item=node.item,_a20=this;switch(node.state){case "UNCHECKED":node.markProcessing();var def=(node._expandNodeDeferred=new _9c6());_a1f.getChildren(item,function(_a21){node.unmarkProcessing();var scid=node.setChildItems(_a21);var ed=_a20._expandNode(node,true);scid.addCallback(function(){ed.addCallback(function(){def.callback();});});},function(err){console.error(_a20,": error loading root children: ",err);});break;default:def=(node._expandNodeDeferred=node.expand());this.onOpen(node.item,node);this._state(node,true);}return def;},focusNode:function(node){_9cf.focus(node.labelNode);},_onNodeFocus:function(node){if(node&&node!=this.lastFocused){if(this.lastFocused&&!this.lastFocused._destroyed){this.lastFocused.setFocusable(false);}node.setFocusable(true);this.lastFocused=node;}},_onNodeMouseEnter:function(){},_onNodeMouseLeave:function(){},_onItemChange:function(item){var _a22=this.model,_a23=_a22.getIdentity(item),_a24=this._itemNodesMap[_a23];if(_a24){var _a25=this.getLabel(item),_a26=this.getTooltip(item);_9c2.forEach(_a24,function(node){node.set({item:item,label:_a25,tooltip:_a26});node._updateItemClasses(item);});}},_onItemChildrenChange:function(_a27,_a28){var _a29=this.model,_a2a=_a29.getIdentity(_a27),_a2b=this._itemNodesMap[_a2a];if(_a2b){_9c2.forEach(_a2b,function(_a2c){_a2c.setChildItems(_a28);});}},_onItemDelete:function(item){var _a2d=this.model,_a2e=_a2d.getIdentity(item),_a2f=this._itemNodesMap[_a2e];if(_a2f){_9c2.forEach(_a2f,function(node){this.dndController.removeTreeNode(node);var _a30=node.getParent();if(_a30){_a30.removeChild(node);}node.destroyRecursive();},this);delete this._itemNodesMap[_a2e];}},_initState:function(){this._openedNodes={};if(this.persist&&this.cookieName){var oreo=_9c4(this.cookieName);if(oreo){_9c2.forEach(oreo.split(","),function(item){this._openedNodes[item]=true;},this);}}},_state:function(node,_a31){if(!this.persist){return false;}var path=_9c2.map(node.getTreePath(),function(item){return this.model.getIdentity(item);},this).join("/");if(arguments.length===1){return this._openedNodes[path];}else{if(_a31){this._openedNodes[path]=true;}else{delete this._openedNodes[path];}var ary=[];for(var id in this._openedNodes){ary.push(id);}_9c4(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(){this.destroy();},resize:function(_a32){if(_a32){_9c9.setMarginBox(this.domNode,_a32);}this._nodePixelIndent=_9c9.position(this.tree.indentDetector).w;if(this.tree.rootNode){this.tree.rootNode.set("indent",this.showRoot?0:-1);}},_createTreeNode:function(args){return new _9dc(args);},_setTextDirAttr:function(_a33){if(_a33&&this.textDir!=_a33){this._set("textDir",_a33);this.rootNode.set("textDir",_a33);}}});Tree._TreeNode=_9dc;return Tree;});},"dijit/form/_FormValueWidget":function(){define("dijit/form/_FormValueWidget",["dojo/_base/declare","dojo/_base/sniff","./_FormWidget","./_FormValueMixin"],function(_a34,has,_a35,_a36){return _a34("dijit.form._FormValueWidget",[_a35,_a36],{_layoutHackIE7:function(){if(has("ie")==7){var _a37=this.domNode;var _a38=_a37.parentNode;var _a39=_a37.firstChild||_a37;var _a3a=_a39.style.filter;var _a3b=this;while(_a38&&_a38.clientHeight==0){(function ping(){var _a3c=_a3b.connect(_a38,"onscroll",function(){_a3b.disconnect(_a3c);_a39.style.filter=(new Date()).getMilliseconds();setTimeout(function(){_a39.style.filter=_a3a;},0);});})();_a38=_a38.parentNode;}}}});});},"*now":function(r){r(["dojo/i18n!*preload*dojo/nls/tt-rss-layer*[\"ar\",\"ca\",\"cs\",\"da\",\"de-de\",\"el\",\"en-gb\",\"en-us\",\"es-es\",\"fi-fi\",\"fr-fr\",\"he-il\",\"hu\",\"it-it\",\"ja-jp\",\"ko-kr\",\"nl-nl\",\"nb\",\"pl\",\"pt-br\",\"pt-pt\",\"ru\",\"sk\",\"sl\",\"sv\",\"th\",\"tr\",\"zh-tw\",\"zh-cn\",\"ROOT\"]"]);}}});define("dojo/tt-rss-layer",[],1); \ No newline at end of file
diff --git a/lib/dojo/tt-rss-layer.js.uncompressed.js b/lib/dojo/tt-rss-layer.js.uncompressed.js
index 81d4302df..cc43d8726 100644
--- a/lib/dojo/tt-rss-layer.js.uncompressed.js
+++ b/lib/dojo/tt-rss-layer.js.uncompressed.js
@@ -1,3197 +1,5521 @@
-/*
- 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
-*/
+require({cache:{
+'dijit/form/TextBox':function(){
+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){
-/*
- This is an optimized version of Dojo, built for deployment and not for
- development. To get sources and documentation, please visit:
+/*=====
+ var _FormValueWidget = dijit.form._FormValueWidget;
+ var _TextBoxMixin = dijit.form._TextBoxMixin;
+=====*/
- http://dojotoolkit.org
-*/
+ // module:
+ // dijit/form/TextBox
+ // summary:
+ // A base class for textbox form inputs
-dojo.provide("tt-rss-layer");
-if(!dojo._hasResource["dojo.date.stamp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.date.stamp"] = true;
-dojo.provide("dojo.date.stamp");
+ var TextBox = declare(/*====="dijit.form.TextBox", =====*/ [_FormValueWidget, _TextBoxMixin], {
+ // summary:
+ // A base class for textbox form inputs
-dojo.getObject("date.stamp", true, dojo);
+ templateString: template,
+ _singleNodeTemplate: '<input class="dijit dijitReset dijitLeft dijitInputField" data-dojo-attach-point="textbox,focusNode" autocomplete="off" type="${type}" ${!nameAttrSetting} />',
-// Methods to convert dates to or from a wire (string) format using well-known conventions
+ _buttonInputDisabled: has("ie") ? "disabled" : "", // allows IE to disallow focus, but Firefox cannot be disabled for mousedown events
-dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/defaultTime){
- // summary:
- // Returns a Date object given a string formatted according to a subset of the ISO-8601 standard.
- //
- // description:
- // Accepts a string formatted according to a profile of ISO8601 as defined by
- // [RFC3339](http://www.ietf.org/rfc/rfc3339.txt), except that partial input is allowed.
- // Can also process dates as specified [by the W3C](http://www.w3.org/TR/NOTE-datetime)
- // The following combinations are valid:
- //
- // * dates only
- // | * yyyy
- // | * yyyy-MM
- // | * yyyy-MM-dd
- // * times only, with an optional time zone appended
- // | * THH:mm
- // | * THH:mm:ss
- // | * THH:mm:ss.SSS
- // * and "datetimes" which could be any combination of the above
- //
- // timezones may be specified as Z (for UTC) or +/- followed by a time expression HH:mm
- // Assumes the local time zone if not specified. Does not validate. Improperly formatted
- // input may return null. Arguments which are out of bounds will be handled
- // by the Date constructor (e.g. January 32nd typically gets resolved to February 1st)
- // Only years between 100 and 9999 are supported.
- //
- // formattedString:
- // A string such as 2005-06-30T08:05:00-07:00 or 2005-06-30 or T08:05:00
- //
- // defaultTime:
- // Used for defaults for fields omitted in the formattedString.
- // Uses 1970-01-01T00:00:00.0Z by default.
+ baseClass: "dijitTextBox",
- if(!dojo.date.stamp._isoRegExp){
- dojo.date.stamp._isoRegExp =
-//TODO: could be more restrictive and check for 00-59, etc.
- /^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;
- }
+ 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);
+ },
- var match = dojo.date.stamp._isoRegExp.exec(formattedString),
- result = null;
+ _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);
+ }
+ },
- if(match){
- match.shift();
- if(match[1]){match[1]--;} // Javascript Date months are 0-based
- if(match[6]){match[6] *= 1000;} // Javascript Date expects fractional seconds as milliseconds
+ _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();
+ },
- if(defaultTime){
- // mix in defaultTime. Relatively expensive, so use || operators for the fast path of defaultTime === 0
- defaultTime = new Date(defaultTime);
- dojo.forEach(dojo.map(["FullYear", "Month", "Date", "Hours", "Minutes", "Seconds", "Milliseconds"], function(prop){
- return defaultTime["get" + prop]();
- }), function(value, index){
- match[index] = match[index] || value;
- });
- }
- result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0); //TODO: UTC defaults
- if(match[0] < 100){
- result.setFullYear(match[0] || 1970);
- }
+ _updatePlaceHolder: function(){
+ if(this._phspan){
+ this._phspan.style.display=(this.placeHolder&&!this.focused&&!this.textbox.value)?"":"none";
+ }
+ },
- var offset = 0,
- zoneSign = match[7] && match[7].charAt(0);
- if(zoneSign != 'Z'){
- offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0);
- if(zoneSign != '-'){ offset *= -1; }
- }
- if(zoneSign){
- offset -= result.getTimezoneOffset();
- }
- if(offset){
- result.setTime(result.getTime() + offset * 60000);
- }
- }
+ _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+ this.inherited(arguments);
+ this._updatePlaceHolder();
+ },
- return result; // Date or null
-};
+ 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');
+ },
-/*=====
- dojo.date.stamp.__Options = function(){
- // selector: String
- // "date" or "time" for partial formatting of the Date object.
- // Both date and time will be formatted by default.
- // zulu: Boolean
- // if true, UTC/GMT is used for a timezone
- // milliseconds: Boolean
- // if true, output milliseconds
- this.selector = selector;
- this.zulu = zulu;
- this.milliseconds = milliseconds;
- }
-=====*/
+ 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);
+ },
-dojo.date.stamp.toISOString = function(/*Date*/dateObject, /*dojo.date.stamp.__Options?*/options){
- // summary:
- // Format a Date object as a string according a subset of the ISO-8601 standard
- //
- // description:
- // When options.selector is omitted, output follows [RFC3339](http://www.ietf.org/rfc/rfc3339.txt)
- // The local time zone is included as an offset from GMT, except when selector=='time' (time without a date)
- // Does not check bounds. Only years between 100 and 9999 are supported.
- //
- // dateObject:
- // A Date object
+ _onBlur: function(e){
+ if(this.disabled){ return; }
+ this.inherited(arguments);
+ this._updatePlaceHolder();
+ },
- var _ = function(n){ return (n < 10) ? "0" + n : n; };
- options = options || {};
- var formattedDate = [],
- getter = options.zulu ? "getUTC" : "get",
- date = "";
- if(options.selector != "time"){
- var year = dateObject[getter+"FullYear"]();
- date = ["0000".substr((year+"").length)+year, _(dateObject[getter+"Month"]()+1), _(dateObject[getter+"Date"]())].join('-');
- }
- formattedDate.push(date);
- if(options.selector != "date"){
- var time = [_(dateObject[getter+"Hours"]()), _(dateObject[getter+"Minutes"]()), _(dateObject[getter+"Seconds"]())].join(':');
- var millis = dateObject[getter+"Milliseconds"]();
- if(options.milliseconds){
- time += "."+ (millis < 100 ? "0" : "") + _(millis);
+ _onFocus: function(/*String*/ by){
+ if(this.disabled || this.readOnly){ return; }
+ this.inherited(arguments);
+ this._updatePlaceHolder();
}
- if(options.zulu){
- time += "Z";
- }else if(options.selector != "time"){
- var timezoneOffset = dateObject.getTimezoneOffset();
- var absOffset = Math.abs(timezoneOffset);
- time += (timezoneOffset > 0 ? "-" : "+") +
- _(Math.floor(absOffset/60)) + ":" + _(absOffset%60);
+ });
+
+ 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();
+ }
}
- formattedDate.push(time);
+ }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";
}
- return formattedDate.join('T'); // String
-};
+ lang.setObject("dijit.form.TextBox", TextBox); // don't do direct assignment, it confuses API doc parser
-}
+ return TextBox;
+});
-if(!dojo._hasResource["dojo.parser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.parser"] = true;
-dojo.provide("dojo.parser");
+},
+'dijit/_base/scroll':function(){
+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);
+ };
+});
-new Date("X"); // workaround for #11279, new Date("") == NaN
+},
+'dijit/_TemplatedMixin':function(){
+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) {
-dojo.parser = new function(){
- // summary:
- // The Dom/Widget parsing package
+/*=====
+ var _WidgetBase = dijit._WidgetBase;
+=====*/
- var d = dojo;
+ // module:
+ // dijit/_TemplatedMixin
+ // summary:
+ // Mixin for widgets that are instantiated from a template
- function val2type(/*Object*/ value){
+ var _TemplatedMixin = declare("dijit._TemplatedMixin", null, {
// summary:
- // Returns name of type of given value.
+ // Mixin for widgets that are instantiated from a template
- if(d.isString(value)){ return "string"; }
- if(typeof value == "number"){ return "number"; }
- if(typeof value == "boolean"){ return "boolean"; }
- if(d.isFunction(value)){ return "function"; }
- if(d.isArray(value)){ return "array"; } // typeof [] == "object"
- if(value instanceof Date) { return "date"; } // assume timestamp
- if(value instanceof d._Url){ return "url"; }
- return "object";
- }
+ // templateString: [protected] String
+ // A string that represents the widget template.
+ // Use in conjunction with dojo.cache() to load from a file.
+ templateString: null,
- function str2obj(/*String*/ value, /*String*/ type){
- // summary:
- // Convert given string value to given type
- switch(type){
- case "string":
- return value;
- case "number":
- return value.length ? Number(value) : NaN;
- case "boolean":
- // for checked/disabled value might be "" or "checked". interpret as true.
- return typeof value == "boolean" ? value : !(value.toLowerCase()=="false");
- case "function":
- if(d.isFunction(value)){
- // IE gives us a function, even when we say something like onClick="foo"
- // (in which case it gives us an invalid function "function(){ foo }").
- // Therefore, convert to string
- value=value.toString();
- value=d.trim(value.substring(value.indexOf('{')+1, value.length-1));
- }
- try{
- if(value === "" || value.search(/[^\w\.]+/i) != -1){
- // The user has specified some text for a function like "return x+5"
- return new Function(value);
- }else{
- // The user has specified the name of a function like "myOnClick"
- // or a single word function "return"
- return d.getObject(value, false) || new Function(value);
- }
- }catch(e){ return new Function(); }
- case "array":
- return value ? value.split(/\s*,\s*/) : [];
- case "date":
- switch(value){
- case "": return new Date(""); // the NaN of dates
- case "now": return new Date(); // current date
- default: return d.date.stamp.fromISOString(value);
- }
- case "url":
- return d.baseUrl + value;
- default:
- return d.fromJson(value);
- }
- }
+ // 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,
- var dummyClass = {}, instanceClasses = {
- // map from fully qualified name (like "dijit.Button") to structure like
- // { cls: dijit.Button, params: {label: "string", disabled: "boolean"} }
- };
+ // 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,
- // Widgets like BorderContainer add properties to _Widget via dojo.extend().
- // If BorderContainer is loaded after _Widget's parameter list has been cached,
- // we need to refresh that parameter list (for _Widget and all widgets that extend _Widget).
- // TODO: remove this in 2.0, when we stop caching parameters.
- d.connect(d, "extend", function(){
- instanceClasses = {};
- });
+ // _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,
- function getProtoInfo(cls, params){
- // cls: A prototype
- // The prototype of the class to check props on
- // params: Object
- // The parameters object to mix found parameters onto.
- for(var name in cls){
- if(name.charAt(0)=="_"){ continue; } // skip internal properties
- if(name in dummyClass){ continue; } // skip "constructor" and "toString"
- params[name] = val2type(cls[name]);
- }
- return params;
- }
+/*=====
+ // _attachPoints: [private] String[]
+ // List of widget attribute names associated with data-dojo-attach-point=... in the
+ // template, ex: ["containerNode", "labelNode"]
+ _attachPoints: [],
+ =====*/
- function getClassInfo(/*String*/ className, /*Boolean*/ skipParamsLookup){
- // summary:
- // Maps a widget name string like "dijit.form.Button" to the widget constructor itself,
- // and a list of that widget's parameters and their types
- // className:
- // fully qualified name (like "dijit.form.Button")
- // returns:
- // structure like
- // {
- // cls: dijit.Button,
- // params: { label: "string", disabled: "boolean"}
- // }
-
- var c = instanceClasses[className];
- if(!c){
- // get pointer to widget class
- var cls = d.getObject(className), params = null;
- if(!cls){ return null; } // class not defined [yet]
- if(!skipParamsLookup){ // from fastpath, we don't need to lookup the attrs on the proto because they are explicit
- params = getProtoInfo(cls.prototype, {})
- }
- c = { cls: cls, params: params };
-
- }else if(!skipParamsLookup && !c.params){
- // if we're calling getClassInfo and have a cls proto, but no params info, scan that cls for params now
- // and update the pointer in instanceClasses[className]. This happens when a widget appears in another
- // widget's template which still uses dojoType, but an instance of the widget appears prior with a data-dojo-type,
- // skipping this lookup the first time.
- c.params = getProtoInfo(c.cls.prototype, {});
- }
-
- return c;
- }
+/*=====
+ // _attachEvents: [private] Handle[]
+ // List of connections associated with data-dojo-attach-event=... in the
+ // template
+ _attachEvents: [],
+ =====*/
- this._functionFromScript = function(script, attrData){
- // summary:
- // Convert a <script type="dojo/method" args="a, b, c"> ... </script>
- // into a function
- // script: DOMNode
- // The <script> DOMNode
- // attrData: String
- // For HTML5 compliance, searches for attrData + "args" (typically
- // "data-dojo-args") instead of "args"
- var preamble = "";
- var suffix = "";
- var argsStr = (script.getAttribute(attrData + "args") || script.getAttribute("args"));
- if(argsStr){
- d.forEach(argsStr.split(/\s*,\s*/), function(part, idx){
- preamble += "var "+part+" = arguments["+idx+"]; ";
- });
- }
- var withStr = script.getAttribute("with");
- if(withStr && withStr.length){
- d.forEach(withStr.split(/\s*,\s*/), function(part){
- preamble += "with("+part+"){";
- suffix += "}";
- });
- }
- return new Function(preamble+script.innerHTML+suffix);
- };
+ constructor: function(){
+ this._attachPoints = [];
+ this._attachEvents = [];
+ },
- this.instantiate = function(/* Array */nodes, /* Object? */mixin, /* Object? */args){
- // summary:
- // Takes array of nodes, and turns them into class instances and
- // potentially calls a startup method to allow them to connect with
- // any children.
- // nodes: Array
- // Array of nodes or objects like
- // | {
- // | type: "dijit.form.Button",
- // | node: DOMNode,
- // | scripts: [ ... ], // array of <script type="dojo/..."> children of node
- // | inherited: { ... } // settings inherited from ancestors like dir, theme, etc.
- // | }
- // mixin: Object?
- // An object that will be mixed in with each node in the array.
- // Values in the mixin will override values in the node, if they
- // exist.
- // args: Object?
- // An object used to hold kwArgs for instantiation.
- // See parse.args argument for details.
+ _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 ""; }
- var thelist = [],
- mixin = mixin||{};
- args = args||{};
+ // 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);
+ },
- // TODO: for 2.0 default to data-dojo- regardless of scopeName (or maybe scopeName won't exist in 2.0)
- var attrName = (args.scope || d._scopeName) + "Type", // typically "dojoType"
- attrData = "data-" + (args.scope || d._scopeName) + "-"; // typically "data-dojo-"
+ buildRendering: function(){
+ // summary:
+ // Construct the UI for this widget from a template, setting this.domNode.
+ // tags:
+ // protected
- d.forEach(nodes, function(obj){
- if(!obj){ return; }
+ 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);
- // Get pointers to DOMNode, dojoType string, and clsInfo (metadata about the dojoType), etc.
- var node, type, clsInfo, clazz, scripts, fastpath;
- if(obj.node){
- // new format of nodes[] array, object w/lots of properties pre-computed for me
- node = obj.node;
- type = obj.type;
- fastpath = obj.fastpath;
- clsInfo = obj.clsInfo || (type && getClassInfo(type, fastpath));
- clazz = clsInfo && clsInfo.cls;
- scripts = obj.scripts;
+ 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{
- // old (backwards compatible) format of nodes[] array, simple array of DOMNodes. no fastpath/data-dojo-type support here.
- node = obj;
- type = attrName in mixin ? mixin[attrName] : node.getAttribute(attrName);
- clsInfo = type && getClassInfo(type);
- clazz = clsInfo && clsInfo.cls;
- scripts = (clazz && (clazz._noScript || clazz.prototype._noScript) ? [] :
- d.query("> script[type^='dojo/']", node));
- }
- if(!clsInfo){
- throw new Error("Could not load class '" + type);
+ // if it's a node, all we have to do is clone it
+ node = cached.cloneNode(true);
}
- // Setup hash to hold parameter settings for this widget. Start with the parameter
- // settings inherited from ancestors ("dir" and "lang").
- // Inherited setting may later be overridden by explicit settings on node itself.
- var params = {};
-
- if(args.defaults){
- // settings for the document itself (or whatever subtree is being parsed)
- d._mixin(params, args.defaults);
- }
- if(obj.inherited){
- // settings from dir=rtl or lang=... on a node above this node
- d._mixin(params, obj.inherited);
- }
-
- // mix things found in data-dojo-props into the params
- if(fastpath){
- var extra = node.getAttribute(attrData + "props");
- if(extra && extra.length){
- try{
- extra = d.fromJson.call(args.propsThis, "{" + extra + "}");
- d._mixin(params, extra);
- }catch(e){
- // give the user a pointer to their invalid parameters. FIXME: can we kill this in production?
- throw new Error(e.toString() + " in data-dojo-props='" + extra + "'");
- }
+ 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
- // For the benefit of _Templated, check if node has data-dojo-attach-point/data-dojo-attach-event
- // and mix those in as though they were parameters
- var attachPoint = node.getAttribute(attrData + "attach-point");
+ 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){
- params.dojoAttachPoint = 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);
+ }
}
- var attachEvent = node.getAttribute(attrData + "attach-event");
+
+ // Process data-dojo-attach-event
+ var attachEvent = getAttrFunc(baseNode, "dojoAttachEvent") || getAttrFunc(baseNode, "data-dojo-attach-event");
if(attachEvent){
- params.dojoAttachEvent = attachEvent;
- }
- dojo.mixin(params, mixin);
- }else{
- // FIXME: we need something like "deprecateOnce()" to throw dojo.deprecation for something.
- // remove this logic in 2.0
- // read parameters (ie, attributes) specified on DOMNode
-
- var attributes = node.attributes;
-
- // clsInfo.params lists expected params like {"checked": "boolean", "n": "number"}
- for(var name in clsInfo.params){
- var item = name in mixin ? { value:mixin[name], specified:true } : attributes.getNamedItem(name);
- if(!item || (!item.specified && (!dojo.isIE || name.toLowerCase()!="value"))){ continue; }
- var value = item.value;
- // Deal with IE quirks for 'class' and 'style'
- switch(name){
- case "class":
- value = "className" in mixin ? mixin.className : node.className;
- break;
- case "style":
- value = "style" in mixin ? mixin.style : (node.style && node.style.cssText); // FIXME: Opera?
- }
- var _type = clsInfo.params[name];
- if(typeof value == "string"){
- params[name] = str2obj(value, _type);
- }else{
- params[name] = value;
+ // 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));
+ }
}
}
}
+ },
- // Process <script type="dojo/*"> script tags
- // <script type="dojo/method" event="foo"> tags are added to params, and passed to
- // the widget on instantiation.
- // <script type="dojo/method"> tags (with no event) are executed after instantiation
- // <script type="dojo/connect" event="foo"> tags are dojo.connected after instantiation
- // note: dojo/* script tags cannot exist in self closing widgets, like <input />
- var connects = [], // functions to connect after instantiation
- calls = []; // functions to call after instantiation
-
- d.forEach(scripts, function(script){
- node.removeChild(script);
- // FIXME: drop event="" support in 2.0. use data-dojo-event="" instead
- var event = (script.getAttribute(attrData + "event") || script.getAttribute("event")),
- type = script.getAttribute("type"),
- nf = d.parser._functionFromScript(script, attrData);
- if(event){
- if(type == "dojo/connect"){
- connects.push({event: event, func: nf});
- }else{
- params[event] = nf;
- }
- }else{
- calls.push(nf);
+ 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);
+ }
- var markupFactory = clazz.markupFactory || clazz.prototype && clazz.prototype.markupFactory;
- // create the instance
- var instance = markupFactory ? markupFactory(params, node, clazz) : new clazz(params, node);
- thelist.push(instance);
+ templateString = string.trim(templateString);
- // map it to the JS namespace if that makes sense
- // FIXME: in 2.0, drop jsId support. use data-dojo-id instead
- var jsname = (node.getAttribute(attrData + "id") || node.getAttribute("jsId"));
- if(jsname){
- d.setObject(jsname, instance);
+ 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
+ }
+ };
- // process connections and startup functions
- d.forEach(connects, function(connect){
- d.connect(instance, connect.event, null, connect.func);
- });
- d.forEach(calls, function(func){
- func.call(instance);
- });
+ 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];
+ }
});
+ }
- // Call startup on each top level instance if it makes sense (as for
- // widgets). Parent widgets will recursively call startup on their
- // (non-top level) children
- if(!mixin._started){
- // TODO: for 2.0, when old instantiate() API is desupported, store parent-child
- // relationships in the nodes[] array so that no getParent() call is needed.
- // Note that will require a parse() call from ContentPane setting a param that the
- // ContentPane is the parent widget (so that the parse doesn't call startup() on the
- // ContentPane's children)
- d.forEach(thelist, function(instance){
- if( !args.noStart && instance &&
- dojo.isFunction(instance.startup) &&
- !instance._started &&
- (!instance.getParent || !instance.getParent())
- ){
- instance.startup();
- }
- });
+ // 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;
+});
+
+},
+'dijit/_CssStateMixin':function(){
+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]);
}
- return thelist;
- };
+ // 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();
+ },
- this.parse = function(rootNode, args){
+ _cssMouseEvent: function(/*Event*/ event){
// summary:
- // Scan the DOM for class instances, and instantiate them.
+ // 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:
- // Search specified node (or root node) recursively for class instances,
- // and instantiate them. Searches for either data-dojo-type="Class" or
- // dojoType="Class" where "Class" is a a fully qualified class name,
- // like `dijit.form.Button`
- //
- // Using `data-dojo-type`:
- // Attributes using can be mixed into the parameters used to instantitate the
- // Class by using a `data-dojo-props` attribute on the node being converted.
- // `data-dojo-props` should be a string attribute to be converted from JSON.
- //
- // Using `dojoType`:
- // Attributes are read from the original domNode and converted to appropriate
- // types by looking up the Class prototype values. This is the default behavior
- // from Dojo 1.0 to Dojo 1.5. `dojoType` support is deprecated, and will
- // go away in Dojo 2.0.
- //
- // rootNode: DomNode?
- // A default starting root node from which to start the parsing. Can be
- // omitted, defaulting to the entire document. If omitted, the `args`
- // object can be passed in this place. If the `args` object has a
- // `rootNode` member, that is used.
- //
- // args: Object
- // a kwArgs object passed along to instantiate()
- //
- // * noStart: Boolean?
- // when set will prevent the parser from calling .startup()
- // when locating the nodes.
- // * rootNode: DomNode?
- // identical to the function's `rootNode` argument, though
- // allowed to be passed in via this `args object.
- // * template: Boolean
- // If true, ignores ContentPane's stopParser flag and parses contents inside of
- // a ContentPane inside of a template. This allows dojoAttachPoint on widgets/nodes
- // nested inside the ContentPane to work.
- // * inherited: Object
- // Hash possibly containing dir and lang settings to be applied to
- // parsed widgets, unless there's another setting on a sub-node that overrides
- // * scope: String
- // 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.)
- // * propsThis: Object
- // If specified, "this" referenced from data-dojo-props will refer to propsThis.
- // Intended for use from the widgets-in-template feature of `dijit._Templated`
- //
- // example:
- // Parse all widgets on a page:
- // | dojo.parser.parse();
- //
- // example:
- // Parse all classes within the node with id="foo"
- // | dojo.parser.parse(dojo.byId('foo'));
+ // 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".
//
- // example:
- // Parse all classes in a page, but do not call .startup() on any
- // child
- // | dojo.parser.parse({ noStart: true })
+ // 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
//
- // example:
- // Parse all classes in a node, but do not call .startup()
- // | dojo.parser.parse(someNode, { noStart:true });
- // | // or
- // | dojo.parser.parse({ noStart:true, rootNode: someNode });
+ // 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
- // determine the root node based on the passed arguments.
- var root;
- if(!args && rootNode && rootNode.rootNode){
- args = rootNode;
- root = args.rootNode;
+ // 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{
- root = rootNode;
+ if(this.active){
+ multiply("Active");
+ }else if(this.hovering){
+ multiply("Hover");
+ }
}
- root = root ? dojo.byId(root) : dojo.body();
- args = args || {};
- var attrName = (args.scope || d._scopeName) + "Type", // typically "dojoType"
- attrData = "data-" + (args.scope || d._scopeName) + "-"; // typically "data-dojo-"
-
- function scan(parent, list){
- // summary:
- // Parent is an Object representing a DOMNode, with or without a dojoType specified.
- // Scan parent's children looking for nodes with dojoType specified, storing in list[].
- // If parent has a dojoType, also collects <script type=dojo/*> children and stores in parent.scripts[].
- // parent: Object
- // Object representing the parent node, like
- // | {
- // | node: DomNode, // scan children of this node
- // | inherited: {dir: "rtl"}, // dir/lang setting inherited from above node
- // |
- // | // attributes only set if node has dojoType specified
- // | scripts: [], // empty array, put <script type=dojo/*> in here
- // | clsInfo: { cls: dijit.form.Button, ...}
- // | }
- // list: DomNode[]
- // Output array of objects (same format as parent) representing nodes to be turned into widgets
-
- // Effective dir and lang settings on parent node, either set directly or inherited from grandparent
- var inherited = dojo.clone(parent.inherited);
- dojo.forEach(["dir", "lang"], function(name){
- // TODO: what if this is a widget and dir/lang are declared in data-dojo-props?
- var val = parent.node.getAttribute(name);
- if(val){
- inherited[name] = val;
- }
- });
+ if(this.focused){
+ multiply("Focused");
+ }
- // if parent is a widget, then search for <script type=dojo/*> tags and put them in scripts[].
- var scripts = parent.clsInfo && !parent.clsInfo.cls.prototype._noScript ? parent.scripts : null;
+ // 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
- // unless parent is a widget with the stopParser flag set, continue search for dojoType, recursively
- var recurse = (!parent.clsInfo || !parent.clsInfo.cls.prototype.stopParser) || (args && args.template);
+ array.forEach(tn.className.split(" "), function(c){ classHash[c] = true; });
- // scan parent's children looking for dojoType and <script type=dojo/*>
- for(var child = parent.node.firstChild; child; child = child.nextSibling){
- if(child.nodeType == 1){
- // FIXME: desupport dojoType in 2.0. use data-dojo-type instead
- var type, html5 = recurse && child.getAttribute(attrData + "type");
- if(html5){
- type = html5;
- }else{
- // fallback to backward compatible mode, using dojoType. remove in 2.0
- type = recurse && child.getAttribute(attrName);
- }
-
- var fastpath = html5 == type;
-
- if(type){
- // if dojoType/data-dojo-type specified, add to output array of nodes to instantiate
- var params = {
- "type": type,
- fastpath: fastpath,
- clsInfo: getClassInfo(type, fastpath), // note: won't find classes declared via dojo.Declaration
- node: child,
- scripts: [], // <script> nodes that are parent's children
- inherited: inherited // dir & lang attributes inherited from parent
- };
- list.push(params);
-
- // Recurse, collecting <script type="dojo/..."> children, and also looking for
- // descendant nodes with dojoType specified (unless the widget has the stopParser flag),
- scan(params, list);
- }else if(scripts && child.nodeName.toLowerCase() == "script"){
- // if <script type="dojo/...">, save in scripts[]
- type = child.getAttribute("type");
- if (type && /^dojo\/\w/i.test(type)) {
- scripts.push(child);
- }
- }else if(recurse){
- // Recurse, looking for grandchild nodes with dojoType specified
- scan({
- node: child,
- inherited: inherited
- }, list);
- }
- }
- }
+ if("_stateClasses" in this){
+ array.forEach(this._stateClasses, function(c){ delete classHash[c]; });
}
- // Ignore bogus entries in inherited hash like {dir: ""}
- var inherited = {};
- if(args && args.inherited){
- for(var key in args.inherited){
- if(args.inherited[key]){ inherited[key] = args.inherited[key]; }
- }
+ array.forEach(newStateClasses, function(c){ classHash[c] = true; });
+
+ var newClasses = [];
+ for(var c in classHash){
+ newClasses.push(c);
}
+ tn.className = newClasses.join(" ");
- // Make list of all nodes on page w/dojoType specified
- var list = [];
- scan({
- node: root,
- inherited: inherited
- }, list);
+ this._stateClasses = newStateClasses;
+ },
- // go build the object instances
- var mixin = args && args.template ? {template: true} : null;
- return this.instantiate(list, mixin, args); // Array
- };
-}();
+ _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).
-//Register the parser callback. It should be the first callback
-//after the a11y test.
+ // 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(){
- var parseRunner = function(){
- if(dojo.config.parseOnLoad){
- dojo.parser.parse();
+ 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);
}
- };
- // FIXME: need to clobber cross-dependency!!
- if(dojo.getObject("dijit.wai.onload") === dojo._loaders[0]){
- dojo._loaders.splice(1, 0, parseRunner);
- }else{
- dojo._loaders.unshift(parseRunner);
- }
-})();
+ // 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();
+ });
-if(!dojo._hasResource["dojo.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.window"] = true;
-dojo.provide("dojo.window");
+ // 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);
+ }
+});
+});
-dojo.getObject("window", true, dojo);
+},
+'dijit/DialogUnderlay':function(){
+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){
-dojo.window.getBox = function(){
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+=====*/
+
+ // module:
+ // dijit/DialogUnderlay
// summary:
- // Returns the dimensions and scroll position of the viewable area of a browser window
+ // The component that blocks the screen behind a `dijit.Dialog`
- var scrollRoot = (dojo.doc.compatMode == 'BackCompat') ? dojo.body() : dojo.doc.documentElement;
+ 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.
- // get scroll position
- var scroll = dojo._docScroll(); // scrollRoot.scrollTop/Left should work
- return { w: scrollRoot.clientWidth, h: scrollRoot.clientHeight, l: scroll.x, t: scroll.y };
-};
+ // 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>",
-dojo.window.get = function(doc){
- // summary:
- // Get window object associated with document doc
+ // Parameters on creation or updatable later
- // In some IE versions (at least 6.0), document.parentWindow does not return a
- // reference to the real window object (maybe a copy), so we must fix it as well
- // We use IE specific execScript to attach the real window reference to
- // document._parentWindow for later use
- if(dojo.isIE && window !== document.parentWindow){
- /*
- In IE 6, only the variable "window" can be used to connect events (others
- may be only copies).
- */
- doc.parentWindow.execScript("document._parentWindow = window;", "Javascript");
- //to prevent memory leak, unset it after use
- //another possibility is to add an onUnload handler which seems overkill to me (liucougar)
- var win = doc._parentWindow;
- doc._parentWindow = null;
- return win; // Window
- }
+ // dialogId: String
+ // Id of the dialog.... DialogUnderlay's id is based on this id
+ dialogId: "",
- return doc.parentWindow || doc.defaultView; // Window
-};
+ // class: String
+ // This class name is used on the DialogUnderlay node, in addition to dijitDialogUnderlay
+ "class": "",
-dojo.window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
- // summary:
- // Scroll the passed node into view, if it is not already.
-
- // don't rely on node.scrollIntoView working just because the function is there
+ _setDialogIdAttr: function(id){
+ domAttr.set(this.node, "id", id + "_underlay");
+ this._set("dialogId", id);
+ },
- try{ // catch unexpected/unrecreatable errors (#7808) since we can recover using a semi-acceptable native method
- node = dojo.byId(node);
- var doc = node.ownerDocument || dojo.doc,
- body = doc.body || dojo.body(),
- html = doc.documentElement || body.parentNode,
- isIE = dojo.isIE, isWK = dojo.isWebKit;
- // if an untested browser, then use the native method
- if((!(dojo.isMoz || isIE || isWK || dojo.isOpera) || node == body || node == html) && (typeof node.scrollIntoView != "undefined")){
- node.scrollIntoView(false); // short-circuit to native if possible
- return;
- }
- var backCompat = doc.compatMode == 'BackCompat',
- clientAreaRoot = (isIE >= 9 && node.ownerDocument.parentWindow.frameElement)
- ? ((html.clientHeight > 0 && html.clientWidth > 0 && (body.clientHeight == 0 || body.clientWidth == 0 || body.clientHeight > html.clientHeight || body.clientWidth > html.clientWidth)) ? html : body)
- : (backCompat ? body : html),
- scrollRoot = isWK ? body : clientAreaRoot,
- rootWidth = clientAreaRoot.clientWidth,
- rootHeight = clientAreaRoot.clientHeight,
- rtl = !dojo._isBodyLtr(),
- nodePos = pos || dojo.position(node),
- el = node.parentNode,
- isFixed = function(el){
- return ((isIE <= 6 || (isIE && backCompat))? false : (dojo.style(el, 'position').toLowerCase() == "fixed"));
- };
- if(isFixed(node)){ return; } // nothing to do
+ _setClassAttr: function(clazz){
+ this.node.className = "dijitDialogUnderlay " + clazz;
+ this._set("class", clazz);
+ },
- while(el){
- if(el == body){ el = scrollRoot; }
- var elPos = dojo.position(el),
- fixedPos = isFixed(el);
-
- if(el == scrollRoot){
- elPos.w = rootWidth; elPos.h = rootHeight;
- if(scrollRoot == html && isIE && rtl){ elPos.x += scrollRoot.offsetWidth-elPos.w; } // IE workaround where scrollbar causes negative x
- if(elPos.x < 0 || !isIE){ elPos.x = 0; } // IE can have values > 0
- if(elPos.y < 0 || !isIE){ elPos.y = 0; }
- }else{
- var pb = dojo._getPadBorderExtents(el);
- elPos.w -= pb.w; elPos.h -= pb.h; elPos.x += pb.l; elPos.y += pb.t;
- var clientSize = el.clientWidth,
- scrollBarSize = elPos.w - clientSize;
- if(clientSize > 0 && scrollBarSize > 0){
- elPos.w = clientSize;
- elPos.x += (rtl && (isIE || el.clientLeft > pb.l/*Chrome*/)) ? scrollBarSize : 0;
- }
- clientSize = el.clientHeight;
- scrollBarSize = elPos.h - clientSize;
- if(clientSize > 0 && scrollBarSize > 0){
- elPos.h = clientSize;
- }
- }
- if(fixedPos){ // bounded by viewport, not parents
- if(elPos.y < 0){
- elPos.h += elPos.y; elPos.y = 0;
- }
- if(elPos.x < 0){
- elPos.w += elPos.x; elPos.x = 0;
- }
- if(elPos.y + elPos.h > rootHeight){
- elPos.h = rootHeight - elPos.y;
- }
- if(elPos.x + elPos.w > rootWidth){
- elPos.w = rootWidth - elPos.x;
- }
- }
- // calculate overflow in all 4 directions
- var l = nodePos.x - elPos.x, // beyond left: < 0
- t = nodePos.y - Math.max(elPos.y, 0), // beyond top: < 0
- r = l + nodePos.w - elPos.w, // beyond right: > 0
- bot = t + nodePos.h - elPos.h; // beyond bottom: > 0
- if(r * l > 0){
- var s = Math[l < 0? "max" : "min"](l, r);
- if(rtl && ((isIE == 8 && !backCompat) || isIE >= 9)){ s = -s; }
- nodePos.x += el.scrollLeft;
- el.scrollLeft += s;
- nodePos.x -= el.scrollLeft;
- }
- if(bot * t > 0){
- nodePos.y += el.scrollTop;
- el.scrollTop += Math[t < 0? "max" : "min"](t, bot);
- nodePos.y -= el.scrollTop;
- }
- el = (el != scrollRoot) && !fixedPos && el.parentNode;
+ 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";
}
- }catch(error){
- console.error('scrollIntoView: ' + error);
- node.scrollIntoView(false);
- }
-};
+ });
+});
-}
+},
+'dijit/layout/ScrollingTabController':function(){
+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){
-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");
+/*=====
+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.
-dojo.declare("dijit.WidgetSet", null, {
+var ScrollingTabController = declare("dijit.layout.ScrollingTabController", [TabController, _WidgetsInTemplateMixin], {
// 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 */ });
+ // 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
- constructor: function(){
- this._hash = {};
- this.length = 0;
- },
+ baseClass: "dijitTabController dijitScrollingTabController",
- 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");
+ 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")
}
- this._hash[widget.id] = widget;
- this.length++;
+
+ domClass.add(this.tablistWrapper, this.tabStripClass);
},
- 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--;
- }
+ 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;
},
- 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.
+ 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");
+ },
- thisObj = thisObj || dojo.global;
- var i = 0, id;
- for(id in this._hash){
- func.call(thisObj, this._hash[id], i++, this._hash);
+ 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;
}
- return this; // dijit.WidgetSet
+
+ this.inherited(arguments);
},
- filter: function(/*Function*/ filter, /* Object? */thisObj){
+ _initButtons: function(){
// 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 */ });
+ // Creates the buttons used to scroll to view tabs that
+ // may not be visible if the TabContainer is too narrow.
- 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);
+ // 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;
}
- return res; // dijit.WidgetSet
},
- byId: function(/*String*/ id){
+ _enableBtn: function(width){
// 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
+ // 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;
},
- byClass: function(/*String*/ cls){
+ resize: function(dim){
// 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(); });
+ // Hides or displays the buttons used to scroll the tab list and launch the menu
+ // that selects tabs.
- 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
-},
+ // Save the dimensions to be used when a child is renamed.
+ this._dim = dim;
- 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; });
+ // 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);
- var ar = [];
- for(var id in this._hash){
- ar.push(this._hash[id]);
+ // 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());
}
- return ar; // dijit._Widget[]
-},
- map: function(/* Function */func, /* Object? */thisObj){
+ // 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:
- // 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
+ // 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;
},
- every: function(func, thisObj){
+ _convertToScrollLeft: function(val){
// 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.
+ // 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.
//
- // thisObj: Object?
- // Optional scope parameter to use for the callback
+ // 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();
- 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
+ if(sl > node.offsetLeft ||
+ sl + domStyle.get(this.scrollNode, "width") <
+ node.offsetLeft + domStyle.get(node, "width")){
+ this.createSmoothScroll().play();
+ }
}
}
- return true; // Boolean
+
+ this.inherited(arguments);
},
- some: function(func, thisObj){
+ _getScrollBounds: function(){
// 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
+ // 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();
- 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
- }
+ 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
+ };
}
- return false; // Boolean
- }
+ },
-});
+ _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();
-(function(){
+ // 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);
- /*=====
- dijit.registry = {
+ // 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:
- // A list of widgets on a page.
+ // Creates a dojo._Animation object that smoothly scrolls the tab list
+ // either to a fixed horizontal pixel value, or to the selected tab.
// description:
- // Is an instance of `dijit.WidgetSet`
- };
- =====*/
- dijit.registry = new dijit.WidgetSet();
+ // 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.
- var hash = dijit.registry._hash,
- attr = dojo.attr,
- hasAttr = dojo.hasAttr,
- style = dojo.style;
+ // 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();
+ }
- dijit.byId = function(/*String|dijit._Widget*/ id){
+ 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:
- // 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
- };
+ // 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;
+ },
- var _widgetTypeCtr = {};
- dijit.getUniqueId = function(/*String*/widgetType){
+ doSlideRight: function(/*Event*/ e){
// 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){
+ // Scrolls the menu to the right.
+ // e:
+ // The mouse click event.
+ this.doSlide(1, this._getBtnNode(e));
+ },
+
+ doSlideLeft: function(/*Event*/ e){
// 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(){
+ // Scrolls the menu to the left.
+ // e:
+ // The mouse click event.
+ this.doSlide(-1,this._getBtnNode(e));
+ },
+
+ doSlide: function(/*Number*/ direction, /*DomNode*/ node){
// 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();
+ // 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;
+});
+
+},
+'dijit/place':function(){
+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;
});
- };
-
- 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();
- });
+
+ // 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.byNode = function(/*DOMNode*/ node){
- // summary:
- // Returns the widget corresponding to the given DOMNode
- return hash[node.getAttribute("widgetId")]; // dijit._Widget
+
+ /*=====
+ 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.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;
+ =====*/
+
+ /*=====
+ 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;
};
+ =====*/
- 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){
+ return (dijit.place = {
// 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;
+ // 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);
}
- 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);
+ });
+
+ var position = _place(node, choices, layoutNode, {w: width, h: height});
+ position.aroundNodePos = aroundNodePos;
+
+ return position;
}
});
+});
- dijit._getTabNavigable = function(/*DOMNode*/ root){
+},
+'dijit/_HasDropDown':function(){
+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:
- // Finds descendants of the specified root node.
+ // 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:
//
- // 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;
- }
+ // * 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"],
- 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;
+ // _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;
}
}
- var rn = radioName(child);
- if(dojo.attr(child, "checked") && rn) {
- radioSelected[rn] = child;
+ 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(child.nodeName.toUpperCase() != 'SELECT'){
- walkTree(child);
+ }
+ 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);
}
- });
- };
- 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;
+ }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);
+ }
-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");
+ // 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");
+ },
-// 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
- }
- };
+ 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;
}
- bm = {};
+ this.inherited(arguments);
+ },
- //'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;
+ _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{
- bm.mark = rg.getBookmark();
+ afterLoad();
}
- }else{
- console.warn("No idea how to store the current selection for this browser!");
- }
- return bm; // Object
- },
+ return d;
+ },
- moveToBookmark: function(/*Object*/bookmark){
- // summary:
- // Moves current selection to a bookmark
- // bookmark:
- // This should be a returned object from dijit.getBookmark()
+ 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
- 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);
+ 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{
- 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);
- });
+ 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{
- rg = _doc.body.createTextRange();
- rg.moveToBookmark(mark);
+ delete mb.w;
}
- rg.select();
+
+ // 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;
}
}
- },
- getFocus: function(/*Widget?*/ menu, /*Window?*/ openedForWindow){
+ });
+});
+
+},
+'dijit/tree/TreeStoreModel':function(){
+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:
- // 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.
+ // 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.
//
- // openedForWindow:
- // iframe in which menu was opened
+ // 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).
//
- // 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
- },
+ // Setting this to null or "" will make every drop create a new item.
+ newItemIdAttr: "id",
- 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
+ // labelAttr: String
+ // If specified, get label for tree node from this attribute, rather
+ // than by calling store.getLabel()
+ labelAttr: "",
- if(!handle){ return; }
+ // root: [readonly] dojo.data.Item
+ // Pointer to the root item (read only, not a parameter)
+ root: null,
- 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;
+ // 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,
- // 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*/}
+ // 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");
}
- 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();
+ // 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)
+ ]);
}
- try{
- dojo.withGlobal(openedForWindow || dojo.global, dijit.moveToBookmark, null, [bookmark]);
- }catch(e2){
- /*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */
+ },
+
+ 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
+ });
}
- }
- },
+ },
- // _activeStack: dijit._Widget[]
- // List of currently active widgets (focused widget and it's ancestors)
- _activeStack: [],
+ 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);
+ },
- 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);
- },
+ 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.
- 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()
+ 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);
+ }
- dijit.unregisterWin(handle);
- },
+ // count how many items need to be loaded
+ var _waitCount = 0;
+ if(!this.deferItemLoadingUntilExpand){
+ array.forEach(childItems, function(item){ if(!store.isItemLoaded(item)){ _waitCount++; } });
+ }
- 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()
+ 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
+ });
+ }
+ });
+ }
+ },
- // TODO: make this function private in 2.0; Editor/users should call registerIframe(),
+ // =======================================================================
+ // Inspecting items
- 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;
+ 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
}
+ },
- 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);
+ // =======================================================================
+ // 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{
- dijit._onTouchNode(effectiveNode || evt.srcElement);
+ // 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);
+ }
}
- };
- doc.attachEvent('onactivate', activateListener);
- var deactivateListener = function(evt){
- dijit._onBlurNode(effectiveNode || evt.srcElement);
- };
- doc.attachEvent('ondeactivate', deactivateListener);
+ }});
+ }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);
+ }
+ }
+ },
- 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)
- };
+ 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{
- 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);
+ // item's label/icon/etc. changed.
+ this.onChange(item);
+ }
+ }
+ });
+});
- 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)
- };
+},
+'dijit/_MenuBase':function(){
+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();
}
}
},
- unregisterWin: function(/*Handle*/ handle){
+ _onPopupHover: function(/*Event*/ /*===== evt =====*/){
// 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.
+ // This handler is called when the mouse moves over the popup.
+ // tags:
+ // private
- // Currently our handle is actually a function
- handle && handle();
+ // 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);
+ }
},
- _onBlurNode: function(/*DomNode*/ node){
+ onItemHover: function(/*MenuItem*/ item){
// 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;
+ // Called when cursor is over a MenuItem.
+ // tags:
+ // protected
- 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;
+ // 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;
+ },
- // if the blur event isn't followed by a focus event then mark all widgets as inactive.
- if(dijit._clearActiveWidgetsTimer){
- clearTimeout(dijit._clearActiveWidgetsTimer);
+ _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);
}
- dijit._clearActiveWidgetsTimer = setTimeout(function(){
- delete dijit._clearActiveWidgetsTimer;
- dijit._setStack([]);
- dijit._prevFocus = null;
- }, 100);
},
- _onTouchNode: function(/*DomNode*/ node, /*String*/ by){
+ onItemUnhover: function(/*MenuItem*/ item){
// 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
+ // Callback fires when mouse exits a MenuItem
+ // tags:
+ // protected
- // ignore the recent blurNode event
- if(dijit._clearActiveWidgetsTimer){
- clearTimeout(dijit._clearActiveWidgetsTimer);
- delete dijit._clearActiveWidgetsTimer;
+ if(this.isActive){
+ this._stopPopupTimer();
}
+ if(this._hoveredChild == item){ this._hoveredChild = null; }
+ },
- // 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 */ }
+ _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;
+ }
+ },
- dijit._setStack(newStack, by);
+ _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;
},
- _onFocusNode: function(/*DomNode*/ node){
+ onItemClick: function(/*dijit._Widget*/ item, /*Event*/ evt){
// summary:
- // Callback when node is focused
+ // Handle clicks on an item.
+ // tags:
+ // private
- if(!node){
- return;
+ // this can't be done in _onFocus since the _onFocus events occurs asynchronously
+ if(typeof this.isShowingNow == 'undefined'){ // non-popup menu
+ this._markActive();
}
- 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.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);
}
+ },
- dijit._onTouchNode(node);
+ _openPopup: function(){
+ // summary:
+ // Open the popup to the side of/underneath the current menu item
+ // tags:
+ // protected
- if(node == dijit._curFocus){ return; }
- if(dijit._curFocus){
- dijit._prevFocus = dijit._curFocus;
+ 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);
}
- dijit._curFocus = node;
- dojo.publish("focusNode", [node]);
},
- _setStack: function(/*String[]*/ newStack, /*String*/ by){
+ _markActive: function(){
// 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
+ // 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");
+ },
- var oldStack = dijit._activeStack;
- dijit._activeStack = newStack;
+ 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
- // 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;
+ 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;
}
- 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]);
- }
+ if(this.focusedChild){ // unhighlight the focused item
+ this.focusedChild._setSelected(false);
+ this.focusedChild._onUnhover();
+ this.focusedChild = null;
}
+ },
- // 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]);
- }
+ _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();
}
}
});
-// 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;
- })
- }
});
-}
+},
+'dijit/focus':function(){
+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".
-if(!dojo._hasResource["dojo.AdapterRegistry"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.AdapterRegistry"] = true;
-dojo.provide("dojo.AdapterRegistry");
+/*=====
+ 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,
-dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){
- // summary:
- // A registry to make contextual calling/searching easier.
- // description:
- // Objects of this class keep list of arrays in the form [name, check,
- // wrap, directReturn] that are used to determine what the contextual
- // result of a set of checked arguments is. All check/wrap functions
- // in this registry should be of the same arity.
- // example:
- // | // create a new registry
- // | var reg = new dojo.AdapterRegistry();
- // | reg.register("handleString",
- // | dojo.isString,
- // | function(str){
- // | // do something with the string here
- // | }
- // | );
- // | reg.register("handleArr",
- // | dojo.isArray,
- // | function(arr){
- // | // do something with the array here
- // | }
- // | );
- // |
- // | // now we can pass reg.match() *either* an array or a string and
- // | // the value we pass will get handled by the right function
- // | reg.match("someValue"); // will call the first function
- // | reg.match(["someValue"]); // will call the second
+ // activeStack: dijit._Widget[]
+ // List of currently active widgets (focused widget and it's ancestors)
+ activeStack: [],
- this.pairs = [];
- this.returnWrappers = returnWrappers || false; // Boolean
-};
+ 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.
+ },
-dojo.extend(dojo.AdapterRegistry, {
- register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){
- // summary:
- // register a check function to determine if the wrap function or
- // object gets selected
- // name:
- // a way to identify this matcher.
- // check:
- // a function that arguments are passed to from the adapter's
- // match() function. The check function should return true if the
- // given arguments are appropriate for the wrap function.
- // directReturn:
- // If directReturn is true, the value passed in for wrap will be
- // returned instead of being called. Alternately, the
- // AdapterRegistry can be set globally to "return not call" using
- // the returnWrappers property. Either way, this behavior allows
- // the registry to act as a "search" function instead of a
- // function interception library.
- // override:
- // If override is given and true, the check function will be given
- // highest priority. Otherwise, it will be the lowest priority
- // adapter.
- this.pairs[((override) ? "unshift" : "push")]([name, check, wrap, directReturn]);
- },
-
- match: function(/* ... */){
- // summary:
- // Find an adapter for the given arguments. If no suitable adapter
- // is found, throws an exception. match() accepts any number of
- // arguments, all of which are passed to all matching functions
- // from the registered pairs.
- for(var i = 0; i < this.pairs.length; i++){
- var pair = this.pairs[i];
- if(pair[1].apply(this, arguments)){
- if((pair[3])||(this.returnWrappers)){
- return pair[2];
+ 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{
- return pair[2].apply(this, arguments);
+ 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)
+ }
+ };
}
}
- }
- throw new Error("No match found");
- },
+ },
- unregister: function(name){
- // summary: Remove a named adapter from the registry
+ _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;
+ }
- // FIXME: this is kind of a dumb way to handle this. On a large
- // registry this will be slow-ish and we can use the name as a lookup
- // should we choose to trade memory for speed.
- for(var i = 0; i < this.pairs.length; i++){
- var pair = this.pairs[i];
- if(pair[0] == name){
- this.pairs.splice(i, 1);
- return true;
+ // if the blur event isn't followed by a focus event then mark all widgets as inactive.
+ if(this._clearActiveWidgetsTimer){
+ clearTimeout(this._clearActiveWidgetsTimer);
}
- }
- return false;
- }
-});
+ 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
-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");
+ // 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
-dijit.getViewport = function(){
- // summary:
- // Returns the dimensions and scroll position of the viewable area of a browser window
+ if(!node){
+ return;
+ }
- return dojo.window.getBox();
-};
+ 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.__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;
-}
-=====*/
+ this._onTouchNode(node);
+ if(node == this.curNode){ return; }
+ this.set("curNode", node);
+ },
-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;
- });
+ _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;
+ }
+ }
- return dijit._place(node, choices);
-}
+ 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);
+ }
+ }
-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);
- }
+ // 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);
+ }
+ }
+ },
- var best = null;
- dojo.some(choices, function(choice){
- var corner = choice.corner;
- var pos = choice.pos;
- var overflow = 0;
+ focus: function(node){
+ // summary:
+ // Focus the specified node, suppressing errors if they occur
+ if(node){
+ try{ node.focus(); }catch(e){/*quiet*/}
+ }
+ }
+ });
- // 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
- };
+ var singleton = new FocusManager();
- // 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
- };
+ // 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;
+ })
}
-
- 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);
+ // 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;
+ });
- // 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){
+ return singleton;
+});
+},
+'dojo/i18n':function(){
+define("dojo/i18n", ["./_base/kernel", "require", "./has", "./_base/array", "./_base/config", "./_base/lang", "./_base/xhr", "./json"],
+ function(dojo, require, has, array, config, lang, xhr, json) {
+ // module:
+ // dojo/i18n
// summary:
- // Position node adjacent or kitty-corner to aroundNode
- // such that it's fully visible in viewport.
- //
+ // This module implements the !dojo/i18n plugin and the v1.6- i18n API
// 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)
- //
+ // We choose to include our own plugin to leverage functionality already contained in dojo
+ // and thereby reduce the size of the plugin compared to various loader implementations. Also, this
+ // allows foreign AMD loaders to be used without their plugins.
- // 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);
-};
+ has.add("dojo-preload-i18n-Api",
+ // if true, define the preload localizations machinery
+ 1
+ );
-/*=====
-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;
-}
-=====*/
+ true || has.add("dojo-v1x-i18n-Api",
+ // if true, define the v1.x i18n functions
+ 1
+ );
+ var
+ thisModule= dojo.i18n=
+ // the dojo.i18n module
+ {},
+
+ nlsRe=
+ // regexp for reconstructing the master bundle name from parts of the regexp match
+ // nlsRe.exec("foo/bar/baz/nls/en-ca/foo") gives:
+ // ["foo/bar/baz/nls/en-ca/foo", "foo/bar/baz/nls/", "/", "/", "en-ca", "foo"]
+ // nlsRe.exec("foo/bar/baz/nls/foo") gives:
+ // ["foo/bar/baz/nls/foo", "foo/bar/baz/nls/", "/", "/", "foo", ""]
+ // so, if match[5] is blank, it means this is the top bundle definition.
+ // courtesy of http://requirejs.org
+ /(^.*(^|\/)nls)(\/|$)([^\/]*)\/?([^\/]*)/,
+
+ getAvailableLocales= function(
+ root,
+ locale,
+ bundlePath,
+ bundleName
+ ){
+ // return a vector of module ids containing all available locales with respect to the target locale
+ // For example, assuming:
+ // * the root bundle indicates specific bundles for "fr" and "fr-ca",
+ // * bundlePath is "myPackage/nls"
+ // * bundleName is "myBundle"
+ // Then a locale argument of "fr-ca" would return
+ // ["myPackage/nls/myBundle", "myPackage/nls/fr/myBundle", "myPackage/nls/fr-ca/myBundle"]
+ // Notice that bundles are returned least-specific to most-specific, starting with the root.
+ //
+ // If root===false indicates we're working with a pre-AMD i18n bundle that doesn't tell about the available locales;
+ // therefore, assume everything is available and get 404 errors that indicate a particular localization is not available
+ //
-dijit.placeOnScreenAroundRectangle = function(
- /* DomNode */ node,
- /* dijit.__Rectangle */ aroundRect,
- /* Object */ aroundCorners,
- /* Function */ layoutNode){
+ for(var result= [bundlePath + bundleName], localeParts= locale.split("-"), current= "", i= 0; i<localeParts.length; i++){
+ current+= (current ? "-" : "") + localeParts[i];
+ if(!root || root[current]){
+ result.push(bundlePath + current + "/" + bundleName);
+ }
+ }
+ return result;
+ },
- // 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.
+ cache= {},
- return dijit._placeOnScreenAroundRect(node,
- aroundRect.x, aroundRect.y, aroundRect.width, aroundRect.height, // rectangle
- aroundCorners, layoutNode);
-};
+ getL10nName= dojo.getL10nName = function(moduleName, bundleName, locale){
+ locale = locale ? locale.toLowerCase() : dojo.locale;
+ moduleName = "dojo/i18n!" + moduleName.replace(/\./g, "/");
+ bundleName = bundleName.replace(/\./g, "/");
+ return (/root/i.test(locale)) ?
+ (moduleName + "/nls/" + bundleName) :
+ (moduleName + "/nls/" + locale + "/" + bundleName);
+ },
-dijit._placeOnScreenAroundRect = function(
- /* DomNode */ node,
- /* Number */ x,
- /* Number */ y,
- /* Number */ width,
- /* Number */ height,
- /* Object */ aroundCorners,
- /* Function */ layoutNode){
+ doLoad = function(require, bundlePathAndName, bundlePath, bundleName, locale, load){
+ // get the root bundle which instructs which other bundles are required to construct the localized bundle
+ require([bundlePathAndName], function(root){
+ var current= lang.clone(root.root),
+ availableLocales= getAvailableLocales(!root._v1x && root, locale, bundlePath, bundleName);
+ require(availableLocales, function(){
+ for (var i= 1; i<availableLocales.length; i++){
+ current= lang.mixin(lang.clone(current), arguments[i]);
+ }
+ // target may not have been resolve (e.g., maybe only "fr" exists when "fr-ca" was requested)
+ var target= bundlePathAndName + "/" + locale;
+ cache[target]= current;
+ load();
+ });
+ });
+ },
- // summary:
- // Like dijit.placeOnScreenAroundNode(), except it accepts coordinates
- // of a rectangle to place node adjacent to.
+ normalize = function(id, toAbsMid){
+ // id may be relative
+ // preload has form *preload*<path>/nls/<module>*<flattened locales> and
+ // therefore never looks like a relative
+ return /^\./.test(id) ? toAbsMid(id) : id;
+ },
- // TODO: combine with placeOnScreenAroundRectangle()
+ getLocalesToLoad = function(targetLocale){
+ var list = config.extraLocale || [];
+ list = lang.isArray(list) ? list : [list];
+ list.push(targetLocale);
+ return list;
+ },
- // 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)
+ load = function(id, require, load){
+ //
+ // id is in one of the following formats
+ //
+ // 1. <path>/nls/<bundle>
+ // => load the bundle, localized to config.locale; load all bundles localized to
+ // config.extraLocale (if any); return the loaded bundle localized to config.locale.
+ //
+ // 2. <path>/nls/<locale>/<bundle>
+ // => load then return the bundle localized to <locale>
+ //
+ // 3. *preload*<path>/nls/<module>*<JSON array of available locales>
+ // => for config.locale and all config.extraLocale, load all bundles found
+ // in the best-matching bundle rollup. A value of 1 is returned, which
+ // is meaningless other than to say the plugin is executing the requested
+ // preloads
+ //
+ // In cases 1 and 2, <path> is always normalized to an absolute module id upon entry; see
+ // normalize. In case 3, it <path> is assumed to be absolue; this is arranged by the builder.
+ //
+ // To load a bundle means to insert the bundle into the plugin's cache and publish the bundle
+ // value to the loader. Given <path>, <bundle>, and a particular <locale>, the cache key
+ //
+ // <path>/nls/<bundle>/<locale>
+ //
+ // will hold the value. Similarly, then plugin will publish this value to the loader by
+ //
+ // define("<path>/nls/<bundle>/<locale>", <bundle-value>);
+ //
+ // Given this algorithm, other machinery can provide fast load paths be preplacing
+ // values in the plugin's cache, which is public. When a load is demanded the
+ // cache is inspected before starting any loading. Explicitly placing values in the plugin
+ // cache is an advanced/experimental feature that should not be needed; use at your own risk.
+ //
+ // For the normal AMD algorithm, the root bundle is loaded first, which instructs the
+ // plugin what additional localized bundles are required for a particular locale. These
+ // additional locales are loaded and a mix of the root and each progressively-specific
+ // locale is returned. For example:
+ //
+ // 1. The client demands "dojo/i18n!some/path/nls/someBundle
+ //
+ // 2. The loader demands load(some/path/nls/someBundle)
+ //
+ // 3. This plugin require's "some/path/nls/someBundle", which is the root bundle.
+ //
+ // 4. Assuming config.locale is "ab-cd-ef" and the root bundle indicates that localizations
+ // are available for "ab" and "ab-cd-ef" (note the missing "ab-cd", then the plugin
+ // requires "some/path/nls/ab/someBundle" and "some/path/nls/ab-cd-ef/someBundle"
+ //
+ // 5. Upon receiving all required bundles, the plugin constructs the value of the bundle
+ // ab-cd-ef as...
+ //
+ // mixin(mixin(mixin({}, require("some/path/nls/someBundle"),
+ // require("some/path/nls/ab/someBundle")),
+ // require("some/path/nls/ab-cd-ef/someBundle"));
+ //
+ // This value is inserted into the cache and published to the loader at the
+ // key/module-id some/path/nls/someBundle/ab-cd-ef.
+ //
+ // The special preload signature (case 3) instructs the plugin to stop servicing all normal requests
+ // (further preload requests will be serviced) until all ongoing preloading has completed.
+ //
+ // The preload signature instructs the plugin that a special rollup module is available that contains
+ // one or more flattened, localized bundles. The JSON array of available locales indicates which locales
+ // are available. Here is an example:
+ //
+ // *preload*some/path/nls/someModule*["root", "ab", "ab-cd-ef"]
+ //
+ // This indicates the following rollup modules are available:
+ //
+ // some/path/nls/someModule_ROOT
+ // some/path/nls/someModule_ab
+ // some/path/nls/someModule_ab-cd-ef
+ //
+ // Each of these modules is a normal AMD module that contains one or more flattened bundles in a hash.
+ // For example, assume someModule contained the bundles some/bundle/path/someBundle and
+ // some/bundle/path/someOtherBundle, then some/path/nls/someModule_ab would be expressed as folllows:
+ //
+ // define({
+ // some/bundle/path/someBundle:<value of someBundle, flattened with respect to locale ab>,
+ // some/bundle/path/someOtherBundle:<value of someOtherBundle, flattened with respect to locale ab>,
+ // });
+ //
+ // E.g., given this design, preloading for locale=="ab" can execute the following algorithm:
+ //
+ // require(["some/path/nls/someModule_ab"], function(rollup){
+ // for(var p in rollup){
+ // var id = p + "/ab",
+ // cache[id] = rollup[p];
+ // define(id, rollup[p]);
+ // }
+ // });
+ //
+ // Similarly, if "ab-cd" is requested, the algorithm can determine that "ab" is the best available and
+ // load accordingly.
+ //
+ // The builder will write such rollups for every layer if a non-empty localeList profile property is
+ // provided. Further, the builder will include the following cache entry in the cache associated with
+ // any layer.
+ //
+ // "*now":function(r){r(['dojo/i18n!*preload*<path>/nls/<module>*<JSON array of available locales>']);}
+ //
+ // The *now special cache module instructs the loader to apply the provided function to context-require
+ // with respect to the particular layer being defined. This causes the plugin to hold all normal service
+ // requests until all preloading is complete.
+ //
+ // Notice that this algorithm is rarely better than the standard AMD load algorithm. Consider the normal case
+ // where the target locale has a single segment and a layer depends on a single bundle:
+ //
+ // Without Preloads:
+ //
+ // 1. Layer loads root bundle.
+ // 2. bundle is demanded; plugin loads single localized bundle.
+ //
+ // With Preloads:
+ //
+ // 1. Layer causes preloading of target bundle.
+ // 2. bundle is demanded; service is delayed until preloading complete; bundle is returned.
+ //
+ // In each case a single transaction is required to load the target bundle. In cases where multiple bundles
+ // are required and/or the locale has multiple segments, preloads still requires a single transaction whereas
+ // the normal path requires an additional transaction for each additional bundle/locale-segment. However all
+ // of these additional transactions can be done concurrently. Owing to this analysis, the entire preloading
+ // algorithm can be discard during a build by setting the has feature dojo-preload-i18n-Api to false.
+ //
+ if(has("dojo-preload-i18n-Api")){
+ var split = id.split("*"),
+ preloadDemand = split[1]=="preload";
+ if(preloadDemand){
+ if(!cache[id]){
+ // use cache[id] to prevent multiple preloads of the same preload; this shouldn't happen, but
+ // who knows what over-aggressive human optimizers may attempt
+ cache[id] = 1;
+ preloadL10n(split[2], json.parse(split[3]), 1);
+ }
+ // don't stall the loader!
+ load(1);
+ }
+ if(preloadDemand || waitForPreloads(id, require, load)){
+ return;
+ }
}
- });
+
+ var match= nlsRe.exec(id),
+ bundlePath= match[1] + "/",
+ bundleName= match[5] || match[4],
+ bundlePathAndName= bundlePath + bundleName,
+ localeSpecified = (match[5] && match[4]),
+ targetLocale= localeSpecified || dojo.locale,
+ loadTarget= bundlePathAndName + "/" + targetLocale,
+ loadList = localeSpecified ? [targetLocale] : getLocalesToLoad(targetLocale),
+ remaining = loadList.length,
+ finish = function(){
+ if(!--remaining){
+ load(lang.delegate(cache[loadTarget]));
+ }
+ };
+ array.forEach(loadList, function(locale){
+ var target = bundlePathAndName + "/" + locale;
+ if(has("dojo-preload-i18n-Api")){
+ checkForLegacyModules(target);
+ }
+ if(!cache[target]){
+ doLoad(require, bundlePathAndName, bundlePath, bundleName, locale, finish);
+ }else{
+ finish();
+ }
+ });
+ };
+
+ if(has("dojo-unit-tests")){
+ var unitTests = thisModule.unitTests = [];
}
- return dijit._place(node, choices, layoutNode, {w: width, h: height});
-};
+ if(has("dojo-preload-i18n-Api") || 1){
+ var normalizeLocale = thisModule.normalizeLocale= function(locale){
+ var result = locale ? locale.toLowerCase() : dojo.locale;
+ return result == "root" ? "ROOT" : result;
+ },
-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);
+ isXd = function(mid){
+ return (1 && 1) ?
+ require.isXdUrl(require.toUrl(mid + ".js")) :
+ true;
+ },
-dijit.placeOnScreenAroundElement = function(
- /* DomNode */ node,
- /* Object */ aroundElement,
- /* Object */ aroundCorners,
- /* Function */ layoutNode){
+ preloading = 0,
- // summary:
- // Like dijit.placeOnScreenAroundNode(), except it accepts an arbitrary object
- // for the "around" argument and finds a proper processor to place a node.
+ preloadWaitQueue = [],
- return dijit.placementRegistry.match.apply(dijit.placementRegistry, arguments);
-};
+ preloadL10n = thisModule._preloadLocalizations = function(/*String*/bundlePrefix, /*Array*/localesGenerated, /*boolean*/ guaranteedAmdFormat){
+ // summary:
+ // Load available flattened resource bundles associated with a particular module for dojo.locale and all dojo.config.extraLocale (if any)
+ //
+ // descirption:
+ // Only called by built layer files. The entire locale hierarchy is loaded. For example,
+ // if locale=="ab-cd", then ROOT, "ab", and "ab-cd" are loaded. This is different than v1.6-
+ // in that the v1.6- would lonly load ab-cd...which was *always* flattened.
+ //
+ // If guaranteedAmdFormat is true, then the module can be loaded with require thereby circumventing the detection algorithm
+ // and the extra possible extra transaction.
+ //
+
+ function forEachLocale(locale, func){
+ // given locale= "ab-cd-ef", calls func on "ab-cd-ef", "ab-cd", "ab", "ROOT"; stops calling the first time func returns truthy
+ var parts = locale.split("-");
+ while(parts.length){
+ if(func(parts.join("-"))){
+ return true;
+ }
+ parts.pop();
+ }
+ return func("ROOT");
+ }
-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;
-};
+ function preload(locale){
+ locale = normalizeLocale(locale);
+ forEachLocale(locale, function(loc){
+ if(array.indexOf(localesGenerated, loc)>=0){
+ var mid = bundlePrefix.replace(/\./g, "/")+"_"+loc;
+ preloading++;
+ (isXd(mid) || guaranteedAmdFormat ? require : syncRequire)([mid], function(rollup){
+ for(var p in rollup){
+ cache[p + "/" + locale] = rollup[p];
+ }
+ --preloading;
+ while(!preloading && preloadWaitQueue.length){
+ load.apply(null, preloadWaitQueue.shift());
+ }
+ });
+ return true;
+ }
+ return false;
+ });
+ }
-}
+ preload();
+ array.forEach(dojo.config.extraLocale, preload);
+ },
-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");
+ waitForPreloads = function(id, require, load){
+ if(preloading){
+ preloadWaitQueue.push([id, require, load]);
+ }
+ return preloading;
+ };
+ }
+ if(1){
+ // this code path assumes the dojo loader and won't work with a standard AMD loader
+ var evalBundle=
+ // use the function ctor to keep the minifiers away (also come close to global scope, but this is secondary)
+ new Function(
+ "__bundle", // the bundle to evalutate
+ "__checkForLegacyModules", // a function that checks if __bundle defined __mid in the global space
+ "__mid", // the mid that __bundle is intended to define
+
+ // returns one of:
+ // 1 => the bundle was an AMD bundle
+ // a legacy bundle object that is the value of __mid
+ // instance of Error => could not figure out how to evaluate bundle
+
+ // used to detect when __bundle calls define
+ "var define = function(){define.called = 1;},"
+ + " require = function(){define.called = 1;};"
+
+ + "try{"
+ + "define.called = 0;"
+ + "eval(__bundle);"
+ + "if(define.called==1)"
+ // bundle called define; therefore signal it's an AMD bundle
+ + "return 1;"
+
+ + "if((__checkForLegacyModules = __checkForLegacyModules(__mid)))"
+ // bundle was probably a v1.6- built NLS flattened NLS bundle that defined __mid in the global space
+ + "return __checkForLegacyModules;"
+
+ + "}catch(e){}"
+ // evaulating the bundle was *neither* an AMD *nor* a legacy flattened bundle
+ // either way, re-eval *after* surrounding with parentheses
+
+ + "try{"
+ + "return eval('('+__bundle+')');"
+ + "}catch(e){"
+ + "return e;"
+ + "}"
+ ),
+
+ syncRequire= function(deps, callback){
+ var results= [];
+ array.forEach(deps, function(mid){
+ var url= require.toUrl(mid + ".js");
+
+ function load(text){
+ var result = evalBundle(text, checkForLegacyModules, mid);
+ if(result===1){
+ // the bundle was an AMD module; re-inject it through the normal AMD path
+ // we gotta do this since it could be an anonymous module and simply evaluating
+ // the text here won't provide the loader with the context to know what
+ // module is being defined()'d. With browser caching, this should be free; further
+ // this entire code path can be circumvented by using the AMD format to begin with
+ require([mid], function(bundle){
+ results.push(cache[url]= bundle);
+ });
+ }else{
+ if(result instanceof Error){
+ console.error("failed to evaluate i18n bundle; url=" + url, result);
+ result = {};
+ }
+ // nls/<locale>/<bundle-name> indicates not the root.
+ results.push(cache[url] = (/nls\/[^\/]+\/[^\/]+$/.test(url) ? result : {root:result, _v1x:1}));
+ }
+ }
+ if(cache[url]){
+ results.push(cache[url]);
+ }else{
+ var bundle= require.syncLoadNls(mid);
+ // don't need to check for legacy since syncLoadNls returns a module if the module
+ // (1) was already loaded, or (2) was in the cache. In case 1, if syncRequire is called
+ // from getLocalization --> load, then load will have called checkForLegacyModules() before
+ // calling syncRequire; if syncRequire is called from preloadLocalizations, then we
+ // don't care about checkForLegacyModules() because that will be done when a particular
+ // bundle is actually demanded. In case 2, checkForLegacyModules() is never relevant
+ // because cached modules are always v1.7+ built modules.
+ if(bundle){
+ results.push(bundle);
+ }else{
+ if(!xhr){
+ try{
+ require.getText(url, true, load);
+ }catch(e){
+ results.push(cache[url]= {});
+ }
+ }else{
+ xhr.get({
+ url:url,
+ sync:true,
+ load:load,
+ error:function(){
+ results.push(cache[url]= {});
+ }
+ });
+ }
+ }
+ }
+ });
+ callback && callback.apply(null, results);
+ },
-dijit.getDocumentWindow = function(doc){
- return dojo.window.get(doc);
-};
+ checkForLegacyModules = function(target){
+ // legacy code may have already loaded [e.g] the raw bundle x/y/z at x.y.z; when true, push into the cache
+ for(var result, names = target.split("/"), object = dojo.global[names[0]], i = 1; object && i<names.length-1; object = object[names[i++]]){}
+ if(object){
+ result = object[names[i]];
+ if(!result){
+ // fallback for incorrect bundle build of 1.6
+ result = object[names[i].replace(/-/g,"_")];
+ }
+ if(result){
+ cache[target] = result;
+ }
+ }
+ return result;
+ };
-}
+ thisModule.getLocalization= function(moduleName, bundleName, locale){
+ var result,
+ l10nName= getL10nName(moduleName, bundleName, locale).substring(10);
+ load(l10nName, (!isXd(l10nName) ? syncRequire : require), function(result_){ result= result_; });
+ return result;
+ };
+
+ if(has("dojo-unit-tests")){
+ unitTests.push(function(doh){
+ doh.register("tests.i18n.unit", function(t){
+ var check;
+
+ check = evalBundle("{prop:1}");
+ t.is({prop:1}, check); t.is(undefined, check[1]);
-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");
+ check = evalBundle("({prop:1})");
+ t.is({prop:1}, check); t.is(undefined, check[1]);
+
+ check = evalBundle("{'prop-x':1}");
+ t.is({'prop-x':1}, check); t.is(undefined, check[1]);
+
+ check = evalBundle("({'prop-x':1})");
+ t.is({'prop-x':1}, check); t.is(undefined, check[1]);
+
+ check = evalBundle("define({'prop-x':1})");
+ t.is(1, check);
+
+ check = evalBundle("this is total nonsense and should throw an error");
+ t.is(check instanceof Error, true);
+ });
+ });
+ }
+ }
+ return lang.mixin(thisModule, {
+ dynamic:true,
+ normalize:normalize,
+ load:load,
+ cache:cache
+ });
+});
+},
+'dijit/hccss':function(){
+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);
+ }
+ }
+ });
+ }
+});
+},
+'dijit/tree/ForestStoreModel':function(){
+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){
/*=====
-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;
-}
+var TreeStoreModel = dijit.tree.TreeStoreModel;
=====*/
-dijit.popup = {
+// 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:
- // This singleton is used to show/hide widgets as popups.
+ // 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
- // _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";
+ // Parameters to constructor
- 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;
+ // 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);
}
-
- 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.
+ // =======================================================================
+ // Inspecting items
- // Create wrapper if not already there
- var wrapper = this._createWrapper(widget);
+ isItem: function(/* anything */ something){
+ return (something === this.root) ? true : this.inherited(arguments);
+ },
- dojo.style(wrapper, {
- visibility: "hidden",
- top: "-9999px", // prevent transient scrollbar causing misalign (#5776), and initial flash in upper left (#10111)
- display: ""
- });
+ 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);
+ }
},
- 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.
+ getIdentity: function(/* item */ item){
+ return (item === this.root) ? this.root.id : this.inherited(arguments);
+ },
- // Create wrapper if not already there
- var wrapper = this._createWrapper(widget);
+ getLabel: function(/* item */ item){
+ return (item === this.root) ? this.root.label : this.inherited(arguments);
+ },
- dojo.style(wrapper, "display", "none");
+ // =======================================================================
+ // 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);
+ }
},
-
- getTopPopup: function(){
+
+ onNewRootItem: function(/* dojo.dnd.Item */ /*===== args =====*/){
// 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 */
+ // 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);
}
- return stack[pi];
},
- open: function(/*dijit.popup.__OpenArgs*/ args){
+ // =======================================================================
+ // Handling for top level children
+
+ onAddToRoot: function(/* item */ item){
// summary:
- // Popup the widget at the specified position
- //
+ // 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:
- // opening at the mouse position
- // | dijit.popup.open({popup: menuWidget, x: evt.pageX, y: evt.pageY});
- //
+ // | 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:
- // opening the widget as a dropdown
- // | dijit.popup.open({parent: this, popup: menuWidget, around: this.domNode, onClose: function(){...}});
+ // | 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).
//
- // 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 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);
+ },
- // 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);
+ 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();
}
- // Get pointer to popup wrapper, and create wrapper if it doesn't exist
- var wrapper = this._createWrapper(widget);
+ 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
- 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 : ""
- });
+ this._requeryTop();
+ this.inherited(arguments);
+ }
- 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
+},
+'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",
+'dijit/form/_ComboBoxMenuMixin':function(){
+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`
- var handlers = [];
+return declare( "dijit.form._ComboBoxMenuMixin", null, {
+ // summary:
+ // Focus-less menu for internal use in `dijit.form.ComboBox`
+ // tags:
+ // private
- // 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();
- }
- }
- }));
+ // _messages: Object
+ // Holds "next" and "previous" text for paging buttons on drop down
+ _messages: null,
- // 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));
- }
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ this._messages = i18n.getLocalization("dijit.form", "ComboBox", this.lang);
+ },
- handlers.push(dojo.connect(widget, widget.onExecute ? "onExecute" : "onChange", this, function(){
- var topPopup = this.getTopPopup();
- if(topPopup && topPopup.onExecute){
- topPopup.onExecute();
- }
- }));
+ buildRendering: function(){
+ this.inherited(arguments);
- stack.push({
- widget: widget,
- parent: args.parent,
- onExecute: args.onExecute,
- onCancel: args.onCancel,
- onClose: args.onClose,
- handlers: handlers
- });
+ // fill in template with i18n messages
+ this.previousButton.innerHTML = this._messages["previousMessage"];
+ this.nextButton.innerHTML = this._messages["nextMessage"];
+ },
- if(widget.onOpen){
- // TODO: in 2.0 standardize onShow() (used by StackContainer) and onOpen() (used here)
- widget.onOpen(best);
- }
+ _setValueAttr: function(/*Object*/ value){
+ this.value = value;
+ this.onChange(value);
+ },
- return best;
+ 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);
+ }
},
- close: function(/*dijit._Widget?*/ popup){
+ // stubs
+ onChange: function(/*Number*/ /*===== direction =====*/){
// summary:
- // Close specified popup and any popups that it parented.
- // If no popup is specified, closes all popups.
+ // Notifies ComboBox/FilteringSelect that user selected an option.
+ // tags:
+ // callback
+ },
- var stack = this._stack;
+ onPage: function(/*Number*/ /*===== direction =====*/){
+ // summary:
+ // Notifies ComboBox/FilteringSelect that user clicked to advance to next/previous page.
+ // tags:
+ // callback
+ },
- // 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;
+ onClose: function(){
+ // summary:
+ // Callback from dijit.popup code to this widget, notifying it that it closed
+ // tags:
+ // private
+ this._setSelectedAttr(null);
+ },
- if(widget.onClose){
- // TODO: in 2.0 standardize onHide() (used by StackContainer) and onClose() (used here)
- widget.onClose();
- }
- dojo.forEach(top.handlers, dojo.disconnect);
+ _createOption: function(/*Object*/ item, labelFunc){
+ // summary:
+ // Creates an option to appear on the popup menu subclassed by
+ // `dijit.form.FilteringSelect`.
- // 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();
- }
+ 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;
}
- }
-};
-// 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
+ // update menuitem.dir if BidiSupport was required
+ this.applyTextDir(menuitem, (menuitem.innerText || menuitem.textContent || ""));
- var queue = [];
+ menuitem.item=item;
+ return menuitem;
+ },
- 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);
+ 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;
}
- iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didn't work.
- dijit.setWaiRole(iframe,"presentation");
+ }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;
}
- return iframe;
- };
-
- this.push = function(iframe){
- iframe.style.display="none";
- queue.push(iframe);
- }
-}();
+ this.nextButton.style.display = displayMore ? "" : "none";
+ domAttr.set(this.nextButton,"id", this.id + "_next");
+ return this.containerNode.childNodes;
+ },
-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%'
- });
+ 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);
+ },
-dojo.extend(dijit.BackgroundIframe, {
- resize: function(node){
+ highlightFirstOption: function(){
// 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'
- });
- }
+ // Highlight the first real item in the list (not Previous Choices).
+ this.selectFirstNode();
},
- destroy: function(){
+
+ highlightLastOption: function(){
// summary:
- // destroy the iframe
- if(this._conn){
- dojo.disconnect(this._conn);
- this._conn = null;
+ // 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();
}
- if(this.iframe){
- dijit._frames.push(this.iframe);
- delete this.iframe;
+ },
+
+ selectLastNode: function(){
+ this.inherited(arguments);
+ if(this.getHighlightedOption() == this.nextButton){
+ this.selectPreviousNode();
}
+ },
+
+ getHighlightedOption: function(){
+ return this._getSelectedAttr();
}
});
-}
+});
+
+},
+'dojo/parser':function(){
+define(
+ "dojo/parser", ["./_base/kernel", "./_base/lang", "./_base/array", "./_base/html", "./_base/window", "./_base/url",
+ "./_base/json", "./aspect", "./date/stamp", "./query", "./on", "./ready"],
+ function(dojo, dlang, darray, dhtml, dwindow, _Url, djson, aspect, dates, query, don){
+
+// module:
+// dojo/parser
+// summary:
+// The Dom/Widget parsing package
-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");
+new Date("X"); // workaround for #11279, new Date("") == NaN
+var features = {
+ // Feature detection for when node.attributes only lists the attributes specified in the markup
+ // rather than old IE/quirks behavior where it lists every default value too
+ "dom-attributes-explicit": document.createElement("div").attributes.length < 40
+};
+function has(feature){
+ return features[feature];
+}
-dijit.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
+dojo.parser = new function(){
// summary:
- // Scroll the passed node into view, if it is not already.
- // Deprecated, use `dojo.window.scrollIntoView` instead.
-
- dojo.window.scrollIntoView(node, pos);
-};
+ // The Dom/Widget parsing package
-}
+ var _nameMap = {
+ // Map from widget name (ex: "dijit.form.Button") to structure mapping
+ // lowercase version of attribute names to the version in the widget ex:
+ // {
+ // label: "label",
+ // onclick: "onClick"
+ // }
+ };
+ function getNameMap(proto){
+ // summary:
+ // Returns map from lowercase name to attribute name in class, ex: {onclick: "onClick"}
+ var map = {};
+ for(var name in proto){
+ if(name.charAt(0)=="_"){ continue; } // skip internal properties
+ map[name.toLowerCase()] = name;
+ }
+ return map;
+ }
+ // Widgets like BorderContainer add properties to _Widget via dojo.extend().
+ // If BorderContainer is loaded after _Widget's parameter list has been cached,
+ // we need to refresh that parameter list (for _Widget and all widgets that extend _Widget).
+ aspect.after(dlang, "extend", function(){
+ _nameMap = {};
+ }, true);
-if(!dojo._hasResource["dojo.uacss"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.uacss"] = true;
-dojo.provide("dojo.uacss");
+ // Map from widget name (ex: "dijit.form.Button") to constructor
+ var _ctorMap = {};
+ this._functionFromScript = function(script, attrData){
+ // summary:
+ // Convert a <script type="dojo/method" args="a, b, c"> ... </script>
+ // into a function
+ // script: DOMNode
+ // The <script> DOMNode
+ // attrData: String
+ // For HTML5 compliance, searches for attrData + "args" (typically
+ // "data-dojo-args") instead of "args"
+ var preamble = "";
+ var suffix = "";
+ var argsStr = (script.getAttribute(attrData + "args") || script.getAttribute("args"));
+ if(argsStr){
+ darray.forEach(argsStr.split(/\s*,\s*/), function(part, idx){
+ preamble += "var "+part+" = arguments["+idx+"]; ";
+ });
+ }
+ var withStr = script.getAttribute("with");
+ if(withStr && withStr.length){
+ darray.forEach(withStr.split(/\s*,\s*/), function(part){
+ preamble += "with("+part+"){";
+ suffix += "}";
+ });
+ }
+ return new Function(preamble+script.innerHTML+suffix);
+ };
-(function(){
- // summary:
- // Applies pre-set CSS classes to the top-level HTML node, based on:
- // - browser (ex: dj_ie)
- // - browser version (ex: dj_ie6)
- // - box model (ex: dj_contentBox)
- // - text direction (ex: dijitRtl)
- //
- // In addition, browser, browser version, and box model are
- // combined with an RTL flag when browser text is RTL. ex: dj_ie-rtl.
+ this.instantiate = /*====== dojo.parser.instantiate= ======*/function(nodes, mixin, args){
+ // summary:
+ // Takes array of nodes, and turns them into class instances and
+ // potentially calls a startup method to allow them to connect with
+ // any children.
+ // nodes: Array
+ // Array of nodes or objects like
+ // | {
+ // | type: "dijit.form.Button",
+ // | node: DOMNode,
+ // | scripts: [ ... ], // array of <script type="dojo/..."> children of node
+ // | inherited: { ... } // settings inherited from ancestors like dir, theme, etc.
+ // | }
+ // mixin: Object?
+ // An object that will be mixed in with each node in the array.
+ // Values in the mixin will override values in the node, if they
+ // exist.
+ // args: Object?
+ // An object used to hold kwArgs for instantiation.
+ // See parse.args argument for details.
- var d = dojo,
- html = d.doc.documentElement,
- ie = d.isIE,
- opera = d.isOpera,
- maj = Math.floor,
- ff = d.isFF,
- boxModel = d.boxModel.replace(/-/,''),
+ var thelist = [],
+ mixin = mixin||{};
+ args = args||{};
- classes = {
- dj_ie: ie,
- dj_ie6: maj(ie) == 6,
- dj_ie7: maj(ie) == 7,
- dj_ie8: maj(ie) == 8,
- dj_ie9: maj(ie) == 9,
- dj_quirks: d.isQuirks,
- dj_iequirks: ie && d.isQuirks,
+ // Precompute names of special attributes we are looking for
+ // TODO: for 2.0 default to data-dojo- regardless of scopeName (or maybe scopeName won't exist in 2.0)
+ var dojoType = (args.scope || dojo._scopeName) + "Type", // typically "dojoType"
+ attrData = "data-" + (args.scope || dojo._scopeName) + "-",// typically "data-dojo-"
+ dataDojoType = attrData + "type", // typically "data-dojo-type"
+ dataDojoProps = attrData + "props", // typically "data-dojo-props"
+ dataDojoAttachPoint = attrData + "attach-point",
+ dataDojoAttachEvent = attrData + "attach-event",
+ dataDojoId = attrData + "id";
+
+ // And make hash to quickly check if a given attribute is special, and to map the name to something friendly
+ var specialAttrs = {};
+ darray.forEach([dataDojoProps, dataDojoType, dojoType, dataDojoId, "jsId", dataDojoAttachPoint,
+ dataDojoAttachEvent, "dojoAttachPoint", "dojoAttachEvent", "class", "style"], function(name){
+ specialAttrs[name.toLowerCase()] = name.replace(args.scope, "dojo");
+ });
- // NOTE: Opera not supported by dijit
- dj_opera: opera,
+ darray.forEach(nodes, function(obj){
+ if(!obj){ return; }
- dj_khtml: d.isKhtml,
+ var node = obj.node || obj,
+ type = dojoType in mixin ? mixin[dojoType] : obj.node ? obj.type : (node.getAttribute(dataDojoType) || node.getAttribute(dojoType)),
+ ctor = _ctorMap[type] || (_ctorMap[type] = dlang.getObject(type)),
+ proto = ctor && ctor.prototype;
+ if(!ctor){
+ throw new Error("Could not load class '" + type);
+ }
- dj_webkit: d.isWebKit,
- dj_safari: d.isSafari,
- dj_chrome: d.isChrome,
+ // Setup hash to hold parameter settings for this widget. Start with the parameter
+ // settings inherited from ancestors ("dir" and "lang").
+ // Inherited setting may later be overridden by explicit settings on node itself.
+ var params = {};
- dj_gecko: d.isMozilla,
- dj_ff3: maj(ff) == 3
- }; // no dojo unsupported browsers
+ if(args.defaults){
+ // settings for the document itself (or whatever subtree is being parsed)
+ dlang.mixin(params, args.defaults);
+ }
+ if(obj.inherited){
+ // settings from dir=rtl or lang=... on a node above this node
+ dlang.mixin(params, obj.inherited);
+ }
- classes["dj_" + boxModel] = true;
+ // Get list of attributes explicitly listed in the markup
+ var attributes;
+ if(has("dom-attributes-explicit")){
+ // Standard path to get list of user specified attributes
+ attributes = node.attributes;
+ }else{
+ // Special path for IE, avoid (sometimes >100) bogus entries in node.attributes
+ var clone = /^input$|^img$/i.test(node.nodeName) ? node : node.cloneNode(false),
+ attrs = clone.outerHTML.replace(/=[^\s"']+|="[^"]*"|='[^']*'/g, "").replace(/^\s*<[a-zA-Z0-9]*/, "").replace(/>.*$/, "");
- // apply browser, browser version, and box model class names
- var classStr = "";
- for(var clz in classes){
- if(classes[clz]){
- classStr += clz + " ";
- }
- }
- html.className = d.trim(html.className + " " + classStr);
+ attributes = darray.map(attrs.split(/\s+/), function(name){
+ var lcName = name.toLowerCase();
+ return {
+ name: name,
+ // getAttribute() doesn't work for button.value, returns innerHTML of button.
+ // but getAttributeNode().value doesn't work for the form.encType or li.value
+ value: (node.nodeName == "LI" && name == "value") || lcName == "enctype" ?
+ node.getAttribute(lcName) : node.getAttributeNode(lcName).value,
+ specified: true
+ };
+ });
+ }
- // If RTL mode, then add dj_rtl flag plus repeat existing classes with -rtl extension.
- // We can't run the code below until the <body> tag has loaded (so we can check for dir=rtl).
- // Unshift() is to run sniff code before the parser.
- dojo._loaders.unshift(function(){
- if(!dojo._isBodyLtr()){
- var rtlClassStr = "dj_rtl dijitRtl " + classStr.replace(/ /g, "-rtl ")
- html.className = d.trim(html.className + " " + rtlClassStr);
- }
- });
-})();
+ // Read in attributes and process them, including data-dojo-props, data-dojo-type,
+ // dojoAttachPoint, etc., as well as normal foo=bar attributes.
+ var i=0, item;
+ while(item = attributes[i++]){
+ if(!item || !item.specified){
+ continue;
+ }
-}
+ var name = item.name,
+ lcName = name.toLowerCase(),
+ value = item.value;
-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");
+ if(lcName in specialAttrs){
+ switch(specialAttrs[lcName]){
+ // Data-dojo-props. Save for later to make sure it overrides direct foo=bar settings
+ case "data-dojo-props":
+ var extra = value;
+ break;
+ // data-dojo-id or jsId. TODO: drop jsId in 2.0
+ case "data-dojo-id":
+ case "jsId":
+ var jsname = value;
+ break;
-// 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.
+ // For the benefit of _Templated
+ case "data-dojo-attach-point":
+ case "dojoAttachPoint":
+ params.dojoAttachPoint = value;
+ break;
+ case "data-dojo-attach-event":
+ case "dojoAttachEvent":
+ params.dojoAttachEvent = value;
+ break;
-}
+ // Special parameter handling needed for IE
+ case "class":
+ params["class"] = node.className;
+ break;
+ case "style":
+ params["style"] = node.style && node.style.cssText;
+ break;
+ }
+ }else{
+ // Normal attribute, ex: value="123"
-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");
+ // Find attribute in widget corresponding to specified name.
+ // May involve case conversion, ex: onclick --> onClick
+ if(!(name in proto)){
+ var map = (_nameMap[type] || (_nameMap[type] = getNameMap(proto)));
+ name = map[lcName] || name;
+ }
+ // Set params[name] to value, doing type conversion
+ if(name in proto){
+ switch(typeof proto[name]){
+ case "string":
+ params[name] = value;
+ break;
+ case "number":
+ params[name] = value.length ? Number(value) : NaN;
+ break;
+ case "boolean":
+ // for checked/disabled value might be "" or "checked". interpret as true.
+ params[name] = value.toLowerCase() != "false";
+ break;
+ case "function":
+ if(value === "" || value.search(/[^\w\.]+/i) != -1){
+ // The user has specified some text for a function like "return x+5"
+ params[name] = new Function(value);
+ }else{
+ // The user has specified the name of a function like "myOnClick"
+ // or a single word function "return"
+ params[name] = dlang.getObject(value, false) || new Function(value);
+ }
+ break;
+ default:
+ var pVal = proto[name];
+ params[name] =
+ (pVal && "length" in pVal) ? (value ? value.split(/\s*,\s*/) : []) : // array
+ (pVal instanceof Date) ?
+ (value == "" ? new Date("") : // the NaN of dates
+ value == "now" ? new Date() : // current date
+ dates.fromISOString(value)) :
+ (pVal instanceof dojo._Url) ? (dojo.baseUrl + value) :
+ djson.fromJson(value);
+ }
+ }else{
+ params[name] = value;
+ }
+ }
+ }
-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.
+ // Mix things found in data-dojo-props into the params, overriding any direct settings
+ if(extra){
+ try{
+ extra = djson.fromJson.call(args.propsThis, "{" + extra + "}");
+ dlang.mixin(params, extra);
+ }catch(e){
+ // give the user a pointer to their invalid parameters. FIXME: can we kill this in production?
+ throw new Error(e.toString() + " in data-dojo-props='" + extra + "'");
+ }
+ }
- _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);
- },
+ // Any parameters specified in "mixin" override everything else.
+ dlang.mixin(params, mixin);
- 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);
+ var scripts = obj.node ? obj.scripts : (ctor && (ctor._noScript || proto._noScript) ? [] :
+ query("> script[type^='dojo/']", node));
+
+ // Process <script type="dojo/*"> script tags
+ // <script type="dojo/method" event="foo"> tags are added to params, and passed to
+ // the widget on instantiation.
+ // <script type="dojo/method"> tags (with no event) are executed after instantiation
+ // <script type="dojo/connect" data-dojo-event="foo"> tags are dojo.connected after instantiation
+ // <script type="dojo/watch" data-dojo-prop="foo"> tags are dojo.watch after instantiation
+ // <script type="dojo/on" data-dojo-event="foo"> tags are dojo.on after instantiation
+ // note: dojo/* script tags cannot exist in self closing widgets, like <input />
+ var connects = [], // functions to connect after instantiation
+ calls = [], // functions to call after instantiation
+ watch = [], //functions to watch after instantiation
+ on = []; //functions to on after instantiation
+
+ if(scripts){
+ for(i=0; i<scripts.length; i++){
+ var script = scripts[i];
+ node.removeChild(script);
+ // FIXME: drop event="" support in 2.0. use data-dojo-event="" instead
+ var event = (script.getAttribute(attrData + "event") || script.getAttribute("event")),
+ prop = script.getAttribute(attrData + "prop"),
+ type = script.getAttribute("type"),
+ nf = this._functionFromScript(script, attrData);
+ if(event){
+ if(type == "dojo/connect"){
+ connects.push({event: event, func: nf});
+ }else if(type == "dojo/on"){
+ on.push({event: event, func: nf});
+ }else{
+ params[event] = nf;
+ }
+ }else if(type == "dojo/watch"){
+ watch.push({prop: prop, func: nf});
+ }else{
+ calls.push(nf);
+ }
+ }
+ }
+
+ // create the instance
+ var markupFactory = ctor.markupFactory || proto.markupFactory;
+ var instance = markupFactory ? markupFactory(params, node, ctor) : new ctor(params, node);
+ thelist.push(instance);
+
+ // map it to the JS namespace if that makes sense
+ if(jsname){
+ dlang.setObject(jsname, instance);
+ }
+
+ // process connections and startup functions
+ for(i=0; i<connects.length; i++){
+ aspect.after(instance, connects[i].event, dojo.hitch(instance, connects[i].func), true);
+ }
+ for(i=0; i<calls.length; i++){
+ calls[i].call(instance);
+ }
+ for(i=0; i<watch.length; i++){
+ instance.watch(watch[i].prop, watch[i].func);
+ }
+ for(i=0; i<on.length; i++){
+ don(instance, on[i].event, on[i].func);
+ }
+ }, this);
+
+ // Call startup on each top level instance if it makes sense (as for
+ // widgets). Parent widgets will recursively call startup on their
+ // (non-top level) children
+ if(!mixin._started){
+ darray.forEach(thelist, function(instance){
+ if( !args.noStart && instance &&
+ dlang.isFunction(instance.startup) &&
+ !instance._started
+ ){
+ instance.startup();
+ }
+ });
}
- },
+ return thelist;
+ };
- stop: function(){
+ this.parse = /*====== dojo.parser.parse= ======*/ function(rootNode, args){
// 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;
+ // Scan the DOM for class instances, and instantiate them.
+ //
+ // description:
+ // Search specified node (or root node) recursively for class instances,
+ // and instantiate them. Searches for either data-dojo-type="Class" or
+ // dojoType="Class" where "Class" is a a fully qualified class name,
+ // like `dijit.form.Button`
+ //
+ // Using `data-dojo-type`:
+ // Attributes using can be mixed into the parameters used to instantiate the
+ // Class by using a `data-dojo-props` attribute on the node being converted.
+ // `data-dojo-props` should be a string attribute to be converted from JSON.
+ //
+ // Using `dojoType`:
+ // Attributes are read from the original domNode and converted to appropriate
+ // types by looking up the Class prototype values. This is the default behavior
+ // from Dojo 1.0 to Dojo 1.5. `dojoType` support is deprecated, and will
+ // go away in Dojo 2.0.
+ //
+ // rootNode: DomNode?
+ // A default starting root node from which to start the parsing. Can be
+ // omitted, defaulting to the entire document. If omitted, the `args`
+ // object can be passed in this place. If the `args` object has a
+ // `rootNode` member, that is used.
+ //
+ // args: Object
+ // a kwArgs object passed along to instantiate()
+ //
+ // * noStart: Boolean?
+ // when set will prevent the parser from calling .startup()
+ // when locating the nodes.
+ // * rootNode: DomNode?
+ // identical to the function's `rootNode` argument, though
+ // allowed to be passed in via this `args object.
+ // * template: Boolean
+ // If true, ignores ContentPane's stopParser flag and parses contents inside of
+ // a ContentPane inside of a template. This allows dojoAttachPoint on widgets/nodes
+ // nested inside the ContentPane to work.
+ // * inherited: Object
+ // Hash possibly containing dir and lang settings to be applied to
+ // parsed widgets, unless there's another setting on a sub-node that overrides
+ // * scope: String
+ // 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.)
+ // * propsThis: Object
+ // If specified, "this" referenced from data-dojo-props will refer to propsThis.
+ // Intended for use from the widgets-in-template feature of `dijit._WidgetsInTemplateMixin`
+ //
+ // example:
+ // Parse all widgets on a page:
+ // | dojo.parser.parse();
+ //
+ // example:
+ // Parse all classes within the node with id="foo"
+ // | dojo.parser.parse(dojo.byId('foo'));
+ //
+ // example:
+ // Parse all classes in a page, but do not call .startup() on any
+ // child
+ // | dojo.parser.parse({ noStart: true })
+ //
+ // example:
+ // Parse all classes in a node, but do not call .startup()
+ // | dojo.parser.parse(someNode, { noStart:true });
+ // | // or
+ // | dojo.parser.parse({ noStart:true, rootNode: someNode });
+
+ // determine the root node based on the passed arguments.
+ var root;
+ if(!args && rootNode && rootNode.rootNode){
+ args = rootNode;
+ root = args.rootNode;
+ }else{
+ root = rootNode;
}
- },
+ root = root ? dhtml.byId(root) : dwindow.body();
+ args = args || {};
- 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");
+ var dojoType = (args.scope || dojo._scopeName) + "Type", // typically "dojoType"
+ attrData = "data-" + (args.scope || dojo._scopeName) + "-", // typically "data-dojo-"
+ dataDojoType = attrData + "type", // typically "data-dojo-type"
+ dataDojoTextDir = attrData + "textdir"; // typically "data-dojo-textdir"
+
+ // List of all nodes on page w/dojoType specified
+ var list = [];
+
+ // Info on DOMNode currently being processed
+ var node = root.firstChild;
+
+ // Info on parent of DOMNode currently being processed
+ // - inherited: dir, lang, and textDir setting of parent, or inherited by parent
+ // - parent: pointer to identical structure for my parent (or null if no parent)
+ // - scripts: if specified, collects <script type="dojo/..."> type nodes from children
+ var inherited = args && args.inherited;
+ if(!inherited){
+ function findAncestorAttr(node, attr){
+ return (node.getAttribute && node.getAttribute(attr)) ||
+ (node !== dwindow.doc && node !== dwindow.doc.documentElement && node.parentNode ? findAncestorAttr(node.parentNode, attr) : null);
+ }
+ inherited = {
+ dir: findAncestorAttr(root, "dir"),
+ lang: findAncestorAttr(root, "lang"),
+ textDir: findAncestorAttr(root, dataDojoTextDir)
+ };
+ for(var key in inherited){
+ if(!inherited[key]){ delete inherited[key]; }
+ }
}
- 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();
- }
- })
- ];
- },
+ var parent = {
+ inherited: inherited
+ };
- 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);
- }
- })
- ];
- },
+ // For collecting <script type="dojo/..."> type nodes (when null, we don't need to collect)
+ var scripts;
- 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));
- }
-};
+ // when true, only look for <script type="dojo/..."> tags, and don't recurse to children
+ var scriptsOnly;
-}
+ function getEffective(parent){
+ // summary:
+ // Get effective dir, lang, textDir settings for specified obj
+ // (matching "parent" object structure above), and do caching.
+ // Take care not to return null entries.
+ if(!parent.inherited){
+ parent.inherited = {};
+ var node = parent.node,
+ grandparent = getEffective(parent.parent);
+ var inherited = {
+ dir: node.getAttribute("dir") || grandparent.dir,
+ lang: node.getAttribute("lang") || grandparent.lang,
+ textDir: node.getAttribute(dataDojoTextDir) || grandparent.textDir
+ };
+ for(var key in inherited){
+ if(inherited[key]){
+ parent.inherited[key] = inherited[key];
+ }
+ }
+ }
+ return parent.inherited;
+ }
-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");
+ // DFS on DOM tree, collecting nodes with data-dojo-type specified.
+ while(true){
+ if(!node){
+ // Finished this level, continue to parent's next sibling
+ if(!parent || !parent.node){
+ break;
+ }
+ node = parent.node.nextSibling;
+ scripts = parent.scripts;
+ scriptsOnly = false;
+ parent = parent.parent;
+ continue;
+ }
+ if(node.nodeType != 1){
+ // Text or comment node, skip to next sibling
+ node = node.nextSibling;
+ continue;
+ }
-dijit.wai = {
- onload: function(){
- // summary:
- // Detects if we are in high-contrast mode or not
+ if(scripts && node.nodeName.toLowerCase() == "script"){
+ // Save <script type="dojo/..."> for parent, then continue to next sibling
+ type = node.getAttribute("type");
+ if(type && /^dojo\/\w/i.test(type)){
+ scripts.push(node);
+ }
+ node = node.nextSibling;
+ continue;
+ }
+ if(scriptsOnly){
+ node = node.nextSibling;
+ continue;
+ }
- // 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.
+ // Check for data-dojo-type attribute, fallback to backward compatible dojoType
+ var type = node.getAttribute(dataDojoType) || node.getAttribute(dojoType);
- // 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")) + '");'
+ // Short circuit for leaf nodes containing nothing [but text]
+ var firstChild = node.firstChild;
+ if(!type && (!firstChild || (firstChild.nodeType == 3 && !firstChild.nextSibling))){
+ node = node.nextSibling;
+ continue;
}
- }, 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);
+ // Setup data structure to save info on current node for when we return from processing descendant nodes
+ var current = {
+ node: node,
+ scripts: scripts,
+ parent: parent
+ };
+
+ // If dojoType/data-dojo-type specified, add to output array of nodes to instantiate
+ var ctor = type && (_ctorMap[type] || (_ctorMap[type] = dlang.getObject(type))), // note: won't find classes declared via dojo.Declaration
+ childScripts = ctor && !ctor.prototype._noScript ? [] : null; // <script> nodes that are parent's children
+ if(type){
+ list.push({
+ "type": type,
+ node: node,
+ scripts: childScripts,
+ inherited: getEffective(current) // dir & lang settings for current node, explicit or inherited
+ });
}
+
+ // Recurse, collecting <script type="dojo/..."> children, and also looking for
+ // descendant nodes with dojoType specified (unless the widget has the stopParser flag).
+ // When finished with children, go to my next sibling.
+ node = firstChild;
+ scripts = childScripts;
+ scriptsOnly = ctor && ctor.prototype.stopParser && !(args && args.template);
+ parent = current;
+
}
- }
-};
-// 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);
+ // go build the object instances
+ var mixin = args && args.template ? {template: true} : null;
+ return this.instantiate(list, mixin, args); // Array
+ };
+}();
+
+
+//Register the parser callback. It should be the first callback
+//after the a11y test.
+if(dojo.config.parseOnLoad){
+ dojo.ready(100, dojo.parser, "parse");
}
-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);
- },
+return dojo.parser;
+});
- 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:",""));
- },
+},
+'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",
+'dojo/dnd/Manager':function(){
+define("dojo/dnd/Manager", ["../main", "../Evented", "./common", "./autoscroll", "./Avatar"], function(dojo, Evented) {
+ // module:
+ // dojo/dnd/Manager
+ // summary:
+ // TODOC
- 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);
+var Manager = dojo.declare("dojo.dnd.Manager", [Evented], {
+ // summary:
+ // the manager of DnD operations (usually a singleton)
+ constructor: function(){
+ this.avatar = null;
+ this.source = null;
+ this.nodes = [];
+ this.copy = true;
+ this.target = null;
+ this.canDropFlag = false;
+ this.events = [];
},
- 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.)
+ // avatar's offset from the mouse
+ OFFSET_X: 16,
+ OFFSET_Y: 16,
- var roleValue = dojo.attr(elem, "role");
- if(!roleValue){ return; }
- if(role){
- var t = dojo.trim((" " + roleValue + " ").replace(" " + role + " ", " "));
- dojo.attr(elem, "role", t);
+ // methods
+ overSource: function(source){
+ // summary:
+ // called when a source detected a mouse-over condition
+ // source: Object
+ // the reporter
+ if(this.avatar){
+ this.target = (source && source.targetState != "Disabled") ? source : null;
+ this.canDropFlag = Boolean(this.target);
+ this.avatar.update();
+ }
+ dojo.publish("/dnd/source/over", [source]);
+ },
+ outSource: function(source){
+ // summary:
+ // called when a source detected a mouse-out condition
+ // source: Object
+ // the reporter
+ if(this.avatar){
+ if(this.target == source){
+ this.target = null;
+ this.canDropFlag = false;
+ this.avatar.update();
+ dojo.publish("/dnd/source/over", [null]);
+ }
}else{
- elem.removeAttribute("role");
+ dojo.publish("/dnd/source/over", [null]);
}
},
-
- hasWaiState: function(/*Element*/ elem, /*String*/ state){
+ startDrag: function(source, nodes, copy){
// 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);
+ // called to initiate the DnD operation
+ // source: Object
+ // the source which provides items
+ // nodes: Array
+ // the list of transferred items
+ // copy: Boolean
+ // copy items, if true, move items otherwise
+ this.source = source;
+ this.nodes = nodes;
+ this.copy = Boolean(copy); // normalizing to true boolean
+ this.avatar = this.makeAvatar();
+ dojo.body().appendChild(this.avatar.node);
+ dojo.publish("/dnd/start", [source, nodes, this.copy]);
+ this.events = [
+ dojo.connect(dojo.doc, "onmousemove", this, "onMouseMove"),
+ dojo.connect(dojo.doc, "onmouseup", this, "onMouseUp"),
+ dojo.connect(dojo.doc, "onkeydown", this, "onKeyDown"),
+ dojo.connect(dojo.doc, "onkeyup", this, "onKeyUp"),
+ // cancel text selection and text dragging
+ dojo.connect(dojo.doc, "ondragstart", dojo.stopEvent),
+ dojo.connect(dojo.body(), "onselectstart", dojo.stopEvent)
+ ];
+ var c = "dojoDnd" + (copy ? "Copy" : "Move");
+ dojo.addClass(dojo.body(), c);
},
-
- getWaiState: function(/*Element*/ elem, /*String*/ state){
+ canDrop: function(flag){
// 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) || "";
+ // called to notify if the current target can accept items
+ var canDropFlag = Boolean(this.target && flag);
+ if(this.canDropFlag != canDropFlag){
+ this.canDropFlag = canDropFlag;
+ this.avatar.update();
+ }
+ },
+ stopDrag: function(){
+ // summary:
+ // stop the DnD in progress
+ dojo.removeClass(dojo.body(), ["dojoDndCopy", "dojoDndMove"]);
+ dojo.forEach(this.events, dojo.disconnect);
+ this.events = [];
+ this.avatar.destroy();
+ this.avatar = null;
+ this.source = this.target = null;
+ this.nodes = [];
+ },
+ makeAvatar: function(){
+ // summary:
+ // makes the avatar; it is separate to be overwritten dynamically, if needed
+ return new dojo.dnd.Avatar(this);
+ },
+ updateAvatar: function(){
+ // summary:
+ // updates the avatar; it is separate to be overwritten dynamically, if needed
+ this.avatar.update();
},
- setWaiState: function(/*Element*/ elem, /*String*/ state, /*String*/ value){
+ // mouse event processors
+ onMouseMove: function(e){
// summary:
- // Sets a state on an element.
- // description:
- // Sets an attribute called "aria-"+state.
+ // event processor for onmousemove
+ // e: Event
+ // mouse event
+ var a = this.avatar;
+ if(a){
+ dojo.dnd.autoScrollNodes(e);
+ //dojo.dnd.autoScroll(e);
+ var s = a.node.style;
+ s.left = (e.pageX + this.OFFSET_X) + "px";
+ s.top = (e.pageY + this.OFFSET_Y) + "px";
+ var copy = Boolean(this.source.copyState(dojo.isCopyKey(e)));
+ if(this.copy != copy){
+ this._setCopyStatus(copy);
+ }
+ }
+ },
+ onMouseUp: function(e){
+ // summary:
+ // event processor for onmouseup
+ // e: Event
+ // mouse event
+ if(this.avatar){
+ if(this.target && this.canDropFlag){
+ var copy = Boolean(this.source.copyState(dojo.isCopyKey(e))),
+ params = [this.source, this.nodes, copy, this.target, e];
+ dojo.publish("/dnd/drop/before", params);
+ dojo.publish("/dnd/drop", params);
+ }else{
+ dojo.publish("/dnd/cancel");
+ }
+ this.stopDrag();
+ }
+ },
- elem.setAttribute("aria-"+state, value);
+ // keyboard event processors
+ onKeyDown: function(e){
+ // summary:
+ // event processor for onkeydown:
+ // watching for CTRL for copy/move status, watching for ESCAPE to cancel the drag
+ // e: Event
+ // keyboard event
+ if(this.avatar){
+ switch(e.keyCode){
+ case dojo.keys.CTRL:
+ var copy = Boolean(this.source.copyState(true));
+ if(this.copy != copy){
+ this._setCopyStatus(copy);
+ }
+ break;
+ case dojo.keys.ESCAPE:
+ dojo.publish("/dnd/cancel");
+ this.stopDrag();
+ break;
+ }
+ }
+ },
+ onKeyUp: function(e){
+ // summary:
+ // event processor for onkeyup, watching for CTRL for copy/move status
+ // e: Event
+ // keyboard event
+ if(this.avatar && e.keyCode == dojo.keys.CTRL){
+ var copy = Boolean(this.source.copyState(false));
+ if(this.copy != copy){
+ this._setCopyStatus(copy);
+ }
+ }
},
- removeWaiState: function(/*Element*/ elem, /*String*/ state){
+ // utilities
+ _setCopyStatus: function(copy){
// summary:
- // Removes a state from an element.
- // description:
- // Sets an attribute called "aria-"+state.
+ // changes the copy status
+ // copy: Boolean
+ // the copy status
+ this.copy = copy;
+ this.source._markDndStatus(this.copy);
+ this.updateAvatar();
+ dojo.replaceClass(dojo.body(),
+ "dojoDnd" + (this.copy ? "Copy" : "Move"),
+ "dojoDnd" + (this.copy ? "Move" : "Copy"));
+ }
+});
+
+// dojo.dnd._manager:
+// The manager singleton variable. Can be overwritten if needed.
+dojo.dnd._manager = null;
- elem.removeAttribute("aria-"+state);
+Manager.manager = dojo.dnd.manager = function(){
+ // summary:
+ // Returns the current DnD manager. Creates one if it is not created yet.
+ if(!dojo.dnd._manager){
+ dojo.dnd._manager = new dojo.dnd.Manager();
}
+ return dojo.dnd._manager; // Object
+};
+
+return Manager;
});
-}
+},
+'dijit/form/ToggleButton':function(){
+define("dijit/form/ToggleButton", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/kernel", // kernel.deprecated
+ "./Button",
+ "./_ToggleButtonMixin"
+], function(declare, kernel, Button, _ToggleButtonMixin){
-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");
+/*=====
+ 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);
+ }
+ });
+});
+},
+'dojo/date/stamp':function(){
+define("dojo/date/stamp", ["../_base/kernel", "../_base/lang", "../_base/array"], function(dojo, lang, array) {
+ // module:
+ // dojo/date/stamp
+ // summary:
+ // TODOC
+lang.getObject("date.stamp", true, dojo);
+// Methods to convert dates to or from a wire (string) format using well-known conventions
+dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/defaultTime){
+ // summary:
+ // Returns a Date object given a string formatted according to a subset of the ISO-8601 standard.
+ //
+ // description:
+ // Accepts a string formatted according to a profile of ISO8601 as defined by
+ // [RFC3339](http://www.ietf.org/rfc/rfc3339.txt), except that partial input is allowed.
+ // Can also process dates as specified [by the W3C](http://www.w3.org/TR/NOTE-datetime)
+ // The following combinations are valid:
+ //
+ // * dates only
+ // | * yyyy
+ // | * yyyy-MM
+ // | * yyyy-MM-dd
+ // * times only, with an optional time zone appended
+ // | * THH:mm
+ // | * THH:mm:ss
+ // | * THH:mm:ss.SSS
+ // * and "datetimes" which could be any combination of the above
+ //
+ // timezones may be specified as Z (for UTC) or +/- followed by a time expression HH:mm
+ // Assumes the local time zone if not specified. Does not validate. Improperly formatted
+ // input may return null. Arguments which are out of bounds will be handled
+ // by the Date constructor (e.g. January 32nd typically gets resolved to February 1st)
+ // Only years between 100 and 9999 are supported.
+ //
+ // formattedString:
+ // A string such as 2005-06-30T08:05:00-07:00 or 2005-06-30 or T08:05:00
+ //
+ // defaultTime:
+ // Used for defaults for fields omitted in the formattedString.
+ // Uses 1970-01-01T00:00:00.0Z by default.
+ if(!dojo.date.stamp._isoRegExp){
+ dojo.date.stamp._isoRegExp =
+//TODO: could be more restrictive and check for 00-59, etc.
+ /^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;
+ }
+ var match = dojo.date.stamp._isoRegExp.exec(formattedString),
+ result = null;
-}
+ if(match){
+ match.shift();
+ if(match[1]){match[1]--;} // Javascript Date months are 0-based
+ if(match[6]){match[6] *= 1000;} // Javascript Date expects fractional seconds as milliseconds
+
+ if(defaultTime){
+ // mix in defaultTime. Relatively expensive, so use || operators for the fast path of defaultTime === 0
+ defaultTime = new Date(defaultTime);
+ array.forEach(array.map(["FullYear", "Month", "Date", "Hours", "Minutes", "Seconds", "Milliseconds"], function(prop){
+ return defaultTime["get" + prop]();
+ }), function(value, index){
+ match[index] = match[index] || value;
+ });
+ }
+ result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0); //TODO: UTC defaults
+ if(match[0] < 100){
+ result.setFullYear(match[0] || 1970);
+ }
+
+ var offset = 0,
+ zoneSign = match[7] && match[7].charAt(0);
+ if(zoneSign != 'Z'){
+ offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0);
+ if(zoneSign != '-'){ offset *= -1; }
+ }
+ if(zoneSign){
+ offset -= result.getTimezoneOffset();
+ }
+ if(offset){
+ result.setTime(result.getTime() + offset * 60000);
+ }
+ }
-if(!dojo._hasResource["dojo.Stateful"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.Stateful"] = true;
-dojo.provide("dojo.Stateful");
+ return result; // Date or null
+};
+/*=====
+ dojo.date.stamp.__Options = function(){
+ // selector: String
+ // "date" or "time" for partial formatting of the Date object.
+ // Both date and time will be formatted by default.
+ // zulu: Boolean
+ // if true, UTC/GMT is used for a timezone
+ // milliseconds: Boolean
+ // if true, output milliseconds
+ this.selector = selector;
+ this.zulu = zulu;
+ this.milliseconds = milliseconds;
+ }
+=====*/
-dojo.declare("dojo.Stateful", null, {
+dojo.date.stamp.toISOString = function(/*Date*/dateObject, /*dojo.date.stamp.__Options?*/options){
+ // summary:
+ // Format a Date object as a string according a subset of the ISO-8601 standard
+ //
+ // description:
+ // When options.selector is omitted, output follows [RFC3339](http://www.ietf.org/rfc/rfc3339.txt)
+ // The local time zone is included as an offset from GMT, except when selector=='time' (time without a date)
+ // Does not check bounds. Only years between 100 and 9999 are supported.
+ //
+ // dateObject:
+ // A Date object
+
+ var _ = function(n){ return (n < 10) ? "0" + n : n; };
+ options = options || {};
+ var formattedDate = [],
+ getter = options.zulu ? "getUTC" : "get",
+ date = "";
+ if(options.selector != "time"){
+ var year = dateObject[getter+"FullYear"]();
+ date = ["0000".substr((year+"").length)+year, _(dateObject[getter+"Month"]()+1), _(dateObject[getter+"Date"]())].join('-');
+ }
+ formattedDate.push(date);
+ if(options.selector != "date"){
+ var time = [_(dateObject[getter+"Hours"]()), _(dateObject[getter+"Minutes"]()), _(dateObject[getter+"Seconds"]())].join(':');
+ var millis = dateObject[getter+"Milliseconds"]();
+ if(options.milliseconds){
+ time += "."+ (millis < 100 ? "0" : "") + _(millis);
+ }
+ if(options.zulu){
+ time += "Z";
+ }else if(options.selector != "time"){
+ var timezoneOffset = dateObject.getTimezoneOffset();
+ var absOffset = Math.abs(timezoneOffset);
+ time += (timezoneOffset > 0 ? "-" : "+") +
+ _(Math.floor(absOffset/60)) + ":" + _(absOffset%60);
+ }
+ formattedDate.push(time);
+ }
+ return formattedDate.join('T'); // String
+};
+
+return dojo.date.stamp;
+});
+
+},
+'dojo/Stateful':function(){
+define("dojo/Stateful", ["./_base/kernel", "./_base/declare", "./_base/lang", "./_base/array"], function(dojo, declare, lang, array) {
+ // module:
+ // dojo/Stateful
+ // summary:
+ // TODOC
+
+return dojo.declare("dojo.Stateful", null, {
// summary:
// Base class for objects that provide named properties with optional getter/setter
// control and the ability to watch for property changes
@@ -3203,15 +5527,17 @@ dojo.declare("dojo.Stateful", null, {
// | obj.set("foo","bar");
postscript: function(mixin){
if(mixin){
- dojo.mixin(this, mixin);
+ lang.mixin(this, mixin);
}
},
-
+
get: function(/*String*/name){
// summary:
// Get a property on a Stateful instance.
// name:
// The property to get.
+ // returns:
+ // The property value on this Stateful instance.
// description:
// Get a named property on a Stateful object. The property may
// potentially be retrieved via a getter method in subclasses. In the base class
@@ -3220,8 +5546,8 @@ dojo.declare("dojo.Stateful", null, {
// | stateful = new dojo.Stateful({foo: 3});
// | stateful.get("foo") // returns 3
// | stateful.foo // returns 3
-
- return this[name];
+
+ return this[name]; //Any
},
set: function(/*String*/name, /*Object*/value){
// summary:
@@ -3230,6 +5556,8 @@ dojo.declare("dojo.Stateful", null, {
// The property to set.
// value:
// The value to set in the property.
+ // returns:
+ // The function returns this dojo.Stateful instance.
// description:
// Sets named properties on a stateful object and notifies any watchers of
// the property. A programmatic setter may be defined in subclasses.
@@ -3257,7 +5585,7 @@ dojo.declare("dojo.Stateful", null, {
if(this._watchCallbacks){
this._watchCallbacks(name, oldValue, value);
}
- return this;
+ return this; //dojo.Stateful
},
watch: function(/*String?*/name, /*Function*/callback){
// summary:
@@ -3275,7 +5603,7 @@ dojo.declare("dojo.Stateful", null, {
// the property has been changed. The callback will be called with the |this|
// set to the instance, the first argument as the name of the property, the
// second argument as the old value and the third argument as the new value.
-
+
var callbacks = this._watchCallbacks;
if(!callbacks){
var self = this;
@@ -3312,3643 +5640,5497 @@ dojo.declare("dojo.Stateful", null, {
propertyCallbacks.push(callback);
return {
unwatch: function(){
- propertyCallbacks.splice(dojo.indexOf(propertyCallbacks, callback), 1);
+ propertyCallbacks.splice(array.indexOf(propertyCallbacks, callback), 1);
}
- };
+ }; //Object
}
-
+
});
-}
+});
-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");
+},
+'dijit/layout/AccordionContainer':function(){
+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.
-(function(){
+ // 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._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: "",
+ 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
- // 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: "",
+ templateString: template,
- // 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: "",
+ // label: String
+ // Title of the pane
+ label: "",
+ _setLabelAttr: {node: "titleTextNode", type: "innerHTML" },
- // class: String
- // HTML class attribute
- "class": "",
+ // title: String
+ // Tooltip that appears on hover
+ title: "",
+ _setTitleAttr: {node: "titleTextNode", type: "attribute", attribute: "title"},
- // style: String||Object
- // HTML style attributes as cssText string or name/value hash
- style: "",
+ // iconClassAttr: String
+ // CSS class for icon to left of label
+ iconClassAttr: "",
+ _setIconClassAttr: { node: "iconNode", type: "class" },
- // 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: "",
+ baseClass: "dijitAccordionTitle",
- // 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: "",
+ getParent: function(){
+ // summary:
+ // Returns the AccordionContainer parent.
+ // tags:
+ // private
+ return this.parent;
+ },
- // baseClass: [protected] String
- // Root CSS class of the widget (ex: dijitTextBox), used to construct CSS classes to indicate
- // widget state.
- baseClass: "",
+ 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);
+ },
- // srcNodeRef: [readonly] DomNode
- // pointer to original DOM node
- srcNodeRef: null,
+ getTitleHeight: function(){
+ // summary:
+ // Returns the height of the title dom node.
+ return domGeometry.getMarginSize(this.domNode).h; // Integer
+ },
- // 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,
+ // 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);
+ },
- // 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,
+ _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.
/*=====
- // _started: Boolean
- // startup() has completed.
- _started: false,
+ // 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,
=====*/
- // 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:""},
+/*=====
+ // contentWidget: dijit._Widget
+ // Pointer to the real child widget
+ contentWidget: null,
+=====*/
- // _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(),
+ baseClass: "dijitAccordionInnerContainer",
- //////////// INITIALIZATION METHODS ///////////////////////////////////////
+ // tell nested layout widget that we will take care of sizing
+ isLayoutContainer: true,
- postscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){
- // summary:
- // Kicks off widget instantiation. See create() for details.
- // tags:
- // private
- this.create(params, srcNodeRef);
- },
+ buildRendering: function(){
+ // Builds a template like:
+ // <div class=dijitAccordionInnerContainer>
+ // Button
+ // <div class=dijitAccordionChildWrapper>
+ // ContentPane
+ // </div>
+ // </div>
- 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
+ // Create wrapper div, placed where the child is now
+ this.domNode = domConstruct.place("<div class='" + this.baseClass +
+ "' role='presentation'>", this.contentWidget.domNode, "after");
- // store pointer to original DOM tree
- this.srcNodeRef = dojo.byId(srcNodeRef);
+ // 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);
- // 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 = [];
+ // 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);
+ },
- // 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 = [];
+ postCreate: function(){
+ this.inherited(arguments);
- // 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();
+ // 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);
+ }))
+ ];
+ },
- // 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);
+ _setSelectedAttr: function(/*Boolean*/ isSelected){
+ this._set("selected", isSelected);
+ this.button.set("selected", isSelected);
+ if(isSelected){
+ var cw = this.contentWidget;
+ if(cw.onSelected){ cw.onSelected(); }
+ }
+ },
- this.buildRendering();
+ startup: function(){
+ // Called by _Container.addChild()
+ this.contentWidget.startup();
+ },
- 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();
+ destroy: function(){
+ this.button.destroyRecursive();
- // 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);
- }
- }
+ array.forEach(this._contentWidgetWatches || [], function(w){ w.unwatch(); });
- 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();
+ delete this.contentWidget._buttonWidget;
+ delete this.contentWidget._wrapperWidget;
- // 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.inherited(arguments);
+ },
- this._created = true;
- },
+ destroyDescendants: function(/*Boolean*/ preserveDom){
+ // since getChildren isn't working for me, have to code this manually
+ this.contentWidget.destroyRecursive(preserveDom);
+ }
+ });
- _applyAttributes: function(){
+ var AccordionContainer = declare("dijit.layout.AccordionContainer", StackContainer, {
// 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]);
- }
- };
+ // 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>
- // Do the attributes in attributeMap
- for(var attr in this.attributeMap){
- condAttrApply(attr, this);
- }
+ // duration: Integer
+ // Amount of time (in ms) it takes to slide panes
+ duration: manager.defaultDuration,
- // And also any attributes with custom setters
- dojo.forEach(this._getSetterAttributes(), function(a){
- if(!(a in this.attributeMap)){
- condAttrApply(a, this);
+ // 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);
}
- }, 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));
+ 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);
}
- }
- 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
- },
+ _setupChild: function(child){
+ // Overrides _LayoutWidget._setupChild().
+ // Put wrapper widget around the child widget, showing title
- 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
+ child._wrapperWidget = AccordionInnerContainer({
+ contentWidget: child,
+ buttonWidget: this.buttonWidget,
+ id: child.id + "_wrapper",
+ dir: child.dir,
+ lang: child.lang,
+ textDir: child.textDir,
+ parent: this
+ });
- if(!this.domNode){
- // Create root node if it wasn't created by _Templated
- this.domNode = this.srcNodeRef || dojo.create('div');
- }
+ this.inherited(arguments);
+ },
- // 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"; }));
+ 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);
}
- 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
- },
+ removeChild: function(child){
+ // Overrides _LayoutWidget.removeChild().
- 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 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;
+ }
- //////////// DESTROY FUNCTIONS ////////////////////////////////
+ domClass.remove(child.domNode, "dijitHidden");
- 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.inherited(arguments);
+ },
- this._beingDestroyed = true;
- this.destroyDescendants(preserveDom);
- this.destroy(preserveDom);
- },
+ 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(/*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
+ 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);
+ },
- 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);
- });
+ _showChild: function(child){
+ // Override StackContainer._showChild() to set visibility of _wrapperWidget.containerNode
+ child._wrapperWidget.containerNode.style.display="block";
+ return this.inherited(arguments);
+ },
- // destroy widgets created as part of template, etc.
- dfe(this._supportingWidgets || [], function(w){
- if(w.destroyRecursive){
- w.destroyRecursive();
- }else if(w.destroy){
- w.destroy();
+ _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;
}
- });
- this.destroyRendering(preserveDom);
- dijit.registry.remove(this.id);
- this._destroyed = true;
- },
+ 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;
+ }
- 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
+ var self = this;
- if(this.bgIframe){
- this.bgIframe.destroy(preserveDom);
- delete this.bgIframe;
- }
+ if(newWidget){
+ newWidget._wrapperWidget.set("selected", true);
- if(this.domNode){
- if(preserveDom){
- dojo.removeAttr(this.domNode, "widgetId");
- }else{
- dojo.destroy(this.domNode);
+ 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);
+ }
}
- delete this.domNode;
- }
- if(this.srcNodeRef){
- if(!preserveDom){
- dojo.destroy(this.srcNodeRef);
+ if(oldWidget){
+ oldWidget._wrapperWidget.set("selected", false);
+ if(!animate){
+ this._hideChild(oldWidget);
+ }
}
- 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.
+ if(animate){
+ var newContents = newWidget._wrapperWidget.containerNode,
+ oldContents = oldWidget._wrapperWidget.containerNode;
- // get all direct descendants and destroy them recursively
- dojo.forEach(this.getChildren(), function(widget){
- if(widget.destroyRecursive){
- widget.destroyRecursive(preserveDom);
+ // 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
});
- },
+ }
- uninitialize: function(){
- // summary:
- // Stub function. Override to implement custom widget tear-down
- // behavior.
- // tags:
- // protected
- return false;
- },
+ // For monkey patching
+ AccordionContainer._InnerContainer = AccordionInnerContainer;
+ AccordionContainer._Button = AccordionButton;
- ////////////////// GET/SET, CUSTOM SETTERS, ETC. ///////////////////
+ return AccordionContainer;
+});
- _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);
- },
+},
+'dijit/form/_AutoCompleterMixin':function(){
+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`
- _setStyleAttr: function(/*String||Object*/ value){
+
+ return declare("dijit.form._AutoCompleterMixin", null, {
// 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
+ // A mixin that implements the base functionality for `dijit.form.ComboBox`/`dijit.form.FilteringSelect`
// description:
- // Determines which node to set the style on based on style setting
- // in attributeMap.
+ // All widgets that mix in dijit.form._AutoCompleterMixin must extend `dijit.form._FormValueWidget`.
// tags:
// protected
- var mapNode = this[this.attributeMap.style || 'domNode'];
+ // 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,
- // Note: technically we should revert any style setting made in a previous call
- // to his method, but that's difficult to keep track of.
+ // pageSize: Integer
+ // Argument to data provider.
+ // Specifies number of search results per page (before hitting "next" button)
+ pageSize: Infinity,
- if(dojo.isObject(value)){
- dojo.style(mapNode, value);
- }else{
- if(mapNode.style.cssText){
- mapNode.style.cssText += "; " + value;
- }else{
- mapNode.style.cssText = value;
- }
- }
+ // store: [const] dojo.store.api.Store
+ // Reference to data provider object used by this ComboBox
+ store: null,
- this._set("style", value);
- },
+ // 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:{},
- _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.
+ // 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".
//
- // tags:
- // private
+ // 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",
- var commands = this.attributeMap[attr];
- dojo.forEach(dojo.isArray(commands) ? commands : [commands], function(command){
+ // searchDelay: Integer
+ // Delay in milliseconds between when user types something and we start
+ // searching based on that value
+ searchDelay: 100,
- // 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
+ // searchAttr: String
+ // Search for items in the data store where this attribute (in the item)
+ // matches what the user typed
+ searchAttr: "name",
- switch(type){
- case "attribute":
- if(dojo.isFunction(value)){ // functions execute in the context of the widget
- value = dojo.hitch(this, value);
- }
+ // 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: "",
- // 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);
+ // 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,
- dojo.attr(mapNode, attrName, value);
+ _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 "innerText":
- mapNode.innerHTML = "";
- mapNode.appendChild(dojo.doc.createTextNode(value));
+
+ 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 "innerHTML":
- mapNode.innerHTML = value;
+
+ 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 "class":
- dojo.replaceClass(mapNode, value, this[attr]);
+
+ 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;
}
- }, this);
- },
+ 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);
+ }
+ },
- 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)
+ _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.
- if(typeof name === "object"){
- for(var x in name){
- this.set(x, name[x]);
+ 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);
}
- 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);
+ },
+
+ _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;
}
- 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"
- });
- },
+ // 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.
- _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);
- }
- },
+ var nodes = this.dropDown.createOptions(
+ results,
+ options,
+ lang.hitch(this, "_getMenuLabelFromItem")
+ );
- 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
- },
+ // show our list (only if we have content, else nothing)
+ this._showResultList();
- 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.
+ // #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
+ }
+ },
- return this.containerNode ? dojo.query('[widgetId]', this.containerNode).map(dijit.byNode) : []; // dijit._Widget[]
- },
+ _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");
+ },
- 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[]
- },
+ 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.
- 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
+ this._startSearchAll();
+ },
- var handles = [dojo._connect(obj, event, this, method)];
- this._connects.push(handles);
- return handles; // _Widget.Handle
- },
+ isLoaded: function(){
+ // signal to _HasDropDown that it needs to call loadDropDown() to load the
+ // drop down asynchronously before displaying it
+ return false;
+ },
- 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;
+ 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");
}
- }
- },
+ },
- 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);
+ _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();
+ }
+ },
- // return handles for Any widget that may need them
- this._subscribes.push(handle);
- return handle;
- },
+ _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);
+ },
- 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);
+ _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);
+ }
}
- },
+ });
+});
- isLeftToRight: function(){
+},
+'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",
+'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>",
+'dijit/form/MappedTextBox':function(){
+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:
- // Return this widget's explicit or implicit orientation (true for LTR, false for RTL)
+ // 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
- 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)
+ postMixInProperties: function(){
+ this.inherited(arguments);
- if(reference.declaredClass && reference.addChild){
- reference.addChild(this, position);
- }else{
- dojo.place(this.domNode, reference, position);
+ // 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);
}
- return this;
- }
+ });
});
-})();
+},
+'dijit/form/ComboBoxMixin':function(){
+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;
+=====*/
-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");
+ // 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"
+ },
-////////////////// DEFERRED CONNECTS ///////////////////
+ _setHasDownArrowAttr: function(/*Boolean*/ val){
+ this._set("hasDownArrow", val);
+ this._buttonNode.style.display = val ? "" : "none";
+ },
-// 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);
+ _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);
+ }));
+ }
+ });
+ }
}
});
+});
-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(){
+},
+'dijit/form/_TextBoxMixin':function(){
+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
-dojo.declare("dijit._Widget", dijit._WidgetBase, {
+var _TextBoxMixin = declare("dijit.form._TextBoxMixin", null, {
// 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)
-
+ // A mixin for textbox form input widgets
- ////////////////// DEFERRED CONNECTS ///////////////////
+ // trim: Boolean
+ // Removes leading and trailing whitespace if true. Default is false.
+ trim: false,
- // _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){
+ // 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:
- // Connect to this function to receive notifications of printable keys being typed.
- // event:
- // key Event
- // tags:
- // callback
+ // 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);
},
- =====*/
- onKeyUp: dijit._connectOnUseEventHandler,
- /*=====
- onKeyUp: function(event){
+
+ _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
// summary:
- // Connect to this function to receive notifications of keys being released.
- // event:
- // key Event
- // tags:
- // callback
+ // 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]);
},
- =====*/
- onMouseDown: dijit._connectOnUseEventHandler,
- /*=====
- onMouseDown: function(event){
+
+ // 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:
- // Connect to this function to receive notifications of when the mouse button is pressed down.
- // event:
- // mouse Event
- // tags:
- // callback
+ // 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);
},
- =====*/
- onMouseMove: dijit._connectOnUseEventHandler,
- /*=====
- onMouseMove: function(event){
+
+ _setDisplayedValueAttr: function(/*String*/ value){
// summary:
- // Connect to this function to receive notifications of when the mouse moves over nodes contained within this widget.
- // event:
- // mouse Event
- // tags:
- // callback
+ // 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);
+ }
},
- =====*/
- onMouseOut: dijit._connectOnUseEventHandler,
- /*=====
- onMouseOut: function(event){
+
+ format: function(value /*=====, constraints =====*/){
// summary:
- // Connect to this function to receive notifications of when the mouse moves off of nodes contained within this widget.
- // event:
- // mouse Event
+ // Replaceable function to convert a value to a properly formatted string.
+ // value: String
+ // constraints: Object
// tags:
- // callback
+ // protected extension
+ return ((value == null || value == undefined) ? "" : (value.toString ? value.toString() : value));
},
- =====*/
- onMouseOver: dijit._connectOnUseEventHandler,
- /*=====
- onMouseOver: function(event){
+
+ parse: function(value /*=====, constraints =====*/){
// summary:
- // Connect to this function to receive notifications of when the mouse moves onto nodes contained within this widget.
- // event:
- // mouse Event
+ // Replaceable function to convert a formatted string to a value
+ // value: String
+ // constraints: Object
// tags:
- // callback
+ // protected extension
+
+ return value; // String
},
- =====*/
- onMouseLeave: dijit._connectOnUseEventHandler,
- /*=====
- onMouseLeave: function(event){
+
+ _refreshState: function(){
// summary:
- // Connect to this function to receive notifications of when the mouse moves off of this widget.
- // event:
- // mouse Event
+ // 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:
- // callback
+ // protected
},
- =====*/
- onMouseEnter: dijit._connectOnUseEventHandler,
+
/*=====
- onMouseEnter: function(event){
+ onInput: function(event){
// summary:
- // Connect to this function to receive notifications of when the mouse moves onto this widget.
+ // 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:
- // mouse Event
+ // keydown | keypress | cut | paste | input
// tags:
// callback
},
=====*/
- onMouseUp: dijit._connectOnUseEventHandler,
- /*=====
- onMouseUp: function(event){
+ onInput: function(){},
+
+ __skipInputEvent: false,
+ _onInput: function(){
// summary:
- // Connect to this function to receive notifications of when the mouse button is released.
- // event:
- // mouse Event
- // tags:
- // callback
+ // 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"));
},
- =====*/
- 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
- }
- }
+ 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);
- 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);
+ // 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);
},
- _onConnect: function(/*String*/ event){
+ _blankValue: '', // if the textbox is blank, what value should be reported
+ filter: function(val){
// summary:
- // Called when someone connects to one of my handlers.
- // "Turn on" that handler if it isn't active yet.
+ // 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
//
- // 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];
+ // 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;
},
- ////////////////// 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");
+ _setBlurValue: function(){
+ this._setValueAttr(this.get('value'), true);
},
- 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(e){
+ if(this.disabled){ return; }
+ this._setBlurValue();
+ this.inherited(arguments);
- 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
+ if(this._selectOnClickHandle){
+ this.disconnect(this._selectOnClickHandle);
+ }
},
- _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();
+ _isTextSelected: function(){
+ return this.textbox.selectionStart == this.textbox.selectionEnd;
},
- _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();
- },
+ _onFocus: function(/*String*/ by){
+ if(this.disabled || this.readOnly){ return; }
- ////////////////// DEPRECATED METHODS ///////////////////
+ // 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);
- 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);
+ // 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();
},
- attr: function(/*String|Object*/name, /*Object?*/value){
+ reset: function(){
+ // Overrides dijit._FormWidget.reset().
+ // Additionally resets the displayed textbox value to ''
+ this.textbox.value = '';
+ this.inherited(arguments);
+ },
+ _setTextDirAttr: function(/*String*/ textDir){
// 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.
+ // Setter for textDir.
// description:
- // This method is deprecated, use get() or set() directly.
+ // Users shouldn't call this function; they should be calling
+ // set('textDir', value)
+ // tags:
+ // private
- // 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;
- }
+ // 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);
}
+ }
+});
- 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"],
+_TextBoxMixin._setSelectionRange = dijit._setSelectionRange = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){
+ if(element.setSelectionRange){
+ element.setSelectionRange(start, stop);
+ }
+};
- 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
+_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).
- 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);
- }
- })
- );
- }
- }
+ // 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 handles; // _Widget.Handle
- },
+return _TextBoxMixin;
+});
- ////////////////// MISCELLANEOUS METHODS ///////////////////
+},
+'dijit/form/SimpleTextarea':function(){
+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){
- _onShow: function(){
- // summary:
- // Internal method called when this widget is made visible.
- // See `onShow` for details.
- this.onShow();
- },
+/*=====
+ var TextBox = dijit.form.TextBox;
+=====*/
- 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
+// 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);
},
- 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
+ buildRendering: function(){
+ this.inherited(arguments);
+ if(has("ie") && this.cols){ // attribute selectors is not supported in IE6
+ domClass.add(this.textbox, "dijitTextAreaCols");
+ }
},
- 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
+ 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);
+ },
- return true; // Boolean
+ _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);
}
});
-})();
+});
-}
+},
+'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",
+'dijit/_base/window':function(){
+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.
-if(!dojo._hasResource["dojo.string"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.string"] = true;
-dojo.provide("dojo.string");
+ dijit.getDocumentWindow = function(doc){
+ return windowUtils.get(doc);
+ };
+});
-dojo.getObject("string", true, dojo);
+},
+'dijit/form/RadioButton':function(){
+define("dijit/form/RadioButton", [
+ "dojo/_base/declare", // declare
+ "./CheckBox",
+ "./_RadioButtonMixin"
+], function(declare, CheckBox, _RadioButtonMixin){
/*=====
-dojo.string = {
- // summary: String utilities for Dojo
-};
+ var CheckBox = dijit.form.CheckBox;
+ var _RadioButtonMixin = dijit.form._RadioButtonMixin;
=====*/
-dojo.string.rep = function(/*String*/str, /*Integer*/num){
- // summary:
- // Efficiently replicate a string `n` times.
- // str:
- // the string to replicate
- // num:
- // number of times to replicate the string
-
- if(num <= 0 || !str){ return ""; }
-
- var buf = [];
- for(;;){
- if(num & 1){
- buf.push(str);
- }
- if(!(num >>= 1)){ break; }
- str += str;
- }
- return buf.join(""); // String
-};
+ // module:
+ // dijit/form/RadioButton
+ // summary:
+ // Radio button widget
-dojo.string.pad = function(/*String*/text, /*Integer*/size, /*String?*/ch, /*Boolean?*/end){
- // summary:
- // Pad a string to guarantee that it is at least `size` length by
- // filling with the character `ch` at either the start or end of the
- // string. Pads at the start, by default.
- // text:
- // the string to pad
- // size:
- // length to provide padding
- // ch:
- // character to pad, defaults to '0'
- // end:
- // adds padding at the end if true, otherwise pads at start
- // example:
- // | // Fill the string to length 10 with "+" characters on the right. Yields "Dojo++++++".
- // | dojo.string.pad("Dojo", 10, "+", true);
+ return declare("dijit.form.RadioButton", [CheckBox, _RadioButtonMixin], {
+ // summary:
+ // Same as an HTML radio, but with fancy styling.
- if(!ch){
- ch = '0';
- }
- var out = String(text),
- pad = dojo.string.rep(ch, Math.ceil((size - out.length) / ch.length));
- return end ? out + pad : pad + out; // String
-};
+ baseClass: "dijitRadio"
+ });
+});
-dojo.string.substitute = function( /*String*/ template,
- /*Object|Array*/map,
- /*Function?*/ transform,
- /*Object?*/ thisObject){
- // summary:
- // Performs parameterized substitutions on a string. Throws an
- // exception if any parameter is unmatched.
- // template:
- // a string with expressions in the form `${key}` to be replaced or
- // `${key:format}` which specifies a format function. keys are case-sensitive.
- // map:
- // hash to search for substitutions
- // transform:
- // a function to process all parameters before substitution takes
- // place, e.g. mylib.encodeXML
- // thisObject:
- // where to look for optional format function; default to the global
- // namespace
- // example:
- // Substitutes two expressions in a string from an Array or Object
- // | // returns "File 'foo.html' is not found in directory '/temp'."
- // | // by providing substitution data in an Array
- // | dojo.string.substitute(
- // | "File '${0}' is not found in directory '${1}'.",
- // | ["foo.html","/temp"]
- // | );
- // |
- // | // also returns "File 'foo.html' is not found in directory '/temp'."
- // | // but provides substitution data in an Object structure. Dotted
- // | // notation may be used to traverse the structure.
- // | dojo.string.substitute(
- // | "File '${name}' is not found in directory '${info.dir}'.",
- // | { name: "foo.html", info: { dir: "/temp" } }
- // | );
- // example:
- // Use a transform function to modify the values:
- // | // returns "file 'foo.html' is not found in directory '/temp'."
- // | dojo.string.substitute(
- // | "${0} is not found in ${1}.",
- // | ["foo.html","/temp"],
- // | function(str){
- // | // try to figure out the type
- // | var prefix = (str.charAt(0) == "/") ? "directory": "file";
- // | return prefix + " '" + str + "'";
- // | }
- // | );
- // example:
- // Use a formatter
- // | // returns "thinger -- howdy"
- // | dojo.string.substitute(
- // | "${0:postfix}", ["thinger"], null, {
- // | postfix: function(value, key){
- // | return value + " -- howdy";
- // | }
- // | }
- // | );
+},
+'dijit/main':function(){
+define("dijit/main", [
+ "dojo/_base/kernel"
+], function(dojo){
+ // module:
+ // dijit
+ // summary:
+ // The dijit package main module
- thisObject = thisObject || dojo.global;
- transform = transform ?
- dojo.hitch(thisObject, transform) : function(v){ return v; };
+ return dojo.dijit;
+});
- return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,
- function(match, key, format){
- var value = dojo.getObject(key, false, map);
- if(format){
- value = dojo.getObject(format, false, thisObject).call(thisObject, value, key);
- }
- return transform(value, key).toString();
- }); // String
-};
+},
+'dijit/_OnDijitClickMixin':function(){
+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);
+ }
-/*=====
-dojo.string.trim = function(str){
- // summary:
- // Trims whitespace from both sides of the string
- // str: String
- // String to be trimmed
- // returns: String
- // Returns the trimmed string
- // description:
- // This version of trim() was taken from [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript).
- // The short yet performant version of this function is dojo.trim(),
- // which is part of Dojo base. Uses String.prototype.trim instead, if available.
- return ""; // String
-}
-=====*/
+ // 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();
+ }
+ }),
-dojo.string.trim = String.prototype.trim ?
- dojo.trim : // aliasing to the native function
- function(str){
- str = str.replace(/^\s+/, '');
- for(var i = str.length - 1; i >= 0; i--){
- if(/\S/.test(str.charAt(i))){
- str = str.substring(0, i + 1);
- break;
- }
+ 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 str;
};
-}
+ 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
-if(!dojo._hasResource["dojo.cache"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.cache"] = true;
-dojo.provide("dojo.cache");
+ return this.inherited(arguments, [obj, event == "ondijitclick" ? a11yclick : event, method]);
+ }
+ });
+});
+},
+'dijit/InlineEditBox':function(){
+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){
/*=====
-dojo.cache = {
- // summary:
- // A way to cache string content that is fetchable via `dojo.moduleUrl`.
-};
+ 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;
=====*/
- var cache = {};
- dojo.cache = function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){
- // summary:
- // A getter and setter for storing the string content associated with the
- // module and url arguments.
- // description:
- // module and url are used to call `dojo.moduleUrl()` to generate a module URL.
- // If value is specified, the cache value for the moduleUrl will be set to
- // that value. Otherwise, dojo.cache will fetch the moduleUrl and store it
- // in its internal cache and return that cached value for the URL. To clear
- // a cache value pass null for value. Since XMLHttpRequest (XHR) is used to fetch the
- // the URL contents, only modules on the same domain of the page can use this capability.
- // The build system can inline the cache values though, to allow for xdomain hosting.
- // module: String||Object
- // If a String, the module name to use for the base part of the URL, similar to module argument
- // to `dojo.moduleUrl`. If an Object, something that has a .toString() method that
- // generates a valid path for the cache item. For example, a dojo._Url object.
- // url: String
- // The rest of the path to append to the path derived from the module argument. If
- // module is an object, then this second argument should be the "value" argument instead.
- // value: String||Object?
- // If a String, the value to use in the cache for the module/url combination.
- // If an Object, it can have two properties: value and sanitize. The value property
- // should be the value to use in the cache, and sanitize can be set to true or false,
- // to indicate if XML declarations should be removed from the value and if the HTML
- // inside a body tag in the value should be extracted as the real value. The value argument
- // or the value property on the value argument are usually only used by the build system
- // as it inlines cache content.
- // example:
- // To ask dojo.cache to fetch content and store it in the cache (the dojo["cache"] style
- // of call is used to avoid an issue with the build system erroneously trying to intern
- // this example. To get the build system to intern your dojo.cache calls, use the
- // "dojo.cache" style of call):
- // | //If template.html contains "<h1>Hello</h1>" that will be
- // | //the value for the text variable.
- // | var text = dojo["cache"]("my.module", "template.html");
- // example:
- // To ask dojo.cache to fetch content and store it in the cache, and sanitize the input
- // (the dojo["cache"] style of call is used to avoid an issue with the build system
- // erroneously trying to intern this example. To get the build system to intern your
- // dojo.cache calls, use the "dojo.cache" style of call):
- // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the
- // | //text variable will contain just "<h1>Hello</h1>".
- // | var text = dojo["cache"]("my.module", "template.html", {sanitize: true});
- // example:
- // Same example as previous, but demostrates how an object can be passed in as
- // the first argument, then the value argument can then be the second argument.
- // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the
- // | //text variable will contain just "<h1>Hello</h1>".
- // | var text = dojo["cache"](new dojo._Url("my/module/template.html"), {sanitize: true});
-
- //Module could be a string, or an object that has a toString() method
- //that will return a useful path. If it is an object, then the "url" argument
- //will actually be the value argument.
- if(typeof module == "string"){
- var pathObj = dojo.moduleUrl(module, url);
- }else{
- pathObj = module;
- value = url;
- }
- var key = pathObj.toString();
+// module:
+// dijit/InlineEditBox
+// summary:
+// An element with in-line edit capabilities
- var val = value;
- if(value != undefined && !dojo.isString(value)){
- val = ("value" in value ? value.value : undefined);
- }
+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
- var sanitize = value && value.sanitize ? true : false;
+ templateString: template,
- if(typeof val == "string"){
- //We have a string, set cache value
- val = cache[key] = sanitize ? dojo.cache._sanitize(val) : val;
- }else if(val === null){
- //Remove cached value
- delete cache[key];
- }else{
- //Allow cache values to be empty strings. If key property does
- //not exist, fetch it.
- if(!(key in cache)){
- val = dojo._getText(key);
- cache[key] = sanitize ? dojo.cache._sanitize(val) : val;
- }
- val = cache[key];
- }
- return val; //String
- };
+ 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);
+ },
- dojo.cache._sanitize = function(/*String*/val){
- // summary:
- // Strips <?xml ...?> declarations so that external SVG and XML
- // documents can be added to a document without worry. Also, if the string
- // is an HTML document, only the part inside the body tag is returned.
- // description:
- // Copied from dijit._Templated._sanitizeTemplateString.
- if(val){
- val = val.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, "");
- var matches = val.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
- if(matches){
- val = matches[1];
+ 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{
- val = "";
+ // inline-block mode
+ editStyle += "width:" + (width + (Number(width) == width ? "px" : "")) + ";";
}
- return val; //String
- };
-
-}
-
-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");
+ 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);
+ }
+ }
+ },
-dojo.declare("dijit._Templated",
- null,
- {
+ _onIntermediateChange: function(/*===== val =====*/){
// 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,
+ // 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());
+ },
- // 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,
+ destroy: function(){
+ this.editWidget.destroy(true); // let the parent wrapper widget clean up the DOM
+ this.inherited(arguments);
+ },
- // widgetsInTemplate: [protected] Boolean
- // Should we parse the template to find widgets that might be
- // declared in markup inside it? False by default.
- widgetsInTemplate: false,
+ getValue: function(){
+ // summary:
+ // Return the [display] value of the edit widget
+ var ew = this.editWidget;
+ return String(ew.get("displayedValue" in ew ? "displayedValue" : "value"));
+ },
- // 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,
+ _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
- // _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,
+ 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
+ }
-/*=====
- // _attachPoints: [private] String[]
- // List of widget attribute names associated with dojoAttachPoint=... in the
- // template, ex: ["containerNode", "labelNode"]
- _attachPoints: [],
- =====*/
+ // _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.
+ }
+ },
-/*=====
- // _attachEvents: [private] Handle[]
- // List of connections associated with dojoAttachEvent=... in the
- // template
- _attachEvents: [],
- =====*/
+ _onBlur: function(){
+ // summary:
+ // Called when focus moves outside the editor
+ // tags:
+ // private
- constructor: function(){
- this._attachPoints = [];
- this._attachEvents = [];
- },
+ 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);
+ }
+ }
+ },
- _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 ""; }
+ _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
- // 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);
- },
+ if(this.inlineEditBox.autoSave && this.inlineEditBox.editing && this.enableSave()){
+ fm.focus(this.inlineEditBox.displayNode); // fires _onBlur which will save the formatted value
+ }
+ },
- buildRendering: function(){
- // summary:
- // Construct the UI for this widget from a template, setting this.domNode.
- // tags:
- // protected
+ 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
+ );
+ },
- // 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);
+ focus: function(){
+ // summary:
+ // Focus the edit widget.
+ // tags:
+ // protected
- 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.editWidget.focus();
+ setTimeout(lang.hitch(this, function(){
+ if(this.editWidget.focusNode && this.editWidget.focusNode.tagName == "INPUT"){
+ _TextBoxMixin.selectInputText(this.editWidget.focusNode);
}
+ }), 0);
+ }
+});
- this.domNode = node;
- // Call down to _Widget.buildRendering() to get base classes assigned
- // TODO: change the baseClass assignment to attributeMap
- this.inherited(arguments);
+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
- // 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);
+ // editing: [readonly] Boolean
+ // Is the node currently in edit mode?
+ editing: false,
- 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
- }));
+ // autoSave: Boolean
+ // Changing the value automatically saves it; don't have to push save button
+ // (and save button isn't even displayed)
+ autoSave: true,
- this._supportingWidgets = dijit.findWidgets(node);
+ // buttonSave: String
+ // Save button label
+ buttonSave: "",
- this._attachTemplateNodes(cw, function(n,p){
- return n[p];
- });
- }
+ // buttonCancel: String
+ // Cancel button label
+ buttonCancel: "",
- this._fillContent(this.srcNodeRef);
- },
+ // 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,
- _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);
- }
- }
- },
+ // editor: String|Function
+ // Class name (or reference to the Class) for Editor widget
+ editor: TextBox,
- _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
+ // editorWrapper: String|Function
+ // Class name (or reference to the Class) for widget that wraps the editor widget, displaying save/cancel
+ // buttons.
+ editorWrapper: InlineEditor,
- getAttrFunc = getAttrFunc || function(n,p){ return n.getAttribute(p); };
+ // editorParams: Object
+ // Set of parameters for editor, like {required: true}
+ editorParams: {},
- 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);
- }
- }
+ // disabled: Boolean
+ // If true, clicking the InlineEditBox to edit it will have no effect.
+ disabled: false,
- // 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));
- }
- }
- }
+ onChange: function(/*===== value =====*/){
+ // summary:
+ // Set this handler to be notified of changes to value.
+ // tags:
+ // callback
+ },
- // 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]);
- }
- });
- }
- }
- },
+ onCancel: function(){
+ // summary:
+ // Set this handler to be notified when editing is cancelled.
+ // tags:
+ // callback
+ },
- startup: function(){
- dojo.forEach(this._startupWidgets, function(w){
- if(w && !w._started && w.startup){
- w.startup();
- }
- });
- this.inherited(arguments);
- },
+ // width: String
+ // Width of editor. By default it's width=100% (ie, block mode).
+ width: "100%",
- destroyRendering: function(){
- // Delete all attach points to prevent IE6 memory leaks.
- dojo.forEach(this._attachPoints, function(point){
- delete this[point];
- }, this);
- this._attachPoints = [];
+ // value: String
+ // The display value of the widget in read-only mode
+ value: "",
- // And same for event handlers
- dojo.forEach(this._attachEvents, this.disconnect, this);
- this._attachEvents = [];
-
- this.inherited(arguments);
- }
- }
-);
+ // 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;
-// key is either templatePath or templateString; object is either string or DOM tree
-dijit._Templated._templateCache = {};
+ constructor: function(){
+ // summary:
+ // Sets up private arrays etc.
+ // tags:
+ // private
+ this.editorParams = {};
+ },
-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);
- }
+ postMixInProperties: function(){
+ this.inherited(arguments);
- // If necessary, load template string from template path
- if(!templateString){
- templateString = dojo.cache(templatePath, {sanitize: true});
- }
- templateString = dojo.string.trim(templateString);
+ // save pointer to original source node, since Widget nulls-out srcNodeRef
+ this.displayNode = this.srcNodeRef;
- 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);
+ // 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]);
}
- 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];
+ this.displayNode.setAttribute("role", "button");
+ if(!this.displayNode.getAttribute("tabIndex")){
+ this.displayNode.setAttribute("tabIndex", 0);
}
- });
-}
-// 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:""
-});
+ 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');
+ },
-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");
+ 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);
+ },
-dojo.declare("dijit._Container",
- null,
- {
+ _onMouseOver: function(){
// 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.
+ // Handler for onmouseover and onfocus event.
+ // tags:
+ // private
+ if(!this.disabled){
+ domClass.add(this.displayNode, "dijitInlineEditBoxDisplayModeHover");
+ }
+ },
- // 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,
+ _onMouseOut: function(){
+ // summary:
+ // Handler for onmouseout and onblur event.
+ // tags:
+ // private
+ domClass.remove(this.displayNode, "dijitInlineEditBoxDisplayModeHover");
+ },
- buildRendering: function(){
- this.inherited(arguments);
- if(!this.containerNode){
- // all widgets with descendants must set containerNode
- this.containerNode = this.domNode;
- }
- },
+ _onClick: function(/*Event*/ e){
+ // summary:
+ // Handler for onclick event.
+ // tags:
+ // private
+ if(this.disabled){ return; }
+ if(e){ event.stop(e); }
+ this._onMouseOut();
- 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).
+ // Since FF gets upset if you move a node while in an event handler for that node...
+ setTimeout(lang.hitch(this, "edit"), 0);
+ },
- 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);
+ edit: function(){
+ // summary:
+ // Display the editor widget in place of the original (read only) markup.
+ // tags:
+ // private
- // 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();
- }
- },
+ if(this.disabled || this.editing){ return; }
+ this._set('editing', true);
- 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
+ // 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(typeof widget == "number"){
- widget = this.getChildren()[widget];
- }
+ 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");
- if(widget){
- var node = widget.domNode;
- if(node && node.parentNode){
- node.parentNode.removeChild(node); // detach but don't destroy
- }
+ // 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;
- hasChildren: function(){
- // summary:
- // Returns true if widget has children, i.e. if this.containerNode contains something.
- return this.getChildren().length > 0; // Boolean
- },
+ // 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
- 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); });
- },
+ 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
- _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
- },
+ // 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);
+ },
- 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
- },
+ _onBlur: function(){
+ // summary:
+ // Called when focus moves outside the InlineEditBox.
+ // Performs garbage collection.
+ // tags:
+ // private
- 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.
+ 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);
+ */
+ }
+ },
- if(this._started){ return; }
+ destroy: function(){
+ if(this.wrapperWidget && !this.wrapperWidget._destroyed){
+ this.wrapperWidget.destroy();
+ delete this.wrapperWidget;
+ }
+ this.inherited(arguments);
+ },
- // Startup all children of this widget
- dojo.forEach(this.getChildren(), function(child){ child.startup(); });
+ _showText: function(/*Boolean*/ focus){
+ // summary:
+ // Revert to display mode, and optionally focus on display node
+ // tags:
+ // private
- this.inherited(arguments);
+ 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(!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");
+ 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
-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],{});
+ this._showText(focus); // set focus as needed
+ },
- 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;
- },
+ 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);
+ },
- _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
- },
+ _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.
- getPreviousSibling: function(){
- // summary:
- // Returns null if this is the first child of the parent,
- // otherwise returns the next element sibling to the "left".
+ 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);
- return this._getSibling("previous"); // dijit._Widget
- },
+ 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);
+ }
+ },
- getNextSibling: function(){
- // summary:
- // Returns null if this is the last child of the parent,
- // otherwise returns the next element sibling to the "right".
+ 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");
+ },
- return this._getSibling("next"); // dijit._Widget
- },
+ cancel: function(/*Boolean*/ focus){
+ // summary:
+ // Revert to display mode, discarding any changes made in the editor
+ // tags:
+ // private
- 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
+ if(this.disabled || !this.editing){ return; }
+ this._set('editing', false);
- var p = this.getParent();
- if(!p || !p.getIndexOfChild){
- return -1; // int
- }
- return p.getIndexOfChild(this); // int
- }
- }
- );
+ // 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
+ }
+ }
+});
-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");
+InlineEditBox._InlineEditor = InlineEditor; // for monkey patching
+return InlineEditBox;
+});
+},
+'dojo/selector/acme':function(){
+define("dojo/selector/acme", ["../_base/kernel", "../has", "../dom", "../_base/sniff", "../_base/array", "../_base/lang", "../_base/window"], function(dojo, has, dom){
+ // module:
+ // dojo/selector/acme
+ // summary:
+ // This module defines the Acme selector engine
+/*
+ acme architectural overview:
+
+ acme is a relatively full-featured CSS3 query library. It is
+ designed to take any valid CSS3 selector and return the nodes matching
+ the selector. To do this quickly, it processes queries in several
+ steps, applying caching where profitable.
+
+ The steps (roughly in reverse order of the way they appear in the code):
+ 1.) check to see if we already have a "query dispatcher"
+ - if so, use that with the given parameterization. Skip to step 4.
+ 2.) attempt to determine which branch to dispatch the query to:
+ - JS (optimized DOM iteration)
+ - native (FF3.1+, Safari 3.1+, IE 8+)
+ 3.) tokenize and convert to executable "query dispatcher"
+ - this is where the lion's share of the complexity in the
+ system lies. In the DOM version, the query dispatcher is
+ assembled as a chain of "yes/no" test functions pertaining to
+ a section of a simple query statement (".blah:nth-child(odd)"
+ but not "div div", which is 2 simple statements). Individual
+ statement dispatchers are cached (to prevent re-definition)
+ as are entire dispatch chains (to make re-execution of the
+ same query fast)
+ 4.) the resulting query dispatcher is called in the passed scope
+ (by default the top-level document)
+ - for DOM queries, this results in a recursive, top-down
+ evaluation of nodes based on each simple query section
+ - for native implementations, this may mean working around spec
+ bugs. So be it.
+ 5.) matched nodes are pruned to ensure they are unique (if necessary)
+*/
+ ////////////////////////////////////////////////////////////////////////
+ // Toolkit aliases
+ ////////////////////////////////////////////////////////////////////////
-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.
+ // if you are extracting acme for use in your own system, you will
+ // need to provide these methods and properties. No other porting should be
+ // necessary, save for configuring the system to use a class other than
+ // dojo.NodeList as the return instance instantiator
+ var trim = dojo.trim;
+ var each = dojo.forEach;
+ // d.isIE; // float
+ // d.isSafari; // float
+ // d.isOpera; // float
+ // d.isWebKit; // float
+ // d.doc ; // document element
- // 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",
+ var getDoc = function(){ return dojo.doc; };
+ // NOTE(alex): the spec is idiotic. CSS queries should ALWAYS be case-sensitive, but nooooooo
+ var cssCaseBug = ((dojo.isWebKit||dojo.isMozilla) && ((getDoc().compatMode) == "BackCompat"));
- // 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,
+ ////////////////////////////////////////////////////////////////////////
+ // Global utilities
+ ////////////////////////////////////////////////////////////////////////
- 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.
+ var specials = ">~+";
- if(this._started){ return; }
+ // global thunk to determine whether we should treat the current query as
+ // case sensitive or not. This switch is flipped by the query evaluator
+ // based on the document passed as the context to search.
+ var caseSensitive = false;
- // Need to call inherited first - so that child widgets get started
- // up correctly
- this.inherited(arguments);
+ // how high?
+ var yesman = function(){ return true; };
- // 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();
+ ////////////////////////////////////////////////////////////////////////
+ // Tokenizer
+ ////////////////////////////////////////////////////////////////////////
- // 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();
- });
- }
- },
+ var getQueryParts = function(query){
+ // summary:
+ // state machine for query tokenization
+ // description:
+ // instead of using a brittle and slow regex-based CSS parser,
+ // acme implements an AST-style query representation. This
+ // representation is only generated once per query. For example,
+ // the same query run multiple times or under different root nodes
+ // does not re-parse the selector expression but instead uses the
+ // cached data structure. The state machine implemented here
+ // terminates on the last " " (space) character and returns an
+ // ordered array of query component structures (or "parts"). Each
+ // part represents an operator or a simple CSS filtering
+ // expression. The structure for parts is documented in the code
+ // below.
+
+
+ // NOTE:
+ // this code is designed to run fast and compress well. Sacrifices
+ // to readability and maintainability have been made. Your best
+ // bet when hacking the tokenizer is to put The Donnas on *really*
+ // loud (may we recommend their "Spend The Night" release?) and
+ // just assume you're gonna make mistakes. Keep the unit tests
+ // open and run them frequently. Knowing is half the battle ;-)
+ if(specials.indexOf(query.slice(-1)) >= 0){
+ // if we end with a ">", "+", or "~", that means we're implicitly
+ // searching all children, so make it explicit
+ query += " * "
+ }else{
+ // if you have not provided a terminator, one will be provided for
+ // you...
+ query += " ";
+ }
- 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 ts = function(/*Integer*/ s, /*Integer*/ e){
+ // trim and slice.
- var node = this.domNode;
+ // take an index to start a string slice from and an end position
+ // and return a trimmed copy of that sub-string
+ return trim(query.slice(s, e));
+ };
- // set margin box size, unless it wasn't specified, in which case use current size
- if(changeSize){
- dojo.marginBox(node, changeSize);
+ // the overall data graph of the full query, as represented by queryPart objects
+ var queryParts = [];
+
+
+ // state keeping vars
+ var inBrackets = -1, inParens = -1, inMatchFor = -1,
+ inPseudo = -1, inClass = -1, inId = -1, inTag = -1,
+ lc = "", cc = "", pStart;
+
+ // iteration vars
+ var x = 0, // index in the query
+ ql = query.length,
+ currentPart = null, // data structure representing the entire clause
+ _cp = null; // the current pseudo or attr matcher
+
+ // several temporary variables are assigned to this structure during a
+ // potential sub-expression match:
+ // attr:
+ // a string representing the current full attribute match in a
+ // bracket expression
+ // type:
+ // if there's an operator in a bracket expression, this is
+ // used to keep track of it
+ // value:
+ // the internals of parenthetical expression for a pseudo. for
+ // :nth-child(2n+1), value might be "2n+1"
+
+ var endTag = function(){
+ // called when the tokenizer hits the end of a particular tag name.
+ // Re-sets state variables for tag matching and sets up the matcher
+ // to handle the next type of token (tag or operator).
+ if(inTag >= 0){
+ var tv = (inTag == x) ? null : ts(inTag, x); // .toLowerCase();
+ currentPart[ (specials.indexOf(tv) < 0) ? "tag" : "oper" ] = tv;
+ inTag = -1;
+ }
+ };
- // set offset of the node
- if(changeSize.t){ node.style.top = changeSize.t + "px"; }
- if(changeSize.l){ node.style.left = changeSize.l + "px"; }
+ var endId = function(){
+ // called when the tokenizer might be at the end of an ID portion of a match
+ if(inId >= 0){
+ currentPart.id = ts(inId, x).replace(/\\/g, "");
+ inId = -1;
}
+ };
- // 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
+ var endClass = function(){
+ // called when the tokenizer might be at the end of a class name
+ // match. CSS allows for multiple classes, so we augment the
+ // current item with another class in its list
+ if(inClass >= 0){
+ currentPart.classes.push(ts(inClass + 1, x).replace(/\\/g, ""));
+ inClass = -1;
}
+ };
- // 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
- };
+ var endAll = function(){
+ // at the end of a simple fragment, so wall off the matches
+ endId();
+ endTag();
+ endClass();
+ };
- // Callback for widget to adjust size of its children
- this.layout();
- },
+ var endPart = function(){
+ endAll();
+ if(inPseudo >= 0){
+ currentPart.pseudos.push({ name: ts(inPseudo + 1, x) });
+ }
+ // hint to the selector engine to tell it whether or not it
+ // needs to do any iteration. Many simple selectors don't, and
+ // we can avoid significant construction-time work by advising
+ // the system to skip them
+ currentPart.loops = (
+ currentPart.pseudos.length ||
+ currentPart.attrs.length ||
+ currentPart.classes.length );
+
+ currentPart.oquery = currentPart.query = ts(pStart, x); // save the full expression as a string
+
+
+ // otag/tag are hints to suggest to the system whether or not
+ // it's an operator or a tag. We save a copy of otag since the
+ // tag name is cast to upper-case in regular HTML matches. The
+ // system has a global switch to figure out if the current
+ // expression needs to be case sensitive or not and it will use
+ // otag or tag accordingly
+ currentPart.otag = currentPart.tag = (currentPart["oper"]) ? null : (currentPart.tag || "*");
+
+ if(currentPart.tag){
+ // if we're in a case-insensitive HTML doc, we likely want
+ // the toUpperCase when matching on element.tagName. If we
+ // do it here, we can skip the string op per node
+ // comparison
+ currentPart.tag = currentPart.tag.toUpperCase();
+ }
+
+ // add the part to the list
+ if(queryParts.length && (queryParts[queryParts.length-1].oper)){
+ // operators are always infix, so we remove them from the
+ // list and attach them to the next match. The evaluator is
+ // responsible for sorting out how to handle them.
+ currentPart.infixOper = queryParts.pop();
+ currentPart.query = currentPart.infixOper.query + " " + currentPart.query;
+ /*
+ console.debug( "swapping out the infix",
+ currentPart.infixOper,
+ "and attaching it to",
+ currentPart);
+ */
+ }
+ queryParts.push(currentPart);
+
+ currentPart = null;
+ };
- 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
- },
+ // iterate over the query, character by character, building up a
+ // list of query part objects
+ for(; lc=cc, cc=query.charAt(x), x < ql; x++){
+ // cc: the current character in the match
+ // lc: the last character (if any)
+
+ // someone is trying to escape something, so don't try to match any
+ // fragments. We assume we're inside a literal.
+ if(lc == "\\"){ continue; }
+ if(!currentPart){ // a part was just ended or none has yet been created
+ // NOTE: I hate all this alloc, but it's shorter than writing tons of if's
+ pStart = x;
+ // rules describe full CSS sub-expressions, like:
+ // #someId
+ // .className:first-child
+ // but not:
+ // thinger > div.howdy[type=thinger]
+ // the indidual components of the previous query would be
+ // split into 3 parts that would be represented a structure
+ // like:
+ // [
+ // {
+ // query: "thinger",
+ // tag: "thinger",
+ // },
+ // {
+ // query: "div.howdy[type=thinger]",
+ // classes: ["howdy"],
+ // infixOper: {
+ // query: ">",
+ // oper: ">",
+ // }
+ // },
+ // ]
+ currentPart = {
+ query: null, // the full text of the part's rule
+ pseudos: [], // CSS supports multiple pseud-class matches in a single rule
+ attrs: [], // CSS supports multi-attribute match, so we need an array
+ classes: [], // class matches may be additive, e.g.: .thinger.blah.howdy
+ tag: null, // only one tag...
+ oper: null, // ...or operator per component. Note that these wind up being exclusive.
+ id: null, // the id component of a rule
+ getTag: function(){
+ return (caseSensitive) ? this.otag : this.tag;
+ }
+ };
- _setupChild: function(/*dijit._Widget*/child){
- // summary:
- // Common setup for initial children and children which are added after startup
- // tags:
- // protected extension
+ // if we don't have a part, we assume we're going to start at
+ // the beginning of a match, which should be a tag name. This
+ // might fault a little later on, but we detect that and this
+ // iteration will still be fine.
+ inTag = x;
+ }
+
+ if(inBrackets >= 0){
+ // look for a the close first
+ if(cc == "]"){ // if we're in a [...] clause and we end, do assignment
+ if(!_cp.attr){
+ // no attribute match was previously begun, so we
+ // assume this is an attribute existence match in the
+ // form of [someAttributeName]
+ _cp.attr = ts(inBrackets+1, x);
+ }else{
+ // we had an attribute already, so we know that we're
+ // matching some sort of value, as in [attrName=howdy]
+ _cp.matchFor = ts((inMatchFor||inBrackets+1), x);
+ }
+ var cmf = _cp.matchFor;
+ if(cmf){
+ // try to strip quotes from the matchFor value. We want
+ // [attrName=howdy] to match the same
+ // as [attrName = 'howdy' ]
+ if( (cmf.charAt(0) == '"') || (cmf.charAt(0) == "'") ){
+ _cp.matchFor = cmf.slice(1, -1);
+ }
+ }
+ // end the attribute by adding it to the list of attributes.
+ currentPart.attrs.push(_cp);
+ _cp = null; // necessary?
+ inBrackets = inMatchFor = -1;
+ }else if(cc == "="){
+ // if the last char was an operator prefix, make sure we
+ // record it along with the "=" operator.
+ var addToCc = ("|~^$*".indexOf(lc) >=0 ) ? lc : "";
+ _cp.type = addToCc+cc;
+ _cp.attr = ts(inBrackets+1, x-addToCc.length);
+ inMatchFor = x+1;
+ }
+ // now look for other clause parts
+ }else if(inParens >= 0){
+ // if we're in a parenthetical expression, we need to figure
+ // out if it's attached to a pseudo-selector rule like
+ // :nth-child(1)
+ if(cc == ")"){
+ if(inPseudo >= 0){
+ _cp.value = ts(inParens+1, x);
+ }
+ inPseudo = inParens = -1;
+ }
+ }else if(cc == "#"){
+ // start of an ID match
+ endAll();
+ inId = x+1;
+ }else if(cc == "."){
+ // start of a class match
+ endAll();
+ inClass = x;
+ }else if(cc == ":"){
+ // start of a pseudo-selector match
+ endAll();
+ inPseudo = x;
+ }else if(cc == "["){
+ // start of an attribute match.
+ endAll();
+ inBrackets = x;
+ // provide a new structure for the attribute match to fill-in
+ _cp = {
+ /*=====
+ attr: null, type: null, matchFor: null
+ =====*/
+ };
+ }else if(cc == "("){
+ // we really only care if we've entered a parenthetical
+ // expression if we're already inside a pseudo-selector match
+ if(inPseudo >= 0){
+ // provide a new structure for the pseudo match to fill-in
+ _cp = {
+ name: ts(inPseudo+1, x),
+ value: null
+ };
+ currentPart.pseudos.push(_cp);
+ }
+ inParens = x;
+ }else if(
+ (cc == " ") &&
+ // if it's a space char and the last char is too, consume the
+ // current one without doing more work
+ (lc != cc)
+ ){
+ endPart();
+ }
+ }
+ return queryParts;
+ };
- 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);
- }
- },
+ ////////////////////////////////////////////////////////////////////////
+ // DOM query infrastructure
+ ////////////////////////////////////////////////////////////////////////
- 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);
- }
- }
-);
+ var agree = function(first, second){
+ // the basic building block of the yes/no chaining system. agree(f1,
+ // f2) generates a new function which returns the boolean results of
+ // both of the passed functions to a single logical-anded result. If
+ // either are not passed, the other is used exclusively.
+ if(!first){ return second; }
+ if(!second){ return first; }
-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)
+ return function(){
+ return first.apply(window, arguments) && second.apply(window, arguments);
+ }
};
-};
-(function(){
- var capitalize = function(word){
- return word.substring(0,1).toUpperCase() + word.substring(1);
+ var getArr = function(i, arr){
+ // helps us avoid array alloc when we don't need it
+ var r = arr||[]; // FIXME: should this be 'new d._NodeListCtor()' ?
+ if(i){ r.push(i); }
+ return r;
};
- var size = function(widget, dim){
- // size the child
- var newSize = widget.resize ? widget.resize(dim) : dojo.marginBox(widget.domNode, dim);
+ var _isElement = function(n){ return (1 == n.nodeType); };
- // 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);
+ // FIXME: need to coalesce _getAttr with defaultGetter
+ var blank = "";
+ var _getAttr = function(elem, attr){
+ if(!elem){ return blank; }
+ if(attr == "class"){
+ return elem.className || blank;
}
+ if(attr == "for"){
+ return elem.htmlFor || blank;
+ }
+ if(attr == "style"){
+ return elem.style.cssText || blank;
+ }
+ return (caseSensitive ? elem.getAttribute(attr) : elem.getAttribute(attr, 2)) || blank;
};
- 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);
+ var attrs = {
+ "*=": function(attr, value){
+ return function(elem){
+ // E[foo*="bar"]
+ // an E element whose "foo" attribute value contains
+ // the substring "bar"
+ return (_getAttr(elem, attr).indexOf(value)>=0);
+ }
+ },
+ "^=": function(attr, value){
+ // E[foo^="bar"]
+ // an E element whose "foo" attribute value begins exactly
+ // with the string "bar"
+ return function(elem){
+ return (_getAttr(elem, attr).indexOf(value)==0);
+ }
+ },
+ "$=": function(attr, value){
+ // E[foo$="bar"]
+ // an E element whose "foo" attribute value ends exactly
+ // with the string "bar"
+ return function(elem){
+ var ea = " "+_getAttr(elem, attr);
+ return (ea.lastIndexOf(value)==(ea.length-value.length));
+ }
+ },
+ "~=": function(attr, value){
+ // E[foo~="bar"]
+ // an E element whose "foo" attribute value is a list of
+ // space-separated values, one of which is exactly equal
+ // to "bar"
+
+ // return "[contains(concat(' ',@"+attr+",' '), ' "+ value +" ')]";
+ var tval = " "+value+" ";
+ return function(elem){
+ var ea = " "+_getAttr(elem, attr)+" ";
+ return (ea.indexOf(tval)>=0);
+ }
+ },
+ "|=": function(attr, value){
+ // E[hreflang|="en"]
+ // an E element whose "hreflang" attribute has a
+ // hyphen-separated list of values beginning (from the
+ // left) with "en"
+ var valueDash = value+"-";
+ return function(elem){
+ var ea = _getAttr(elem, attr);
+ return (
+ (ea == value) ||
+ (ea.indexOf(valueDash)==0)
+ );
+ }
+ },
+ "=": function(attr, value){
+ return function(elem){
+ return (_getAttr(elem, attr) == value);
+ }
+ }
+ };
- dojo.addClass(container, "dijitLayoutContainer");
+ // avoid testing for node type if we can. Defining this in the negative
+ // here to avoid negation in the fast path.
+ var _noNES = (typeof getDoc().firstChild.nextElementSibling == "undefined");
+ var _ns = !_noNES ? "nextElementSibling" : "nextSibling";
+ var _ps = !_noNES ? "previousElementSibling" : "previousSibling";
+ var _simpleNodeTest = (_noNES ? _isElement : yesman);
- // 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"; }));
+ var _lookLeft = function(node){
+ // look left
+ while(node = node[_ps]){
+ if(_simpleNodeTest(node)){ return false; }
+ }
+ return true;
+ };
- // set positions/sizes
- dojo.forEach(children, function(child){
- var elm = child.domNode,
- pos = (child.region || child.layoutAlign);
+ var _lookRight = function(node){
+ // look right
+ while(node = node[_ns]){
+ if(_simpleNodeTest(node)){ return false; }
+ }
+ return true;
+ };
- // 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";
+ var getNodeIndex = function(node){
+ var root = node.parentNode;
+ var i = 0,
+ tret = root.children || root.childNodes,
+ ci = (node["_i"]||-1),
+ cl = (root["_l"]||-1);
+
+ if(!tret){ return -1; }
+ var l = tret.length;
+
+ // we calculate the parent length as a cheap way to invalidate the
+ // cache. It's not 100% accurate, but it's much more honest than what
+ // other libraries do
+ if( cl == l && ci >= 0 && cl >= 0 ){
+ // if it's legit, tag and release
+ return ci;
+ }
+
+ // else re-key things
+ root["_l"] = l;
+ ci = -1;
+ for(var te = root["firstElementChild"]||root["firstChild"]; te; te = te[_ns]){
+ if(_simpleNodeTest(te)){
+ te["_i"] = ++i;
+ if(node === te){
+ // NOTE:
+ // shortcutting the return at this step in indexing works
+ // very well for benchmarking but we avoid it here since
+ // it leads to potential O(n^2) behavior in sequential
+ // getNodexIndex operations on a previously un-indexed
+ // parent. We may revisit this at a later time, but for
+ // now we just want to get the right answer more often
+ // than not.
+ ci = i;
+ }
+ }
+ }
+ return ci;
+ };
- dojo.addClass(elm, "dijitAlign" + capitalize(pos));
+ var isEven = function(elem){
+ return !((getNodeIndex(elem)) % 2);
+ };
- // Size adjustments to make to this child widget
- var sizeSetting = {};
+ var isOdd = function(elem){
+ return ((getNodeIndex(elem)) % 2);
+ };
- // 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;
+ var pseudos = {
+ "checked": function(name, condition){
+ return function(elem){
+ return !!("checked" in elem ? elem.checked : elem.selected);
}
-
- // 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";
+ },
+ "first-child": function(){ return _lookLeft; },
+ "last-child": function(){ return _lookRight; },
+ "only-child": function(name, condition){
+ return function(node){
+ return _lookLeft(node) && _lookRight(node);
+ };
+ },
+ "empty": function(name, condition){
+ return function(elem){
+ // DomQuery and jQuery get this wrong, oddly enough.
+ // The CSS 3 selectors spec is pretty explicit about it, too.
+ var cn = elem.childNodes;
+ var cnl = elem.childNodes.length;
+ // if(!cnl){ return true; }
+ for(var x=cnl-1; x >= 0; x--){
+ var nt = cn[x].nodeType;
+ if((nt === 1)||(nt == 3)){ return false; }
}
- }else if(pos == "left" || pos == "right"){
- sizeSetting.h = dim.h;
- size(child, sizeSetting);
- dim.w -= child.w;
- if(pos == "left"){
- dim.l += child.w;
+ return true;
+ }
+ },
+ "contains": function(name, condition){
+ var cz = condition.charAt(0);
+ if( cz == '"' || cz == "'" ){ //remove quote
+ condition = condition.slice(1, -1);
+ }
+ return function(elem){
+ return (elem.innerHTML.indexOf(condition) >= 0);
+ }
+ },
+ "not": function(name, condition){
+ var p = getQueryParts(condition)[0];
+ var ignores = { el: 1 };
+ if(p.tag != "*"){
+ ignores.tag = 1;
+ }
+ if(!p.classes.length){
+ ignores.classes = 1;
+ }
+ var ntf = getSimpleFilterFunc(p, ignores);
+ return function(elem){
+ return (!ntf(elem));
+ }
+ },
+ "nth-child": function(name, condition){
+ var pi = parseInt;
+ // avoid re-defining function objects if we can
+ if(condition == "odd"){
+ return isOdd;
+ }else if(condition == "even"){
+ return isEven;
+ }
+ // FIXME: can we shorten this?
+ if(condition.indexOf("n") != -1){
+ var tparts = condition.split("n", 2);
+ var pred = tparts[0] ? ((tparts[0] == '-') ? -1 : pi(tparts[0])) : 1;
+ var idx = tparts[1] ? pi(tparts[1]) : 0;
+ var lb = 0, ub = -1;
+ if(pred > 0){
+ if(idx < 0){
+ idx = (idx % pred) && (pred + (idx % pred));
+ }else if(idx>0){
+ if(idx >= pred){
+ lb = idx - idx % pred;
+ }
+ idx = idx % pred;
+ }
+ }else if(pred<0){
+ pred *= -1;
+ // idx has to be greater than 0 when pred is negative;
+ // shall we throw an error here?
+ if(idx > 0){
+ ub = idx;
+ idx = idx % pred;
+ }
+ }
+ if(pred > 0){
+ return function(elem){
+ var i = getNodeIndex(elem);
+ return (i>=lb) && (ub<0 || i<=ub) && ((i % pred) == idx);
+ }
}else{
- elmStyle.left = dim.l + dim.w + "px";
+ condition = idx;
}
- }else if(pos == "client" || pos == "center"){
- size(child, dim);
}
- });
+ var ncount = pi(condition);
+ return function(elem){
+ return (getNodeIndex(elem) == ncount);
+ }
+ }
};
-})();
+ var defaultGetter = (dojo.isIE && (dojo.isIE < 9 || dojo.isQuirks)) ? function(cond){
+ var clc = cond.toLowerCase();
+ if(clc == "class"){ cond = "className"; }
+ return function(elem){
+ return (caseSensitive ? elem.getAttribute(cond) : elem[cond]||elem[clc]);
+ }
+ } : function(cond){
+ return function(elem){
+ return (elem && elem.getAttribute && elem.hasAttribute(cond));
+ }
+ };
-}
+ var getSimpleFilterFunc = function(query, ignores){
+ // generates a node tester function based on the passed query part. The
+ // query part is one of the structures generated by the query parser
+ // when it creates the query AST. The "ignores" object specifies which
+ // (if any) tests to skip, allowing the system to avoid duplicating
+ // work where it may have already been taken into account by other
+ // factors such as how the nodes to test were fetched in the first
+ // place
+ if(!query){ return yesman; }
+ ignores = ignores||{};
-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");
+ var ff = null;
+ if(!("el" in ignores)){
+ ff = agree(ff, _isElement);
+ }
-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).
+ if(!("tag" in ignores)){
+ if(query.tag != "*"){
+ ff = agree(ff, function(elem){
+ return (elem && (elem.tagName == query.getTag()));
+ });
+ }
+ }
- // 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: {},
+ if(!("classes" in ignores)){
+ each(query.classes, function(cname, idx, arr){
+ // get the class name
+ /*
+ var isWildcard = cname.charAt(cname.length-1) == "*";
+ if(isWildcard){
+ cname = cname.substr(0, cname.length-1);
+ }
+ // I dislike the regex thing, even if memoized in a cache, but it's VERY short
+ var re = new RegExp("(?:^|\\s)" + cname + (isWildcard ? ".*" : "") + "(?:\\s|$)");
+ */
+ var re = new RegExp("(?:^|\\s)" + cname + "(?:\\s|$)");
+ ff = agree(ff, function(elem){
+ return re.test(elem.className);
+ });
+ ff.count = idx;
+ });
+ }
- // 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,
+ if(!("pseudos" in ignores)){
+ each(query.pseudos, function(pseudo){
+ var pn = pseudo.name;
+ if(pseudos[pn]){
+ ff = agree(ff, pseudos[pn](pn, pseudo.value));
+ }
+ });
+ }
- _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.
+ if(!("attrs" in ignores)){
+ each(query.attrs, function(attr){
+ var matcher;
+ var a = attr.attr;
+ // type, attr, matchFor
+ if(attr.type && attrs[attr.type]){
+ matcher = attrs[attr.type](a, attr.matchFor);
+ }else if(a.length){
+ matcher = defaultGetter(a);
+ }
+ if(matcher){
+ ff = agree(ff, matcher);
+ }
+ });
+ }
- this.inherited(arguments);
+ if(!("id" in ignores)){
+ if(query.id){
+ ff = agree(ff, function(elem){
+ return (!!elem && (elem.id == query.id));
+ });
+ }
+ }
- // 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);
+ if(!ff){
+ if(!("default" in ignores)){
+ ff = yesman;
+ }
+ }
+ return ff;
+ };
- // Events on sub nodes within the widget
- for(var ap in this.cssStateNodes){
- this._trackMouseState(this[ap], this.cssStateNodes[ap]);
+ var _nextSibling = function(filterFunc){
+ return function(node, ret, bag){
+ while(node = node[_ns]){
+ if(_noNES && (!_isElement(node))){ continue; }
+ if(
+ (!bag || _isUnique(node, bag)) &&
+ filterFunc(node)
+ ){
+ ret.push(node);
+ }
+ break;
+ }
+ return ret;
}
- // 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.
+ var _nextSiblings = function(filterFunc){
+ return function(root, ret, bag){
+ var te = root[_ns];
+ while(te){
+ if(_simpleNodeTest(te)){
+ if(bag && !_isUnique(te, bag)){
+ break;
+ }
+ if(filterFunc(te)){
+ ret.push(te);
+ }
+ }
+ te = te[_ns];
+ }
+ return ret;
+ }
+ };
- 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;
+ // get an array of child *elements*, skipping text and comment nodes
+ var _childElements = function(filterFunc){
+ filterFunc = filterFunc||yesman;
+ return function(root, ret, bag){
+ // get an array of child elements, skipping text and comment nodes
+ var te, x = 0, tret = root.children || root.childNodes;
+ while(te = tret[x++]){
+ if(
+ _simpleNodeTest(te) &&
+ (!bag || _isUnique(te, bag)) &&
+ (filterFunc(te, x))
+ ){
+ ret.push(te);
+ }
+ }
+ return ret;
+ };
+ };
- case "mouseleave":
- case "mouseout": // generated on non-IE browsers even though we connected to mouseleave
- this._set("hovering", false);
- this._set("active", false);
- break;
+ /*
+ // thanks, Dean!
+ var itemIsAfterRoot = d.isIE ? function(item, root){
+ return (item.sourceIndex > root.sourceIndex);
+ } : function(item, root){
+ return (item.compareDocumentPosition(root) == 2);
+ };
+ */
- 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;
+ // test to see if node is below root
+ var _isDescendant = function(node, root){
+ var pn = node.parentNode;
+ while(pn){
+ if(pn == root){
+ break;
}
+ pn = pn.parentNode;
}
- },
+ return !!pn;
+ };
- _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).
+ var _getElementsFuncCache = {};
+
+ var getElementsFunc = function(query){
+ var retFunc = _getElementsFuncCache[query.query];
+ // if we've got a cached dispatcher, just use that
+ if(retFunc){ return retFunc; }
+ // else, generate a new on
+
+ // NOTE:
+ // this function returns a function that searches for nodes and
+ // filters them. The search may be specialized by infix operators
+ // (">", "~", or "+") else it will default to searching all
+ // descendants (the " " selector). Once a group of children is
+ // found, a test function is applied to weed out the ones we
+ // don't want. Many common cases can be fast-pathed. We spend a
+ // lot of cycles to create a dispatcher that doesn't do more work
+ // than necessary at any point since, unlike this function, the
+ // dispatchers will be called every time. The logic of generating
+ // efficient dispatchers looks like this in pseudo code:
//
- // 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".
+ // # if it's a purely descendant query (no ">", "+", or "~" modifiers)
+ // if infixOperator == " ":
+ // if only(id):
+ // return def(root):
+ // return d.byId(id, root);
//
- // 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
+ // elif id:
+ // return def(root):
+ // return filter(d.byId(id, root));
//
- // 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
+ // elif cssClass && getElementsByClassName:
+ // return def(root):
+ // return filter(root.getElementsByClassName(cssClass));
+ //
+ // elif only(tag):
+ // return def(root):
+ // return root.getElementsByTagName(tagName);
+ //
+ // else:
+ // # search by tag name, then filter
+ // return def(root):
+ // return filter(root.getElementsByTagName(tagName||"*"));
+ //
+ // elif infixOperator == ">":
+ // # search direct children
+ // return def(root):
+ // return filter(root.children);
+ //
+ // elif infixOperator == "+":
+ // # search next sibling
+ // return def(root):
+ // return filter(root.nextElementSibling);
+ //
+ // elif infixOperator == "~":
+ // # search rightward siblings
+ // return def(root):
+ // return filter(nextSiblings(root));
+
+ var io = query.infixOper;
+ var oper = (io ? io.oper : "");
+ // the default filter func which tests for all conditions in the query
+ // part. This is potentially inefficient, so some optimized paths may
+ // re-define it to test fewer things.
+ var filterFunc = getSimpleFilterFunc(query, { el: 1 });
+ var qt = query.tag;
+ var wildcardTag = ("*" == qt);
+ var ecs = getDoc()["getElementsByClassName"];
+
+ if(!oper){
+ // if there's no infix operator, then it's a descendant query. ID
+ // and "elements by class name" variants can be accelerated so we
+ // call them out explicitly:
+ if(query.id){
+ // testing shows that the overhead of yesman() is acceptable
+ // and can save us some bytes vs. re-defining the function
+ // everywhere.
+ filterFunc = (!query.loops && wildcardTag) ?
+ yesman :
+ getSimpleFilterFunc(query, { el: 1, id: 1 });
+
+ retFunc = function(root, arr){
+ var te = dom.byId(query.id, (root.ownerDocument||root));
+ if(!te || !filterFunc(te)){ return; }
+ if(9 == root.nodeType){ // if root's a doc, we just return directly
+ return getArr(te, arr);
+ }else{ // otherwise check ancestry
+ if(_isDescendant(te, root)){
+ return getArr(te, arr);
+ }
+ }
+ }
+ }else if(
+ ecs &&
+ // isAlien check. Workaround for Prototype.js being totally evil/dumb.
+ /\{\s*\[native code\]\s*\}/.test(String(ecs)) &&
+ query.classes.length &&
+ !cssCaseBug
+ ){
+ // it's a class-based query and we've got a fast way to run it.
+
+ // ignore class and ID filters since we will have handled both
+ filterFunc = getSimpleFilterFunc(query, { el: 1, classes: 1, id: 1 });
+ var classesString = query.classes.join(" ");
+ retFunc = function(root, arr, bag){
+ var ret = getArr(0, arr), te, x=0;
+ var tret = root.getElementsByClassName(classesString);
+ while((te = tret[x++])){
+ if(filterFunc(te, root) && _isUnique(te, bag)){
+ ret.push(te);
+ }
+ }
+ return ret;
+ };
- // Compute new set of classes
- var newStateClasses = this.baseClass.split(" ");
+ }else if(!wildcardTag && !query.loops){
+ // it's tag only. Fast-path it.
+ retFunc = function(root, arr, bag){
+ var ret = getArr(0, arr), te, x=0;
+ var tret = root.getElementsByTagName(query.getTag());
+ while((te = tret[x++])){
+ if(_isUnique(te, bag)){
+ ret.push(te);
+ }
+ }
+ return ret;
+ };
+ }else{
+ // the common case:
+ // a descendant selector without a fast path. By now it's got
+ // to have a tag selector, even if it's just "*" so we query
+ // by that and filter
+ filterFunc = getSimpleFilterFunc(query, { el: 1, tag: 1, id: 1 });
+ retFunc = function(root, arr, bag){
+ var ret = getArr(0, arr), te, x=0;
+ // we use getTag() to avoid case sensitivity issues
+ var tret = root.getElementsByTagName(query.getTag());
+ while((te = tret[x++])){
+ if(filterFunc(te, root) && _isUnique(te, bag)){
+ ret.push(te);
+ }
+ }
+ return ret;
+ };
+ }
+ }else{
+ // the query is scoped in some way. Instead of querying by tag we
+ // use some other collection to find candidate nodes
+ var skipFilters = { el: 1 };
+ if(wildcardTag){
+ skipFilters.tag = 1;
+ }
+ filterFunc = getSimpleFilterFunc(query, skipFilters);
+ if("+" == oper){
+ retFunc = _nextSibling(filterFunc);
+ }else if("~" == oper){
+ retFunc = _nextSiblings(filterFunc);
+ }else if(">" == oper){
+ retFunc = _childElements(filterFunc);
+ }
+ }
+ // cache it and return
+ return _getElementsFuncCache[query.query] = retFunc;
+ };
- function multiply(modifier){
- newStateClasses = newStateClasses.concat(dojo.map(newStateClasses, function(c){ return c+modifier; }), "dijit"+modifier);
+ var filterDown = function(root, queryParts){
+ // NOTE:
+ // this is the guts of the DOM query system. It takes a list of
+ // parsed query parts and a root and finds children which match
+ // the selector represented by the parts
+ var candidates = getArr(root), qp, x, te, qpl = queryParts.length, bag, ret;
+
+ for(var i = 0; i < qpl; i++){
+ ret = [];
+ qp = queryParts[i];
+ x = candidates.length - 1;
+ if(x > 0){
+ // if we have more than one root at this level, provide a new
+ // hash to use for checking group membership but tell the
+ // system not to post-filter us since we will already have been
+ // gauranteed to be unique
+ bag = {};
+ ret.nozip = true;
+ }
+ var gef = getElementsFunc(qp);
+ for(var j = 0; (te = candidates[j]); j++){
+ // for every root, get the elements that match the descendant
+ // selector, adding them to the "ret" array and filtering them
+ // via membership in this level's bag. If there are more query
+ // parts, then this level's return will be used as the next
+ // level's candidates
+ gef(te, ret, bag);
+ }
+ if(!ret.length){ break; }
+ candidates = ret;
}
+ return ret;
+ };
- if(!this.isLeftToRight()){
- // For RTL mode we need to set an addition class like dijitTextBoxRtl.
- multiply("Rtl");
- }
+ ////////////////////////////////////////////////////////////////////////
+ // the query runner
+ ////////////////////////////////////////////////////////////////////////
- if(this.checked){
- multiply("Checked");
- }
- if(this.state){
- multiply(this.state);
- }
- if(this.selected){
- multiply("Selected");
- }
+ // these are the primary caches for full-query results. The query
+ // dispatcher functions are generated then stored here for hash lookup in
+ // the future
+ var _queryFuncCacheDOM = {},
+ _queryFuncCacheQSA = {};
- if(this.disabled){
- multiply("Disabled");
- }else if(this.readOnly){
- multiply("ReadOnly");
- }else{
- if(this.active){
- multiply("Active");
- }else if(this.hovering){
- multiply("Hover");
+ // this is the second level of spliting, from full-length queries (e.g.,
+ // "div.foo .bar") into simple query expressions (e.g., ["div.foo",
+ // ".bar"])
+ var getStepQueryFunc = function(query){
+ var qparts = getQueryParts(trim(query));
+
+ // if it's trivial, avoid iteration and zipping costs
+ if(qparts.length == 1){
+ // we optimize this case here to prevent dispatch further down the
+ // chain, potentially slowing things down. We could more elegantly
+ // handle this in filterDown(), but it's slower for simple things
+ // that need to be fast (e.g., "#someId").
+ var tef = getElementsFunc(qparts[0]);
+ return function(root){
+ var r = tef(root, []);
+ if(r){ r.nozip = true; }
+ return r;
}
}
- if(this._focused){
- multiply("Focused");
+ // otherwise, break it up and return a runner that iterates over the parts recursively
+ return function(root){
+ return filterDown(root, qparts);
}
+ };
- // 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
+ // NOTES:
+ // * we can't trust QSA for anything but document-rooted queries, so
+ // caching is split into DOM query evaluators and QSA query evaluators
+ // * caching query results is dirty and leak-prone (or, at a minimum,
+ // prone to unbounded growth). Other toolkits may go this route, but
+ // they totally destroy their own ability to manage their memory
+ // footprint. If we implement it, it should only ever be with a fixed
+ // total element reference # limit and an LRU-style algorithm since JS
+ // has no weakref support. Caching compiled query evaluators is also
+ // potentially problematic, but even on large documents the size of the
+ // query evaluators is often < 100 function objects per evaluator (and
+ // LRU can be applied if it's ever shown to be an issue).
+ // * since IE's QSA support is currently only for HTML documents and even
+ // then only in IE 8's "standards mode", we have to detect our dispatch
+ // route at query time and keep 2 separate caches. Ugg.
+
+ // we need to determine if we think we can run a given query via
+ // querySelectorAll or if we'll need to fall back on DOM queries to get
+ // there. We need a lot of information about the environment and the query
+ // to make the determiniation (e.g. does it support QSA, does the query in
+ // question work in the native QSA impl, etc.).
+ var nua = navigator.userAgent;
+ // some versions of Safari provided QSA, but it was buggy and crash-prone.
+ // We need te detect the right "internal" webkit version to make this work.
+ var wk = "WebKit/";
+ var is525 = (
+ dojo.isWebKit &&
+ (nua.indexOf(wk) > 0) &&
+ (parseFloat(nua.split(wk)[1]) > 528)
+ );
- dojo.forEach(tn.className.split(" "), function(c){ classHash[c] = true; });
+ // IE QSA queries may incorrectly include comment nodes, so we throw the
+ // zipping function into "remove" comments mode instead of the normal "skip
+ // it" which every other QSA-clued browser enjoys
+ var noZip = dojo.isIE ? "commentStrip" : "nozip";
- if("_stateClasses" in this){
- dojo.forEach(this._stateClasses, function(c){ delete classHash[c]; });
- }
+ var qsa = "querySelectorAll";
+ var qsaAvail = (
+ !!getDoc()[qsa] &&
+ // see #5832
+ (!dojo.isSafari || (dojo.isSafari > 3.1) || is525 )
+ );
- dojo.forEach(newStateClasses, function(c){ classHash[c] = true; });
+ //Don't bother with n+3 type of matches, IE complains if we modify those.
+ var infixSpaceRe = /n\+\d|([^ ])?([>~+])([^ =])?/g;
+ var infixSpaceFunc = function(match, pre, ch, post){
+ return ch ? (pre ? pre + " " : "") + ch + (post ? " " + post : "") : /*n+3*/ match;
+ };
- var newClasses = [];
- for(var c in classHash){
- newClasses.push(c);
+ var getQueryFunc = function(query, forceDOM){
+ //Normalize query. The CSS3 selectors spec allows for omitting spaces around
+ //infix operators, >, ~ and +
+ //Do the work here since detection for spaces is used as a simple "not use QSA"
+ //test below.
+ query = query.replace(infixSpaceRe, infixSpaceFunc);
+
+ if(qsaAvail){
+ // if we've got a cached variant and we think we can do it, run it!
+ var qsaCached = _queryFuncCacheQSA[query];
+ if(qsaCached && !forceDOM){ return qsaCached; }
}
- tn.className = newClasses.join(" ");
- this._stateClasses = newStateClasses;
- },
+ // else if we've got a DOM cached variant, assume that we already know
+ // all we need to and use it
+ var domCached = _queryFuncCacheDOM[query];
+ if(domCached){ return domCached; }
- _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).
+ // TODO:
+ // today we're caching DOM and QSA branches separately so we
+ // recalc useQSA every time. If we had a way to tag root+query
+ // efficiently, we'd be in good shape to do a global cache.
+
+ var qcz = query.charAt(0);
+ var nospace = (-1 == query.indexOf(" "));
+
+ // byId searches are wicked fast compared to QSA, even when filtering
+ // is required
+ if( (query.indexOf("#") >= 0) && (nospace) ){
+ forceDOM = true;
+ }
+
+ var useQSA = (
+ qsaAvail && (!forceDOM) &&
+ // as per CSS 3, we can't currently start w/ combinator:
+ // http://www.w3.org/TR/css3-selectors/#w3cselgrammar
+ (specials.indexOf(qcz) == -1) &&
+ // IE's QSA impl sucks on pseudos
+ (!dojo.isIE || (query.indexOf(":") == -1)) &&
+
+ (!(cssCaseBug && (query.indexOf(".") >= 0))) &&
+
+ // FIXME:
+ // need to tighten up browser rules on ":contains" and "|=" to
+ // figure out which aren't good
+ // Latest webkit (around 531.21.8) does not seem to do well with :checked on option
+ // elements, even though according to spec, selected options should
+ // match :checked. So go nonQSA for it:
+ // http://bugs.dojotoolkit.org/ticket/5179
+ (query.indexOf(":contains") == -1) && (query.indexOf(":checked") == -1) &&
+ (query.indexOf("|=") == -1) // some browsers don't grok it
+ );
- // 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;
+ // TODO:
+ // if we've got a descendant query (e.g., "> .thinger" instead of
+ // just ".thinger") in a QSA-able doc, but are passed a child as a
+ // root, it should be possible to give the item a synthetic ID and
+ // trivially rewrite the query to the form "#synid > .thinger" to
+ // use the QSA branch
- 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);
+ if(useQSA){
+ var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ?
+ (query + " *") : query;
+ return _queryFuncCacheQSA[query] = function(root){
+ try{
+ // the QSA system contains an egregious spec bug which
+ // limits us, effectively, to only running QSA queries over
+ // entire documents. See:
+ // http://ejohn.org/blog/thoughts-on-queryselectorall/
+ // despite this, we can also handle QSA runs on simple
+ // selectors, but we don't want detection to be expensive
+ // so we're just checking for the presence of a space char
+ // right now. Not elegant, but it's cheaper than running
+ // the query parser when we might not need to
+ if(!((9 == root.nodeType) || nospace)){ throw ""; }
+ var r = root[qsa](tq);
+ // skip expensive duplication checks and just wrap in a NodeList
+ r[noZip] = true;
+ return r;
+ }catch(e){
+ // else run the DOM branch on this query, ensuring that we
+ // default that way in the future
+ return getQueryFunc(query, true)(root);
+ }
+ }
+ }else{
+ // DOM branch
+ var parts = query.split(/\s*,\s*/);
+ return _queryFuncCacheDOM[query] = ((parts.length < 2) ?
+ // if not a compound query (e.g., ".foo, .bar"), cache and return a dispatcher
+ getStepQueryFunc(query) :
+ // if it *is* a complex query, break it up into its
+ // constituent parts and return a dispatcher that will
+ // merge the parts when run
+ function(root){
+ var pindex = 0, // avoid array alloc for every invocation
+ ret = [],
+ tp;
+ while((tp = parts[pindex++])){
+ ret = ret.concat(getStepQueryFunc(tp)(root));
+ }
+ return ret;
+ }
+ );
}
+ };
- // 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();
- });
+ var _zipIdx = 0;
- // Focus
- cn("onfocus", function(){
- focused = true;
- setClass();
- });
- cn("onblur", function(){
- focused = false;
- setClass();
- });
+ // NOTE:
+ // this function is Moo inspired, but our own impl to deal correctly
+ // with XML in IE
+ var _nodeUID = dojo.isIE ? function(node){
+ if(caseSensitive){
+ // XML docs don't have uniqueID on their nodes
+ return (node.getAttribute("_uid") || node.setAttribute("_uid", ++_zipIdx) || _zipIdx);
- // 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);
- }
-});
+ }else{
+ return node.uniqueID;
+ }
+ } :
+ function(node){
+ return (node._uid || (node._uid = ++_zipIdx));
+ };
-}
+ // determine if a node in is unique in a "bag". In this case we don't want
+ // to flatten a list of unique items, but rather just tell if the item in
+ // question is already in the bag. Normally we'd just use hash lookup to do
+ // this for us but IE's DOM is busted so we can't really count on that. On
+ // the upside, it gives us a built in unique ID function.
+ var _isUnique = function(node, bag){
+ if(!bag){ return 1; }
+ var id = _nodeUID(node);
+ if(!bag[id]){ return bag[id] = 1; }
+ return 0;
+ };
+
+ // attempt to efficiently determine if an item in a list is a dupe,
+ // returning a list of "uniques", hopefully in doucment order
+ var _zipIdxName = "_zipIdx";
+ var _zip = function(arr){
+ if(arr && arr.nozip){
+ return arr;
+ }
+ var ret = [];
+ if(!arr || !arr.length){ return ret; }
+ if(arr[0]){
+ ret.push(arr[0]);
+ }
+ if(arr.length < 2){ return ret; }
+
+ _zipIdx++;
+
+ // we have to fork here for IE and XML docs because we can't set
+ // expandos on their nodes (apparently). *sigh*
+ if(dojo.isIE && caseSensitive){
+ var szidx = _zipIdx+"";
+ arr[0].setAttribute(_zipIdxName, szidx);
+ for(var x = 1, te; te = arr[x]; x++){
+ if(arr[x].getAttribute(_zipIdxName) != szidx){
+ ret.push(te);
+ }
+ te.setAttribute(_zipIdxName, szidx);
+ }
+ }else if(dojo.isIE && arr.commentStrip){
+ try{
+ for(var x = 1, te; te = arr[x]; x++){
+ if(_isElement(te)){
+ ret.push(te);
+ }
+ }
+ }catch(e){ /* squelch */ }
+ }else{
+ if(arr[0]){ arr[0][_zipIdxName] = _zipIdx; }
+ for(var x = 1, te; te = arr[x]; x++){
+ if(arr[x][_zipIdxName] != _zipIdx){
+ ret.push(te);
+ }
+ te[_zipIdxName] = _zipIdx;
+ }
+ }
+ return ret;
+ };
-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");
+ // the main executor
+ var query = function(/*String*/ query, /*String|DOMNode?*/ root){
+ // summary:
+ // Returns nodes which match the given CSS3 selector, searching the
+ // entire document by default but optionally taking a node to scope
+ // the search by. Returns an array.
+ // description:
+ // dojo.query() is the swiss army knife of DOM node manipulation in
+ // Dojo. Much like Prototype's "$$" (bling-bling) function or JQuery's
+ // "$" function, dojo.query provides robust, high-performance
+ // CSS-based node selector support with the option of scoping searches
+ // to a particular sub-tree of a document.
+ //
+ // Supported Selectors:
+ // --------------------
+ //
+ // acme supports a rich set of CSS3 selectors, including:
+ //
+ // * class selectors (e.g., `.foo`)
+ // * node type selectors like `span`
+ // * ` ` descendant selectors
+ // * `>` child element selectors
+ // * `#foo` style ID selectors
+ // * `*` universal selector
+ // * `~`, the preceded-by sibling selector
+ // * `+`, the immediately preceded-by sibling selector
+ // * attribute queries:
+ // | * `[foo]` attribute presence selector
+ // | * `[foo='bar']` attribute value exact match
+ // | * `[foo~='bar']` attribute value list item match
+ // | * `[foo^='bar']` attribute start match
+ // | * `[foo$='bar']` attribute end match
+ // | * `[foo*='bar']` attribute substring match
+ // * `:first-child`, `:last-child`, and `:only-child` positional selectors
+ // * `:empty` content emtpy selector
+ // * `:checked` pseudo selector
+ // * `:nth-child(n)`, `:nth-child(2n+1)` style positional calculations
+ // * `:nth-child(even)`, `:nth-child(odd)` positional selectors
+ // * `:not(...)` negation pseudo selectors
+ //
+ // Any legal combination of these selectors will work with
+ // `dojo.query()`, including compound selectors ("," delimited).
+ // Very complex and useful searches can be constructed with this
+ // palette of selectors and when combined with functions for
+ // manipulation presented by dojo.NodeList, many types of DOM
+ // manipulation operations become very straightforward.
+ //
+ // Unsupported Selectors:
+ // ----------------------
+ //
+ // While dojo.query handles many CSS3 selectors, some fall outside of
+ // what's reasonable for a programmatic node querying engine to
+ // handle. Currently unsupported selectors include:
+ //
+ // * namespace-differentiated selectors of any form
+ // * all `::` pseduo-element selectors
+ // * certain pseduo-selectors which don't get a lot of day-to-day use:
+ // | * `:root`, `:lang()`, `:target`, `:focus`
+ // * all visual and state selectors:
+ // | * `:root`, `:active`, `:hover`, `:visisted`, `:link`,
+ // `:enabled`, `:disabled`
+ // * `:*-of-type` pseudo selectors
+ //
+ // dojo.query and XML Documents:
+ // -----------------------------
+ //
+ // `dojo.query` (as of dojo 1.2) supports searching XML documents
+ // in a case-sensitive manner. If an HTML document is served with
+ // a doctype that forces case-sensitivity (e.g., XHTML 1.1
+ // Strict), dojo.query() will detect this and "do the right
+ // thing". Case sensitivity is dependent upon the document being
+ // searched and not the query used. It is therefore possible to
+ // use case-sensitive queries on strict sub-documents (iframes,
+ // etc.) or XML documents while still assuming case-insensitivity
+ // for a host/root document.
+ //
+ // Non-selector Queries:
+ // ---------------------
+ //
+ // If something other than a String is passed for the query,
+ // `dojo.query` will return a new `dojo.NodeList` instance
+ // constructed from that parameter alone and all further
+ // processing will stop. This means that if you have a reference
+ // to a node or NodeList, you can quickly construct a new NodeList
+ // from the original by calling `dojo.query(node)` or
+ // `dojo.query(list)`.
+ //
+ // query:
+ // The CSS3 expression to match against. For details on the syntax of
+ // CSS3 selectors, see <http://www.w3.org/TR/css3-selectors/#selectors>
+ // root:
+ // A DOMNode (or node id) to scope the search from. Optional.
+ // returns: Array
+ // example:
+ // search the entire document for elements with the class "foo":
+ // | dojo.query(".foo");
+ // these elements will match:
+ // | <span class="foo"></span>
+ // | <span class="foo bar"></span>
+ // | <p class="thud foo"></p>
+ // example:
+ // search the entire document for elements with the classes "foo" *and* "bar":
+ // | dojo.query(".foo.bar");
+ // these elements will match:
+ // | <span class="foo bar"></span>
+ // while these will not:
+ // | <span class="foo"></span>
+ // | <p class="thud foo"></p>
+ // example:
+ // find `<span>` elements which are descendants of paragraphs and
+ // which have a "highlighted" class:
+ // | dojo.query("p span.highlighted");
+ // the innermost span in this fragment matches:
+ // | <p class="foo">
+ // | <span>...
+ // | <span class="highlighted foo bar">...</span>
+ // | </span>
+ // | </p>
+ // example:
+ // set an "odd" class on all odd table rows inside of the table
+ // `#tabular_data`, using the `>` (direct child) selector to avoid
+ // affecting any nested tables:
+ // | dojo.query("#tabular_data > tbody > tr:nth-child(odd)").addClass("odd");
+ // example:
+ // remove all elements with the class "error" from the document
+ // and store them in a list:
+ // | var errors = dojo.query(".error").orphan();
+ // example:
+ // add an onclick handler to every submit button in the document
+ // which causes the form to be sent via Ajax instead:
+ // | dojo.query("input[type='submit']").onclick(function(e){
+ // | dojo.stopEvent(e); // prevent sending the form
+ // | var btn = e.target;
+ // | dojo.xhrPost({
+ // | form: btn.form,
+ // | load: function(data){
+ // | // replace the form with the response
+ // | var div = dojo.doc.createElement("div");
+ // | dojo.place(div, btn.form, "after");
+ // | div.innerHTML = data;
+ // | dojo.style(btn.form, "display", "none");
+ // | }
+ // | });
+ // | });
+ root = root||getDoc();
+ var od = root.ownerDocument||root.documentElement;
+ // throw the big case sensitivity switch
+ // NOTE:
+ // Opera in XHTML mode doesn't detect case-sensitivity correctly
+ // and it's not clear that there's any way to test for it
+ caseSensitive = (root.contentType && root.contentType=="application/xml") ||
+ (dojo.isOpera && (root.doctype || od.toString() == "[object XMLDocument]")) ||
+ (!!od) &&
+ (dojo.isIE ? od.xml : (root.xmlVersion || od.xmlVersion));
+ // NOTE:
+ // adding "true" as the 2nd argument to getQueryFunc is useful for
+ // testing the DOM branch without worrying about the
+ // behavior/performance of the QSA branch.
+ var r = getQueryFunc(query)(root);
+ // FIXME:
+ // need to investigate this branch WRT #8074 and #8075
+ if(r && r.nozip){
+ return r;
+ }
+ return _zip(r); // dojo.NodeList
+ };
+ query.filter = function(/*Node[]*/ nodeList, /*String*/ filter, /*String|DOMNode?*/ root){
+ // summary:
+ // function for filtering a NodeList based on a selector, optimized for simple selectors
+ var tmpNodeList = [],
+ parts = getQueryParts(filter),
+ filterFunc =
+ (parts.length == 1 && !/[^\w#\.]/.test(filter)) ?
+ getSimpleFilterFunc(parts[0]) :
+ function(node){
+ return dojo.query(filter, root).indexOf(node) != -1;
+ };
+ for(var x = 0, te; te = nodeList[x]; x++){
+ if(filterFunc(te)){ tmpNodeList.push(te); }
+ }
+ return tmpNodeList;
+ };
+ return query;
+});//end defineQuery
-dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated, dijit._CssStateMixin],
- {
+},
+'dojo/dnd/autoscroll':function(){
+define("dojo/dnd/autoscroll", ["../main", "../window"], function(dojo) {
+ // module:
+ // dojo/dnd/autoscroll
// 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.
+ // TODOC
- // 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: "",
+dojo.getObject("dnd", true, dojo);
- // value: String
- // Corresponds to the native HTML <input> element's attribute.
- value: "",
+dojo.dnd.getViewport = dojo.window.getBox;
- // type: String
- // Corresponds to the native HTML <input> element's attribute.
- type: "text",
+dojo.dnd.V_TRIGGER_AUTOSCROLL = 32;
+dojo.dnd.H_TRIGGER_AUTOSCROLL = 32;
- // tabIndex: Integer
- // Order fields are traversed when user hits the tab key
- tabIndex: "0",
+dojo.dnd.V_AUTOSCROLL_VALUE = 16;
+dojo.dnd.H_AUTOSCROLL_VALUE = 16;
- // disabled: Boolean
- // Should this widget respond to user input?
- // In markup, this is specified as "disabled='disabled'", or just "disabled".
- disabled: false,
+dojo.dnd.autoScroll = function(e){
+ // summary:
+ // a handler for onmousemove event, which scrolls the window, if
+ // necesary
+ // e: Event
+ // onmousemove event
- // intermediateChanges: Boolean
- // Fires onChange for each value change or only on demand
- intermediateChanges: false,
+ // FIXME: needs more docs!
+ var v = dojo.window.getBox(), dx = 0, dy = 0;
+ if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){
+ dx = -dojo.dnd.H_AUTOSCROLL_VALUE;
+ }else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){
+ dx = dojo.dnd.H_AUTOSCROLL_VALUE;
+ }
+ if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){
+ dy = -dojo.dnd.V_AUTOSCROLL_VALUE;
+ }else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){
+ dy = dojo.dnd.V_AUTOSCROLL_VALUE;
+ }
+ window.scrollBy(dx, dy);
+};
- // scrollOnFocus: Boolean
- // On focus, should this widget scroll into view?
- scrollOnFocus: true,
+dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1};
+dojo.dnd._validOverflow = {"auto": 1, "scroll": 1};
- // 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"
- }),
+dojo.dnd.autoScrollNodes = function(e){
+ // summary:
+ // a handler for onmousemove event, which scrolls the first avaialble
+ // Dom element, it falls back to dojo.dnd.autoScroll()
+ // e: Event
+ // onmousemove event
- 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);
- },
+ // FIXME: needs more docs!
- postCreate: function(){
- this.inherited(arguments);
- this.connect(this.domNode, "onmousedown", "_onMouseDown");
- },
+ var b, t, w, h, rx, ry, dx = 0, dy = 0, oldLeft, oldTop;
- _setDisabledAttr: function(/*Boolean*/ value){
- this._set("disabled", value);
- dojo.attr(this.focusNode, 'disabled', value);
- if(this.valueNode){
- dojo.attr(this.valueNode, 'disabled', value);
+ for(var n = e.target; n;){
+ if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){
+ var s = dojo.getComputedStyle(n),
+ overflow = (s.overflow.toLowerCase() in dojo.dnd._validOverflow),
+ overflowX = (s.overflowX.toLowerCase() in dojo.dnd._validOverflow),
+ overflowY = (s.overflowY.toLowerCase() in dojo.dnd._validOverflow);
+ if(overflow || overflowX || overflowY){
+ b = dojo._getContentBox(n, s);
+ t = dojo.position(n, true);
+ }
+ // overflow-x
+ if(overflow || overflowX){
+ w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2);
+ rx = e.pageX - t.x;
+ if(dojo.isWebKit || dojo.isOpera){
+ // FIXME: this code should not be here, it should be taken into account
+ // either by the event fixing code, or the dojo.position()
+ // FIXME: this code doesn't work on Opera 9.5 Beta
+ rx += dojo.body().scrollLeft;
+ }
+ dx = 0;
+ if(rx > 0 && rx < b.w){
+ if(rx < w){
+ dx = -w;
+ }else if(rx > b.w - w){
+ dx = w;
+ }
+ oldLeft = n.scrollLeft;
+ n.scrollLeft = n.scrollLeft + dx;
+ }
+ }
+ // overflow-y
+ if(overflow || overflowY){
+ //console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop);
+ h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2);
+ ry = e.pageY - t.y;
+ if(dojo.isWebKit || dojo.isOpera){
+ // FIXME: this code should not be here, it should be taken into account
+ // either by the event fixing code, or the dojo.position()
+ // FIXME: this code doesn't work on Opera 9.5 Beta
+ ry += dojo.body().scrollTop;
+ }
+ dy = 0;
+ if(ry > 0 && ry < b.h){
+ if(ry < h){
+ dy = -h;
+ }else if(ry > b.h - h){
+ dy = h;
+ }
+ oldTop = n.scrollTop;
+ n.scrollTop = n.scrollTop + dy;
+ }
+ }
+ if(dx || dy){ return; }
}
- dijit.setWaiState(this.focusNode, "disabled", value);
+ try{
+ n = n.parentNode;
+ }catch(x){
+ n = null;
+ }
+ }
+ dojo.dnd.autoScroll(e);
+};
- 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);
+ return dojo.dnd;
+});
- // 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);
- }
+},
+'dojo/data/ItemFileWriteStore':function(){
+define("dojo/data/ItemFileWriteStore", ["../_base/lang", "../_base/declare", "../_base/array", "../_base/json", "../_base/window",
+ "./ItemFileReadStore", "../date/stamp"
+], function(lang, declare, arrayUtil, jsonUtil, window, ItemFileReadStore, dateStamp) {
+ // module:
+ // dojo/data/ItemFileWriteStore
+ // summary:
+ // TODOC
+
+/*===== var ItemFileReadStore = dojo.data.ItemFileReadStore; =====*/
+return declare("dojo.data.ItemFileWriteStore", ItemFileReadStore, {
+ constructor: function(/* object */ keywordParameters){
+ // keywordParameters: {typeMap: object)
+ // The structure of the typeMap object is as follows:
+ // {
+ // type0: function || object,
+ // type1: function || object,
+ // ...
+ // typeN: function || object
+ // }
+ // Where if it is a function, it is assumed to be an object constructor that takes the
+ // value of _value as the initialization parameters. It is serialized assuming object.toString()
+ // serialization. If it is an object, then it is assumed
+ // to be an object of general form:
+ // {
+ // type: function, //constructor.
+ // deserialize: function(value) //The function that parses the value and constructs the object defined by type appropriately.
+ // serialize: function(object) //The function that converts the object back into the proper file format form.
+ // }
+
+ // ItemFileWriteStore extends ItemFileReadStore to implement these additional dojo.data APIs
+ this._features['dojo.data.api.Write'] = true;
+ this._features['dojo.data.api.Notification'] = true;
+
+ // For keeping track of changes so that we can implement isDirty and revert
+ this._pending = {
+ _newItems:{},
+ _modifiedItems:{},
+ _deletedItems:{}
+ };
+
+ if(!this._datatypeMap['Date'].serialize){
+ this._datatypeMap['Date'].serialize = function(obj){
+ return dateStamp.toISOString(obj, {zulu:true});
+ };
+ }
+ //Disable only if explicitly set to false.
+ if(keywordParameters && (keywordParameters.referenceIntegrity === false)){
+ this.referenceIntegrity = false;
}
- },
- 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);
+ // this._saveInProgress is set to true, briefly, from when save() is first called to when it completes
+ this._saveInProgress = false;
},
- _onFocus: function(e){
- if(this.scrollOnFocus){
- dojo.window.scrollIntoView(this.domNode);
+ referenceIntegrity: true, //Flag that defaultly enabled reference integrity tracking. This way it can also be disabled pogrammatially or declaratively.
+
+ _assert: function(/* boolean */ condition){
+ if(!condition){
+ throw new Error("assertion failed in ItemFileWriteStore");
}
- 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");
+ _getIdentifierAttribute: function(){
+ // this._assert((identifierAttribute === Number) || (dojo.isString(identifierAttribute)));
+ return this.getFeatures()['dojo.data.api.Identity'];
},
- focus: function(){
- // summary:
- // Put focus on this widget
- if(!this.disabled){
- dijit.focus(this.focusNode);
+
+/* dojo.data.api.Write */
+
+ newItem: function(/* Object? */ keywordArgs, /* Object? */ parentInfo){
+ // summary: See dojo.data.api.Write.newItem()
+
+ this._assert(!this._saveInProgress);
+
+ if(!this._loadFinished){
+ // We need to do this here so that we'll be able to find out what
+ // identifierAttribute was specified in the data file.
+ this._forceLoad();
}
- },
- 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;
+ if(typeof keywordArgs != "object" && typeof keywordArgs != "undefined"){
+ throw new Error("newItem() was passed something other than an object");
+ }
+ var newIdentity = null;
+ var identifierAttribute = this._getIdentifierAttribute();
+ if(identifierAttribute === Number){
+ newIdentity = this._arrayOfAllItems.length;
}else{
- return 0;
+ newIdentity = keywordArgs[identifierAttribute];
+ if(typeof newIdentity === "undefined"){
+ throw new Error("newItem() was not passed an identity for the new item");
+ }
+ if(lang.isArray(newIdentity)){
+ throw new Error("newItem() was not passed an single-valued identity");
+ }
}
- },
- 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,
+ // make sure this identity is not already in use by another item, if identifiers were
+ // defined in the file. Otherwise it would be the item count,
+ // which should always be unique in this case.
+ if(this._itemsByIdentity){
+ this._assert(typeof this._itemsByIdentity[newIdentity] === "undefined");
+ }
+ this._assert(typeof this._pending._newItems[newIdentity] === "undefined");
+ this._assert(typeof this._pending._deletedItems[newIdentity] === "undefined");
- _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;
+ var newItem = {};
+ newItem[this._storeRefPropName] = this;
+ newItem[this._itemNumPropName] = this._arrayOfAllItems.length;
+ if(this._itemsByIdentity){
+ this._itemsByIdentity[newIdentity] = newItem;
+ //We have to set the identifier now, otherwise we can't look it
+ //up at calls to setValueorValues in parentInfo handling.
+ newItem[identifierAttribute] = [newIdentity];
}
- 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);
+ this._arrayOfAllItems.push(newItem);
+
+ //We need to construct some data for the onNew call too...
+ var pInfo = null;
+
+ // Now we need to check to see where we want to assign this thingm if any.
+ if(parentInfo && parentInfo.parent && parentInfo.attribute){
+ pInfo = {
+ item: parentInfo.parent,
+ attribute: parentInfo.attribute,
+ oldValue: undefined
+ };
+
+ //See if it is multi-valued or not and handle appropriately
+ //Generally, all attributes are multi-valued for this store
+ //So, we only need to append if there are already values present.
+ var values = this.getValues(parentInfo.parent, parentInfo.attribute);
+ if(values && values.length > 0){
+ var tempValues = values.slice(0, values.length);
+ if(values.length === 1){
+ pInfo.oldValue = values[0];
+ }else{
+ pInfo.oldValue = values.slice(0, values.length);
}
- // 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
+ tempValues.push(newItem);
+ this._setValueOrValues(parentInfo.parent, parentInfo.attribute, tempValues, false);
+ pInfo.newValue = this.getValues(parentInfo.parent, parentInfo.attribute);
+ }else{
+ this._setValueOrValues(parentInfo.parent, parentInfo.attribute, newItem, false);
+ pInfo.newValue = newItem;
}
+ }else{
+ //Toplevel item, add to both top list as well as all list.
+ newItem[this._rootItemPropName]=true;
+ this._arrayOfTopLevelItems.push(newItem);
}
- },
- create: function(){
- // Overrides _Widget.create()
- this.inherited(arguments);
- this._onChangeActive = true;
- },
+ this._pending._newItems[newIdentity] = newItem;
- destroy: function(){
- if(this._onChangeHandle){ // destroy called before last onChange has fired
- clearTimeout(this._onChangeHandle);
- this.onChange(this._lastValueReported);
+ //Clone over the properties to the new item
+ for(var key in keywordArgs){
+ if(key === this._storeRefPropName || key === this._itemNumPropName){
+ // Bummer, the user is trying to do something like
+ // newItem({_S:"foo"}). Unfortunately, our superclass,
+ // ItemFileReadStore, is already using _S in each of our items
+ // to hold private info. To avoid a naming collision, we
+ // need to move all our private info to some other property
+ // of all the items/objects. So, we need to iterate over all
+ // the items and do something like:
+ // item.__S = item._S;
+ // item._S = undefined;
+ // But first we have to make sure the new "__S" variable is
+ // not in use, which means we have to iterate over all the
+ // items checking for that.
+ throw new Error("encountered bug in ItemFileWriteStore.newItem");
+ }
+ var value = keywordArgs[key];
+ if(!lang.isArray(value)){
+ value = [value];
+ }
+ newItem[key] = value;
+ if(this.referenceIntegrity){
+ for(var i = 0; i < value.length; i++){
+ var val = value[i];
+ if(this.isItem(val)){
+ this._addReferenceToMap(val, newItem, key);
+ }
+ }
+ }
}
- this.inherited(arguments);
+ this.onNew(newItem, pInfo); // dojo.data.api.Notification call
+ return newItem; // item
},
- 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);
+ _removeArrayElement: function(/* Array */ array, /* anything */ element){
+ var index = arrayUtil.indexOf(array, element);
+ if(index != -1){
+ array.splice(index, 1);
+ return true;
+ }
+ return false;
},
- 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);
- });
- }
- }
-});
+ deleteItem: function(/* item */ item){
+ // summary: See dojo.data.api.Write.deleteItem()
+ this._assert(!this._saveInProgress);
+ this._assertIsItem(item);
-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.
+ // Remove this item from the _arrayOfAllItems, but leave a null value in place
+ // of the item, so as not to change the length of the array, so that in newItem()
+ // we can still safely do: newIdentity = this._arrayOfAllItems.length;
+ var indexInArrayOfAllItems = item[this._itemNumPropName];
+ var identity = this.getIdentity(item);
- // 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)
+ //If we have reference integrity on, we need to do reference cleanup for the deleted item
+ if(this.referenceIntegrity){
+ //First scan all the attributes of this items for references and clean them up in the map
+ //As this item is going away, no need to track its references anymore.
- // 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,
+ //Get the attributes list before we generate the backup so it
+ //doesn't pollute the attributes list.
+ var attributes = this.getAttributes(item);
- attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, {
- value: "",
- readOnly: "focusNode"
- }),
+ //Backup the map, we'll have to restore it potentially, in a revert.
+ if(item[this._reverseRefMap]){
+ item["backup_" + this._reverseRefMap] = lang.clone(item[this._reverseRefMap]);
+ }
- _setReadOnlyAttr: function(/*Boolean*/ value){
- dojo.attr(this.focusNode, 'readOnly', value);
- dijit.setWaiState(this.focusNode, "readonly", value);
- this._set("readOnly", value);
- },
+ //TODO: This causes a reversion problem. This list won't be restored on revert since it is
+ //attached to the 'value'. item, not ours. Need to back tese up somehow too.
+ //Maybe build a map of the backup of the entries and attach it to the deleted item to be restored
+ //later. Or just record them and call _addReferenceToMap on them in revert.
+ arrayUtil.forEach(attributes, function(attribute){
+ arrayUtil.forEach(this.getValues(item, attribute), function(value){
+ if(this.isItem(value)){
+ //We have to back up all the references we had to others so they can be restored on a revert.
+ if(!item["backupRefs_" + this._reverseRefMap]){
+ item["backupRefs_" + this._reverseRefMap] = [];
+ }
+ item["backupRefs_" + this._reverseRefMap].push({id: this.getIdentity(value), attr: attribute});
+ this._removeReferenceFromMap(value, item, attribute);
+ }
+ }, this);
+ }, this);
- postCreate: function(){
- this.inherited(arguments);
+ //Next, see if we have references to this item, if we do, we have to clean them up too.
+ var references = item[this._reverseRefMap];
+ if(references){
+ //Look through all the items noted as references to clean them up.
+ for(var itemId in references){
+ var containingItem = null;
+ if(this._itemsByIdentity){
+ containingItem = this._itemsByIdentity[itemId];
+ }else{
+ containingItem = this._arrayOfAllItems[itemId];
+ }
+ //We have a reference to a containing item, now we have to process the
+ //attributes and clear all references to the item being deleted.
+ if(containingItem){
+ for(var attribute in references[itemId]){
+ var oldValues = this.getValues(containingItem, attribute) || [];
+ var newValues = arrayUtil.filter(oldValues, function(possibleItem){
+ return !(this.isItem(possibleItem) && this.getIdentity(possibleItem) == identity);
+ }, this);
+ //Remove the note of the reference to the item and set the values on the modified attribute.
+ this._removeReferenceFromMap(item, containingItem, attribute);
+ if(newValues.length < oldValues.length){
+ this._setValueOrValues(containingItem, attribute, newValues, true);
+ }
+ }
+ }
+ }
+ }
+ }
- 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);
+ this._arrayOfAllItems[indexInArrayOfAllItems] = null;
+
+ item[this._storeRefPropName] = null;
+ if(this._itemsByIdentity){
+ delete this._itemsByIdentity[identity];
}
- // 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;
+ this._pending._deletedItems[identity] = item;
+
+ //Remove from the toplevel items, if necessary...
+ if(item[this._rootItemPropName]){
+ this._removeArrayElement(this._arrayOfTopLevelItems, item);
}
+ this.onDelete(item); // dojo.data.api.Notification call
+ return true;
},
- _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);
+ setValue: function(/* item */ item, /* attribute-name-string */ attribute, /* almost anything */ value){
+ // summary: See dojo.data.api.Write.set()
+ return this._setValueOrValues(item, attribute, value, true); // boolean
},
- _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);
+ setValues: function(/* item */ item, /* attribute-name-string */ attribute, /* array */ values){
+ // summary: See dojo.data.api.Write.setValues()
+ return this._setValueOrValues(item, attribute, values, true); // boolean
},
- undo: function(){
- // summary:
- // Restore the value to the last value passed to onChange
- this._setValueAttr(this._lastValueReported, false);
+ unsetAttribute: function(/* item */ item, /* attribute-name-string */ attribute){
+ // summary: See dojo.data.api.Write.unsetAttribute()
+ return this._setValueOrValues(item, attribute, [], true);
},
- reset: function(){
- // summary:
- // Reset the widget's value to what it was at initialization time
- this._hasBeenBlurred = false;
- this._setValueAttr(this._resetValue, true);
- },
+ _setValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute, /* anything */ newValueOrValues, /*boolean?*/ callOnSet){
+ this._assert(!this._saveInProgress);
+
+ // Check for valid arguments
+ this._assertIsItem(item);
+ this._assert(lang.isString(attribute));
+ this._assert(typeof newValueOrValues !== "undefined");
+
+ // Make sure the user isn't trying to change the item's identity
+ var identifierAttribute = this._getIdentifierAttribute();
+ if(attribute == identifierAttribute){
+ throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");
+ }
- _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);
+ // To implement the Notification API, we need to make a note of what
+ // the old attribute value was, so that we can pass that info when
+ // we call the onSet method.
+ var oldValueOrValues = this._getValueOrValues(item, attribute);
+
+ var identity = this.getIdentity(item);
+ if(!this._pending._modifiedItems[identity]){
+ // Before we actually change the item, we make a copy of it to
+ // record the original state, so that we'll be able to revert if
+ // the revert method gets called. If the item has already been
+ // modified then there's no need to do this now, since we already
+ // have a record of the original state.
+ var copyOfItemState = {};
+ for(var key in item){
+ if((key === this._storeRefPropName) || (key === this._itemNumPropName) || (key === this._rootItemPropName)){
+ copyOfItemState[key] = item[key];
+ }else if(key === this._reverseRefMap){
+ copyOfItemState[key] = lang.clone(item[key]);
+ }else{
+ copyOfItemState[key] = item[key].slice(0, item[key].length);
+ }
}
+ // Now mark the item as dirty, and save the copy of the original state
+ this._pending._modifiedItems[identity] = copyOfItemState;
}
- },
- _layoutHackIE7: function(){
- // summary:
- // Work around table sizing bugs on IE7 by forcing redraw
+ // Okay, now we can actually change this attribute on the item
+ var success = false;
- 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
+ if(lang.isArray(newValueOrValues) && newValueOrValues.length === 0){
+
+ // If we were passed an empty array as the value, that counts
+ // as "unsetting" the attribute, so we need to remove this
+ // attribute from the item.
+ success = delete item[attribute];
+ newValueOrValues = undefined; // used in the onSet Notification call below
+
+ if(this.referenceIntegrity && oldValueOrValues){
+ var oldValues = oldValueOrValues;
+ if(!lang.isArray(oldValues)){
+ oldValues = [oldValues];
+ }
+ for(var i = 0; i < oldValues.length; i++){
+ var value = oldValues[i];
+ if(this.isItem(value)){
+ this._removeReferenceFromMap(value, item, attribute);
+ }
+ }
+ }
+ }else{
+ var newValueArray;
+ if(lang.isArray(newValueOrValues)){
+ // Unfortunately, it's not safe to just do this:
+ // newValueArray = newValueOrValues;
+ // Instead, we need to copy the array, which slice() does very nicely.
+ // This is so that our internal data structure won't
+ // get corrupted if the user mucks with the values array *after*
+ // calling setValues().
+ newValueArray = newValueOrValues.slice(0, newValueOrValues.length);
+ }else{
+ newValueArray = [newValueOrValues];
+ }
+
+ //We need to handle reference integrity if this is on.
+ //In the case of set, we need to see if references were added or removed
+ //and update the reference tracking map accordingly.
+ if(this.referenceIntegrity){
+ if(oldValueOrValues){
+ var oldValues = oldValueOrValues;
+ if(!lang.isArray(oldValues)){
+ oldValues = [oldValues];
+ }
+ //Use an associative map to determine what was added/removed from the list.
+ //Should be O(n) performant. First look at all the old values and make a list of them
+ //Then for any item not in the old list, we add it. If it was already present, we remove it.
+ //Then we pass over the map and any references left it it need to be removed (IE, no match in
+ //the new values list).
+ var map = {};
+ arrayUtil.forEach(oldValues, function(possibleItem){
+ if(this.isItem(possibleItem)){
+ var id = this.getIdentity(possibleItem);
+ map[id.toString()] = true;
}
- );
- })();
- parent = parent.parentNode;
+ }, this);
+ arrayUtil.forEach(newValueArray, function(possibleItem){
+ if(this.isItem(possibleItem)){
+ var id = this.getIdentity(possibleItem);
+ if(map[id.toString()]){
+ delete map[id.toString()];
+ }else{
+ this._addReferenceToMap(possibleItem, item, attribute);
+ }
+ }
+ }, this);
+ for(var rId in map){
+ var removedItem;
+ if(this._itemsByIdentity){
+ removedItem = this._itemsByIdentity[rId];
+ }else{
+ removedItem = this._arrayOfAllItems[rId];
+ }
+ this._removeReferenceFromMap(removedItem, item, attribute);
+ }
+ }else{
+ //Everything is new (no old values) so we have to just
+ //insert all the references, if any.
+ for(var i = 0; i < newValueArray.length; i++){
+ var value = newValueArray[i];
+ if(this.isItem(value)){
+ this._addReferenceToMap(value, item, attribute);
+ }
+ }
+ }
}
+ item[attribute] = newValueArray;
+ success = true;
}
- }
-});
-}
+ // Now we make the dojo.data.api.Notification call
+ if(callOnSet){
+ this.onSet(item, attribute, oldValueOrValues, newValueOrValues);
+ }
+ return success; // boolean
+ },
-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");
+ _addReferenceToMap: function(/* item */ refItem, /* item */ parentItem, /* string */ attribute){
+ // summary:
+ // Method to add an reference map entry for an item and attribute.
+ // description:
+ // Method to add an reference map entry for an item and attribute. //
+ // refItem:
+ // The item that is referenced.
+ // parentItem:
+ // The item that holds the new reference to refItem.
+ // attribute:
+ // The attribute on parentItem that contains the new reference.
+ var parentId = this.getIdentity(parentItem);
+ var references = refItem[this._reverseRefMap];
+ if(!references){
+ references = refItem[this._reverseRefMap] = {};
+ }
+ var itemRef = references[parentId];
+ if(!itemRef){
+ itemRef = references[parentId] = {};
+ }
+ itemRef[attribute] = true;
+ },
+ _removeReferenceFromMap: function(/* item */ refItem, /* item */ parentItem, /* string */ attribute){
+ // summary:
+ // Method to remove an reference map entry for an item and attribute.
+ // description:
+ // Method to remove an reference map entry for an item and attribute. This will
+ // also perform cleanup on the map such that if there are no more references at all to
+ // the item, its reference object and entry are removed.
+ //
+ // refItem:
+ // The item that is referenced.
+ // parentItem:
+ // The item holding a reference to refItem.
+ // attribute:
+ // The attribute on parentItem that contains the reference.
+ var identity = this.getIdentity(parentItem);
+ var references = refItem[this._reverseRefMap];
+ var itemId;
+ if(references){
+ for(itemId in references){
+ if(itemId == identity){
+ delete references[itemId][attribute];
+ if(this._isEmpty(references[itemId])){
+ delete references[itemId];
+ }
+ }
+ }
+ if(this._isEmpty(references)){
+ delete refItem[this._reverseRefMap];
+ }
+ }
+ },
+ _dumpReferenceMap: function(){
+ // summary:
+ // Function to dump the reverse reference map of all items in the store for debug purposes.
+ // description:
+ // Function to dump the reverse reference map of all items in the store for debug purposes.
+ var i;
+ for(i = 0; i < this._arrayOfAllItems.length; i++){
+ var item = this._arrayOfAllItems[i];
+ if(item && item[this._reverseRefMap]){
+ console.log("Item: [" + this.getIdentity(item) + "] is referenced by: " + jsonUtil.toJson(item[this._reverseRefMap]));
+ }
+ }
+ },
+ _getValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute){
+ var valueOrValues = undefined;
+ if(this.hasAttribute(item, attribute)){
+ var valueArray = this.getValues(item, attribute);
+ if(valueArray.length == 1){
+ valueOrValues = valueArray[0];
+ }else{
+ valueOrValues = valueArray;
+ }
+ }
+ return valueOrValues;
+ },
+ _flatten: function(/* anything */ value){
+ if(this.isItem(value)){
+ // Given an item, return an serializable object that provides a
+ // reference to the item.
+ // For example, given kermit:
+ // var kermit = store.newItem({id:2, name:"Kermit"});
+ // we want to return
+ // {_reference:2}
+ return {_reference: this.getIdentity(value)};
+ }else{
+ if(typeof value === "object"){
+ for(var type in this._datatypeMap){
+ var typeMap = this._datatypeMap[type];
+ if(lang.isObject(typeMap) && !lang.isFunction(typeMap)){
+ if(value instanceof typeMap.type){
+ if(!typeMap.serialize){
+ throw new Error("ItemFileWriteStore: No serializer defined for type mapping: [" + type + "]");
+ }
+ return {_type: type, _value: typeMap.serialize(value)};
+ }
+ } else if(value instanceof typeMap){
+ //SImple mapping, therefore, return as a toString serialization.
+ return {_type: type, _value: value.toString()};
+ }
+ }
+ }
+ return value;
+ }
+ },
+ _getNewFileContentString: function(){
+ // summary:
+ // Generate a string that can be saved to a file.
+ // The result should look similar to:
+ // http://trac.dojotoolkit.org/browser/dojo/trunk/tests/data/countries.json
+ var serializableStructure = {};
+ var identifierAttribute = this._getIdentifierAttribute();
+ if(identifierAttribute !== Number){
+ serializableStructure.identifier = identifierAttribute;
+ }
+ if(this._labelAttr){
+ serializableStructure.label = this._labelAttr;
+ }
+ serializableStructure.items = [];
+ for(var i = 0; i < this._arrayOfAllItems.length; ++i){
+ var item = this._arrayOfAllItems[i];
+ if(item !== null){
+ var serializableItem = {};
+ for(var key in item){
+ if(key !== this._storeRefPropName && key !== this._itemNumPropName && key !== this._reverseRefMap && key !== this._rootItemPropName){
+ var valueArray = this.getValues(item, key);
+ if(valueArray.length == 1){
+ serializableItem[key] = this._flatten(valueArray[0]);
+ }else{
+ var serializableArray = [];
+ for(var j = 0; j < valueArray.length; ++j){
+ serializableArray.push(this._flatten(valueArray[j]));
+ serializableItem[key] = serializableArray;
+ }
+ }
+ }
+ }
+ serializableStructure.items.push(serializableItem);
+ }
+ }
+ var prettyPrint = true;
+ return jsonUtil.toJson(serializableStructure, prettyPrint);
+ },
-/*=====
-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>
- //
-};
-=====*/
+ _isEmpty: function(something){
+ // summary:
+ // Function to determine if an array or object has no properties or values.
+ // something:
+ // The array or object to examine.
+ var empty = true;
+ if(lang.isObject(something)){
+ var i;
+ for(i in something){
+ empty = false;
+ break;
+ }
+ }else if(lang.isArray(something)){
+ if(something.length > 0){
+ empty = false;
+ }
+ }
+ return empty; //boolean
+ },
-// All the stuff in _base (these are the function that are guaranteed available without an explicit dojo.require)
+ save: function(/* object */ keywordArgs){
+ // summary: See dojo.data.api.Write.save()
+ this._assert(!this._saveInProgress);
-// And some other stuff that we tend to pull in all the time anyway
+ // this._saveInProgress is set to true, briefly, from when save is first called to when it completes
+ this._saveInProgress = true;
-}
+ var self = this;
+ var saveCompleteCallback = function(){
+ self._pending = {
+ _newItems:{},
+ _modifiedItems:{},
+ _deletedItems:{}
+ };
-if(!dojo._hasResource["dojo.fx.Toggler"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.fx.Toggler"] = true;
-dojo.provide("dojo.fx.Toggler");
+ self._saveInProgress = false; // must come after this._pending is cleared, but before any callbacks
+ if(keywordArgs && keywordArgs.onComplete){
+ var scope = keywordArgs.scope || window.global;
+ keywordArgs.onComplete.call(scope);
+ }
+ };
+ var saveFailedCallback = function(err){
+ self._saveInProgress = false;
+ if(keywordArgs && keywordArgs.onError){
+ var scope = keywordArgs.scope || window.global;
+ keywordArgs.onError.call(scope, err);
+ }
+ };
+ if(this._saveEverything){
+ var newFileContentString = this._getNewFileContentString();
+ this._saveEverything(saveCompleteCallback, saveFailedCallback, newFileContentString);
+ }
+ if(this._saveCustom){
+ this._saveCustom(saveCompleteCallback, saveFailedCallback);
+ }
+ if(!this._saveEverything && !this._saveCustom){
+ // Looks like there is no user-defined save-handler function.
+ // That's fine, it just means the datastore is acting as a "mock-write"
+ // store -- changes get saved in memory but don't get saved to disk.
+ saveCompleteCallback();
+ }
+ },
-dojo.declare("dojo.fx.Toggler", null, {
- // summary:
- // A simple `dojo.Animation` toggler API.
- //
- // description:
- // class constructor for an animation toggler. It accepts a packed
- // set of arguments about what type of animation to use in each
- // direction, duration, etc. All available members are mixed into
- // these animations from the constructor (for example, `node`,
- // `showDuration`, `hideDuration`).
- //
- // example:
- // | var t = new dojo.fx.Toggler({
- // | node: "nodeId",
- // | showDuration: 500,
- // | // hideDuration will default to "200"
- // | showFunc: dojo.fx.wipeIn,
- // | // hideFunc will default to "fadeOut"
- // | });
- // | t.show(100); // delay showing for 100ms
- // | // ...time passes...
- // | t.hide();
+ revert: function(){
+ // summary: See dojo.data.api.Write.revert()
+ this._assert(!this._saveInProgress);
- // node: DomNode
- // the node to target for the showing and hiding animations
- node: null,
+ var identity;
+ for(identity in this._pending._modifiedItems){
+ // find the original item and the modified item that replaced it
+ var copyOfItemState = this._pending._modifiedItems[identity];
+ var modifiedItem = null;
+ if(this._itemsByIdentity){
+ modifiedItem = this._itemsByIdentity[identity];
+ }else{
+ modifiedItem = this._arrayOfAllItems[identity];
+ }
- // showFunc: Function
- // The function that returns the `dojo.Animation` to show the node
- showFunc: dojo.fadeIn,
+ // Restore the original item into a full-fledged item again, we want to try to
+ // keep the same object instance as if we don't it, causes bugs like #9022.
+ copyOfItemState[this._storeRefPropName] = this;
+ for(var key in modifiedItem){
+ delete modifiedItem[key];
+ }
+ lang.mixin(modifiedItem, copyOfItemState);
+ }
+ var deletedItem;
+ for(identity in this._pending._deletedItems){
+ deletedItem = this._pending._deletedItems[identity];
+ deletedItem[this._storeRefPropName] = this;
+ var index = deletedItem[this._itemNumPropName];
- // hideFunc: Function
- // The function that returns the `dojo.Animation` to hide the node
- hideFunc: dojo.fadeOut,
+ //Restore the reverse refererence map, if any.
+ if(deletedItem["backup_" + this._reverseRefMap]){
+ deletedItem[this._reverseRefMap] = deletedItem["backup_" + this._reverseRefMap];
+ delete deletedItem["backup_" + this._reverseRefMap];
+ }
+ this._arrayOfAllItems[index] = deletedItem;
+ if(this._itemsByIdentity){
+ this._itemsByIdentity[identity] = deletedItem;
+ }
+ if(deletedItem[this._rootItemPropName]){
+ this._arrayOfTopLevelItems.push(deletedItem);
+ }
+ }
+ //We have to pass through it again and restore the reference maps after all the
+ //undeletes have occurred.
+ for(identity in this._pending._deletedItems){
+ deletedItem = this._pending._deletedItems[identity];
+ if(deletedItem["backupRefs_" + this._reverseRefMap]){
+ arrayUtil.forEach(deletedItem["backupRefs_" + this._reverseRefMap], function(reference){
+ var refItem;
+ if(this._itemsByIdentity){
+ refItem = this._itemsByIdentity[reference.id];
+ }else{
+ refItem = this._arrayOfAllItems[reference.id];
+ }
+ this._addReferenceToMap(refItem, deletedItem, reference.attr);
+ }, this);
+ delete deletedItem["backupRefs_" + this._reverseRefMap];
+ }
+ }
- // showDuration:
- // Time in milliseconds to run the show Animation
- showDuration: 200,
+ for(identity in this._pending._newItems){
+ var newItem = this._pending._newItems[identity];
+ newItem[this._storeRefPropName] = null;
+ // null out the new item, but don't change the array index so
+ // so we can keep using _arrayOfAllItems.length.
+ this._arrayOfAllItems[newItem[this._itemNumPropName]] = null;
+ if(newItem[this._rootItemPropName]){
+ this._removeArrayElement(this._arrayOfTopLevelItems, newItem);
+ }
+ if(this._itemsByIdentity){
+ delete this._itemsByIdentity[identity];
+ }
+ }
- // hideDuration:
- // Time in milliseconds to run the hide Animation
- hideDuration: 200,
+ this._pending = {
+ _newItems:{},
+ _modifiedItems:{},
+ _deletedItems:{}
+ };
+ return true; // boolean
+ },
- // FIXME: need a policy for where the toggler should "be" the next
- // time show/hide are called if we're stopped somewhere in the
- // middle.
- // FIXME: also would be nice to specify individual showArgs/hideArgs mixed into
- // each animation individually.
- // FIXME: also would be nice to have events from the animations exposed/bridged
+ isDirty: function(/* item? */ item){
+ // summary: See dojo.data.api.Write.isDirty()
+ if(item){
+ // return true if the item is dirty
+ var identity = this.getIdentity(item);
+ return new Boolean(this._pending._newItems[identity] ||
+ this._pending._modifiedItems[identity] ||
+ this._pending._deletedItems[identity]).valueOf(); // boolean
+ }else{
+ // return true if the store is dirty -- which means return true
+ // if there are any new items, dirty items, or modified items
+ return !this._isEmpty(this._pending._newItems) ||
+ !this._isEmpty(this._pending._modifiedItems) ||
+ !this._isEmpty(this._pending._deletedItems); // boolean
+ }
+ },
- /*=====
- _showArgs: null,
- _showAnim: null,
+/* dojo.data.api.Notification */
- _hideArgs: null,
- _hideAnim: null,
+ onSet: function(/* item */ item,
+ /*attribute-name-string*/ attribute,
+ /*object|array*/ oldValue,
+ /*object|array*/ newValue){
+ // summary: See dojo.data.api.Notification.onSet()
- _isShowing: false,
- _isHiding: false,
- =====*/
+ // No need to do anything. This method is here just so that the
+ // client code can connect observers to it.
+ },
- constructor: function(args){
- var _t = this;
+ onNew: function(/* item */ newItem, /*object?*/ parentInfo){
+ // summary: See dojo.data.api.Notification.onNew()
- dojo.mixin(_t, args);
- _t.node = args.node;
- _t._showArgs = dojo.mixin({}, args);
- _t._showArgs.node = _t.node;
- _t._showArgs.duration = _t.showDuration;
- _t.showAnim = _t.showFunc(_t._showArgs);
+ // No need to do anything. This method is here just so that the
+ // client code can connect observers to it.
+ },
- _t._hideArgs = dojo.mixin({}, args);
- _t._hideArgs.node = _t.node;
- _t._hideArgs.duration = _t.hideDuration;
- _t.hideAnim = _t.hideFunc(_t._hideArgs);
+ onDelete: function(/* item */ deletedItem){
+ // summary: See dojo.data.api.Notification.onDelete()
- dojo.connect(_t.showAnim, "beforeBegin", dojo.hitch(_t.hideAnim, "stop", true));
- dojo.connect(_t.hideAnim, "beforeBegin", dojo.hitch(_t.showAnim, "stop", true));
+ // No need to do anything. This method is here just so that the
+ // client code can connect observers to it.
},
- show: function(delay){
- // summary: Toggle the node to showing
- // delay: Integer?
- // Ammount of time to stall playing the show animation
- return this.showAnim.play(delay || 0);
- },
+ close: function(/* object? */ request){
+ // summary:
+ // Over-ride of base close function of ItemFileReadStore to add in check for store state.
+ // description:
+ // Over-ride of base close function of ItemFileReadStore to add in check for store state.
+ // If the store is still dirty (unsaved changes), then an error will be thrown instead of
+ // clearing the internal state for reload from the url.
- hide: function(delay){
- // summary: Toggle the node to hidden
- // delay: Integer?
- // Ammount of time to stall playing the hide animation
- return this.hideAnim.play(delay || 0);
+ //Clear if not dirty ... or throw an error
+ if(this.clearOnClose){
+ if(!this.isDirty()){
+ this.inherited(arguments);
+ }else{
+ //Only throw an error if the store was dirty and we were loading from a url (cannot reload from url until state is saved).
+ throw new Error("dojo.data.ItemFileWriteStore: There are unsaved changes present in the store. Please save or revert the changes before invoking close.");
+ }
+ }
}
});
-}
-
-if(!dojo._hasResource["dojo.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.fx"] = true;
-dojo.provide("dojo.fx");
-
+});
+},
+'dijit/form/_RadioButtonMixin':function(){
+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
-/*=====
-dojo.fx = {
- // summary: Effects library on top of Base animations
-};
-=====*/
-(function(){
-
- var d = dojo,
- _baseObj = {
- _fire: function(evt, args){
- if(this[evt]){
- this[evt].apply(this, args||[]);
- }
- return this;
- }
- };
+ return declare("dijit.form._RadioButtonMixin", null, {
+ // summary:
+ // Mixin to provide widget functionality for an HTML radio button
- var _chain = function(animations){
- this._index = -1;
- this._animations = animations||[];
- this._current = this._onAnimateCtx = this._onEndCtx = null;
+ // type: [private] String
+ // type attribute on <input> node.
+ // Users should not change this value.
+ type: "radio",
- this.duration = 0;
- d.forEach(this._animations, function(a){
- this.duration += a.duration;
- if(a.delay){ this.duration += a.delay; }
- }, this);
- };
- d.extend(_chain, {
- _onAnimate: function(){
- this._fire("onAnimate", arguments);
- },
- _onEnd: function(){
- d.disconnect(this._onAnimateCtx);
- d.disconnect(this._onEndCtx);
- this._onAnimateCtx = this._onEndCtx = null;
- if(this._index + 1 == this._animations.length){
- this._fire("onEnd");
- }else{
- // switch animations
- this._current = this._animations[++this._index];
- this._onAnimateCtx = d.connect(this._current, "onAnimate", this, "_onAnimate");
- this._onEndCtx = d.connect(this._current, "onEnd", this, "_onEnd");
- this._current.play(0, true);
- }
- },
- play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
- if(!this._current){ this._current = this._animations[this._index = 0]; }
- if(!gotoStart && this._current.status() == "playing"){ return this; }
- var beforeBegin = d.connect(this._current, "beforeBegin", this, function(){
- this._fire("beforeBegin");
- }),
- onBegin = d.connect(this._current, "onBegin", this, function(arg){
- this._fire("onBegin", arguments);
- }),
- onPlay = d.connect(this._current, "onPlay", this, function(arg){
- this._fire("onPlay", arguments);
- d.disconnect(beforeBegin);
- d.disconnect(onBegin);
- d.disconnect(onPlay);
- });
- if(this._onAnimateCtx){
- d.disconnect(this._onAnimateCtx);
- }
- this._onAnimateCtx = d.connect(this._current, "onAnimate", this, "_onAnimate");
- if(this._onEndCtx){
- d.disconnect(this._onEndCtx);
- }
- this._onEndCtx = d.connect(this._current, "onEnd", this, "_onEnd");
- this._current.play.apply(this._current, arguments);
- return this;
+ _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;
},
- pause: function(){
- if(this._current){
- var e = d.connect(this._current, "onPause", this, function(arg){
- this._fire("onPause", arguments);
- d.disconnect(e);
- });
- this._current.pause();
+
+ _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);
+ }
+ }));
}
- return this;
},
- gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){
- this.pause();
- var offset = this.duration * percent;
- this._current = null;
- d.some(this._animations, function(a){
- if(a.duration <= offset){
- this._current = a;
- return true;
- }
- offset -= a.duration;
+
+ _onClick: function(/*Event*/ e){
+ if(this.checked || this.disabled){ // nothing to do
+ event.stop(e);
return false;
- });
- if(this._current){
- this._current.gotoPercent(offset / this._current.duration, andPlay);
}
- return this;
- },
- stop: function(/*boolean?*/ gotoEnd){
- if(this._current){
- if(gotoEnd){
- for(; this._index + 1 < this._animations.length; ++this._index){
- this._animations[this._index].stop(true);
- }
- this._current = this._animations[this._index];
- }
- var e = d.connect(this._current, "onStop", this, function(arg){
- this._fire("onStop", arguments);
- d.disconnect(e);
- });
- this._current.stop();
+ 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;
- },
- status: function(){
- return this._current ? this._current.status() : "stopped";
- },
- destroy: function(){
- if(this._onAnimateCtx){ d.disconnect(this._onAnimateCtx); }
- if(this._onEndCtx){ d.disconnect(this._onEndCtx); }
+ return this.inherited(arguments);
}
});
- d.extend(_chain, _baseObj);
-
- dojo.fx.chain = function(/*dojo.Animation[]*/ animations){
- // summary:
- // Chain a list of `dojo.Animation`s to run in sequence
- //
- // description:
- // Return a `dojo.Animation` which will play all passed
- // `dojo.Animation` instances in sequence, firing its own
- // synthesized events simulating a single animation. (eg:
- // onEnd of this animation means the end of the chain,
- // not the individual animations within)
- //
- // example:
- // Once `node` is faded out, fade in `otherNode`
- // | dojo.fx.chain([
- // | dojo.fadeIn({ node:node }),
- // | dojo.fadeOut({ node:otherNode })
- // | ]).play();
- //
- return new _chain(animations) // dojo.Animation
- };
+});
- var _combine = function(animations){
- this._animations = animations||[];
- this._connects = [];
- this._finished = 0;
+},
+'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",
+'dojo/dnd/TimedMoveable':function(){
+define("dojo/dnd/TimedMoveable", ["../main", "./Moveable"], function(dojo) {
+ // module:
+ // dojo/dnd/TimedMoveable
+ // summary:
+ // TODOC
- this.duration = 0;
- d.forEach(animations, function(a){
- var duration = a.duration;
- if(a.delay){ duration += a.delay; }
- if(this.duration < duration){ this.duration = duration; }
- this._connects.push(d.connect(a, "onEnd", this, "_onEnd"));
- }, this);
-
- this._pseudoAnimation = new d.Animation({curve: [0, 1], duration: this.duration});
- var self = this;
- d.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop", "onEnd"],
- function(evt){
- self._connects.push(d.connect(self._pseudoAnimation, evt,
- function(){ self._fire(evt, arguments); }
- ));
- }
- );
- };
- d.extend(_combine, {
- _doAction: function(action, args){
- d.forEach(this._animations, function(a){
- a[action].apply(a, args);
- });
- return this;
- },
- _onEnd: function(){
- if(++this._finished > this._animations.length){
- this._fire("onEnd");
- }
- },
- _call: function(action, args){
- var t = this._pseudoAnimation;
- t[action].apply(t, args);
- },
- play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
- this._finished = 0;
- this._doAction("play", arguments);
- this._call("play", arguments);
- return this;
- },
- pause: function(){
- this._doAction("pause", arguments);
- this._call("pause", arguments);
- return this;
- },
- gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){
- var ms = this.duration * percent;
- d.forEach(this._animations, function(a){
- a.gotoPercent(a.duration < ms ? 1 : (ms / a.duration), andPlay);
- });
- this._call("gotoPercent", arguments);
- return this;
- },
- stop: function(/*boolean?*/ gotoEnd){
- this._doAction("stop", arguments);
- this._call("stop", arguments);
- return this;
- },
- status: function(){
- return this._pseudoAnimation.status();
- },
- destroy: function(){
- d.forEach(this._connects, dojo.disconnect);
- }
+ /*=====
+ dojo.declare("dojo.dnd.__TimedMoveableArgs", [dojo.dnd.__MoveableArgs], {
+ // timeout: Number
+ // delay move by this number of ms,
+ // accumulating position changes during the timeout
+ timeout: 0
});
- d.extend(_combine, _baseObj);
+ =====*/
- dojo.fx.combine = function(/*dojo.Animation[]*/ animations){
- // summary:
- // Combine a list of `dojo.Animation`s to run in parallel
- //
- // description:
- // Combine an array of `dojo.Animation`s to run in parallel,
- // providing a new `dojo.Animation` instance encompasing each
- // animation, firing standard animation events.
- //
- // example:
- // Fade out `node` while fading in `otherNode` simultaneously
- // | dojo.fx.combine([
- // | dojo.fadeIn({ node:node }),
- // | dojo.fadeOut({ node:otherNode })
- // | ]).play();
- //
- // example:
- // When the longest animation ends, execute a function:
- // | var anim = dojo.fx.combine([
- // | dojo.fadeIn({ node: n, duration:700 }),
- // | dojo.fadeOut({ node: otherNode, duration: 300 })
- // | ]);
- // | dojo.connect(anim, "onEnd", function(){
- // | // overall animation is done.
- // | });
- // | anim.play(); // play the animation
- //
- return new _combine(animations); // dojo.Animation
- };
+ // precalculate long expressions
+ var oldOnMove = dojo.dnd.Moveable.prototype.onMove;
- dojo.fx.wipeIn = function(/*Object*/ args){
+ dojo.declare("dojo.dnd.TimedMoveable", dojo.dnd.Moveable, {
// summary:
- // Expand a node to it's natural height.
- //
- // description:
- // Returns an animation that will expand the
- // node defined in 'args' object from it's current height to
- // it's natural height (with no scrollbar).
- // Node must have no margin/border/padding.
- //
- // args: Object
- // A hash-map of standard `dojo.Animation` constructor properties
- // (such as easing: node: duration: and so on)
- //
- // example:
- // | dojo.fx.wipeIn({
- // | node:"someId"
- // | }).play()
- var node = args.node = d.byId(args.node), s = node.style, o;
-
- var anim = d.animateProperty(d.mixin({
- properties: {
- height: {
- // wrapped in functions so we wait till the last second to query (in case value has changed)
- start: function(){
- // start at current [computed] height, but use 1px rather than 0
- // because 0 causes IE to display the whole panel
- o = s.overflow;
- s.overflow = "hidden";
- if(s.visibility == "hidden" || s.display == "none"){
- s.height = "1px";
- s.display = "";
- s.visibility = "";
- return 1;
- }else{
- var height = d.style(node, "height");
- return Math.max(height, 1);
- }
- },
- end: function(){
- return node.scrollHeight;
- }
- }
- }
- }, args));
+ // A specialized version of Moveable to support an FPS throttling.
+ // This class puts an upper restriction on FPS, which may reduce
+ // the CPU load. The additional parameter "timeout" regulates
+ // the delay before actually moving the moveable object.
- d.connect(anim, "onEnd", function(){
- s.height = "auto";
- s.overflow = o;
- });
+ // object attributes (for markup)
+ timeout: 40, // in ms, 40ms corresponds to 25 fps
- return anim; // dojo.Animation
- };
+ constructor: function(node, params){
+ // summary:
+ // an object that makes a node moveable with a timer
+ // node: Node||String
+ // a node (or node's id) to be moved
+ // params: dojo.dnd.__TimedMoveableArgs
+ // object with additional parameters.
- dojo.fx.wipeOut = function(/*Object*/ args){
- // summary:
- // Shrink a node to nothing and hide it.
- //
- // description:
- // Returns an animation that will shrink node defined in "args"
- // from it's current height to 1px, and then hide it.
- //
- // args: Object
- // A hash-map of standard `dojo.Animation` constructor properties
- // (such as easing: node: duration: and so on)
- //
- // example:
- // | dojo.fx.wipeOut({ node:"someId" }).play()
-
- var node = args.node = d.byId(args.node), s = node.style, o;
-
- var anim = d.animateProperty(d.mixin({
- properties: {
- height: {
- end: 1 // 0 causes IE to display the whole panel
- }
+ // sanitize parameters
+ if(!params){ params = {}; }
+ if(params.timeout && typeof params.timeout == "number" && params.timeout >= 0){
+ this.timeout = params.timeout;
}
- }, args));
-
- d.connect(anim, "beforeBegin", function(){
- o = s.overflow;
- s.overflow = "hidden";
- s.display = "";
- });
- d.connect(anim, "onEnd", function(){
- s.overflow = o;
- s.height = "auto";
- s.display = "none";
- });
-
- return anim; // dojo.Animation
- };
-
- dojo.fx.slideTo = function(/*Object*/ args){
- // summary:
- // Slide a node to a new top/left position
- //
- // description:
- // Returns an animation that will slide "node"
- // defined in args Object from its current position to
- // the position defined by (args.left, args.top).
- //
- // args: Object
- // A hash-map of standard `dojo.Animation` constructor properties
- // (such as easing: node: duration: and so on). Special args members
- // are `top` and `left`, which indicate the new position to slide to.
- //
- // example:
- // | dojo.fx.slideTo({ node: node, left:"40", top:"50", units:"px" }).play()
-
- var node = args.node = d.byId(args.node),
- top = null, left = null;
-
- var init = (function(n){
- return function(){
- var cs = d.getComputedStyle(n);
- var pos = cs.position;
- top = (pos == 'absolute' ? n.offsetTop : parseInt(cs.top) || 0);
- left = (pos == 'absolute' ? n.offsetLeft : parseInt(cs.left) || 0);
- if(pos != 'absolute' && pos != 'relative'){
- var ret = d.position(n, true);
- top = ret.y;
- left = ret.x;
- n.style.position="absolute";
- n.style.top=top+"px";
- n.style.left=left+"px";
- }
- };
- })(node);
- init();
+ },
- var anim = d.animateProperty(d.mixin({
- properties: {
- top: args.top || 0,
- left: args.left || 0
+ onMoveStop: function(/* dojo.dnd.Mover */ mover){
+ if(mover._timer){
+ // stop timer
+ clearTimeout(mover._timer);
+ // reflect the last received position
+ oldOnMove.call(this, mover, mover._leftTop)
}
- }, args));
- d.connect(anim, "beforeBegin", anim, init);
-
- return anim; // dojo.Animation
- };
-
-})();
-
-}
-
-if(!dojo._hasResource["dojo.NodeList-fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.NodeList-fx"] = true;
-dojo.provide("dojo.NodeList-fx");
+ dojo.dnd.Moveable.prototype.onMoveStop.apply(this, arguments);
+ },
+ onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
+ mover._leftTop = leftTop;
+ if(!mover._timer){
+ var _t = this; // to avoid using dojo.hitch()
+ mover._timer = setTimeout(function(){
+ // we don't have any pending requests
+ mover._timer = null;
+ // reflect the last received position
+ oldOnMove.call(_t, mover, mover._leftTop);
+ }, this.timeout);
+ }
+ }
+ });
+ return dojo.dnd.TimedMoveable;
+
+});
+},
+'dojo/NodeList-fx':function(){
+define("dojo/NodeList-fx", ["dojo/_base/NodeList", "./_base/lang", "./_base/connect", "./_base/fx", "./fx"],
+ function(NodeList, lang, connectLib, baseFx, coreFx) {
+ // module:
+ // dojo/NodeList-fx
+ // summary:
+ // TODOC
/*=====
dojo["NodeList-fx"] = {
- // summary: Adds dojo.fx animation support to dojo.query()
+ // summary: Adds dojo.fx animation support to dojo.query() by extending the NodeList class
+ // with additional FX functions. NodeList is the array-like object used to hold query results.
};
+
+// doc alias helpers:
+NodeList = dojo.NodeList;
=====*/
-dojo.extend(dojo.NodeList, {
+lang.extend(NodeList, {
_anim: function(obj, method, args){
args = args||{};
- var a = dojo.fx.combine(
+ var a = coreFx.combine(
this.map(function(item){
var tmpArgs = { node: item };
- dojo.mixin(tmpArgs, args);
+ lang.mixin(tmpArgs, args);
return obj[method](tmpArgs);
})
);
@@ -6956,129 +11138,133 @@ dojo.extend(dojo.NodeList, {
},
wipeIn: function(args){
- // summary:
+ // summary:
// wipe in all elements of this NodeList via `dojo.fx.wipeIn`
//
- // args: Object?
+ // args: Object?
// Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
- // returns: dojo.Animation|dojo.NodeList
+ // returns: dojo.Animation|dojo.NodeList
// A special args member `auto` can be passed to automatically play the animation.
// If args.auto is present, the original dojo.NodeList will be returned for further
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
//
- // example:
+ // example:
// Fade in all tables with class "blah":
// | dojo.query("table.blah").wipeIn().play();
//
- // example:
+ // example:
// Utilizing `auto` to get the NodeList back:
// | dojo.query(".titles").wipeIn({ auto:true }).onclick(someFunction);
//
- return this._anim(dojo.fx, "wipeIn", args); // dojo.Animation|dojo.NodeList
+ return this._anim(coreFx, "wipeIn", args); // dojo.Animation|dojo.NodeList
},
wipeOut: function(args){
- // summary:
+ // summary:
// wipe out all elements of this NodeList via `dojo.fx.wipeOut`
//
- // args: Object?
+ // args: Object?
// Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
- // returns: dojo.Animation|dojo.NodeList
+ // returns: dojo.Animation|dojo.NodeList
// A special args member `auto` can be passed to automatically play the animation.
// If args.auto is present, the original dojo.NodeList will be returned for further
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
//
- // example:
+ // example:
// Wipe out all tables with class "blah":
// | dojo.query("table.blah").wipeOut().play();
- return this._anim(dojo.fx, "wipeOut", args); // dojo.Animation|dojo.NodeList
+ return this._anim(coreFx, "wipeOut", args); // dojo.Animation|dojo.NodeList
},
slideTo: function(args){
- // summary:
+ // summary:
// slide all elements of the node list to the specified place via `dojo.fx.slideTo`
//
- // args: Object?
+ // args: Object?
// Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
- // returns: dojo.Animation|dojo.NodeList
+ // returns: dojo.Animation|dojo.NodeList
// A special args member `auto` can be passed to automatically play the animation.
// If args.auto is present, the original dojo.NodeList will be returned for further
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
//
- // example:
+ // example:
// | Move all tables with class "blah" to 300/300:
// | dojo.query("table.blah").slideTo({
// | left: 40,
// | top: 50
// | }).play();
- return this._anim(dojo.fx, "slideTo", args); // dojo.Animation|dojo.NodeList
+ return this._anim(coreFx, "slideTo", args); // dojo.Animation|dojo.NodeList
},
fadeIn: function(args){
- // summary:
+ // summary:
// fade in all elements of this NodeList via `dojo.fadeIn`
//
- // args: Object?
+ // args: Object?
// Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
- // returns: dojo.Animation|dojo.NodeList
+ // returns: dojo.Animation|dojo.NodeList
// A special args member `auto` can be passed to automatically play the animation.
// If args.auto is present, the original dojo.NodeList will be returned for further
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
//
- // example:
+ // example:
// Fade in all tables with class "blah":
// | dojo.query("table.blah").fadeIn().play();
- return this._anim(dojo, "fadeIn", args); // dojo.Animation|dojo.NodeList
+ return this._anim(baseFx, "fadeIn", args); // dojo.Animation|dojo.NodeList
},
fadeOut: function(args){
- // summary:
+ // summary:
// fade out all elements of this NodeList via `dojo.fadeOut`
//
- // args: Object?
+ // args: Object?
// Additional dojo.Animation arguments to mix into this set with the addition of
// an `auto` parameter.
//
- // returns: dojo.Animation|dojo.NodeList
+ // returns: dojo.Animation|dojo.NodeList
// A special args member `auto` can be passed to automatically play the animation.
// If args.auto is present, the original dojo.NodeList will be returned for further
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
//
- // example:
+ // example:
// Fade out all elements with class "zork":
// | dojo.query(".zork").fadeOut().play();
- // example:
+ // example:
// Fade them on a delay and do something at the end:
// | var fo = dojo.query(".zork").fadeOut();
// | dojo.connect(fo, "onEnd", function(){ /*...*/ });
// | fo.play();
- // example:
+ // example:
// Using `auto`:
// | dojo.query("li").fadeOut({ auto:true }).filter(filterFn).forEach(doit);
//
- return this._anim(dojo, "fadeOut", args); // dojo.Animation|dojo.NodeList
+ return this._anim(baseFx, "fadeOut", args); // dojo.Animation|dojo.NodeList
},
animateProperty: function(args){
- // summary:
+ // summary:
// Animate all elements of this NodeList across the properties specified.
// syntax identical to `dojo.animateProperty`
//
+ // args: Object?
+ // Additional dojo.Animation arguments to mix into this set with the addition of
+ // an `auto` parameter.
+ //
// returns: dojo.Animation|dojo.NodeList
// A special args member `auto` can be passed to automatically play the animation.
// If args.auto is present, the original dojo.NodeList will be returned for further
// chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed
//
- // example:
+ // example:
// | dojo.query(".zork").animateProperty({
// | duration: 500,
// | properties: {
@@ -7094,7 +11280,7 @@ dojo.extend(dojo.NodeList, {
// | height:240
// | }
// | }).onclick(handler);
- return this._anim(dojo, "animateProperty", args); // dojo.Animation|dojo.NodeList
+ return this._anim(baseFx, "animateProperty", args); // dojo.Animation|dojo.NodeList
},
anim: function( /*Object*/ properties,
@@ -7102,31 +11288,31 @@ dojo.extend(dojo.NodeList, {
/*Function?*/ easing,
/*Function?*/ onEnd,
/*Integer?*/ delay){
- // summary:
+ // summary:
// Animate one or more CSS properties for all nodes in this list.
// The returned animation object will already be playing when it
// is returned. See the docs for `dojo.anim` for full details.
- // properties: Object
+ // properties: Object
// the properties to animate. does NOT support the `auto` parameter like other
// NodeList-fx methods.
- // duration: Integer?
+ // duration: Integer?
// Optional. The time to run the animations for
- // easing: Function?
+ // easing: Function?
// Optional. The easing function to use.
- // onEnd: Function?
+ // onEnd: Function?
// A function to be called when the animation ends
- // delay:
+ // delay:
// how long to delay playing the returned animation
- // example:
+ // example:
// Another way to fade out:
// | dojo.query(".thinger").anim({ opacity: 0 });
- // example:
+ // example:
// animate all elements with the "thigner" class to a width of 500
// pixels over half a second
// | dojo.query(".thinger").anim({ width: 500 }, 700);
- var canim = dojo.fx.combine(
+ var canim = coreFx.combine(
this.map(function(item){
- return dojo.animateProperty({
+ return baseFx.animateProperty({
node: item,
properties: properties,
duration: duration||350,
@@ -7135,837 +11321,496 @@ dojo.extend(dojo.NodeList, {
})
);
if(onEnd){
- dojo.connect(canim, "onEnd", onEnd);
+ connectLib.connect(canim, "onEnd", onEnd);
}
return canim.play(delay||0); // dojo.Animation
}
});
-}
-
-if(!dojo._hasResource["dojo.colors"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.colors"] = true;
-dojo.provide("dojo.colors");
-
-dojo.getObject("colors", true, dojo);
+return NodeList;
+});
-//TODO: this module appears to break naming conventions
+},
+'dijit/form/_ListMouseMixin':function(){
+define("dijit/form/_ListMouseMixin", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/event", // event.stop
+ "dojo/touch",
+ "./_ListBase"
+], function(declare, event, touch, _ListBase){
/*=====
-dojo.colors = {
- // summary: Color utilities
-}
+var _ListBase = dijit.form._ListBase;
=====*/
-(function(){
- // this is a standard conversion prescribed by the CSS3 Color Module
- var hue2rgb = function(m1, m2, h){
- if(h < 0){ ++h; }
- if(h > 1){ --h; }
- var h6 = 6 * h;
- if(h6 < 1){ return m1 + (m2 - m1) * h6; }
- if(2 * h < 1){ return m2; }
- if(3 * h < 2){ return m1 + (m2 - m1) * (2 / 3 - h) * 6; }
- return m1;
- };
-
- dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){
- // summary:
- // get rgb(a) array from css-style color declarations
- // description:
- // this function can handle all 4 CSS3 Color Module formats: rgb,
- // rgba, hsl, hsla, including rgb(a) with percentage values.
- var m = color.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);
- if(m){
- var c = m[2].split(/\s*,\s*/), l = c.length, t = m[1], a;
- if((t == "rgb" && l == 3) || (t == "rgba" && l == 4)){
- var r = c[0];
- if(r.charAt(r.length - 1) == "%"){
- // 3 rgb percentage values
- a = dojo.map(c, function(x){
- return parseFloat(x) * 2.56;
- });
- if(l == 4){ a[3] = c[3]; }
- return dojo.colorFromArray(a, obj); // dojo.Color
- }
- return dojo.colorFromArray(c, obj); // dojo.Color
- }
- if((t == "hsl" && l == 3) || (t == "hsla" && l == 4)){
- // normalize hsl values
- var H = ((parseFloat(c[0]) % 360) + 360) % 360 / 360,
- S = parseFloat(c[1]) / 100,
- L = parseFloat(c[2]) / 100,
- // calculate rgb according to the algorithm
- // recommended by the CSS3 Color Module
- m2 = L <= 0.5 ? L * (S + 1) : L + S - L * S,
- m1 = 2 * L - m2;
- a = [
- hue2rgb(m1, m2, H + 1 / 3) * 256,
- hue2rgb(m1, m2, H) * 256,
- hue2rgb(m1, m2, H - 1 / 3) * 256,
- 1
- ];
- if(l == 4){ a[3] = c[3]; }
- return dojo.colorFromArray(a, obj); // dojo.Color
- }
- }
- return null; // dojo.Color
- };
-
- var confine = function(c, low, high){
- // summary:
- // sanitize a color component by making sure it is a number,
- // and clamping it to valid values
- c = Number(c);
- return isNaN(c) ? high : c < low ? low : c > high ? high : c; // Number
- };
-
- dojo.Color.prototype.sanitize = function(){
- // summary: makes sure that the object has correct attributes
- var t = this;
- t.r = Math.round(confine(t.r, 0, 255));
- t.g = Math.round(confine(t.g, 0, 255));
- t.b = Math.round(confine(t.b, 0, 255));
- t.a = confine(t.a, 0, 1);
- return this; // dojo.Color
- };
-})();
-
-
-dojo.colors.makeGrey = function(/*Number*/ g, /*Number?*/ a){
- // summary: creates a greyscale color with an optional alpha
- return dojo.colorFromArray([g, g, g, a]);
-};
-
-// mixin all CSS3 named colors not already in _base, along with SVG 1.0 variant spellings
-dojo.mixin(dojo.Color.named, {
- aliceblue: [240,248,255],
- antiquewhite: [250,235,215],
- aquamarine: [127,255,212],
- azure: [240,255,255],
- beige: [245,245,220],
- bisque: [255,228,196],
- blanchedalmond: [255,235,205],
- blueviolet: [138,43,226],
- brown: [165,42,42],
- burlywood: [222,184,135],
- cadetblue: [95,158,160],
- chartreuse: [127,255,0],
- chocolate: [210,105,30],
- coral: [255,127,80],
- cornflowerblue: [100,149,237],
- cornsilk: [255,248,220],
- crimson: [220,20,60],
- cyan: [0,255,255],
- darkblue: [0,0,139],
- darkcyan: [0,139,139],
- darkgoldenrod: [184,134,11],
- darkgray: [169,169,169],
- darkgreen: [0,100,0],
- darkgrey: [169,169,169],
- darkkhaki: [189,183,107],
- darkmagenta: [139,0,139],
- darkolivegreen: [85,107,47],
- darkorange: [255,140,0],
- darkorchid: [153,50,204],
- darkred: [139,0,0],
- darksalmon: [233,150,122],
- darkseagreen: [143,188,143],
- darkslateblue: [72,61,139],
- darkslategray: [47,79,79],
- darkslategrey: [47,79,79],
- darkturquoise: [0,206,209],
- darkviolet: [148,0,211],
- deeppink: [255,20,147],
- deepskyblue: [0,191,255],
- dimgray: [105,105,105],
- dimgrey: [105,105,105],
- dodgerblue: [30,144,255],
- firebrick: [178,34,34],
- floralwhite: [255,250,240],
- forestgreen: [34,139,34],
- gainsboro: [220,220,220],
- ghostwhite: [248,248,255],
- gold: [255,215,0],
- goldenrod: [218,165,32],
- greenyellow: [173,255,47],
- grey: [128,128,128],
- honeydew: [240,255,240],
- hotpink: [255,105,180],
- indianred: [205,92,92],
- indigo: [75,0,130],
- ivory: [255,255,240],
- khaki: [240,230,140],
- lavender: [230,230,250],
- lavenderblush: [255,240,245],
- lawngreen: [124,252,0],
- lemonchiffon: [255,250,205],
- lightblue: [173,216,230],
- lightcoral: [240,128,128],
- lightcyan: [224,255,255],
- lightgoldenrodyellow: [250,250,210],
- lightgray: [211,211,211],
- lightgreen: [144,238,144],
- lightgrey: [211,211,211],
- lightpink: [255,182,193],
- lightsalmon: [255,160,122],
- lightseagreen: [32,178,170],
- lightskyblue: [135,206,250],
- lightslategray: [119,136,153],
- lightslategrey: [119,136,153],
- lightsteelblue: [176,196,222],
- lightyellow: [255,255,224],
- limegreen: [50,205,50],
- linen: [250,240,230],
- magenta: [255,0,255],
- mediumaquamarine: [102,205,170],
- mediumblue: [0,0,205],
- mediumorchid: [186,85,211],
- mediumpurple: [147,112,219],
- mediumseagreen: [60,179,113],
- mediumslateblue: [123,104,238],
- mediumspringgreen: [0,250,154],
- mediumturquoise: [72,209,204],
- mediumvioletred: [199,21,133],
- midnightblue: [25,25,112],
- mintcream: [245,255,250],
- mistyrose: [255,228,225],
- moccasin: [255,228,181],
- navajowhite: [255,222,173],
- oldlace: [253,245,230],
- olivedrab: [107,142,35],
- orange: [255,165,0],
- orangered: [255,69,0],
- orchid: [218,112,214],
- palegoldenrod: [238,232,170],
- palegreen: [152,251,152],
- paleturquoise: [175,238,238],
- palevioletred: [219,112,147],
- papayawhip: [255,239,213],
- peachpuff: [255,218,185],
- peru: [205,133,63],
- pink: [255,192,203],
- plum: [221,160,221],
- powderblue: [176,224,230],
- rosybrown: [188,143,143],
- royalblue: [65,105,225],
- saddlebrown: [139,69,19],
- salmon: [250,128,114],
- sandybrown: [244,164,96],
- seagreen: [46,139,87],
- seashell: [255,245,238],
- sienna: [160,82,45],
- skyblue: [135,206,235],
- slateblue: [106,90,205],
- slategray: [112,128,144],
- slategrey: [112,128,144],
- snow: [255,250,250],
- springgreen: [0,255,127],
- steelblue: [70,130,180],
- tan: [210,180,140],
- thistle: [216,191,216],
- tomato: [255,99,71],
- transparent: [0, 0, 0, 0],
- turquoise: [64,224,208],
- violet: [238,130,238],
- wheat: [245,222,179],
- whitesmoke: [245,245,245],
- yellowgreen: [154,205,50]
-});
-
-}
-
-if(!dojo._hasResource["dojo.i18n"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.i18n"] = true;
-dojo.provide("dojo.i18n");
+// module:
+// dijit/form/_ListMouseMixin
+// summary:
+// a mixin to handle mouse or touch events for a focus-less menu
-dojo.getObject("i18n", true, dojo);
+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
-/*=====
-dojo.i18n = {
- // summary: Utility classes to enable loading of resources for internationalization (i18n)
-};
-=====*/
+ 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");
+ },
-// when using a real AMD loader, dojo.i18n.getLocalization is already defined by dojo/lib/backCompat
-dojo.i18n.getLocalization = dojo.i18n.getLocalization || function(/*String*/packageName, /*String*/bundleName, /*String?*/locale){
- // summary:
- // Returns an Object containing the localization for a given resource
- // bundle in a package, matching the specified locale.
- // description:
- // Returns a hash containing name/value pairs in its prototypesuch
- // that values can be easily overridden. Throws an exception if the
- // bundle is not found. Bundle must have already been loaded by
- // `dojo.requireLocalization()` or by a build optimization step. NOTE:
- // try not to call this method as part of an object property
- // definition (`var foo = { bar: dojo.i18n.getLocalization() }`). In
- // some loading situations, the bundle may not be available in time
- // for the object definition. Instead, call this method inside a
- // function that is run after all modules load or the page loads (like
- // in `dojo.addOnLoad()`), or in a widget lifecycle method.
- // packageName:
- // package which is associated with this resource
- // bundleName:
- // the base filename of the resource bundle (without the ".js" suffix)
- // locale:
- // the variant to load (optional). By default, the locale defined by
- // the host environment: dojo.locale
-
- locale = dojo.i18n.normalizeLocale(locale);
-
- // look for nearest locale match
- var elements = locale.split('-');
- var module = [packageName,"nls",bundleName].join('.');
- var bundle = dojo._loadedModules[module];
- if(bundle){
- var localization;
- for(var i = elements.length; i > 0; i--){
- var loc = elements.slice(0, i).join('_');
- if(bundle[loc]){
- localization = bundle[loc];
- break;
- }
- }
- if(!localization){
- localization = bundle.ROOT;
+ _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));
+ },
- // make a singleton prototype so that the caller won't accidentally change the values globally
- if(localization){
- var clazz = function(){};
- clazz.prototype = localization;
- return new clazz(); // Object
+ _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);
}
- }
-
- throw new Error("Bundle not found: " + bundleName + " in " + packageName+" , locale=" + locale);
-};
-
-dojo.i18n.normalizeLocale = function(/*String?*/locale){
- // summary:
- // Returns canonical form of locale, as used by Dojo.
- //
- // description:
- // All variants are case-insensitive and are separated by '-' as specified in [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).
- // If no locale is specified, the dojo.locale is returned. dojo.locale is defined by
- // the user agent's locale unless overridden by djConfig.
-
- var result = locale ? locale.toLowerCase() : dojo.locale;
- if(result == "root"){
- result = "ROOT";
- }
- return result; // String
-};
-
-dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){
- // summary:
- // See dojo.requireLocalization()
- // description:
- // Called by the bootstrap, but factored out so that it is only
- // included in the build when needed.
+ },
- var targetLocale = dojo.i18n.normalizeLocale(locale);
- var bundlePackage = [moduleName, "nls", bundleName].join(".");
- // NOTE:
- // When loading these resources, the packaging does not match what is
- // on disk. This is an implementation detail, as this is just a
- // private data structure to hold the loaded resources. e.g.
- // `tests/hello/nls/en-us/salutations.js` is loaded as the object
- // `tests.hello.nls.salutations.en_us={...}` The structure on disk is
- // intended to be most convenient for developers and translators, but
- // in memory it is more logical and efficient to store in a different
- // order. Locales cannot use dashes, since the resulting path will
- // not evaluate as valid JS, so we translate them to underscores.
-
- //Find the best-match locale to load if we have available flat locales.
- var bestLocale = "";
- if(availableFlatLocales){
- var flatLocales = availableFlatLocales.split(",");
- for(var i = 0; i < flatLocales.length; i++){
- //Locale must match from start of string.
- //Using ["indexOf"] so customBase builds do not see
- //this as a dojo._base.array dependency.
- if(targetLocale["indexOf"](flatLocales[i]) == 0){
- if(flatLocales[i].length > bestLocale.length){
- bestLocale = flatLocales[i];
- }
- }
- }
- if(!bestLocale){
- bestLocale = "ROOT";
+ _onMouseOut: function(/*Event*/ /*===== evt ====*/){
+ if(this._hoveredNode){
+ this.onUnhover(this._hoveredNode);
+ if(this._getSelectedAttr() == this._hoveredNode){
+ this.onSelect(this._hoveredNode);
+ }
+ this._hoveredNode = null;
}
- }
-
- //See if the desired locale is already loaded.
- var tempLocale = availableFlatLocales ? bestLocale : targetLocale;
- var bundle = dojo._loadedModules[bundlePackage];
- var localizedBundle = null;
- if(bundle){
- if(dojo.config.localizationComplete && bundle._built){return;}
- var jsLoc = tempLocale.replace(/-/g, '_');
- var translationPackage = bundlePackage+"."+jsLoc;
- localizedBundle = dojo._loadedModules[translationPackage];
- }
+ if(this._isDragging){
+ this._cancelDrag = (new Date()).getTime() + 1000; // cancel in 1 second if no _onMouseOver fires
+ }
+ },
- if(!localizedBundle){
- bundle = dojo["provide"](bundlePackage);
- var syms = dojo._getModuleSymbols(moduleName);
- var modpath = syms.concat("nls").join("/");
- var parent;
-
- dojo.i18n._searchLocalePath(tempLocale, availableFlatLocales, function(loc){
- var jsLoc = loc.replace(/-/g, '_');
- var translationPackage = bundlePackage + "." + jsLoc;
- var loaded = false;
- if(!dojo._loadedModules[translationPackage]){
- // Mark loaded whether it's found or not, so that further load attempts will not be made
- dojo["provide"](translationPackage);
- var module = [modpath];
- if(loc != "ROOT"){module.push(loc);}
- module.push(bundleName);
- var filespec = module.join("/") + '.js';
- loaded = dojo._loadPath(filespec, null, function(hash){
- hash = hash.root || hash;
- // Use singleton with prototype to point to parent bundle, then mix-in result from loadPath
- var clazz = function(){};
- clazz.prototype = parent;
- bundle[jsLoc] = new clazz();
- for(var j in hash){ bundle[jsLoc][j] = hash[j]; }
- });
- }else{
- loaded = true;
+ _onMouseOver: function(/*Event*/ evt){
+ if(this._cancelDrag){
+ var time = (new Date()).getTime();
+ if(time > this._cancelDrag){
+ this._isDragging = false;
}
- if(loaded && bundle[jsLoc]){
- parent = bundle[jsLoc];
- }else{
- bundle[jsLoc] = parent;
+ this._cancelDrag = null;
+ }
+ var node = this._getTarget(evt);
+ if(!node){ return; }
+ if(this._hoveredNode != node){
+ if(this._hoveredNode){
+ this._onMouseOut({ target: this._hoveredNode });
}
-
- if(availableFlatLocales){
- //Stop the locale path searching if we know the availableFlatLocales, since
- //the first call to this function will load the only bundle that is needed.
- return true;
+ if(node && node.parentNode == this.containerNode){
+ if(this._isDragging){
+ this._setSelectedAttr(node);
+ }else{
+ this._hoveredNode = node;
+ this.onHover(node);
+ }
}
- });
+ }
}
+});
- //Save the best locale bundle as the target locale bundle when we know the
- //the available bundles.
- if(availableFlatLocales && targetLocale != bestLocale){
- bundle[targetLocale.replace(/-/g, '_')] = bundle[bestLocale.replace(/-/g, '_')];
- }
-};
+});
-(function(){
- // If other locales are used, dojo.requireLocalization should load them as
- // well, by default.
- //
- // Override dojo.requireLocalization to do load the default bundle, then
- // iterate through the extraLocale list and load those translations as
- // well, unless a particular locale was requested.
+},
+'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",
+'dojo/cookie':function(){
+define("dojo/cookie", ["./_base/kernel", "./regexp"], function(dojo, regexp) {
+ // module:
+ // dojo/cookie
+ // summary:
+ // TODOC
- var extra = dojo.config.extraLocale;
- if(extra){
- if(!extra instanceof Array){
- extra = [extra];
- }
- var req = dojo.i18n._requireLocalization;
- dojo.i18n._requireLocalization = function(m, b, locale, availableFlatLocales){
- req(m,b,locale, availableFlatLocales);
- if(locale){return;}
- for(var i=0; i<extra.length; i++){
- req(m,b,extra[i], availableFlatLocales);
- }
- };
- }
-})();
-
-dojo.i18n._searchLocalePath = function(/*String*/locale, /*Boolean*/down, /*Function*/searchFunc){
- // summary:
- // A helper method to assist in searching for locale-based resources.
- // Will iterate through the variants of a particular locale, either up
- // or down, executing a callback function. For example, "en-us" and
- // true will try "en-us" followed by "en" and finally "ROOT".
+/*=====
+dojo.__cookieProps = function(){
+ // expires: Date|String|Number?
+ // If a number, the number of days from today at which the cookie
+ // will expire. If a date, the date past which the cookie will expire.
+ // If expires is in the past, the cookie will be deleted.
+ // If expires is omitted or is 0, the cookie will expire when the browser closes.
+ // path: String?
+ // The path to use for the cookie.
+ // domain: String?
+ // The domain to use for the cookie.
+ // secure: Boolean?
+ // Whether to only send the cookie on secure connections
+ this.expires = expires;
+ this.path = path;
+ this.domain = domain;
+ this.secure = secure;
+}
+=====*/
- locale = dojo.i18n.normalizeLocale(locale);
- var elements = locale.split('-');
- var searchlist = [];
- for(var i = elements.length; i > 0; i--){
- searchlist.push(elements.slice(0, i).join('-'));
- }
- searchlist.push(false);
- if(down){searchlist.reverse();}
+dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/props){
+ // summary:
+ // Get or set a cookie.
+ // description:
+ // If one argument is passed, returns the value of the cookie
+ // For two or more arguments, acts as a setter.
+ // name:
+ // Name of the cookie
+ // value:
+ // Value for the cookie
+ // props:
+ // Properties for the cookie
+ // example:
+ // set a cookie with the JSON-serialized contents of an object which
+ // will expire 5 days from now:
+ // | dojo.cookie("configObj", dojo.toJson(config), { expires: 5 });
+ //
+ // example:
+ // de-serialize a cookie back into a JavaScript object:
+ // | var config = dojo.fromJson(dojo.cookie("configObj"));
+ //
+ // example:
+ // delete a cookie:
+ // | dojo.cookie("configObj", null, {expires: -1});
+ var c = document.cookie, ret;
+ if(arguments.length == 1){
+ var matches = c.match(new RegExp("(?:^|; )" + regexp.escapeString(name) + "=([^;]*)"));
+ ret = matches ? decodeURIComponent(matches[1]) : undefined;
+ }else{
+ props = props || {};
+// FIXME: expires=0 seems to disappear right away, not on close? (FF3) Change docs?
+ var exp = props.expires;
+ if(typeof exp == "number"){
+ var d = new Date();
+ d.setTime(d.getTime() + exp*24*60*60*1000);
+ exp = props.expires = d;
+ }
+ if(exp && exp.toUTCString){ props.expires = exp.toUTCString(); }
- for(var j = searchlist.length - 1; j >= 0; j--){
- var loc = searchlist[j] || "ROOT";
- var stop = searchFunc(loc);
- if(stop){ break; }
+ value = encodeURIComponent(value);
+ var updatedCookie = name + "=" + value, propName;
+ for(propName in props){
+ updatedCookie += "; " + propName;
+ var propValue = props[propName];
+ if(propValue !== true){ updatedCookie += "=" + propValue; }
+ }
+ document.cookie = updatedCookie;
}
+ return ret; // String|undefined
};
-dojo.i18n._preloadLocalizations = function(/*String*/bundlePrefix, /*Array*/localesGenerated){
+dojo.cookie.isSupported = function(){
// summary:
- // Load built, flattened resource bundles, if available for all
- // locales used in the page. Only called by built layer files.
-
- function preload(locale){
- locale = dojo.i18n.normalizeLocale(locale);
- dojo.i18n._searchLocalePath(locale, true, function(loc){
- for(var i=0; i<localesGenerated.length;i++){
- if(localesGenerated[i] == loc){
- dojo["require"](bundlePrefix+"_"+loc);
- return true; // Boolean
- }
- }
- return false; // Boolean
- });
- }
- preload();
- var extra = dojo.config.extraLocale||[];
- for(var i=0; i<extra.length; i++){
- preload(extra[i]);
+ // Use to determine if the current browser supports cookies or not.
+ //
+ // Returns true if user allows cookies.
+ // Returns false if user doesn't allow cookies.
+
+ if(!("cookieEnabled" in navigator)){
+ this("__djCookieTest__", "CookiesAllowed");
+ navigator.cookieEnabled = this("__djCookieTest__") == "CookiesAllowed";
+ if(navigator.cookieEnabled){
+ this("__djCookieTest__", "", {expires: -1});
+ }
}
+ return navigator.cookieEnabled;
};
-}
-
-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");
-
-
+return dojo.cookie;
+});
-dojo.declare("dijit._PaletteMixin",
- [dijit._CssStateMixin],
- {
+},
+'dojo/cache':function(){
+define("dojo/cache", ["./_base/kernel", "./text"], function(dojo, text){
+ // module:
+ // dojo/cache
// 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.
+ // The module defines dojo.cache by loading dojo/text.
- // 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,
-=====*/
+ //dojo.cache is defined in dojo/text
+ return dojo.cache;
+});
-/*=====
- // _xDim: [protected] Integer
- // This is the number of cells horizontally across.
- _xDim: null,
-=====*/
+},
+'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",
+'dijit/ProgressBar':function(){
+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){
/*=====
- // _yDim: [protected] Integer
- // This is the number of cells vertically down.
- _yDim: null,
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
=====*/
- // tabIndex: String
- // Widget tab index.
- tabIndex: "0",
+// module:
+// dijit/ProgressBar
+// summary:
+// A progress indication widget, showing the amount completed
+// (often the percentage completed) of a task.
- // 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: '',
+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>
- _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
+ // progress: [const] String (Percentage or Number)
+ // Number or percentage indicating amount of task completed.
+ // Deprecated. Use "value" instead.
+ progress: "0",
- this._cells = [];
- var url = this._blankGif;
-
- dyeClassObj = dyeClassObj || dojo.getObject(this.dyeClass);
+ // 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: "",
- 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]
- });
+ // maximum: [const] Float
+ // Max sample number
+ maximum: 100,
- // prepare cell inner structure
- cellObject.fillCell(cellNode, url);
+ // places: [const] Number
+ // Number of places to show in values; 0 by default
+ places: 0,
- this.connect(cellNode, "ondijitclick", "_onCellClick");
- this._trackMouseState(cellNode, this.cellClass);
+ // 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,
- dojo.place(cellNode, rowNode);
+ // label: String?
+ // Label on progress bar. Defaults to percentage for determinate progress bar and
+ // blank for indeterminate progress bar.
+ label:"",
- cellNode.index = this._cells.length;
+ // 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: '',
- // save cell info into _cells
- this._cells.push({node:cellNode, dye:cellObject});
- }
- }
- }
- this._xDim = choices[0].length;
- this._yDim = choices.length;
+ templateString: template,
- // 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.
+ // _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"),
- 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
- )
- );
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ if(!("value" in this.params)){
+ this.value = this.indeterminate ? Infinity : this.progress;
}
},
- postCreate: function(){
+ buildRendering: 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);
+ this.indeterminateHighContrastImage.setAttribute("src",
+ this._indeterminateHighContrastImagePath.toString());
+ this.update();
},
- _onCellClick: function(/*Event*/ evt){
+ update: function(/*Object?*/attributes){
// summary:
- // Handler for click, enter key & space key. Selects the cell.
- // evt:
- // The event.
+ // 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
- 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");
+ // TODO: deprecate this method and use set() instead
- dojo.stopEvent(evt);
- },
+ 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;
+ }
- _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");
+ 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);
- // Set tabIndex of new cell
- this._currentFocus = node;
- if(node){
- dojo.attr(node, "tabIndex", this.tabIndex);
- }
+ domClass.toggle(this.domNode, "dijitProgressBarIndeterminate", this.indeterminate);
+ tip.style.width = (percent * 100) + "%";
+ this.onChange();
},
- _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;
- }
- }
+ _setValueAttr: function(v){
+ this._set("value", v);
+ if(v == Infinity){
+ this.update({indeterminate:true});
+ }else{
+ this.update({indeterminate:false, progress:v});
}
-
- // record new value, or null if no matching cell
- this._set("value", this._selectedCell >= 0 ? value : null);
+ },
- if(priorityChange || priorityChange === undefined){
- this.onChange(value);
- }
+ _setLabelAttr: function(label){
+ this._set("label", label);
+ this.update();
},
- onChange: function(value){
- // summary:
- // Callback when a cell is selected.
- // value: String
- // Value corresponding to cell.
+ _setIndeterminateAttr: function(indeterminate){
+ // Deprecated, use set("value", ...) instead
+ this.indeterminate = indeterminate;
+ this.update();
},
- _navigateByKey: function(increment, typeCount){
+ report: function(/*float*/percent){
// 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.
+ // Generates message to show inside progress bar (normally indicating amount of task completed).
+ // May be overridden.
// 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);
+ // extension
- // 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);
- }
+ return this.label ? this.label :
+ (this.indeterminate ? "&#160;" : number.format(percent, { type: "percent", places: this.places, locale: this.lang }));
},
- _getDye: function(/*DomNode*/ cell){
+ onChange: function(){
// summary:
- // Get JS object for given cell DOMNode
-
- return this._cells[cell.index].dye;
+ // Callback fired when progress updates.
+ // tags:
+ // extension
}
});
-/*=====
-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.
- },
+},
+'dijit/_base/popup':function(){
+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);
+};
- fillCell: function(cell, blankGif){
- // summary:
- // Add cell DOMNode inner structure
- // cell: DomNode
- // The surrounding cell
- // blankGif: String
- // URL for blank cell image
+// 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;
}
-);
-=====*/
-
-}
-
-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");
-
-
-
+ return origOpen.call(this, args);
+};
+return popup;
+});
+},
+'dijit/ColorPalette':function(){
+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
-dojo.declare("dijit.ColorPalette",
- [dijit._Widget, dijit._Templated, dijit._PaletteMixin],
- {
+var ColorPalette = declare("dijit.ColorPalette", [_Widget, _TemplatedMixin, _PaletteMixin], {
// summary:
// A keyboard accessible color-picking widget
// description:
@@ -7973,7 +11818,7 @@ dojo.declare("dijit.ColorPalette",
// Can be used standalone, or as a popup.
//
// example:
- // | <div dojoType="dijit.ColorPalette"></div>
+ // | <div data-dojo-type="dijit.ColorPalette"></div>
//
// example:
// | var picker = new dijit.ColorPalette({ },srcNode);
@@ -8004,29 +11849,35 @@ dojo.declare("dijit.ColorPalette",
// 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"),
+ 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.
- // 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
- })
- );
+ i18n.getLocalization("dojo", "colors", this.lang));
}
});
-dojo.declare("dijit._Color", dojo.Color, {
+ColorPalette._Color = declare("dijit._Color", Color, {
// summary:
// Object associated with each cell in a ColorPalette palette.
// Implements dijit.Dye.
@@ -8049,15 +11900,15 @@ dojo.declare("dijit._Color", dojo.Color, {
// _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")
+ "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(dojo.Color.named[alias]);
+ this.setColor(Color.named[alias]);
},
getValue: function(){
@@ -8068,12 +11919,12 @@ dojo.declare("dijit._Color", dojo.Color, {
},
fillCell: function(/*DOMNode*/ cell, /*String*/ blankGif){
- var html = dojo.string.substitute(this.hc ? this.hcTemplate : this.template, {
+ 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,
@@ -8081,270 +11932,2043 @@ dojo.declare("dijit._Color", dojo.Color, {
size: this.palette == "7x10" ? "height: 145px; width: 206px" : "height: 64px; width: 86px"
});
- dojo.place(html, cell);
+ domConstruct.place(html, cell);
}
});
-}
-if(!dojo._hasResource["dojo.dnd.common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.common"] = true;
-dojo.provide("dojo.dnd.common");
+return ColorPalette;
+});
-dojo.getObject("dnd", true, dojo);
+},
+'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",
+'dojo/_base/url':function(){
+define("dojo/_base/url", ["./kernel"], function(dojo) {
+ // module:
+ // dojo/url
+ // summary:
+ // This module contains dojo._Url
+
+ var
+ ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),
+ ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"),
+ _Url = function(){
+ var n = null,
+ _a = arguments,
+ uri = [_a[0]];
+ // resolve uri components relative to each other
+ for(var i = 1; i<_a.length; i++){
+ if(!_a[i]){ continue; }
+
+ // Safari doesn't support this.constructor so we have to be explicit
+ // FIXME: Tracked (and fixed) in Webkit bug 3537.
+ // http://bugs.webkit.org/show_bug.cgi?id=3537
+ var relobj = new _Url(_a[i]+""),
+ uriobj = new _Url(uri[0]+"");
+
+ if(
+ relobj.path == "" &&
+ !relobj.scheme &&
+ !relobj.authority &&
+ !relobj.query
+ ){
+ if(relobj.fragment != n){
+ uriobj.fragment = relobj.fragment;
+ }
+ relobj = uriobj;
+ }else if(!relobj.scheme){
+ relobj.scheme = uriobj.scheme;
+
+ if(!relobj.authority){
+ relobj.authority = uriobj.authority;
+
+ if(relobj.path.charAt(0) != "/"){
+ var path = uriobj.path.substring(0,
+ uriobj.path.lastIndexOf("/") + 1) + relobj.path;
+
+ var segs = path.split("/");
+ for(var j = 0; j < segs.length; j++){
+ if(segs[j] == "."){
+ // flatten "./" references
+ if(j == segs.length - 1){
+ segs[j] = "";
+ }else{
+ segs.splice(j, 1);
+ j--;
+ }
+ }else if(j > 0 && !(j == 1 && segs[0] == "") &&
+ segs[j] == ".." && segs[j-1] != ".."){
+ // flatten "../" references
+ if(j == (segs.length - 1)){
+ segs.splice(j, 1);
+ segs[j - 1] = "";
+ }else{
+ segs.splice(j - 1, 2);
+ j -= 2;
+ }
+ }
+ }
+ relobj.path = segs.join("/");
+ }
+ }
+ }
-dojo.dnd.getCopyKeyState = dojo.isCopyKey;
+ uri = [];
+ if(relobj.scheme){
+ uri.push(relobj.scheme, ":");
+ }
+ if(relobj.authority){
+ uri.push("//", relobj.authority);
+ }
+ uri.push(relobj.path);
+ if(relobj.query){
+ uri.push("?", relobj.query);
+ }
+ if(relobj.fragment){
+ uri.push("#", relobj.fragment);
+ }
+ }
-dojo.dnd._uniqueId = 0;
-dojo.dnd.getUniqueId = function(){
+ this.uri = uri.join("");
+
+ // break the uri into its main components
+ var r = this.uri.match(ore);
+
+ this.scheme = r[2] || (r[1] ? "" : n);
+ this.authority = r[4] || (r[3] ? "" : n);
+ this.path = r[5]; // can never be undefined
+ this.query = r[7] || (r[6] ? "" : n);
+ this.fragment = r[9] || (r[8] ? "" : n);
+
+ if(this.authority != n){
+ // server based naming authority
+ r = this.authority.match(ire);
+
+ this.user = r[3] || n;
+ this.password = r[4] || n;
+ this.host = r[6] || r[7]; // ipv6 || ipv4
+ this.port = r[9] || n;
+ }
+ };
+ _Url.prototype.toString = function(){ return this.uri; };
+
+ return dojo._Url = _Url;
+});
+
+},
+'dojo/text':function(){
+define("dojo/text", ["./_base/kernel", "require", "./has", "./_base/xhr"], function(dojo, require, has, xhr){
+ // module:
+ // dojo/text
// summary:
- // returns a unique string for use with any DOM element
- var id;
- do{
- id = dojo._scopeName + "Unique" + (++dojo.dnd._uniqueId);
- }while(dojo.byId(id));
- return id;
+ // This module implements the !dojo/text plugin and the dojo.cache API.
+ // description:
+ // We choose to include our own plugin to leverage functionality already contained in dojo
+ // and thereby reduce the size of the plugin compared to various foreign loader implementations.
+ // Also, this allows foreign AMD loaders to be used without their plugins.
+ //
+ // CAUTION: this module is designed to optionally function synchronously to support the dojo v1.x synchronous
+ // loader. This feature is outside the scope of the CommonJS plugins specification.
+
+ var getText;
+ if(1){
+ getText= function(url, sync, load){
+ xhr("GET", {url:url, sync:!!sync, load:load});
+ };
+ }else{
+ // TODOC: only works for dojo AMD loader
+ if(require.getText){
+ getText= require.getText;
+ }else{
+ console.error("dojo/text plugin failed to load because loader does not support getText");
+ }
+ }
+
+ var
+ theCache= {},
+
+ strip= function(text){
+ //Strips <?xml ...?> declarations so that external SVG and XML
+ //documents can be added to a document without worry. Also, if the string
+ //is an HTML document, only the part inside the body tag is returned.
+ if(text){
+ text= text.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, "");
+ var matches= text.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+ if(matches){
+ text= matches[1];
+ }
+ }else{
+ text = "";
+ }
+ return text;
+ },
+
+ notFound = {},
+
+ pending = {},
+
+ result= {
+ dynamic:
+ // the dojo/text caches it's own resources because of dojo.cache
+ true,
+
+ normalize:function(id, toAbsMid){
+ // id is something like (path may be relative):
+ //
+ // "path/to/text.html"
+ // "path/to/text.html!strip"
+ var parts= id.split("!"),
+ url= parts[0];
+ return (/^\./.test(url) ? toAbsMid(url) : url) + (parts[1] ? "!" + parts[1] : "");
+ },
+
+ load:function(id, require, load){
+ // id is something like (path is always absolute):
+ //
+ // "path/to/text.html"
+ // "path/to/text.html!strip"
+ var
+ parts= id.split("!"),
+ stripFlag= parts.length>1,
+ absMid= parts[0],
+ url = require.toUrl(parts[0]),
+ text = notFound,
+ finish = function(text){
+ load(stripFlag ? strip(text) : text);
+ };
+ if(absMid in theCache){
+ text = theCache[absMid];
+ }else if(url in require.cache){
+ text = require.cache[url];
+ }else if(url in theCache){
+ text = theCache[url];
+ }
+ if(text===notFound){
+ if(pending[url]){
+ pending[url].push(finish);
+ }else{
+ var pendingList = pending[url] = [finish];
+ getText(url, !require.async, function(text){
+ theCache[absMid]= theCache[url]= text;
+ for(var i = 0; i<pendingList.length;){
+ pendingList[i++](text);
+ }
+ delete pending[url];
+ });
+ }
+ }else{
+ finish(text);
+ }
+ }
+ };
+
+ dojo.cache= function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){
+ // * (string string [value]) => (module, url, value)
+ // * (object [value]) => (module, value), url defaults to ""
+ //
+ // * if module is an object, then it must be convertable to a string
+ // * (module, url) module + (url ? ("/" + url) : "") must be a legal argument to require.toUrl
+ // * value may be a string or an object; if an object then may have the properties "value" and/or "sanitize"
+ var key;
+ if(typeof module=="string"){
+ if(/\//.test(module)){
+ // module is a version 1.7+ resolved path
+ key = module;
+ value = url;
+ }else{
+ // module is a version 1.6- argument to dojo.moduleUrl
+ key = require.toUrl(module.replace(/\./g, "/") + (url ? ("/" + url) : ""));
+ }
+ }else{
+ key = module + "";
+ value = url;
+ }
+ var
+ val = (value != undefined && typeof value != "string") ? value.value : value,
+ sanitize = value && value.sanitize;
+
+ if(typeof val == "string"){
+ //We have a string, set cache value
+ theCache[key] = val;
+ return sanitize ? strip(val) : val;
+ }else if(val === null){
+ //Remove cached value
+ delete theCache[key];
+ return null;
+ }else{
+ //Allow cache values to be empty strings. If key property does
+ //not exist, fetch it.
+ if(!(key in theCache)){
+ getText(key, true, function(text){
+ theCache[key]= text;
+ });
+ }
+ return sanitize ? strip(theCache[key]) : theCache[key];
+ }
+ };
+
+ return result;
+
+/*=====
+dojo.cache = function(module, url, value){
+ // summary:
+ // A getter and setter for storing the string content associated with the
+ // module and url arguments.
+ // description:
+ // If module is a string that contains slashes, then it is interpretted as a fully
+ // resolved path (typically a result returned by require.toUrl), and url should not be
+ // provided. This is the preferred signature. If module is a string that does not
+ // contain slashes, then url must also be provided and module and url are used to
+ // call `dojo.moduleUrl()` to generate a module URL. This signature is deprecated.
+ // If value is specified, the cache value for the moduleUrl will be set to
+ // that value. Otherwise, dojo.cache will fetch the moduleUrl and store it
+ // in its internal cache and return that cached value for the URL. To clear
+ // a cache value pass null for value. Since XMLHttpRequest (XHR) is used to fetch the
+ // the URL contents, only modules on the same domain of the page can use this capability.
+ // The build system can inline the cache values though, to allow for xdomain hosting.
+ // module: String||Object
+ // If a String with slashes, a fully resolved path; if a String without slashes, the
+ // module name to use for the base part of the URL, similar to module argument
+ // to `dojo.moduleUrl`. If an Object, something that has a .toString() method that
+ // generates a valid path for the cache item. For example, a dojo._Url object.
+ // url: String
+ // The rest of the path to append to the path derived from the module argument. If
+ // module is an object, then this second argument should be the "value" argument instead.
+ // value: String||Object?
+ // If a String, the value to use in the cache for the module/url combination.
+ // If an Object, it can have two properties: value and sanitize. The value property
+ // should be the value to use in the cache, and sanitize can be set to true or false,
+ // to indicate if XML declarations should be removed from the value and if the HTML
+ // inside a body tag in the value should be extracted as the real value. The value argument
+ // or the value property on the value argument are usually only used by the build system
+ // as it inlines cache content.
+ // example:
+ // To ask dojo.cache to fetch content and store it in the cache (the dojo["cache"] style
+ // of call is used to avoid an issue with the build system erroneously trying to intern
+ // this example. To get the build system to intern your dojo.cache calls, use the
+ // "dojo.cache" style of call):
+ // | //If template.html contains "<h1>Hello</h1>" that will be
+ // | //the value for the text variable.
+ // | var text = dojo["cache"]("my.module", "template.html");
+ // example:
+ // To ask dojo.cache to fetch content and store it in the cache, and sanitize the input
+ // (the dojo["cache"] style of call is used to avoid an issue with the build system
+ // erroneously trying to intern this example. To get the build system to intern your
+ // dojo.cache calls, use the "dojo.cache" style of call):
+ // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the
+ // | //text variable will contain just "<h1>Hello</h1>".
+ // | var text = dojo["cache"]("my.module", "template.html", {sanitize: true});
+ // example:
+ // Same example as previous, but demostrates how an object can be passed in as
+ // the first argument, then the value argument can then be the second argument.
+ // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the
+ // | //text variable will contain just "<h1>Hello</h1>".
+ // | var text = dojo["cache"](new dojo._Url("my/module/template.html"), {sanitize: true});
+ return val; //String
};
+=====*/
+});
-dojo.dnd._empty = {};
-dojo.dnd.isFormElement = function(/*Event*/ e){
+},
+'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",
+'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",
+'dojo/uacss':function(){
+define("dojo/uacss", ["./dom-geometry", "./_base/lang", "./ready", "./_base/sniff", "./_base/window"],
+ function(geometry, lang, ready, has, baseWindow){
+ // module:
+ // dojo/uacss
// summary:
- // returns true if user clicked on a form element
- var t = e.target;
- if(t.nodeType == 3 /*TEXT_NODE*/){
- t = t.parentNode;
+ // Applies pre-set CSS classes to the top-level HTML node, based on:
+ // - browser (ex: dj_ie)
+ // - browser version (ex: dj_ie6)
+ // - box model (ex: dj_contentBox)
+ // - text direction (ex: dijitRtl)
+ //
+ // In addition, browser, browser version, and box model are
+ // combined with an RTL flag when browser text is RTL. ex: dj_ie-rtl.
+
+ var
+ html = baseWindow.doc.documentElement,
+ ie = has("ie"),
+ opera = has("opera"),
+ maj = Math.floor,
+ ff = has("ff"),
+ boxModel = geometry.boxModel.replace(/-/,''),
+
+ classes = {
+ "dj_ie": ie,
+ "dj_ie6": maj(ie) == 6,
+ "dj_ie7": maj(ie) == 7,
+ "dj_ie8": maj(ie) == 8,
+ "dj_ie9": maj(ie) == 9,
+ "dj_quirks": has("quirks"),
+ "dj_iequirks": ie && has("quirks"),
+
+ // NOTE: Opera not supported by dijit
+ "dj_opera": opera,
+
+ "dj_khtml": has("khtml"),
+
+ "dj_webkit": has("webkit"),
+ "dj_safari": has("safari"),
+ "dj_chrome": has("chrome"),
+
+ "dj_gecko": has("mozilla"),
+ "dj_ff3": maj(ff) == 3
+ }; // no dojo unsupported browsers
+
+ classes["dj_" + boxModel] = true;
+
+ // apply browser, browser version, and box model class names
+ var classStr = "";
+ for(var clz in classes){
+ if(classes[clz]){
+ classStr += clz + " ";
+ }
}
- return " button textarea input select option ".indexOf(" " + t.tagName.toLowerCase() + " ") >= 0; // Boolean
-};
+ html.className = lang.trim(html.className + " " + classStr);
-}
+ // If RTL mode, then add dj_rtl flag plus repeat existing classes with -rtl extension.
+ // We can't run the code below until the <body> tag has loaded (so we can check for dir=rtl).
+ // priority is 90 to run ahead of parser priority of 100
+ ready(90, function(){
+ if(!geometry.isBodyLtr()){
+ var rtlClassStr = "dj_rtl dijitRtl " + classStr.replace(/ /g, "-rtl ");
+ html.className = lang.trim(html.className + " " + rtlClassStr + "dj_rtl dijitRtl " + classStr.replace(/ /g, "-rtl "));
+ }
+ });
+ return has;
+});
-if(!dojo._hasResource["dojo.dnd.autoscroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.autoscroll"] = true;
-dojo.provide("dojo.dnd.autoscroll");
+},
+'dijit/Tooltip':function(){
+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;
+=====*/
-dojo.getObject("dnd", true, dojo);
+ // module:
+ // dijit/Tooltip
+ // summary:
+ // Defines dijit.Tooltip widget (to display a tooltip), showTooltip()/hideTooltip(), and _MasterTooltip
-dojo.dnd.getViewport = dojo.window.getBox;
-dojo.dnd.V_TRIGGER_AUTOSCROLL = 32;
-dojo.dnd.H_TRIGGER_AUTOSCROLL = 32;
+ 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
-dojo.dnd.V_AUTOSCROLL_VALUE = 16;
-dojo.dnd.H_AUTOSCROLL_VALUE = 16;
+ // duration: Integer
+ // Milliseconds to fade in/fade out
+ duration: manager.defaultDuration,
-dojo.dnd.autoScroll = function(e){
+ 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;
+});
+
+},
+'dojo/string':function(){
+define("dojo/string", ["./_base/kernel", "./_base/lang"], function(dojo, lang) {
+ // module:
+ // dojo/string
// summary:
- // a handler for onmousemove event, which scrolls the window, if
- // necesary
- // e: Event
- // onmousemove event
+ // TODOC
- // FIXME: needs more docs!
- var v = dojo.window.getBox(), dx = 0, dy = 0;
- if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){
- dx = -dojo.dnd.H_AUTOSCROLL_VALUE;
- }else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){
- dx = dojo.dnd.H_AUTOSCROLL_VALUE;
+lang.getObject("string", true, dojo);
+
+/*=====
+dojo.string = {
+ // summary: String utilities for Dojo
+};
+=====*/
+
+dojo.string.rep = function(/*String*/str, /*Integer*/num){
+ // summary:
+ // Efficiently replicate a string `n` times.
+ // str:
+ // the string to replicate
+ // num:
+ // number of times to replicate the string
+
+ if(num <= 0 || !str){ return ""; }
+
+ var buf = [];
+ for(;;){
+ if(num & 1){
+ buf.push(str);
+ }
+ if(!(num >>= 1)){ break; }
+ str += str;
}
- if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){
- dy = -dojo.dnd.V_AUTOSCROLL_VALUE;
- }else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){
- dy = dojo.dnd.V_AUTOSCROLL_VALUE;
+ return buf.join(""); // String
+};
+
+dojo.string.pad = function(/*String*/text, /*Integer*/size, /*String?*/ch, /*Boolean?*/end){
+ // summary:
+ // Pad a string to guarantee that it is at least `size` length by
+ // filling with the character `ch` at either the start or end of the
+ // string. Pads at the start, by default.
+ // text:
+ // the string to pad
+ // size:
+ // length to provide padding
+ // ch:
+ // character to pad, defaults to '0'
+ // end:
+ // adds padding at the end if true, otherwise pads at start
+ // example:
+ // | // Fill the string to length 10 with "+" characters on the right. Yields "Dojo++++++".
+ // | dojo.string.pad("Dojo", 10, "+", true);
+
+ if(!ch){
+ ch = '0';
}
- window.scrollBy(dx, dy);
+ var out = String(text),
+ pad = dojo.string.rep(ch, Math.ceil((size - out.length) / ch.length));
+ return end ? out + pad : pad + out; // String
};
-dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1};
-dojo.dnd._validOverflow = {"auto": 1, "scroll": 1};
+dojo.string.substitute = function( /*String*/ template,
+ /*Object|Array*/map,
+ /*Function?*/ transform,
+ /*Object?*/ thisObject){
+ // summary:
+ // Performs parameterized substitutions on a string. Throws an
+ // exception if any parameter is unmatched.
+ // template:
+ // a string with expressions in the form `${key}` to be replaced or
+ // `${key:format}` which specifies a format function. keys are case-sensitive.
+ // map:
+ // hash to search for substitutions
+ // transform:
+ // a function to process all parameters before substitution takes
+ // place, e.g. mylib.encodeXML
+ // thisObject:
+ // where to look for optional format function; default to the global
+ // namespace
+ // example:
+ // Substitutes two expressions in a string from an Array or Object
+ // | // returns "File 'foo.html' is not found in directory '/temp'."
+ // | // by providing substitution data in an Array
+ // | dojo.string.substitute(
+ // | "File '${0}' is not found in directory '${1}'.",
+ // | ["foo.html","/temp"]
+ // | );
+ // |
+ // | // also returns "File 'foo.html' is not found in directory '/temp'."
+ // | // but provides substitution data in an Object structure. Dotted
+ // | // notation may be used to traverse the structure.
+ // | dojo.string.substitute(
+ // | "File '${name}' is not found in directory '${info.dir}'.",
+ // | { name: "foo.html", info: { dir: "/temp" } }
+ // | );
+ // example:
+ // Use a transform function to modify the values:
+ // | // returns "file 'foo.html' is not found in directory '/temp'."
+ // | dojo.string.substitute(
+ // | "${0} is not found in ${1}.",
+ // | ["foo.html","/temp"],
+ // | function(str){
+ // | // try to figure out the type
+ // | var prefix = (str.charAt(0) == "/") ? "directory": "file";
+ // | return prefix + " '" + str + "'";
+ // | }
+ // | );
+ // example:
+ // Use a formatter
+ // | // returns "thinger -- howdy"
+ // | dojo.string.substitute(
+ // | "${0:postfix}", ["thinger"], null, {
+ // | postfix: function(value, key){
+ // | return value + " -- howdy";
+ // | }
+ // | }
+ // | );
-dojo.dnd.autoScrollNodes = function(e){
+ thisObject = thisObject || dojo.global;
+ transform = transform ?
+ lang.hitch(thisObject, transform) : function(v){ return v; };
+
+ return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,
+ function(match, key, format){
+ var value = lang.getObject(key, false, map);
+ if(format){
+ value = lang.getObject(format, false, thisObject).call(thisObject, value, key);
+ }
+ return transform(value, key).toString();
+ }); // String
+};
+
+/*=====
+dojo.string.trim = function(str){
// summary:
- // a handler for onmousemove event, which scrolls the first avaialble
- // Dom element, it falls back to dojo.dnd.autoScroll()
- // e: Event
- // onmousemove event
+ // Trims whitespace from both sides of the string
+ // str: String
+ // String to be trimmed
+ // returns: String
+ // Returns the trimmed string
+ // description:
+ // This version of trim() was taken from [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript).
+ // The short yet performant version of this function is dojo.trim(),
+ // which is part of Dojo base. Uses String.prototype.trim instead, if available.
+ return ""; // String
+}
+=====*/
- // FIXME: needs more docs!
- for(var n = e.target; n;){
- if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){
- var s = dojo.getComputedStyle(n);
- if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){
- var b = dojo._getContentBox(n, s), t = dojo.position(n, true);
- //console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop);
- var w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2),
- h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2),
- rx = e.pageX - t.x, ry = e.pageY - t.y, dx = 0, dy = 0;
- if(dojo.isWebKit || dojo.isOpera){
- // FIXME: this code should not be here, it should be taken into account
- // either by the event fixing code, or the dojo.position()
- // FIXME: this code doesn't work on Opera 9.5 Beta
- rx += dojo.body().scrollLeft;
- ry += dojo.body().scrollTop;
+dojo.string.trim = String.prototype.trim ?
+ lang.trim : // aliasing to the native function
+ function(str){
+ str = str.replace(/^\s+/, '');
+ for(var i = str.length - 1; i >= 0; i--){
+ if(/\S/.test(str.charAt(i))){
+ str = str.substring(0, i + 1);
+ break;
+ }
+ }
+ return str;
+ };
+
+return dojo.string;
+});
+
+},
+'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>",
+'dijit/dijit':function(){
+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;
+});
+
+},
+'dijit/form/DropDownButton':function(){
+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;
+ }
+});
+
+});
+
+},
+'dijit/form/_FormValueMixin':function(){
+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);
}
- if(rx > 0 && rx < b.w){
- if(rx < w){
- dx = -w;
- }else if(rx > b.w - w){
- dx = w;
- }
+ }
+ }
+ });
+});
+
+},
+'dijit/form/_FormWidgetMixin':function(){
+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');
}
- //console.log("ry =", ry, "b.h =", b.h, "h =", h);
- if(ry > 0 && ry < b.h){
- if(ry < h){
- dy = -h;
- }else if(ry > b.h - h){
- dy = h;
- }
+ }, 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();
}
- var oldLeft = n.scrollLeft, oldTop = n.scrollTop;
- n.scrollLeft = n.scrollLeft + dx;
- n.scrollTop = n.scrollTop + dy;
- if(oldLeft != n.scrollLeft || oldTop != n.scrollTop){ return; }
+ // 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
}
}
- try{
- n = n.parentNode;
- }catch(x){
- n = null;
+ },
+
+ 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);
}
- dojo.dnd.autoScroll(e);
-};
+});
-}
+});
-if(!dojo._hasResource["dojo.dnd.Mover"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Mover"] = true;
-dojo.provide("dojo.dnd.Mover");
+},
+'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",
+'dijit/layout/_ContentPaneResizeMixin':function(){
+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.
-dojo.declare("dojo.dnd.Mover", null, {
- constructor: function(node, e, host){
+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:
- // an object which makes a node follow the mouse, or touch-drag on touch devices.
- // Used as a default mover, and as a base class for custom movers.
- // node: Node
- // a node (or node's id) to be moved
- // e: Event
- // a mouse event, which started the move;
- // only pageX and pageY properties are used
- // host: Object?
- // object which implements the functionality of the move,
- // and defines proper events (onMoveStart and onMoveStop)
- this.node = dojo.byId(node);
- var pos = e.touches ? e.touches[0] : e;
- this.marginBox = {l: pos.pageX, t: pos.pageY};
- this.mouseButton = e.button;
- var h = (this.host = host), d = node.ownerDocument;
- this.events = [
- // At the start of a drag, onFirstMove is called, and then the following two
- // connects are disconnected
- dojo.connect(d, "onmousemove", this, "onFirstMove"),
- dojo.connect(d, "ontouchmove", this, "onFirstMove"),
+ // See `dijit.layout._LayoutWidget.startup` for description.
+ // Although ContentPane doesn't extend _LayoutWidget, it does implement
+ // the same API.
- // These are called continually during the drag
- dojo.connect(d, "onmousemove", this, "onMouseMove"),
- dojo.connect(d, "ontouchmove", this, "onMouseMove"),
+ if(this._started){ return; }
- // And these are called at the end of the drag
- dojo.connect(d, "onmouseup", this, "onMouseUp"),
- dojo.connect(d, "ontouchend", this, "onMouseUp"),
+ var parent = this.getParent();
+ this._childOfLayoutWidget = parent && parent.isLayoutContainer;
- // cancel text selection and text dragging
- dojo.connect(d, "ondragstart", dojo.stopEvent),
- dojo.connect(d.body, "onselectstart", dojo.stopEvent)
- ];
- // notify that the move has started
- if(h && h.onMoveStart){
- h.onMoveStart(this);
+ // 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();
+ });
}
},
- // mouse event processors
- onMouseMove: function(e){
+
+ _checkIfSingleChild: function(){
// summary:
- // event processor for onmousemove/ontouchmove
- // e: Event
- // mouse/touch event
- dojo.dnd.autoScroll(e);
- var m = this.marginBox,
- pos = e.touches ? e.touches[0] : e;
- this.host.onMove(this, {l: m.l + pos.pageX, t: m.t + pos.pageY}, e);
- dojo.stopEvent(e);
+ // 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);
},
- onMouseUp: function(e){
- if(dojo.isWebKit && dojo.isMac && this.mouseButton == 2 ?
- e.button == 0 : this.mouseButton == e.button){ // TODO Should condition be met for touch devices, too?
- this.destroy();
+
+ 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();
}
- dojo.stopEvent(e);
+
+ this._resizeCalled = true;
+
+ this._scheduleLayout(changeSize, resultSize);
},
- // utilities
- onFirstMove: function(e){
+
+ _scheduleLayout: function(changeSize, resultSize){
// summary:
- // makes the node absolute; it is meant to be called only once.
- // relative and absolutely positioned nodes are assumed to use pixel units
- var s = this.node.style, l, t, h = this.host;
- switch(s.position){
- case "relative":
- case "absolute":
- // assume that left and top values are in pixels already
- l = Math.round(parseFloat(s.left)) || 0;
- t = Math.round(parseFloat(s.top)) || 0;
- break;
- default:
- s.position = "absolute"; // enforcing the absolute mode
- var m = dojo.marginBox(this.node);
- // event.pageX/pageY (which we used to generate the initial
- // margin box) includes padding and margin set on the body.
- // However, setting the node's position to absolute and then
- // doing dojo.marginBox on it *doesn't* take that additional
- // space into account - so we need to subtract the combined
- // padding and margin. We use getComputedStyle and
- // _getMarginBox/_getContentBox to avoid the extra lookup of
- // the computed style.
- var b = dojo.doc.body;
- var bs = dojo.getComputedStyle(b);
- var bm = dojo._getMarginBox(b, bs);
- var bc = dojo._getContentBox(b, bs);
- l = m.l - (bc.l - bm.l);
- t = m.t - (bc.t - bm.t);
- break;
+ // 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;
}
- this.marginBox.l = l - this.marginBox.l;
- this.marginBox.t = t - this.marginBox.t;
- if(h && h.onFirstMove){
- h.onFirstMove(this, e);
+ },
+
+ _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);
}
-
- // Disconnect onmousemove and ontouchmove events that call this function
- dojo.disconnect(this.events.shift());
- dojo.disconnect(this.events.shift());
+
+ // 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;
},
- destroy: function(){
+
+ _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:
- // stops the move, deletes all references, so the object can be garbage-collected
- dojo.forEach(this.events, dojo.disconnect);
- // undo global settings
- var h = this.host;
- if(h && h.onMoveStop){
- h.onMoveStop(this);
+ // 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');
}
- // destroy objects
- this.events = this.node = this.host = null;
+ },
+
+ _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;
}
});
-}
+});
+
+},
+'dijit/WidgetSet':function(){
+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
+ },
-if(!dojo._hasResource["dojo.dnd.Moveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Moveable"] = true;
-dojo.provide("dojo.dnd.Moveable");
+ 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;
+});
+
+},
+'dojo/dnd/Moveable':function(){
+define("dojo/dnd/Moveable", ["../main", "../Evented", "../touch", "./Mover"], function(dojo, Evented, touch) {
+ // module:
+ // dojo/dnd/Moveable
+ // summary:
+ // TODOC
/*=====
@@ -8368,12 +13992,12 @@ dojo.declare("dojo.dnd.__MoveableArgs", [], {
});
=====*/
-dojo.declare("dojo.dnd.Moveable", null, {
+dojo.declare("dojo.dnd.Moveable", [Evented], {
// object attributes (for markup)
handle: "",
delay: 0,
skip: false,
-
+
constructor: function(node, params){
// summary:
// an object, which makes a node moveable
@@ -8389,8 +14013,7 @@ dojo.declare("dojo.dnd.Moveable", null, {
this.skip = params.skip;
this.mover = params.mover ? params.mover : dojo.dnd.Mover;
this.events = [
- dojo.connect(this.handle, "onmousedown", this, "onMouseDown"),
- dojo.connect(this.handle, "ontouchstart", this, "onMouseDown"),
+ dojo.connect(this.handle, touch.press, this, "onMouseDown"),
// cancel text selection and text dragging
dojo.connect(this.handle, "ondragstart", this, "onSelectStart"),
dojo.connect(this.handle, "onselectstart", this, "onSelectStart")
@@ -8398,8 +14021,8 @@ dojo.declare("dojo.dnd.Moveable", null, {
},
// markup methods
- markupFactory: function(params, node){
- return new dojo.dnd.Moveable(node, params);
+ markupFactory: function(params, node, ctor){
+ return new ctor(node, params);
},
// methods
@@ -8409,7 +14032,7 @@ dojo.declare("dojo.dnd.Moveable", null, {
dojo.forEach(this.events, dojo.disconnect);
this.events = this.node = this.handle = null;
},
-
+
// mouse event processors
onMouseDown: function(e){
// summary:
@@ -8419,14 +14042,11 @@ dojo.declare("dojo.dnd.Moveable", null, {
if(this.skip && dojo.dnd.isFormElement(e)){ return; }
if(this.delay){
this.events.push(
- dojo.connect(this.handle, "onmousemove", this, "onMouseMove"),
- dojo.connect(this.handle, "ontouchmove", this, "onMouseMove"),
- dojo.connect(this.handle, "onmouseup", this, "onMouseUp"),
- dojo.connect(this.handle, "ontouchend", this, "onMouseUp")
+ dojo.connect(this.handle, touch.move, this, "onMouseMove"),
+ dojo.connect(this.handle, touch.release, this, "onMouseUp")
);
- var pos = e.touches ? e.touches[0] : e;
- this._lastX = pos.pageX;
- this._lastY = pos.pageY;
+ this._lastX = e.pageX;
+ this._lastY = e.pageY;
}else{
this.onDragDetected(e);
}
@@ -8437,8 +14057,7 @@ dojo.declare("dojo.dnd.Moveable", null, {
// event processor for onmousemove/ontouchmove, used only for delayed drags
// e: Event
// mouse/touch event
- var pos = e.touches ? e.touches[0] : e;
- if(Math.abs(pos.pageX - this._lastX) > this.delay || Math.abs(pos.pageY - this._lastY) > this.delay){
+ if(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){
this.onMouseUp(e);
this.onDragDetected(e);
}
@@ -8463,7 +14082,7 @@ dojo.declare("dojo.dnd.Moveable", null, {
dojo.stopEvent(e);
}
},
-
+
// local events
onDragDetected: function(/* Event */ e){
// summary:
@@ -8489,7 +14108,7 @@ dojo.declare("dojo.dnd.Moveable", null, {
// summary:
// called during the very first move notification;
// can be used to initialize coordinates, can be overwritten.
-
+
// default implementation does nothing
},
onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop, /* Event */ e){
@@ -8505,24 +14124,2321 @@ dojo.declare("dojo.dnd.Moveable", null, {
onMoving: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
// summary:
// called before every incremental move; can be overwritten.
-
+
// default implementation does nothing
},
onMoved: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
// summary:
// called after every incremental move; can be overwritten.
-
+
// default implementation does nothing
}
});
+return dojo.dnd.Moveable;
+});
+
+},
+'dojo/store/util/SimpleQueryEngine':function(){
+define("dojo/store/util/SimpleQueryEngine", ["../../_base/array"], function(arrayUtil) {
+ // module:
+ // dojo/store/util/SimpleQueryEngine
+ // summary:
+ // The module defines a simple filtering query engine for object stores.
+
+return function(query, options){
+ // summary:
+ // Simple query engine that matches using filter functions, named filter
+ // functions or objects by name-value on a query object hash
+ //
+ // description:
+ // The SimpleQueryEngine provides a way of getting a QueryResults through
+ // the use of a simple object hash as a filter. The hash will be used to
+ // match properties on data objects with the corresponding value given. In
+ // other words, only exact matches will be returned.
+ //
+ // This function can be used as a template for more complex query engines;
+ // for example, an engine can be created that accepts an object hash that
+ // contains filtering functions, or a string that gets evaluated, etc.
+ //
+ // When creating a new dojo.store, simply set the store's queryEngine
+ // field as a reference to this function.
+ //
+ // query: Object
+ // An object hash with fields that may match fields of items in the store.
+ // Values in the hash will be compared by normal == operator, but regular expressions
+ // or any object that provides a test() method are also supported and can be
+ // used to match strings by more complex expressions
+ // (and then the regex's or object's test() method will be used to match values).
+ //
+ // options: dojo.store.util.SimpleQueryEngine.__queryOptions?
+ // An object that contains optional information such as sort, start, and count.
+ //
+ // returns: Function
+ // A function that caches the passed query under the field "matches". See any
+ // of the "query" methods on dojo.stores.
+ //
+ // example:
+ // Define a store with a reference to this engine, and set up a query method.
+ //
+ // | var myStore = function(options){
+ // | // ...more properties here
+ // | this.queryEngine = dojo.store.util.SimpleQueryEngine;
+ // | // define our query method
+ // | this.query = function(query, options){
+ // | return dojo.store.util.QueryResults(this.queryEngine(query, options)(this.data));
+ // | };
+ // | };
+
+ // create our matching query function
+ switch(typeof query){
+ default:
+ throw new Error("Can not query with a " + typeof query);
+ case "object": case "undefined":
+ var queryObject = query;
+ query = function(object){
+ for(var key in queryObject){
+ var required = queryObject[key];
+ if(required && required.test){
+ if(!required.test(object[key])){
+ return false;
+ }
+ }else if(required != object[key]){
+ return false;
+ }
+ }
+ return true;
+ };
+ break;
+ case "string":
+ // named query
+ if(!this[query]){
+ throw new Error("No filter function " + query + " was found in store");
+ }
+ query = this[query];
+ // fall through
+ case "function":
+ // fall through
+ }
+ function execute(array){
+ // execute the whole query, first we filter
+ var results = arrayUtil.filter(array, query);
+ // next we sort
+ if(options && options.sort){
+ results.sort(function(a, b){
+ for(var sort, i=0; sort = options.sort[i]; i++){
+ var aValue = a[sort.attribute];
+ var bValue = b[sort.attribute];
+ if (aValue != bValue) {
+ return !!sort.descending == aValue > bValue ? -1 : 1;
+ }
+ }
+ return 0;
+ });
+ }
+ // now we paginate
+ if(options && (options.start || options.count)){
+ var total = results.length;
+ results = results.slice(options.start || 0, (options.start || 0) + (options.count || Infinity));
+ results.total = total;
+ }
+ return results;
+ }
+ execute.matches = query;
+ return execute;
+};
+});
+
+},
+'dijit/typematic':function(){
+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;
+
+});
+
+},
+'dijit/MenuItem':function(){
+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);
+ }
+ });
+});
+
+},
+'dijit/layout/TabController':function(){
+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;
+});
+
+},
+'dijit/layout/_LayoutWidget':function(){
+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);
+ }
+ });
+});
+
+},
+'dijit/popup':function(){
+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());
+});
+
+},
+'dijit/_base/manager':function(){
+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;
+});
+
+},
+'dijit/layout/StackController':function(){
+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;
+});
+
+},
+'dojo/dnd/Mover':function(){
+define("dojo/dnd/Mover", ["../main", "../Evented", "../touch", "./common", "./autoscroll"], function(dojo, Evented, touch) {
+ // module:
+ // dojo/dnd/Mover
+ // summary:
+ // TODOC
+
+
+dojo.declare("dojo.dnd.Mover", [Evented], {
+ constructor: function(node, e, host){
+ // summary:
+ // an object which makes a node follow the mouse, or touch-drag on touch devices.
+ // Used as a default mover, and as a base class for custom movers.
+ // node: Node
+ // a node (or node's id) to be moved
+ // e: Event
+ // a mouse event, which started the move;
+ // only pageX and pageY properties are used
+ // host: Object?
+ // object which implements the functionality of the move,
+ // and defines proper events (onMoveStart and onMoveStop)
+ this.node = dojo.byId(node);
+ this.marginBox = {l: e.pageX, t: e.pageY};
+ this.mouseButton = e.button;
+ var h = (this.host = host), d = node.ownerDocument;
+ this.events = [
+ // At the start of a drag, onFirstMove is called, and then the following two
+ // connects are disconnected
+ dojo.connect(d, touch.move, this, "onFirstMove"),
+
+ // These are called continually during the drag
+ dojo.connect(d, touch.move, this, "onMouseMove"),
+
+ // And these are called at the end of the drag
+ dojo.connect(d, touch.release, this, "onMouseUp"),
+
+ // cancel text selection and text dragging
+ dojo.connect(d, "ondragstart", dojo.stopEvent),
+ dojo.connect(d.body, "onselectstart", dojo.stopEvent)
+ ];
+ // notify that the move has started
+ if(h && h.onMoveStart){
+ h.onMoveStart(this);
+ }
+ },
+ // mouse event processors
+ onMouseMove: function(e){
+ // summary:
+ // event processor for onmousemove/ontouchmove
+ // e: Event
+ // mouse/touch event
+ dojo.dnd.autoScroll(e);
+ var m = this.marginBox;
+ this.host.onMove(this, {l: m.l + e.pageX, t: m.t + e.pageY}, e);
+ dojo.stopEvent(e);
+ },
+ onMouseUp: function(e){
+ if(dojo.isWebKit && dojo.isMac && this.mouseButton == 2 ?
+ e.button == 0 : this.mouseButton == e.button){ // TODO Should condition be met for touch devices, too?
+ this.destroy();
+ }
+ dojo.stopEvent(e);
+ },
+ // utilities
+ onFirstMove: function(e){
+ // summary:
+ // makes the node absolute; it is meant to be called only once.
+ // relative and absolutely positioned nodes are assumed to use pixel units
+ var s = this.node.style, l, t, h = this.host;
+ switch(s.position){
+ case "relative":
+ case "absolute":
+ // assume that left and top values are in pixels already
+ l = Math.round(parseFloat(s.left)) || 0;
+ t = Math.round(parseFloat(s.top)) || 0;
+ break;
+ default:
+ s.position = "absolute"; // enforcing the absolute mode
+ var m = dojo.marginBox(this.node);
+ // event.pageX/pageY (which we used to generate the initial
+ // margin box) includes padding and margin set on the body.
+ // However, setting the node's position to absolute and then
+ // doing dojo.marginBox on it *doesn't* take that additional
+ // space into account - so we need to subtract the combined
+ // padding and margin. We use getComputedStyle and
+ // _getMarginBox/_getContentBox to avoid the extra lookup of
+ // the computed style.
+ var b = dojo.doc.body;
+ var bs = dojo.getComputedStyle(b);
+ var bm = dojo._getMarginBox(b, bs);
+ var bc = dojo._getContentBox(b, bs);
+ l = m.l - (bc.l - bm.l);
+ t = m.t - (bc.t - bm.t);
+ break;
+ }
+ this.marginBox.l = l - this.marginBox.l;
+ this.marginBox.t = t - this.marginBox.t;
+ if(h && h.onFirstMove){
+ h.onFirstMove(this, e);
+ }
+
+ // Disconnect onmousemove and ontouchmove events that call this function
+ dojo.disconnect(this.events.shift());
+ },
+ destroy: function(){
+ // summary:
+ // stops the move, deletes all references, so the object can be garbage-collected
+ dojo.forEach(this.events, dojo.disconnect);
+ // undo global settings
+ var h = this.host;
+ if(h && h.onMoveStop){
+ h.onMoveStop(this);
+ }
+ // destroy objects
+ this.events = this.node = this.host = null;
+ }
+});
+
+return dojo.dnd.Mover;
+});
+
+},
+'dijit/layout/TabContainer':function(){
+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";
+ }
+ }
+ });
+});
+
+},
+'dijit/BackgroundIframe':function(){
+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;
+});
+
+},
+'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",
+'dojo/dnd/Avatar':function(){
+define("dojo/dnd/Avatar", ["../main", "./common"], function(dojo) {
+ // module:
+ // dojo/dnd/Avatar
+ // summary:
+ // TODOC
+
+
+dojo.declare("dojo.dnd.Avatar", null, {
+ // summary:
+ // Object that represents transferred DnD items visually
+ // manager: Object
+ // a DnD manager object
+
+ constructor: function(manager){
+ this.manager = manager;
+ this.construct();
+ },
+
+ // methods
+ construct: function(){
+ // summary:
+ // constructor function;
+ // it is separate so it can be (dynamically) overwritten in case of need
+ this.isA11y = dojo.hasClass(dojo.body(),"dijit_a11y");
+ var a = dojo.create("table", {
+ "class": "dojoDndAvatar",
+ style: {
+ position: "absolute",
+ zIndex: "1999",
+ margin: "0px"
+ }
+ }),
+ source = this.manager.source, node,
+ b = dojo.create("tbody", null, a),
+ tr = dojo.create("tr", null, b),
+ td = dojo.create("td", null, tr),
+ icon = this.isA11y ? dojo.create("span", {
+ id : "a11yIcon",
+ innerHTML : this.manager.copy ? '+' : "<"
+ }, td) : null,
+ span = dojo.create("span", {
+ innerHTML: source.generateText ? this._generateText() : ""
+ }, td),
+ k = Math.min(5, this.manager.nodes.length), i = 0;
+ // we have to set the opacity on IE only after the node is live
+ dojo.attr(tr, {
+ "class": "dojoDndAvatarHeader",
+ style: {opacity: 0.9}
+ });
+ for(; i < k; ++i){
+ if(source.creator){
+ // create an avatar representation of the node
+ node = source._normalizedCreator(source.getItem(this.manager.nodes[i].id).data, "avatar").node;
+ }else{
+ // or just clone the node and hope it works
+ node = this.manager.nodes[i].cloneNode(true);
+ if(node.tagName.toLowerCase() == "tr"){
+ // insert extra table nodes
+ var table = dojo.create("table"),
+ tbody = dojo.create("tbody", null, table);
+ tbody.appendChild(node);
+ node = table;
+ }
+ }
+ node.id = "";
+ tr = dojo.create("tr", null, b);
+ td = dojo.create("td", null, tr);
+ td.appendChild(node);
+ dojo.attr(tr, {
+ "class": "dojoDndAvatarItem",
+ style: {opacity: (9 - i) / 10}
+ });
+ }
+ this.node = a;
+ },
+ destroy: function(){
+ // summary:
+ // destructor for the avatar; called to remove all references so it can be garbage-collected
+ dojo.destroy(this.node);
+ this.node = false;
+ },
+ update: function(){
+ // summary:
+ // updates the avatar to reflect the current DnD state
+ dojo[(this.manager.canDropFlag ? "add" : "remove") + "Class"](this.node, "dojoDndAvatarCanDrop");
+ if (this.isA11y){
+ var icon = dojo.byId("a11yIcon");
+ var text = '+'; // assume canDrop && copy
+ if (this.manager.canDropFlag && !this.manager.copy) {
+ text = '< '; // canDrop && move
+ }else if (!this.manager.canDropFlag && !this.manager.copy) {
+ text = "o"; //!canDrop && move
+ }else if(!this.manager.canDropFlag){
+ text = 'x'; // !canDrop && copy
+ }
+ icon.innerHTML=text;
+ }
+ // replace text
+ dojo.query(("tr.dojoDndAvatarHeader td span" +(this.isA11y ? " span" : "")), this.node).forEach(
+ function(node){
+ node.innerHTML = this._generateText();
+ }, this);
+ },
+ _generateText: function(){
+ // summary: generates a proper text to reflect copying or moving of items
+ return this.manager.nodes.length.toString();
+ }
+});
+
+return dojo.dnd.Avatar;
+});
+
+},
+'dijit/form/Button':function(){
+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
+ });
}
-if(!dojo._hasResource["dojo.dnd.move"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.move"] = true;
-dojo.provide("dojo.dnd.move");
+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 || '');
+ }
+ }
+});
+
+
+});
+
+
+},
+'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",
+'dojo/dnd/move':function(){
+define("dojo/dnd/move", ["../main", "./Mover", "./Moveable"], function(dojo) {
+ // module:
+ // dojo/dnd/move
+ // summary:
+ // TODOC
/*=====
@@ -8542,11 +16458,6 @@ dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, {
// object attributes (for markup)
constraints: function(){},
within: false,
-
- // markup methods
- markupFactory: function(params, node){
- return new dojo.dnd.move.constrainedMoveable(node, params);
- },
constructor: function(node, params){
// summary:
@@ -8599,11 +16510,6 @@ dojo.declare("dojo.dnd.move.boxConstrainedMoveable", dojo.dnd.move.constrainedMo
// box:
// object attributes (for markup)
box: {},
-
- // markup methods
- markupFactory: function(params, node){
- return new dojo.dnd.move.boxConstrainedMoveable(node, params);
- },
constructor: function(node, params){
// summary:
@@ -8631,11 +16537,6 @@ dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constraine
// object attributes (for markup)
area: "content",
- // markup methods
- markupFactory: function(params, node){
- return new dojo.dnd.move.parentConstrainedMoveable(node, params);
- },
-
constructor: function(node, params){
// summary:
// an object, which makes a node moveable
@@ -8674,129 +16575,2110 @@ dojo.dnd.constrainedMover = dojo.dnd.move.constrainedMover;
dojo.dnd.boxConstrainedMover = dojo.dnd.move.boxConstrainedMover;
dojo.dnd.parentConstrainedMover = dojo.dnd.move.parentConstrainedMover;
+return dojo.dnd.move;
+});
+
+},
+'dijit/_WidgetBase':function(){
+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);
+ };
}
-if(!dojo._hasResource["dojo.dnd.TimedMoveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.TimedMoveable"] = true;
-dojo.provide("dojo.dnd.TimedMoveable");
+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,
/*=====
-dojo.declare("dojo.dnd.__TimedMoveableArgs", [dojo.dnd.__MoveableArgs], {
- // timeout: Number
- // delay move by this number of ms,
- // accumulating position changes during the timeout
- timeout: 0
+ // _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();
+ }
+ };
+ }
});
+
+});
+
+},
+'dijit/form/Form':function(){
+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;
=====*/
-(function(){
- // precalculate long expressions
- var oldOnMove = dojo.dnd.Moveable.prototype.onMove;
-
- dojo.declare("dojo.dnd.TimedMoveable", dojo.dnd.Moveable, {
+ // 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:
- // A specialized version of Moveable to support an FPS throttling.
- // This class puts an upper restriction on FPS, which may reduce
- // the CPU load. The additional parameter "timeout" regulates
- // the delay before actually moving the moveable object.
-
- // object attributes (for markup)
- timeout: 40, // in ms, 40ms corresponds to 25 fps
-
- constructor: function(node, params){
+ // 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:
- // an object that makes a node moveable with a timer
- // node: Node||String
- // a node (or node's id) to be moved
- // params: dojo.dnd.__TimedMoveableArgs
- // object with additional parameters.
-
- // sanitize parameters
- if(!params){ params = {}; }
- if(params.timeout && typeof params.timeout == "number" && params.timeout >= 0){
- this.timeout = params.timeout;
+ // 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, []);
}
},
-
- // markup methods
- markupFactory: function(params, node){
- return new dojo.dnd.TimedMoveable(node, params);
+
+ 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
},
-
- onMoveStop: function(/* dojo.dnd.Mover */ mover){
- if(mover._timer){
- // stop timer
- clearTimeout(mover._timer)
- // reflect the last received position
- oldOnMove.call(this, mover, mover._leftTop)
+
+ _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);
}
- dojo.dnd.Moveable.prototype.onMoveStop.apply(this, arguments);
},
- onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
- mover._leftTop = leftTop;
- if(!mover._timer){
- var _t = this; // to avoid using dojo.hitch()
- mover._timer = setTimeout(function(){
- // we don't have any pending requests
- mover._timer = null;
- // reflect the last received position
- oldOnMove.call(_t, mover, mover._leftTop);
- }, this.timeout);
+
+ 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();
}
}
});
-})();
+});
-}
+},
+'dijit/layout/_TabContainerBase':function(){
+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){
-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");
+/*=====
+ 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
-dojo.declare("dijit.form._FormMixin", null, {
+return declare("dijit.layout._TabContainerBase", [StackContainer, _TemplatedMixin], {
// 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)
+ // Abstract base class for TabContainer. Must define _makeController() to instantiate
+ // and return the widget that displays the tab labels
// 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
+ // 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);
+ }
+});
+
+});
+
+},
+'dojo/store/Memory':function(){
+define("dojo/store/Memory", ["../_base/declare", "./util/QueryResults", "./util/SimpleQueryEngine"], function(declare, QueryResults, SimpleQueryEngine) {
+ // module:
+ // dojo/store/Memory
+ // summary:
+ // The module defines an in-memory object store.
+
+
+return declare("dojo.store.Memory", null, {
+ // summary:
+ // This is a basic in-memory object store. It implements dojo.store.api.Store.
+ constructor: function(/*dojo.store.Memory*/ options){
+ // summary:
+ // Creates a memory object store.
+ // options:
+ // This provides any configuration information that will be mixed into the store.
+ // This should generally include the data property to provide the starting set of data.
+ for(var i in options){
+ this[i] = options[i];
+ }
+ this.setData(this.data || []);
+ },
+ // data: Array
+ // The array of all the objects in the memory store
+ data:null,
+
+ // idProperty: String
+ // Indicates the property to use as the identity property. The values of this
+ // property should be unique.
+ idProperty: "id",
+
+ // index: Object
+ // An index of data indices into the data array by id
+ index:null,
+
+ // queryEngine: Function
+ // Defines the query engine to use for querying the data store
+ queryEngine: SimpleQueryEngine,
+ get: function(id){
+ // summary:
+ // Retrieves an object by its identity
+ // id: Number
+ // The identity to use to lookup the object
+ // returns: Object
+ // The object in the store that matches the given id.
+ return this.data[this.index[id]];
+ },
+ getIdentity: function(object){
+ // summary:
+ // Returns an object's identity
+ // object: Object
+ // The object to get the identity from
+ // returns: Number
+ return object[this.idProperty];
+ },
+ put: function(object, options){
+ // summary:
+ // Stores an object
+ // object: Object
+ // The object to store.
+ // options: dojo.store.api.Store.PutDirectives??
+ // Additional metadata for storing the data. Includes an "id"
+ // property if a specific id is to be used.
+ // returns: Number
+ var data = this.data,
+ index = this.index,
+ idProperty = this.idProperty;
+ var id = (options && "id" in options) ? options.id : idProperty in object ? object[idProperty] : Math.random();
+ if(id in index){
+ // object exists
+ if(options && options.overwrite === false){
+ throw new Error("Object already exists");
+ }
+ // replace the entry in data
+ data[index[id]] = object;
+ }else{
+ // add the new object
+ index[id] = data.push(object) - 1;
+ }
+ return id;
+ },
+ add: function(object, options){
+ // summary:
+ // Creates an object, throws an error if the object already exists
+ // object: Object
+ // The object to store.
+ // options: dojo.store.api.Store.PutDirectives??
+ // Additional metadata for storing the data. Includes an "id"
+ // property if a specific id is to be used.
+ // returns: Number
+ (options = options || {}).overwrite = false;
+ // call put with overwrite being false
+ return this.put(object, options);
+ },
+ remove: function(id){
+ // summary:
+ // Deletes an object by its identity
+ // id: Number
+ // The identity to use to delete the object
+ // returns: Boolean
+ // Returns true if an object was removed, falsy (undefined) if no object matched the id
+ var index = this.index;
+ var data = this.data;
+ if(id in index){
+ data.splice(index[id], 1);
+ // now we have to reindex
+ this.setData(data);
+ return true;
+ }
+ },
+ query: function(query, options){
+ // summary:
+ // Queries the store for objects.
+ // query: Object
+ // The query to use for retrieving objects from the store.
+ // options: dojo.store.api.Store.QueryOptions?
+ // The optional arguments to apply to the resultset.
+ // returns: dojo.store.api.Store.QueryResults
+ // The results of the query, extended with iterative methods.
+ //
+ // example:
+ // Given the following store:
+ //
+ // | var store = new dojo.store.Memory({
+ // | data: [
+ // | {id: 1, name: "one", prime: false },
+ // | {id: 2, name: "two", even: true, prime: true},
+ // | {id: 3, name: "three", prime: true},
+ // | {id: 4, name: "four", even: true, prime: false},
+ // | {id: 5, name: "five", prime: true}
+ // | ]
+ // | });
+ //
+ // ...find all items where "prime" is true:
+ //
+ // | var results = store.query({ prime: true });
+ //
+ // ...or find all items where "even" is true:
+ //
+ // | var results = store.query({ even: true });
+ return QueryResults(this.queryEngine(query, options)(this.data));
+ },
+ setData: function(data){
+ // summary:
+ // Sets the given data as the source for this store, and indexes it
+ // data: Object[]
+ // An array of objects to use as the source of data.
+ if(data.items){
+ // just for convenience with the data format IFRS expects
+ this.idProperty = data.identifier;
+ data = this.data = data.items;
+ }else{
+ this.data = data;
+ }
+ this.index = {};
+ for(var i = 0, l = data.length; i < l; i++){
+ this.index[data[i][this.idProperty]] = i;
+ }
+ }
+});
+
+});
+
+},
+'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",
+'dijit/_base/sniff':function(){
+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.
+});
+
+},
+'dijit/Toolbar':function(){
+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]
+ );
+ }
+ });
+});
+
+},
+'dijit/layout/StackContainer':function(){
+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){
/*=====
- // value: Object
- // Name/value hash for each child widget with a name and value.
- // Child widgets without names are not part of the hash.
+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
//
- // 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).
+ // description:
+ // A container for widgets (ContentPanes, for example) That displays
+ // only one Widget at a time.
//
- // If a child widget's name is a dot separated list (like a.b.c.d), it's a nested structure.
+ // Publishes topics [widgetId]-addChild, [widgetId]-removeChild, and [widgetId]-selectChild
//
- // Example:
- // | { name: "John Smith", interests: ["sports", "movies"] }
+ // 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,
=====*/
- // 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: "",
+ buildRendering: function(){
+ this.inherited(arguments);
+ domClass.add(this.domNode, "dijitLayoutContainer");
+ this.containerNode.setAttribute("role", "tabpanel");
+ },
- // 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}, ...])
- //
- //
+ 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;
+ }
+});
+
+});
+
+},
+'dojo/regexp':function(){
+define("dojo/regexp", ["./_base/kernel", "./_base/lang"], function(dojo, lang) {
+ // module:
+ // dojo/regexp
+ // summary:
+ // TODOC
+
+lang.getObject("regexp", true, dojo);
+
+/*=====
+dojo.regexp = {
+ // summary: Regular expressions and Builder resources
+};
+=====*/
+
+dojo.regexp.escapeString = function(/*String*/str, /*String?*/except){
+ // summary:
+ // Adds escape sequences for special characters in regular expressions
+ // except:
+ // a String with special characters to be left unescaped
+
+ return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, function(ch){
+ if(except && except.indexOf(ch) != -1){
+ return ch;
+ }
+ return "\\" + ch;
+ }); // String
+};
+
+dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boolean?*/nonCapture){
+ // summary:
+ // Builds a regular expression that groups subexpressions
+ // description:
+ // A utility function used by some of the RE generators. The
+ // subexpressions are constructed by the function, re, in the second
+ // parameter. re builds one subexpression for each elem in the array
+ // a, in the first parameter. Returns a string for a regular
+ // expression that groups all the subexpressions.
+ // arr:
+ // A single value or an array of values.
+ // re:
+ // A function. Takes one parameter and converts it to a regular
+ // expression.
+ // nonCapture:
+ // If true, uses non-capturing match, otherwise matches are retained
+ // by regular expression. Defaults to false
+
+ // case 1: a is a single value.
+ if(!(arr instanceof Array)){
+ return re(arr); // String
+ }
+
+ // case 2: a is an array
+ var b = [];
+ for(var i = 0; i < arr.length; i++){
+ // convert each elem to a RE
+ b.push(re(arr[i]));
+ }
+
+ // join the REs as alternatives in a RE group.
+ return dojo.regexp.group(b.join("|"), nonCapture); // String
+};
+
+dojo.regexp.group = function(/*String*/expression, /*Boolean?*/nonCapture){
+ // summary:
+ // adds group match to expression
+ // nonCapture:
+ // If true, uses non-capturing match, otherwise matches are retained
+ // by regular expression.
+ return "(" + (nonCapture ? "?:":"") + expression + ")"; // String
+};
+
+return dojo.regexp;
+});
+
+},
+'dijit/form/_FormMixin':function(){
+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(){
- dojo.forEach(this.getDescendants(), function(widget){
+ array.forEach(this._getDescendantFormWidgets(), function(widget){
if(widget.reset){
widget.reset();
}
@@ -8812,14 +18694,14 @@ dojo.declare("dijit.form._FormMixin", null, {
// 2 - it will call focus() on the first invalid
// sub-widget
var didFocus = false;
- return dojo.every(dojo.map(this.getDescendants(), function(widget){
+ 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
- dojo.window.scrollIntoView(widget.containerNode || widget.domNode);
+ winUtils.scrollIntoView(widget.containerNode || widget.domNode);
widget.focus();
didFocus = true;
}
@@ -8828,7 +18710,7 @@ dojo.declare("dijit.form._FormMixin", null, {
},
setValues: function(val){
- dojo.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.", "", "2.0");
+ kernel.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.", "", "2.0");
return this.set('value', val);
},
_setValueAttr: function(/*Object*/ obj){
@@ -8837,7 +18719,7 @@ dojo.declare("dijit.form._FormMixin", null, {
// generate map from name --> [list of widgets with that name]
var map = { };
- dojo.forEach(this.getDescendants(), function(widget){
+ array.forEach(this._getDescendantFormWidgets(), function(widget){
if(!widget.name){ return; }
var entry = map[widget.name] || (map[widget.name] = [] );
entry.push(widget);
@@ -8848,25 +18730,25 @@ dojo.declare("dijit.form._FormMixin", null, {
continue;
}
var widgets = map[name], // array of widgets w/this name
- values = dojo.getObject(name, false, obj); // list of values for those widgets
+ values = lang.getObject(name, false, obj); // list of values for those widgets
if(values === undefined){
continue;
}
- if(!dojo.isArray(values)){
+ 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
- dojo.forEach(widgets, function(w, i){
- w.set('value', dojo.indexOf(values, w.value) != -1);
+ 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
- dojo.forEach(widgets, function(w, i){
+ array.forEach(widgets, function(w, i){
w.set('value', values[i]);
});
}
@@ -8875,7 +18757,7 @@ dojo.declare("dijit.form._FormMixin", null, {
/***
* TODO: code for plain input boxes (this shouldn't run for inputs that are part of widgets)
- dojo.forEach(this.containerNode.elements, function(element){
+ array.forEach(this.containerNode.elements, function(element){
if(element.name == ''){return}; // like "continue"
var namePath = element.name.split(".");
var myObj=obj;
@@ -8917,20 +18799,20 @@ dojo.declare("dijit.form._FormMixin", null, {
switch(element.type){
case "checkbox":
element.checked = (name in myObj) &&
- dojo.some(myObj[name], function(val){ return val == element.value; });
+ 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;
- dojo.forEach(element.options, function(option){
- option.selected = dojo.some(myObj[name], function(val){ return option.value == val; });
+ 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";
- dojo.forEach(element.options, function(option){
+ array.forEach(element.options, function(option){
option.selected = option.value == myObj[name];
});
break;
@@ -8943,13 +18825,13 @@ dojo.declare("dijit.form._FormMixin", null, {
}
});
*/
-
+
// 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");
+ kernel.deprecated(this.declaredClass+"::getValues() is deprecated. Use get('value') instead.", "", "2.0");
return this.get('value');
},
_getValueAttr: function(){
@@ -8962,14 +18844,14 @@ dojo.declare("dijit.form._FormMixin", null, {
// 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()
+ // 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 = { };
- dojo.forEach(this.getDescendants(), function(widget){
+ array.forEach(this._getDescendantFormWidgets(), function(widget){
var name = widget.name;
if(!name || widget.disabled){ return; }
@@ -8981,45 +18863,45 @@ dojo.declare("dijit.form._FormMixin", null, {
if(/Radio/.test(widget.declaredClass)){
// radio button
if(value !== false){
- dojo.setObject(name, value, obj);
+ lang.setObject(name, value, obj);
}else{
// give radio widgets a default of null
- value = dojo.getObject(name, false, obj);
+ value = lang.getObject(name, false, obj);
if(value === undefined){
- dojo.setObject(name, null, obj);
+ lang.setObject(name, null, obj);
}
}
}else{
// checkbox/toggle button
- var ary=dojo.getObject(name, false, obj);
+ var ary=lang.getObject(name, false, obj);
if(!ary){
ary=[];
- dojo.setObject(name, ary, obj);
+ lang.setObject(name, ary, obj);
}
if(value !== false){
ary.push(value);
}
}
}else{
- var prev=dojo.getObject(name, false, obj);
+ var prev=lang.getObject(name, false, obj);
if(typeof prev != "undefined"){
- if(dojo.isArray(prev)){
+ if(lang.isArray(prev)){
prev.push(value);
}else{
- dojo.setObject(name, [prev, value], obj);
+ lang.setObject(name, [prev, value], obj);
}
}else{
// unique name
- dojo.setObject(name, value, obj);
+ lang.setObject(name, value, obj);
}
}
});
/***
- * code for plain input boxes (see also dojo.formToObject, can we use that instead of this code?
+ * 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 = { };
- dojo.forEach(this.containerNode.elements, function(elm){
+ array.forEach(this.containerNode.elements, function(elm){
if(!elm.name) {
return; // like "continue"
}
@@ -9038,13 +18920,13 @@ dojo.declare("dijit.form._FormMixin", null, {
if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){
myObj[nameA[0]][nameIndex] = { };
}
- } else if(typeof(myObj[nameA[0]]) == "undefined"){
+ }else if(typeof(myObj[nameA[0]]) == "undefined"){
myObj[nameA[0]] = { }
} // if
if(nameA.length == 1){
myObj=myObj[nameA[0]];
- } else{
+ }else{
myObj=myObj[nameA[0]][nameIndex];
} // if
} // for
@@ -9052,15 +18934,15 @@ dojo.declare("dijit.form._FormMixin", null, {
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{
+ }else{
// can not set value when there is no name
}
- } else if(elm.type == "checkbox" && elm.checked){
+ }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"){
+ }else if(elm.type == "select-multiple"){
if(typeof(myObj[name]) == 'undefined'){
myObj[name]=[ ];
}
@@ -9084,7 +18966,7 @@ dojo.declare("dijit.form._FormMixin", null, {
return this.state == "";
},
- onValidStateChange: function(isValid){
+ 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
@@ -9096,20 +18978,20 @@ dojo.declare("dijit.form._FormMixin", null, {
_getState: function(){
// summary:
// Compute what this.state should be based on state of children
- var states = dojo.map(this._descendants, function(w){
+ var states = array.map(this._descendants, function(w){
return w.get("state") || "";
});
- return dojo.indexOf(states, "Error") >= 0 ? "Error" :
- dojo.indexOf(states, "Incomplete") >= 0 ? "Incomplete" : "";
+ 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.
- dojo.forEach(this._childConnections || [], dojo.hitch(this, "disconnect"));
- dojo.forEach(this._childWatches || [], function(w){ w.unwatch(); });
+ array.forEach(this._childConnections || [], lang.hitch(this, "disconnect"));
+ array.forEach(this._childWatches || [], function(w){ w.unwatch(); });
},
connectChildren: function(/*Boolean*/ inStartup){
@@ -9126,10 +19008,10 @@ dojo.declare("dijit.form._FormMixin", null, {
// Remove old connections, if any
this.disconnectChildren();
- this._descendants = this.getDescendants();
+ 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; } : dojo.hitch(this, "_set");
+ var set = inStartup ? function(name, val){ _this[name] = val; } : lang.hitch(this, "_set");
set("value", this.get("value"));
set("state", this._getState());
@@ -9137,14 +19019,14 @@ dojo.declare("dijit.form._FormMixin", null, {
// Form.state
var conns = (this._childConnections = []),
watches = (this._childWatches = []);
- dojo.forEach(dojo.filter(this._descendants,
+ 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.
- dojo.forEach(["state", "disabled"], function(attr){
- watches.push(widget.watch(attr, function(attr, oldVal, newVal){
+ array.forEach(["state", "disabled"], function(attr){
+ watches.push(widget.watch(attr, function(){
_this.set("state", _this._getState());
}));
});
@@ -9154,7 +19036,7 @@ dojo.declare("dijit.form._FormMixin", null, {
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()
@@ -9169,8 +19051,8 @@ dojo.declare("dijit.form._FormMixin", null, {
_this._set("value", _this.get("value"));
}, 10);
};
- dojo.forEach(
- dojo.filter(this._descendants, function(item){ return item.onChange; } ),
+ 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,
@@ -9203,800 +19085,611 @@ dojo.declare("dijit.form._FormMixin", null, {
}
});
+});
-}
-
-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");
+},
+'dijit/DropDownMenu':function(){
+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
-dojo.declare("dijit._DialogMixin", null,
- {
+ return declare("dijit.DropDownMenu", [_MenuBase, _OnDijitClickMixin], {
// summary:
- // This provides functions useful to Dialog and TooltipDialog
+ // A menu, without features for context menu (Meaning, drop down menu)
- 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
- },
+ templateString: template,
- 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
- },
+ baseClass: "dijitMenu",
- 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'));
+ 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]);
},
- _getFocusItems: function(){
+ _onKeyPress: function(/*Event*/ evt){
// summary:
- // Finds focusable items in dialog,
- // and sets this._firstFocusItem and this._lastFocusItem
+ // Handle keyboard based menu navigation.
// 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;
- }
- }
-);
-
-}
-
-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.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>",
+ if(evt.ctrlKey || evt.altKey){ return; }
- // Parameters on creation or updatable later
+ 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;
+ }
+ }
+ });
+});
- // dialogId: String
- // Id of the dialog.... DialogUnderlay's id is based on this id
- dialogId: "",
+},
+'dojo/data/util/simpleFetch':function(){
+define("dojo/data/util/simpleFetch", ["dojo/_base/lang", "dojo/_base/window", "./sorter"],
+ function(lang, winUtil, sorter) {
+ // module:
+ // dojo/data/util/simpleFetch
+ // summary:
+ // TODOC
- // class: String
- // This class name is used on the DialogUnderlay node, in addition to dijitDialogUnderlay
- "class": "",
+var simpleFetch = lang.getObject("dojo.data.util.simpleFetch", true);
- attributeMap: { id: "domNode" },
+simpleFetch.fetch = function(/* Object? */ request){
+ // summary:
+ // The simpleFetch mixin is designed to serve as a set of function(s) that can
+ // be mixed into other datastore implementations to accelerate their development.
+ // The simpleFetch mixin should work well for any datastore that can respond to a _fetchItems()
+ // call by returning an array of all the found items that matched the query. The simpleFetch mixin
+ // is not designed to work for datastores that respond to a fetch() call by incrementally
+ // loading items, or sequentially loading partial batches of the result
+ // set. For datastores that mixin simpleFetch, simpleFetch
+ // implements a fetch method that automatically handles eight of the fetch()
+ // arguments -- onBegin, onItem, onComplete, onError, start, count, sort and scope
+ // The class mixing in simpleFetch should not implement fetch(),
+ // but should instead implement a _fetchItems() method. The _fetchItems()
+ // method takes three arguments, the keywordArgs object that was passed
+ // to fetch(), a callback function to be called when the result array is
+ // available, and an error callback to be called if something goes wrong.
+ // The _fetchItems() method should ignore any keywordArgs parameters for
+ // start, count, onBegin, onItem, onComplete, onError, sort, and scope.
+ // The _fetchItems() method needs to correctly handle any other keywordArgs
+ // parameters, including the query parameter and any optional parameters
+ // (such as includeChildren). The _fetchItems() method should create an array of
+ // result items and pass it to the fetchHandler along with the original request object
+ // -- or, the _fetchItems() method may, if it wants to, create an new request object
+ // with other specifics about the request that are specific to the datastore and pass
+ // that as the request object to the handler.
+ //
+ // For more information on this specific function, see dojo.data.api.Read.fetch()
+ request = request || {};
+ if(!request.store){
+ request.store = this;
+ }
+ var self = this;
- _setDialogIdAttr: function(id){
- dojo.attr(this.node, "id", id + "_underlay");
- this._set("dialogId", id);
- },
+ var _errorHandler = function(errorData, requestObject){
+ if(requestObject.onError){
+ var scope = requestObject.scope || winUtil.global;
+ requestObject.onError.call(scope, errorData, requestObject);
+ }
+ };
- _setClassAttr: function(clazz){
- this.node.className = "dijitDialogUnderlay " + clazz;
- this._set("class", clazz);
- },
+ var _fetchHandler = function(items, requestObject){
+ var oldAbortFunction = requestObject.abort || null;
+ var aborted = false;
- postCreate: function(){
- // summary:
- // Append the underlay to the body
- dojo.body().appendChild(this.domNode);
- },
+ var startIndex = requestObject.start?requestObject.start:0;
+ var endIndex = (requestObject.count && (requestObject.count !== Infinity))?(startIndex + requestObject.count):items.length;
- 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
+ requestObject.abort = function(){
+ aborted = true;
+ if(oldAbortFunction){
+ oldAbortFunction.call(requestObject);
+ }
+ };
- var is = this.node.style,
- os = this.domNode.style;
+ var scope = requestObject.scope || winUtil.global;
+ if(!requestObject.store){
+ requestObject.store = self;
+ }
+ if(requestObject.onBegin){
+ requestObject.onBegin.call(scope, items.length, requestObject);
+ }
+ if(requestObject.sort){
+ items.sort(sorter.createSortFunction(requestObject.sort, self));
+ }
+ if(requestObject.onItem){
+ for(var i = startIndex; (i < items.length) && (i < endIndex); ++i){
+ var item = items[i];
+ if(!aborted){
+ requestObject.onItem.call(scope, item, requestObject);
+ }
+ }
+ }
+ if(requestObject.onComplete && !aborted){
+ var subset = null;
+ if(!requestObject.onItem){
+ subset = items.slice(startIndex, endIndex);
+ }
+ requestObject.onComplete.call(scope, subset, requestObject);
+ }
+ };
+ this._fetchItems(request, _fetchHandler, _errorHandler);
+ return request; // Object
+};
- // 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";
+return simpleFetch;
+});
- // 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";
- },
+},
+'dijit/Menu':function(){
+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){
- show: function(){
- // summary:
- // Show the dialog underlay
- this.domNode.style.display = "block";
- this.layout();
- this.bgIframe = new dijit.BackgroundIframe(this.domNode);
- },
+/*=====
+ var DropDownMenu = dijit.DropDownMenu;
+=====*/
- hide: function(){
- // summary:
- // Hides the dialog underlay
- this.bgIframe.destroy();
- delete this.bgIframe;
- this.domNode.style.display = "none";
- }
- }
-);
+// 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
+ });
}
-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");
-
+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: [],
-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
+ // 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,
- // 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,
+ // leftClickToOpen: [const] Boolean
+ // If true, menu will open on left click instead of right click, similar to a file menu.
+ leftClickToOpen: false,
- // 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,
+ // refocus: Boolean
+ // When this menu closes, re-focus the element which had focus before it was opened.
+ refocus: true,
- // isLayoutContainer: [protected] Boolean
- // Indicates that this widget will call resize() on it's child widgets
- // when they become visible.
- isLayoutContainer: 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);
+ },
- _startChildren: function(){
+ // thanks burstlib!
+ _iframeContentWindow: function(/* HTMLIFrameElement */iframe_el){
// 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;
- });
+ // 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
},
- startup: function(){
+ _iframeContentDocument: function(/* HTMLIFrameElement */iframe_el){
// summary:
- // See `dijit.layout._LayoutWidget.startup` for description.
- // Although ContentPane doesn't extend _LayoutWidget, it does implement
- // the same API.
+ // 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
+ },
- if(this._started){ return; }
+ bindDomNode: function(/*String|DomNode*/ node){
+ // summary:
+ // Attach menu to given node
+ node = dom.byId(node);
- var parent = dijit._Contained.prototype.getParent.call(this);
- this._childOfLayoutWidget = parent && parent.isLayoutContainer;
+ var cn; // Connect node
- // 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;
+ // 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{
- this.inherited(arguments);
+ // 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);
+ }
- this._startChildren();
- if(this._isShown()){
- this._onShow();
- }
+ // "binding" is the object to track our connection to the node (ie, the parameter to bindDomNode())
+ var binding = {
+ node: node,
+ iframe: iframe
+ };
- 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();
- });
- }
- },
+ // 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));
- _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.
+ // 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) : [];
- 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(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.
- if(
- // all child nodes are widgets
- childNodes.length == childWidgetNodes.length &&
+ 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
- // all but one are invisible (like dojo.data)
- candidateWidgets.length == 1
- ){
- this._singleChild = candidateWidgets[0];
- }else{
- delete this._singleChild;
+ 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);
+ }
}
-
- // 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){
+ unBindDomNode: function(/*String|DomNode*/ nodeName){
// summary:
- // See `dijit.layout._LayoutWidget.resize` for description.
- // Although ContentPane doesn't extend _LayoutWidget, it does implement
- // the same API.
+ // Detach menu from given node
- // 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();
+ 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;
}
- this._resizeCalled = true;
+ // 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();
+ }
- this._scheduleLayout(changeSize, resultSize);
- },
+ // 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);
+ }
+ }
- _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;
+ domAttr.remove(node, attrName);
+ delete this._bindings[bid];
}
},
- _layout: function(changeSize, resultSize){
+ _scheduleOpen: function(/*DomNode?*/ target, /*DomNode?*/ iframe, /*Object?*/ coords){
// 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.
+ // Set timer to display myself. Using a timer rather than displaying immediately solves
+ // two problems:
//
- // 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);
- }
+ // 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.)
- // 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);
+ if(!this._openTimer){
+ this._openTimer = setTimeout(lang.hitch(this, function(){
+ delete this._openTimer;
+ this._openMyself({
+ target: target,
+ iframe: iframe,
+ coords: coords
+ });
+ }), 1);
}
-
- 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);
+ _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).
- // 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();
- }
- });
- }
- },
+ var target = args.target,
+ iframe = args.iframe,
+ coords = args.coords;
- _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
+ // 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);
- 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;
+ 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;
}
- 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');
+ coords = domGeometry.position(target, true);
+ coords.x += 10;
+ coords.y += 10;
}
- },
- _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)
+ 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;
- if(this._needLayout){
- // If a layout has been scheduled for when we become visible, do it now
- this._layout(this._changeSize, this._resultSize);
+ 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.inherited(arguments);
+ 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
+ };
+ },
- // Need to keep track of whether ContentPane has been shown (which is different than
- // whether or not it's currently visible).
- this._wasShown = true;
+ uninitialize: function(){
+ array.forEach(this._bindings, function(b){ if(b){ this.unBindDomNode(b.node); } }, this);
+ this.inherited(arguments);
}
});
-}
-
-if(!dojo._hasResource["dojo.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.html"] = true;
-dojo.provide("dojo.html");
-
-
-dojo.getObject("html", true, dojo);
+});
-// the parser might be needed..
-(function(){ // private scope, sort of a namespace
+},
+'dijit/form/_CheckBoxMixin':function(){
+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
- // idCounter is incremented with each instantiation to allow asignment of a unique id for tracking, logging purposes
- var idCounter = 0,
- d = dojo;
-
- dojo.html._secureForInnerHtml = function(/*String*/ cont){
+ return declare("dijit.form._CheckBoxMixin", null, {
// summary:
- // removes !DOCTYPE and title elements from the html string.
+ // Mixin to provide widget functionality corresponding to an HTML checkbox
//
- // khtml is picky about dom faults, you can't attach a style or <title> node as child of body
- // must go into head, so we need to cut out those tags
- // cont:
- // An html string for insertion into the dom
+ // 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.
//
- return cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig, ""); // String
- };
-
-/*====
- dojo.html._emptyNode = function(node){
- // summary:
- // removes all child nodes from the given node
- // node: DOMNode
- // the parent element
- };
-=====*/
- dojo.html._emptyNode = dojo.empty;
-
- dojo.html._setNodeContent = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont){
- // summary:
- // inserts the given content into the given node
- // node:
- // the parent element
- // content:
- // the content to be set on the parent element.
- // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes
-
- // always empty
- d.empty(node);
-
- if(cont) {
- if(typeof cont == "string") {
- cont = d._toDom(cont, node.ownerDocument);
- }
- if(!cont.nodeType && d.isArrayLike(cont)) {
- // handle as enumerable, but it may shrink as we enumerate it
- for(var startlen=cont.length, i=0; i<cont.length; i=startlen==cont.length ? i+1 : 0) {
- d.place( cont[i], node, "last");
- }
- } else {
- // pass nodes, documentFragments and unknowns through to dojo.place
- d.place(cont, node, "last");
- }
- }
-
- // return DomNode
- return node;
- };
-
- // we wrap up the content-setting operation in a object
- dojo.declare("dojo.html._ContentSetter", null,
- {
- // node: DomNode|String
- // An node which will be the parent element that we set content into
- node: "",
-
- // content: String|DomNode|DomNode[]
- // The content to be placed in the node. Can be an HTML string, a node reference, or a enumerable list of nodes
- content: "",
-
- // id: String?
- // Usually only used internally, and auto-generated with each instance
- id: "",
-
- // cleanContent: Boolean
- // Should the content be treated as a full html document,
- // and the real content stripped of <html>, <body> wrapper before injection
- cleanContent: false,
-
- // extractContent: Boolean
- // Should the content be treated as a full html document, and the real content stripped of <html>, <body> wrapper before injection
- extractContent: false,
-
- // parseContent: Boolean
- // Should the node by passed to the parser after the new content is set
- parseContent: false,
-
- // 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,
- // startup: Boolean
- // Start the child widgets after parsing them. Only obeyed if parseContent is true.
- startup: true,
-
- // lifecyle methods
- constructor: function(/* Object */params, /* String|DomNode */node){
- // summary:
- // Provides a configurable, extensible object to wrap the setting on content on a node
- // call the set() method to actually set the content..
-
- // the original params are mixed directly into the instance "this"
- dojo.mixin(this, params || {});
-
- // give precedence to params.node vs. the node argument
- // and ensure its a node, not an id string
- node = this.node = dojo.byId( this.node || node );
-
- if(!this.id){
- this.id = [
- "Setter",
- (node) ? node.id || node.tagName : "",
- idCounter++
- ].join("_");
- }
- },
- set: function(/* String|DomNode|NodeList? */ cont, /* Object? */ params){
- // summary:
- // front-end to the set-content sequence
- // cont:
- // An html string, node or enumerable list of nodes for insertion into the dom
- // If not provided, the object's content property will be used
- if(undefined !== cont){
- this.content = cont;
- }
- // in the re-use scenario, set needs to be able to mixin new configuration
- if(params){
- this._mixin(params);
- }
-
- this.onBegin();
- this.setContent();
- this.onEnd();
+ // type: [private] String
+ // type attribute on <input> node.
+ // Overrides `dijit.form.Button.type`. Users should not change this value.
+ type: "checkbox",
- return this.node;
- },
- setContent: function(){
- // summary:
- // sets the content on the node
+ // 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",
- var node = this.node;
- if(!node) {
- // can't proceed
- throw new Error(this.declaredClass + ": setContent given no node");
- }
- try{
- node = dojo.html._setNodeContent(node, this.content);
- }catch(e){
- // check if a domfault occurs when we are appending this.errorMessage
- // like for instance if domNode is a UL and we try append a DIV
-
- // FIXME: need to allow the user to provide a content error message string
- var errMess = this.onContentError(e);
- try{
- node.innerHTML = errMess;
- }catch(e){
- console.error('Fatal ' + this.declaredClass + '.setContent could not change content due to '+e.message, e);
- }
- }
- // always put back the node for the next method
- this.node = node; // DomNode
- },
-
- empty: function() {
- // summary
- // cleanly empty out existing content
+ // 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",
- // destroy any widgets from a previous run
- // NOTE: if you dont want this you'll need to empty
- // the parseResults array property yourself to avoid bad things happenning
- if(this.parseResults && this.parseResults.length) {
- dojo.forEach(this.parseResults, function(w) {
- if(w.destroy){
- w.destroy();
- }
- });
- delete this.parseResults;
- }
- // this is fast, but if you know its already empty or safe, you could
- // override empty to skip this step
- dojo.html._emptyNode(this.node);
- },
-
- onBegin: function(){
- // summary
- // Called after instantiation, but before set();
- // It allows modification of any of the object properties
- // - including the node and content provided - before the set operation actually takes place
- // This default implementation checks for cleanContent and extractContent flags to
- // optionally pre-process html string content
- var cont = this.content;
-
- if(dojo.isString(cont)){
- if(this.cleanContent){
- cont = dojo.html._secureForInnerHtml(cont);
- }
-
- if(this.extractContent){
- var match = cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
- if(match){ cont = match[1]; }
- }
- }
+ _setReadOnlyAttr: function(/*Boolean*/ value){
+ this._set("readOnly", value);
+ domAttr.set(this.focusNode, 'readOnly', value);
+ this.focusNode.setAttribute("aria-readonly", value);
+ },
- // clean out the node and any cruft associated with it - like widgets
- this.empty();
-
- this.content = cont;
- return this.node; /* DomNode */
- },
-
- onEnd: function(){
- // summary
- // Called after set(), when the new content has been pushed into the node
- // It provides an opportunity for post-processing before handing back the node to the caller
- // This default implementation checks a parseContent flag to optionally run the dojo parser over the new content
- if(this.parseContent){
- // populates this.parseResults if you need those..
- this._parse();
- }
- return this.node; /* DomNode */
- },
-
- tearDown: function(){
- // summary
- // manually reset the Setter instance if its being re-used for example for another set()
- // description
- // tearDown() is not called automatically.
- // In normal use, the Setter instance properties are simply allowed to fall out of scope
- // but the tearDown method can be called to explicitly reset this instance.
- delete this.parseResults;
- delete this.node;
- delete this.content;
- },
-
- onContentError: function(err){
- return "Error occured setting content: " + err;
- },
-
- _mixin: function(params){
- // mix properties/methods into the instance
- // TODO: the intention with tearDown is to put the Setter's state
- // back to that of the original constructor (vs. deleting/resetting everything regardless of ctor params)
- // so we could do something here to move the original properties aside for later restoration
- var empty = {}, key;
- for(key in params){
- if(key in empty){ continue; }
- // TODO: here's our opportunity to mask the properties we dont consider configurable/overridable
- // .. but history shows we'll almost always guess wrong
- this[key] = params[key];
- }
- },
- _parse: function(){
- // summary:
- // runs the dojo parser over the node contents, storing any results in this.parseResults
- // Any errors resulting from parsing are passed to _onError for handling
+ // 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,
- var rootNode = this.node;
- try{
- // store the results (widgets, whatever) for potential retrieval
- var inherited = {};
- dojo.forEach(["dir", "lang", "textDir"], function(name){
- if(this[name]){
- inherited[name] = this[name];
- }
- }, this);
- this.parseResults = dojo.parser.parse({
- rootNode: rootNode,
- noStart: !this.startup,
- inherited: inherited,
- scope: this.parserScope
- });
- }catch(e){
- this._onError('Content', e, "Error parsing in _ContentSetter#"+this.id);
- }
- },
-
- _onError: function(type, err, consoleText){
- // summary:
- // shows user the string that is returned by on[type]Error
- // overide/implement 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
- dojo.html._setNodeContent(this.node, errText, true);
- }
+ postMixInProperties: function(){
+ if(this.value == ""){
+ this.value = "on";
}
- }); // end dojo.declare()
+ this.inherited(arguments);
+ },
- dojo.html.set = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont, /* Object? */ params){
+ 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:
- // inserts (replaces) the given content into the given node. dojo.place(cont, node, "only")
- // may be a better choice for simple HTML insertion.
- // description:
- // Unless you need to use the params capabilities of this method, you should use
- // dojo.place(cont, node, "only"). dojo.place() has more robust support for injecting
- // an HTML string into the DOM, but it only handles inserting an HTML string as DOM
- // elements, or inserting a DOM node. dojo.place does not handle NodeList insertions
- // or the other capabilities as defined by the params object for this method.
- // node:
- // the parent element that will receive the content
- // cont:
- // the content to be set on the parent element.
- // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes
- // params:
- // Optional flags/properties to configure the content-setting. See dojo.html._ContentSetter
- // example:
- // A safe string/node/nodelist content replacement/injection with hooks for extension
- // Example Usage:
- // dojo.html.set(node, "some string");
- // dojo.html.set(node, contentNode, {options});
- // dojo.html.set(node, myNode.childNodes, {options});
- if(undefined == cont){
- console.warn("dojo.html.set: no cont argument provided, using empty string");
- cont = "";
- }
- if(!params){
- // simple and fast
- return dojo.html._setNodeContent(node, cont, true);
- }else{
- // more options but slower
- // note the arguments are reversed in order, to match the convention for instantiation via the parser
- var op = new dojo.html._ContentSetter(dojo.mixin(
- params,
- { content: cont, node: node }
- ));
- return op.set();
+ // 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);
}
- };
-})();
-
-}
-
-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");
-
-
+ });
+});
+},
+'dijit/layout/ContentPane':function(){
+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.
-dojo.declare(
- "dijit.layout.ContentPane", [dijit._Widget, dijit.layout._ContentPaneResizeMixin],
-{
+return declare("dijit.layout.ContentPane", [_Widget, _ContentPaneResizeMixin], {
// summary:
// A widget containing an HTML fragment, specified inline
// or by uri. Fragment may include widgets.
@@ -10031,13 +19724,11 @@ dojo.declare(
// 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>.
@@ -10053,7 +19744,7 @@ dojo.declare(
// 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,
+ parserScope: kernel._scopeName,
// preventCache: Boolean
// Prevent caching of data from href's by appending a timestamp to the href.
@@ -10069,11 +19760,11 @@ dojo.declare(
// loadingMessage: String
// Message that shows while downloading
- loadingMessage: "<span class='dijitContentPaneLoading'>${loadingState}</span>",
+ loadingMessage: "<span class='dijitContentPaneLoading'><span class='dijitInline dijitIconLoading'></span>${loadingState}</span>",
// errorMessage: String
// Message that shows if an error occurs
- errorMessage: "<span class='dijitContentPaneError'>${errorState}</span>",
+ errorMessage: "<span class='dijitContentPaneError'><span class='dijitInline dijitIconError'></span>${errorState}</span>",
// isLoaded: [readonly] Boolean
// True if the ContentPane has data in it, either specified
@@ -10086,9 +19777,15 @@ dojo.declare(
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 dojoType="dijit.layout.ContentPane" href="./bar" ioArgs="{timeout: 500}">
+ // | <div data-dojo-type="dijit.layout.ContentPane" data-dojo-props="href: './bar', ioArgs: {timeout: 500}">
ioArgs: {},
// onLoadDeferred: [readonly] dojo.Deferred
@@ -10101,12 +19798,10 @@ dojo.declare(
// or content is loaded.
onLoadDeferred: null,
- // Override _Widget's attributeMap because we don't want the title attribute (used to specify
+ // 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.
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- title: []
- }),
+ _setTitleAttr: null,
// Flag to parser that I'll parse my contents, so it shouldn't.
stopParser: true,
@@ -10122,21 +19817,21 @@ dojo.declare(
// 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)
+ var df = win.doc.createDocumentFragment();
+ srcNodeRef = dom.byId(srcNodeRef);
while(srcNodeRef.firstChild){
df.appendChild(srcNodeRef.firstChild);
}
- params = dojo.delegate(params, {content: df});
+ params = lang.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);
+ var messages = i18n.getLocalization("dijit", "loading", this.lang);
+ this.loadingMessage = string.substitute(this.loadingMessage, messages);
+ this.errorMessage = string.substitute(this.errorMessage, messages);
},
buildRendering: function(){
@@ -10152,12 +19847,12 @@ dojo.declare(
// 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");
+ if(!domAttr.get(this.domNode,"role")){
+ this.domNode.setAttribute("role", "group");
}
},
- _startChildren: function(){
+ startup: function(){
// summary:
// Call startup() on all children including non _Widget ones like dojo.dnd.Source objects
@@ -10166,8 +19861,8 @@ dojo.declare(
// 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)){
+ array.forEach(this._contentSetter.parseResults, function(obj){
+ if(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){
obj.startup();
obj._started = true;
}
@@ -10178,7 +19873,7 @@ dojo.declare(
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");
+ kernel.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.", "", "2.0");
return this.set("href", href);
},
_setHrefAttr: function(/*String|Uri*/ href){
@@ -10193,8 +19888,8 @@ dojo.declare(
// 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.onLoadDeferred = new Deferred(lang.hitch(this, "cancel"));
+ this.onLoadDeferred.addCallback(lang.hitch(this, "onLoad"));
this._set("href", href);
@@ -10209,13 +19904,13 @@ dojo.declare(
this._hrefChanged = true;
}
- return this.onLoadDeferred; // dojo.Deferred
+ return this.onLoadDeferred; // 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");
+ kernel.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.", "", "2.0");
this.set("content", data);
},
_setContentAttr: function(/*String|DomNode|Nodelist*/data){
@@ -10237,19 +19932,19 @@ dojo.declare(
// 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"));
+ 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 dojoType=ContentPane>...</div>)
+ // 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(dojo.hitch(this, "onLoad"));
+ 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; // dojo.Deferred
+ return this.onLoadDeferred; // Deferred
},
_getContentAttr: function(){
// summary:
@@ -10319,8 +20014,8 @@ dojo.declare(
// 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.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
},
@@ -10338,11 +20033,11 @@ dojo.declare(
url: this.href,
handleAs: "text"
};
- if(dojo.isObject(this.ioArgs)){
- dojo.mixin(getArgs, this.ioArgs);
+ if(lang.isObject(this.ioArgs)){
+ lang.mixin(getArgs, this.ioArgs);
}
- var hand = (this._xhrDfd = (this.ioMethod || dojo.xhrGet)(getArgs));
+ var hand = (this._xhrDfd = (this.ioMethod || xhr.get)(getArgs));
hand.addCallback(function(html){
try{
@@ -10391,7 +20086,7 @@ dojo.declare(
}
},
- destroyDescendants: function(){
+ destroyDescendants: function(/*Boolean*/ preserveDom){
// summary:
// Destroy all the widgets inside the ContentPane and empty containerNode
@@ -10406,24 +20101,26 @@ dojo.declare(
// 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){
+ array.forEach(this.getChildren(), function(widget){
if(widget.destroyRecursive){
- 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
- dojo.forEach(setter.parseResults, function(widget){
- if(widget.destroyRecursive && widget.domNode && widget.domNode.parentNode == dojo.body()){
- widget.destroyRecursive();
+ 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
- dojo.html._emptyNode(this.containerNode);
+ if(!preserveDom){
+ html._emptyNode(this.containerNode);
+ }
// Delete any state information we have about current contents
delete this._singleChild;
@@ -10436,17 +20133,17 @@ dojo.declare(
// first get rid of child widgets
this.destroyDescendants();
- // dojo.html.set will take care of the rest of the details
+ // 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({
+ if(! (setter && setter instanceof html._ContentSetter)){
+ setter = this._contentSetter = new html._ContentSetter({
node: this.containerNode,
- _onError: dojo.hitch(this, this._onError),
- onContentError: dojo.hitch(this, function(e){
+ _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);
@@ -10458,19 +20155,20 @@ dojo.declare(
})/*,
_onError */
});
- };
+ }
- var setterParams = dojo.mixin({
+ var setterParams = lang.mixin({
cleanContent: this.cleanContent,
extractContent: this.extractContent,
- parseContent: this.parseOnLoad,
+ parseContent: !cont.domNode && this.parseOnLoad,
parserScope: this.parserScope,
startup: false,
dir: this.dir,
- lang: this.lang
+ lang: this.lang,
+ textDir: this.textDir
}, this._contentSetterParams || {});
- setter.set( (dojo.isObject(cont) && cont.domNode) ? cont.domNode : cont, setterParams );
+ 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;
@@ -10482,8 +20180,9 @@ dojo.declare(
if(!isFakeContent){
if(this._started){
// Startup each top level child widget (and they will start their children, recursively)
- this._startChildren();
-
+ 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
@@ -10508,7 +20207,7 @@ dojo.declare(
},
// EVENT's, should be overide-able
- onLoad: function(data){
+ onLoad: function(/*===== data =====*/){
// summary:
// Event hook, is called after everything is loaded and widgetified
// tags:
@@ -10534,7 +20233,7 @@ dojo.declare(
return this.loadingMessage;
},
- onContentError: function(/*Error*/ error){
+ onContentError: function(/*Error*/ /*===== error =====*/){
// summary:
// Called on DOM faults, require faults etc. in content.
//
@@ -10547,7 +20246,7 @@ dojo.declare(
// extension
},
- onDownloadError: function(/*Error*/ error){
+ onDownloadError: function(/*Error*/ /*===== error =====*/){
// summary:
// Called when download error occurs.
//
@@ -10569,2979 +20268,2798 @@ dojo.declare(
}
});
-}
-
-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.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: "",
+},
+'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",
+'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",
+'dijit/layout/utils':function(){
+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()
- // 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,
+ var layout = lang.getObject("layout", true, dijit);
+ /*===== layout = dijit.layout =====*/
- // 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,
+ 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)
+ };
+ };
- // baseClass: [protected] String
- // The root className to use for the various states of this widget
- baseClass: "dijitTooltipDialog",
+ function capitalize(word){
+ return word.substring(0,1).toUpperCase() + word.substring(1);
+ }
- // _firstFocusItem: [private] [readonly] DomNode
- // The pointer to the first focusable node in the dialog.
- // Set by `dijit._DialogMixin._getFocusItems`.
- _firstFocusItem: null,
+ function size(widget, dim){
+ // size the child
+ var newSize = widget.resize ? widget.resize(dim) : domGeometry.setMarginBox(widget.domNode, dim);
- // _lastFocusItem: [private] [readonly] DomNode
- // The pointer to which node has focus prior to our dialog.
- // Set by `dijit._DialogMixin._getFocusItems`.
- _lastFocusItem: null,
+ // 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);
+ }
+ }
- 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"),
+ 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.
- _setTitleAttr: function(/*String*/ title){
- this.containerNode.title = title;
- this._set("title", title)
- },
+ // copy dim because we are going to modify it
+ dim = lang.mixin({}, dim);
- postCreate: function(){
- this.inherited(arguments);
- this.connect(this.containerNode, "onkeypress", "_onKey");
- },
+ domClass.add(container, "dijitLayoutContainer");
- 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;
- },
+ // 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"; }));
- focus: function(){
- // summary:
- // Focus on first field
- this._getFocusItems(this.containerNode);
- dijit.focus(this._firstFocusItem);
- },
+ // 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)
+ }
- 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
+ // 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";
- this.orient(this.domNode,pos.aroundCorner, pos.corner);
- this._onShow(); // lazy load trigger
- },
+ domClass.add(elm, "dijitAlign" + capitalize(pos));
- 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();
- },
+ // Size adjustments to make to this child widget
+ var sizeSetting = {};
- _onKey: function(/*Event*/ evt){
- // summary:
- // Handler for keyboard events
- // description:
- // Keep keyboard focus in dialog; close dialog on escape key
- // tags:
- // private
+ // 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;
+ }
- var node = evt.target;
- var dk = dojo.keys;
- if(evt.charOrCode === dk.TAB){
- this._getFocusItems(this.containerNode);
+ // 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";
}
- 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();
+ }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);
}
- }
- );
-
-}
-
-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");
-
-
-
+ });
+ };
+ return {
+ marginBox2contentBox: layout.marginBox2contentBox,
+ layoutChildren: layout.layoutChildren
+ };
+});
+},
+'dijit/_Contained':function(){
+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
+ }
+ });
+});
-// dijit/TooltipDialog required for back-compat. TODO: remove in 2.0
+},
+'dijit/_KeyNavContainer':function(){
+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){
/*=====
-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 _FocusMixin = dijit._FocusMixin;
+ var _Container = dijit._Container;
=====*/
-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"
- },
+ // module:
+ // dijit/_KeyNavContainer
+ // summary:
+ // A _Container with keyboard navigation of its children.
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- title: [
- { node: "titleNode", type: "innerHTML" },
- { node: "titleBar", type: "attribute" }
- ],
- "aria-describedby":""
- }),
+ return declare("dijit._KeyNavContainer", [_FocusMixin, _Container], {
- // 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,
+ // 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.
- // 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,
+/*=====
+ // focusedChild: [protected] Widget
+ // The currently focused child widget, or null if there isn't one
+ focusedChild: null,
+=====*/
- // 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,
+ // 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",
- // _firstFocusItem: [private readonly] DomNode
- // The pointer to the first focusable node in the dialog.
- // Set by `dijit._DialogMixin._getFocusItems`.
- _firstFocusItem: null,
+ 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
- // _lastFocusItem: [private readonly] DomNode
- // The pointer to which node has focus prior to our dialog.
- // Set by `dijit._DialogMixin._getFocusItems`.
- _lastFocusItem: null,
+ // TODO: call this automatically from my own postCreate()
- // 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,
+ 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");
+ },
- // 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,
+ startupKeyNavChildren: function(){
+ kernel.deprecated("startupKeyNavChildren() call no longer needed", "", "2.0");
+ },
- //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":"",
+ startup: function(){
+ this.inherited(arguments);
+ array.forEach(this.getChildren(), lang.hitch(this, "_startupChild"));
+ },
- postMixInProperties: function(){
- var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
- dojo.mixin(this, _nlsResources);
+ addChild: function(/*dijit._Widget*/ widget, /*int?*/ insertIndex){
this.inherited(arguments);
+ this._startupChild(widget);
},
- postCreate: function(){
- dojo.style(this.domNode, {
- display: "none",
- position:"absolute"
- });
- dojo.body().appendChild(this.domNode);
+ focus: function(){
+ // summary:
+ // Default focus() implementation: focus the first child.
+ this.focusFirstChild();
+ },
- this.inherited(arguments);
+ focusFirstChild: function(){
+ // summary:
+ // Focus the first focusable child in the container.
+ // tags:
+ // protected
+ this.focusChild(this._getFirstFocusableChild());
+ },
- this.connect(this, "onExecute", "hide");
- this.connect(this, "onCancel", "hide");
- this._modalconnects = [];
+ focusLastChild: function(){
+ // summary:
+ // Focus the last focusable child in the container.
+ // tags:
+ // protected
+ this.focusChild(this._getLastFocusableChild());
},
- onLoad: function(){
+ focusNext: 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.
+ // Focus the next widget
// tags:
- // callback
+ // protected
+ this.focusChild(this._getNextFocusableChild(this.focusedChild, 1));
+ },
- // 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);
+ 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);
},
- _endDrag: function(e){
+ focusChild: function(/*dijit._Widget*/ widget, /*Boolean*/ last){
// summary:
- // Called after dragging the Dialog. Saves the position of the dialog in the viewport.
+ // 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:
- // private
- if(e && e.node && e.node === this.domNode){
- this._relativePosition = dojo.position(e.node);
+ // 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);
},
- _setup: function(){
+ _startupChild: function(/*dijit._Widget*/ widget){
// summary:
- // Stuff we need to do before showing the Dialog for the first
- // time (but we defer it until right beforehand, for
- // performance reasons).
+ // 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
- 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");
- }
+ widget.set("tabIndex", "-1");
- this.underlayAttrs = {
- dialogId: this.id,
- "class": dojo.map(this["class"].split(/\s/), function(s){ return s+"_underlay"; }).join(" ")
- };
+ 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");
+ });
},
- _size: function(){
+ _onContainerFocus: function(evt){
// summary:
- // If necessary, shrink dialog contents so dialog fits in viewport
+ // 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
- this._checkIfSingleChild();
+ // 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.
- // 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"
- });
- }
+ // 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; }
- 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
+ this.focusFirstChild();
- var w = Math.min(mb.w, Math.floor(viewport.w * 0.75)),
- h = Math.min(mb.h, Math.floor(viewport.h * 0.75));
+ // 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");
+ },
- 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();
- }
+ _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);
},
- _position: function(){
+ _onContainerKeypress: function(evt){
// 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.
+ // When a key is pressed, if it's an arrow key etc. then
+ // it's handled here.
// 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"
- });
+ if(evt.ctrlKey || evt.altKey){ return; }
+ var func = this._keyNavCodes[evt.charOrCode];
+ if(func){
+ func();
+ event.stop(evt);
}
},
- _onKey: function(/*Event*/ evt){
+ _onChildBlur: function(/*dijit._Widget*/ /*===== widget =====*/){
// summary:
- // Handles the keyboard events for accessibility reasons
+ // Called when focus leaves a child widget to go
+ // to a sibling widget.
+ // Used by MenuBase.js (TODO: move code there)
// 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*/ }
- }
- }
- }
+ // protected
},
- show: function(){
+ _getFirstFocusableChild: 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;
+ // Returns first child that can be focused
+ return this._getNextFocusableChild(null, 1); // dijit._Widget
},
- hide: function(){
+ _getLastFocusableChild: function(){
// summary:
- // Hide the dialog
- // returns: dojo.Deferred
- // Deferred object that resolves when the hide animation is complete
+ // Returns last child that can be focused
+ return this._getNextFocusableChild(null, -1); // dijit._Widget
+ },
- // if we haven't been initialized yet then we aren't showing and we can just return
- if(!this._alreadyInitialized){
- return;
+ _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);
}
- if(this._fadeInDeferred){
- this._fadeInDeferred.cancel();
+ 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
+ }
+ });
+});
- // fade-in Animation object, setup below
- var fadeOut;
+},
+'dijit/form/DataList':function(){
+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
- this._fadeOutDeferred = new dojo.Deferred(dojo.hitch(this, function(){
- fadeOut.stop();
- delete this._fadeOutDeferred;
- }));
+ function toItem(/*DOMNode*/ option){
+ // summary:
+ // Convert <option> node to hash
+ return {
+ id: option.value,
+ value: option.value,
+ name: lang.trim(option.innerText || option.textContent || '')
+ };
+ }
- 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();
+ 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>
+ // | ...
- if(this._scrollConnected){
- this._scrollConnected = false;
- }
- dojo.forEach(this._modalconnects, dojo.disconnect);
- this._modalconnects = [];
+ constructor: function(/*Object?*/ params, /*DomNode|String*/ srcNodeRef){
+ // store pointer to original DOM tree
+ this.domNode = dom.byId(srcNodeRef);
- if(this._relativePosition){
- delete this._relativePosition;
+ lang.mixin(this, params);
+ if(this.id){
+ registry.add(this); // add to registry so it can be easily found by id
}
- this._set("open", false);
+ this.domNode.style.display = "none";
- 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();
- }
+ this.inherited(arguments, [{
+ data: query("option", this.domNode).map(toItem)
+ }]);
},
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);
+ registry.remove(this.id);
+ },
- this.inherited(arguments);
+ 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);
}
- }
-);
+ });
+});
-dojo.declare(
- "dijit.Dialog",
- [dijit.layout.ContentPane, dijit._DialogBase],
- {}
-);
+},
+'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",
+'dijit/form/CheckBox':function(){
+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;
+=====*/
-dijit._DialogLevelManager = {
+ // module:
+ // dijit/form/CheckBox
// 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.
+ // Checkbox widget
- show: function(/*dijit._Widget*/ dialog, /*Object*/ underlayAttrs){
+ // 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:
- // 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.
+ // Same as an HTML checkbox, but with fancy styling.
//
- // New dialog will be displayed on top of all currently displayed dialogs.
+ // 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.
//
- // 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.
+ // There are two modes:
+ // 1. High contrast mode
+ // 2. Normal mode
//
- // 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
+ // 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.
- ds.pop();
+ templateString: template,
- var pd = ds[ds.length-1]; // the new active dialog (or the base page itself)
+ baseClass: "dijitCheckBox",
- // 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 */
- }
+ _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;
}
- }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);
+ if(this._created){
+ this.set('checked', newValue, priorityChange);
}
- }
- },
-
- 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
-];
-
-}
-
-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.declare("dijit._HasDropDown",
- null,
- {
- // summary:
- // Mixin for widgets that need drop down ability.
+ },
+ _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);
+ },
- // _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,
+ // Override behavior from Button, since we don't have an iconNode
+ _setIconClassAttr: 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,
+ postMixInProperties: function(){
+ this.inherited(arguments);
- // _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,
+ // 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" : "";
+ },
- // _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,
+ _fillContent: function(){
+ // Override Button::_fillContent() since it doesn't make sense for CheckBox,
+ // since CheckBox doesn't even have a container
+ },
- // dropDown: [protected] Widget
- // The widget to display as a popup. This widget *must* be
- // defined before the startup function is called.
- dropDown: null,
+ _onFocus: function(){
+ if(this.id){
+ query("label[for='"+this.id+"']").addClass("dijitFocusedLabel");
+ }
+ this.inherited(arguments);
+ },
- // 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,
+ _onBlur: function(){
+ if(this.id){
+ query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel");
+ }
+ this.inherited(arguments);
+ }
+ });
+});
- // forceWidth: [protected] Boolean
- // Set to true to make the drop down exactly as wide as this
- // widget. Overrides autoWidth.
- forceWidth: false,
+},
+'dijit/tree/_dndSelector':function(){
+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`.
- // 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"],
+ 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
- // _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,
+ /*=====
+ // selection: Hash<String, DomNode>
+ // (id, DomNode) map for every TreeNode that's currently selected.
+ // The DOMNode is the TreeNode.rowNode.
+ selection: {},
+ =====*/
- _onDropDownMouseDown: function(/*Event*/ e){
+ constructor: function(){
// summary:
- // Callback when the user mousedown's on the arrow icon
-
- if(this.disabled || this.readOnly){ return; }
+ // Initialization
+ // tags:
+ // private
- dojo.stopEvent(e);
+ this.selection={};
+ this.anchor = null;
- this._docHandler = this.connect(dojo.doc, "onmouseup", "_onDropDownMouseUp");
+ this.tree.domNode.setAttribute("aria-multiselect", !this.singular);
- this.toggleDropDown();
+ 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"))
+ );
},
- _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);
- }
- },
+ // 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,
- _onDropDownClick: function(/*Event*/ e){
- // the drop down was already opened on mousedown/keydown; just need to call stopEvent()
- if(this._stopClickEvents){
- dojo.stopEvent(e);
+ // 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;
},
- buildRendering: function(){
- this.inherited(arguments);
-
- this._buttonNode = this._buttonNode || this.focusNode || this.domNode;
- this._popupStateNode = this._popupStateNode || this.focusNode || this._buttonNode;
+ selectNone: function(){
+ // summary:
+ // Unselects all items
+ // tags:
+ // private
- // 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");
+ this.setSelection([]);
+ return this; // self
},
- postCreate: function(){
+ destroy: function(){
// summary:
- // set up nodes and connect our mouse and keypress events
-
+ // 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.connect(this._buttonNode, "onmousedown", "_onDropDownMouseDown");
- this.connect(this._buttonNode, "onclick", "_onDropDownClick");
- this.connect(this.focusNode, "onkeypress", "_onKey");
- this.connect(this.focusNode, "onkeyup", "_onKeyUp");
+ 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
- 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();
+ 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.dropDown;
- }
- this.inherited(arguments);
+ 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();
},
-
- _onKey: function(/*Event*/ e){
+ _setDifference: function(xs,ys){
// summary:
- // Callback when the user presses a key while focused on the button node
+ // 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.
- if(this.disabled || this.readOnly){ return; }
+ array.forEach(ys, function(y){ y.__exclude__ = true; });
+ var ret = array.filter(xs, function(x){ return !x.__exclude__; });
- 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);
- }
+ // 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]
- _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);
- }
- }
+ 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);
},
-
- _onBlur: function(){
+ // mouse events
+ onMouseDown: function(e){
// summary:
- // Called magically when focus has shifted away from this widget and it's dropdown
+ // Event processor for onmousedown/ontouchstart
+ // e: Event
+ // onmousedown/ontouchstart event
+ // tags:
+ // protected
- // 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);
+ // ignore click on expando node
+ if(!this.current || this.tree.isExpandoNode(e.target, this.current)){ return; }
- this.closeDropDown(focusMe);
+ if(!mouse.isLeft(e)){ return; } // ignore right-click
- this.inherited(arguments);
+ 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);
},
- isLoaded: function(){
+ onMouseUp: function(e){
// summary:
- // Returns whether or not the dropdown is loaded. This can
- // be overridden in order to force a call to loadDropDown().
+ // Event processor for onmouseup/ontouchend
+ // e: Event
+ // onmouseup/ontouchend event
// tags:
// protected
- return true;
+ // _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);
},
-
- loadDropDown: function(/* Function */ loadCallback){
+ onMouseMove: function(/*===== e =====*/){
// 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
+ // event processor for onmousemove/ontouchmove
+ // e: Event
+ // onmousemove/ontouchmove event
+ this._doDeselect = false;
+ },
- loadCallback();
+ _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");
+ }
},
- toggleDropDown: function(){
+ userSelect: function(node, multi, range){
// 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
+ // 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.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;
+ if(this.singular){
+ if(this.anchor == node && multi){
+ this.selectNone();
}else{
- this.openDropDown();
+ this.setSelection([node]);
+ this.anchor = node;
}
}else{
- this.closeDropDown();
+ 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;
+ }
+ }
}
},
- openDropDown: function(){
+ getItem: function(/*String*/ key){
// 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()
+ // Returns the dojo.dnd.Item (representing a dragged node) by it's key (id).
+ // Called by dojo.dnd.Source.checkAcceptance().
// tags:
// protected
- var dropDown = this.dropDown,
- ddNode = dropDown.domNode,
- aroundNode = this._aroundNode || this.domNode,
- self = this;
+ var widget = this.selection[key];
+ return {
+ data: widget,
+ type: ["treeNode"]
+ }; // dojo.dnd.Item
+ },
- // Prepare our popup's height and honor maxHeight if it exists.
+ 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);
+ }
+ }
+ });
+});
- // TODO: isn't maxHeight dependent on the return value from dijit.popup.open(),
- // ie, dependent on how much space is available (BK)
+},
+'dijit/_Container':function(){
+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.
- 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;
- }
+ 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;
}
+ },
- // 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)));
- }
+ 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).
- // 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();
+ 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);
- 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;
- }
+ // 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();
+ }
+ },
- // 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);
- }
+ 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];
}
- 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;
+ if(widget){
+ var node = widget.domNode;
+ if(node && node.parentNode){
+ node.parentNode.removeChild(node); // detach but don't destroy
}
- });
- 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;
+ hasChildren: function(){
+ // summary:
+ // Returns true if widget has children, i.e. if this.containerNode contains something.
+ return this.getChildren().length > 0; // Boolean
},
- closeDropDown: function(/*Boolean*/ focus){
+ _getSiblingOfChild: function(/*dijit._Widget*/ child, /*int*/ dir){
// summary:
- // Closes the drop down on this widget
- // focus:
- // If true, refocuses the button widget
+ // Get the next or previous widget sibling of child
+ // dir:
+ // if 1, get the next sibling
+ // if -1, get the previous sibling
// tags:
- // protected
+ // 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
+ },
- if(this._opened){
- if(focus){ this.focus(); }
- dijit.popup.close(this.dropDown);
- this._opened = false;
- }
+ 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
}
+ });
+});
- }
-);
-
-}
-
-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/data/ItemFileReadStore':function(){
+define("dojo/data/ItemFileReadStore", ["../_base/kernel", "../_base/lang", "../_base/declare", "../_base/array", "../_base/xhr",
+ "../Evented", "../_base/window", "./util/filter", "./util/simpleFetch", "../date/stamp"
+], function(kernel, lang, declare, array, xhr, Evented, window, filterUtil, simpleFetch, dateStamp) {
+ // module:
+ // dojo/data/ItemFileReadStore
+ // summary:
+ // TODOC
+var ItemFileReadStore = declare("dojo.data.ItemFileReadStore", [Evented],{
+ // summary:
+ // The ItemFileReadStore implements the dojo.data.api.Read API and reads
+ // data from JSON files that have contents in this format --
+ // { items: [
+ // { name:'Kermit', color:'green', age:12, friends:['Gonzo', {_reference:{name:'Fozzie Bear'}}]},
+ // { name:'Fozzie Bear', wears:['hat', 'tie']},
+ // { name:'Miss Piggy', pets:'Foo-Foo'}
+ // ]}
+ // Note that it can also contain an 'identifer' property that specified which attribute on the items
+ // in the array of items that acts as the unique identifier for that item.
+ //
+ constructor: function(/* Object */ keywordParameters){
+ // summary: constructor
+ // keywordParameters: {url: String}
+ // keywordParameters: {data: jsonObject}
+ // keywordParameters: {typeMap: object)
+ // The structure of the typeMap object is as follows:
+ // {
+ // type0: function || object,
+ // type1: function || object,
+ // ...
+ // typeN: function || object
+ // }
+ // Where if it is a function, it is assumed to be an object constructor that takes the
+ // value of _value as the initialization parameters. If it is an object, then it is assumed
+ // to be an object of general form:
+ // {
+ // type: function, //constructor.
+ // deserialize: function(value) //The function that parses the value and constructs the object defined by type appropriately.
+ // }
+ this._arrayOfAllItems = [];
+ this._arrayOfTopLevelItems = [];
+ this._loadFinished = false;
+ this._jsonFileUrl = keywordParameters.url;
+ this._ccUrl = keywordParameters.url;
+ this.url = keywordParameters.url;
+ this._jsonData = keywordParameters.data;
+ this.data = null;
+ this._datatypeMap = keywordParameters.typeMap || {};
+ if(!this._datatypeMap['Date']){
+ //If no default mapping for dates, then set this as default.
+ //We use the dojo.date.stamp here because the ISO format is the 'dojo way'
+ //of generically representing dates.
+ this._datatypeMap['Date'] = {
+ type: Date,
+ deserialize: function(value){
+ return dateStamp.fromISOString(value);
+ }
+ };
+ }
+ this._features = {'dojo.data.api.Read':true, 'dojo.data.api.Identity':true};
+ this._itemsByIdentity = null;
+ this._storeRefPropName = "_S"; // Default name for the store reference to attach to every item.
+ this._itemNumPropName = "_0"; // Default Item Id for isItem to attach to every item.
+ this._rootItemPropName = "_RI"; // Default Item Id for isItem to attach to every item.
+ this._reverseRefMap = "_RRM"; // Default attribute for constructing a reverse reference map for use with reference integrity
+ this._loadInProgress = false; //Got to track the initial load to prevent duelling loads of the dataset.
+ this._queuedFetches = [];
+ if(keywordParameters.urlPreventCache !== undefined){
+ this.urlPreventCache = keywordParameters.urlPreventCache?true:false;
+ }
+ if(keywordParameters.hierarchical !== undefined){
+ this.hierarchical = keywordParameters.hierarchical?true:false;
+ }
+ if(keywordParameters.clearOnClose){
+ this.clearOnClose = true;
+ }
+ if("failOk" in keywordParameters){
+ this.failOk = keywordParameters.failOk?true:false;
+ }
+ },
-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);
+ url: "", // use "" rather than undefined for the benefit of the parser (#3539)
- // 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: "",
+ //Internal var, crossCheckUrl. Used so that setting either url or _jsonFileUrl, can still trigger a reload
+ //when clearOnClose and close is used.
+ _ccUrl: "",
- // 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,
+ data: null, // define this so that the parser can populate it
- // iconClass: String
- // Class to apply to DOMNode in button to make it display an icon
- iconClass: "",
+ typeMap: null, //Define so parser can populate.
- // type: String
- // Defines the type of button. "button", "submit", or "reset".
- type: "button",
+ //Parameter to allow users to specify if a close call should force a reload or not.
+ //By default, it retains the old behavior of not clearing if close is called. But
+ //if set true, the store will be reset to default state. Note that by doing this,
+ //all item handles will become invalid and a new fetch must be issued.
+ clearOnClose: false,
- baseClass: "dijitButton",
+ //Parameter to allow specifying if preventCache should be passed to the xhrGet call or not when loading data from a url.
+ //Note this does not mean the store calls the server on each fetch, only that the data load has preventCache set as an option.
+ //Added for tracker: #6072
+ urlPreventCache: false,
- 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"),
+ //Parameter for specifying that it is OK for the xhrGet call to fail silently.
+ failOk: false,
- attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, {
- value: "valueNode"
- }),
+ //Parameter to indicate to process data from the url as hierarchical
+ //(data items can contain other data items in js form). Default is true
+ //for backwards compatibility. False means only root items are processed
+ //as items, all child objects outside of type-mapped objects and those in
+ //specific reference format, are left straight JS data objects.
+ hierarchical: true,
- _onClick: function(/*Event*/ e){
- // summary:
- // Internal function to handle click actions
- if(this.disabled){
- return false;
+ _assertIsItem: function(/* item */ item){
+ // summary:
+ // This function tests whether the item passed in is indeed an item in the store.
+ // item:
+ // The item to test for being contained by the store.
+ if(!this.isItem(item)){
+ throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");
}
- 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
+ _assertIsAttribute: function(/* attribute-name-string */ attribute){
+ // summary:
+ // This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
+ // attribute:
+ // The attribute to test for being contained by the store.
+ if(typeof attribute !== "string"){
+ throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");
}
},
- 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);
- }
+ getValue: function( /* item */ item,
+ /* attribute-name-string */ attribute,
+ /* value? */ defaultValue){
+ // summary:
+ // See dojo.data.api.Read.getValue()
+ var values = this.getValues(item, attribute);
+ return (values.length > 0)?values[0]:defaultValue; // mixed
},
- _setShowLabelAttr: function(val){
- if(this.containerNode){
- dojo.toggleClass(this.containerNode, "dijitDisplayNone", !val);
- }
- this._set("showLabel", val);
- },
+ getValues: function(/* item */ item,
+ /* attribute-name-string */ attribute){
+ // summary:
+ // See dojo.data.api.Read.getValues()
- 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
+ this._assertIsItem(item);
+ this._assertIsAttribute(attribute);
+ // Clone it before returning. refs: #10474
+ return (item[attribute] || []).slice(0); // Array
},
- _clicked: function(/*Event*/ e){
- // summary:
- // Internal overridable function for when the button is clicked
+ getAttributes: function(/* item */ item){
+ // summary:
+ // See dojo.data.api.Read.getAttributes()
+ this._assertIsItem(item);
+ var attributes = [];
+ for(var key in item){
+ // Save off only the real item attributes, not the special id marks for O(1) isItem.
+ if((key !== this._storeRefPropName) && (key !== this._itemNumPropName) && (key !== this._rootItemPropName) && (key !== this._reverseRefMap)){
+ attributes.push(key);
+ }
+ }
+ return attributes; // Array
},
- 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);
+ hasAttribute: function( /* item */ item,
+ /* attribute-name-string */ attribute){
+ // summary:
+ // See dojo.data.api.Read.hasAttribute()
+ this._assertIsItem(item);
+ this._assertIsAttribute(attribute);
+ return (attribute in item);
},
- _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 || '');
+ containsValue: function(/* item */ item,
+ /* attribute-name-string */ attribute,
+ /* anything */ value){
+ // summary:
+ // See dojo.data.api.Read.containsValue()
+ var regexp = undefined;
+ if(typeof value === "string"){
+ regexp = filterUtil.patternToRegExp(value, false);
}
+ return this._containsValue(item, attribute, value, regexp); //boolean.
},
- _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().
+ _containsValue: function( /* item */ item,
+ /* attribute-name-string */ attribute,
+ /* anything */ value,
+ /* RegExp?*/ regexp){
+ // summary:
+ // Internal function for looking at the values contained by the item.
+ // description:
+ // Internal function for looking at the values contained by the item. This
+ // function allows for denoting if the comparison should be case sensitive for
+ // strings or not (for handling filtering cases where string case should not matter)
//
- // 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]);
+ // item:
+ // The data item to examine for attribute values.
+ // attribute:
+ // The attribute to inspect.
+ // value:
+ // The value to match.
+ // regexp:
+ // Optional regular expression generated off value if value was of string type to handle wildcarding.
+ // If present and attribute values are string, then it can be used for comparison instead of 'value'
+ return array.some(this.getValues(item, attribute), function(possibleValue){
+ if(possibleValue !== null && !lang.isObject(possibleValue) && regexp){
+ if(possibleValue.toString().match(regexp)){
+ return true; // Boolean
+ }
+ }else if(value === possibleValue){
+ return true; // Boolean
+ }
+ });
+ },
- // save pointer to srcNode so we can grab the drop down widget after it's instantiated
- this.dropDownContainer = this.srcNodeRef;
+ isItem: function(/* anything */ something){
+ // summary:
+ // See dojo.data.api.Read.isItem()
+ if(something && something[this._storeRefPropName] === this){
+ if(this._arrayOfAllItems[something[this._itemNumPropName]] === something){
+ return true;
+ }
}
+ return false; // Boolean
},
- 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);
- }
+ isItemLoaded: function(/* anything */ something){
+ // summary:
+ // See dojo.data.api.Read.isItemLoaded()
+ return this.isItem(something); //boolean
+ },
- this.inherited(arguments);
+ loadItem: function(/* object */ keywordArgs){
+ // summary:
+ // See dojo.data.api.Read.loadItem()
+ this._assertIsItem(keywordArgs.item);
},
- 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));
+ getFeatures: function(){
+ // summary:
+ // See dojo.data.api.Read.getFeatures()
+ return this._features; //Object
},
- 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();
+ getLabel: function(/* item */ item){
+ // summary:
+ // See dojo.data.api.Read.getLabel()
+ if(this._labelAttr && this.isItem(item)){
+ return this.getValue(item,this._labelAttr); //String
}
+ return undefined; //undefined
},
- 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);
- //
+ getLabelAttributes: function(/* item */ item){
+ // summary:
+ // See dojo.data.api.Read.getLabelAttributes()
+ if(this._labelAttr){
+ return [this._labelAttr]; //array
+ }
+ return null; //null
+ },
- 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"),
+ _fetchItems: function( /* Object */ keywordArgs,
+ /* Function */ findCallback,
+ /* Function */ errorCallback){
+ // summary:
+ // See dojo.data.util.simpleFetch.fetch()
+ var self = this,
+ filter = function(requestArgs, arrayOfItems){
+ var items = [],
+ i, key;
+ if(requestArgs.query){
+ var value,
+ ignoreCase = requestArgs.queryOptions ? requestArgs.queryOptions.ignoreCase : false;
- attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap), {
- id: "",
- tabIndex: ["focusNode", "titleNode"],
- title: "titleNode"
- }),
+ //See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the
+ //same value for each item examined. Much more efficient.
+ var regexpList = {};
+ for(key in requestArgs.query){
+ value = requestArgs.query[key];
+ if(typeof value === "string"){
+ regexpList[key] = filterUtil.patternToRegExp(value, ignoreCase);
+ }else if(value instanceof RegExp){
+ regexpList[key] = value;
+ }
+ }
+ for(i = 0; i < arrayOfItems.length; ++i){
+ var match = true;
+ var candidateItem = arrayOfItems[i];
+ if(candidateItem === null){
+ match = false;
+ }else{
+ for(key in requestArgs.query){
+ value = requestArgs.query[key];
+ if(!self._containsValue(candidateItem, key, value, regexpList[key])){
+ match = false;
+ }
+ }
+ }
+ if(match){
+ items.push(candidateItem);
+ }
+ }
+ findCallback(items, requestArgs);
+ }else{
+ // We want a copy to pass back in case the parent wishes to sort the array.
+ // We shouldn't allow resort of the internal list, so that multiple callers
+ // can get lists and sort without affecting each other. We also need to
+ // filter out any null values that have been left as a result of deleteItem()
+ // calls in ItemFileWriteStore.
+ for(i = 0; i < arrayOfItems.length; ++i){
+ var item = arrayOfItems[i];
+ if(item !== null){
+ items.push(item);
+ }
+ }
+ findCallback(items, requestArgs);
+ }
+ };
- // optionsTitle: String
- // Text that describes the options menu (accessibility)
- optionsTitle: "",
+ if(this._loadFinished){
+ filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
+ }else{
+ //Do a check on the JsonFileUrl and crosscheck it.
+ //If it doesn't match the cross-check, it needs to be updated
+ //This allows for either url or _jsonFileUrl to he changed to
+ //reset the store load location. Done this way for backwards
+ //compatibility. People use _jsonFileUrl (even though officially
+ //private.
+ if(this._jsonFileUrl !== this._ccUrl){
+ kernel.deprecated("dojo.data.ItemFileReadStore: ",
+ "To change the url, set the url property of the store," +
+ " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");
+ this._ccUrl = this._jsonFileUrl;
+ this.url = this._jsonFileUrl;
+ }else if(this.url !== this._ccUrl){
+ this._jsonFileUrl = this.url;
+ this._ccUrl = this.url;
+ }
- baseClass: "dijitComboButton",
+ //See if there was any forced reset of data.
+ if(this.data != null){
+ this._jsonData = this.data;
+ this.data = null;
+ }
- // Set classes like dijitButtonContentsHover or dijitArrowButtonActive depending on
- // mouse action over specified node
- cssStateNodes: {
- "buttonNode": "dijitButtonNode",
- "titleNode": "dijitButtonContents",
- "_popupStateNode": "dijitDownArrowButton"
- },
+ if(this._jsonFileUrl){
+ //If fetches come in before the loading has finished, but while
+ //a load is in progress, we have to defer the fetching to be
+ //invoked in the callback.
+ if(this._loadInProgress){
+ this._queuedFetches.push({args: keywordArgs, filter: filter});
+ }else{
+ this._loadInProgress = true;
+ var getArgs = {
+ url: self._jsonFileUrl,
+ handleAs: "json-comment-optional",
+ preventCache: this.urlPreventCache,
+ failOk: this.failOk
+ };
+ var getHandler = xhr.get(getArgs);
+ getHandler.addCallback(function(data){
+ try{
+ self._getItemsFromLoadedData(data);
+ self._loadFinished = true;
+ self._loadInProgress = false;
- _focusedNode: null,
+ filter(keywordArgs, self._getItemsArray(keywordArgs.queryOptions));
+ self._handleQueuedFetches();
+ }catch(e){
+ self._loadFinished = true;
+ self._loadInProgress = false;
+ errorCallback(e, keywordArgs);
+ }
+ });
+ getHandler.addErrback(function(error){
+ self._loadInProgress = false;
+ errorCallback(error, keywordArgs);
+ });
- _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);
+ //Wire up the cancel to abort of the request
+ //This call cancel on the deferred if it hasn't been called
+ //yet and then will chain to the simple abort of the
+ //simpleFetch keywordArgs
+ var oldAbort = null;
+ if(keywordArgs.abort){
+ oldAbort = keywordArgs.abort;
+ }
+ keywordArgs.abort = function(){
+ var df = getHandler;
+ if(df && df.fired === -1){
+ df.cancel();
+ df = null;
+ }
+ if(oldAbort){
+ oldAbort.call(keywordArgs);
+ }
+ };
+ }
+ }else if(this._jsonData){
+ try{
+ this._loadFinished = true;
+ this._getItemsFromLoadedData(this._jsonData);
+ this._jsonData = null;
+ filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
+ }catch(e){
+ errorCallback(e, keywordArgs);
+ }
+ }else{
+ errorCallback(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."), keywordArgs);
+ }
}
},
- _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);
+ _handleQueuedFetches: function(){
+ // summary:
+ // Internal function to execute delayed request in the store.
+ //Execute any deferred fetches now.
+ if(this._queuedFetches.length > 0){
+ for(var i = 0; i < this._queuedFetches.length; i++){
+ var fData = this._queuedFetches[i],
+ delayedQuery = fData.args,
+ delayedFilter = fData.filter;
+ if(delayedFilter){
+ delayedFilter(delayedQuery, this._getItemsArray(delayedQuery.queryOptions));
+ }else{
+ this.fetchItemByIdentity(delayedQuery);
+ }
+ }
+ this._queuedFetches = [];
}
},
-
- 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);
+ _getItemsArray: function(/*object?*/queryOptions){
+ // summary:
+ // Internal function to determine which list of items to search over.
+ // queryOptions: The query options parameter, if any.
+ if(queryOptions && queryOptions.deep){
+ return this._arrayOfAllItems;
+ }
+ return this._arrayOfTopLevelItems;
},
- _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);
- },
+ close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
+ // summary:
+ // See dojo.data.api.Read.close()
+ if(this.clearOnClose &&
+ this._loadFinished &&
+ !this._loadInProgress){
+ //Reset all internalsback to default state. This will force a reload
+ //on next fetch. This also checks that the data or url param was set
+ //so that the store knows it can get data. Without one of those being set,
+ //the next fetch will trigger an error.
- 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);
+ if(((this._jsonFileUrl == "" || this._jsonFileUrl == null) &&
+ (this.url == "" || this.url == null)
+ ) && this.data == null){
+ console.debug("dojo.data.ItemFileReadStore: WARNING! Data reload " +
+ " information has not been provided." +
+ " Please set 'url' or 'data' to the appropriate value before" +
+ " the next fetch");
+ }
+ this._arrayOfAllItems = [];
+ this._arrayOfTopLevelItems = [];
+ this._loadFinished = false;
+ this._itemsByIdentity = null;
+ this._loadInProgress = false;
+ this._queuedFetches = [];
+ }
},
- 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);
- }
-});
-
-}
-
-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");
-
-
-
-
-}
-
-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.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.
+ _getItemsFromLoadedData: function(/* Object */ dataObject){
+ // summary:
+ // Function to parse the loaded data into item format and build the internal items array.
+ // description:
+ // Function to parse the loaded data into item format and build the internal items array.
//
- // set('value', string) will check the checkbox and change the value to the
- // specified string
+ // dataObject:
+ // The JS data object containing the raw data to convery into item format.
//
- // 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"
- }),
+ // returns: array
+ // Array of items in store item format.
- _setReadOnlyAttr: function(/*Boolean*/ value){
- this._set("readOnly", value);
- dojo.attr(this.focusNode, 'readOnly', value);
- dijit.setWaiState(this.focusNode, "readonly", value);
- },
+ // First, we define a couple little utility functions...
+ var addingArrays = false,
+ self = this;
- _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(){
+ function valueIsAnItem(/* anything */ aValue){
// 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,
+ // Given any sort of value that could be in the raw json data,
+ // return true if we should interpret the value as being an
+ // item itself, rather than a literal value or a reference.
+ // example:
+ // | false == valueIsAnItem("Kermit");
+ // | false == valueIsAnItem(42);
+ // | false == valueIsAnItem(new Date());
+ // | false == valueIsAnItem({_type:'Date', _value:'1802-05-14'});
+ // | false == valueIsAnItem({_reference:'Kermit'});
+ // | true == valueIsAnItem({name:'Kermit', color:'green'});
+ // | true == valueIsAnItem({iggy:'pop'});
+ // | true == valueIsAnItem({foo:42});
+ return (aValue !== null) &&
+ (typeof aValue === "object") &&
+ (!lang.isArray(aValue) || addingArrays) &&
+ (!lang.isFunction(aValue)) &&
+ (aValue.constructor == Object || lang.isArray(aValue)) &&
+ (typeof aValue._reference === "undefined") &&
+ (typeof aValue._type === "undefined") &&
+ (typeof aValue._value === "undefined") &&
+ self.hierarchical;
+ }
- postMixInProperties: function(){
- if(this.value == ""){
- this.value = "on";
+ function addItemAndSubItemsToArrayOfAllItems(/* Item */ anItem){
+ self._arrayOfAllItems.push(anItem);
+ for(var attribute in anItem){
+ var valueForAttribute = anItem[attribute];
+ if(valueForAttribute){
+ if(lang.isArray(valueForAttribute)){
+ var valueArray = valueForAttribute;
+ for(var k = 0; k < valueArray.length; ++k){
+ var singleValue = valueArray[k];
+ if(valueIsAnItem(singleValue)){
+ addItemAndSubItemsToArrayOfAllItems(singleValue);
+ }
+ }
+ }else{
+ if(valueIsAnItem(valueForAttribute)){
+ addItemAndSubItemsToArrayOfAllItems(valueForAttribute);
+ }
+ }
+ }
}
+ }
- // 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
- },
+ this._labelAttr = dataObject.label;
- reset: function(){
- // Override ToggleButton.reset()
+ // We need to do some transformations to convert the data structure
+ // that we read from the file into a format that will be convenient
+ // to work with in memory.
- this._hasBeenBlurred = false;
+ // Step 1: Walk through the object hierarchy and build a list of all items
+ var i,
+ item;
+ this._arrayOfAllItems = [];
+ this._arrayOfTopLevelItems = dataObject.items;
- this.set('checked', this.params.checked || false);
+ for(i = 0; i < this._arrayOfTopLevelItems.length; ++i){
+ item = this._arrayOfTopLevelItems[i];
+ if(lang.isArray(item)){
+ addingArrays = true;
+ }
+ addItemAndSubItemsToArrayOfAllItems(item);
+ item[this._rootItemPropName]=true;
+ }
- // 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);
- },
+ // Step 2: Walk through all the attribute values of all the items,
+ // and replace single values with arrays. For example, we change this:
+ // { name:'Miss Piggy', pets:'Foo-Foo'}
+ // into this:
+ // { name:['Miss Piggy'], pets:['Foo-Foo']}
+ //
+ // We also store the attribute names so we can validate our store
+ // reference and item id special properties for the O(1) isItem
+ var allAttributeNames = {},
+ key;
- _onFocus: function(){
- if(this.id){
- dojo.query("label[for='"+this.id+"']").addClass("dijitFocusedLabel");
+ for(i = 0; i < this._arrayOfAllItems.length; ++i){
+ item = this._arrayOfAllItems[i];
+ for(key in item){
+ if(key !== this._rootItemPropName){
+ var value = item[key];
+ if(value !== null){
+ if(!lang.isArray(value)){
+ item[key] = [value];
+ }
+ }else{
+ item[key] = [null];
+ }
+ }
+ allAttributeNames[key]=key;
}
- this.inherited(arguments);
- },
+ }
- _onBlur: function(){
- if(this.id){
- dojo.query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel");
- }
- this.inherited(arguments);
- },
+ // Step 3: Build unique property names to use for the _storeRefPropName and _itemNumPropName
+ // This should go really fast, it will generally never even run the loop.
+ while(allAttributeNames[this._storeRefPropName]){
+ this._storeRefPropName += "_";
+ }
+ while(allAttributeNames[this._itemNumPropName]){
+ this._itemNumPropName += "_";
+ }
+ while(allAttributeNames[this._reverseRefMap]){
+ this._reverseRefMap += "_";
+ }
- _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;
+ // Step 4: Some data files specify an optional 'identifier', which is
+ // the name of an attribute that holds the identity of each item.
+ // If this data file specified an identifier attribute, then build a
+ // hash table of items keyed by the identity of the items.
+ var arrayOfValues;
+
+ var identifier = dataObject.identifier;
+ if(identifier){
+ this._itemsByIdentity = {};
+ this._features['dojo.data.api.Identity'] = identifier;
+ for(i = 0; i < this._arrayOfAllItems.length; ++i){
+ item = this._arrayOfAllItems[i];
+ arrayOfValues = item[identifier];
+ var identity = arrayOfValues[0];
+ if(!Object.hasOwnProperty.call(this._itemsByIdentity, identity)){
+ this._itemsByIdentity[identity] = item;
+ }else{
+ if(this._jsonFileUrl){
+ throw new Error("dojo.data.ItemFileReadStore: The json data as specified by: [" + this._jsonFileUrl + "] is malformed. Items within the list have identifier: [" + identifier + "]. Value collided: [" + identity + "]");
+ }else if(this._jsonData){
+ throw new Error("dojo.data.ItemFileReadStore: The json data provided by the creation arguments is malformed. Items within the list have identifier: [" + identifier + "]. Value collided: [" + identity + "]");
+ }
+ }
}
- return this.inherited(arguments);
+ }else{
+ this._features['dojo.data.api.Identity'] = Number;
}
- }
-);
-
-dojo.declare(
- "dijit.form.RadioButton",
- dijit.form.CheckBox,
- {
- // summary:
- // Same as an HTML radio, but with fancy styling.
- type: "radio",
- baseClass: "dijitRadio",
+ // Step 5: Walk through all the items, and set each item's properties
+ // for _storeRefPropName and _itemNumPropName, so that store.isItem() will return true.
+ for(i = 0; i < this._arrayOfAllItems.length; ++i){
+ item = this._arrayOfAllItems[i];
+ item[this._storeRefPropName] = this;
+ item[this._itemNumPropName] = i;
+ }
- _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);
+ // Step 6: We walk through all the attribute values of all the items,
+ // looking for type/value literals and item-references.
+ //
+ // We replace item-references with pointers to items. For example, we change:
+ // { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
+ // into this:
+ // { name:['Kermit'], friends:[miss_piggy] }
+ // (where miss_piggy is the object representing the 'Miss Piggy' item).
+ //
+ // We replace type/value pairs with typed-literals. For example, we change:
+ // { name:['Nelson Mandela'], born:[{_type:'Date', _value:'1918-07-18'}] }
+ // into this:
+ // { name:['Kermit'], born:(new Date(1918, 6, 18)) }
+ //
+ // We also generate the associate map for all items for the O(1) isItem function.
+ for(i = 0; i < this._arrayOfAllItems.length; ++i){
+ item = this._arrayOfAllItems[i]; // example: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
+ for(key in item){
+ arrayOfValues = item[key]; // example: [{_reference:{name:'Miss Piggy'}}]
+ for(var j = 0; j < arrayOfValues.length; ++j){
+ value = arrayOfValues[j]; // example: {_reference:{name:'Miss Piggy'}}
+ if(value !== null && typeof value == "object"){
+ if(("_type" in value) && ("_value" in value)){
+ var type = value._type; // examples: 'Date', 'Color', or 'ComplexNumber'
+ var mappingObj = this._datatypeMap[type]; // examples: Date, dojo.Color, foo.math.ComplexNumber, {type: dojo.Color, deserialize(value){ return new dojo.Color(value)}}
+ if(!mappingObj){
+ throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '" + type + "'");
+ }else if(lang.isFunction(mappingObj)){
+ arrayOfValues[j] = new mappingObj(value._value);
+ }else if(lang.isFunction(mappingObj.deserialize)){
+ arrayOfValues[j] = mappingObj.deserialize(value._value);
+ }else{
+ throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");
+ }
+ }
+ if(value._reference){
+ var referenceDescription = value._reference; // example: {name:'Miss Piggy'}
+ if(!lang.isObject(referenceDescription)){
+ // example: 'Miss Piggy'
+ // from an item like: { name:['Kermit'], friends:[{_reference:'Miss Piggy'}]}
+ arrayOfValues[j] = this._getItemByIdentity(referenceDescription);
+ }else{
+ // example: {name:'Miss Piggy'}
+ // from an item like: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
+ for(var k = 0; k < this._arrayOfAllItems.length; ++k){
+ var candidateItem = this._arrayOfAllItems[k],
+ found = true;
+ for(var refKey in referenceDescription){
+ if(candidateItem[refKey] != referenceDescription[refKey]){
+ found = false;
+ }
+ }
+ if(found){
+ arrayOfValues[j] = candidateItem;
+ }
+ }
+ }
+ if(this.referenceIntegrity){
+ var refItem = arrayOfValues[j];
+ if(this.isItem(refItem)){
+ this._addReferenceToMap(refItem, item, key);
+ }
+ }
+ }else if(this.isItem(value)){
+ //It's a child item (not one referenced through _reference).
+ //We need to treat this as a referenced item, so it can be cleaned up
+ //in a write store easily.
+ if(this.referenceIntegrity){
+ this._addReferenceToMap(value, item, key);
}
}
}
- );
- }
- },
-
- _clicked: function(/*Event*/ e){
- if(!this.checked){
- this.set('checked', true);
+ }
}
}
- }
-);
-
-}
-
-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");
-
-
-
-
-}
-
-if(!dojo._hasResource["dojo.regexp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.regexp"] = true;
-dojo.provide("dojo.regexp");
-
-dojo.getObject("regexp", true, dojo);
+ },
-/*=====
-dojo.regexp = {
- // summary: Regular expressions and Builder resources
-};
-=====*/
+ _addReferenceToMap: function(/*item*/ refItem, /*item*/ parentItem, /*string*/ attribute){
+ // summary:
+ // Method to add an reference map entry for an item and attribute.
+ // description:
+ // Method to add an reference map entry for an item and attribute. //
+ // refItem:
+ // The item that is referenced.
+ // parentItem:
+ // The item that holds the new reference to refItem.
+ // attribute:
+ // The attribute on parentItem that contains the new reference.
-dojo.regexp.escapeString = function(/*String*/str, /*String?*/except){
- // summary:
- // Adds escape sequences for special characters in regular expressions
- // except:
- // a String with special characters to be left unescaped
+ //Stub function, does nothing. Real processing is in ItemFileWriteStore.
+ },
- return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, function(ch){
- if(except && except.indexOf(ch) != -1){
- return ch;
+ getIdentity: function(/* item */ item){
+ // summary:
+ // See dojo.data.api.Identity.getIdentity()
+ var identifier = this._features['dojo.data.api.Identity'];
+ if(identifier === Number){
+ return item[this._itemNumPropName]; // Number
+ }else{
+ var arrayOfValues = item[identifier];
+ if(arrayOfValues){
+ return arrayOfValues[0]; // Object || String
+ }
}
- return "\\" + ch;
- }); // String
-};
-
-dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boolean?*/nonCapture){
- // summary:
- // Builds a regular expression that groups subexpressions
- // description:
- // A utility function used by some of the RE generators. The
- // subexpressions are constructed by the function, re, in the second
- // parameter. re builds one subexpression for each elem in the array
- // a, in the first parameter. Returns a string for a regular
- // expression that groups all the subexpressions.
- // arr:
- // A single value or an array of values.
- // re:
- // A function. Takes one parameter and converts it to a regular
- // expression.
- // nonCapture:
- // If true, uses non-capturing match, otherwise matches are retained
- // by regular expression. Defaults to false
-
- // case 1: a is a single value.
- if(!(arr instanceof Array)){
- return re(arr); // String
- }
-
- // case 2: a is an array
- var b = [];
- for(var i = 0; i < arr.length; i++){
- // convert each elem to a RE
- b.push(re(arr[i]));
- }
-
- // join the REs as alternatives in a RE group.
- return dojo.regexp.group(b.join("|"), nonCapture); // String
-};
-
-dojo.regexp.group = function(/*String*/expression, /*Boolean?*/nonCapture){
- // summary:
- // adds group match to expression
- // nonCapture:
- // If true, uses non-capturing match, otherwise matches are retained
- // by regular expression.
- return "(" + (nonCapture ? "?:":"") + expression + ")"; // String
-};
+ return null; // null
+ },
-}
+ fetchItemByIdentity: function(/* Object */ keywordArgs){
+ // summary:
+ // See dojo.data.api.Identity.fetchItemByIdentity()
-if(!dojo._hasResource["dojo.data.util.sorter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.util.sorter"] = true;
-dojo.provide("dojo.data.util.sorter");
+ // Hasn't loaded yet, we have to trigger the load.
+ var item,
+ scope;
+ if(!this._loadFinished){
+ var self = this;
+ //Do a check on the JsonFileUrl and crosscheck it.
+ //If it doesn't match the cross-check, it needs to be updated
+ //This allows for either url or _jsonFileUrl to he changed to
+ //reset the store load location. Done this way for backwards
+ //compatibility. People use _jsonFileUrl (even though officially
+ //private.
+ if(this._jsonFileUrl !== this._ccUrl){
+ kernel.deprecated("dojo.data.ItemFileReadStore: ",
+ "To change the url, set the url property of the store," +
+ " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");
+ this._ccUrl = this._jsonFileUrl;
+ this.url = this._jsonFileUrl;
+ }else if(this.url !== this._ccUrl){
+ this._jsonFileUrl = this.url;
+ this._ccUrl = this.url;
+ }
-dojo.getObject("data.util.sorter", true, dojo);
+ //See if there was any forced reset of data.
+ if(this.data != null && this._jsonData == null){
+ this._jsonData = this.data;
+ this.data = null;
+ }
-dojo.data.util.sorter.basicComparator = function( /*anything*/ a,
- /*anything*/ b){
- // summary:
- // Basic comparision function that compares if an item is greater or less than another item
- // description:
- // returns 1 if a > b, -1 if a < b, 0 if equal.
- // 'null' values (null, undefined) are treated as larger values so that they're pushed to the end of the list.
- // And compared to each other, null is equivalent to undefined.
-
- //null is a problematic compare, so if null, we set to undefined.
- //Makes the check logic simple, compact, and consistent
- //And (null == undefined) === true, so the check later against null
- //works for undefined and is less bytes.
- var r = -1;
- if(a === null){
- a = undefined;
- }
- if(b === null){
- b = undefined;
- }
- if(a == b){
- r = 0;
- }else if(a > b || a == null){
- r = 1;
- }
- return r; //int {-1,0,1}
-};
+ if(this._jsonFileUrl){
-dojo.data.util.sorter.createSortFunction = function( /* attributes array */sortSpec,
- /*dojo.data.core.Read*/ store){
- // summary:
- // Helper function to generate the sorting function based off the list of sort attributes.
- // description:
- // The sort function creation will look for a property on the store called 'comparatorMap'. If it exists
- // it will look in the mapping for comparisons function for the attributes. If one is found, it will
- // use it instead of the basic comparator, which is typically used for strings, ints, booleans, and dates.
- // Returns the sorting function for this particular list of attributes and sorting directions.
- //
- // sortSpec: array
- // A JS object that array that defines out what attribute names to sort on and whether it should be descenting or asending.
- // The objects should be formatted as follows:
- // {
- // attribute: "attributeName-string" || attribute,
- // descending: true|false; // Default is false.
- // }
- // store: object
- // The datastore object to look up item values from.
- //
- var sortFunctions=[];
+ if(this._loadInProgress){
+ this._queuedFetches.push({args: keywordArgs});
+ }else{
+ this._loadInProgress = true;
+ var getArgs = {
+ url: self._jsonFileUrl,
+ handleAs: "json-comment-optional",
+ preventCache: this.urlPreventCache,
+ failOk: this.failOk
+ };
+ var getHandler = xhr.get(getArgs);
+ getHandler.addCallback(function(data){
+ var scope = keywordArgs.scope?keywordArgs.scope:window.global;
+ try{
+ self._getItemsFromLoadedData(data);
+ self._loadFinished = true;
+ self._loadInProgress = false;
+ item = self._getItemByIdentity(keywordArgs.identity);
+ if(keywordArgs.onItem){
+ keywordArgs.onItem.call(scope, item);
+ }
+ self._handleQueuedFetches();
+ }catch(error){
+ self._loadInProgress = false;
+ if(keywordArgs.onError){
+ keywordArgs.onError.call(scope, error);
+ }
+ }
+ });
+ getHandler.addErrback(function(error){
+ self._loadInProgress = false;
+ if(keywordArgs.onError){
+ var scope = keywordArgs.scope?keywordArgs.scope:window.global;
+ keywordArgs.onError.call(scope, error);
+ }
+ });
+ }
- function createSortFunction(attr, dir, comp, s){
- //Passing in comp and s (comparator and store), makes this
- //function much faster.
- return function(itemA, itemB){
- var a = s.getValue(itemA, attr);
- var b = s.getValue(itemB, attr);
- return dir * comp(a,b); //int
- };
- }
- var sortAttribute;
- var map = store.comparatorMap;
- var bc = dojo.data.util.sorter.basicComparator;
- for(var i = 0; i < sortSpec.length; i++){
- sortAttribute = sortSpec[i];
- var attr = sortAttribute.attribute;
- if(attr){
- var dir = (sortAttribute.descending) ? -1 : 1;
- var comp = bc;
- if(map){
- if(typeof attr !== "string" && ("toString" in attr)){
- attr = attr.toString();
+ }else if(this._jsonData){
+ // Passed in data, no need to xhr.
+ self._getItemsFromLoadedData(self._jsonData);
+ self._jsonData = null;
+ self._loadFinished = true;
+ item = self._getItemByIdentity(keywordArgs.identity);
+ if(keywordArgs.onItem){
+ scope = keywordArgs.scope?keywordArgs.scope:window.global;
+ keywordArgs.onItem.call(scope, item);
}
- comp = map[attr] || bc;
}
- sortFunctions.push(createSortFunction(attr,
- dir, comp, store));
- }
- }
- return function(rowA, rowB){
- var i=0;
- while(i < sortFunctions.length){
- var ret = sortFunctions[i++](rowA, rowB);
- if(ret !== 0){
- return ret;//int
+ }else{
+ // Already loaded. We can just look it up and call back.
+ item = this._getItemByIdentity(keywordArgs.identity);
+ if(keywordArgs.onItem){
+ scope = keywordArgs.scope?keywordArgs.scope:window.global;
+ keywordArgs.onItem.call(scope, item);
}
}
- return 0; //int
- }; // Function
-};
-
-}
-
-if(!dojo._hasResource["dojo.data.util.simpleFetch"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.util.simpleFetch"] = true;
-dojo.provide("dojo.data.util.simpleFetch");
-
-
-dojo.getObject("data.util.simpleFetch", true, dojo);
-
-dojo.data.util.simpleFetch.fetch = function(/* Object? */ request){
- // summary:
- // The simpleFetch mixin is designed to serve as a set of function(s) that can
- // be mixed into other datastore implementations to accelerate their development.
- // The simpleFetch mixin should work well for any datastore that can respond to a _fetchItems()
- // call by returning an array of all the found items that matched the query. The simpleFetch mixin
- // is not designed to work for datastores that respond to a fetch() call by incrementally
- // loading items, or sequentially loading partial batches of the result
- // set. For datastores that mixin simpleFetch, simpleFetch
- // implements a fetch method that automatically handles eight of the fetch()
- // arguments -- onBegin, onItem, onComplete, onError, start, count, sort and scope
- // The class mixing in simpleFetch should not implement fetch(),
- // but should instead implement a _fetchItems() method. The _fetchItems()
- // method takes three arguments, the keywordArgs object that was passed
- // to fetch(), a callback function to be called when the result array is
- // available, and an error callback to be called if something goes wrong.
- // The _fetchItems() method should ignore any keywordArgs parameters for
- // start, count, onBegin, onItem, onComplete, onError, sort, and scope.
- // The _fetchItems() method needs to correctly handle any other keywordArgs
- // parameters, including the query parameter and any optional parameters
- // (such as includeChildren). The _fetchItems() method should create an array of
- // result items and pass it to the fetchHandler along with the original request object
- // -- or, the _fetchItems() method may, if it wants to, create an new request object
- // with other specifics about the request that are specific to the datastore and pass
- // that as the request object to the handler.
- //
- // For more information on this specific function, see dojo.data.api.Read.fetch()
- request = request || {};
- if(!request.store){
- request.store = this;
- }
- var self = this;
-
- var _errorHandler = function(errorData, requestObject){
- if(requestObject.onError){
- var scope = requestObject.scope || dojo.global;
- requestObject.onError.call(scope, errorData, requestObject);
- }
- };
-
- var _fetchHandler = function(items, requestObject){
- var oldAbortFunction = requestObject.abort || null;
- var aborted = false;
-
- var startIndex = requestObject.start?requestObject.start:0;
- var endIndex = (requestObject.count && (requestObject.count !== Infinity))?(startIndex + requestObject.count):items.length;
-
- requestObject.abort = function(){
- aborted = true;
- if(oldAbortFunction){
- oldAbortFunction.call(requestObject);
- }
- };
+ },
- var scope = requestObject.scope || dojo.global;
- if(!requestObject.store){
- requestObject.store = self;
- }
- if(requestObject.onBegin){
- requestObject.onBegin.call(scope, items.length, requestObject);
- }
- if(requestObject.sort){
- items.sort(dojo.data.util.sorter.createSortFunction(requestObject.sort, self));
- }
- if(requestObject.onItem){
- for(var i = startIndex; (i < items.length) && (i < endIndex); ++i){
- var item = items[i];
- if(!aborted){
- requestObject.onItem.call(scope, item, requestObject);
- }
+ _getItemByIdentity: function(/* Object */ identity){
+ // summary:
+ // Internal function to look an item up by its identity map.
+ var item = null;
+ if(this._itemsByIdentity){
+ // If this map is defined, we need to just try to get it. If it fails
+ // the item does not exist.
+ if(Object.hasOwnProperty.call(this._itemsByIdentity, identity)){
+ item = this._itemsByIdentity[identity];
}
+ }else if (Object.hasOwnProperty.call(this._arrayOfAllItems, identity)){
+ item = this._arrayOfAllItems[identity];
}
- if(requestObject.onComplete && !aborted){
- var subset = null;
- if(!requestObject.onItem){
- subset = items.slice(startIndex, endIndex);
- }
- requestObject.onComplete.call(scope, subset, requestObject);
+ if(item === undefined){
+ item = null;
}
- };
- this._fetchItems(request, _fetchHandler, _errorHandler);
- return request; // Object
-};
+ return item; // Object
+ },
-}
+ getIdentityAttributes: function(/* item */ item){
+ // summary:
+ // See dojo.data.api.Identity.getIdentityAttributes()
-if(!dojo._hasResource["dojo.data.util.filter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.util.filter"] = true;
-dojo.provide("dojo.data.util.filter");
+ var identifier = this._features['dojo.data.api.Identity'];
+ if(identifier === Number){
+ // If (identifier === Number) it means getIdentity() just returns
+ // an integer item-number for each item. The dojo.data.api.Identity
+ // spec says we need to return null if the identity is not composed
+ // of attributes
+ return null; // null
+ }else{
+ return [identifier]; // Array
+ }
+ },
-dojo.getObject("data.util.filter", true, dojo);
+ _forceLoad: function(){
+ // summary:
+ // Internal function to force a load of the store if it hasn't occurred yet. This is required
+ // for specific functions to work properly.
+ var self = this;
+ //Do a check on the JsonFileUrl and crosscheck it.
+ //If it doesn't match the cross-check, it needs to be updated
+ //This allows for either url or _jsonFileUrl to he changed to
+ //reset the store load location. Done this way for backwards
+ //compatibility. People use _jsonFileUrl (even though officially
+ //private.
+ if(this._jsonFileUrl !== this._ccUrl){
+ kernel.deprecated("dojo.data.ItemFileReadStore: ",
+ "To change the url, set the url property of the store," +
+ " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");
+ this._ccUrl = this._jsonFileUrl;
+ this.url = this._jsonFileUrl;
+ }else if(this.url !== this._ccUrl){
+ this._jsonFileUrl = this.url;
+ this._ccUrl = this.url;
+ }
-dojo.data.util.filter.patternToRegExp = function(/*String*/pattern, /*boolean?*/ ignoreCase){
- // summary:
- // Helper function to convert a simple pattern to a regular expression for matching.
- // description:
- // Returns a regular expression object that conforms to the defined conversion rules.
- // For example:
- // ca* -> /^ca.*$/
- // *ca* -> /^.*ca.*$/
- // *c\*a* -> /^.*c\*a.*$/
- // *c\*a?* -> /^.*c\*a..*$/
- // and so on.
- //
- // pattern: string
- // A simple matching pattern to convert that follows basic rules:
- // * Means match anything, so ca* means match anything starting with ca
- // ? Means match single character. So, b?b will match to bob and bab, and so on.
- // \ is an escape character. So for example, \* means do not treat * as a match, but literal character *.
- // To use a \ as a character in the string, it must be escaped. So in the pattern it should be
- // represented by \\ to be treated as an ordinary \ character instead of an escape.
- //
- // ignoreCase:
- // An optional flag to indicate if the pattern matching should be treated as case-sensitive or not when comparing
- // By default, it is assumed case sensitive.
+ //See if there was any forced reset of data.
+ if(this.data != null){
+ this._jsonData = this.data;
+ this.data = null;
+ }
- var rxp = "^";
- var c = null;
- for(var i = 0; i < pattern.length; i++){
- c = pattern.charAt(i);
- switch(c){
- case '\\':
- rxp += c;
- i++;
- rxp += pattern.charAt(i);
- break;
- case '*':
- rxp += ".*"; break;
- case '?':
- rxp += "."; break;
- case '$':
- case '^':
- case '/':
- case '+':
- case '.':
- case '|':
- case '(':
- case ')':
- case '{':
- case '}':
- case '[':
- case ']':
- rxp += "\\"; //fallthrough
- default:
- rxp += c;
+ if(this._jsonFileUrl){
+ var getArgs = {
+ url: this._jsonFileUrl,
+ handleAs: "json-comment-optional",
+ preventCache: this.urlPreventCache,
+ failOk: this.failOk,
+ sync: true
+ };
+ var getHandler = xhr.get(getArgs);
+ getHandler.addCallback(function(data){
+ try{
+ //Check to be sure there wasn't another load going on concurrently
+ //So we don't clobber data that comes in on it. If there is a load going on
+ //then do not save this data. It will potentially clobber current data.
+ //We mainly wanted to sync/wait here.
+ //TODO: Revisit the loading scheme of this store to improve multi-initial
+ //request handling.
+ if(self._loadInProgress !== true && !self._loadFinished){
+ self._getItemsFromLoadedData(data);
+ self._loadFinished = true;
+ }else if(self._loadInProgress){
+ //Okay, we hit an error state we can't recover from. A forced load occurred
+ //while an async load was occurring. Since we cannot block at this point, the best
+ //that can be managed is to throw an error.
+ throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress.");
+ }
+ }catch(e){
+ console.log(e);
+ throw e;
+ }
+ });
+ getHandler.addErrback(function(error){
+ throw error;
+ });
+ }else if(this._jsonData){
+ self._getItemsFromLoadedData(self._jsonData);
+ self._jsonData = null;
+ self._loadFinished = true;
}
}
- rxp += "$";
- if(ignoreCase){
- return new RegExp(rxp,"mi"); //RegExp
- }else{
- return new RegExp(rxp,"m"); //RegExp
- }
-
-};
+});
+//Mix in the simple fetch implementation to this class.
+lang.extend(ItemFileReadStore,simpleFetch);
-}
+return ItemFileReadStore;
+});
-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/html':function(){
+define("dojo/html", ["./_base/kernel", "./_base/lang", "./_base/array", "./_base/declare", "./dom", "./dom-construct", "./parser"], function(dojo, lang, darray, declare, dom, domConstruct, parser) {
+ // module:
+ // dojo/html
+ // summary:
+ // TODOC
+ lang.getObject("html", true, dojo);
+ // the parser might be needed..
-dojo.declare(
- "dijit.form.TextBox",
- dijit.form._FormValueWidget,
- {
+ // idCounter is incremented with each instantiation to allow asignment of a unique id for tracking, logging purposes
+ var idCounter = 0;
+
+ dojo.html._secureForInnerHtml = function(/*String*/ cont){
// summary:
- // A base class for textbox form inputs
+ // removes !DOCTYPE and title elements from the html string.
+ //
+ // khtml is picky about dom faults, you can't attach a style or <title> node as child of body
+ // must go into head, so we need to cut out those tags
+ // cont:
+ // An html string for insertion into the dom
+ //
+ return cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig, ""); // String
+ };
- // trim: Boolean
- // Removes leading and trailing whitespace if true. Default is false.
- trim: false,
+/*====
+ dojo.html._emptyNode = function(node){
+ // summary:
+ // removes all child nodes from the given node
+ // node: DOMNode
+ // the parent element
+ };
+=====*/
+ dojo.html._emptyNode = domConstruct.empty;
- // uppercase: Boolean
- // Converts all characters to uppercase if true. Default is false.
- uppercase: false,
+ dojo.html._setNodeContent = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont){
+ // summary:
+ // inserts the given content into the given node
+ // node:
+ // the parent element
+ // content:
+ // the content to be set on the parent element.
+ // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes
- // lowercase: Boolean
- // Converts all characters to lowercase if true. Default is false.
- lowercase: false,
+ // always empty
+ domConstruct.empty(node);
- // propercase: Boolean
- // Converts the first character of each word to uppercase if true.
- propercase: false,
+ if(cont) {
+ if(typeof cont == "string") {
+ cont = domConstruct.toDom(cont, node.ownerDocument);
+ }
+ if(!cont.nodeType && lang.isArrayLike(cont)) {
+ // handle as enumerable, but it may shrink as we enumerate it
+ for(var startlen=cont.length, i=0; i<cont.length; i=startlen==cont.length ? i+1 : 0) {
+ domConstruct.place( cont[i], node, "last");
+ }
+ } else {
+ // pass nodes, documentFragments and unknowns through to dojo.place
+ domConstruct.place(cont, node, "last");
+ }
+ }
- // maxLength: String
- // HTML INPUT tag maxLength declaration.
- maxLength: "",
+ // return DomNode
+ return node;
+ };
- // selectOnClick: [const] Boolean
- // If true, all text will be selected when focused with mouse
- selectOnClick: false,
+ // we wrap up the content-setting operation in a object
+ declare("dojo.html._ContentSetter", null,
+ {
+ // node: DomNode|String
+ // An node which will be the parent element that we set content into
+ node: "",
- // 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} />',
+ // content: String|DomNode|DomNode[]
+ // The content to be placed in the node. Can be an HTML string, a node reference, or a enumerable list of nodes
+ content: "",
- _buttonInputDisabled: dojo.isIE ? "disabled" : "", // allows IE to disallow focus, but Firefox cannot be disabled for mousedown events
+ // id: String?
+ // Usually only used internally, and auto-generated with each instance
+ id: "",
- baseClass: "dijitTextBox",
+ // cleanContent: Boolean
+ // Should the content be treated as a full html document,
+ // and the real content stripped of <html>, <body> wrapper before injection
+ cleanContent: false,
- 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);
- },
+ // extractContent: Boolean
+ // Should the content be treated as a full html document, and the real content stripped of <html>, <body> wrapper before injection
+ extractContent: false,
- _setPlaceHolderAttr: function(v){
- this._set("placeHolder", v);
- if(!this._phspan){
- this._attachPoints.push('_phspan');
- /* dijitInputField class gives placeHolder same padding as the input field
- * parent node already has dijitInputField class but it doesn't affect this <span>
- * since it's position: absolute.
- */
- this._phspan = 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";
- }
- },
+ // parseContent: Boolean
+ // Should the node by passed to the parser after the new content is set
+ parseContent: false,
- _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);
- },
+ // 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,
- _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.
+ // startup: Boolean
+ // Start the child widgets after parsing them. Only obeyed if parseContent is true.
+ startup: true,
- 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"));
- }
+ // lifecyle methods
+ constructor: function(/* Object */params, /* String|DomNode */node){
+ // summary:
+ // Provides a configurable, extensible object to wrap the setting on content on a node
+ // call the set() method to actually set the content..
- this._updatePlaceHolder();
+ // the original params are mixed directly into the instance "this"
+ lang.mixin(this, params || {});
- this.inherited(arguments, [filteredValue, priorityChange]);
- },
+ // give precedence to params.node vs. the node argument
+ // and ensure its a node, not an id string
+ node = this.node = dom.byId( this.node || node );
- // 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: "",
+ if(!this.id){
+ this.id = [
+ "Setter",
+ (node) ? node.id || node.tagName : "",
+ idCounter++
+ ].join("_");
+ }
+ },
+ set: function(/* String|DomNode|NodeList? */ cont, /* Object? */ params){
+ // summary:
+ // front-end to the set-content sequence
+ // cont:
+ // An html string, node or enumerable list of nodes for insertion into the dom
+ // If not provided, the object's content property will be used
+ if(undefined !== cont){
+ this.content = cont;
+ }
+ // in the re-use scenario, set needs to be able to mixin new configuration
+ if(params){
+ this._mixin(params);
+ }
- 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');
- },
+ this.onBegin();
+ this.setContent();
+ this.onEnd();
- _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)
+ return this.node;
+ },
+ setContent: function(){
+ // summary:
+ // sets the content on the node
- // 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);
- },
+ var node = this.node;
+ if(!node) {
+ // can't proceed
+ throw new Error(this.declaredClass + ": setContent given no node");
+ }
+ try{
+ node = dojo.html._setNodeContent(node, this.content);
+ }catch(e){
+ // check if a domfault occurs when we are appending this.errorMessage
+ // like for instance if domNode is a UL and we try append a DIV
- 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);
- },
+ // FIXME: need to allow the user to provide a content error message string
+ var errMess = this.onContentError(e);
+ try{
+ node.innerHTML = errMess;
+ }catch(e){
+ console.error('Fatal ' + this.declaredClass + '.setContent could not change content due to '+e.message, e);
+ }
+ }
+ // always put back the node for the next method
+ this.node = node; // DomNode
+ },
- _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.
+ empty: function() {
+ // summary
+ // cleanly empty out existing content
- if(value === null || value === undefined){ value = '' }
- else if(typeof value != "string"){ value = String(value) }
+ // destroy any widgets from a previous run
+ // NOTE: if you dont want this you'll need to empty
+ // the parseResults array property yourself to avoid bad things happenning
+ if(this.parseResults && this.parseResults.length) {
+ darray.forEach(this.parseResults, function(w) {
+ if(w.destroy){
+ w.destroy();
+ }
+ });
+ delete this.parseResults;
+ }
+ // this is fast, but if you know its already empty or safe, you could
+ // override empty to skip this step
+ dojo.html._emptyNode(this.node);
+ },
- this.textbox.value = value;
+ onBegin: function(){
+ // summary
+ // Called after instantiation, but before set();
+ // It allows modification of any of the object properties
+ // - including the node and content provided - before the set operation actually takes place
+ // This default implementation checks for cleanContent and extractContent flags to
+ // optionally pre-process html string content
+ var cont = this.content;
- // 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);
+ if(lang.isString(cont)){
+ if(this.cleanContent){
+ cont = dojo.html._secureForInnerHtml(cont);
+ }
- this._set("displayedValue", this.get('displayedValue'));
- },
+ if(this.extractContent){
+ var match = cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+ if(match){ cont = match[1]; }
+ }
+ }
- 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));
- },
+ // clean out the node and any cruft associated with it - like widgets
+ this.empty();
- parse: function(/*String*/ value, /*Object*/ constraints){
- // summary:
- // Replacable function to convert a formatted string to a value
- // tags:
- // protected extension
+ this.content = cont;
+ return this.node; /* DomNode */
+ },
- return value; // String
- },
+ onEnd: function(){
+ // summary
+ // Called after set(), when the new content has been pushed into the node
+ // It provides an opportunity for post-processing before handing back the node to the caller
+ // This default implementation checks a parseContent flag to optionally run the dojo parser over the new content
+ if(this.parseContent){
+ // populates this.parseResults if you need those..
+ this._parse();
+ }
+ return this.node; /* DomNode */
+ },
- _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
- },
+ tearDown: function(){
+ // summary
+ // manually reset the Setter instance if its being re-used for example for another set()
+ // description
+ // tearDown() is not called automatically.
+ // In normal use, the Setter instance properties are simply allowed to fall out of scope
+ // but the tearDown method can be called to explicitly reset this instance.
+ delete this.parseResults;
+ delete this.node;
+ delete this.content;
+ },
- _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();
+ onContentError: function(err){
+ return "Error occured setting content: " + err;
+ },
- // In case someone is watch()'ing for changes to displayedValue
- this._set("displayedValue", this.get("displayedValue"));
- },
+ _mixin: function(params){
+ // mix properties/methods into the instance
+ // TODO: the intention with tearDown is to put the Setter's state
+ // back to that of the original constructor (vs. deleting/resetting everything regardless of ctor params)
+ // so we could do something here to move the original properties aside for later restoration
+ var empty = {}, key;
+ for(key in params){
+ if(key in empty){ continue; }
+ // TODO: here's our opportunity to mask the properties we dont consider configurable/overridable
+ // .. but history shows we'll almost always guess wrong
+ this[key] = params[key];
+ }
+ },
+ _parse: function(){
+ // summary:
+ // runs the dojo parser over the node contents, storing any results in this.parseResults
+ // Any errors resulting from parsing are passed to _onError for handling
- 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;
- }
+ var rootNode = this.node;
+ try{
+ // store the results (widgets, whatever) for potential retrieval
+ var inherited = {};
+ darray.forEach(["dir", "lang", "textDir"], function(name){
+ if(this[name]){
+ inherited[name] = this[name];
}
- }
+ }, this);
+ this.parseResults = parser.parse({
+ rootNode: rootNode,
+ noStart: !this.startup,
+ inherited: inherited,
+ scope: this.parserScope
+ });
+ }catch(e){
+ this._onError('Content', e, "Error parsing in _ContentSetter#"+this.id);
}
- }), 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");
+ _onError: function(type, err, consoleText){
+ // summary:
+ // shows user the string that is returned by on[type]Error
+ // overide/implement 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
+ dojo.html._setNodeContent(this.node, errText, true);
+ }
}
- },
+ }); // end dojo.declare()
- _blankValue: '', // if the textbox is blank, what value should be reported
- filter: function(val){
+ dojo.html.set = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont, /* Object? */ params){
// summary:
- // Auto-corrections (such as trimming) that are applied to textbox
- // value on blur or form submit.
+ // inserts (replaces) the given content into the given node. dojo.place(cont, node, "only")
+ // may be a better choice for simple HTML insertion.
// 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;
- },
+ // Unless you need to use the params capabilities of this method, you should use
+ // dojo.place(cont, node, "only"). dojo.place() has more robust support for injecting
+ // an HTML string into the DOM, but it only handles inserting an HTML string as DOM
+ // elements, or inserting a DOM node. dojo.place does not handle NodeList insertions
+ // or the other capabilities as defined by the params object for this method.
+ // node:
+ // the parent element that will receive the content
+ // cont:
+ // the content to be set on the parent element.
+ // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes
+ // params:
+ // Optional flags/properties to configure the content-setting. See dojo.html._ContentSetter
+ // example:
+ // A safe string/node/nodelist content replacement/injection with hooks for extension
+ // Example Usage:
+ // dojo.html.set(node, "some string");
+ // dojo.html.set(node, contentNode, {options});
+ // dojo.html.set(node, myNode.childNodes, {options});
+ if(undefined == cont){
+ console.warn("dojo.html.set: no cont argument provided, using empty string");
+ cont = "";
+ }
+ if(!params){
+ // simple and fast
+ return dojo.html._setNodeContent(node, cont, true);
+ }else{
+ // more options but slower
+ // note the arguments are reversed in order, to match the convention for instantiation via the parser
+ var op = new dojo.html._ContentSetter(lang.mixin(
+ params,
+ { content: cont, node: node }
+ ));
+ return op.set();
+ }
+ };
- _setBlurValue: function(){
- this._setValueAttr(this.get('value'), true);
- },
+ return dojo.html;
+});
- _onBlur: function(e){
- if(this.disabled){ return; }
- this._setBlurValue();
- this.inherited(arguments);
+},
+'dijit/_PaletteMixin':function(){
+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){
- 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();
- },
+/*=====
+ var _CssStateMixin = dijit._CssStateMixin;
+=====*/
- _onFocus: function(/*String*/ by){
- if(this.disabled || this.readOnly){ return; }
+// module:
+// dijit/_PaletteMixin
+// summary:
+// A keyboard accessible palette, for picking a color/emoticon/etc.
- // 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);
- }
- });
- }
+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.
- 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);
+ // defaultTimeout: Number
+ // Number of milliseconds before a held key or button becomes typematic
+ defaultTimeout: 500,
- this._refreshState();
- },
+ // 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,
- reset: function(){
- // Overrides dijit._FormWidget.reset().
- // Additionally resets the displayed textbox value to ''
- this.textbox.value = '';
- this.inherited(arguments);
- }
- }
-);
+ // value: String
+ // Currently selected color/emoticon/etc.
+ value: "",
-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).
+ // _selectedCell: [private] Integer
+ // Index of the currently selected cell. Initially, none selected
+ _selectedCell: -1,
- // 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);
- }
- }
-};
+/*=====
+ // _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,
+=====*/
-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");
+/*=====
+ // _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",
-dojo.declare(
- "dijit._MasterTooltip",
- [dijit._Widget, dijit._Templated],
- {
+ _dyeFactory: function(value /*===== , row, col =====*/){
// 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
+ // Return instance of dijit.Dye for specified cell of palette
// 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);
+ // extension
+ var dyeClassObj = lang.getObject(this.dyeClass);
+ return new dyeClassObj(value);
+ },
- // 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") });
- },
+ _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
- 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)
+ this._cells = [];
+ var url = this._blankGif;
- if(this.aroundNode && this.aroundNode === aroundNode){
- return;
- }
+ this.connect(this.gridNode, "ondijitclick", "_onCellClick");
- // reset width; it may have been set by orient() on a previous tooltip show()
- this.domNode.width = "auto";
+ 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);
- 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 cellNode = domConstruct.create("td", {
+ "class": this.cellClass,
+ tabIndex: "-1",
+ title: titles[value],
+ role: "gridcell"
+ });
- var pos = dijit.placeOnScreenAroundElement(this.domNode, aroundNode, dijit.getPopupAroundAlignment((position && position.length) ? position : dijit.Tooltip.defaultPosition, !rtl), dojo.hitch(this, "orient"));
+ // prepare cell inner structure
+ cellObject.fillCell(cellNode, url);
- // show it
- dojo.style(this.domNode, "opacity", 0);
- this.fadeIn.play();
- this.isShowingNow = true;
- this.aroundNode = aroundNode;
- },
+ domConstruct.place(cellNode, rowNode);
- 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;
+ cellNode.index = this._cells.length;
- 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 = "";
+ // save cell info into _cells
+ this._cells.push({node:cellNode, dye:cellObject});
}
- }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
}
- },
+ }
+ this._xDim = choices[0].length;
+ this._yDim = choices.length;
- _onHide: function(){
- // summary:
- // Called at end of fade-out operation
- // tags:
- // protected
+ // 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.
- 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;
- }
+ 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
+ )
+ );
}
+ },
- }
-);
-
-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);
-};
+ postCreate: function(){
+ this.inherited(arguments);
-dijit.hideTooltip = function(aroundNode){
- // summary:
- // Hide the tooltip
- if(!dijit._masterTT){ dijit._masterTT = new dijit._MasterTooltip(); }
- return dijit._masterTT.hide(aroundNode);
-};
+ // Set initial navigable node.
+ this._setCurrent(this._cells[0].node);
+ },
-dojo.declare(
- "dijit.Tooltip",
- dijit._Widget,
- {
+ focus: function(){
// 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);
+ // Focus this widget. Puts focus on the most recently focused cell.
- this._connectIds = ary; // save as array
- },
+ // The cell already has tabIndex set, just need to set CSS and focus it
+ focus.focus(this._currentFocus);
+ },
- addTarget: function(/*DOMNODE || String*/ node){
- // summary:
- // Attach tooltip to specified node if it's not already connected
+ _onCellClick: function(/*Event*/ evt){
+ // summary:
+ // Handler for click, enter key & space key. Selects the cell.
+ // evt:
+ // The event.
+ // tags:
+ // private
- // TODO: remove in 2.0 and just use set("connectId", ...) interface
+ var target = evt.target;
- var id = node.id || node;
- if(dojo.indexOf(this._connectIds, id) == -1){
- this.set("connectId", this._connectIds.concat(id));
+ // 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;
+ }
- removeTarget: function(/*DOMNODE || String*/ node){
- // summary:
- // Detach tooltip from specified node
+ var value = this._getDye(target).getValue();
- // 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);
- }
- },
+ // 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);
- buildRendering: function(){
- this.inherited(arguments);
- dojo.addClass(this.domNode,"dijitTooltipData");
- },
+ event.stop(evt);
+ },
- startup: function(){
- this.inherited(arguments);
+ _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");
+ }
- // 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);
- },
+ // Set tabIndex of new cell
+ this._currentFocus = node;
+ if(node){
+ domAttr.set(node, "tabIndex", this.tabIndex);
+ }
+ },
- _onTargetMouseEnter: function(/*Event*/ e){
- // summary:
- // Handler for mouseenter event on the target node
- // tags:
- // private
- this._onHover(e);
- },
+ _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.
- _onTargetMouseLeave: function(/*Event*/ e){
- // summary:
- // Handler for mouseleave event on the target node
- // tags:
- // private
- this._onUnHover(e);
- },
+ // clear old selected cell
+ if(this._selectedCell >= 0){
+ domClass.remove(this._cells[this._selectedCell].node, this.cellClass + "Selected");
+ }
+ this._selectedCell = -1;
- _onTargetFocus: function(/*Event*/ e){
- // summary:
- // Handler for focus event on the target node
- // tags:
- // private
+ // 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;
+ }
+ }
+ }
- this._focus = true;
- this._onHover(e);
- },
+ // record new value, or null if no matching cell
+ this._set("value", this._selectedCell >= 0 ? value : null);
- _onTargetBlur: function(/*Event*/ e){
- // summary:
- // Handler for blur event on the target node
- // tags:
- // private
+ if(priorityChange || priorityChange === undefined){
+ this.onChange(value);
+ }
+ },
- this._focus = false;
- this._onUnHover(e);
- },
+ onChange: function(/*===== value =====*/){
+ // summary:
+ // Callback when a cell is selected.
+ // value: String
+ // Value corresponding to cell.
+ },
- _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);
- }
- },
+ _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
- _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
+ // typecount == -1 means the key is released.
+ if(typeCount == -1){ return; }
- // keep a tooltip open if the associated element still has focus (even though the
- // mouse moved away)
- if(this._focus){ return; }
+ var newFocusIndex = this._currentFocus.index + increment;
+ if(newFocusIndex < this._cells.length && newFocusIndex > -1){
+ var focusNode = this._cells[newFocusIndex].node;
+ this._setCurrent(focusNode);
- if(this._showTimer){
- clearTimeout(this._showTimer);
- delete this._showTimer;
- }
- this.close();
- },
+ // 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);
+ }
+ },
- open: function(/*DomNode*/ target){
- // summary:
- // Display the tooltip; usually not called directly.
- // tags:
- // private
+ _getDye: function(/*DomNode*/ cell){
+ // summary:
+ // Get JS object for given cell DOMNode
- if(this._showTimer){
- clearTimeout(this._showTimer);
- delete this._showTimer;
- }
- dijit.showTooltip(this.label || this.domNode.innerHTML, target, this.position, !this.isLeftToRight());
+ return this._cells[cell.index].dye;
+ }
+});
- this._connectNode = target;
- this.onShow(target, this.position);
- },
+/*=====
+declare("dijit.Dye",
+ null,
+ {
+ // summary:
+ // Interface for the JS Object associated with a palette cell (i.e. DOMNode)
- close: function(){
+ constructor: function(alias, row, col){
// 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;
- }
+ // Initialize according to value or alias like "white"
+ // alias: String
},
- onShow: function(target, position){
+ getValue: function(){
// summary:
- // Called when the tooltip is shown
- // tags:
- // callback
+ // Return "value" of cell; meaning of "value" varies by subclass.
+ // description:
+ // For example color hex value, emoticon ascii value etc, entity hex value.
},
- onHide: function(){
+ fillCell: function(cell, blankGif){
// summary:
- // Called when the tooltip is hidden
- // tags:
- // callback
- },
-
- uninitialize: function(){
- this.close();
- this.inherited(arguments);
+ // Add cell DOMNode inner structure
+ // cell: DomNode
+ // The surrounding cell
+ // blankGif: String
+ // URL for blank cell image
}
}
);
+=====*/
-// 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"];
-
-}
-
-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");
-
+});
+},
+'dijit/form/ValidationTextBox':function(){
+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_ = "";
- }
-=====*/
+ /*=====
+ 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,
- {
+ 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: 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"),
+ templateString: template,
baseClass: "dijitTextBox dijitValidationTextBox",
// required: Boolean
@@ -13584,7 +23102,7 @@ dojo.declare(
// Do not specify both regExp and regExpGen
regExp: ".*",
- regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ constraints){
+ 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.
@@ -13605,7 +23123,7 @@ dojo.declare(
// summary:
// Hook so set('value', ...) works.
this.inherited(arguments);
- this.validate(this._focused);
+ this.validate(this.focused);
},
validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){
@@ -13625,7 +23143,7 @@ dojo.declare(
return this.textbox.value.search(this._partialre) == 0;
},
- isValid: function(/*Boolean*/ isFocused){
+ isValid: function(/*Boolean*/ /*===== isFocused =====*/){
// summary:
// Tests if value is valid.
// Can override with your own routine in a subclass.
@@ -13640,7 +23158,7 @@ dojo.declare(
return (this.trim ? /^\s*$/ : /^$/).test(value); // Boolean
},
- getErrorMessage: function(/*Boolean*/ isFocused){
+ getErrorMessage: function(/*Boolean*/ /*===== isFocused =====*/){
// summary:
// Return an error message to show if appropriate
// tags:
@@ -13648,7 +23166,7 @@ dojo.declare(
return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // String
},
- getPromptMessage: function(/*Boolean*/ isFocused){
+ getPromptMessage: function(/*Boolean*/ /*===== isFocused =====*/){
// summary:
// Return a hint message to show when widget is first focused
// tags:
@@ -13670,7 +23188,7 @@ dojo.declare(
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");
+ 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
@@ -13692,15 +23210,16 @@ dojo.declare(
// By default uses a tooltip.
// tags:
// extension
- dijit.hideTooltip(this.domNode);
- if(message && this._focused){
- dijit.showTooltip(message, this.domNode, this.tooltipPosition, !this.isLeftToRight());
+ 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.validate(this.focused);
this.inherited(arguments);
},
@@ -13725,7 +23244,7 @@ dojo.declare(
// 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){
+ function(re){
switch(re.charAt(0)){
case '{':
case '+':
@@ -13757,7 +23276,7 @@ dojo.declare(
postMixInProperties: function(){
this.inherited(arguments);
- this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang);
+ 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; }
@@ -13772,7 +23291,7 @@ dojo.declare(
_setRequiredAttr: function(/*Boolean*/ value){
this._set("required", value);
- dijit.setWaiState(this.focusNode, "required", value);
+ this.focusNode.setAttribute("aria-required", value);
this._refreshState();
},
@@ -13795,1438 +23314,1696 @@ dojo.declare(
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);
+},
+'dijit/_base/typematic':function(){
+define("dijit/_base/typematic", ["../typematic"], function(){
+ // for back-compat, just loads top level module
+});
- // we want the name attribute to go to the hidden <input>, not the displayed <input>,
- // so override _FormWidget.postMixInProperties() setting of nameAttrSetting
- this.nameAttrSetting = "";
- },
+},
+'dijit/_base':function(){
+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
- 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
- },
+ return dijit._base;
+});
- 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
- },
+},
+'dijit/layout/BorderContainer':function(){
+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){
- validate: function(){
- // Overrides `dijit.form.TextBox.validate`
- this.valueNode.value = this.toString();
- return this.inherited(arguments);
- },
+/*=====
+ var _WidgetBase = dijit._WidgetBase;
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _LayoutWidget = dijit.layout._LayoutWidget;
+=====*/
- buildRendering: function(){
- // Overrides `dijit._Templated.buildRendering`
+// module:
+// dijit/layout/BorderContainer
+// summary:
+// Provides layout in up to 5 regions, a mandatory center with optional borders along its 4 sides.
- this.inherited(arguments);
+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
- // 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");
- },
+/*=====
+ // container: [const] dijit.layout.BorderContainer
+ // Pointer to the parent BorderContainer
+ container: null,
- reset: function(){
- // Overrides `dijit.form.ValidationTextBox.reset` to
- // reset the hidden textbox value to ''
- this.valueNode.value = '';
- this.inherited(arguments);
- }
- }
-);
+ // child: [const] dijit.layout._LayoutWidget
+ // Pointer to the pane associated with this splitter
+ child: null,
-/*=====
- 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;
- }
+ // region: [const] String
+ // Region of pane associated with this splitter.
+ // "top", "bottom", "left", "right".
+ region: null,
=====*/
-dojo.declare(
- "dijit.form.RangeBoundTextBox",
- dijit.form.MappedTextBox,
- {
- // summary:
- // Base class for textbox form widgets which defines a range of valid values.
+ // 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,
- // rangeMessage: String
- // The message to display if value is out-of-range
- rangeMessage: "",
+ 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>',
- /*=====
- // constraints: dijit.form.RangeBoundTextBox.__Constraints
- constraints: {},
- ======*/
+ constructor: function(){
+ this._handlers = [];
+ },
- 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
- },
+ postMixInProperties: function(){
+ this.inherited(arguments);
- 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);
- },
+ this.horizontal = /top|bottom/.test(this.region);
+ this._factor = /top|left/.test(this.region) ? 1 : -1;
+ this._cookieName = this.container.id + "_" + this.region;
+ },
- _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;
+ 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;
}
- 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();
- },
+ _computeMaxSize: function(){
+ // summary:
+ // Return the maximum size that my corresponding pane can be set to
- 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
- },
+ 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
- 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);
- },
+ return Math.min(this.child.maxSize, childSize + spaceAvailable);
+ },
- postMixInProperties: function(){
- this.inherited(arguments);
- if(!this.rangeMessage){
- this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang);
- this.rangeMessage = this.messages.rangeMessage;
- }
- },
+ _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");
- _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");
+ // 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;
+ }
- _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){
- // summary:
- // Hook so set('value', ...) works.
+ if(this.container.persist){
+ cookie(this._cookieName, this.child.domNode.style[this.horizontal ? "height" : "width"], {expires:365});
+ }
+ },
- dijit.setWaiState(this.focusNode, "valuenow", value);
- this.inherited(arguments);
+ _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
-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");
+ 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);
+ },
-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
+ startup: function(){
+ if(this._started){ return; }
+ array.forEach(this.getChildren(), this._setupChild, this);
+ this.inherited(arguments);
+ },
- // 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,
+ _setupChild: function(/*dijit._Widget*/ child){
+ // Override _LayoutWidget._setupChild().
- // pageSize: Integer
- // Argument to data provider.
- // Specifies number of search results per page (before hitting "next" button)
- pageSize: Infinity,
+ var region = child.region;
+ if(region){
+ this.inherited(arguments);
- // store: [const] Object
- // Reference to data provider object used by this ComboBox
- store: null,
+ domClass.add(child.domNode, this.baseClass+"Pane");
- // 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:{},
+ var ltr = this.isLeftToRight();
+ if(region == "leading"){ region = ltr ? "left" : "right"; }
+ if(region == "trailing"){ region = ltr ? "right" : "left"; }
- // 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: {},
+ // 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;
- // 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,
+ domConstruct.place(splitter.domNode, child.domNode, "after");
- // 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",
+ // 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.
+ }
+ },
- // searchDelay: Integer
- // Delay in milliseconds between when user types something and we start
- // searching based on that value
- searchDelay: 100,
+ layout: function(){
+ // Implement _LayoutWidget.layout() virtual method.
+ this._layoutChildren();
+ },
- // searchAttr: String
- // Search for items in the data store where this attribute (in the item)
- // matches what the user typed
- searchAttr: "name",
+ addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
+ // Override _LayoutWidget.addChild().
+ this.inherited(arguments);
+ if(this._started){
+ this.layout(); //OPT
+ }
+ },
- // 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: "",
+ removeChild: function(/*dijit._Widget*/ child){
+ // Override _LayoutWidget.removeChild().
- // labelType: String
- // Specifies how to interpret the labelAttr in the data store items.
- // Can be "html" or "text".
- labelType: "text",
+ var region = child.region;
+ var splitter = child._splitterWidget;
+ if(splitter){
+ splitter.destroy();
+ delete child._splitterWidget;
+ }
+ this.inherited(arguments);
- // 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}*",
+ 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");
+ },
- // ignoreCase: Boolean
- // Set true if the ComboBox/FilteringSelect should ignore case when matching possible items
- ignoreCase: true,
+ getChildren: function(){
+ // Override _LayoutWidget.getChildren() to only return real children, not the splitters.
+ return array.filter(this.inherited(arguments), function(widget){
+ return !widget.isSplitter;
+ });
+ },
- // hasDownArrow: Boolean
- // Set this textbox to have a down arrow button, to display the drop down list.
- // Defaults to true.
- hasDownArrow: true,
+ // 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;
+ },
- 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"),
+ resize: function(newSize, currentSize){
+ // Overrides _LayoutWidget.resize().
- baseClass: "dijitTextBox dijitComboBox",
+ // 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);
- // dropDownClass: [protected extension] String
- // Name of the dropdown widget class used to select a date/time.
- // Subclasses should specify this.
- dropDownClass: "dijit.form._ComboBoxMenu",
+ domStyle.set(node, "padding", "0px");
+ }
- // Set classes like dijitDownArrowButtonHover depending on
- // mouse action over button node
- cssStateNodes: {
- "_buttonNode": "dijitDownArrowButton"
- },
+ this.inherited(arguments);
+ },
- // Flags to _HasDropDown to limit height of drop down to make it fit in viewport
- maxHeight: -1,
+ _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
- // For backwards compatibility let onClick events propagate, even clicks on the down arrow button
- _stopClickEvents: false,
+ 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;
+ }
- _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.
+ // 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 pos;
- },
+ return 0;
+ });
- _setCaretPos: function(/*DomNode*/ element, /*Number*/ location){
- location = parseInt(location);
- dijit.selectInputText(element, location, location);
- },
+ // 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);
+ }
+ });
- _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);
- },
+ // 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
+ };
- _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;
- }
- },
+ // Layout the children, possibly changing size due to a splitter drag
+ layoutUtils.layoutChildren(this.domNode, dim, childrenAndSplitters,
+ changedChildId, changedChildSize);
+ },
- _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
+ destroyRecursive: function(){
+ // Destroy splitters first, while getChildren() still works
+ array.forEach(this.getChildren(), function(child){
+ var splitter = child._splitterWidget;
+ if(splitter){
+ splitter.destroy();
}
- this.inherited(arguments);
- },
+ delete child._splitterWidget;
+ });
- _onKey: function(/*Event*/ evt){
- // summary:
- // Handles keyboard events
+ // Then destroy the real children, and myself
+ this.inherited(arguments);
+ }
+});
- var key = evt.charOrCode;
+// 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: '',
- // 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();
+ // 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,
- // _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);
+ // 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,
- 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;
+ // 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,
- 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
+ // 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
+});
- 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;
+// For monkey patching
+BorderContainer._Splitter = _Splitter;
+BorderContainer._Gutter = _Gutter;
- 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;
+return BorderContainer;
+});
- case dk.DELETE:
- case dk.BACKSPACE:
- this._prev_key_backspace = true;
- doSearch = true;
- break;
+},
+'dojo/window':function(){
+define("dojo/window", ["./_base/lang", "./_base/sniff", "./_base/window", "./dom", "./dom-geometry", "./dom-style"],
+ function(lang, has, baseWindow, dom, geom, style) {
- 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);
- }
- },
+// module:
+// dojo/window
+// summary:
+// TODOC
- _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 window = lang.getObject("dojo.window", true);
- var fn = this.focusNode;
+/*=====
+dojo.window = {
+ // summary:
+ // TODO
+};
+window = dojo.window;
+=====*/
- // 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);
- }
- },
+window.getBox = function(){
+ // summary:
+ // Returns the dimensions and scroll position of the viewable area of a browser window
- _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;
- }
+ var
+ scrollRoot = (baseWindow.doc.compatMode == 'BackCompat') ? baseWindow.body() : baseWindow.doc.documentElement,
+ // get scroll position
+ scroll = geom.docScroll(), // scrollRoot.scrollTop/Left should work
+ w, h;
+
+ if(has("touch")){ // if(scrollbars not supported)
+ var uiWindow = baseWindow.doc.parentWindow || baseWindow.doc.defaultView; // use UI window, not dojo.global window. baseWindow.doc.parentWindow probably not needed since it's not defined for webkit
+ // on mobile, scrollRoot.clientHeight <= uiWindow.innerHeight <= scrollRoot.offsetHeight, return uiWindow.innerHeight
+ w = uiWindow.innerWidth || scrollRoot.clientWidth; // || scrollRoot.clientXXX probably never evaluated
+ h = uiWindow.innerHeight || scrollRoot.clientHeight;
+ }else{
+ // on desktops, scrollRoot.clientHeight <= scrollRoot.offsetHeight <= uiWindow.innerHeight, return scrollRoot.clientHeight
+ // uiWindow.innerWidth/Height includes the scrollbar and cannot be used
+ w = scrollRoot.clientWidth;
+ h = scrollRoot.clientHeight;
+ }
+ return {
+ l: scroll.x,
+ t: scroll.y,
+ w: w,
+ h: h
+ };
+};
- // 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.
+window.get = function(doc){
+ // summary:
+ // Get window object associated with document doc
- dataObject._maxOptions = this._maxOptions;
- var nodes = this.dropDown.createOptions(
- results,
- dataObject,
- dojo.hitch(this, "_getMenuLabelFromItem")
- );
+ // In some IE versions (at least 6.0), document.parentWindow does not return a
+ // reference to the real window object (maybe a copy), so we must fix it as well
+ // We use IE specific execScript to attach the real window reference to
+ // document._parentWindow for later use
+ if(has("ie") && window !== document.parentWindow){
+ /*
+ In IE 6, only the variable "window" can be used to connect events (others
+ may be only copies).
+ */
+ doc.parentWindow.execScript("document._parentWindow = window;", "Javascript");
+ //to prevent memory leak, unset it after use
+ //another possibility is to add an onUnload handler which seems overkill to me (liucougar)
+ var win = doc._parentWindow;
+ doc._parentWindow = null;
+ return win; // Window
+ }
- // show our list (only if we have content, else nothing)
- this._showResultList();
+ return doc.parentWindow || doc.defaultView; // Window
+};
- // #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();
+window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
+ // summary:
+ // Scroll the passed node into view, if it is not already.
+
+ // don't rely on node.scrollIntoView working just because the function is there
+
+ try{ // catch unexpected/unrecreatable errors (#7808) since we can recover using a semi-acceptable native method
+ node = dom.byId(node);
+ var doc = node.ownerDocument || baseWindow.doc,
+ body = doc.body || baseWindow.body(),
+ html = doc.documentElement || body.parentNode,
+ isIE = has("ie"), isWK = has("webkit");
+ // if an untested browser, then use the native method
+ if((!(has("mozilla") || isIE || isWK || has("opera")) || node == body || node == html) && (typeof node.scrollIntoView != "undefined")){
+ node.scrollIntoView(false); // short-circuit to native if possible
+ return;
+ }
+ var backCompat = doc.compatMode == 'BackCompat',
+ clientAreaRoot = (isIE >= 9 && node.ownerDocument.parentWindow.frameElement)
+ ? ((html.clientHeight > 0 && html.clientWidth > 0 && (body.clientHeight == 0 || body.clientWidth == 0 || body.clientHeight > html.clientHeight || body.clientWidth > html.clientWidth)) ? html : body)
+ : (backCompat ? body : html),
+ scrollRoot = isWK ? body : clientAreaRoot,
+ rootWidth = clientAreaRoot.clientWidth,
+ rootHeight = clientAreaRoot.clientHeight,
+ rtl = !geom.isBodyLtr(),
+ nodePos = pos || geom.position(node),
+ el = node.parentNode,
+ isFixed = function(el){
+ return ((isIE <= 6 || (isIE && backCompat))? false : (style.get(el, 'position').toLowerCase() == "fixed"));
+ };
+ if(isFixed(node)){ return; } // nothing to do
+
+ while(el){
+ if(el == body){ el = scrollRoot; }
+ var elPos = geom.position(el),
+ fixedPos = isFixed(el);
+
+ if(el == scrollRoot){
+ elPos.w = rootWidth; elPos.h = rootHeight;
+ if(scrollRoot == html && isIE && rtl){ elPos.x += scrollRoot.offsetWidth-elPos.w; } // IE workaround where scrollbar causes negative x
+ if(elPos.x < 0 || !isIE){ elPos.x = 0; } // IE can have values > 0
+ if(elPos.y < 0 || !isIE){ elPos.y = 0; }
+ }else{
+ var pb = geom.getPadBorderExtents(el);
+ elPos.w -= pb.w; elPos.h -= pb.h; elPos.x += pb.l; elPos.y += pb.t;
+ var clientSize = el.clientWidth,
+ scrollBarSize = elPos.w - clientSize;
+ if(clientSize > 0 && scrollBarSize > 0){
+ elPos.w = clientSize;
+ elPos.x += (rtl && (isIE || el.clientLeft > pb.l/*Chrome*/)) ? scrollBarSize : 0;
}
- if(wasSelected){
- this._announceOption(this.dropDown.getHighlightedOption());
+ clientSize = el.clientHeight;
+ scrollBarSize = elPos.h - clientSize;
+ if(clientSize > 0 && scrollBarSize > 0){
+ elPos.h = clientSize;
}
- }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
}
- },
+ if(fixedPos){ // bounded by viewport, not parents
+ if(elPos.y < 0){
+ elPos.h += elPos.y; elPos.y = 0;
+ }
+ if(elPos.x < 0){
+ elPos.w += elPos.x; elPos.x = 0;
+ }
+ if(elPos.y + elPos.h > rootHeight){
+ elPos.h = rootHeight - elPos.y;
+ }
+ if(elPos.x + elPos.w > rootWidth){
+ elPos.w = rootWidth - elPos.x;
+ }
+ }
+ // calculate overflow in all 4 directions
+ var l = nodePos.x - elPos.x, // beyond left: < 0
+ t = nodePos.y - Math.max(elPos.y, 0), // beyond top: < 0
+ r = l + nodePos.w - elPos.w, // beyond right: > 0
+ bot = t + nodePos.h - elPos.h; // beyond bottom: > 0
+ if(r * l > 0){
+ var s = Math[l < 0? "max" : "min"](l, r);
+ if(rtl && ((isIE == 8 && !backCompat) || isIE >= 9)){ s = -s; }
+ nodePos.x += el.scrollLeft;
+ el.scrollLeft += s;
+ nodePos.x -= el.scrollLeft;
+ }
+ if(bot * t > 0){
+ nodePos.y += el.scrollTop;
+ el.scrollTop += Math[t < 0? "max" : "min"](t, bot);
+ nodePos.y -= el.scrollTop;
+ }
+ el = (el != scrollRoot) && !fixedPos && el.parentNode;
+ }
+ }catch(error){
+ console.error('scrollIntoView: ' + error);
+ node.scrollIntoView(false);
+ }
+};
- _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).
+return window;
+});
- this.closeDropDown(true);
+},
+'dojo/number':function(){
+define("dojo/number", ["./_base/kernel", "./_base/lang", "./i18n", "./i18n!./cldr/nls/number", "./string", "./regexp"],
+ function(dojo, lang, i18n, nlsNumber, dstring, dregexp) {
- // hide the tooltip
- this.displayMessage("");
+ // module:
+ // dojo/number
+ // summary:
+ // TODOC
- this.openDropDown();
+lang.getObject("number", true, dojo);
- dijit.setWaiState(this.domNode, "expanded", "true");
- },
+/*=====
+dojo.number = {
+ // summary: localized formatting and parsing routines for Number
+}
- 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();
- },
+dojo.number.__FormatOptions = function(){
+ // pattern: String?
+ // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+ // with this string. Default value is based on locale. Overriding this property will defeat
+ // localization. Literal characters in patterns are not supported.
+ // type: String?
+ // choose a format type based on the locale from the following:
+ // decimal, scientific (not yet supported), percent, currency. decimal by default.
+ // places: Number?
+ // fixed number of decimal places to show. This overrides any
+ // information in the provided pattern.
+ // round: Number?
+ // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
+ // means do not round.
+ // locale: String?
+ // override the locale used to determine formatting rules
+ // fractional: Boolean?
+ // If false, show no decimal places, overriding places and pattern settings.
+ this.pattern = pattern;
+ this.type = type;
+ this.places = places;
+ this.round = round;
+ this.locale = locale;
+ this.fractional = fractional;
+}
+=====*/
- isLoaded: function(){
- // signal to _HasDropDown that it needs to call loadDropDown() to load the
- // drop down asynchronously before displaying it
- return false;
- },
+dojo.number.format = function(/*Number*/value, /*dojo.number.__FormatOptions?*/options){
+ // summary:
+ // Format a Number as a String, using locale-specific settings
+ // description:
+ // Create a string from a Number using a known localized pattern.
+ // Formatting patterns appropriate to the locale are chosen from the
+ // [Common Locale Data Repository](http://unicode.org/cldr) as well as the appropriate symbols and
+ // delimiters.
+ // If value is Infinity, -Infinity, or is not a valid JavaScript number, return null.
+ // value:
+ // the number to be formatted
- 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");
- }
- },
+ options = lang.mixin({}, options || {});
+ var locale = i18n.normalizeLocale(options.locale),
+ bundle = i18n.getLocalization("dojo.cldr", "number", locale);
+ options.customs = bundle;
+ var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"];
+ if(isNaN(value) || Math.abs(value) == Infinity){ return null; } // null
+ return dojo.number._applyPattern(value, pattern, options); // String
+};
- _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();
- }
- },
+//dojo.number._numberPatternRE = /(?:[#0]*,?)*[#0](?:\.0*#*)?/; // not precise, but good enough
+dojo.number._numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/; // not precise, but good enough
- _onBlur: function(){
- // summary:
- // Called magically when focus has shifted away from this widget and it's drop down
- this.closeDropDown();
- this.inherited(arguments);
- },
+dojo.number._applyPattern = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatOptions?*/options){
+ // summary:
+ // Apply pattern to format value as a string using options. Gives no
+ // consideration to local customs.
+ // value:
+ // the number to be formatted.
+ // pattern:
+ // a pattern string as described by
+ // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+ // options: dojo.number.__FormatOptions?
+ // _applyPattern is usually called via `dojo.number.format()` which
+ // populates an extra property in the options parameter, "customs".
+ // The customs object specifies group and decimal parameters if set.
- _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);
- },
+ //TODO: support escapes
+ options = options || {};
+ var group = options.customs.group,
+ decimal = options.customs.decimal,
+ patternList = pattern.split(';'),
+ positivePattern = patternList[0];
+ pattern = patternList[(value < 0) ? 1 : 0] || ("-" + positivePattern);
- _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.
+ //TODO: only test against unescaped
+ if(pattern.indexOf('%') != -1){
+ value *= 100;
+ }else if(pattern.indexOf('\u2030') != -1){
+ value *= 1000; // per mille
+ }else if(pattern.indexOf('\u00a4') != -1){
+ group = options.customs.currencyGroup || group;//mixins instead?
+ decimal = options.customs.currencyDecimal || decimal;// Should these be mixins instead?
+ pattern = pattern.replace(/\u00a4{1,3}/, function(match){
+ var prop = ["symbol", "currency", "displayName"][match.length-1];
+ return options[prop] || options.currency || "";
+ });
+ }else if(pattern.indexOf('E') != -1){
+ throw new Error("exponential notation not supported");
+ }
- 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);
- },
+ //TODO: support @ sig figs?
+ var numberPatternRE = dojo.number._numberPatternRE;
+ var numberPattern = positivePattern.match(numberPatternRE);
+ if(!numberPattern){
+ throw new Error("unable to find a number expression in pattern: "+pattern);
+ }
+ if(options.fractional === false){ options.places = 0; }
+ return pattern.replace(numberPatternRE,
+ dojo.number._formatAbsolute(value, numberPattern[0], {decimal: decimal, group: group, places: options.places, round: options.round}));
+};
- _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
- },
+dojo.number.round = function(/*Number*/value, /*Number?*/places, /*Number?*/increment){
+ // summary:
+ // Rounds to the nearest value with the given number of decimal places, away from zero
+ // description:
+ // Rounds to the nearest value with the given number of decimal places, away from zero if equal.
+ // Similar to Number.toFixed(), but compensates for browser quirks. Rounding can be done by
+ // fractional increments also, such as the nearest quarter.
+ // NOTE: Subject to floating point errors. See dojox.math.round for experimental workaround.
+ // value:
+ // The number to round
+ // places:
+ // The number of decimal places where rounding takes place. Defaults to 0 for whole rounding.
+ // Must be non-negative.
+ // increment:
+ // Rounds next place to nearest value of increment/10. 10 by default.
+ // example:
+ // >>> dojo.number.round(-0.5)
+ // -1
+ // >>> dojo.number.round(162.295, 2)
+ // 162.29 // note floating point error. Should be 162.3
+ // >>> dojo.number.round(10.71, 0, 2.5)
+ // 10.75
+ var factor = 10 / (increment || 10);
+ return (factor * +value).toFixed(places) / factor; // Number
+};
- _startSearchAll: function(){
- this._startSearch('');
- },
+if((0.9).toFixed() == 0){
+ // (isIE) toFixed() bug workaround: Rounding fails on IE when most significant digit
+ // is just after the rounding place and is >=5
+ var round = dojo.number.round;
+ dojo.number.round = function(v, p, m){
+ var d = Math.pow(10, -p || 0), a = Math.abs(v);
+ if(!v || a >= d || a * Math.pow(10, p + 1) < 5){
+ d = 0;
+ }
+ return round(v, p, m) + (v > 0 ? d : -d);
+ };
+}
- _startSearchFromInput: function(){
- this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g, "\\$1"));
- },
+/*=====
+dojo.number.__FormatAbsoluteOptions = function(){
+ // decimal: String?
+ // the decimal separator
+ // group: String?
+ // the group separator
+ // places: Number?|String?
+ // number of decimal places. the range "n,m" will format to m places.
+ // round: Number?
+ // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
+ // means don't round.
+ this.decimal = decimal;
+ this.group = group;
+ this.places = places;
+ this.round = round;
+}
+=====*/
- _getQueryString: function(/*String*/ text){
- return dojo.string.substitute(this.queryExpr, [text]);
- },
+dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatAbsoluteOptions?*/options){
+ // summary:
+ // Apply numeric pattern to absolute value using options. Gives no
+ // consideration to local customs.
+ // value:
+ // the number to be formatted, ignores sign
+ // pattern:
+ // the number portion of a pattern (e.g. `#,##0.00`)
+ options = options || {};
+ if(options.places === true){options.places=0;}
+ if(options.places === Infinity){options.places=6;} // avoid a loop; pick a limit
- _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);
- },
+ var patternParts = pattern.split("."),
+ comma = typeof options.places == "string" && options.places.indexOf(","),
+ maxPlaces = options.places;
+ if(comma){
+ maxPlaces = options.places.substring(comma + 1);
+ }else if(!(maxPlaces >= 0)){
+ maxPlaces = (patternParts[1] || []).length;
+ }
+ if(!(options.round < 0)){
+ value = dojo.number.round(value, maxPlaces, options.round);
+ }
- _setMaxOptions: function(size, request){
- this._maxOptions = size;
- },
+ var valueParts = String(Math.abs(value)).split("."),
+ fractional = valueParts[1] || "";
+ if(patternParts[1] || options.places){
+ if(comma){
+ options.places = options.places.substring(0, comma);
+ }
+ // Pad fractional with trailing zeros
+ var pad = options.places !== undefined ? options.places : (patternParts[1] && patternParts[1].lastIndexOf("0") + 1);
+ if(pad > fractional.length){
+ valueParts[1] = dstring.pad(fractional, pad, '0', true);
+ }
- _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;
- },
+ // Truncate fractional
+ if(maxPlaces < fractional.length){
+ valueParts[1] = fractional.substr(0, maxPlaces);
+ }
+ }else{
+ if(valueParts[1]){ valueParts.pop(); }
+ }
- //////////// INITIALIZATION METHODS ///////////////////////////////////////
+ // Pad whole with leading zeros
+ var patternDigits = patternParts[0].replace(',', '');
+ pad = patternDigits.indexOf("0");
+ if(pad != -1){
+ pad = patternDigits.length - pad;
+ if(pad > valueParts[0].length){
+ valueParts[0] = dstring.pad(valueParts[0], pad);
+ }
- constructor: function(){
- this.query={};
- this.fetchProperties={};
- },
+ // Truncate whole
+ if(patternDigits.indexOf("#") == -1){
+ valueParts[0] = valueParts[0].substr(valueParts[0].length - pad);
+ }
+ }
- postMixInProperties: function(){
- if(!this.store){
- var srcNodeRef = this.srcNodeRef;
+ // Add group separators
+ var index = patternParts[0].lastIndexOf(','),
+ groupSize, groupSize2;
+ if(index != -1){
+ groupSize = patternParts[0].length - index - 1;
+ var remainder = patternParts[0].substr(0, index);
+ index = remainder.lastIndexOf(',');
+ if(index != -1){
+ groupSize2 = remainder.length - index - 1;
+ }
+ }
+ var pieces = [];
+ for(var whole = valueParts[0]; whole;){
+ var off = whole.length - groupSize;
+ pieces.push((off > 0) ? whole.substr(off) : whole);
+ whole = (off > 0) ? whole.slice(0, off) : "";
+ if(groupSize2){
+ groupSize = groupSize2;
+ delete groupSize2;
+ }
+ }
+ valueParts[0] = pieces.reverse().join(options.group || ",");
- // if user didn't specify store, then assume there are option tags
- this.store = new dijit.form._ComboBoxDataStore(srcNodeRef);
+ return valueParts.join(options.decimal || ".");
+};
- // 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
+/*=====
+dojo.number.__RegexpOptions = function(){
+ // pattern: String?
+ // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+ // with this string. Default value is based on locale. Overriding this property will defeat
+ // localization.
+ // type: String?
+ // choose a format type based on the locale from the following:
+ // decimal, scientific (not yet supported), percent, currency. decimal by default.
+ // locale: String?
+ // override the locale used to determine formatting rules
+ // strict: Boolean?
+ // strict parsing, false by default. Strict parsing requires input as produced by the format() method.
+ // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators
+ // places: Number|String?
+ // number of decimal places to accept: Infinity, a positive number, or
+ // a range "n,m". Defined by pattern or Infinity if pattern not provided.
+ this.pattern = pattern;
+ this.type = type;
+ this.locale = locale;
+ this.strict = strict;
+ this.places = places;
+}
+=====*/
+dojo.number.regexp = function(/*dojo.number.__RegexpOptions?*/options){
+ // summary:
+ // Builds the regular needed to parse a number
+ // description:
+ // Returns regular expression with positive and negative match, group
+ // and decimal separators
+ return dojo.number._parseInfo(options).regexp; // String
+};
- // 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);
- }
+dojo.number._parseInfo = function(/*Object?*/options){
+ options = options || {};
+ var locale = i18n.normalizeLocale(options.locale),
+ bundle = i18n.getLocalization("dojo.cldr", "number", locale),
+ pattern = options.pattern || bundle[(options.type || "decimal") + "Format"],
+//TODO: memoize?
+ group = bundle.group,
+ decimal = bundle.decimal,
+ factor = 1;
+
+ if(pattern.indexOf('%') != -1){
+ factor /= 100;
+ }else if(pattern.indexOf('\u2030') != -1){
+ factor /= 1000; // per mille
+ }else{
+ var isCurrency = pattern.indexOf('\u00a4') != -1;
+ if(isCurrency){
+ group = bundle.currencyGroup || group;
+ decimal = bundle.currencyDecimal || decimal;
+ }
+ }
+
+ //TODO: handle quoted escapes
+ var patternList = pattern.split(';');
+ if(patternList.length == 1){
+ patternList.push("-" + patternList[0]);
+ }
+
+ var re = dregexp.buildGroupRE(patternList, function(pattern){
+ pattern = "(?:"+dregexp.escapeString(pattern, '.')+")";
+ return pattern.replace(dojo.number._numberPatternRE, function(format){
+ var flags = {
+ signed: false,
+ separator: options.strict ? group : [group,""],
+ fractional: options.fractional,
+ decimal: decimal,
+ exponent: false
+ },
+
+ parts = format.split('.'),
+ places = options.places;
+
+ // special condition for percent (factor != 1)
+ // allow decimal places even if not specified in pattern
+ if(parts.length == 1 && factor != 1){
+ parts[1] = "###";
+ }
+ if(parts.length == 1 || places === 0){
+ flags.fractional = false;
+ }else{
+ if(places === undefined){ places = options.pattern ? parts[1].lastIndexOf('0') + 1 : Infinity; }
+ if(places && options.fractional == undefined){flags.fractional = true;} // required fractional, unless otherwise specified
+ if(!options.places && (places < parts[1].length)){ places += "," + parts[1].length; }
+ flags.places = places;
+ }
+ var groups = parts[0].split(',');
+ if(groups.length > 1){
+ flags.groupSize = groups.pop().length;
+ if(groups.length > 1){
+ flags.groupSize2 = groups.pop().length;
}
}
+ return "("+dojo.number._realNumberRegexp(flags)+")";
+ });
+ }, true);
- this.inherited(arguments);
- },
+ if(isCurrency){
+ // substitute the currency symbol for the placeholder in the pattern
+ re = re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g, function(match, before, target, after){
+ var prop = ["symbol", "currency", "displayName"][target.length-1],
+ symbol = dregexp.escapeString(options[prop] || options.currency || "");
+ before = before ? "[\\s\\xa0]" : "";
+ after = after ? "[\\s\\xa0]" : "";
+ if(!options.strict){
+ if(before){before += "*";}
+ if(after){after += "*";}
+ return "(?:"+before+symbol+after+")?";
+ }
+ return before+symbol+after;
+ });
+ }
- postCreate: function(){
- // summary:
- // Subclasses must call this method from their postCreate() methods
- // tags:
- // protected
+//TODO: substitute localized sign/percent/permille/etc.?
- // 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);
+ // normalize whitespace and return
+ return {regexp: re.replace(/[\xa0 ]/g, "[\\s\\xa0]"), group: group, decimal: decimal, factor: factor}; // Object
+};
- }
- this.inherited(arguments);
- },
+/*=====
+dojo.number.__ParseOptions = function(){
+ // pattern: String?
+ // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+ // with this string. Default value is based on locale. Overriding this property will defeat
+ // localization. Literal characters in patterns are not supported.
+ // type: String?
+ // choose a format type based on the locale from the following:
+ // decimal, scientific (not yet supported), percent, currency. decimal by default.
+ // locale: String?
+ // override the locale used to determine formatting rules
+ // strict: Boolean?
+ // strict parsing, false by default. Strict parsing requires input as produced by the format() method.
+ // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators
+ // fractional: Boolean?|Array?
+ // Whether to include the fractional portion, where the number of decimal places are implied by pattern
+ // or explicit 'places' parameter. The value [true,false] makes the fractional portion optional.
+ this.pattern = pattern;
+ this.type = type;
+ this.locale = locale;
+ this.strict = strict;
+ this.fractional = fractional;
+}
+=====*/
+dojo.number.parse = function(/*String*/expression, /*dojo.number.__ParseOptions?*/options){
+ // summary:
+ // Convert a properly formatted string to a primitive Number, using
+ // locale-specific settings.
+ // description:
+ // Create a Number from a string using a known localized pattern.
+ // Formatting patterns are chosen appropriate to the locale
+ // and follow the syntax described by
+ // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+ // Note that literal characters in patterns are not supported.
+ // expression:
+ // A string representation of a Number
+ var info = dojo.number._parseInfo(options),
+ results = (new RegExp("^"+info.regexp+"$")).exec(expression);
+ if(!results){
+ return NaN; //NaN
+ }
+ var absoluteMatch = results[1]; // match for the positive expression
+ if(!results[1]){
+ if(!results[2]){
+ return NaN; //NaN
+ }
+ // matched the negative pattern
+ absoluteMatch =results[2];
+ info.factor *= -1;
+ }
- _setHasDownArrowAttr: function(val){
- this.hasDownArrow = val;
- this._buttonNode.style.display = val ? "" : "none";
- },
+ // Transform it to something Javascript can parse as a number. Normalize
+ // decimal point and strip out group separators or alternate forms of whitespace
+ absoluteMatch = absoluteMatch.
+ replace(new RegExp("["+info.group + "\\s\\xa0"+"]", "g"), "").
+ replace(info.decimal, ".");
+ // Adjust for negative sign, percent, etc. as necessary
+ return absoluteMatch * info.factor; //Number
+};
- _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};
- },
+/*=====
+dojo.number.__RealNumberRegexpFlags = function(){
+ // places: Number?
+ // The integer number of decimal places or a range given as "n,m". If
+ // not given, the decimal part is optional and the number of places is
+ // unlimited.
+ // decimal: String?
+ // A string for the character used as the decimal point. Default
+ // is ".".
+ // fractional: Boolean?|Array?
+ // Whether decimal places are used. Can be true, false, or [true,
+ // false]. Default is [true, false] which means optional.
+ // exponent: Boolean?|Array?
+ // Express in exponential notation. Can be true, false, or [true,
+ // false]. Default is [true, false], (i.e. will match if the
+ // exponential part is present are not).
+ // eSigned: Boolean?|Array?
+ // The leading plus-or-minus sign on the exponent. Can be true,
+ // false, or [true, false]. Default is [true, false], (i.e. will
+ // match if it is signed or unsigned). flags in regexp.integer can be
+ // applied.
+ this.places = places;
+ this.decimal = decimal;
+ this.fractional = fractional;
+ this.exponent = exponent;
+ this.eSigned = eSigned;
+}
+=====*/
- 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
+dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*/flags){
+ // summary:
+ // Builds a regular expression to match a real number in exponential
+ // notation
- 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)
- },
+ // assign default values to missing parameters
+ flags = flags || {};
+ //TODO: use mixin instead?
+ if(!("places" in flags)){ flags.places = Infinity; }
+ if(typeof flags.decimal != "string"){ flags.decimal = "."; }
+ if(!("fractional" in flags) || /^0/.test(flags.places)){ flags.fractional = [true, false]; }
+ if(!("exponent" in flags)){ flags.exponent = [true, false]; }
+ if(!("eSigned" in flags)){ flags.eSigned = [true, false]; }
- _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
+ var integerRE = dojo.number._integerRegexp(flags),
+ decimalRE = dregexp.buildGroupRE(flags.fractional,
+ function(q){
+ var re = "";
+ if(q && (flags.places!==0)){
+ re = "\\" + flags.decimal;
+ if(flags.places == Infinity){
+ re = "(?:" + re + "\\d+)?";
+ }else{
+ re += "\\d{" + flags.places + "}";
+ }
+ }
+ return re;
},
+ true
+ );
- reset: function(){
- // Overrides the _FormWidget.reset().
- // Additionally reset the .item (to clean up).
- this.item = null;
- this.inherited(arguments);
- },
+ var exponentRE = dregexp.buildGroupRE(flags.exponent,
+ function(q){
+ if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; }
+ return "";
+ }
+ );
- 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
+ var realRE = integerRE + decimalRE;
+ // allow for decimals without integers, e.g. .25
+ if(decimalRE){realRE = "(?:(?:"+ realRE + ")|(?:" + decimalRE + "))";}
+ return realRE + exponentRE; // String
+};
- // 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.number.__IntegerRegexpFlags = function(){
+ // signed: Boolean?
+ // The leading plus-or-minus sign. Can be true, false, or `[true,false]`.
+ // Default is `[true, false]`, (i.e. will match if it is signed
+ // or unsigned).
+ // separator: String?
+ // The character used as the thousands separator. Default is no
+ // separator. For more than one symbol use an array, e.g. `[",", ""]`,
+ // makes ',' optional.
+ // groupSize: Number?
+ // group size between separators
+ // groupSize2: Number?
+ // second grouping, where separators 2..n have a different interval than the first separator (for India)
+ this.signed = signed;
+ this.separator = separator;
+ this.groupSize = groupSize;
+ this.groupSize2 = groupSize2;
+}
+=====*/
+
+dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags){
+ // summary:
+ // Builds a regular expression that matches an integer
+
+ // assign default values to missing parameters
+ flags = flags || {};
+ if(!("signed" in flags)){ flags.signed = [true, false]; }
+ if(!("separator" in flags)){
+ flags.separator = "";
+ }else if(!("groupSize" in flags)){
+ flags.groupSize = 3;
}
-);
-dojo.declare(
- "dijit.form._ComboBoxMenu",
- [dijit._Widget, dijit._Templated, dijit._CssStateMixin],
- {
- // summary:
- // Focus-less menu for internal use in `dijit.form.ComboBox`
- // tags:
- // private
+ var signRE = dregexp.buildGroupRE(flags.signed,
+ function(q){ return q ? "[-+]" : ""; },
+ true
+ );
- 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>",
+ var numberRE = dregexp.buildGroupRE(flags.separator,
+ function(sep){
+ if(!sep){
+ return "(?:\\d+)";
+ }
- // _messages: Object
- // Holds "next" and "previous" text for paging buttons on drop down
- _messages: null,
-
- baseClass: "dijitComboBoxMenu",
+ sep = dregexp.escapeString(sep);
+ if(sep == " "){ sep = "\\s"; }
+ else if(sep == "\xa0"){ sep = "\\s\\xa0"; }
- postMixInProperties: function(){
- this.inherited(arguments);
- this._messages = dojo.i18n.getLocalization("dijit.form", "ComboBox", this.lang);
+ var grp = flags.groupSize, grp2 = flags.groupSize2;
+ //TODO: should we continue to enforce that numbers with separators begin with 1-9? See #6933
+ if(grp2){
+ var grp2RE = "(?:0|[1-9]\\d{0," + (grp2-1) + "}(?:[" + sep + "]\\d{" + grp2 + "})*[" + sep + "]\\d{" + grp + "})";
+ return ((grp-grp2) > 0) ? "(?:" + grp2RE + "|(?:0|[1-9]\\d{0," + (grp-1) + "}))" : grp2RE;
+ }
+ return "(?:0|[1-9]\\d{0," + (grp-1) + "}(?:[" + sep + "]\\d{" + grp + "})*)";
},
+ true
+ );
- buildRendering: function(){
- this.inherited(arguments);
+ return signRE + numberRE; // String
+};
- // fill in template with i18n messages
- this.previousButton.innerHTML = this._messages["previousMessage"];
- this.nextButton.innerHTML = this._messages["nextMessage"];
- },
+return dojo.number;
+});
- _setValueAttr: function(/*Object*/ value){
- this.value = value;
- this.onChange(value);
- },
+},
+'dijit/_FocusMixin':function(){
+define("dijit/_FocusMixin", [
+ "./focus",
+ "./_WidgetBase",
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang" // lang.extend
+], function(focus, _WidgetBase, declare, lang){
- // stubs
- onChange: function(/*Object*/ value){
+/*=====
+ 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:
- // Notifies ComboBox/FilteringSelect that user clicked an option in the drop down menu.
- // Probably should be called onSelect.
+ // Called when the widget becomes "active" because
+ // it or a widget inside of it either has focus, or has recently
+ // been clicked.
// tags:
// callback
},
- onPage: function(/*Number*/ direction){
+
+ onBlur: function(){
// summary:
- // Notifies ComboBox/FilteringSelect that user clicked to advance to next/previous page.
+ // 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
},
- onClose: function(){
+ _onFocus: function(){
// summary:
- // Callback from dijit.popup code to this widget, notifying it that it closed
+ // This is where widgets do processing for when they are active,
+ // such as changing CSS classes. See onFocus() for more details.
// tags:
- // private
- this._blurOptionNode();
+ // protected
+ this.onFocus();
},
- _createOption: function(/*Object*/ item, labelFunc){
+ _onBlur: function(){
// 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;
- },
+ // 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();
+ }
+ });
- 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();
- },
+ 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
- _onMouseDown: function(/*Event*/ evt){
- dojo.stopEvent(evt);
- },
+ // flag that I want _onFocus()/_onBlur() notifications from focus manager
+ _focusManager: focus
+ });
- _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);
- },
+},
+'dojo/data/util/filter':function(){
+define("dojo/data/util/filter", ["dojo/_base/lang"], function(lang) {
+ // module:
+ // dojo/data/util/filter
+ // summary:
+ // TODOC
- _onMouseOut: function(/*Event*/ evt){
- if(evt.target === this.domNode){ return; }
- this._blurOptionNode();
- },
+var filter = lang.getObject("dojo.data.util.filter", true);
- _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");
- }
- },
+filter.patternToRegExp = function(/*String*/pattern, /*boolean?*/ ignoreCase){
+ // summary:
+ // Helper function to convert a simple pattern to a regular expression for matching.
+ // description:
+ // Returns a regular expression object that conforms to the defined conversion rules.
+ // For example:
+ // ca* -> /^ca.*$/
+ // *ca* -> /^.*ca.*$/
+ // *c\*a* -> /^.*c\*a.*$/
+ // *c\*a?* -> /^.*c\*a..*$/
+ // and so on.
+ //
+ // pattern: string
+ // A simple matching pattern to convert that follows basic rules:
+ // * Means match anything, so ca* means match anything starting with ca
+ // ? Means match single character. So, b?b will match to bob and bab, and so on.
+ // \ is an escape character. So for example, \* means do not treat * as a match, but literal character *.
+ // To use a \ as a character in the string, it must be escaped. So in the pattern it should be
+ // represented by \\ to be treated as an ordinary \ character instead of an escape.
+ //
+ // ignoreCase:
+ // An optional flag to indicate if the pattern matching should be treated as case-sensitive or not when comparing
+ // By default, it is assumed case sensitive.
- _blurOptionNode: function(){
- // summary:
- // Removes highlight on highlighted option.
- if(this._highlighted_option){
- dojo.removeClass(this._highlighted_option, "dijitMenuItemSelected");
- this._highlighted_option = null;
- }
- },
+ var rxp = "^";
+ var c = null;
+ for(var i = 0; i < pattern.length; i++){
+ c = pattern.charAt(i);
+ switch(c){
+ case '\\':
+ rxp += c;
+ i++;
+ rxp += pattern.charAt(i);
+ break;
+ case '*':
+ rxp += ".*"; break;
+ case '?':
+ rxp += "."; break;
+ case '$':
+ case '^':
+ case '/':
+ case '+':
+ case '.':
+ case '|':
+ case '(':
+ case ')':
+ case '{':
+ case '}':
+ case '[':
+ case ']':
+ rxp += "\\"; //fallthrough
+ default:
+ rxp += c;
+ }
+ }
+ rxp += "$";
+ if(ignoreCase){
+ return new RegExp(rxp,"mi"); //RegExp
+ }else{
+ return new RegExp(rxp,"m"); //RegExp
+ }
- _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);
- },
+return filter;
+});
- 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);
- },
+},
+'dijit/_WidgetsInTemplateMixin':function(){
+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
- 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);
- },
+ return declare("dijit._WidgetsInTemplateMixin", null, {
+ // summary:
+ // Mixin to supplement _TemplatedMixin when template contains widgets
- _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);
- },
+ // _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,
- _page: function(/*Boolean*/ up){
- // summary:
- // Handles page-up and page-down keypresses
+ // 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,
- 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;
- }
- },
+ _beforeFillContent: function(){
+ if(this.widgetsInTemplate){
+ // Before copying over content, instantiate widgets in template
+ var node = this.domNode;
- pageUp: function(){
- // summary:
- // Handles pageup keypress.
- // TODO: just call _page directly from handleKey().
- // tags:
- // private
- this._page(true);
- },
+ 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
+ }));
- pageDown: function(){
- // summary:
- // Handles pagedown keypress.
- // TODO: just call _page directly from handleKey().
- // tags:
- // private
- this._page(false);
- },
+ this._supportingWidgets = registry.findWidgets(node);
- getHighlightedOption: function(){
- // summary:
- // Returns the highlighted option.
- var ho = this._highlighted_option;
- return (ho && ho.parentNode) ? ho : null;
+ this._attachTemplateNodes(cw, function(n,p){
+ return n[p];
+ });
+ }
},
- 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;
- }
+ startup: function(){
+ array.forEach(this._startupWidgets, function(w){
+ if(w && !w._started && w.startup){
+ w.startup();
+ }
+ });
+ this.inherited(arguments);
}
- }
-);
-
-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/fx/Toggler':function(){
+define("dojo/fx/Toggler", ["../_base/lang","../_base/declare","../_base/fx", "../_base/connect"],
+ function(lang, declare, baseFx, connectUtil) {
+ // module:
+ // dojo/fx/Toggler
+ // summary:
+ // TODOC
-dojo.declare("dijit.form._ComboBoxDataStore", null, {
+return declare("dojo.fx.Toggler", null, {
// summary:
- // Inefficient but small data store specialized for inlined `dijit.form.ComboBox` data
+ // A simple `dojo.Animation` toggler API.
//
// 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.
+ // class constructor for an animation toggler. It accepts a packed
+ // set of arguments about what type of animation to use in each
+ // direction, duration, etc. All available members are mixed into
+ // these animations from the constructor (for example, `node`,
+ // `showDuration`, `hideDuration`).
//
- // 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);
- });
+ // example:
+ // | var t = new dojo.fx.Toggler({
+ // | node: "nodeId",
+ // | showDuration: 500,
+ // | // hideDuration will default to "200"
+ // | showFunc: dojo.fx.wipeIn,
+ // | // hideFunc will default to "fadeOut"
+ // | });
+ // | t.show(100); // delay showing for 100ms
+ // | // ...time passes...
+ // | t.hide();
- },
+ // node: DomNode
+ // the node to target for the showing and hiding animations
+ node: null,
- getValue: function( /*item*/ item,
- /*attribute-name-string*/ attribute,
- /*value?*/ defaultValue){
- return (attribute == "value") ? item.value : (item.innerText || item.textContent || '');
- },
+ // showFunc: Function
+ // The function that returns the `dojo.Animation` to show the node
+ showFunc: baseFx.fadeIn,
- isItemLoaded: function(/*anything*/ something){
- return true;
- },
+ // hideFunc: Function
+ // The function that returns the `dojo.Animation` to hide the node
+ hideFunc: baseFx.fadeOut,
- getFeatures: function(){
- return {"dojo.data.api.Read": true, "dojo.data.api.Identity": true};
- },
+ // showDuration:
+ // Time in milliseconds to run the show Animation
+ showDuration: 200,
- _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);
- },
+ // hideDuration:
+ // Time in milliseconds to run the hide Animation
+ hideDuration: 200,
- close: function(/*dojo.data.api.Request || args || null*/ request){
- return;
- },
+ // FIXME: need a policy for where the toggler should "be" the next
+ // time show/hide are called if we're stopped somewhere in the
+ // middle.
+ // FIXME: also would be nice to specify individual showArgs/hideArgs mixed into
+ // each animation individually.
+ // FIXME: also would be nice to have events from the animations exposed/bridged
- getLabel: function(/*item*/ item){
- return item.innerHTML;
- },
+ /*=====
+ _showArgs: null,
+ _showAnim: null,
+
+ _hideArgs: null,
+ _hideAnim: null,
- getIdentity: function(/*item*/ item){
- return dojo.attr(item, "value");
+ _isShowing: false,
+ _isHiding: false,
+ =====*/
+
+ constructor: function(args){
+ var _t = this;
+
+ lang.mixin(_t, args);
+ _t.node = args.node;
+ _t._showArgs = lang.mixin({}, args);
+ _t._showArgs.node = _t.node;
+ _t._showArgs.duration = _t.showDuration;
+ _t.showAnim = _t.showFunc(_t._showArgs);
+
+ _t._hideArgs = lang.mixin({}, args);
+ _t._hideArgs.node = _t.node;
+ _t._hideArgs.duration = _t.hideDuration;
+ _t.hideAnim = _t.hideFunc(_t._hideArgs);
+
+ connectUtil.connect(_t.showAnim, "beforeBegin", lang.hitch(_t.hideAnim, "stop", true));
+ connectUtil.connect(_t.hideAnim, "beforeBegin", lang.hitch(_t.showAnim, "stop", true));
},
- 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);
+ show: function(delay){
+ // summary: Toggle the node to showing
+ // delay: Integer?
+ // Ammount of time to stall playing the show animation
+ return this.showAnim.play(delay || 0);
},
- 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
+ hide: function(delay){
+ // summary: Toggle the node to hidden
+ // delay: Integer?
+ // Ammount of time to stall playing the hide animation
+ return this.hideAnim.play(delay || 0);
}
});
-//Mix in the simple fetch implementation to this class.
-dojo.extend(dijit.form._ComboBoxDataStore,dojo.data.util.simpleFetch);
-}
+});
-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");
+},
+'dijit/form/FilteringSelect':function(){
+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
-dojo.declare(
- "dijit.form.FilteringSelect",
- [dijit.form.MappedTextBox, dijit.form.ComboBoxMixin],
- {
+ return declare("dijit.form.FilteringSelect", [MappedTextBox, ComboBoxMixin], {
// summary:
// An enhanced version of the HTML SELECT tag, populated dynamically
//
@@ -15265,7 +25042,7 @@ dojo.declare(
isValid: function(){
// Overrides ValidationTextBox.isValid()
- return this.item || (!this.required && this.get('displayedValue') == ""); // #5974
+ return !!this.item || (!this.required && this.get('displayedValue') == ""); // #5974
},
_refreshState: function(){
@@ -15276,39 +25053,37 @@ dojo.declare(
_callbackSetLabel: function(
/*Array*/ result,
- /*Object*/ dataObject,
+ /*Object*/ query,
+ /*Object*/ options,
/*Boolean?*/ priorityChange){
// summary:
- // Callback from dojo.data after lookup of user entered value finishes
+ // 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((dataObject && dataObject.query[this.searchAttr] != this._lastQuery) || (!dataObject && result.length && this.store.getIdentity(result[0]) != this._lastQuery)){
+ 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.valueNode.value = "";
- dijit.form.TextBox.superclass._setValueAttr.call(this, "", priorityChange || (priorityChange === undefined && !this._focused));
- this._set("item", null);
- this.validate(this._focused);
+ this.set("value", '', priorityChange || (priorityChange === undefined && !this.focused), this.textbox.value, null);
}else{
this.set('item', result[0], priorityChange);
}
},
- _openResultList: function(/*Object*/ results, /*Object*/ dataObject){
+ _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(dataObject.query[this.searchAttr] != this._lastQuery){
+ if(query[this.searchAttr] !== this._lastQuery){
return;
}
- dijit.form.ComboBoxMixin.prototype._openResultList.apply(this, arguments);
+ this.inherited(arguments);
if(this.item === undefined){ // item == undefined for keyboard search
// If the search returned no items that means that the user typed
@@ -15332,28 +25107,32 @@ dojo.declare(
return "value";
},
- _setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange){
+ _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; }
- 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);
+ 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){
@@ -15366,7 +25145,6 @@ dojo.declare(
// tags:
// private
this.inherited(arguments);
- this.valueNode.value = this.value;
this._lastDisplayedValue = this.textbox.value;
},
@@ -15398,9 +25176,22 @@ dojo.declare(
// 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);
+ 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
@@ -15409,233 +25200,918 @@ dojo.declare(
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);
- }
+ var options = {
+ ignoreCase: this.ignoreCase,
+ deep: true
};
- dojo.mixin(fetch, this.fetchProperties);
- this._fetchHandle = this.store.fetch(fetch);
+ 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);
}
+ });
+});
+
+},
+'dojo/data/util/sorter':function(){
+define("dojo/data/util/sorter", ["dojo/_base/lang"], function(lang) {
+ // module:
+ // dojo/data/util/sorter
+ // summary:
+ // TODOC
+
+var sorter = lang.getObject("dojo.data.util.sorter", true);
+
+sorter.basicComparator = function( /*anything*/ a,
+ /*anything*/ b){
+ // summary:
+ // Basic comparision function that compares if an item is greater or less than another item
+ // description:
+ // returns 1 if a > b, -1 if a < b, 0 if equal.
+ // 'null' values (null, undefined) are treated as larger values so that they're pushed to the end of the list.
+ // And compared to each other, null is equivalent to undefined.
+
+ //null is a problematic compare, so if null, we set to undefined.
+ //Makes the check logic simple, compact, and consistent
+ //And (null == undefined) === true, so the check later against null
+ //works for undefined and is less bytes.
+ var r = -1;
+ if(a === null){
+ a = undefined;
}
-);
+ if(b === null){
+ b = undefined;
+ }
+ if(a == b){
+ r = 0;
+ }else if(a > b || a == null){
+ r = 1;
+ }
+ return r; //int {-1,0,1}
+};
-}
+sorter.createSortFunction = function( /* attributes array */sortSpec, /*dojo.data.core.Read*/ store){
+ // summary:
+ // Helper function to generate the sorting function based off the list of sort attributes.
+ // description:
+ // The sort function creation will look for a property on the store called 'comparatorMap'. If it exists
+ // it will look in the mapping for comparisons function for the attributes. If one is found, it will
+ // use it instead of the basic comparator, which is typically used for strings, ints, booleans, and dates.
+ // Returns the sorting function for this particular list of attributes and sorting directions.
+ //
+ // sortSpec: array
+ // A JS object that array that defines out what attribute names to sort on and whether it should be descenting or asending.
+ // The objects should be formatted as follows:
+ // {
+ // attribute: "attributeName-string" || attribute,
+ // descending: true|false; // Default is false.
+ // }
+ // store: object
+ // The datastore object to look up item values from.
+ //
+ var sortFunctions=[];
-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");
+ function createSortFunction(attr, dir, comp, s){
+ //Passing in comp and s (comparator and store), makes this
+ //function much faster.
+ return function(itemA, itemB){
+ var a = s.getValue(itemA, attr);
+ var b = s.getValue(itemB, attr);
+ return dir * comp(a,b); //int
+ };
+ }
+ var sortAttribute;
+ var map = store.comparatorMap;
+ var bc = sorter.basicComparator;
+ for(var i = 0; i < sortSpec.length; i++){
+ sortAttribute = sortSpec[i];
+ var attr = sortAttribute.attribute;
+ if(attr){
+ var dir = (sortAttribute.descending) ? -1 : 1;
+ var comp = bc;
+ if(map){
+ if(typeof attr !== "string" && ("toString" in attr)){
+ attr = attr.toString();
+ }
+ comp = map[attr] || bc;
+ }
+ sortFunctions.push(createSortFunction(attr,
+ dir, comp, store));
+ }
+ }
+ return function(rowA, rowB){
+ var i=0;
+ while(i < sortFunctions.length){
+ var ret = sortFunctions[i++](rowA, rowB);
+ if(ret !== 0){
+ return ret;//int
+ }
+ }
+ return 0; //int
+ }; // Function
+};
+return sorter;
+});
+},
+'dijit/form/_ButtonMixin':function(){
+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",
-dojo.declare(
- "dijit.form.Form",
- [dijit._Widget, dijit._Templated, dijit.form._FormMixin, dijit.layout._ContentPaneResizeMixin],
- {
+ _onClick: function(/*Event*/ e){
// 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');
+ // 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;
+ },
- // HTML <FORM> attributes
+ postCreate: function(){
+ this.inherited(arguments);
+ dom.setSelectable(this.focusNode, false);
+ },
- // name: String?
- // Name of form for scripting.
- name: "",
+ 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
+ },
- // action: String?
- // Server-side form handler.
- action: "",
+ _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;
+ }
+});
- // 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: "",
+},
+'dojo/colors':function(){
+define("dojo/colors", ["./_base/kernel", "./_base/lang", "./_base/Color", "./_base/array"], function(dojo, lang, Color, ArrayUtil) {
+ // module:
+ // dojo/colors
+ // summary:
+ // TODOC
- // accept-charset: String?
- // List of supported charsets.
- "accept-charset": "",
+ var ColorExt = lang.getObject("dojo.colors", true);
- // accept: String?
- // List of MIME types for file upload.
- accept: "",
+//TODO: this module appears to break naming conventions
- // target: String?
- // Target frame for the document to be opened in.
- target: "",
+/*=====
+ lang.mixin(dojo, {
+ colors: {
+ // summary: Color utilities, extending Base dojo.Color
+ }
+ });
+=====*/
- templateString: "<form dojoAttachPoint='containerNode' dojoAttachEvent='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>",
+ // this is a standard conversion prescribed by the CSS3 Color Module
+ var hue2rgb = function(m1, m2, h){
+ if(h < 0){ ++h; }
+ if(h > 1){ --h; }
+ var h6 = 6 * h;
+ if(h6 < 1){ return m1 + (m2 - m1) * h6; }
+ if(2 * h < 1){ return m2; }
+ if(3 * h < 2){ return m1 + (m2 - m1) * (2 / 3 - h) * 6; }
+ return m1;
+ };
+ // Override base Color.fromRgb with the impl in this module
+ dojo.colorFromRgb = Color.fromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){
+ // summary:
+ // get rgb(a) array from css-style color declarations
+ // description:
+ // this function can handle all 4 CSS3 Color Module formats: rgb,
+ // rgba, hsl, hsla, including rgb(a) with percentage values.
+ var m = color.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);
+ if(m){
+ var c = m[2].split(/\s*,\s*/), l = c.length, t = m[1], a;
+ if((t == "rgb" && l == 3) || (t == "rgba" && l == 4)){
+ var r = c[0];
+ if(r.charAt(r.length - 1) == "%"){
+ // 3 rgb percentage values
+ a = ArrayUtil.map(c, function(x){
+ return parseFloat(x) * 2.56;
+ });
+ if(l == 4){ a[3] = c[3]; }
+ return Color.fromArray(a, obj); // dojo.Color
+ }
+ return Color.fromArray(c, obj); // dojo.Color
+ }
+ if((t == "hsl" && l == 3) || (t == "hsla" && l == 4)){
+ // normalize hsl values
+ var H = ((parseFloat(c[0]) % 360) + 360) % 360 / 360,
+ S = parseFloat(c[1]) / 100,
+ L = parseFloat(c[2]) / 100,
+ // calculate rgb according to the algorithm
+ // recommended by the CSS3 Color Module
+ m2 = L <= 0.5 ? L * (S + 1) : L + S - L * S,
+ m1 = 2 * L - m2;
+ a = [
+ hue2rgb(m1, m2, H + 1 / 3) * 256,
+ hue2rgb(m1, m2, H) * 256,
+ hue2rgb(m1, m2, H - 1 / 3) * 256,
+ 1
+ ];
+ if(l == 4){ a[3] = c[3]; }
+ return Color.fromArray(a, obj); // dojo.Color
+ }
+ }
+ return null; // dojo.Color
+ };
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- action: "",
- method: "",
- encType: "",
- "accept-charset": "",
- accept: "",
- target: ""
- }),
+ var confine = function(c, low, high){
+ // summary:
+ // sanitize a color component by making sure it is a number,
+ // and clamping it to valid values
+ c = Number(c);
+ return isNaN(c) ? high : c < low ? low : c > high ? high : c; // Number
+ };
- 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);
+ Color.prototype.sanitize = function(){
+ // summary: makes sure that the object has correct attributes
+ var t = this;
+ t.r = Math.round(confine(t.r, 0, 255));
+ t.g = Math.round(confine(t.g, 0, 255));
+ t.b = Math.round(confine(t.b, 0, 255));
+ t.a = confine(t.a, 0, 1);
+ return this; // dojo.Color
+ };
+
+ ColorExt.makeGrey = Color.makeGrey = function(/*Number*/ g, /*Number?*/ a){
+ // summary: creates a greyscale color with an optional alpha
+ return Color.fromArray([g, g, g, a]); // dojo.Color
+ };
+
+ // mixin all CSS3 named colors not already in _base, along with SVG 1.0 variant spellings
+ lang.mixin(Color.named, {
+ "aliceblue": [240,248,255],
+ "antiquewhite": [250,235,215],
+ "aquamarine": [127,255,212],
+ "azure": [240,255,255],
+ "beige": [245,245,220],
+ "bisque": [255,228,196],
+ "blanchedalmond": [255,235,205],
+ "blueviolet": [138,43,226],
+ "brown": [165,42,42],
+ "burlywood": [222,184,135],
+ "cadetblue": [95,158,160],
+ "chartreuse": [127,255,0],
+ "chocolate": [210,105,30],
+ "coral": [255,127,80],
+ "cornflowerblue": [100,149,237],
+ "cornsilk": [255,248,220],
+ "crimson": [220,20,60],
+ "cyan": [0,255,255],
+ "darkblue": [0,0,139],
+ "darkcyan": [0,139,139],
+ "darkgoldenrod": [184,134,11],
+ "darkgray": [169,169,169],
+ "darkgreen": [0,100,0],
+ "darkgrey": [169,169,169],
+ "darkkhaki": [189,183,107],
+ "darkmagenta": [139,0,139],
+ "darkolivegreen": [85,107,47],
+ "darkorange": [255,140,0],
+ "darkorchid": [153,50,204],
+ "darkred": [139,0,0],
+ "darksalmon": [233,150,122],
+ "darkseagreen": [143,188,143],
+ "darkslateblue": [72,61,139],
+ "darkslategray": [47,79,79],
+ "darkslategrey": [47,79,79],
+ "darkturquoise": [0,206,209],
+ "darkviolet": [148,0,211],
+ "deeppink": [255,20,147],
+ "deepskyblue": [0,191,255],
+ "dimgray": [105,105,105],
+ "dimgrey": [105,105,105],
+ "dodgerblue": [30,144,255],
+ "firebrick": [178,34,34],
+ "floralwhite": [255,250,240],
+ "forestgreen": [34,139,34],
+ "gainsboro": [220,220,220],
+ "ghostwhite": [248,248,255],
+ "gold": [255,215,0],
+ "goldenrod": [218,165,32],
+ "greenyellow": [173,255,47],
+ "grey": [128,128,128],
+ "honeydew": [240,255,240],
+ "hotpink": [255,105,180],
+ "indianred": [205,92,92],
+ "indigo": [75,0,130],
+ "ivory": [255,255,240],
+ "khaki": [240,230,140],
+ "lavender": [230,230,250],
+ "lavenderblush": [255,240,245],
+ "lawngreen": [124,252,0],
+ "lemonchiffon": [255,250,205],
+ "lightblue": [173,216,230],
+ "lightcoral": [240,128,128],
+ "lightcyan": [224,255,255],
+ "lightgoldenrodyellow": [250,250,210],
+ "lightgray": [211,211,211],
+ "lightgreen": [144,238,144],
+ "lightgrey": [211,211,211],
+ "lightpink": [255,182,193],
+ "lightsalmon": [255,160,122],
+ "lightseagreen": [32,178,170],
+ "lightskyblue": [135,206,250],
+ "lightslategray": [119,136,153],
+ "lightslategrey": [119,136,153],
+ "lightsteelblue": [176,196,222],
+ "lightyellow": [255,255,224],
+ "limegreen": [50,205,50],
+ "linen": [250,240,230],
+ "magenta": [255,0,255],
+ "mediumaquamarine": [102,205,170],
+ "mediumblue": [0,0,205],
+ "mediumorchid": [186,85,211],
+ "mediumpurple": [147,112,219],
+ "mediumseagreen": [60,179,113],
+ "mediumslateblue": [123,104,238],
+ "mediumspringgreen": [0,250,154],
+ "mediumturquoise": [72,209,204],
+ "mediumvioletred": [199,21,133],
+ "midnightblue": [25,25,112],
+ "mintcream": [245,255,250],
+ "mistyrose": [255,228,225],
+ "moccasin": [255,228,181],
+ "navajowhite": [255,222,173],
+ "oldlace": [253,245,230],
+ "olivedrab": [107,142,35],
+ "orange": [255,165,0],
+ "orangered": [255,69,0],
+ "orchid": [218,112,214],
+ "palegoldenrod": [238,232,170],
+ "palegreen": [152,251,152],
+ "paleturquoise": [175,238,238],
+ "palevioletred": [219,112,147],
+ "papayawhip": [255,239,213],
+ "peachpuff": [255,218,185],
+ "peru": [205,133,63],
+ "pink": [255,192,203],
+ "plum": [221,160,221],
+ "powderblue": [176,224,230],
+ "rosybrown": [188,143,143],
+ "royalblue": [65,105,225],
+ "saddlebrown": [139,69,19],
+ "salmon": [250,128,114],
+ "sandybrown": [244,164,96],
+ "seagreen": [46,139,87],
+ "seashell": [255,245,238],
+ "sienna": [160,82,45],
+ "skyblue": [135,206,235],
+ "slateblue": [106,90,205],
+ "slategray": [112,128,144],
+ "slategrey": [112,128,144],
+ "snow": [255,250,250],
+ "springgreen": [0,255,127],
+ "steelblue": [70,130,180],
+ "tan": [210,180,140],
+ "thistle": [216,191,216],
+ "tomato": [255,99,71],
+ "turquoise": [64,224,208],
+ "violet": [238,130,238],
+ "wheat": [245,222,179],
+ "whitesmoke": [245,245,245],
+ "yellowgreen": [154,205,50]
+ });
+
+ return Color;
+});
+
+},
+'dijit/registry':function(){
+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++;
},
- execute: function(/*Object*/ formContents){
+ remove: function(/*String*/ id){
// summary:
- // Deprecated: use submit()
- // tags:
- // deprecated
+ // Remove a widget from the registry. Does not destroy the widget; simply
+ // removes the reference.
+ if(hash[id]){
+ delete hash[id];
+ this.length--;
+ }
},
- onExecute: function(){
+ byId: function(/*String|Widget*/ id){
// summary:
- // Deprecated: use onSubmit()
- // tags:
- // deprecated
+ // 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
},
- _setEncTypeAttr: function(/*String*/ value){
- this.encType = value;
- dojo.attr(this.domNode, "encType", value);
- if(dojo.isIE){ this.domNode.encoding = value; }
+ byNode: function(/*DOMNode*/ node){
+ // summary:
+ // Returns the widget corresponding to the given DOMNode
+ return hash[node.getAttribute("widgetId")]; // dijit._Widget
},
- 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);
+ 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);
+ }
+ }
}
}
- this.inherited(arguments);
+
+ getChildrenHelper(root);
+ return outAry;
},
- reset: function(/*Event?*/ e){
+ _destroyAll: function(){
// summary:
- // restores all widget values back to their init values,
- // calls onReset() which can cancel the reset by returning false
+ // Code to destroy all widgets and do other cleanup on page unload
- // 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, []);
+ // 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;
},
- onReset: function(/*Event?*/ e){
+ // 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;
+});
+
+},
+'dijit/tree/_dndContainer':function(){
+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:
- // 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
+ // 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:
- // callback
- return true; // Boolean
+ // 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"))
+ ];
},
- _onReset: function(e){
- this.reset(e);
- dojo.stopEvent(e);
- return false;
+ 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;
},
- _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);
- }
+ // mouse events
+ onMouseOver: function(widget /*===== , evt =====*/){
+ // summary:
+ // Called when mouse is moved over a TreeNode
+ // widget: TreeNode
+ // evt: Event
+ // tags:
+ // protected
+ this.current = widget;
},
- onSubmit: function(/*Event?*/ e){
+ onMouseOut: function(/*===== widget, evt =====*/){
// 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
+ // Called when mouse is moved away from a TreeNode
+ // widget: TreeNode
+ // evt: Event
// tags:
- // extension
+ // protected
+ this.current = null;
+ },
- return this.isValid(); // Boolean
+ _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;
},
- submit: function(){
+ _addItemClass: function(node, type){
// summary:
- // programmatically submit form if and only if the `onSubmit` returns true
- if(!(this.onSubmit() === false)){
- this.containerNode.submit();
- }
+ // 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", "");
}
- }
-);
+ });
+});
-}
+},
+'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",
+'dijit/_base/wai':function(){
+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.
-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");
+ 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.
-// TODO: for 2.0, move the RadioButton code into this file
+ 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.
-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");
+ 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;
+});
+
+},
+'dijit/form/_FormSelectWidget':function(){
+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.
/*=====
@@ -15656,7 +26132,7 @@ dijit.form.__SelectOption = function(){
}
=====*/
-dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
+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.
@@ -15673,7 +26149,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
options: null,
// store: dojo.data.api.Identity
- // A store which, at the very least impelements 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,
@@ -15688,7 +26164,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// 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)
+ // iterated over (i.e. to filter even further what you want to add)
onFetch: null,
// sortByLabel: Boolean
@@ -15739,13 +26215,13 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
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(lang.isArray(lookupValue)){
+ return array.map(lookupValue, "return this.getOptions(item);", this); // dijit.form.__SelectOption[]
}
- if(dojo.isObject(valueOrIdx)){
+ 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(!dojo.some(this.options, function(o, idx){
+ if(!array.some(this.options, function(o, idx){
if(o === lookupValue ||
(o.value && o.value === lookupValue.value)){
lookupValue = idx;
@@ -15765,7 +26241,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
}
}
if(typeof lookupValue == "number" && lookupValue >= 0 && lookupValue < l){
- return this.options[lookupValue] // dijit.form.__SelectOption
+ return this.options[lookupValue]; // dijit.form.__SelectOption
}
return null; // null
},
@@ -15776,9 +26252,9 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// 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)){
+ if(!lang.isArray(option)){ option = [option]; }
+ array.forEach(option, function(i){
+ if(i && lang.isObject(i)){
this.options.push(i);
}
}, this);
@@ -15793,13 +26269,13 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// 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]; }
+ if(!lang.isArray(valueOrIdx)){ valueOrIdx = [valueOrIdx]; }
var oldOpts = this.getOptions(valueOrIdx);
- dojo.forEach(oldOpts, function(i){
+ 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 = dojo.filter(this.options, function(node, idx){
+ this.options = array.filter(this.options, function(node){
return (node.value !== i.value || node.label !== i.label);
});
this._removeOptionItem(i);
@@ -15812,10 +26288,10 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// 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
+ // in an array of new options will yield better performance since
// the children will only be loaded once.
- if(!dojo.isArray(newOption)){ newOption = [newOption]; }
- dojo.forEach(newOption, function(i){
+ 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]; }
@@ -15833,8 +26309,8 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// 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.
+ // 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
@@ -15844,13 +26320,14 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
fetchArgs = fetchArgs || {};
if(oStore !== store){
// Our store has changed, so update our notifications
- dojo.forEach(this._notifyConnections || [], dojo.disconnect);
- delete this._notifyConnections;
+ var h;
+ while(h = this._notifyConnections.pop()){ h.remove(); }
+
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")
+ 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);
@@ -15867,28 +26344,28 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// Add our new options
if(store){
this._loadingStore = true;
- store.fetch(dojo.delegate(fetchArgs, {
+ store.fetch(lang.delegate(fetchArgs, {
onComplete: function(items, opts){
if(this.sortByLabel && !fetchArgs.sort && items.length){
- items.sort(dojo.data.util.sorter.createSortFunction([{
+ 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
- dojo.forEach(items, function(i){
+ 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{
@@ -15922,30 +26399,30 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
return;
}
var opts = this.getOptions() || [];
- if(!dojo.isArray(newValue)){
+ if(!lang.isArray(newValue)){
newValue = [newValue];
}
- dojo.forEach(newValue, function(i, idx){
- if(!dojo.isObject(i)){
+ array.forEach(newValue, function(i, idx){
+ if(!lang.isObject(i)){
i = i + "";
}
if(typeof i === "string"){
- newValue[idx] = dojo.filter(opts, function(node){
+ newValue[idx] = array.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; });
+ newValue = array.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; });
+ array.forEach(opts, function(i){
+ i.selected = array.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; });
+ 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]);
@@ -15957,10 +26434,10 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// summary:
// returns the displayed value of the widget
var val = this.get("value");
- if(!dojo.isArray(val)){
+ if(!lang.isArray(val)){
val = [val];
}
- var ret = dojo.map(this.getOptions(val), function(v){
+ var ret = array.map(this.getOptions(val), function(v){
if(v && "label" in v){
return v.label;
}else if(v){
@@ -15976,11 +26453,11 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// 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){
+ array.forEach(this._getChildren(), function(child){
child.destroyRecursive();
});
// Add each menu item
- dojo.forEach(this.options, this._addOptionItem, this);
+ array.forEach(this.options, this._addOptionItem, this);
// Update states
this._updateSelection();
@@ -15991,16 +26468,16 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// Sets the "selected" class on the item for styling purposes
this._set("value", this._getValueFromOpts());
var val = this.value;
- if(!dojo.isArray(val)){
+ if(!lang.isArray(val)){
val = [val];
}
if(val && val[0]){
- dojo.forEach(this._getChildren(), function(child){
- var isSelected = dojo.some(val, function(v){
+ array.forEach(this._getChildren(), function(child){
+ var isSelected = array.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);
+ domClass.toggle(child.domNode, this.baseClass + "SelectedOption", isSelected);
+ child.domNode.setAttribute("aria-selected", isSelected);
}, this);
}
},
@@ -16012,7 +26489,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
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){
+ var opt = array.filter(opts, function(i){
return i.selected;
})[0];
if(opt && opt.value){
@@ -16023,7 +26500,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
}
}else if(this.multiple){
// Set value to be the sum of all selected
- return dojo.map(dojo.filter(opts, function(i){
+ return array.map(array.filter(opts, function(i){
return i.selected;
}), function(i){
return i.value;
@@ -16064,8 +26541,8 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
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);
+ store.loadItem({item: item, onItem: function(i){
+ this._addOptionForItem(i);
},
scope: this});
return;
@@ -16079,11 +26556,12 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// 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);
- dojo.setSelectable(this.focusNode, false);
+ dom.setSelectable(this.focusNode, false);
},
_fillContent: function(){
@@ -16093,13 +26571,13 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// function.
var opts = this.options;
if(!opts){
- opts = this.options = this.srcNodeRef ? dojo.query(">",
+ 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-" + dojo._scopeName + "-value") || node.getAttribute("value")),
+ 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?)
@@ -16112,7 +26590,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
if(!this.value){
this._set("value", this._getValueFromOpts());
}else if(this.multiple && typeof this.value == "string"){
- this_set("value", this.value.split(","));
+ this._set("value", this.value.split(","));
}
},
@@ -16134,7 +26612,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// Connects in our store, if we have one defined
this.inherited(arguments);
var store = this.store, fetchArgs = {};
- dojo.forEach(["query", "queryOptions", "onFetch"], function(i){
+ array.forEach(["query", "queryOptions", "onFetch"], function(i){
if(this[i]){
fetchArgs[i] = this[i];
}
@@ -16151,11 +26629,12 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
destroy: function(){
// summary:
// Clean up our connections
- dojo.forEach(this._notifyConnections || [], dojo.disconnect);
+ var h;
+ while(h = this._notifyConnections.pop()){ h.remove(); }
this.inherited(arguments);
},
- _addOptionItem: function(/*dijit.form.__SelectOption*/ option){
+ _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
@@ -16163,13 +26642,13 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
// in the created option widget.
},
- _removeOptionItem: function(/*dijit.form.__SelectOption*/ option){
+ _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){
+ _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
@@ -16189,7 +26668,7 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
return this.getOptions(this.get("value"));
},
- _pseudoLoadChildren: function(/*item[]*/ items){
+ _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.
@@ -16205,1327 +26684,51 @@ dojo.declare("dijit.form._FormSelectWidget", dijit.form._FormValueWidget, {
}
});
-}
-
-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.declare("dijit._KeyNavContainer",
- dijit._Container,
- {
+},
+'dijit/form/Select':function(){
+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){
- // 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,
+ 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;
=====*/
- // 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
- }
- }
-);
-
-}
-
-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.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);
- }
- });
-
-}
-
-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.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);
- }
- });
-
-}
-
-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.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);
- }
- });
-
-}
-
-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.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
- }
- });
-
-}
-
-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");
-
-
-
-
-
-
-
-
-
-
-// "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);
- }
-}
-);
-
-}
-
-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");
-
-
-
-
-
+// module:
+// dijit/form/Select
+// summary:
+// This is a "styleable" select box - it is basically a DropDownButton which
+// can take a <select> as its input.
-dojo.declare("dijit.form._SelectMenu", dijit.Menu, {
+var _SelectMenu = declare("dijit.form._SelectMenu", Menu, {
// summary:
// An internally-used menu for dropdown that allows us a vertical scrollbar
buildRendering: function(){
@@ -17534,25 +26737,25 @@ dojo.declare("dijit.form._SelectMenu", dijit.Menu, {
// 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"}}));
+ var n = (this.domNode = domConstruct.create("div", {style: {overflowX: "hidden", overflowY: "scroll"}}));
if(o.parentNode){
o.parentNode.replaceChild(n, o);
}
- dojo.removeClass(o, "dijitMenuTable");
+ domClass.remove(o, "dijitMenuTable");
n.className = o.className + " dijitSelectMenu";
o.className = "dijitReset dijitMenuTable";
- dijit.setWaiRole(o,"listbox");
- dijit.setWaiRole(n,"presentation");
+ 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
+ // stop mousemove from selecting text on IE to be consistent with other browsers
this.inherited(arguments);
- this.connect(this.domNode, "onmousemove", dojo.stopEvent);
+ this.connect(this.domNode, "onmousemove", event.stop);
},
resize: function(/*Object*/ mb){
@@ -17565,7 +26768,7 @@ dojo.declare("dijit.form._SelectMenu", dijit.Menu, {
// mb: Object
// The margin box to set this dropdown to.
if(mb){
- dojo.marginBox(this.domNode, 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
@@ -17576,25 +26779,21 @@ dojo.declare("dijit.form._SelectMenu", dijit.Menu, {
}
});
-dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropDown], {
+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: 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"}),
+ templateString: template,
// 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: [readonly] String
+ // "Incomplete" if this select is required but unset (i.e. blank value), "" otherwise
state: "",
// message: String
@@ -17607,7 +26806,7 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
// emptyLabel: string
// What to display in an "empty" dropdown
- emptyLabel: "&nbsp;",
+ emptyLabel: "&#160;", // &nbsp;
// _isLoaded: Boolean
// Whether or not we have been loaded
@@ -17627,8 +26826,8 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
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");
+ this.dropDown = new _SelectMenu({id: this.id + "_menu"});
+ domClass.add(this.dropDown.domNode, this.baseClass + "Menu");
},
_getMenuItemForOption: function(/*dijit.form.__SelectOption*/ option){
@@ -17637,17 +26836,17 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
// 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();
+ return new MenuSeparator();
}else{
// Just a regular menu option
- var click = dojo.hitch(this, "_setValueAttr", option);
- var item = new dijit.MenuItem({
+ var click = lang.hitch(this, "_setValueAttr", option);
+ var item = new MenuItem({
option: option,
label: option.label || this.emptyLabel,
onClick: click,
disabled: option.disabled || false
});
- dijit.setWaiRole(item.focusNode, "listitem");
+ item.focusNode.setAttribute("role", "listitem");
return item;
}
},
@@ -17689,8 +26888,8 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
}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;"});
+ array.forEach(this._getChildren(), function(child){ child.destroyRecursive(); });
+ var item = new MenuItem({label: "&#160;"});
this.dropDown.addChild(item);
}
}else{
@@ -17708,7 +26907,19 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
_setValueAttr: function(value){
this.inherited(arguments);
- dojo.attr(this.valueNode, "value", this.get("value"));
+ 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){
@@ -17716,32 +26927,31 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
// 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);
+ this.focusNode.setAttribute("aria-valuetext", lbl);
},
validate: function(/*Boolean*/ isFocused){
// summary:
- // Called by oninit, onblur, and onkeypress.
+ // 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.isValid(isFocused);
- this._set("state", isValid ? "" : "Error");
- dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
+
+ 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(this.message !== message){
- this._set("message", message);
- dijit.hideTooltip(this.domNode);
- if(message){
- dijit.showTooltip(message, this.domNode, this.tooltipPosition, !this.isLeftToRight());
- }
+ 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){
+ 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.
@@ -17752,16 +26962,15 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
// summary:
// Overridden so that the state will be cleared.
this.inherited(arguments);
- dijit.hideTooltip(this.domNode);
- this._set("state", "");
- this._set("message", "")
+ Tooltip.hide(this.domNode);
+ this.validate(this.focused); // to update this.state
},
postMixInProperties: function(){
// summary:
// set the missing message
this.inherited(arguments);
- this._missingMsg = dojo.i18n.getLocalization("dijit.form", "validate",
+ this._missingMsg = i18n.getLocalization("dijit.form", "validate",
this.lang).missingMessage;
},
@@ -17771,12 +26980,12 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
this.inherited(arguments);
- this.connect(this.domNode, "onmousemove", dojo.stopEvent);
+ this.connect(this.domNode, "onmousemove", event.stop);
},
_setStyleAttr: function(/*String||Object*/ value){
this.inherited(arguments);
- dojo.toggleClass(this.domNode, this.baseClass + "FixedWidth", !!this.tableNode.style.width);
+ domClass.toggle(this.domNode, this.baseClass + "FixedWidth", !!this.domNode.style.width);
},
isLoaded: function(){
@@ -17809,5780 +27018,3530 @@ dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropD
delete this.dropDown;
}
this.inherited(arguments);
- }
-});
-
-}
-
-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.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(){
+ _onFocus: function(){
+ this.validate(true); // show tooltip if second focus of required tooltip, but no selection
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;
- }
+ _onBlur: function(){
+ Tooltip.hide(this.domNode);
this.inherited(arguments);
}
});
-}
-
-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");
-
-
-
-
+Select._Menu = _SelectMenu; // for monkey patching
+return Select;
+});
+},
+'dojo/store/util/QueryResults':function(){
+define("dojo/store/util/QueryResults", ["../../_base/array", "../../_base/lang", "../../_base/Deferred"
+], function(array, lang, Deferred) {
+ // module:
+ // dojo/store/util/QueryResults
+ // summary:
+ // The module defines a query results wrapper
+var util = lang.getObject("dojo.store.util", true);
-dojo.declare("dijit.InlineEditBox",
- dijit._Widget,
- {
+util.QueryResults = function(results){
// summary:
- // An element with in-line edit capabilites
+ // A function that wraps the results of a store query with additional
+ // methods.
//
// 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%",
+ // QueryResults is a basic wrapper that allows for array-like iteration
+ // over any kind of returned data from a query. While the simplest store
+ // will return a plain array of data, other stores may return deferreds or
+ // promises; this wrapper makes sure that *all* results can be treated
+ // the same.
+ //
+ // Additional methods include `forEach`, `filter` and `map`.
+ //
+ // returns: Object
+ // An array-like object that can be used for iterating over.
+ //
+ // example:
+ // Query a store and iterate over the results.
+ //
+ // | store.query({ prime: true }).forEach(function(item){
+ // | // do something
+ // | });
- // value: String
- // The display value of the widget in read-only mode
- value: "",
+ if(!results){
+ return results;
+ }
+ // if it is a promise it may be frozen
+ if(results.then){
+ results = lang.delegate(results);
+ }
+ function addIterativeMethod(method){
+ if(!results[method]){
+ results[method] = function(){
+ var args = arguments;
+ return Deferred.when(results, function(results){
+ Array.prototype.unshift.call(args, results);
+ return util.QueryResults(array[method].apply(array, args));
+ });
+ };
+ }
+ }
+ addIterativeMethod("forEach");
+ addIterativeMethod("filter");
+ addIterativeMethod("map");
+ if(!results.total){
+ results.total = Deferred.when(results, function(results){
+ return results.length;
+ });
+ }
+ return results;
+};
- // 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>",
+return util.QueryResults;
+});
- constructor: function(){
- // summary:
- // Sets up private arrays etc.
- // tags:
- // private
- this.editorParams = {};
- },
+},
+'dijit/form/_ListBase':function(){
+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
- postMixInProperties: function(){
- this.inherited(arguments);
+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
- // save pointer to original source node, since Widget nulls-out srcNodeRef
- this.displayNode = this.srcNodeRef;
+ // selected: DOMnode
+ // currently selected node
+ selected: null,
- // 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);
+ _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;
}
-
- 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');
+ return tgt;
},
- setDisabled: function(/*Boolean*/ disabled){
+ selectFirstNode: function(){
// 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);
+ // Select the first displayed item in the list.
+ var first = this.containerNode.firstChild;
+ while(first && first.style.display == "none"){
+ first = first.nextSibling;
}
- dojo.toggleClass(this.displayNode, "dijitInlineEditBoxDisplayModeDisabled", disabled);
- this._set("disabled", disabled);
+ this._setSelectedAttr(first);
},
- _onMouseOver: function(){
+ selectLastNode: function(){
// summary:
- // Handler for onmouseover and onfocus event.
- // tags:
- // private
- if(!this.disabled){
- dojo.addClass(this.displayNode, "dijitInlineEditBoxDisplayModeHover");
+ // 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);
},
- _onMouseOut: function(){
+ selectNextNode: 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);
+ // Select the item just below the current selection.
+ // If nothing selected, select first node.
+ var selectedNode = this._getSelectedAttr();
+ if(!selectedNode){
+ this.selectFirstNode();
}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 next = selectedNode.nextSibling;
+ while(next && next.style.display == "none"){
+ next = next.nextSibling;
+ }
+ if(!next){
+ this.selectFirstNode();
+ }else{
+ this._setSelectedAttr(next);
}
}
- 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(){
+ selectPreviousNode: 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;
+ // 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);
+ }
}
- this.inherited(arguments);
},
- _showText: function(/*Boolean*/ focus){
+ _setSelectedAttr: function(/*DomNode*/ node){
// 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);
+ // 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);
}
},
- save: function(/*Boolean*/ focus){
+ _getSelectedAttr: function(){
// 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);
+ // Returns the selected node.
+ var v = this.selected;
+ return (v && v.parentNode == this.containerNode) ? v : (this.selected = null);
+ }
+});
- 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");
- },
+},
+'dijit/form/_FormWidget':function(){
+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){
- cancel: function(/*Boolean*/ focus){
- // summary:
- // Revert to display mode, discarding any changes made in the editor
- // tags:
- // private
+/*=====
+var _Widget = dijit._Widget;
+var _TemplatedMixin = dijit._TemplatedMixin;
+var _CssStateMixin = dijit._CssStateMixin;
+var _FormWidgetMixin = dijit.form._FormWidgetMixin;
+=====*/
- if(this.disabled || !this.editing){ return; }
- this.editing = false;
+// module:
+// dijit/form/_FormWidget
+// summary:
+// FormWidget
- // 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);
- }
-});
+// 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
+ });
+}
-dojo.declare(
- "dijit._InlineEditor",
- [dijit._Widget, dijit._Templated],
-{
+return declare("dijit.form._FormWidget", [_Widget, _TemplatedMixin, _CssStateMixin, _FormWidgetMixin], {
// 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:
+ // 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.
//
- // style: Object
- // Set of CSS attributes of display node, to replicate in editor
+ // 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`.
//
- // 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);
- }
- }
- },
+ // They also share some common methods.
- _onIntermediateChange: function(val){
+ setDisabled: function(/*Boolean*/ disabled){
// 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);
+ // Deprecated. Use set('disabled', ...) instead.
+ kernel.deprecated("setDisabled("+disabled+") is deprecated. Use set('disabled',"+disabled+") instead.", "", "2.0");
+ this.set('disabled', disabled);
},
- getValue: function(){
+ setValue: function(/*String*/ value){
// summary:
- // Return the [display] value of the edit widget
- var ew = this.editWidget;
- return String(ew.get("displayedValue" in ew ? "displayedValue" : "value"));
+ // 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);
},
- _onKeyPress: function(e){
+ getValue: function(){
// 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.
- }
+ // Deprecated. Use get('value') instead.
+ kernel.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.", "", "2.0");
+ return this.get('value');
},
- _onBlur: function(){
- // summary:
- // Called when focus moves outside the editor
- // tags:
- // private
-
+ 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);
- 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);
- }
+ // 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
});
-}
-
-if(!dojo._hasResource["dojo.cookie"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.cookie"] = true;
-dojo.provide("dojo.cookie");
-
-
+});
-/*=====
-dojo.__cookieProps = function(){
- // expires: Date|String|Number?
- // If a number, the number of days from today at which the cookie
- // will expire. If a date, the date past which the cookie will expire.
- // If expires is in the past, the cookie will be deleted.
- // If expires is omitted or is 0, the cookie will expire when the browser closes. << FIXME: 0 seems to disappear right away? FF3.
- // path: String?
- // The path to use for the cookie.
- // domain: String?
- // The domain to use for the cookie.
- // secure: Boolean?
- // Whether to only send the cookie on secure connections
- this.expires = expires;
- this.path = path;
- this.domain = domain;
- this.secure = secure;
-}
-=====*/
+},
+'dojo/DeferredList':function(){
+define("dojo/DeferredList", ["./_base/kernel", "./_base/Deferred", "./_base/array"], function(dojo, Deferred, darray) {
+ // module:
+ // dojo/DeferredList
+ // summary:
+ // TODOC
-dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/props){
- // summary:
- // Get or set a cookie.
- // description:
- // If one argument is passed, returns the value of the cookie
- // For two or more arguments, acts as a setter.
- // name:
- // Name of the cookie
- // value:
- // Value for the cookie
- // props:
- // Properties for the cookie
- // example:
- // set a cookie with the JSON-serialized contents of an object which
- // will expire 5 days from now:
- // | dojo.cookie("configObj", dojo.toJson(config), { expires: 5 });
- //
- // example:
- // de-serialize a cookie back into a JavaScript object:
- // | var config = dojo.fromJson(dojo.cookie("configObj"));
+dojo.DeferredList = function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*Boolean?*/ fireOnOneErrback, /*Boolean?*/ consumeErrors, /*Function?*/ canceller){
+ // summary:
+ // Provides event handling for a group of Deferred objects.
+ // description:
+ // DeferredList takes an array of existing deferreds and returns a new deferred of its own
+ // this new deferred will typically have its callback fired when all of the deferreds in
+ // the given list have fired their own deferreds. The parameters `fireOnOneCallback` and
+ // fireOnOneErrback, will fire before all the deferreds as appropriate
//
- // example:
- // delete a cookie:
- // | dojo.cookie("configObj", null, {expires: -1});
- var c = document.cookie;
- if(arguments.length == 1){
- var matches = c.match(new RegExp("(?:^|; )" + dojo.regexp.escapeString(name) + "=([^;]*)"));
- return matches ? decodeURIComponent(matches[1]) : undefined; // String or undefined
- }else{
- props = props || {};
-// FIXME: expires=0 seems to disappear right away, not on close? (FF3) Change docs?
- var exp = props.expires;
- if(typeof exp == "number"){
- var d = new Date();
- d.setTime(d.getTime() + exp*24*60*60*1000);
- exp = props.expires = d;
- }
- if(exp && exp.toUTCString){ props.expires = exp.toUTCString(); }
-
- value = encodeURIComponent(value);
- var updatedCookie = name + "=" + value, propName;
- for(propName in props){
- updatedCookie += "; " + propName;
- var propValue = props[propName];
- if(propValue !== true){ updatedCookie += "=" + propValue; }
- }
- document.cookie = updatedCookie;
+ // list:
+ // The list of deferreds to be synchronizied with this DeferredList
+ // fireOnOneCallback:
+ // Will cause the DeferredLists callback to be fired as soon as any
+ // of the deferreds in its list have been fired instead of waiting until
+ // the entire list has finished
+ // fireonOneErrback:
+ // Will cause the errback to fire upon any of the deferreds errback
+ // canceller:
+ // A deferred canceller function, see dojo.Deferred
+ var resultList = [];
+ Deferred.call(this);
+ var self = this;
+ if(list.length === 0 && !fireOnOneCallback){
+ this.resolve([0, []]);
}
-};
-
-dojo.cookie.isSupported = function(){
- // summary:
- // Use to determine if the current browser supports cookies or not.
- //
- // Returns true if user allows cookies.
- // Returns false if user doesn't allow cookies.
+ var finished = 0;
+ darray.forEach(list, function(item, i){
+ item.then(function(result){
+ if(fireOnOneCallback){
+ self.resolve([i, result]);
+ }else{
+ addResult(true, result);
+ }
+ },function(error){
+ if(fireOnOneErrback){
+ self.reject(error);
+ }else{
+ addResult(false, error);
+ }
+ if(consumeErrors){
+ return null;
+ }
+ throw error;
+ });
+ function addResult(succeeded, result){
+ resultList[i] = [succeeded, result];
+ finished++;
+ if(finished === list.length){
+ self.resolve(resultList);
+ }
- if(!("cookieEnabled" in navigator)){
- this("__djCookieTest__", "CookiesAllowed");
- navigator.cookieEnabled = this("__djCookieTest__") == "CookiesAllowed";
- if(navigator.cookieEnabled){
- this("__djCookieTest__", "", {expires: -1});
}
- }
- return navigator.cookieEnabled;
+ });
};
+dojo.DeferredList.prototype = new Deferred();
-}
-
-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.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.
- },
+dojo.DeferredList.prototype.gatherResults = function(deferredList){
+ // summary:
+ // Gathers the results of the deferreds for packaging
+ // as the parameters to the Deferred Lists' callback
+ // deferredList: dojo.DeferredList
+ // The deferred list from which this function gathers results.
+ // returns: dojo.DeferredList
+ // The newly created deferred list which packs results as
+ // parameters to its callback.
- postCreate: function(){
- this.inherited(arguments);
+ var d = new dojo.DeferredList(deferredList, false, true, false);
+ d.addCallback(function(results){
+ var ret = [];
+ darray.forEach(results, function(result){
+ ret.push(result[1]);
+ });
+ return ret;
+ });
+ return d;
+};
- // 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");
- },
+return dojo.DeferredList;
+});
- 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);
- }
- },
+},
+'dojo/dnd/common':function(){
+define("dojo/dnd/common", ["../main"], function(dojo) {
+ // module:
+ // dojo/dnd/common
+ // summary:
+ // TODOC
- destroy: function(){
- for(var pane in this.pane2button){
- this.onRemoveChild(dijit.byId(pane));
- }
- this.inherited(arguments);
- },
+dojo.getObject("dnd", true, dojo);
- 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");
+dojo.dnd.getCopyKeyState = dojo.isCopyKey;
+dojo.dnd._uniqueId = 0;
+dojo.dnd.getUniqueId = function(){
+ // summary:
+ // returns a unique string for use with any DOM element
+ var id;
+ do{
+ id = dojo._scopeName + "Unique" + (++dojo.dnd._uniqueId);
+ }while(dojo.byId(id));
+ return id;
+};
- // map from page attribute to corresponding tab button attribute
- var pageAttrList = ["title", "showTitle", "iconClass", "closable", "tooltip"],
- buttonAttrList = ["label", "showLabel", "iconClass", "closeButton", "title"];
+dojo.dnd._empty = {};
- // 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))
- ];
+dojo.dnd.isFormElement = function(/*Event*/ e){
+ // summary:
+ // returns true if user clicked on a form element
+ var t = e.target;
+ if(t.nodeType == 3 /*TEXT_NODE*/){
+ t = t.parentNode;
+ }
+ return " button textarea input select option ".indexOf(" " + t.tagName.toLowerCase() + " ") >= 0; // Boolean
+};
- 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();
- }
- },
+return dojo.dnd;
+});
- 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;
- },
+},
+'dijit/_base/place':function(){
+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.
- 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
+ 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()
- if(!page){ return; }
+ return windowUtils.getBox();
+ };
- 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");
- }
+ /*=====
+ 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;
- 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);
- },
+ /*=====
+ 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]});
+ }
+ }
- onButtonClick: function(/*dijit._Widget*/ page){
- // summary:
- // Called whenever one of my child buttons is pressed in an attempt to select a page
- // tags:
- // private
+ return place.around(node, aroundNode, positions, true, layoutNode);
+ };
- var container = dijit.byId(this.containerId);
- container.selectChild(page);
- },
+ /*=====
+ 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;
- 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);
- }
- }
- },
+ /*=====
+ 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;
- // 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
+ 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;
+ };
- 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
- },
+ return dijit;
+});
- 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);
- }
- }
- },
+},
+'dijit/MenuSeparator':function(){
+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){
- 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);
- }
- });
+/*=====
+ var _WidgetBase = dijit._WidgetBase;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _Contained = dijit._Contained;
+=====*/
+ // module:
+ // dijit/MenuSeparator
+ // summary:
+ // A line between two menu items
-dojo.declare("dijit.layout._StackButton",
- dijit.form.ToggleButton,
- {
+ return declare("dijit.MenuSeparator", [_WidgetBase, _TemplatedMixin, _Contained], {
// summary:
- // Internal widget used by StackContainer.
- // description:
- // The button-like or tab-like object you click to select or delete a page
- // tags:
- // private
+ // A line between two menu items
- // Override _FormWidget.tabIndex.
- // StackContainer buttons are not in the tab order by default.
- // Probably we should be calling this.startupKeyNavChildren() instead.
- tabIndex: "-1",
+ templateString: template,
- buildRendering: function(/*Event*/ evt){
+ buildRendering: function(){
this.inherited(arguments);
- dijit.setWaiRole((this.focusNode || this.domNode), "tab");
+ dom.setSelectable(this.domNode, false);
},
- onClick: function(/*Event*/ evt){
+ isFocusable: function(){
// 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
- },
+ // Override to always return false
+ // tags:
+ // protected
- 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();
+ return false; // Boolean
}
});
+});
-}
-
-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.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",
+},
+'dijit/form/_ComboBoxMenu':function(){
+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){
/*=====
- // selectedChildWidget: [readonly] dijit._Widget
- // References the currently selected child widget, if any.
- // Adjust selected child with selectChild() method.
- selectedChildWidget: null,
+ var _WidgetBase = dijit._WidgetBase;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _ComboBoxMenuMixin = dijit.form._ComboBoxMenuMixin;
+ var _ListMouseMixin = dijit.form._ListMouseMixin;
=====*/
- 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}]);
+ // module:
+ // dijit/form/_ComboBoxMenu
+ // summary:
+ // Focus-less menu for internal use in `dijit.form.ComboBox`
- // 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);
- },
+ 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
- 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);
- },
+ 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>",
- _setupChild: function(/*dijit._Widget*/ child){
- // Overrides _LayoutWidget._setupChild()
+ baseClass: "dijitComboBoxMenu",
- this.inherited(arguments);
+ postCreate: function(){
+ this.inherited(arguments);
+ if(!this.isLeftToRight()){
+ domClass.add(this.previousButton, "dijitMenuItemRtl");
+ domClass.add(this.nextButton, "dijitMenuItemRtl");
+ }
+ },
- dojo.replaceClass(child.domNode, "dijitHidden", "dijitVisible");
+ _createMenuItem: function(){
+ return domConstruct.create("div", {
+ "class": "dijitReset dijitMenuItem" +(this.isLeftToRight() ? "" : " dijitMenuItemRtl"),
+ role: "option"
+ });
+ },
- // remove the title attribute so it doesn't show up when i hover
- // over a node
- child.domNode.title = "";
- },
+ onHover: function(/*DomNode*/ node){
+ // summary:
+ // Add hover CSS
+ domClass.add(node, "dijitMenuItemHover");
+ },
- addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
- // Overrides _Container.addChild() to do layout and publish events
+ onUnhover: function(/*DomNode*/ node){
+ // summary:
+ // Remove hover CSS
+ domClass.remove(node, "dijitMenuItemHover");
+ },
- this.inherited(arguments);
+ onSelect: function(/*DomNode*/ node){
+ // summary:
+ // Add selected CSS
+ domClass.add(node, "dijitMenuItemSelected");
+ },
- if(this._started){
- dojo.publish(this.id+"-addChild", [child, insertIndex]);
+ onDeselect: function(/*DomNode*/ node){
+ // summary:
+ // Remove selected CSS
+ domClass.remove(node, "dijitMenuItemSelected");
+ },
- // 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();
+ _page: function(/*Boolean*/ up){
+ // summary:
+ // Handles page-up and page-down keypresses
- // if this is the first child, then select it
- if(!this.selectedChildWidget){
- this.selectChild(child);
+ 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();
}
- }
- },
-
- 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]);
+ 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;
}
- }
-
- 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();
+ 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;
}
}
+ });
+});
- 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);
- }
- },
+},
+'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>",
+'dijit/Dialog':function(){
+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;
+=====*/
- _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");
+ // module:
+ // dijit/Dialog
+ // summary:
+ // A modal dialog Widget
- return page._onShow() || true;
- },
- _hideChild: function(/*dijit._Widget*/ page){
+ /*=====
+ dijit._underlay = function(kwArgs){
// 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();
- },
+ // 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.
+ };
+ =====*/
- closeChild: function(/*dijit._Widget*/ page){
+ var _DialogBase = declare("dijit._DialogBase", [_TemplatedMixin, _FormMixin, _DialogMixin, _CssStateMixin], {
// 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
-});
-
-}
-
-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");
-
-
+ // 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();
-dojo.declare("dijit.layout.AccordionPane", dijit.layout.ContentPane, {
- // summary:
- // Deprecated widget. Use `dijit.layout.ContentPane` instead.
- // tags:
- // deprecated
+ templateString: template,
- constructor: function(){
- dojo.deprecated("dijit.layout.AccordionPane deprecated, use ContentPane instead", "", "2.0");
- },
+ baseClass: "dijitDialog",
- onSelected: function(){
- // summary:
- // called when this pane is selected
- }
-});
+ cssStateNodes: {
+ closeButtonNode: "dijitDialogCloseIcon"
+ },
-}
+ // Map widget attributes to DOMNode attributes.
+ _setTitleAttr: [
+ { node: "titleNode", type: "innerHTML" },
+ { node: "titleBar", type: "attribute" }
+ ],
-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");
+ // 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,
-//dojo.require("dijit.layout.AccordionPane "); // for back compat, remove for 2.0
+ //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":"",
-// 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.
+ postMixInProperties: function(){
+ var _nlsResources = i18n.getLocalization("dijit", "common");
+ lang.mixin(this, _nlsResources);
+ this.inherited(arguments);
+ },
-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>
+ postCreate: function(){
+ domStyle.set(this.domNode, {
+ display: "none",
+ position:"absolute"
+ });
+ win.body().appendChild(this.domNode);
- // duration: Integer
- // Amount of time (in ms) it takes to slide panes
- duration: dijit.defaultDuration,
+ this.inherited(arguments);
- // buttonWidget: [const] String
- // The name of the widget used to display the title of each pane
- buttonWidget: "dijit.layout._AccordionButton",
+ this.connect(this, "onExecute", "hide");
+ this.connect(this, "onCancel", "hide");
+ this._modalconnects = [];
+ },
-/*=====
- // _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",
+ 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
- buildRendering: function(){
+ // 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);
- 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);
- }
+ _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();
},
- 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;}
+ _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
- // 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;
+ var node = this.domNode;
- // 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();
+ 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");
+ }
- // Memo size to make displayed child
- this._containerContentBox = {
- h: this._verticalSpace,
- w: this._contentBox.w - wrapperDomNodeMargin.w - wrapperDomNodePadBorder.w
- - wrapperContainerNodeMargin.w - wrapperContainerNodePadBorder.w
+ this.underlayAttrs = {
+ dialogId: this.id,
+ "class": array.map(this["class"].split(/\s/), function(s){ return s+"_underlay"; }).join(" ")
};
-
- 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
- });
+ _size: function(){
+ // summary:
+ // If necessary, shrink dialog contents so dialog fits in viewport
+ // tags:
+ // private
- this.inherited(arguments);
- },
+ this._checkIfSingleChild();
- 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.
+ // 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"
+ });
+ }
- // First add in child as a direct child of this AccordionContainer
- dojo.place(child.domNode, this.containerNode, insertIndex);
+ 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
- if(!child._started){
- child.startup();
- }
-
- // Then stick the wrapper widget around the child widget
- this._setupChild(child);
+ var w = Math.min(bb.w, Math.floor(viewport.w * 0.75)),
+ h = Math.min(bb.h, Math.floor(viewport.h * 0.75));
- // Code below copied from StackContainer
- dojo.publish(this.id+"-addChild", [child, insertIndex]);
- this.layout();
- if(!this.selectedChildWidget){
- this.selectChild(child);
+ 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{
- // 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);
+ if(this._singleChild && this._singleChild.resize){
+ this._singleChild.resize();
+ }
}
},
- 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;
+ _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"
+ });
}
-
- 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);
- },
+ _onKey: function(/*Event*/ evt){
+ // summary:
+ // Handles the keyboard events for accessibility reasons
+ // tags:
+ // private
- 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();
+ 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{
- child.destroyRecursive();
+ // 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*/ }
+ }
}
- });
- 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);
- },
+ show: function(){
+ // summary:
+ // Display the dialog
+ // returns: dojo.Deferred
+ // Deferred object that resolves when the display animation is complete
- _transition: function(/*dijit._Widget?*/ newWidget, /*dijit._Widget?*/ oldWidget, /*Boolean*/ animate){
- // Overrides StackContainer._transition() to provide sliding of title bars etc.
+ if(this.open){ return; }
- if(dojo.isIE < 8){
- // workaround animation bugs by not animating; not worth supporting animation for IE6 & 7
- animate = false;
+ if(!this._started){
+ this.startup();
}
- 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;
+ // first time we show the dialog, there's some initialization stuff to do
+ if(!this._alreadyInitialized){
+ this._setup();
+ this._alreadyInitialized=true;
}
- 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(this._fadeOutDeferred){
+ this._fadeOutDeferred.cancel();
}
- if(oldWidget){
- oldWidget._wrapperWidget.set("selected", false);
- if(!animate){
- this._hideChild(oldWidget);
+ 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")));
- if(animate){
- var newContents = newWidget._wrapperWidget.containerNode,
- oldContents = oldWidget._wrapperWidget.containerNode;
+ domStyle.set(this.domNode, {
+ opacity:0,
+ display:""
+ });
- // 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;
+ this._set("open", true);
+ this._onShow(); // lazy load trigger
- oldContents.style.height = (self._verticalSpace - animationHeightOverhead) + "px";
+ this._size();
+ this._position();
- 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);
+ // 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._animation.onStop = this._animation.onEnd;
- this._animation.play();
- }
+ this._fadeInDeferred.callback(true);
+ delete this._fadeInDeferred;
+ })
+ }).play();
- return d; // If child has an href, promise that fires when the widget has finished loading
+ return this._fadeInDeferred;
},
- // note: we are treating the container as controller here
- _onKeyPress: function(/*Event*/ e, /*dijit._Widget*/ fromTitle){
+ hide: function(){
// 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)){
+ // 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;
}
- 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);
+ if(this._fadeInDeferred){
+ this._fadeInDeferred.cancel();
}
- }
- }
-);
-
-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",
+ // fade-in Animation object, setup below
+ var fadeOut;
- // tell nested layout widget that we will take care of sizing
- isContainer: true,
- isLayoutContainer: true,
+ 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'));
- buildRendering: function(){
- // Builds a template like:
- // <div class=dijitAccordionInnerContainer>
- // Button
- // <div class=dijitAccordionChildWrapper>
- // ContentPane
- // </div>
- // </div>
+ 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();
- // 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);
- },
+ if(this._scrollConnected){
+ this._scrollConnected = false;
+ }
+ var h;
+ while(h = this._modalconnects.pop()){
+ h.remove();
+ }
- postCreate: function(){
- this.inherited(arguments);
+ if(this._relativePosition){
+ delete this._relativePosition;
+ }
+ this._set("open", false);
- // 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);
- }))
- ];
+ return this._fadeOutDeferred;
},
- _setSelectedAttr: function(/*Boolean*/ isSelected){
- this._set("selected", isSelected);
- this.button.set("selected", isSelected);
- if(isSelected){
- var cw = this.contentWidget;
- if(cw.onSelected){ cw.onSelected(); }
+ 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();
}
},
- startup: function(){
- // Called by _Container.addChild()
- this.contentWidget.startup();
- },
-
destroy: function(){
- this.button.destroyRecursive();
-
- dojo.forEach(this._contentWidgetWatches || [], function(w){ w.unwatch(); });
+ 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();
+ }
- delete this.contentWidget._buttonWidget;
- delete this.contentWidget._wrapperWidget;
+ DialogLevelManager.hide(this);
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
- },
+ var Dialog = declare("dijit.Dialog", [ContentPane, _DialogBase], {});
+ Dialog._DialogBase = _DialogBase; // for monkey patching
- // TODO: maybe the parent should set these methods directly rather than forcing the code
- // into the button widget?
- _onTitleClick: function(){
+ var DialogLevelManager = Dialog._DialogLevelManager = {
// summary:
- // Callback when someone clicks my title.
- var parent = this.getParent();
- parent.selectChild(this.contentWidget, true);
- dijit.focus(this.focusNode);
- },
+ // 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.
- _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");
- }
-});
+ _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.
-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");
+ // 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});
+ },
-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>
+ 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.
- // 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",
+ if(ds[ds.length-1].dialog == dialog){
+ // Removing the top (or only) dialog in the stack, return focus
+ // to previous dialog
- // 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,
+ ds.pop();
- // liveSplitters: [const] Boolean
- // Specifies whether splitters resize as you drag (true) or only upon mouseup (false)
- liveSplitters: true,
+ var pd = ds[ds.length-1]; // the new active dialog (or the base page itself)
- // persist: Boolean
- // Save splitter positions in a cookie.
- persist: false,
+ // 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);
+ }
- baseClass: "dijitBorderContainer",
+ // 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;
+ }
- // _splitterClass: String
- // Optional hook to override the default Splitter widget used by BorderContainer
- _splitterClass: "dijit.layout._Splitter",
+ 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);
+ }
+ }
+ },
- 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";
+ isTop: function(/*dijit._Widget*/ dialog){
+ // summary:
+ // Returns true if specified Dialog is the top in the task
+ return ds[ds.length-1].dialog == dialog;
}
- this.inherited(arguments);
- },
+ };
- startup: function(){
- if(this._started){ return; }
- dojo.forEach(this.getChildren(), this._setupChild, this);
- this.inherited(arguments);
- },
+ // 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
+ });
+ }
- _setupChild: function(/*dijit._Widget*/ child){
- // Override _LayoutWidget._setupChild().
+ return Dialog;
+});
- var region = child.region;
- if(region){
- this.inherited(arguments);
+},
+'dijit/_base/focus':function(){
+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.
- dojo.addClass(child.domNode, this.baseClass+"Pane");
+ lang.mixin(dijit, {
+ // _curFocus: DomNode
+ // Currently focused item on screen
+ _curFocus: null,
- var ltr = this.isLeftToRight();
- if(region == "leading"){ region = ltr ? "left" : "right"; }
- if(region == "trailing"){ region = ltr ? "right" : "left"; }
+ // _prevFocus: DomNode
+ // Previously focused item on screen
+ _prevFocus: null,
- // 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;
+ isCollapsed: function(){
+ // summary:
+ // Returns true if there is no text selected
+ return dijit.getBookmark().isCollapsed;
+ },
- dojo.place(splitter.domNode, child.domNode, "after");
+ 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 = {};
- // Splitters aren't added as Contained children, so we need to call startup explicitly
- splitter.startup();
+ //'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!");
}
- child.region = region; // TODO: technically wrong since it overwrites "trailing" with "left" etc.
- }
- },
+ return bm; // Object
+ },
- layout: function(){
- // Implement _LayoutWidget.layout() virtual method.
- this._layoutChildren();
- },
+ 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();
+ }
+ }
+ },
- addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
- // Override _LayoutWidget.addChild().
- this.inherited(arguments);
- if(this._started){
- this.layout(); //OPT
- }
- },
+ 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
+ },
- removeChild: function(/*dijit._Widget*/ child){
- // Override _LayoutWidget.removeChild().
+ // _activeStack: dijit._Widget[]
+ // List of currently active widgets (focused widget and it's ancestors)
+ _activeStack: [],
- 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");
- },
+ 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);
+ },
- getChildren: function(){
- // Override _LayoutWidget.getChildren() to only return real children, not the splitters.
- return dojo.filter(this.inherited(arguments), function(widget){
- return !widget.isSplitter;
- });
- },
+ 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()
- // 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;
- },
+ handle && handle.remove();
+ },
- resize: function(newSize, currentSize){
- // Overrides _LayoutWidget.resize().
+ 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()
- // 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);
+ return focus.registerWin(targetWindow, effectiveNode);
+ },
- dojo.style(node, "padding", "0px");
- }
+ 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.
- this.inherited(arguments);
- },
+ handle && handle.remove();
+ }
+ });
- _layoutChildren: function(/*String?*/ changedChildId, /*Number?*/ changedChildSize){
+ // 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:
- // 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
+ // 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(!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;
- }
+ if(!handle){ 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;
- });
+ 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;
- // 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);
+ // 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*/}
}
- });
-
- // 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);
- },
+ focus._onFocusNode(node);
+ }
- destroyRecursive: function(){
- // Destroy splitters first, while getChildren() still works
- dojo.forEach(this.getChildren(), function(child){
- var splitter = child._splitterWidget;
- if(splitter){
- splitter.destroy();
+ // 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();
}
- 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,
+ try{
+ win.withGlobal(openedForWindow || win.global, dijit.moveToBookmark, null, [bookmark]);
+ }catch(e2){
+ /*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */
+ }
+ }
+ };
- // 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,
+ // 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;
+ });
- // 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,
+ 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
+ });
- // 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
+ return dijit;
});
-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
+},
+'dijit/tree/dndSource':function(){
+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`
/*=====
- // 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,
+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;
+}
=====*/
- // 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,
+return declare("dijit.tree.dndSource", _dndSelector, {
+ // summary:
+ // Handles drag and drop operations (as a source or a target) for `dijit.Tree`
- templateString: '<div class="dijitSplitter" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_startDrag,onmouseenter:_onMouse,onmouseleave:_onMouse" tabIndex="0" role="separator"><div class="dijitSplitterThumb"></div></div>',
+ // isSource: [private] Boolean
+ // Can be used as a DnD source.
+ isSource: true,
- postMixInProperties: function(){
- this.inherited(arguments);
+ // accept: String[]
+ // List of accepted types (text strings) for the Tree; defaults to
+ // ["text"]
+ accept: ["text", "treeNode"],
- this.horizontal = /top|bottom/.test(this.region);
- this._factor = /top|left/.test(this.region) ? 1 : -1;
- this._cookieName = this.container.id + "_" + this.region;
- },
+ // copyOnly: [private] Boolean
+ // Copy items, if true, use a state of Ctrl key otherwise
+ copyOnly: false,
- buildRendering: function(){
- this.inherited(arguments);
+ // dragThreshold: Number
+ // The move delay in pixels before detecting a drag; 5 by default
+ dragThreshold: 5,
- dojo.addClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V"));
+ // betweenThreshold: Integer
+ // Distance from upper/lower edge of node to allow drop to reorder nodes
+ betweenThreshold: 0,
- if(this.container.persist){
- // restore old size
- var persistSize = dojo.cookie(this._cookieName);
- if(persistSize){
- this.child.domNode.style[this.horizontal ? "height" : "width"] = persistSize;
+ 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;
}
}
- },
-
- _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");
+ // 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;
- // 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");
+ // states
+ this.sourceState = "";
+ if(this.isSource){
+ domClass.add(this.node, "dojoDndSource");
}
-
- //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;
+ this.targetState = "";
+ if(this.accept){
+ domClass.add(this.node, "dojoDndTarget");
}
- if(this.container.persist){
- dojo.cookie(this._cookieName, this.child.domNode.style[this.horizontal ? "height" : "width"], {expires:365});
- }
+ // 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"))
+ ];
},
- _cleanupHandlers: function(){
- dojo.forEach(this._handlers, dojo.disconnect);
- delete this._handlers;
+ // 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
},
- _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);
+ 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(){
- 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(){
+ // summary:
+ // Prepares the object to be garbage-collected.
this.inherited(arguments);
- this.horizontal = /top|bottom/.test(this.region);
+ var h;
+ while(h = this.topics.pop()){ h.remove(); }
+ this.targetAnchor = null;
},
- buildRendering: function(){
- this.inherited(arguments);
- dojo.addClass(this.domNode, "dijitGutter" + (this.horizontal ? "H" : "V"));
- }
-});
-
-}
-
-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.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");
+ _onDragMouse: function(e){
+ // summary:
+ // Helper method for processing onmousemove/onmouseover events while drag is in progress.
+ // Keeps track of current drop target.
- this.inherited(arguments);
- },
+ 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)
- buildRendering: function(){
- this.inherited(arguments);
+ // 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";
+ }
+ }
- // 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(newTarget != oldTarget || newDropPosition != oldDropPosition){
+ if(oldTarget){
+ this._removeItemClass(oldTarget.rowNode, oldDropPosition);
+ }
+ if(newTarget){
+ this._addItemClass(newTarget.rowNode, newDropPosition);
+ }
- if(!this.doLayout){ dojo.addClass(this.domNode, "dijitTabContainerNoLayout"); }
+ // 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);
+ }
+ }
- 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"));
+ this.targetAnchor = newTarget;
+ this.dropPosition = newDropPosition;
}
},
- _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();
-
+ 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);
- },
-
- 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);
- }
+ var m = DNDManager.manager();
+ if(this.isDragging){
+ this._onDragMouse(e);
}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();
+ 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)));
+ }
}
}
},
- destroy: function(){
- if(this.tablist){
- this.tablist.destroy();
- }
+ 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);
- }
-});
-
-}
-
-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");
-
-
-
-
-
-
-// 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(){
+ onMouseUp: function(e){
// 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';
+ // Event processor for onmouseup/ontouchend
+ // e: Event
+ // onmouseup/ontouchend event
+ // tags:
+ // private
+ if(this.mouseDown){
+ this.mouseDown = false;
+ this.inherited(arguments);
}
- }
-});
-
-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(){
+ onMouseOut: function(){
+ // summary:
+ // Event processor for when mouse is moved away from a TreeNode
+ // tags:
+ // private
this.inherited(arguments);
-
- dojo.setSelectable(this.containerNode, false);
+ this._unmarkTargetAnchor();
},
- 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);
+ 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;
},
- _setCloseButtonAttr: function(/*Boolean*/ disp){
+ // topic event processors
+ onDndSourceOver: function(source){
// 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;
- }
+ // 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);
}
},
- _setLabelAttr: function(/*String*/ content){
+ onDndStart: function(source, nodes, copy){
// 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 || '');
- }
- },
+ // 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
- destroy: function(){
- if(this._closeMenu){
- this._closeMenu.destroyRecursive();
- delete this._closeMenu;
+ if(this.isSource){
+ this._changeState("Source", this == source ? (copy ? "Copied" : "Moved") : "");
}
- this.inherited(arguments);
- }
-});
-
-}
-
-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.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;
+ var accepted = this.checkAcceptance(source, nodes);
- this.scrollNode = this.tablistWrapper;
- this._initButtons();
+ this._changeState("Target", accepted ? "" : "Disabled");
- if(!this.tabStripClass){
- this.tabStripClass = "dijitTabContainer" +
- this.tabPosition.charAt(0).toUpperCase() +
- this.tabPosition.substr(1).replace(/-.*/, "") +
- "None";
- dojo.addClass(n, "tabStrip-disabled")
+ if(this == source){
+ DNDManager.manager().overSource(this);
}
- 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;
+ this.isDragging = 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");
- },
+ 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
- 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;
- }
+ // TODO: for 2.0 refactor so itemCreator() is called once per drag node, and
+ // make signature itemCreator(sourceItem, node, target) (or similar).
- this.inherited(arguments);
+ return array.map(nodes, function(node){
+ return {
+ "id": node.id,
+ "name": node.textContent || node.innerText || ""
+ };
+ }); // Object[]
},
- _initButtons: function(){
+ onDndDrop: function(source, nodes, copy){
// summary:
- // Creates the buttons used to scroll to view tabs that
- // may not be visible if the TabContainer is too narrow.
+ // 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;
- // 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;
+ 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{
- dojo.style(btn, "display", "none");
- return false;
+ newParentItem = (target && target.item) || tree.item;
}
- }, 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 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;
- if(this.domNode.offsetWidth == 0){
- return;
- }
+ 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);
- // Save the dimensions to be used when a child is renamed.
- this._dim = dim;
+ // 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;
+ }
- // 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);
+ 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.
- // 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");
+ 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);
+ }
- // 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"}]);
+ // Create new item in the tree, based on the drag source.
+ model.newItem(newItemsParams[idx], newParentItem, insertIndex);
+ }
+ }, this);
- // 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;
+ // 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);
}
-
- // 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;
+ this.onDndCancel();
},
- _convertToScrollLeft: function(val){
+ onDndCancel: function(){
// 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);
- }
+ // 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", "");
},
- onSelectChild: function(/*dijit._Widget*/ page){
+ // When focus moves in/out of the entire Tree
+ onOverEvent: function(){
// 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 method is called when mouse is moved over our container (like onmouseenter)
+ // tags:
+ // private
this.inherited(arguments);
+ DNDManager.manager().overSource(this);
},
-
- _getScrollBounds: function(){
+ onOutEvent: 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
- };
+ // 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);
}
- },
-
- _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);
+ m.outSource(this);
- // 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;
+ this.inherited(arguments);
},
- createSmoothScroll: function(x){
+ _isParentChildDrop: function(source, targetRow){
// 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();
- }
+ // 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(this._anim && this._anim.status() == "playing"){
- this._anim.stop();
+ // 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 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);
+ var root = source.tree.domNode;
+ var ids = source.selection;
- return anim; // dojo._Animation
- },
+ var node = targetRow.parentNode;
- _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;
+ // 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 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));
+ return node.id && ids[node.id];
},
- doSlide: function(/*Number*/ direction, /*DomNode*/ node){
+ _unmarkTargetAnchor: function(){
// 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();
+ // 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;
},
- _setButtonClass: function(/*Number*/ scroll){
+ _markDndStatus: function(copy){
// 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);
+ // Changes source's state based on "copy" status
+ this._changeState("Source", copy ? "Copied" : "Moved");
}
});
-
-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: "",
+},
+'dijit/a11y':function(){
+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.)
- // -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",
+ 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");
+ });
- isLoaded: function(){
- // recreate menu every time, in case the TabContainer's list of children (or their icons/labels) have changed
- return false;
- },
+ dijit.hasDefaultTabStop = function(/*Element*/ elem){
+ // summary:
+ // Tests if element is tab-navigable even without an explicit tabIndex setting
- 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);
+ // 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;
+ }
}
- });
- this.dropDown.addChild(menuItem);
- }, this);
- callback();
- },
-
- closeDropDown: function(/*Boolean*/ focus){
- this.inherited(arguments);
- if(this.dropDown){
- this.dropDown.destroyRecursive();
- delete this.dropDown;
+ return body && (body.contentEditable == 'true' ||
+ (body.firstChild && body.firstChild.contentEditable == 'true'));
+ default:
+ return elem.contentEditable == 'true';
}
- }
-});
-
-}
-
-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");
-
-
+ };
+ 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);
+ }
+ });
-dojo.declare("dijit.layout.TabContainer",
- dijit.layout._TabContainerBase,
- {
+ dijit._getTabNavigable = function(/*DOMNode*/ root){
// summary:
- // A Container with tabs to select each child (only one of which is displayed at a time).
+ // Finds descendants of the specified root node.
+ //
// 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);
+ // 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 = {};
- 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);
- },
+ 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();
+ }
- postMixInProperties: function(){
- this.inherited(arguments);
+ 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;
+ }
- // 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";
+ 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;
}
-});
-
-}
-
-if(!dojo._hasResource["dojo.number"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.number"] = true;
-dojo.provide("dojo.number");
-
-
-
-
-
-dojo.getObject("number", true, dojo);
-
-/*=====
-dojo.number = {
- // summary: localized formatting and parsing routines for Number
-}
-dojo.number.__FormatOptions = function(){
- // pattern: String?
- // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
- // with this string. Default value is based on locale. Overriding this property will defeat
- // localization. Literal characters in patterns are not supported.
- // type: String?
- // choose a format type based on the locale from the following:
- // decimal, scientific (not yet supported), percent, currency. decimal by default.
- // places: Number?
- // fixed number of decimal places to show. This overrides any
- // information in the provided pattern.
- // round: Number?
- // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
- // means do not round.
- // locale: String?
- // override the locale used to determine formatting rules
- // fractional: Boolean?
- // If false, show no decimal places, overriding places and pattern settings.
- this.pattern = pattern;
- this.type = type;
- this.places = places;
- this.round = round;
- this.locale = locale;
- this.fractional = fractional;
-}
-=====*/
+ 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
+ };
-dojo.number.format = function(/*Number*/value, /*dojo.number.__FormatOptions?*/options){
- // summary:
- // Format a Number as a String, using locale-specific settings
- // description:
- // Create a string from a Number using a known localized pattern.
- // Formatting patterns appropriate to the locale are chosen from the
- // [Common Locale Data Repository](http://unicode.org/cldr) as well as the appropriate symbols and
- // delimiters.
- // If value is Infinity, -Infinity, or is not a valid JavaScript number, return null.
- // value:
- // the number to be formatted
+ 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
+ };
- options = dojo.mixin({}, options || {});
- var locale = dojo.i18n.normalizeLocale(options.locale),
- bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale);
- options.customs = bundle;
- var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"];
- if(isNaN(value) || Math.abs(value) == Infinity){ return null; } // null
- return dojo.number._applyPattern(value, pattern, options); // String
-};
+ return {
+ hasDefaultTabStop: dijit.hasDefaultTabStop,
+ isTabNavigable: dijit.isTabNavigable,
+ _getTabNavigable: dijit._getTabNavigable,
+ getFirstInTabbingOrder: dijit.getFirstInTabbingOrder,
+ getLastInTabbingOrder: dijit.getLastInTabbingOrder
+ };
+});
-//dojo.number._numberPatternRE = /(?:[#0]*,?)*[#0](?:\.0*#*)?/; // not precise, but good enough
-dojo.number._numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/; // not precise, but good enough
+},
+'dijit/form/_ToggleButtonMixin':function(){
+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).
-dojo.number._applyPattern = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatOptions?*/options){
+return declare("dijit.form._ToggleButtonMixin", null, {
// summary:
- // Apply pattern to format value as a string using options. Gives no
- // consideration to local customs.
- // value:
- // the number to be formatted.
- // pattern:
- // a pattern string as described by
- // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
- // options: dojo.number.__FormatOptions?
- // _applyPattern is usually called via `dojo.number.format()` which
- // populates an extra property in the options parameter, "customs".
- // The customs object specifies group and decimal parameters if set.
+ // A mixin to provide functionality to allow a button that can be in two states (checked or not).
- //TODO: support escapes
- options = options || {};
- var group = options.customs.group,
- decimal = options.customs.decimal,
- patternList = pattern.split(';'),
- positivePattern = patternList[0];
- pattern = patternList[(value < 0) ? 1 : 0] || ("-" + positivePattern);
-
- //TODO: only test against unescaped
- if(pattern.indexOf('%') != -1){
- value *= 100;
- }else if(pattern.indexOf('\u2030') != -1){
- value *= 1000; // per mille
- }else if(pattern.indexOf('\u00a4') != -1){
- group = options.customs.currencyGroup || group;//mixins instead?
- decimal = options.customs.currencyDecimal || decimal;// Should these be mixins instead?
- pattern = pattern.replace(/\u00a4{1,3}/, function(match){
- var prop = ["symbol", "currency", "displayName"][match.length-1];
- return options[prop] || options.currency || "";
- });
- }else if(pattern.indexOf('E') != -1){
- throw new Error("exponential notation not supported");
- }
-
- //TODO: support @ sig figs?
- var numberPatternRE = dojo.number._numberPatternRE;
- var numberPattern = positivePattern.match(numberPatternRE);
- if(!numberPattern){
- throw new Error("unable to find a number expression in pattern: "+pattern);
- }
- if(options.fractional === false){ options.places = 0; }
- return pattern.replace(numberPatternRE,
- dojo.number._formatAbsolute(value, numberPattern[0], {decimal: decimal, group: group, places: options.places, round: options.round}));
-};
-
-dojo.number.round = function(/*Number*/value, /*Number?*/places, /*Number?*/increment){
- // summary:
- // Rounds to the nearest value with the given number of decimal places, away from zero
- // description:
- // Rounds to the nearest value with the given number of decimal places, away from zero if equal.
- // Similar to Number.toFixed(), but compensates for browser quirks. Rounding can be done by
- // fractional increments also, such as the nearest quarter.
- // NOTE: Subject to floating point errors. See dojox.math.round for experimental workaround.
- // value:
- // The number to round
- // places:
- // The number of decimal places where rounding takes place. Defaults to 0 for whole rounding.
- // Must be non-negative.
- // increment:
- // Rounds next place to nearest value of increment/10. 10 by default.
- // example:
- // >>> dojo.number.round(-0.5)
- // -1
- // >>> dojo.number.round(162.295, 2)
- // 162.29 // note floating point error. Should be 162.3
- // >>> dojo.number.round(10.71, 0, 2.5)
- // 10.75
- var factor = 10 / (increment || 10);
- return (factor * +value).toFixed(places) / factor; // Number
-};
-
-if((0.9).toFixed() == 0){
- // (isIE) toFixed() bug workaround: Rounding fails on IE when most significant digit
- // is just after the rounding place and is >=5
- (function(){
- var round = dojo.number.round;
- dojo.number.round = function(v, p, m){
- var d = Math.pow(10, -p || 0), a = Math.abs(v);
- if(!v || a >= d || a * Math.pow(10, p + 1) < 5){
- d = 0;
- }
- return round(v, p, m) + (v > 0 ? d : -d);
- };
- })();
-}
-
-/*=====
-dojo.number.__FormatAbsoluteOptions = function(){
- // decimal: String?
- // the decimal separator
- // group: String?
- // the group separator
- // places: Number?|String?
- // number of decimal places. the range "n,m" will format to m places.
- // round: Number?
- // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
- // means don't round.
- this.decimal = decimal;
- this.group = group;
- this.places = places;
- this.round = round;
-}
-=====*/
+ // 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,
-dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatAbsoluteOptions?*/options){
- // summary:
- // Apply numeric pattern to absolute value using options. Gives no
- // consideration to local customs.
- // value:
- // the number to be formatted, ignores sign
- // pattern:
- // the number portion of a pattern (e.g. `#,##0.00`)
- options = options || {};
- if(options.places === true){options.places=0;}
- if(options.places === Infinity){options.places=6;} // avoid a loop; pick a limit
+ // aria-pressed for toggle buttons, and aria-checked for checkboxes
+ _aria_attr: "aria-pressed",
- var patternParts = pattern.split("."),
- comma = typeof options.places == "string" && options.places.indexOf(","),
- maxPlaces = options.places;
- if(comma){
- maxPlaces = options.places.substring(comma + 1);
- }else if(!(maxPlaces >= 0)){
- maxPlaces = (patternParts[1] || []).length;
- }
- if(!(options.round < 0)){
- value = dojo.number.round(value, maxPlaces, options.round);
- }
+ _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;
+ },
- var valueParts = String(Math.abs(value)).split("."),
- fractional = valueParts[1] || "";
- if(patternParts[1] || options.places){
- if(comma){
- options.places = options.places.substring(0, comma);
- }
- // Pad fractional with trailing zeros
- var pad = options.places !== undefined ? options.places : (patternParts[1] && patternParts[1].lastIndexOf("0") + 1);
- if(pad > fractional.length){
- valueParts[1] = dojo.string.pad(fractional, pad, '0', true);
- }
+ _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);
+ },
- // Truncate fractional
- if(maxPlaces < fractional.length){
- valueParts[1] = fractional.substr(0, maxPlaces);
- }
- }else{
- if(valueParts[1]){ valueParts.pop(); }
- }
+ reset: function(){
+ // summary:
+ // Reset the widget's value to what it was at initialization time
- // Pad whole with leading zeros
- var patternDigits = patternParts[0].replace(',', '');
- pad = patternDigits.indexOf("0");
- if(pad != -1){
- pad = patternDigits.length - pad;
- if(pad > valueParts[0].length){
- valueParts[0] = dojo.string.pad(valueParts[0], pad);
- }
+ this._hasBeenBlurred = false;
- // Truncate whole
- if(patternDigits.indexOf("#") == -1){
- valueParts[0] = valueParts[0].substr(valueParts[0].length - pad);
- }
+ // set checked state to original setting
+ this.set('checked', this.params.checked || false);
}
+});
- // Add group separators
- var index = patternParts[0].lastIndexOf(','),
- groupSize, groupSize2;
- if(index != -1){
- groupSize = patternParts[0].length - index - 1;
- var remainder = patternParts[0].substr(0, index);
- index = remainder.lastIndexOf(',');
- if(index != -1){
- groupSize2 = remainder.length - index - 1;
- }
- }
- var pieces = [];
- for(var whole = valueParts[0]; whole;){
- var off = whole.length - groupSize;
- pieces.push((off > 0) ? whole.substr(off) : whole);
- whole = (off > 0) ? whole.slice(0, off) : "";
- if(groupSize2){
- groupSize = groupSize2;
- delete groupSize2;
- }
- }
- valueParts[0] = pieces.reverse().join(options.group || ",");
+});
- return valueParts.join(options.decimal || ".");
-};
+},
+'dijit/_Widget':function(){
+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){
/*=====
-dojo.number.__RegexpOptions = function(){
- // pattern: String?
- // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
- // with this string. Default value is based on locale. Overriding this property will defeat
- // localization.
- // type: String?
- // choose a format type based on the locale from the following:
- // decimal, scientific (not yet supported), percent, currency. decimal by default.
- // locale: String?
- // override the locale used to determine formatting rules
- // strict: Boolean?
- // strict parsing, false by default. Strict parsing requires input as produced by the format() method.
- // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators
- // places: Number|String?
- // number of decimal places to accept: Infinity, a positive number, or
- // a range "n,m". Defined by pattern or Infinity if pattern not provided.
- this.pattern = pattern;
- this.type = type;
- this.locale = locale;
- this.strict = strict;
- this.places = places;
-}
+ var _WidgetBase = dijit._WidgetBase;
+ var _OnDijitClickMixin = dijit._OnDijitClickMixin;
+ var _FocusMixin = dijit._FocusMixin;
=====*/
-dojo.number.regexp = function(/*dojo.number.__RegexpOptions?*/options){
- // summary:
- // Builds the regular needed to parse a number
- // description:
- // Returns regular expression with positive and negative match, group
- // and decimal separators
- return dojo.number._parseInfo(options).regexp; // String
-};
-
-dojo.number._parseInfo = function(/*Object?*/options){
- options = options || {};
- var locale = dojo.i18n.normalizeLocale(options.locale),
- bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale),
- pattern = options.pattern || bundle[(options.type || "decimal") + "Format"],
-//TODO: memoize?
- group = bundle.group,
- decimal = bundle.decimal,
- factor = 1;
-
- if(pattern.indexOf('%') != -1){
- factor /= 100;
- }else if(pattern.indexOf('\u2030') != -1){
- factor /= 1000; // per mille
- }else{
- var isCurrency = pattern.indexOf('\u00a4') != -1;
- if(isCurrency){
- group = bundle.currencyGroup || group;
- decimal = bundle.currencyDecimal || decimal;
- }
- }
-
- //TODO: handle quoted escapes
- var patternList = pattern.split(';');
- if(patternList.length == 1){
- patternList.push("-" + patternList[0]);
- }
-
- var re = dojo.regexp.buildGroupRE(patternList, function(pattern){
- pattern = "(?:"+dojo.regexp.escapeString(pattern, '.')+")";
- return pattern.replace(dojo.number._numberPatternRE, function(format){
- var flags = {
- signed: false,
- separator: options.strict ? group : [group,""],
- fractional: options.fractional,
- decimal: decimal,
- exponent: false
- },
-
- parts = format.split('.'),
- places = options.places;
-
- // special condition for percent (factor != 1)
- // allow decimal places even if not specified in pattern
- if(parts.length == 1 && factor != 1){
- parts[1] = "###";
- }
- if(parts.length == 1 || places === 0){
- flags.fractional = false;
- }else{
- if(places === undefined){ places = options.pattern ? parts[1].lastIndexOf('0') + 1 : Infinity; }
- if(places && options.fractional == undefined){flags.fractional = true;} // required fractional, unless otherwise specified
- if(!options.places && (places < parts[1].length)){ places += "," + parts[1].length; }
- flags.places = places;
- }
- var groups = parts[0].split(',');
- if(groups.length > 1){
- flags.groupSize = groups.pop().length;
- if(groups.length > 1){
- flags.groupSize2 = groups.pop().length;
- }
- }
- return "("+dojo.number._realNumberRegexp(flags)+")";
- });
- }, true);
- if(isCurrency){
- // substitute the currency symbol for the placeholder in the pattern
- re = re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g, function(match, before, target, after){
- var prop = ["symbol", "currency", "displayName"][target.length-1],
- symbol = dojo.regexp.escapeString(options[prop] || options.currency || "");
- before = before ? "[\\s\\xa0]" : "";
- after = after ? "[\\s\\xa0]" : "";
- if(!options.strict){
- if(before){before += "*";}
- if(after){after += "*";}
- return "(?:"+before+symbol+after+")?";
- }
- return before+symbol+after;
- });
- }
-//TODO: substitute localized sign/percent/permille/etc.?
+// module:
+// dijit/_Widget
+// summary:
+// Old base for widgets. New widgets should extend _WidgetBase instead
- // normalize whitespace and return
- return {regexp: re.replace(/[\xa0 ]/g, "[\\s\\xa0]"), group: group, decimal: decimal, factor: factor}; // Object
-};
-/*=====
-dojo.number.__ParseOptions = function(){
- // pattern: String?
- // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
- // with this string. Default value is based on locale. Overriding this property will defeat
- // localization. Literal characters in patterns are not supported.
- // type: String?
- // choose a format type based on the locale from the following:
- // decimal, scientific (not yet supported), percent, currency. decimal by default.
- // locale: String?
- // override the locale used to determine formatting rules
- // strict: Boolean?
- // strict parsing, false by default. Strict parsing requires input as produced by the format() method.
- // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators
- // fractional: Boolean?|Array?
- // Whether to include the fractional portion, where the number of decimal places are implied by pattern
- // or explicit 'places' parameter. The value [true,false] makes the fractional portion optional.
- this.pattern = pattern;
- this.type = type;
- this.locale = locale;
- this.strict = strict;
- this.fractional = fractional;
-}
-=====*/
-dojo.number.parse = function(/*String*/expression, /*dojo.number.__ParseOptions?*/options){
+function connectToDomNode(){
// summary:
- // Convert a properly formatted string to a primitive Number, using
- // locale-specific settings.
- // description:
- // Create a Number from a string using a known localized pattern.
- // Formatting patterns are chosen appropriate to the locale
- // and follow the syntax described by
- // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
- // Note that literal characters in patterns are not supported.
- // expression:
- // A string representation of a Number
- var info = dojo.number._parseInfo(options),
- results = (new RegExp("^"+info.regexp+"$")).exec(expression);
- if(!results){
- return NaN; //NaN
- }
- var absoluteMatch = results[1]; // match for the positive expression
- if(!results[1]){
- if(!results[2]){
- return NaN; //NaN
- }
- // matched the negative pattern
- absoluteMatch =results[2];
- info.factor *= -1;
- }
-
- // Transform it to something Javascript can parse as a number. Normalize
- // decimal point and strip out group separators or alternate forms of whitespace
- absoluteMatch = absoluteMatch.
- replace(new RegExp("["+info.group + "\\s\\xa0"+"]", "g"), "").
- replace(info.decimal, ".");
- // Adjust for negative sign, percent, etc. as necessary
- return absoluteMatch * info.factor; //Number
-};
-
-/*=====
-dojo.number.__RealNumberRegexpFlags = function(){
- // places: Number?
- // The integer number of decimal places or a range given as "n,m". If
- // not given, the decimal part is optional and the number of places is
- // unlimited.
- // decimal: String?
- // A string for the character used as the decimal point. Default
- // is ".".
- // fractional: Boolean?|Array?
- // Whether decimal places are used. Can be true, false, or [true,
- // false]. Default is [true, false] which means optional.
- // exponent: Boolean?|Array?
- // Express in exponential notation. Can be true, false, or [true,
- // false]. Default is [true, false], (i.e. will match if the
- // exponential part is present are not).
- // eSigned: Boolean?|Array?
- // The leading plus-or-minus sign on the exponent. Can be true,
- // false, or [true, false]. Default is [true, false], (i.e. will
- // match if it is signed or unsigned). flags in regexp.integer can be
- // applied.
- this.places = places;
- this.decimal = decimal;
- this.fractional = fractional;
- this.exponent = exponent;
- this.eSigned = eSigned;
+ // If user connects to a widget method === this function, then they will
+ // instead actually be connecting the equivalent event on this.domNode
}
-=====*/
-
-dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*/flags){
- // summary:
- // Builds a regular expression to match a real number in exponential
- // notation
-
- // assign default values to missing parameters
- flags = flags || {};
- //TODO: use mixin instead?
- if(!("places" in flags)){ flags.places = Infinity; }
- if(typeof flags.decimal != "string"){ flags.decimal = "."; }
- if(!("fractional" in flags) || /^0/.test(flags.places)){ flags.fractional = [true, false]; }
- if(!("exponent" in flags)){ flags.exponent = [true, false]; }
- if(!("eSigned" in flags)){ flags.eSigned = [true, false]; }
-
- var integerRE = dojo.number._integerRegexp(flags),
- decimalRE = dojo.regexp.buildGroupRE(flags.fractional,
- function(q){
- var re = "";
- if(q && (flags.places!==0)){
- re = "\\" + flags.decimal;
- if(flags.places == Infinity){
- re = "(?:" + re + "\\d+)?";
- }else{
- re += "\\d{" + flags.places + "}";
- }
- }
- return re;
- },
- true
- );
- var exponentRE = dojo.regexp.buildGroupRE(flags.exponent,
- function(q){
- if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; }
- return "";
+// 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));
}
- );
-
- var realRE = integerRE + decimalRE;
- // allow for decimals without integers, e.g. .25
- if(decimalRE){realRE = "(?:(?:"+ realRE + ")|(?:" + decimalRE + "))";}
- return realRE + exponentRE; // String
-};
-
-/*=====
-dojo.number.__IntegerRegexpFlags = function(){
- // signed: Boolean?
- // The leading plus-or-minus sign. Can be true, false, or `[true,false]`.
- // Default is `[true, false]`, (i.e. will match if it is signed
- // or unsigned).
- // separator: String?
- // The character used as the thousands separator. Default is no
- // separator. For more than one symbol use an array, e.g. `[",", ""]`,
- // makes ',' optional.
- // groupSize: Number?
- // group size between separators
- // groupSize2: Number?
- // second grouping, where separators 2..n have a different interval than the first separator (for India)
- this.signed = signed;
- this.separator = separator;
- this.groupSize = groupSize;
- this.groupSize2 = groupSize2;
+ return originalConnect.apply(connect, arguments);
+ };
}
-=====*/
-
-dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags){
- // summary:
- // Builds a regular expression that matches an integer
-
- // assign default values to missing parameters
- flags = flags || {};
- if(!("signed" in flags)){ flags.signed = [true, false]; }
- if(!("separator" in flags)){
- flags.separator = "";
- }else if(!("groupSize" in flags)){
- flags.groupSize = 3;
- }
-
- var signRE = dojo.regexp.buildGroupRE(flags.signed,
- function(q){ return q ? "[-+]" : ""; },
- true
- );
-
- var numberRE = dojo.regexp.buildGroupRE(flags.separator,
- function(sep){
- if(!sep){
- return "(?:\\d+)";
- }
-
- sep = dojo.regexp.escapeString(sep);
- if(sep == " "){ sep = "\\s"; }
- else if(sep == "\xa0"){ sep = "\\s\\xa0"; }
-
- var grp = flags.groupSize, grp2 = flags.groupSize2;
- //TODO: should we continue to enforce that numbers with separators begin with 1-9? See #6933
- if(grp2){
- var grp2RE = "(?:0|[1-9]\\d{0," + (grp2-1) + "}(?:[" + sep + "]\\d{" + grp2 + "})*[" + sep + "]\\d{" + grp + "})";
- return ((grp-grp2) > 0) ? "(?:" + grp2RE + "|(?:0|[1-9]\\d{0," + (grp-1) + "}))" : grp2RE;
- }
- return "(?:0|[1-9]\\d{0," + (grp-1) + "}(?:[" + sep + "]\\d{" + grp + "})*)";
- },
- true
- );
-
- return signRE + numberRE; // String
-};
-
+aspect.around(connect, "connect", aroundAdvice);
+if(kernel.connect){
+ aspect.around(kernel, "connect", aroundAdvice);
}
-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.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
+var _Widget = declare("dijit._Widget", [_WidgetBase, _OnDijitClickMixin, _FocusMixin], {
// summary:
- // A progress indication widget, showing the amount completed
- // (often the percentage completed) of a task.
+ // Base class for all Dijit widgets.
//
- // 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: '',
+ // 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)
- 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"),
+ ////////////////// DEFERRED CONNECTS ///////////////////
- postMixInProperties: function(){
- this.inherited(arguments);
- if(!("value" in this.params)){
- this.value = this.indeterminate ? Infinity : this.progress;
- }
+ onClick: connectToDomNode,
+ /*=====
+ onClick: function(event){
+ // summary:
+ // Connect to this function to receive notifications of mouse click events.
+ // event:
+ // mouse Event
+ // tags:
+ // callback
},
-
- buildRendering: function(){
- this.inherited(arguments);
- this.indeterminateHighContrastImage.setAttribute("src",
- this._indeterminateHighContrastImagePath.toString());
- this.update();
+ =====*/
+ onDblClick: connectToDomNode,
+ /*=====
+ onDblClick: function(event){
+ // summary:
+ // Connect to this function to receive notifications of mouse double click events.
+ // event:
+ // mouse Event
+ // tags:
+ // callback
},
-
- update: function(/*Object?*/attributes){
+ =====*/
+ onKeyDown: connectToDomNode,
+ /*=====
+ onKeyDown: function(event){
// 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 ..." })
+ // Connect to this function to receive notifications of keys being pressed down.
+ // event:
+ // key Event
// 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();
+ // callback
},
-
- _setValueAttr: function(v){
- this._set("value", v);
- if(v == Infinity){
- this.update({indeterminate:true});
- }else{
- this.update({indeterminate:false, progress:v});
- }
+ =====*/
+ onKeyPress: connectToDomNode,
+ /*=====
+ onKeyPress: function(event){
+ // summary:
+ // Connect to this function to receive notifications of printable keys being typed.
+ // event:
+ // key Event
+ // tags:
+ // callback
},
-
- _setLabelAttr: function(label){
- this._set("label", label);
- this.update();
+ =====*/
+ onKeyUp: connectToDomNode,
+ /*=====
+ onKeyUp: function(event){
+ // summary:
+ // Connect to this function to receive notifications of keys being released.
+ // event:
+ // key Event
+ // tags:
+ // callback
},
-
- _setIndeterminateAttr: function(indeterminate){
- // Deprecated, use set("value", ...) instead
- this.indeterminate = indeterminate;
- this.update();
+ =====*/
+ 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
},
-
- report: function(/*float*/percent){
+ =====*/
+ onMouseMove: connectToDomNode,
+ /*=====
+ onMouseMove: function(event){
// summary:
- // Generates message to show inside progress bar (normally indicating amount of task completed).
- // May be overridden.
+ // Connect to this function to receive notifications of when the mouse moves over nodes contained within this widget.
+ // event:
+ // mouse Event
// tags:
- // extension
-
- return this.label ? this.label :
- (this.indeterminate ? "&nbsp;" : dojo.number.format(percent, { type: "percent", places: this.places, locale: this.lang }));
+ // callback
},
-
- onChange: function(){
+ =====*/
+ onMouseOut: connectToDomNode,
+ /*=====
+ onMouseOut: function(event){
// summary:
- // Callback fired when progress updates.
+ // Connect to this function to receive notifications of when the mouse moves off of nodes contained within this widget.
+ // event:
+ // mouse Event
// tags:
- // extension
- }
-});
-
-}
-
-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.declare("dijit.ToolbarSeparator",
- [ dijit._Widget, dijit._Templated ],
- {
+ // callback
+ },
+ =====*/
+ onMouseOver: connectToDomNode,
+ /*=====
+ onMouseOver: function(event){
// 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;
- }
-
- });
-
-}
-
-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");
-
-
-
-
-
-
-// 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]
- );
+ // Connect to this function to receive notifications of when the mouse moves onto nodes contained within this widget.
+ // event:
+ // mouse Event
+ // tags:
+ // callback
},
-
- startup: function(){
- if(this._started){ return; }
-
- this.startupKeyNavChildren();
-
- this.inherited(arguments);
- }
-}
-);
-
-}
-
-if(!dojo._hasResource["dojo.DeferredList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.DeferredList"] = true;
-dojo.provide("dojo.DeferredList");
-
-
-dojo.DeferredList = function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*Boolean?*/ fireOnOneErrback, /*Boolean?*/ consumeErrors, /*Function?*/ canceller){
- // summary:
- // Provides event handling for a group of Deferred objects.
- // description:
- // DeferredList takes an array of existing deferreds and returns a new deferred of its own
- // this new deferred will typically have its callback fired when all of the deferreds in
- // the given list have fired their own deferreds. The parameters `fireOnOneCallback` and
- // fireOnOneErrback, will fire before all the deferreds as appropriate
- //
- // list:
- // The list of deferreds to be synchronizied with this DeferredList
- // fireOnOneCallback:
- // Will cause the DeferredLists callback to be fired as soon as any
- // of the deferreds in its list have been fired instead of waiting until
- // the entire list has finished
- // fireonOneErrback:
- // Will cause the errback to fire upon any of the deferreds errback
- // canceller:
- // A deferred canceller function, see dojo.Deferred
- var resultList = [];
- dojo.Deferred.call(this);
- var self = this;
- if(list.length === 0 && !fireOnOneCallback){
- this.resolve([0, []]);
- }
- var finished = 0;
- dojo.forEach(list, function(item, i){
- item.then(function(result){
- if(fireOnOneCallback){
- self.resolve([i, result]);
- }else{
- addResult(true, result);
- }
- },function(error){
- if(fireOnOneErrback){
- self.reject(error);
- }else{
- addResult(false, error);
- }
- if(consumeErrors){
- return null;
- }
- throw error;
- });
- function addResult(succeeded, result){
- resultList[i] = [succeeded, result];
- finished++;
- if(finished === list.length){
- self.resolve(resultList);
- }
-
- }
- });
-};
-dojo.DeferredList.prototype = new dojo.Deferred();
-
-dojo.DeferredList.prototype.gatherResults= function(deferredList){
- // summary:
- // Gathers the results of the deferreds for packaging
- // as the parameters to the Deferred Lists' callback
-
- var d = new dojo.DeferredList(deferredList, false, true, false);
- d.addCallback(function(results){
- var ret = [];
- dojo.forEach(results, function(result){
- ret.push(result[1]);
- });
- return ret;
- });
- return d;
-};
-
-}
-
-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,
- {
+ =====*/
+ onMouseLeave: connectToDomNode,
+ /*=====
+ onMouseLeave: function(event){
// 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);
- }
- }
- });
-
-}
-
-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.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){
+ // 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:
- // Sets up variables, etc.
+ // Connect to this function to receive notifications of when the mouse moves onto this widget.
+ // event:
+ // mouse Event
// tags:
- // private
-
- // Make dummy root item
- this.root = {
- store: this,
- root: true,
- id: params.rootId,
- label: params.rootLabel,
- children: params.rootChildren // optional param
- };
+ // callback
},
-
- // =======================================================================
- // Methods for traversing hierarchy
-
- mayHaveChildren: function(/*dojo.data.Item*/ item){
+ =====*/
+ onMouseUp: connectToDomNode,
+ /*=====
+ onMouseUp: function(event){
// 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)
+ // Connect to this function to receive notifications of when the mouse button is released.
+ // event:
+ // mouse Event
// tags:
- // extension
- return item === this.root || this.inherited(arguments);
+ // callback
},
+ =====*/
- 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
- });
+ 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];
}
- }else{
- this.inherited(arguments);
}
},
- // =======================================================================
- // Inspecting items
-
- isItem: function(/* anything */ something){
- return (something === this.root) ? true : this.inherited(arguments);
- },
+ postCreate: function(){
+ 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);
+ // 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;
},
- getIdentity: function(/* item */ item){
- return (item === this.root) ? this.root.id : this.inherited(arguments);
+ 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);
},
- getLabel: function(/* item */ item){
- return (item === this.root) ? this.root.label : 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);
},
- // =======================================================================
- // Write interface
+ ////////////////// DEPRECATED METHODS ///////////////////
- newItem: function(/* dojo.dnd.Item */ args, /*Item*/ parent, /*int?*/ insertIndex){
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
// 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);
- }
+ // Deprecated. Use set() instead.
+ // tags:
+ // deprecated
+ kernel.deprecated(this.declaredClass+"::setAttribute(attr, value) is deprecated. Use set() instead.", "", "2.0");
+ this.set(attr, value);
},
- onNewRootItem: function(args){
+ attr: function(/*String|Object*/name, /*Object?*/value){
// 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
- },
+ // 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.
- 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);
+ // 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;
}
}
- 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);
+
+ var args = arguments.length;
+ if(args >= 2 || typeof name === "object"){ // setter
+ return this.set.apply(this, arguments);
+ }else{ // getter
+ return this.get(name);
}
},
- // =======================================================================
- // Handling for top level children
-
- onAddToRoot: function(/* item */ item){
+ getDescendants: function(){
// 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");
- },
+ // 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.
- 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");
+ kernel.deprecated(this.declaredClass+"::getDescendants() is deprecated. Use getChildren() instead.", "", "2.0");
+ return this.containerNode ? query('[widgetId]', this.containerNode).map(registry.byNode) : []; // dijit._Widget[]
},
- // =======================================================================
- // 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;
+ ////////////////// MISCELLANEOUS METHODS ///////////////////
- // 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);
- }
- })
- });
+ _onShow: function(){
+ // summary:
+ // Internal method called when this widget is made visible.
+ // See `onShow` for details.
+ this.onShow();
},
- onNewItem: function(/* dojo.data.Item */ item, /* Object */ parentInfo){
+ onShow: function(){
// 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).
+ // Called when this widget becomes the selected pane in a
+ // `dijit.layout.TabContainer`, `dijit.layout.StackContainer`,
+ // `dijit.layout.AccordionContainer`, etc.
//
- // 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.
+ // Also called to indicate display of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`.
// tags:
- // extension
- this._requeryTop();
-
- this.inherited(arguments);
+ // callback
},
- onDeleteItem: function(/*Object*/ item){
+ onHide: function(){
// 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);
+ // 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
},
- onSetItem: function(/* item */ item,
- /* attribute-name-string */ attribute,
- /* object | array */ oldValue,
- /* object | array */ newValue){
+ onClose: function(){
// 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.
+ // 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.
//
- // 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.
+ // 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
- this._requeryTop();
- this.inherited(arguments);
+ 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;
+});
-if(!dojo._hasResource["dojo.dnd.Container"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Container"] = true;
-dojo.provide("dojo.dnd.Container");
-
-
-
-
-/*
- Container states:
- "" - normal state
- "Over" - mouse over a container
- Container item states:
- "" - normal state
- "Over" - mouse over a container item
-*/
+},
+'dojo/touch':function(){
+define("dojo/touch", ["./_base/kernel", "./on", "./has", "./mouse"], function(dojo, on, has, mouse){
+// module:
+// dojo/touch
/*=====
-dojo.declare("dojo.dnd.__ContainerArgs", [], {
- creator: function(){
+ dojo.touch = {
// summary:
- // a creator function, which takes a data item, and returns an object like that:
- // {node: newNode, data: usedData, type: arrayOfStrings}
- },
-
- // skipForm: Boolean
- // don't start the drag operation, if clicked on form elements
- skipForm: false,
-
- // dropParent: Node||String
- // node or node's id to use as the parent node for dropped items
- // (must be underneath the 'node' parameter in the DOM)
- dropParent: null,
+ // This module provides unified touch event handlers by exporting
+ // press, move, release and cancel which can also run well on desktop.
+ // Based on http://dvcs.w3.org/hg/webevents/raw-file/tip/touchevents.html
+ //
+ // example:
+ // 1. Used with dojo.connect()
+ // | dojo.connect(node, dojo.touch.press, function(e){});
+ // | dojo.connect(node, dojo.touch.move, function(e){});
+ // | dojo.connect(node, dojo.touch.release, function(e){});
+ // | dojo.connect(node, dojo.touch.cancel, function(e){});
+ //
+ // 2. Used with dojo.on
+ // | define(["dojo/on", "dojo/touch"], function(on, touch){
+ // | on(node, touch.press, function(e){});
+ // | on(node, touch.move, function(e){});
+ // | on(node, touch.release, function(e){});
+ // | on(node, touch.cancel, function(e){});
+ //
+ // 3. Used with dojo.touch.* directly
+ // | dojo.touch.press(node, function(e){});
+ // | dojo.touch.move(node, function(e){});
+ // | dojo.touch.release(node, function(e){});
+ // | dojo.touch.cancel(node, function(e){});
+
+ press: function(node, listener){
+ // summary:
+ // Register a listener to 'touchstart'|'mousedown' for the given node
+ // node: Dom
+ // Target node to listen to
+ // listener: Function
+ // Callback function
+ // returns:
+ // A handle which will be used to remove the listener by handle.remove()
+ },
+ move: function(node, listener){
+ // summary:
+ // Register a listener to 'touchmove'|'mousemove' for the given node
+ // node: Dom
+ // Target node to listen to
+ // listener: Function
+ // Callback function
+ // returns:
+ // A handle which will be used to remove the listener by handle.remove()
+ },
+ release: function(node, listener){
+ // summary:
+ // Register a listener to 'touchend'|'mouseup' for the given node
+ // node: Dom
+ // Target node to listen to
+ // listener: Function
+ // Callback function
+ // returns:
+ // A handle which will be used to remove the listener by handle.remove()
+ },
+ cancel: function(node, listener){
+ // summary:
+ // Register a listener to 'touchcancel'|'mouseleave' for the given node
+ // node: Dom
+ // Target node to listen to
+ // listener: Function
+ // Callback function
+ // returns:
+ // A handle which will be used to remove the listener by handle.remove()
+ }
+ };
+=====*/
- // _skipStartup: Boolean
- // skip startup(), which collects children, for deferred initialization
- // (this is used in the markup mode)
- _skipStartup: false
+ function _handle(/*String - press | move | release | cancel*/type){
+ return function(node, listener){//called by on(), see dojo.on
+ return on(node, type, listener);
+ };
+ }
+ var touch = has("touch");
+ //device neutral events - dojo.touch.press|move|release|cancel
+ dojo.touch = {
+ press: _handle(touch ? "touchstart": "mousedown"),
+ move: _handle(touch ? "touchmove": "mousemove"),
+ release: _handle(touch ? "touchend": "mouseup"),
+ cancel: touch ? _handle("touchcancel") : mouse.leave
+ };
+ return dojo.touch;
});
-
-dojo.dnd.Item = function(){
+},
+'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",
+'dojo/fx':function(){
+define("dojo/fx", [
+ "./_base/lang",
+ "./Evented",
+ "./_base/kernel",
+ "./_base/array",
+ "./_base/connect",
+ "./_base/fx",
+ "./dom",
+ "./dom-style",
+ "./dom-geometry",
+ "./ready",
+ "require" // for context sensitive loading of Toggler
+], function(lang, Evented, dojo, arrayUtil, connect, baseFx, dom, domStyle, geom, ready, require) {
+
+ // module:
+ // dojo/fx
// summary:
- // Represents (one of) the source node(s) being dragged.
- // Contains (at least) the "type" and "data" attributes.
- // type: String[]
- // Type(s) of this item, by default this is ["text"]
- // data: Object
- // Logical representation of the object being dragged.
- // If the drag object's type is "text" then data is a String,
- // if it's another type then data could be a different Object,
- // perhaps a name/value hash.
-
- this.type = type;
- this.data = data;
-}
-=====*/
+ // TODOC
+
-dojo.declare("dojo.dnd.Container", null, {
- // summary:
- // a Container object, which knows when mouse hovers over it,
- // and over which element it hovers
-
- // object attributes (for markup)
- skipForm: false,
-
/*=====
- // current: DomNode
- // The DOM node the mouse is currently hovered over
- current: null,
-
- // map: Hash<String, dojo.dnd.Item>
- // Map from an item's id (which is also the DOMNode's id) to
- // the dojo.dnd.Item itself.
- map: {},
+ dojo.fx = {
+ // summary: Effects library on top of Base animations
+ };
+ var coreFx = dojo.fx;
=====*/
- constructor: function(node, params){
- // summary:
- // a constructor of the Container
- // node: Node
- // node or node's id to build the container on
- // params: dojo.dnd.__ContainerArgs
- // a dictionary of parameters
- this.node = dojo.byId(node);
- if(!params){ params = {}; }
- this.creator = params.creator || null;
- this.skipForm = params.skipForm;
- this.parent = params.dropParent && dojo.byId(params.dropParent);
-
- // class-specific variables
- this.map = {};
- this.current = null;
+// For back-compat, remove in 2.0.
+if(!dojo.isAsync){
+ ready(0, function(){
+ var requires = ["./fx/Toggler"];
+ require(requires); // use indirection so modules not rolled into a build
+ });
+}
- // states
- this.containerState = "";
- dojo.addClass(this.node, "dojoDndContainer");
-
- // mark up children
- if(!(params && params._skipStartup)){
- this.startup();
- }
+ var coreFx = dojo.fx = {};
- // set up events
- this.events = [
- dojo.connect(this.node, "onmouseover", this, "onMouseOver"),
- dojo.connect(this.node, "onmouseout", this, "onMouseOut"),
- // cancel text selection and text dragging
- dojo.connect(this.node, "ondragstart", this, "onSelectStart"),
- dojo.connect(this.node, "onselectstart", this, "onSelectStart")
- ];
- },
-
- // object attributes (for markup)
- creator: function(){
- // summary:
- // creator function, dummy at the moment
- },
-
- // abstract access to the map
- getItem: function(/*String*/ key){
- // summary:
- // returns a data item by its key (id)
- return this.map[key]; // dojo.dnd.Item
- },
- setItem: function(/*String*/ key, /*dojo.dnd.Item*/ data){
- // summary:
- // associates a data item with its key (id)
- this.map[key] = data;
- },
- delItem: function(/*String*/ key){
- // summary:
- // removes a data item from the map by its key (id)
- delete this.map[key];
- },
- forInItems: function(/*Function*/ f, /*Object?*/ o){
- // summary:
- // iterates over a data map skipping members that
- // are present in the empty object (IE and/or 3rd-party libraries).
- o = o || dojo.global;
- var m = this.map, e = dojo.dnd._empty;
- for(var i in m){
- if(i in e){ continue; }
- f.call(o, m[i], i, this);
- }
- return o; // Object
- },
- clearItems: function(){
- // summary:
- // removes all data items from the map
- this.map = {};
- },
-
- // methods
- getAllNodes: function(){
- // summary:
- // returns a list (an array) of all valid child nodes
- return dojo.query("> .dojoDndItem", this.parent); // NodeList
- },
- sync: function(){
- // summary:
- // sync up the node list with the data map
- var map = {};
- this.getAllNodes().forEach(function(node){
- if(node.id){
- var item = this.getItem(node.id);
- if(item){
- map[node.id] = item;
- return;
+ var _baseObj = {
+ _fire: function(evt, args){
+ if(this[evt]){
+ this[evt].apply(this, args||[]);
}
- }else{
- node.id = dojo.dnd.getUniqueId();
+ return this;
}
- var type = node.getAttribute("dndType"),
- data = node.getAttribute("dndData");
- map[node.id] = {
- data: data || node.innerHTML,
- type: type ? type.split(/\s*,\s*/) : ["text"]
- };
+ };
+
+ var _chain = function(animations){
+ this._index = -1;
+ this._animations = animations||[];
+ this._current = this._onAnimateCtx = this._onEndCtx = null;
+
+ this.duration = 0;
+ arrayUtil.forEach(this._animations, function(a){
+ this.duration += a.duration;
+ if(a.delay){ this.duration += a.delay; }
}, this);
- this.map = map;
- return this; // self
- },
- insertNodes: function(data, before, anchor){
- // summary:
- // inserts an array of new nodes before/after an anchor node
- // data: Array
- // a list of data items, which should be processed by the creator function
- // before: Boolean
- // insert before the anchor, if true, and after the anchor otherwise
- // anchor: Node
- // the anchor node to be used as a point of insertion
- if(!this.parent.firstChild){
- anchor = null;
- }else if(before){
- if(!anchor){
- anchor = this.parent.firstChild;
- }
- }else{
- if(anchor){
- anchor = anchor.nextSibling;
- }
- }
- if(anchor){
- for(var i = 0; i < data.length; ++i){
- var t = this._normalizedCreator(data[i]);
- this.setItem(t.node.id, {data: t.data, type: t.type});
- this.parent.insertBefore(t.node, anchor);
+ };
+ _chain.prototype = new Evented();
+ lang.extend(_chain, {
+ _onAnimate: function(){
+ this._fire("onAnimate", arguments);
+ },
+ _onEnd: function(){
+ connect.disconnect(this._onAnimateCtx);
+ connect.disconnect(this._onEndCtx);
+ this._onAnimateCtx = this._onEndCtx = null;
+ if(this._index + 1 == this._animations.length){
+ this._fire("onEnd");
+ }else{
+ // switch animations
+ this._current = this._animations[++this._index];
+ this._onAnimateCtx = connect.connect(this._current, "onAnimate", this, "_onAnimate");
+ this._onEndCtx = connect.connect(this._current, "onEnd", this, "_onEnd");
+ this._current.play(0, true);
}
- }else{
- for(var i = 0; i < data.length; ++i){
- var t = this._normalizedCreator(data[i]);
- this.setItem(t.node.id, {data: t.data, type: t.type});
- this.parent.appendChild(t.node);
+ },
+ play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
+ if(!this._current){ this._current = this._animations[this._index = 0]; }
+ if(!gotoStart && this._current.status() == "playing"){ return this; }
+ var beforeBegin = connect.connect(this._current, "beforeBegin", this, function(){
+ this._fire("beforeBegin");
+ }),
+ onBegin = connect.connect(this._current, "onBegin", this, function(arg){
+ this._fire("onBegin", arguments);
+ }),
+ onPlay = connect.connect(this._current, "onPlay", this, function(arg){
+ this._fire("onPlay", arguments);
+ connect.disconnect(beforeBegin);
+ connect.disconnect(onBegin);
+ connect.disconnect(onPlay);
+ });
+ if(this._onAnimateCtx){
+ connect.disconnect(this._onAnimateCtx);
}
- }
- return this; // self
- },
- destroy: function(){
- // summary:
- // prepares this object to be garbage-collected
- dojo.forEach(this.events, dojo.disconnect);
- this.clearItems();
- this.node = this.parent = this.current = null;
- },
-
- // markup methods
- markupFactory: function(params, node){
- params._skipStartup = true;
- return new dojo.dnd.Container(node, params);
- },
- startup: function(){
- // summary:
- // collects valid child items and populate the map
-
- // set up the real parent node
- if(!this.parent){
- // use the standard algorithm, if not assigned
- this.parent = this.node;
- if(this.parent.tagName.toLowerCase() == "table"){
- var c = this.parent.getElementsByTagName("tbody");
- if(c && c.length){ this.parent = c[0]; }
+ this._onAnimateCtx = connect.connect(this._current, "onAnimate", this, "_onAnimate");
+ if(this._onEndCtx){
+ connect.disconnect(this._onEndCtx);
}
- }
- this.defaultCreator = dojo.dnd._defaultCreator(this.parent);
-
- // process specially marked children
- this.sync();
- },
-
- // mouse events
- onMouseOver: function(e){
- // summary:
- // event processor for onmouseover
- // e: Event
- // mouse event
- var n = e.relatedTarget;
- while(n){
- if(n == this.node){ break; }
- try{
- n = n.parentNode;
- }catch(x){
- n = null;
+ this._onEndCtx = connect.connect(this._current, "onEnd", this, "_onEnd");
+ this._current.play.apply(this._current, arguments);
+ return this;
+ },
+ pause: function(){
+ if(this._current){
+ var e = connect.connect(this._current, "onPause", this, function(arg){
+ this._fire("onPause", arguments);
+ connect.disconnect(e);
+ });
+ this._current.pause();
}
- }
- if(!n){
- this._changeState("Container", "Over");
- this.onOverEvent();
- }
- n = this._getChildByEvent(e);
- if(this.current == n){ return; }
- if(this.current){ this._removeItemClass(this.current, "Over"); }
- if(n){ this._addItemClass(n, "Over"); }
- this.current = n;
- },
- onMouseOut: function(e){
- // summary:
- // event processor for onmouseout
- // e: Event
- // mouse event
- for(var n = e.relatedTarget; n;){
- if(n == this.node){ return; }
- try{
- n = n.parentNode;
- }catch(x){
- n = null;
+ return this;
+ },
+ gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){
+ this.pause();
+ var offset = this.duration * percent;
+ this._current = null;
+ arrayUtil.some(this._animations, function(a){
+ if(a.duration <= offset){
+ this._current = a;
+ return true;
+ }
+ offset -= a.duration;
+ return false;
+ });
+ if(this._current){
+ this._current.gotoPercent(offset / this._current.duration, andPlay);
}
- }
- if(this.current){
- this._removeItemClass(this.current, "Over");
- this.current = null;
- }
- this._changeState("Container", "");
- this.onOutEvent();
- },
- onSelectStart: function(e){
- // summary:
- // event processor for onselectevent and ondragevent
- // e: Event
- // mouse event
- if(!this.skipForm || !dojo.dnd.isFormElement(e)){
- dojo.stopEvent(e);
- }
- },
-
- // utilities
- onOverEvent: function(){
- // summary:
- // this function is called once, when mouse is over our container
- },
- onOutEvent: function(){
- // summary:
- // this function is called once, when mouse is out of our container
- },
- _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);
- },
- _getChildByEvent: function(e){
- // summary:
- // gets a child, which is under the mouse at the moment, or null
- // e: Event
- // a mouse event
- var node = e.target;
- if(node){
- for(var parent = node.parentNode; parent; node = parent, parent = node.parentNode){
- if(parent == this.parent && dojo.hasClass(node, "dojoDndItem")){ return node; }
+ return this;
+ },
+ stop: function(/*boolean?*/ gotoEnd){
+ if(this._current){
+ if(gotoEnd){
+ for(; this._index + 1 < this._animations.length; ++this._index){
+ this._animations[this._index].stop(true);
+ }
+ this._current = this._animations[this._index];
+ }
+ var e = connect.connect(this._current, "onStop", this, function(arg){
+ this._fire("onStop", arguments);
+ connect.disconnect(e);
+ });
+ this._current.stop();
}
+ return this;
+ },
+ status: function(){
+ return this._current ? this._current.status() : "stopped";
+ },
+ destroy: function(){
+ if(this._onAnimateCtx){ connect.disconnect(this._onAnimateCtx); }
+ if(this._onEndCtx){ connect.disconnect(this._onEndCtx); }
}
- return null;
- },
- _normalizedCreator: function(/*dojo.dnd.Item*/ item, /*String*/ hint){
- // summary:
- // adds all necessary data to the output of the user-supplied creator function
- var t = (this.creator || this.defaultCreator).call(this, item, hint);
- if(!dojo.isArray(t.type)){ t.type = ["text"]; }
- if(!t.node.id){ t.node.id = dojo.dnd.getUniqueId(); }
- dojo.addClass(t.node, "dojoDndItem");
- return t;
- }
-});
+ });
+ lang.extend(_chain, _baseObj);
-dojo.dnd._createNode = function(tag){
- // summary:
- // returns a function, which creates an element of given tag
- // (SPAN by default) and sets its innerHTML to given text
- // tag: String
- // a tag name or empty for SPAN
- if(!tag){ return dojo.dnd._createSpan; }
- return function(text){ // Function
- return dojo.create(tag, {innerHTML: text}); // Node
+ coreFx.chain = /*===== dojo.fx.chain = =====*/ function(/*dojo.Animation[]*/ animations){
+ // summary:
+ // Chain a list of `dojo.Animation`s to run in sequence
+ //
+ // description:
+ // Return a `dojo.Animation` which will play all passed
+ // `dojo.Animation` instances in sequence, firing its own
+ // synthesized events simulating a single animation. (eg:
+ // onEnd of this animation means the end of the chain,
+ // not the individual animations within)
+ //
+ // example:
+ // Once `node` is faded out, fade in `otherNode`
+ // | dojo.fx.chain([
+ // | dojo.fadeIn({ node:node }),
+ // | dojo.fadeOut({ node:otherNode })
+ // | ]).play();
+ //
+ return new _chain(animations); // dojo.Animation
};
-};
-
-dojo.dnd._createTrTd = function(text){
- // summary:
- // creates a TR/TD structure with given text as an innerHTML of TD
- // text: String
- // a text for TD
- var tr = dojo.create("tr");
- dojo.create("td", {innerHTML: text}, tr);
- return tr; // Node
-};
-dojo.dnd._createSpan = function(text){
- // summary:
- // creates a SPAN element with given text as its innerHTML
- // text: String
- // a text for SPAN
- return dojo.create("span", {innerHTML: text}); // Node
-};
+ var _combine = function(animations){
+ this._animations = animations||[];
+ this._connects = [];
+ this._finished = 0;
-// dojo.dnd._defaultCreatorNodes: Object
-// a dictionary that maps container tag names to child tag names
-dojo.dnd._defaultCreatorNodes = {ul: "li", ol: "li", div: "div", p: "div"};
+ this.duration = 0;
+ arrayUtil.forEach(animations, function(a){
+ var duration = a.duration;
+ if(a.delay){ duration += a.delay; }
+ if(this.duration < duration){ this.duration = duration; }
+ this._connects.push(connect.connect(a, "onEnd", this, "_onEnd"));
+ }, this);
-dojo.dnd._defaultCreator = function(node){
- // summary:
- // takes a parent node, and returns an appropriate creator function
- // node: Node
- // a container node
- var tag = node.tagName.toLowerCase();
- var c = tag == "tbody" || tag == "thead" ? dojo.dnd._createTrTd :
- dojo.dnd._createNode(dojo.dnd._defaultCreatorNodes[tag]);
- return function(item, hint){ // Function
- var isObj = item && dojo.isObject(item), data, type, n;
- if(isObj && item.tagName && item.nodeType && item.getAttribute){
- // process a DOM node
- data = item.getAttribute("dndData") || item.innerHTML;
- type = item.getAttribute("dndType");
- type = type ? type.split(/\s*,\s*/) : ["text"];
- n = item; // this node is going to be moved rather than copied
- }else{
- // process a DnD item object or a string
- data = (isObj && item.data) ? item.data : item;
- type = (isObj && item.type) ? item.type : ["text"];
- n = (hint == "avatar" ? dojo.dnd._createSpan : c)(String(data));
- }
- if(!n.id){
- n.id = dojo.dnd.getUniqueId();
- }
- return {node: n, data: data, type: type};
+ this._pseudoAnimation = new baseFx.Animation({curve: [0, 1], duration: this.duration});
+ var self = this;
+ arrayUtil.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop", "onEnd"],
+ function(evt){
+ self._connects.push(connect.connect(self._pseudoAnimation, evt,
+ function(){ self._fire(evt, arguments); }
+ ));
+ }
+ );
};
-};
-
-}
-
-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.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
+ lang.extend(_combine, {
+ _doAction: function(action, args){
+ arrayUtil.forEach(this._animations, function(a){
+ a[action].apply(a, args);
+ });
+ return this;
},
-
- destroy: function(){
- // summary:
- // Prepares this object to be garbage-collected
-
- dojo.forEach(this.events, dojo.disconnect);
- // this.clearItems();
- this.node = this.parent = null;
+ _onEnd: function(){
+ if(++this._finished > this._animations.length){
+ this._fire("onEnd");
+ }
},
-
- // mouse events
- onMouseOver: function(/*TreeNode*/ widget, /*Event*/ evt){
- // summary:
- // Called when mouse is moved over a TreeNode
- // tags:
- // protected
- this.current = widget;
+ _call: function(action, args){
+ var t = this._pseudoAnimation;
+ t[action].apply(t, args);
},
-
- onMouseOut: function(/*TreeNode*/ widget, /*Event*/ evt){
- // summary:
- // Called when mouse is moved away from a TreeNode
- // tags:
- // protected
- this.current = null;
+ play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
+ this._finished = 0;
+ this._doAction("play", arguments);
+ this._call("play", arguments);
+ return this;
},
-
- _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;
+ pause: function(){
+ this._doAction("pause", arguments);
+ this._call("pause", arguments);
+ return this;
},
-
- _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);
+ gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){
+ var ms = this.duration * percent;
+ arrayUtil.forEach(this._animations, function(a){
+ a.gotoPercent(a.duration < ms ? 1 : (ms / a.duration), andPlay);
+ });
+ this._call("gotoPercent", arguments);
+ return this;
},
-
- _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);
+ stop: function(/*boolean?*/ gotoEnd){
+ this._doAction("stop", arguments);
+ this._call("stop", arguments);
+ return this;
},
-
- onOverEvent: function(){
- // summary:
- // This function is called once, when mouse is over our container
- // tags:
- // protected
- this._changeState("Container", "Over");
+ status: function(){
+ return this._pseudoAnimation.status();
},
-
- onOutEvent: function(){
- // summary:
- // This function is called once, when mouse is out of our container
- // tags:
- // protected
- this._changeState("Container", "");
+ destroy: function(){
+ arrayUtil.forEach(this._connects, connect.disconnect);
}
-});
+ });
+ lang.extend(_combine, _baseObj);
-}
+ coreFx.combine = /*===== dojo.fx.combine = =====*/ function(/*dojo.Animation[]*/ animations){
+ // summary:
+ // Combine a list of `dojo.Animation`s to run in parallel
+ //
+ // description:
+ // Combine an array of `dojo.Animation`s to run in parallel,
+ // providing a new `dojo.Animation` instance encompasing each
+ // animation, firing standard animation events.
+ //
+ // example:
+ // Fade out `node` while fading in `otherNode` simultaneously
+ // | dojo.fx.combine([
+ // | dojo.fadeIn({ node:node }),
+ // | dojo.fadeOut({ node:otherNode })
+ // | ]).play();
+ //
+ // example:
+ // When the longest animation ends, execute a function:
+ // | var anim = dojo.fx.combine([
+ // | dojo.fadeIn({ node: n, duration:700 }),
+ // | dojo.fadeOut({ node: otherNode, duration: 300 })
+ // | ]);
+ // | dojo.connect(anim, "onEnd", function(){
+ // | // overall animation is done.
+ // | });
+ // | anim.play(); // play the animation
+ //
+ return new _combine(animations); // dojo.Animation
+ };
-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");
+ coreFx.wipeIn = /*===== dojo.fx.wipeIn = =====*/ function(/*Object*/ args){
+ // summary:
+ // Expand a node to it's natural height.
+ //
+ // description:
+ // Returns an animation that will expand the
+ // node defined in 'args' object from it's current height to
+ // it's natural height (with no scrollbar).
+ // Node must have no margin/border/padding.
+ //
+ // args: Object
+ // A hash-map of standard `dojo.Animation` constructor properties
+ // (such as easing: node: duration: and so on)
+ //
+ // example:
+ // | dojo.fx.wipeIn({
+ // | node:"someId"
+ // | }).play()
+ var node = args.node = dom.byId(args.node), s = node.style, o;
+ var anim = baseFx.animateProperty(lang.mixin({
+ properties: {
+ height: {
+ // wrapped in functions so we wait till the last second to query (in case value has changed)
+ start: function(){
+ // start at current [computed] height, but use 1px rather than 0
+ // because 0 causes IE to display the whole panel
+ o = s.overflow;
+ s.overflow = "hidden";
+ if(s.visibility == "hidden" || s.display == "none"){
+ s.height = "1px";
+ s.display = "";
+ s.visibility = "";
+ return 1;
+ }else{
+ var height = domStyle.get(node, "height");
+ return Math.max(height, 1);
+ }
+ },
+ end: function(){
+ return node.scrollHeight;
+ }
+ }
+ }
+ }, args));
+ var fini = function(){
+ s.height = "auto";
+ s.overflow = o;
+ };
+ connect.connect(anim, "onStop", fini);
+ connect.connect(anim, "onEnd", fini);
+ return anim; // dojo.Animation
+ };
-dojo.declare("dijit.tree._dndSelector",
- dijit.tree._dndContainer,
- {
+ coreFx.wipeOut = /*===== dojo.fx.wipeOut = =====*/ function(/*Object*/ args){
// 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
+ // Shrink a node to nothing and hide it.
+ //
+ // description:
+ // Returns an animation that will shrink node defined in "args"
+ // from it's current height to 1px, and then hide it.
+ //
+ // args: Object
+ // A hash-map of standard `dojo.Animation` constructor properties
+ // (such as easing: node: duration: and so on)
+ //
+ // example:
+ // | dojo.fx.wipeOut({ node:"someId" }).play()
- /*=====
- // selection: Hash<String, DomNode>
- // (id, DomNode) map for every TreeNode that's currently selected.
- // The DOMNode is the TreeNode.rowNode.
- selection: {},
- =====*/
+ var node = args.node = dom.byId(args.node), s = node.style, o;
- constructor: function(tree, params){
- // summary:
- // Initialization
- // tags:
- // private
+ var anim = baseFx.animateProperty(lang.mixin({
+ properties: {
+ height: {
+ end: 1 // 0 causes IE to display the whole panel
+ }
+ }
+ }, args));
- this.selection={};
- this.anchor = null;
+ connect.connect(anim, "beforeBegin", function(){
+ o = s.overflow;
+ s.overflow = "hidden";
+ s.display = "";
+ });
+ var fini = function(){
+ s.overflow = o;
+ s.height = "auto";
+ s.display = "none";
+ };
+ connect.connect(anim, "onStop", fini);
+ connect.connect(anim, "onEnd", fini);
- dijit.setWaiState(this.tree.domNode, "multiselect", !this.singular);
+ return anim; // dojo.Animation
+ };
- 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")
- );
- },
+ coreFx.slideTo = /*===== dojo.fx.slideTo = =====*/ function(/*Object*/ args){
+ // summary:
+ // Slide a node to a new top/left position
+ //
+ // description:
+ // Returns an animation that will slide "node"
+ // defined in args Object from its current position to
+ // the position defined by (args.left, args.top).
+ //
+ // args: Object
+ // A hash-map of standard `dojo.Animation` constructor properties
+ // (such as easing: node: duration: and so on). Special args members
+ // are `top` and `left`, which indicate the new position to slide to.
+ //
+ // example:
+ // | .slideTo({ node: node, left:"40", top:"50", units:"px" }).play()
- // 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,
+ var node = args.node = dom.byId(args.node),
+ top = null, left = null;
- // 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]);
+ var init = (function(n){
+ return function(){
+ var cs = domStyle.getComputedStyle(n);
+ var pos = cs.position;
+ top = (pos == 'absolute' ? n.offsetTop : parseInt(cs.top) || 0);
+ left = (pos == 'absolute' ? n.offsetLeft : parseInt(cs.left) || 0);
+ if(pos != 'absolute' && pos != 'relative'){
+ var ret = geom.position(n, true);
+ top = ret.y;
+ left = ret.x;
+ n.style.position="absolute";
+ n.style.top=top+"px";
+ n.style.left=left+"px";
+ }
+ };
+ })(node);
+ init();
+
+ var anim = baseFx.animateProperty(lang.mixin({
+ properties: {
+ top: args.top || 0,
+ left: args.left || 0
}
- return nodes;
- },
+ }, args));
+ connect.connect(anim, "beforeBegin", anim, init);
- selectNone: function(){
- // summary:
- // Unselects all items
- // tags:
- // private
+ return anim; // dojo.Animation
+ };
- this.setSelection([]);
- return this; // self
- },
+ return coreFx;
+});
- 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.
+},
+'dijit/_DialogMixin':function(){
+define("dijit/_DialogMixin", [
+ "dojo/_base/declare", // declare
+ "./a11y" // _getTabNavigable
+], function(declare, a11y){
+
+ // module:
+ // dijit/_DialogMixin
+ // summary:
+ // _DialogMixin provides functions useful to Dialog and TooltipDialog
- 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 declare("dijit._DialogMixin", null, {
+ // summary:
+ // This provides functions useful to Dialog and TooltipDialog
- 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();
+ 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
},
- _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){
+ onCancel: function(){
// summary:
- // Event processor for onmousedown
- // e: Event
- // mouse event
- // tags:
+ // 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
-
- // 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){
+ onExecute: function(){
// summary:
- // Event processor for onmouseup
- // e: Event
- // mouse event
- // tags:
+ // 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
-
- // _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){
+ _onSubmit: function(){
// 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:
+ // Callback when user hits submit button
+ // type:
// 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;
- }
- }
- }
+ this.onExecute(); // notify container that we are about to execute
+ this.execute(this.get('value'));
},
- forInSelectedItems: function(/*Function*/ f, /*Object?*/ o){
+ _getFocusItems: function(){
// 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);
- }
+ // 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;
}
+ });
});
-}
-
-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");
-
-
-
-
-
-
-
-
-
+},
+'dijit/Tree':function(){
+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
-dojo.declare(
+var TreeNode = declare(
"dijit._TreeNode",
- [dijit._Widget, dijit._Templated, dijit._Container, dijit._Contained, dijit._CssStateMixin],
+ [_Widget, _TemplatedMixin, _Container, _Contained, _CssStateMixin],
{
// summary:
// Single node within a tree. This class is used internally
@@ -23590,7 +30549,7 @@ dojo.declare(
// tags:
// private
- // item: [const] dojo.data.Item
+ // item: [const] Item
// the dojo.data entry this tree represents
item: null,
@@ -23602,6 +30561,7 @@ dojo.declare(
// 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)
@@ -23617,7 +30577,7 @@ dojo.declare(
// 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"),
+ templateString: treeNodeTemplate,
baseClass: "dijitTreeNode",
@@ -23627,10 +30587,8 @@ dojo.declare(
labelNode: "dijitTreeLabel"
},
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- label: {node: "labelNode", type: "innerText"},
- tooltip: {node: "rowNode", type: "attribute", attribute: "title"}
- }),
+ // 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);
@@ -23642,7 +30600,7 @@ dojo.declare(
this._updateItemClasses(this.item);
if(this.isExpandable){
- dijit.setWaiState(this.labelNode, "expanded", this.isExpanded);
+ this.labelNode.setAttribute("aria-expanded", this.isExpanded);
}
//aria-selected should be false on all selectable elements.
@@ -23659,13 +30617,13 @@ dojo.declare(
// 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);
+ domStyle.set(this.domNode, "backgroundPosition", pixels + " 0px");
+ domStyle.set(this.rowNode, this.isLeftToRight() ? "paddingLeft" : "paddingRight", pixels);
- dojo.forEach(this.getChildren(), function(child){
+ array.forEach(this.getChildren(), function(child){
child.set("indent", indent+1);
});
-
+
this._set("indent", indent);
},
@@ -23723,9 +30681,9 @@ dojo.declare(
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) || {});
+ domClass.replace(this[nodeName], this[clsName] || "", oldCls || "");
+
+ domStyle.set(this[nodeName], this.tree["get" + upper + "Style"](item, this.isExpanded) || {});
},
_updateLayout: function(){
@@ -23734,11 +30692,11 @@ dojo.declare(
// tags:
// private
var parent = this.getParent();
- if(!parent || parent.rowNode.style.display == "none"){
+ 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 */
- dojo.addClass(this.domNode, "dijitTreeIsRoot");
+ domClass.add(this.domNode, "dijitTreeIsRoot");
}else{
- dojo.toggleClass(this.domNode, "dijitTreeIsLast", !this.getNextSibling());
+ domClass.toggle(this.domNode, "dijitTreeIsLast", !this.getNextSibling());
}
},
@@ -23754,7 +30712,7 @@ dojo.declare(
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);
+ domClass.replace(this.expandoNode, styles[idx], styles);
// provide a non-image based indicator for images-off mode
this.expandoNodeText.innerHTML = _a11yStates[idx];
@@ -23778,27 +30736,27 @@ dojo.declare(
// 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");
+ this.labelNode.setAttribute("aria-expanded", "true");
if(this.tree.showRoot || this !== this.tree.rootNode){
- dijit.setWaiRole(this.containerNode, "group");
+ this.containerNode.setAttribute("role", "group");
}
- dojo.addClass(this.contentNode,'dijitTreeContentExpanded');
+ domClass.add(this.contentNode,'dijitTreeContentExpanded');
this._setExpando();
this._updateItemClasses(this.item);
if(this == this.tree.rootNode){
- dijit.setWaiState(this.tree.domNode, "expanded", "true");
+ this.tree.domNode.setAttribute("aria-expanded", "true");
}
var def,
- wipeIn = dojo.fx.wipeIn({
- node: this.containerNode, duration: dijit.defaultDuration,
+ 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 dojo.Deferred(function(){
+ def = (this._expandDeferred = new Deferred(function(){
// Canceller
wipeIn.stop();
}));
@@ -23821,17 +30779,17 @@ dojo.declare(
}
this.isExpanded = false;
- dijit.setWaiState(this.labelNode, "expanded", "false");
+ this.labelNode.setAttribute("aria-expanded", "false");
if(this == this.tree.rootNode){
- dijit.setWaiState(this.tree.domNode, "expanded", "false");
+ this.tree.domNode.setAttribute("aria-expanded", "false");
}
- dojo.removeClass(this.contentNode,'dijitTreeContentExpanded');
+ domClass.remove(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 = fxUtils.wipeOut({
+ node: this.containerNode, duration: manager.defaultDuration
});
}
this._wipeOut.play();
@@ -23859,8 +30817,8 @@ dojo.declare(
// 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);
+ array.forEach(this.getChildren(), function(child){
+ _Container.prototype.removeChild.call(this, child);
}, this);
this.state = "LOADED";
@@ -23871,7 +30829,7 @@ dojo.declare(
// 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){
+ array.forEach(items, function(item){
var id = model.getIdentity(item),
existingNodes = tree._itemNodesMap[id],
node;
@@ -23893,6 +30851,7 @@ dojo.declare(
tooltip: tree.getTooltip(item),
dir: tree.dir,
lang: tree.lang,
+ textDir: tree.textDir,
indent: this.indent + 1
});
if(existingNodes){
@@ -23905,14 +30864,14 @@ dojo.declare(
// 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)){
+ 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
- dojo.forEach(this.getChildren(), function(child, idx){
+ array.forEach(this.getChildren(), function(child){
child._updateLayout();
});
}else{
@@ -23940,7 +30899,7 @@ dojo.declare(
}
}
- return new dojo.DeferredList(defs); // dojo.Deferred
+ return new DeferredList(defs); // dojo.Deferred
},
getTreePath: function(){
@@ -23955,7 +30914,7 @@ dojo.declare(
return path;
},
- getIdentity: function() {
+ getIdentity: function(){
return this.tree.model.getIdentity(this.item);
},
@@ -23968,7 +30927,7 @@ dojo.declare(
this.collapse();
}
- dojo.forEach(children, function(child){
+ array.forEach(children, function(child){
child._updateLayout();
});
},
@@ -23984,7 +30943,7 @@ dojo.declare(
this._setExpando(false);
},
- _onLabelFocus: function(evt){
+ _onLabelFocus: function(){
// summary:
// Called when this row is focused (possibly programatically)
// Note that we aren't using _onFocus() builtin to dijit
@@ -24001,8 +30960,8 @@ dojo.declare(
// 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);
+ this.labelNode.setAttribute("aria-selected", selected);
+ domClass.toggle(this.rowNode, "dijitTreeRowSelected", selected);
},
setFocusable: function(/*Boolean*/ selected){
@@ -24045,13 +31004,20 @@ dojo.declare(
// 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);
+ }
}
});
-dojo.declare(
- "dijit.Tree",
- [dijit._Widget, dijit._Templated],
-{
+var Tree = declare("dijit.Tree", [_Widget, _TemplatedMixin], {
// summary:
// This widget displays hierarchical data from a store.
@@ -24091,7 +31057,7 @@ dojo.declare(
// 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: [],
@@ -24115,7 +31081,7 @@ dojo.declare(
// 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"),
+ templateString: treeTemplate,
// persist: Boolean
// Enables/disables use of cookies for state saving.
@@ -24125,11 +31091,11 @@ dojo.declare(
// 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",
+ // 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"],
@@ -24238,7 +31204,7 @@ dojo.declare(
_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 || {})]);
+ topic.publish(this.id, lang.mixin({tree: this, event: topicName}, message || {})); // publish
},
postMixInProperties: function(){
@@ -24252,11 +31218,11 @@ dojo.declare(
this._itemNodesMap={};
- if(!this.cookieName){
+ if(!this.cookieName && this.id){
this.cookieName = this.id + "SaveStateCookie";
}
- this._loadDeferred = new dojo.Deferred();
+ this._loadDeferred = new Deferred();
this.inherited(arguments);
},
@@ -24279,8 +31245,8 @@ dojo.declare(
this.inherited(arguments);
if(this.dndController){
- if(dojo.isString(this.dndController)){
- this.dndController = dojo.getObject(this.dndController);
+ if(lang.isString(this.dndController)){
+ this.dndController = lang.getObject(this.dndController);
}
var params={};
for(var i=0; i<this.dndParams.length;i++){
@@ -24296,7 +31262,7 @@ dojo.declare(
// 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");
+ kernel.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");
var modelParams = {
id: this.id + "_ForestStoreModel",
@@ -24307,15 +31273,15 @@ dojo.declare(
// Only override the model's mayHaveChildren() method if the user has specified an override
if(this.params.mayHaveChildren){
- modelParams.mayHaveChildren = dojo.hitch(this, "mayHaveChildren");
+ modelParams.mayHaveChildren = lang.hitch(this, "mayHaveChildren");
}
if(this.params.getItemChildren){
- modelParams.getChildren = dojo.hitch(this, function(item, onComplete, onError){
+ modelParams.getChildren = lang.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);
+ 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
@@ -24337,22 +31303,23 @@ dojo.declare(
// Initial load of the tree.
// Load root node (possibly hidden) and it's children.
this.model.getRoot(
- dojo.hitch(this, function(item){
+ 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
- dijit.setWaiRole(this.domNode, 'presentation');
-
- dijit.setWaiRole(rn.labelNode, 'presentation');
- dijit.setWaiRole(rn.containerNode, 'tree');
+ 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);
@@ -24365,7 +31332,7 @@ dojo.declare(
rn._updateLayout(); // sets "dijitTreeIsRoot" CSS classname
// load top level children and then fire onLoad() event
- this._expandNode(rn).addCallback(dojo.hitch(this, function(){
+ this._expandNode(rn).addCallback(lang.hitch(this, function(){
this._loadDeferred.callback(true);
this.onLoad();
}));
@@ -24376,34 +31343,34 @@ dojo.declare(
);
},
- getNodesByItem: function(/*dojo.data.Item or id*/ item){
+ 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 = dojo.isString(item) ? item : this.model.getIdentity(item);
+ 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(/*dojo.data.Item or id*/ item){
+ _setSelectedItemAttr: function(/*Item or id*/ item){
this.set('selectedItems', [item]);
},
- _setSelectedItemsAttr: function(/*dojo.data.Items or ids*/ items){
+ _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( dojo.hitch(this, function(){
- var identities = dojo.map(items, function(item){
- return (!item || dojo.isString(item)) ? item : tree.model.getIdentity(item);
+ 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 = [];
- dojo.forEach(identities, function(id){
+ array.forEach(identities, function(id){
nodes = nodes.concat(tree._itemNodesMap[id] || []);
});
this.set('selectedNodes', nodes);
@@ -24413,14 +31380,14 @@ dojo.declare(
_setPathAttr: function(/*Item[] || String[]*/ path){
// summary:
// Singular variant of _setPathsAttr
- if(path.length) {
+ if(path.length){
return this.set("paths", [path]);
- } else {
- //Empty list is interpreted as "select nothing"
+ }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.
@@ -24433,12 +31400,12 @@ dojo.declare(
// 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();
-
+ return new DeferredList(array.map(paths, function(path){
+ var d = new Deferred();
+
// normalize path to use identity
- path = dojo.map(path, function(item){
- return dojo.isString(item) ? item : tree.model.getIdentity(item);
+ path = array.map(path, function(item){
+ return lang.isString(item) ? item : tree.model.getIdentity(item);
});
if(path.length){
@@ -24453,7 +31420,7 @@ dojo.declare(
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){
+ var nextNode = array.filter(nodes, function(node){
return node.getIdentity() == nextPath;
})[0];
if(!!nextNode){
@@ -24463,16 +31430,16 @@ dojo.declare(
//Successfully reached the end of this path
def.callback(nextNode);
}
- } else {
+ }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];}),
+ tree.set("selectedNodes", array.map(
+ array.filter(newNodes,function(x){return x[0];}),
function(x){return x[1];}));
}
},
@@ -24481,7 +31448,7 @@ dojo.declare(
this.set('selectedNodes', [node]);
},
_setSelectedNodesAttr: function(nodes){
- this._loadDeferred.addCallback( dojo.hitch(this, function(){
+ this._loadDeferred.addCallback( lang.hitch(this, function(){
this.dndController.setSelection(nodes);
}));
},
@@ -24490,7 +31457,7 @@ dojo.declare(
////////////// Data store related functions //////////////////////
// These just get passed to the model; they are here for back-compat
- mayHaveChildren: function(/*dojo.data.Item*/ item){
+ mayHaveChildren: function(/*dojo.data.Item*/ /*===== item =====*/){
// summary:
// Deprecated. This should be specified on the model itself.
//
@@ -24502,7 +31469,7 @@ dojo.declare(
// deprecated
},
- getItemChildren: function(/*dojo.data.Item*/ parentItem, /*function(items)*/ onComplete){
+ getItemChildren: function(/*===== parentItem, onComplete =====*/){
// summary:
// Deprecated. This should be specified on the model itself.
//
@@ -24530,48 +31497,62 @@ dojo.declare(
return (!item || this.model.mayHaveChildren(item)) ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "dijitLeaf"
},
- getLabelClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+ 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(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+ 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(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+ getIconStyle: function(/*===== item, opened =====*/){
// summary:
// Overridable function to return CSS styles to display icon
- // returns:
+ // item: dojo.data.Item
+ // opened: Boolean
+ // returns: Object
// Object suitable for input to dojo.style() like {backgroundImage: "url(...)"}
// tags:
// extension
},
- getLabelStyle: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+ 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(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+ 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){
+ getTooltip: function(/*dojo.data.Item*/ /*===== item =====*/){
// summary:
// Overridable function to get the tooltip for a tree node (given the item)
// tags:
@@ -24585,8 +31566,7 @@ dojo.declare(
// summary:
// Translates keypress events into commands for the controller
if(e.altKey){ return; }
- var dk = dojo.keys;
- var treeNode = dijit.getEnclosingWidget(e.target);
+ var treeNode = registry.getEnclosingWidget(e.target);
if(!treeNode){ return; }
var key = e.charOrCode;
@@ -24594,7 +31574,7 @@ dojo.declare(
// Check for key navigation.
if(!e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey){
this._onLetterKeyNav( { node: treeNode, key: key.toLowerCase() } );
- dojo.stopEvent(e);
+ event.stop(e);
}
}else{ // handle non-printables (arrow keys)
// clear record of recent printables (being saved for multi-char letter navigation),
@@ -24608,30 +31588,30 @@ dojo.declare(
if(!map){
// setup table mapping keys to events
map = {};
- map[dk.ENTER]="_onEnterKey";
+ 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[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";
+ 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 } );
- dojo.stopEvent(e);
+ event.stop(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.dndController.userSelect(message.node, connect.isCopyKey( message.evt ), message.evt.shiftKey);
this.onClick(message.item, message.node, message.evt);
},
@@ -24716,7 +31696,7 @@ dojo.declare(
}
},
- _onEndKey: function(/*Object*/ message){
+ _onEndKey: function(){
// summary:
// End key pressed; go to last visible node.
@@ -24787,7 +31767,7 @@ dojo.declare(
isExpandoNode: function(node, widget){
// summary:
// check whether a dom node is the expandoNode for a particular TreeNode widget
- return dojo.isDescendant(node, widget.expandoNode);
+ return dom.isDescendant(node, widget.expandoNode);
},
_onClick: function(/*TreeNode*/ nodeWidget, /*Event*/ e){
// summary:
@@ -24806,7 +31786,7 @@ dojo.declare(
this.onClick(nodeWidget.item, nodeWidget, e);
this.focusNode(nodeWidget);
}
- dojo.stopEvent(e);
+ event.stop(e);
},
_onDblClick: function(/*TreeNode*/ nodeWidget, /*Event*/ e){
// summary:
@@ -24825,7 +31805,7 @@ dojo.declare(
this.onDblClick(nodeWidget.item, nodeWidget, e);
this.focusNode(nodeWidget);
}
- dojo.stopEvent(e);
+ event.stop(e);
},
_onExpandoClick: function(/*Object*/ message){
@@ -24845,27 +31825,37 @@ dojo.declare(
}
},
- onClick: function(/* dojo.data */ item, /*TreeNode*/ node, /*Event*/ evt){
+ 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(/* dojo.data */ item, /*TreeNode*/ node, /*Event*/ evt){
+ 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(/* dojo.data */ item, /*TreeNode*/ node){
+ onOpen: function(/*===== item, node =====*/){
// summary:
// Callback when a node is opened
+ // item: dojo.data.Item
+ // node: TreeNode
// tags:
// callback
},
- onClose: function(/* dojo.data */ item, /*TreeNode*/ node){
+ onClose: function(/*===== item, node =====*/){
// summary:
// Callback when a node is closed
+ // item: dojo.data.Item
+ // node: TreeNode
// tags:
// callback
},
@@ -24913,10 +31903,7 @@ dojo.declare(
node.collapse();
this.onClose(node.item, node);
- if(node.item){
- this._state(node.item,false);
- this._saveState();
- }
+ this._state(node, false);
}
},
@@ -24945,7 +31932,7 @@ dojo.declare(
// 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());
+ var def = (node._expandNodeDeferred = new Deferred());
// Get the children
model.getChildren(
@@ -24982,10 +31969,7 @@ dojo.declare(
this.onOpen(node.item, node);
- if(item){
- this._state(item, true);
- this._saveState();
- }
+ this._state(node, true);
}
return def; // dojo.Deferred
@@ -25000,7 +31984,7 @@ dojo.declare(
// protected
// set focus so that the label will be voiced using screen readers
- dijit.focus(node.labelNode);
+ focus.focus(node.labelNode);
},
_onNodeFocus: function(/*dijit._Widget*/ node){
@@ -25023,13 +32007,13 @@ dojo.declare(
}
},
- _onNodeMouseEnter: function(/*dijit._Widget*/ 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){
+ _onNodeMouseLeave: function(/*dijit._Widget*/ /*===== node =====*/){
// summary:
// Called when mouse leaves a node (onmouseleave event),
// this is monitored by the DND code
@@ -25047,7 +32031,7 @@ dojo.declare(
if(nodes){
var label = this.getLabel(item),
tooltip = this.getTooltip(item);
- dojo.forEach(nodes, function(node){
+ array.forEach(nodes, function(node){
node.set({
item: item, // theoretically could be new JS Object representing same item
label: label,
@@ -25066,7 +32050,7 @@ dojo.declare(
parentNodes = this._itemNodesMap[identity];
if(parentNodes){
- dojo.forEach(parentNodes,function(parentNode){
+ array.forEach(parentNodes,function(parentNode){
parentNode.setChildItems(newChildrenList);
});
}
@@ -25080,7 +32064,7 @@ dojo.declare(
nodes = this._itemNodesMap[identity];
if(nodes){
- dojo.forEach(nodes,function(node){
+ array.forEach(nodes,function(node){
// Remove node from set of selected nodes (if it's selected)
this.dndController.removeTreeNode(node);
@@ -25100,43 +32084,39 @@ dojo.declare(
_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._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(item,expanded){
+ _state: function(node, expanded){
// summary:
- // Query or set expanded state for an item,
+ // Query or set expanded state for an node
if(!this.persist){
return false;
}
- var id=this.model.getIdentity(item);
+ var path = array.map(node.getTreePath(), function(item){
+ return this.model.getIdentity(item);
+ }, this).join("/");
if(arguments.length === 1){
- return this._openedItemIds[id];
- }
- if(expanded){
- this._openedItemIds[id] = true;
+ return this._openedNodes[path];
}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);
+ 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});
}
- dojo.cookie(this.cookieName, ary.join(","), {expires:365});
},
destroy: function(){
@@ -25147,7 +32127,7 @@ dojo.declare(
if(this.rootNode){
this.rootNode.destroyRecursive();
}
- if(this.dndController && !dojo.isString(this.dndController)){
+ if(this.dndController && !lang.isString(this.dndController)){
this.dndController.destroy();
}
this.rootNode = null;
@@ -25162,13 +32142,13 @@ dojo.declare(
resize: function(changeSize){
if(changeSize){
- dojo.marginBox(this.domNode, 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 = dojo._getMarginSize(this.tree.indentDetector).w;
+ this._nodePixelIndent = domGeometry.position(this.tree.indentDetector).w;
if(this.tree.rootNode){
// If tree has already loaded, then reset indent for all the nodes
@@ -25184,2631 +32164,84 @@ dojo.declare(
// 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
-
-}
-
-if(!dojo._hasResource["dojo.dnd.Avatar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Avatar"] = true;
-dojo.provide("dojo.dnd.Avatar");
-
-
-
-dojo.declare("dojo.dnd.Avatar", null, {
- // summary:
- // Object that represents transferred DnD items visually
- // manager: Object
- // a DnD manager object
-
- constructor: function(manager){
- this.manager = manager;
- this.construct();
+ return new TreeNode(args);
},
- // methods
- construct: function(){
- // summary:
- // constructor function;
- // it is separate so it can be (dynamically) overwritten in case of need
- this.isA11y = dojo.hasClass(dojo.body(),"dijit_a11y");
- var a = dojo.create("table", {
- "class": "dojoDndAvatar",
- style: {
- position: "absolute",
- zIndex: "1999",
- margin: "0px"
- }
- }),
- source = this.manager.source, node,
- b = dojo.create("tbody", null, a),
- tr = dojo.create("tr", null, b),
- td = dojo.create("td", null, tr),
- icon = this.isA11y ? dojo.create("span", {
- id : "a11yIcon",
- innerHTML : this.manager.copy ? '+' : "<"
- }, td) : null,
- span = dojo.create("span", {
- innerHTML: source.generateText ? this._generateText() : ""
- }, td),
- k = Math.min(5, this.manager.nodes.length), i = 0;
- // we have to set the opacity on IE only after the node is live
- dojo.attr(tr, {
- "class": "dojoDndAvatarHeader",
- style: {opacity: 0.9}
- });
- for(; i < k; ++i){
- if(source.creator){
- // create an avatar representation of the node
- node = source._normalizedCreator(source.getItem(this.manager.nodes[i].id).data, "avatar").node;
- }else{
- // or just clone the node and hope it works
- node = this.manager.nodes[i].cloneNode(true);
- if(node.tagName.toLowerCase() == "tr"){
- // insert extra table nodes
- var table = dojo.create("table"),
- tbody = dojo.create("tbody", null, table);
- tbody.appendChild(node);
- node = table;
- }
- }
- node.id = "";
- tr = dojo.create("tr", null, b);
- td = dojo.create("td", null, tr);
- td.appendChild(node);
- dojo.attr(tr, {
- "class": "dojoDndAvatarItem",
- style: {opacity: (9 - i) / 10}
- });
+ _setTextDirAttr: function(textDir){
+ if(textDir && this.textDir!= textDir){
+ this._set("textDir",textDir);
+ this.rootNode.set("textDir", textDir);
}
- this.node = a;
- },
- destroy: function(){
- // summary:
- // destructor for the avatar; called to remove all references so it can be garbage-collected
- dojo.destroy(this.node);
- this.node = false;
- },
- update: function(){
- // summary:
- // updates the avatar to reflect the current DnD state
- dojo[(this.manager.canDropFlag ? "add" : "remove") + "Class"](this.node, "dojoDndAvatarCanDrop");
- if (this.isA11y){
- var icon = dojo.byId("a11yIcon");
- var text = '+'; // assume canDrop && copy
- if (this.manager.canDropFlag && !this.manager.copy) {
- text = '< '; // canDrop && move
- }else if (!this.manager.canDropFlag && !this.manager.copy) {
- text = "o"; //!canDrop && move
- }else if(!this.manager.canDropFlag){
- text = 'x'; // !canDrop && copy
- }
- icon.innerHTML=text;
- }
- // replace text
- dojo.query(("tr.dojoDndAvatarHeader td span" +(this.isA11y ? " span" : "")), this.node).forEach(
- function(node){
- node.innerHTML = this._generateText();
- }, this);
- },
- _generateText: function(){
- // summary: generates a proper text to reflect copying or moving of items
- return this.manager.nodes.length.toString();
}
});
-}
-
-if(!dojo._hasResource["dojo.dnd.Manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Manager"] = true;
-dojo.provide("dojo.dnd.Manager");
-
-
-
-
+Tree._TreeNode = TreeNode; // for monkey patching
-dojo.declare("dojo.dnd.Manager", null, {
- // summary:
- // the manager of DnD operations (usually a singleton)
- constructor: function(){
- this.avatar = null;
- this.source = null;
- this.nodes = [];
- this.copy = true;
- this.target = null;
- this.canDropFlag = false;
- this.events = [];
- },
-
- // avatar's offset from the mouse
- OFFSET_X: 16,
- OFFSET_Y: 16,
-
- // methods
- overSource: function(source){
- // summary:
- // called when a source detected a mouse-over condition
- // source: Object
- // the reporter
- if(this.avatar){
- this.target = (source && source.targetState != "Disabled") ? source : null;
- this.canDropFlag = Boolean(this.target);
- this.avatar.update();
- }
- dojo.publish("/dnd/source/over", [source]);
- },
- outSource: function(source){
- // summary:
- // called when a source detected a mouse-out condition
- // source: Object
- // the reporter
- if(this.avatar){
- if(this.target == source){
- this.target = null;
- this.canDropFlag = false;
- this.avatar.update();
- dojo.publish("/dnd/source/over", [null]);
- }
- }else{
- dojo.publish("/dnd/source/over", [null]);
- }
- },
- startDrag: function(source, nodes, copy){
- // summary:
- // called to initiate the DnD operation
- // source: Object
- // the source which provides items
- // nodes: Array
- // the list of transferred items
- // copy: Boolean
- // copy items, if true, move items otherwise
- this.source = source;
- this.nodes = nodes;
- this.copy = Boolean(copy); // normalizing to true boolean
- this.avatar = this.makeAvatar();
- dojo.body().appendChild(this.avatar.node);
- dojo.publish("/dnd/start", [source, nodes, this.copy]);
- this.events = [
- dojo.connect(dojo.doc, "onmousemove", this, "onMouseMove"),
- dojo.connect(dojo.doc, "onmouseup", this, "onMouseUp"),
- dojo.connect(dojo.doc, "onkeydown", this, "onKeyDown"),
- dojo.connect(dojo.doc, "onkeyup", this, "onKeyUp"),
- // cancel text selection and text dragging
- dojo.connect(dojo.doc, "ondragstart", dojo.stopEvent),
- dojo.connect(dojo.body(), "onselectstart", dojo.stopEvent)
- ];
- var c = "dojoDnd" + (copy ? "Copy" : "Move");
- dojo.addClass(dojo.body(), c);
- },
- canDrop: function(flag){
- // summary:
- // called to notify if the current target can accept items
- var canDropFlag = Boolean(this.target && flag);
- if(this.canDropFlag != canDropFlag){
- this.canDropFlag = canDropFlag;
- this.avatar.update();
- }
- },
- stopDrag: function(){
- // summary:
- // stop the DnD in progress
- dojo.removeClass(dojo.body(), ["dojoDndCopy", "dojoDndMove"]);
- dojo.forEach(this.events, dojo.disconnect);
- this.events = [];
- this.avatar.destroy();
- this.avatar = null;
- this.source = this.target = null;
- this.nodes = [];
- },
- makeAvatar: function(){
- // summary:
- // makes the avatar; it is separate to be overwritten dynamically, if needed
- return new dojo.dnd.Avatar(this);
- },
- updateAvatar: function(){
- // summary:
- // updates the avatar; it is separate to be overwritten dynamically, if needed
- this.avatar.update();
- },
-
- // mouse event processors
- onMouseMove: function(e){
- // summary:
- // event processor for onmousemove
- // e: Event
- // mouse event
- var a = this.avatar;
- if(a){
- dojo.dnd.autoScrollNodes(e);
- //dojo.dnd.autoScroll(e);
- var s = a.node.style;
- s.left = (e.pageX + this.OFFSET_X) + "px";
- s.top = (e.pageY + this.OFFSET_Y) + "px";
- var copy = Boolean(this.source.copyState(dojo.isCopyKey(e)));
- if(this.copy != copy){
- this._setCopyStatus(copy);
- }
- }
- },
- onMouseUp: function(e){
- // summary:
- // event processor for onmouseup
- // e: Event
- // mouse event
- if(this.avatar){
- if(this.target && this.canDropFlag){
- var copy = Boolean(this.source.copyState(dojo.isCopyKey(e))),
- params = [this.source, this.nodes, copy, this.target, e];
- dojo.publish("/dnd/drop/before", params);
- dojo.publish("/dnd/drop", params);
- }else{
- dojo.publish("/dnd/cancel");
- }
- this.stopDrag();
- }
- },
-
- // keyboard event processors
- onKeyDown: function(e){
- // summary:
- // event processor for onkeydown:
- // watching for CTRL for copy/move status, watching for ESCAPE to cancel the drag
- // e: Event
- // keyboard event
- if(this.avatar){
- switch(e.keyCode){
- case dojo.keys.CTRL:
- var copy = Boolean(this.source.copyState(true));
- if(this.copy != copy){
- this._setCopyStatus(copy);
- }
- break;
- case dojo.keys.ESCAPE:
- dojo.publish("/dnd/cancel");
- this.stopDrag();
- break;
- }
- }
- },
- onKeyUp: function(e){
- // summary:
- // event processor for onkeyup, watching for CTRL for copy/move status
- // e: Event
- // keyboard event
- if(this.avatar && e.keyCode == dojo.keys.CTRL){
- var copy = Boolean(this.source.copyState(false));
- if(this.copy != copy){
- this._setCopyStatus(copy);
- }
- }
- },
-
- // utilities
- _setCopyStatus: function(copy){
- // summary:
- // changes the copy status
- // copy: Boolean
- // the copy status
- this.copy = copy;
- this.source._markDndStatus(this.copy);
- this.updateAvatar();
- dojo.replaceClass(dojo.body(),
- "dojoDnd" + (this.copy ? "Copy" : "Move"),
- "dojoDnd" + (this.copy ? "Move" : "Copy"));
- }
+return Tree;
});
-// dojo.dnd._manager:
-// The manager singleton variable. Can be overwritten if needed.
-dojo.dnd._manager = null;
-
-dojo.dnd.manager = function(){
- // summary:
- // Returns the current DnD manager. Creates one if it is not created yet.
- if(!dojo.dnd._manager){
- dojo.dnd._manager = new dojo.dnd.Manager();
- }
- return dojo.dnd._manager; // Object
-};
-
-}
-
-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");
-
-
-
+},
+'dijit/form/_FormValueWidget':function(){
+define("dijit/form/_FormValueWidget", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/sniff", // has("ie")
+ "./_FormWidget",
+ "./_FormValueMixin"
+], function(declare, has, _FormWidget, _FormValueMixin){
/*=====
-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;
-}
+var _FormWidget = dijit.form._FormWidget;
+var _FormValueMixin = dijit.form._FormValueMixin;
=====*/
-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;
+// module:
+// dijit/form/_FormValueWidget
+// summary:
+// FormValueWidget
- // 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];
- },
+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.
- _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;
- },
+ // 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.
- _markDndStatus: function(copy){
+ _layoutHackIE7: function(){
// summary:
- // Changes source's state based on "copy" status
- this._changeState("Source", copy ? "Copied" : "Moved");
- }
-});
-
-}
-
-if(!dojo._hasResource["dojo.data.ItemFileReadStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.ItemFileReadStore"] = true;
-dojo.provide("dojo.data.ItemFileReadStore");
-
-
-
-
-
-dojo.declare("dojo.data.ItemFileReadStore", null,{
- // summary:
- // The ItemFileReadStore implements the dojo.data.api.Read API and reads
- // data from JSON files that have contents in this format --
- // { items: [
- // { name:'Kermit', color:'green', age:12, friends:['Gonzo', {_reference:{name:'Fozzie Bear'}}]},
- // { name:'Fozzie Bear', wears:['hat', 'tie']},
- // { name:'Miss Piggy', pets:'Foo-Foo'}
- // ]}
- // Note that it can also contain an 'identifer' property that specified which attribute on the items
- // in the array of items that acts as the unique identifier for that item.
- //
- constructor: function(/* Object */ keywordParameters){
- // summary: constructor
- // keywordParameters: {url: String}
- // keywordParameters: {data: jsonObject}
- // keywordParameters: {typeMap: object)
- // The structure of the typeMap object is as follows:
- // {
- // type0: function || object,
- // type1: function || object,
- // ...
- // typeN: function || object
- // }
- // Where if it is a function, it is assumed to be an object constructor that takes the
- // value of _value as the initialization parameters. If it is an object, then it is assumed
- // to be an object of general form:
- // {
- // type: function, //constructor.
- // deserialize: function(value) //The function that parses the value and constructs the object defined by type appropriately.
- // }
-
- this._arrayOfAllItems = [];
- this._arrayOfTopLevelItems = [];
- this._loadFinished = false;
- this._jsonFileUrl = keywordParameters.url;
- this._ccUrl = keywordParameters.url;
- this.url = keywordParameters.url;
- this._jsonData = keywordParameters.data;
- this.data = null;
- this._datatypeMap = keywordParameters.typeMap || {};
- if(!this._datatypeMap['Date']){
- //If no default mapping for dates, then set this as default.
- //We use the dojo.date.stamp here because the ISO format is the 'dojo way'
- //of generically representing dates.
- this._datatypeMap['Date'] = {
- type: Date,
- deserialize: function(value){
- return dojo.date.stamp.fromISOString(value);
- }
- };
- }
- this._features = {'dojo.data.api.Read':true, 'dojo.data.api.Identity':true};
- this._itemsByIdentity = null;
- this._storeRefPropName = "_S"; // Default name for the store reference to attach to every item.
- this._itemNumPropName = "_0"; // Default Item Id for isItem to attach to every item.
- this._rootItemPropName = "_RI"; // Default Item Id for isItem to attach to every item.
- this._reverseRefMap = "_RRM"; // Default attribute for constructing a reverse reference map for use with reference integrity
- this._loadInProgress = false; //Got to track the initial load to prevent duelling loads of the dataset.
- this._queuedFetches = [];
- if(keywordParameters.urlPreventCache !== undefined){
- this.urlPreventCache = keywordParameters.urlPreventCache?true:false;
- }
- if(keywordParameters.hierarchical !== undefined){
- this.hierarchical = keywordParameters.hierarchical?true:false;
- }
- if(keywordParameters.clearOnClose){
- this.clearOnClose = true;
- }
- if("failOk" in keywordParameters){
- this.failOk = keywordParameters.failOk?true:false;
- }
- },
-
- url: "", // use "" rather than undefined for the benefit of the parser (#3539)
-
- //Internal var, crossCheckUrl. Used so that setting either url or _jsonFileUrl, can still trigger a reload
- //when clearOnClose and close is used.
- _ccUrl: "",
-
- data: null, // define this so that the parser can populate it
-
- typeMap: null, //Define so parser can populate.
-
- //Parameter to allow users to specify if a close call should force a reload or not.
- //By default, it retains the old behavior of not clearing if close is called. But
- //if set true, the store will be reset to default state. Note that by doing this,
- //all item handles will become invalid and a new fetch must be issued.
- clearOnClose: false,
-
- //Parameter to allow specifying if preventCache should be passed to the xhrGet call or not when loading data from a url.
- //Note this does not mean the store calls the server on each fetch, only that the data load has preventCache set as an option.
- //Added for tracker: #6072
- urlPreventCache: false,
-
- //Parameter for specifying that it is OK for the xhrGet call to fail silently.
- failOk: false,
-
- //Parameter to indicate to process data from the url as hierarchical
- //(data items can contain other data items in js form). Default is true
- //for backwards compatibility. False means only root items are processed
- //as items, all child objects outside of type-mapped objects and those in
- //specific reference format, are left straight JS data objects.
- hierarchical: true,
-
- _assertIsItem: function(/* item */ item){
- // summary:
- // This function tests whether the item passed in is indeed an item in the store.
- // item:
- // The item to test for being contained by the store.
- if(!this.isItem(item)){
- throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");
- }
- },
-
- _assertIsAttribute: function(/* attribute-name-string */ attribute){
- // summary:
- // This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.
- // attribute:
- // The attribute to test for being contained by the store.
- if(typeof attribute !== "string"){
- throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");
- }
- },
-
- getValue: function( /* item */ item,
- /* attribute-name-string */ attribute,
- /* value? */ defaultValue){
- // summary:
- // See dojo.data.api.Read.getValue()
- var values = this.getValues(item, attribute);
- return (values.length > 0)?values[0]:defaultValue; // mixed
- },
-
- getValues: function(/* item */ item,
- /* attribute-name-string */ attribute){
- // summary:
- // See dojo.data.api.Read.getValues()
-
- this._assertIsItem(item);
- this._assertIsAttribute(attribute);
- // Clone it before returning. refs: #10474
- return (item[attribute] || []).slice(0); // Array
- },
-
- getAttributes: function(/* item */ item){
- // summary:
- // See dojo.data.api.Read.getAttributes()
- this._assertIsItem(item);
- var attributes = [];
- for(var key in item){
- // Save off only the real item attributes, not the special id marks for O(1) isItem.
- if((key !== this._storeRefPropName) && (key !== this._itemNumPropName) && (key !== this._rootItemPropName) && (key !== this._reverseRefMap)){
- attributes.push(key);
- }
- }
- return attributes; // Array
- },
-
- hasAttribute: function( /* item */ item,
- /* attribute-name-string */ attribute){
- // summary:
- // See dojo.data.api.Read.hasAttribute()
- this._assertIsItem(item);
- this._assertIsAttribute(attribute);
- return (attribute in item);
- },
-
- containsValue: function(/* item */ item,
- /* attribute-name-string */ attribute,
- /* anything */ value){
- // summary:
- // See dojo.data.api.Read.containsValue()
- var regexp = undefined;
- if(typeof value === "string"){
- regexp = dojo.data.util.filter.patternToRegExp(value, false);
- }
- return this._containsValue(item, attribute, value, regexp); //boolean.
- },
-
- _containsValue: function( /* item */ item,
- /* attribute-name-string */ attribute,
- /* anything */ value,
- /* RegExp?*/ regexp){
- // summary:
- // Internal function for looking at the values contained by the item.
- // description:
- // Internal function for looking at the values contained by the item. This
- // function allows for denoting if the comparison should be case sensitive for
- // strings or not (for handling filtering cases where string case should not matter)
- //
- // item:
- // The data item to examine for attribute values.
- // attribute:
- // The attribute to inspect.
- // value:
- // The value to match.
- // regexp:
- // Optional regular expression generated off value if value was of string type to handle wildcarding.
- // If present and attribute values are string, then it can be used for comparison instead of 'value'
- return dojo.some(this.getValues(item, attribute), function(possibleValue){
- if(possibleValue !== null && !dojo.isObject(possibleValue) && regexp){
- if(possibleValue.toString().match(regexp)){
- return true; // Boolean
- }
- }else if(value === possibleValue){
- return true; // Boolean
- }
- });
- },
-
- isItem: function(/* anything */ something){
- // summary:
- // See dojo.data.api.Read.isItem()
- if(something && something[this._storeRefPropName] === this){
- if(this._arrayOfAllItems[something[this._itemNumPropName]] === something){
- return true;
- }
- }
- return false; // Boolean
- },
-
- isItemLoaded: function(/* anything */ something){
- // summary:
- // See dojo.data.api.Read.isItemLoaded()
- return this.isItem(something); //boolean
- },
-
- loadItem: function(/* object */ keywordArgs){
- // summary:
- // See dojo.data.api.Read.loadItem()
- this._assertIsItem(keywordArgs.item);
- },
-
- getFeatures: function(){
- // summary:
- // See dojo.data.api.Read.getFeatures()
- return this._features; //Object
- },
-
- getLabel: function(/* item */ item){
- // summary:
- // See dojo.data.api.Read.getLabel()
- if(this._labelAttr && this.isItem(item)){
- return this.getValue(item,this._labelAttr); //String
- }
- return undefined; //undefined
- },
-
- getLabelAttributes: function(/* item */ item){
- // summary:
- // See dojo.data.api.Read.getLabelAttributes()
- if(this._labelAttr){
- return [this._labelAttr]; //array
- }
- return null; //null
- },
-
- _fetchItems: function( /* Object */ keywordArgs,
- /* Function */ findCallback,
- /* Function */ errorCallback){
- // summary:
- // See dojo.data.util.simpleFetch.fetch()
- var self = this,
- filter = function(requestArgs, arrayOfItems){
- var items = [],
- i, key;
- if(requestArgs.query){
- var value,
- ignoreCase = requestArgs.queryOptions ? requestArgs.queryOptions.ignoreCase : false;
-
- //See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the
- //same value for each item examined. Much more efficient.
- var regexpList = {};
- for(key in requestArgs.query){
- value = requestArgs.query[key];
- if(typeof value === "string"){
- regexpList[key] = dojo.data.util.filter.patternToRegExp(value, ignoreCase);
- }else if(value instanceof RegExp){
- regexpList[key] = value;
- }
- }
- for(i = 0; i < arrayOfItems.length; ++i){
- var match = true;
- var candidateItem = arrayOfItems[i];
- if(candidateItem === null){
- match = false;
- }else{
- for(key in requestArgs.query){
- value = requestArgs.query[key];
- if(!self._containsValue(candidateItem, key, value, regexpList[key])){
- match = false;
- }
- }
- }
- if(match){
- items.push(candidateItem);
- }
- }
- findCallback(items, requestArgs);
- }else{
- // We want a copy to pass back in case the parent wishes to sort the array.
- // We shouldn't allow resort of the internal list, so that multiple callers
- // can get lists and sort without affecting each other. We also need to
- // filter out any null values that have been left as a result of deleteItem()
- // calls in ItemFileWriteStore.
- for(i = 0; i < arrayOfItems.length; ++i){
- var item = arrayOfItems[i];
- if(item !== null){
- items.push(item);
- }
- }
- findCallback(items, requestArgs);
- }
- };
-
- if(this._loadFinished){
- filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
- }else{
- //Do a check on the JsonFileUrl and crosscheck it.
- //If it doesn't match the cross-check, it needs to be updated
- //This allows for either url or _jsonFileUrl to he changed to
- //reset the store load location. Done this way for backwards
- //compatibility. People use _jsonFileUrl (even though officially
- //private.
- if(this._jsonFileUrl !== this._ccUrl){
- dojo.deprecated("dojo.data.ItemFileReadStore: ",
- "To change the url, set the url property of the store," +
- " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");
- this._ccUrl = this._jsonFileUrl;
- this.url = this._jsonFileUrl;
- }else if(this.url !== this._ccUrl){
- this._jsonFileUrl = this.url;
- this._ccUrl = this.url;
- }
-
- //See if there was any forced reset of data.
- if(this.data != null){
- this._jsonData = this.data;
- this.data = null;
- }
-
- if(this._jsonFileUrl){
- //If fetches come in before the loading has finished, but while
- //a load is in progress, we have to defer the fetching to be
- //invoked in the callback.
- if(this._loadInProgress){
- this._queuedFetches.push({args: keywordArgs, filter: filter});
- }else{
- this._loadInProgress = true;
- var getArgs = {
- url: self._jsonFileUrl,
- handleAs: "json-comment-optional",
- preventCache: this.urlPreventCache,
- failOk: this.failOk
- };
- var getHandler = dojo.xhrGet(getArgs);
- getHandler.addCallback(function(data){
- try{
- self._getItemsFromLoadedData(data);
- self._loadFinished = true;
- self._loadInProgress = false;
-
- filter(keywordArgs, self._getItemsArray(keywordArgs.queryOptions));
- self._handleQueuedFetches();
- }catch(e){
- self._loadFinished = true;
- self._loadInProgress = false;
- errorCallback(e, keywordArgs);
- }
- });
- getHandler.addErrback(function(error){
- self._loadInProgress = false;
- errorCallback(error, keywordArgs);
- });
-
- //Wire up the cancel to abort of the request
- //This call cancel on the deferred if it hasn't been called
- //yet and then will chain to the simple abort of the
- //simpleFetch keywordArgs
- var oldAbort = null;
- if(keywordArgs.abort){
- oldAbort = keywordArgs.abort;
- }
- keywordArgs.abort = function(){
- var df = getHandler;
- if(df && df.fired === -1){
- df.cancel();
- df = null;
- }
- if(oldAbort){
- oldAbort.call(keywordArgs);
- }
- };
- }
- }else if(this._jsonData){
- try{
- this._loadFinished = true;
- this._getItemsFromLoadedData(this._jsonData);
- this._jsonData = null;
- filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions));
- }catch(e){
- errorCallback(e, keywordArgs);
- }
- }else{
- errorCallback(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."), keywordArgs);
- }
- }
- },
-
- _handleQueuedFetches: function(){
- // summary:
- // Internal function to execute delayed request in the store.
- //Execute any deferred fetches now.
- if(this._queuedFetches.length > 0){
- for(var i = 0; i < this._queuedFetches.length; i++){
- var fData = this._queuedFetches[i],
- delayedQuery = fData.args,
- delayedFilter = fData.filter;
- if(delayedFilter){
- delayedFilter(delayedQuery, this._getItemsArray(delayedQuery.queryOptions));
- }else{
- this.fetchItemByIdentity(delayedQuery);
- }
- }
- this._queuedFetches = [];
- }
- },
-
- _getItemsArray: function(/*object?*/queryOptions){
- // summary:
- // Internal function to determine which list of items to search over.
- // queryOptions: The query options parameter, if any.
- if(queryOptions && queryOptions.deep){
- return this._arrayOfAllItems;
- }
- return this._arrayOfTopLevelItems;
- },
-
- close: function(/*dojo.data.api.Request || keywordArgs || null */ request){
- // summary:
- // See dojo.data.api.Read.close()
- if(this.clearOnClose &&
- this._loadFinished &&
- !this._loadInProgress){
- //Reset all internalsback to default state. This will force a reload
- //on next fetch. This also checks that the data or url param was set
- //so that the store knows it can get data. Without one of those being set,
- //the next fetch will trigger an error.
-
- if(((this._jsonFileUrl == "" || this._jsonFileUrl == null) &&
- (this.url == "" || this.url == null)
- ) && this.data == null){
- console.debug("dojo.data.ItemFileReadStore: WARNING! Data reload " +
- " information has not been provided." +
- " Please set 'url' or 'data' to the appropriate value before" +
- " the next fetch");
- }
- this._arrayOfAllItems = [];
- this._arrayOfTopLevelItems = [];
- this._loadFinished = false;
- this._itemsByIdentity = null;
- this._loadInProgress = false;
- this._queuedFetches = [];
- }
- },
-
- _getItemsFromLoadedData: function(/* Object */ dataObject){
- // summary:
- // Function to parse the loaded data into item format and build the internal items array.
- // description:
- // Function to parse the loaded data into item format and build the internal items array.
- //
- // dataObject:
- // The JS data object containing the raw data to convery into item format.
- //
- // returns: array
- // Array of items in store item format.
-
- // First, we define a couple little utility functions...
- var addingArrays = false,
- self = this;
-
- function valueIsAnItem(/* anything */ aValue){
- // summary:
- // Given any sort of value that could be in the raw json data,
- // return true if we should interpret the value as being an
- // item itself, rather than a literal value or a reference.
- // example:
- // | false == valueIsAnItem("Kermit");
- // | false == valueIsAnItem(42);
- // | false == valueIsAnItem(new Date());
- // | false == valueIsAnItem({_type:'Date', _value:'1802-05-14'});
- // | false == valueIsAnItem({_reference:'Kermit'});
- // | true == valueIsAnItem({name:'Kermit', color:'green'});
- // | true == valueIsAnItem({iggy:'pop'});
- // | true == valueIsAnItem({foo:42});
- var isItem = (
- (aValue !== null) &&
- (typeof aValue === "object") &&
- (!dojo.isArray(aValue) || addingArrays) &&
- (!dojo.isFunction(aValue)) &&
- (aValue.constructor == Object || dojo.isArray(aValue)) &&
- (typeof aValue._reference === "undefined") &&
- (typeof aValue._type === "undefined") &&
- (typeof aValue._value === "undefined") &&
- self.hierarchical
- );
- return isItem;
- }
-
- function addItemAndSubItemsToArrayOfAllItems(/* Item */ anItem){
- self._arrayOfAllItems.push(anItem);
- for(var attribute in anItem){
- var valueForAttribute = anItem[attribute];
- if(valueForAttribute){
- if(dojo.isArray(valueForAttribute)){
- var valueArray = valueForAttribute;
- for(var k = 0; k < valueArray.length; ++k){
- var singleValue = valueArray[k];
- if(valueIsAnItem(singleValue)){
- addItemAndSubItemsToArrayOfAllItems(singleValue);
- }
- }
- }else{
- if(valueIsAnItem(valueForAttribute)){
- addItemAndSubItemsToArrayOfAllItems(valueForAttribute);
- }
- }
- }
- }
- }
-
- this._labelAttr = dataObject.label;
-
- // We need to do some transformations to convert the data structure
- // that we read from the file into a format that will be convenient
- // to work with in memory.
-
- // Step 1: Walk through the object hierarchy and build a list of all items
- var i,
- item;
- this._arrayOfAllItems = [];
- this._arrayOfTopLevelItems = dataObject.items;
-
- for(i = 0; i < this._arrayOfTopLevelItems.length; ++i){
- item = this._arrayOfTopLevelItems[i];
- if(dojo.isArray(item)){
- addingArrays = true;
- }
- addItemAndSubItemsToArrayOfAllItems(item);
- item[this._rootItemPropName]=true;
- }
-
- // Step 2: Walk through all the attribute values of all the items,
- // and replace single values with arrays. For example, we change this:
- // { name:'Miss Piggy', pets:'Foo-Foo'}
- // into this:
- // { name:['Miss Piggy'], pets:['Foo-Foo']}
- //
- // We also store the attribute names so we can validate our store
- // reference and item id special properties for the O(1) isItem
- var allAttributeNames = {},
- key;
-
- for(i = 0; i < this._arrayOfAllItems.length; ++i){
- item = this._arrayOfAllItems[i];
- for(key in item){
- if(key !== this._rootItemPropName){
- var value = item[key];
- if(value !== null){
- if(!dojo.isArray(value)){
- item[key] = [value];
- }
- }else{
- item[key] = [null];
- }
- }
- allAttributeNames[key]=key;
- }
- }
-
- // Step 3: Build unique property names to use for the _storeRefPropName and _itemNumPropName
- // This should go really fast, it will generally never even run the loop.
- while(allAttributeNames[this._storeRefPropName]){
- this._storeRefPropName += "_";
- }
- while(allAttributeNames[this._itemNumPropName]){
- this._itemNumPropName += "_";
- }
- while(allAttributeNames[this._reverseRefMap]){
- this._reverseRefMap += "_";
- }
-
- // Step 4: Some data files specify an optional 'identifier', which is
- // the name of an attribute that holds the identity of each item.
- // If this data file specified an identifier attribute, then build a
- // hash table of items keyed by the identity of the items.
- var arrayOfValues;
-
- var identifier = dataObject.identifier;
- if(identifier){
- this._itemsByIdentity = {};
- this._features['dojo.data.api.Identity'] = identifier;
- for(i = 0; i < this._arrayOfAllItems.length; ++i){
- item = this._arrayOfAllItems[i];
- arrayOfValues = item[identifier];
- var identity = arrayOfValues[0];
- if(!Object.hasOwnProperty.call(this._itemsByIdentity, identity)){
- this._itemsByIdentity[identity] = item;
- }else{
- if(this._jsonFileUrl){
- throw new Error("dojo.data.ItemFileReadStore: The json data as specified by: [" + this._jsonFileUrl + "] is malformed. Items within the list have identifier: [" + identifier + "]. Value collided: [" + identity + "]");
- }else if(this._jsonData){
- throw new Error("dojo.data.ItemFileReadStore: The json data provided by the creation arguments is malformed. Items within the list have identifier: [" + identifier + "]. Value collided: [" + identity + "]");
- }
- }
- }
- }else{
- this._features['dojo.data.api.Identity'] = Number;
- }
-
- // Step 5: Walk through all the items, and set each item's properties
- // for _storeRefPropName and _itemNumPropName, so that store.isItem() will return true.
- for(i = 0; i < this._arrayOfAllItems.length; ++i){
- item = this._arrayOfAllItems[i];
- item[this._storeRefPropName] = this;
- item[this._itemNumPropName] = i;
- }
-
- // Step 6: We walk through all the attribute values of all the items,
- // looking for type/value literals and item-references.
- //
- // We replace item-references with pointers to items. For example, we change:
- // { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
- // into this:
- // { name:['Kermit'], friends:[miss_piggy] }
- // (where miss_piggy is the object representing the 'Miss Piggy' item).
- //
- // We replace type/value pairs with typed-literals. For example, we change:
- // { name:['Nelson Mandela'], born:[{_type:'Date', _value:'1918-07-18'}] }
- // into this:
- // { name:['Kermit'], born:(new Date(1918, 6, 18)) }
- //
- // We also generate the associate map for all items for the O(1) isItem function.
- for(i = 0; i < this._arrayOfAllItems.length; ++i){
- item = this._arrayOfAllItems[i]; // example: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
- for(key in item){
- arrayOfValues = item[key]; // example: [{_reference:{name:'Miss Piggy'}}]
- for(var j = 0; j < arrayOfValues.length; ++j){
- value = arrayOfValues[j]; // example: {_reference:{name:'Miss Piggy'}}
- if(value !== null && typeof value == "object"){
- if(("_type" in value) && ("_value" in value)){
- var type = value._type; // examples: 'Date', 'Color', or 'ComplexNumber'
- var mappingObj = this._datatypeMap[type]; // examples: Date, dojo.Color, foo.math.ComplexNumber, {type: dojo.Color, deserialize(value){ return new dojo.Color(value)}}
- if(!mappingObj){
- throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '" + type + "'");
- }else if(dojo.isFunction(mappingObj)){
- arrayOfValues[j] = new mappingObj(value._value);
- }else if(dojo.isFunction(mappingObj.deserialize)){
- arrayOfValues[j] = mappingObj.deserialize(value._value);
- }else{
- throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");
- }
- }
- if(value._reference){
- var referenceDescription = value._reference; // example: {name:'Miss Piggy'}
- if(!dojo.isObject(referenceDescription)){
- // example: 'Miss Piggy'
- // from an item like: { name:['Kermit'], friends:[{_reference:'Miss Piggy'}]}
- arrayOfValues[j] = this._getItemByIdentity(referenceDescription);
- }else{
- // example: {name:'Miss Piggy'}
- // from an item like: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }
- for(var k = 0; k < this._arrayOfAllItems.length; ++k){
- var candidateItem = this._arrayOfAllItems[k],
- found = true;
- for(var refKey in referenceDescription){
- if(candidateItem[refKey] != referenceDescription[refKey]){
- found = false;
- }
- }
- if(found){
- arrayOfValues[j] = candidateItem;
- }
- }
- }
- if(this.referenceIntegrity){
- var refItem = arrayOfValues[j];
- if(this.isItem(refItem)){
- this._addReferenceToMap(refItem, item, key);
- }
- }
- }else if(this.isItem(value)){
- //It's a child item (not one referenced through _reference).
- //We need to treat this as a referenced item, so it can be cleaned up
- //in a write store easily.
- if(this.referenceIntegrity){
- this._addReferenceToMap(value, item, key);
- }
- }
- }
- }
- }
- }
- },
-
- _addReferenceToMap: function(/*item*/ refItem, /*item*/ parentItem, /*string*/ attribute){
- // summary:
- // Method to add an reference map entry for an item and attribute.
- // description:
- // Method to add an reference map entry for an item and attribute. //
- // refItem:
- // The item that is referenced.
- // parentItem:
- // The item that holds the new reference to refItem.
- // attribute:
- // The attribute on parentItem that contains the new reference.
-
- //Stub function, does nothing. Real processing is in ItemFileWriteStore.
- },
-
- getIdentity: function(/* item */ item){
- // summary:
- // See dojo.data.api.Identity.getIdentity()
- var identifier = this._features['dojo.data.api.Identity'];
- if(identifier === Number){
- return item[this._itemNumPropName]; // Number
- }else{
- var arrayOfValues = item[identifier];
- if(arrayOfValues){
- return arrayOfValues[0]; // Object || String
- }
- }
- return null; // null
- },
-
- fetchItemByIdentity: function(/* Object */ keywordArgs){
- // summary:
- // See dojo.data.api.Identity.fetchItemByIdentity()
-
- // Hasn't loaded yet, we have to trigger the load.
- var item,
- scope;
- if(!this._loadFinished){
- var self = this;
- //Do a check on the JsonFileUrl and crosscheck it.
- //If it doesn't match the cross-check, it needs to be updated
- //This allows for either url or _jsonFileUrl to he changed to
- //reset the store load location. Done this way for backwards
- //compatibility. People use _jsonFileUrl (even though officially
- //private.
- if(this._jsonFileUrl !== this._ccUrl){
- dojo.deprecated("dojo.data.ItemFileReadStore: ",
- "To change the url, set the url property of the store," +
- " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");
- this._ccUrl = this._jsonFileUrl;
- this.url = this._jsonFileUrl;
- }else if(this.url !== this._ccUrl){
- this._jsonFileUrl = this.url;
- this._ccUrl = this.url;
- }
-
- //See if there was any forced reset of data.
- if(this.data != null && this._jsonData == null){
- this._jsonData = this.data;
- this.data = null;
- }
-
- if(this._jsonFileUrl){
+ // Work around table sizing bugs on IE7 by forcing redraw
- if(this._loadInProgress){
- this._queuedFetches.push({args: keywordArgs});
- }else{
- this._loadInProgress = true;
- var getArgs = {
- url: self._jsonFileUrl,
- handleAs: "json-comment-optional",
- preventCache: this.urlPreventCache,
- failOk: this.failOk
- };
- var getHandler = dojo.xhrGet(getArgs);
- getHandler.addCallback(function(data){
- var scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
- try{
- self._getItemsFromLoadedData(data);
- self._loadFinished = true;
- self._loadInProgress = false;
- item = self._getItemByIdentity(keywordArgs.identity);
- if(keywordArgs.onItem){
- keywordArgs.onItem.call(scope, item);
- }
- self._handleQueuedFetches();
- }catch(error){
- self._loadInProgress = false;
- if(keywordArgs.onError){
- keywordArgs.onError.call(scope, error);
- }
- }
- });
- getHandler.addErrback(function(error){
- self._loadInProgress = false;
- if(keywordArgs.onError){
- var scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
- keywordArgs.onError.call(scope, error);
+ 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
}
- });
- }
-
- }else if(this._jsonData){
- // Passed in data, no need to xhr.
- self._getItemsFromLoadedData(self._jsonData);
- self._jsonData = null;
- self._loadFinished = true;
- item = self._getItemByIdentity(keywordArgs.identity);
- if(keywordArgs.onItem){
- scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
- keywordArgs.onItem.call(scope, item);
- }
- }
- }else{
- // Already loaded. We can just look it up and call back.
- item = this._getItemByIdentity(keywordArgs.identity);
- if(keywordArgs.onItem){
- scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
- keywordArgs.onItem.call(scope, item);
+ );
+ })();
+ parent = parent.parentNode;
}
}
- },
-
- _getItemByIdentity: function(/* Object */ identity){
- // summary:
- // Internal function to look an item up by its identity map.
- var item = null;
- if(this._itemsByIdentity &&
- Object.hasOwnProperty.call(this._itemsByIdentity, identity)){
- item = this._itemsByIdentity[identity];
- }else if (Object.hasOwnProperty.call(this._arrayOfAllItems, identity)){
- item = this._arrayOfAllItems[identity];
- }
- if(item === undefined){
- item = null;
- }
- return item; // Object
- },
-
- getIdentityAttributes: function(/* item */ item){
- // summary:
- // See dojo.data.api.Identity.getIdentityAttributes()
-
- var identifier = this._features['dojo.data.api.Identity'];
- if(identifier === Number){
- // If (identifier === Number) it means getIdentity() just returns
- // an integer item-number for each item. The dojo.data.api.Identity
- // spec says we need to return null if the identity is not composed
- // of attributes
- return null; // null
- }else{
- return [identifier]; // Array
- }
- },
-
- _forceLoad: function(){
- // summary:
- // Internal function to force a load of the store if it hasn't occurred yet. This is required
- // for specific functions to work properly.
- var self = this;
- //Do a check on the JsonFileUrl and crosscheck it.
- //If it doesn't match the cross-check, it needs to be updated
- //This allows for either url or _jsonFileUrl to he changed to
- //reset the store load location. Done this way for backwards
- //compatibility. People use _jsonFileUrl (even though officially
- //private.
- if(this._jsonFileUrl !== this._ccUrl){
- dojo.deprecated("dojo.data.ItemFileReadStore: ",
- "To change the url, set the url property of the store," +
- " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");
- this._ccUrl = this._jsonFileUrl;
- this.url = this._jsonFileUrl;
- }else if(this.url !== this._ccUrl){
- this._jsonFileUrl = this.url;
- this._ccUrl = this.url;
- }
-
- //See if there was any forced reset of data.
- if(this.data != null){
- this._jsonData = this.data;
- this.data = null;
- }
-
- if(this._jsonFileUrl){
- var getArgs = {
- url: this._jsonFileUrl,
- handleAs: "json-comment-optional",
- preventCache: this.urlPreventCache,
- failOk: this.failOk,
- sync: true
- };
- var getHandler = dojo.xhrGet(getArgs);
- getHandler.addCallback(function(data){
- try{
- //Check to be sure there wasn't another load going on concurrently
- //So we don't clobber data that comes in on it. If there is a load going on
- //then do not save this data. It will potentially clobber current data.
- //We mainly wanted to sync/wait here.
- //TODO: Revisit the loading scheme of this store to improve multi-initial
- //request handling.
- if(self._loadInProgress !== true && !self._loadFinished){
- self._getItemsFromLoadedData(data);
- self._loadFinished = true;
- }else if(self._loadInProgress){
- //Okay, we hit an error state we can't recover from. A forced load occurred
- //while an async load was occurring. Since we cannot block at this point, the best
- //that can be managed is to throw an error.
- throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress.");
- }
- }catch(e){
- console.log(e);
- throw e;
- }
- });
- getHandler.addErrback(function(error){
- throw error;
- });
- }else if(this._jsonData){
- self._getItemsFromLoadedData(self._jsonData);
- self._jsonData = null;
- self._loadFinished = true;
- }
}
});
-//Mix in the simple fetch implementation to this class.
-dojo.extend(dojo.data.ItemFileReadStore,dojo.data.util.simpleFetch);
-
-}
-
-if(!dojo._hasResource["dojo.data.ItemFileWriteStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.data.ItemFileWriteStore"] = true;
-dojo.provide("dojo.data.ItemFileWriteStore");
-
-
-
-dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, {
- constructor: function(/* object */ keywordParameters){
- // keywordParameters: {typeMap: object)
- // The structure of the typeMap object is as follows:
- // {
- // type0: function || object,
- // type1: function || object,
- // ...
- // typeN: function || object
- // }
- // Where if it is a function, it is assumed to be an object constructor that takes the
- // value of _value as the initialization parameters. It is serialized assuming object.toString()
- // serialization. If it is an object, then it is assumed
- // to be an object of general form:
- // {
- // type: function, //constructor.
- // deserialize: function(value) //The function that parses the value and constructs the object defined by type appropriately.
- // serialize: function(object) //The function that converts the object back into the proper file format form.
- // }
-
- // ItemFileWriteStore extends ItemFileReadStore to implement these additional dojo.data APIs
- this._features['dojo.data.api.Write'] = true;
- this._features['dojo.data.api.Notification'] = true;
-
- // For keeping track of changes so that we can implement isDirty and revert
- this._pending = {
- _newItems:{},
- _modifiedItems:{},
- _deletedItems:{}
- };
-
- if(!this._datatypeMap['Date'].serialize){
- this._datatypeMap['Date'].serialize = function(obj){
- return dojo.date.stamp.toISOString(obj, {zulu:true});
- };
- }
- //Disable only if explicitly set to false.
- if(keywordParameters && (keywordParameters.referenceIntegrity === false)){
- this.referenceIntegrity = false;
- }
-
- // this._saveInProgress is set to true, briefly, from when save() is first called to when it completes
- this._saveInProgress = false;
- },
-
- referenceIntegrity: true, //Flag that defaultly enabled reference integrity tracking. This way it can also be disabled pogrammatially or declaratively.
-
- _assert: function(/* boolean */ condition){
- if(!condition){
- throw new Error("assertion failed in ItemFileWriteStore");
- }
- },
-
- _getIdentifierAttribute: function(){
- var identifierAttribute = this.getFeatures()['dojo.data.api.Identity'];
- // this._assert((identifierAttribute === Number) || (dojo.isString(identifierAttribute)));
- return identifierAttribute;
- },
-
-
-/* dojo.data.api.Write */
-
- newItem: function(/* Object? */ keywordArgs, /* Object? */ parentInfo){
- // summary: See dojo.data.api.Write.newItem()
-
- this._assert(!this._saveInProgress);
-
- if(!this._loadFinished){
- // We need to do this here so that we'll be able to find out what
- // identifierAttribute was specified in the data file.
- this._forceLoad();
- }
-
- if(typeof keywordArgs != "object" && typeof keywordArgs != "undefined"){
- throw new Error("newItem() was passed something other than an object");
- }
- var newIdentity = null;
- var identifierAttribute = this._getIdentifierAttribute();
- if(identifierAttribute === Number){
- newIdentity = this._arrayOfAllItems.length;
- }else{
- newIdentity = keywordArgs[identifierAttribute];
- if(typeof newIdentity === "undefined"){
- throw new Error("newItem() was not passed an identity for the new item");
- }
- if(dojo.isArray(newIdentity)){
- throw new Error("newItem() was not passed an single-valued identity");
- }
- }
-
- // make sure this identity is not already in use by another item, if identifiers were
- // defined in the file. Otherwise it would be the item count,
- // which should always be unique in this case.
- if(this._itemsByIdentity){
- this._assert(typeof this._itemsByIdentity[newIdentity] === "undefined");
- }
- this._assert(typeof this._pending._newItems[newIdentity] === "undefined");
- this._assert(typeof this._pending._deletedItems[newIdentity] === "undefined");
-
- var newItem = {};
- newItem[this._storeRefPropName] = this;
- newItem[this._itemNumPropName] = this._arrayOfAllItems.length;
- if(this._itemsByIdentity){
- this._itemsByIdentity[newIdentity] = newItem;
- //We have to set the identifier now, otherwise we can't look it
- //up at calls to setValueorValues in parentInfo handling.
- newItem[identifierAttribute] = [newIdentity];
- }
- this._arrayOfAllItems.push(newItem);
-
- //We need to construct some data for the onNew call too...
- var pInfo = null;
-
- // Now we need to check to see where we want to assign this thingm if any.
- if(parentInfo && parentInfo.parent && parentInfo.attribute){
- pInfo = {
- item: parentInfo.parent,
- attribute: parentInfo.attribute,
- oldValue: undefined
- };
-
- //See if it is multi-valued or not and handle appropriately
- //Generally, all attributes are multi-valued for this store
- //So, we only need to append if there are already values present.
- var values = this.getValues(parentInfo.parent, parentInfo.attribute);
- if(values && values.length > 0){
- var tempValues = values.slice(0, values.length);
- if(values.length === 1){
- pInfo.oldValue = values[0];
- }else{
- pInfo.oldValue = values.slice(0, values.length);
- }
- tempValues.push(newItem);
- this._setValueOrValues(parentInfo.parent, parentInfo.attribute, tempValues, false);
- pInfo.newValue = this.getValues(parentInfo.parent, parentInfo.attribute);
- }else{
- this._setValueOrValues(parentInfo.parent, parentInfo.attribute, newItem, false);
- pInfo.newValue = newItem;
- }
- }else{
- //Toplevel item, add to both top list as well as all list.
- newItem[this._rootItemPropName]=true;
- this._arrayOfTopLevelItems.push(newItem);
- }
-
- this._pending._newItems[newIdentity] = newItem;
-
- //Clone over the properties to the new item
- for(var key in keywordArgs){
- if(key === this._storeRefPropName || key === this._itemNumPropName){
- // Bummer, the user is trying to do something like
- // newItem({_S:"foo"}). Unfortunately, our superclass,
- // ItemFileReadStore, is already using _S in each of our items
- // to hold private info. To avoid a naming collision, we
- // need to move all our private info to some other property
- // of all the items/objects. So, we need to iterate over all
- // the items and do something like:
- // item.__S = item._S;
- // item._S = undefined;
- // But first we have to make sure the new "__S" variable is
- // not in use, which means we have to iterate over all the
- // items checking for that.
- throw new Error("encountered bug in ItemFileWriteStore.newItem");
- }
- var value = keywordArgs[key];
- if(!dojo.isArray(value)){
- value = [value];
- }
- newItem[key] = value;
- if(this.referenceIntegrity){
- for(var i = 0; i < value.length; i++){
- var val = value[i];
- if(this.isItem(val)){
- this._addReferenceToMap(val, newItem, key);
- }
- }
- }
- }
- this.onNew(newItem, pInfo); // dojo.data.api.Notification call
- return newItem; // item
- },
-
- _removeArrayElement: function(/* Array */ array, /* anything */ element){
- var index = dojo.indexOf(array, element);
- if(index != -1){
- array.splice(index, 1);
- return true;
- }
- return false;
- },
-
- deleteItem: function(/* item */ item){
- // summary: See dojo.data.api.Write.deleteItem()
- this._assert(!this._saveInProgress);
- this._assertIsItem(item);
-
- // Remove this item from the _arrayOfAllItems, but leave a null value in place
- // of the item, so as not to change the length of the array, so that in newItem()
- // we can still safely do: newIdentity = this._arrayOfAllItems.length;
- var indexInArrayOfAllItems = item[this._itemNumPropName];
- var identity = this.getIdentity(item);
-
- //If we have reference integrity on, we need to do reference cleanup for the deleted item
- if(this.referenceIntegrity){
- //First scan all the attributes of this items for references and clean them up in the map
- //As this item is going away, no need to track its references anymore.
-
- //Get the attributes list before we generate the backup so it
- //doesn't pollute the attributes list.
- var attributes = this.getAttributes(item);
-
- //Backup the map, we'll have to restore it potentially, in a revert.
- if(item[this._reverseRefMap]){
- item["backup_" + this._reverseRefMap] = dojo.clone(item[this._reverseRefMap]);
- }
-
- //TODO: This causes a reversion problem. This list won't be restored on revert since it is
- //attached to the 'value'. item, not ours. Need to back tese up somehow too.
- //Maybe build a map of the backup of the entries and attach it to the deleted item to be restored
- //later. Or just record them and call _addReferenceToMap on them in revert.
- dojo.forEach(attributes, function(attribute){
- dojo.forEach(this.getValues(item, attribute), function(value){
- if(this.isItem(value)){
- //We have to back up all the references we had to others so they can be restored on a revert.
- if(!item["backupRefs_" + this._reverseRefMap]){
- item["backupRefs_" + this._reverseRefMap] = [];
- }
- item["backupRefs_" + this._reverseRefMap].push({id: this.getIdentity(value), attr: attribute});
- this._removeReferenceFromMap(value, item, attribute);
- }
- }, this);
- }, this);
-
- //Next, see if we have references to this item, if we do, we have to clean them up too.
- var references = item[this._reverseRefMap];
- if(references){
- //Look through all the items noted as references to clean them up.
- for(var itemId in references){
- var containingItem = null;
- if(this._itemsByIdentity){
- containingItem = this._itemsByIdentity[itemId];
- }else{
- containingItem = this._arrayOfAllItems[itemId];
- }
- //We have a reference to a containing item, now we have to process the
- //attributes and clear all references to the item being deleted.
- if(containingItem){
- for(var attribute in references[itemId]){
- var oldValues = this.getValues(containingItem, attribute) || [];
- var newValues = dojo.filter(oldValues, function(possibleItem){
- return !(this.isItem(possibleItem) && this.getIdentity(possibleItem) == identity);
- }, this);
- //Remove the note of the reference to the item and set the values on the modified attribute.
- this._removeReferenceFromMap(item, containingItem, attribute);
- if(newValues.length < oldValues.length){
- this._setValueOrValues(containingItem, attribute, newValues, true);
- }
- }
- }
- }
- }
- }
-
- this._arrayOfAllItems[indexInArrayOfAllItems] = null;
-
- item[this._storeRefPropName] = null;
- if(this._itemsByIdentity){
- delete this._itemsByIdentity[identity];
- }
- this._pending._deletedItems[identity] = item;
-
- //Remove from the toplevel items, if necessary...
- if(item[this._rootItemPropName]){
- this._removeArrayElement(this._arrayOfTopLevelItems, item);
- }
- this.onDelete(item); // dojo.data.api.Notification call
- return true;
- },
-
- setValue: function(/* item */ item, /* attribute-name-string */ attribute, /* almost anything */ value){
- // summary: See dojo.data.api.Write.set()
- return this._setValueOrValues(item, attribute, value, true); // boolean
- },
-
- setValues: function(/* item */ item, /* attribute-name-string */ attribute, /* array */ values){
- // summary: See dojo.data.api.Write.setValues()
- return this._setValueOrValues(item, attribute, values, true); // boolean
- },
-
- unsetAttribute: function(/* item */ item, /* attribute-name-string */ attribute){
- // summary: See dojo.data.api.Write.unsetAttribute()
- return this._setValueOrValues(item, attribute, [], true);
- },
-
- _setValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute, /* anything */ newValueOrValues, /*boolean?*/ callOnSet){
- this._assert(!this._saveInProgress);
-
- // Check for valid arguments
- this._assertIsItem(item);
- this._assert(dojo.isString(attribute));
- this._assert(typeof newValueOrValues !== "undefined");
- // Make sure the user isn't trying to change the item's identity
- var identifierAttribute = this._getIdentifierAttribute();
- if(attribute == identifierAttribute){
- throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");
- }
-
- // To implement the Notification API, we need to make a note of what
- // the old attribute value was, so that we can pass that info when
- // we call the onSet method.
- var oldValueOrValues = this._getValueOrValues(item, attribute);
-
- var identity = this.getIdentity(item);
- if(!this._pending._modifiedItems[identity]){
- // Before we actually change the item, we make a copy of it to
- // record the original state, so that we'll be able to revert if
- // the revert method gets called. If the item has already been
- // modified then there's no need to do this now, since we already
- // have a record of the original state.
- var copyOfItemState = {};
- for(var key in item){
- if((key === this._storeRefPropName) || (key === this._itemNumPropName) || (key === this._rootItemPropName)){
- copyOfItemState[key] = item[key];
- }else if(key === this._reverseRefMap){
- copyOfItemState[key] = dojo.clone(item[key]);
- }else{
- copyOfItemState[key] = item[key].slice(0, item[key].length);
- }
- }
- // Now mark the item as dirty, and save the copy of the original state
- this._pending._modifiedItems[identity] = copyOfItemState;
- }
-
- // Okay, now we can actually change this attribute on the item
- var success = false;
-
- if(dojo.isArray(newValueOrValues) && newValueOrValues.length === 0){
-
- // If we were passed an empty array as the value, that counts
- // as "unsetting" the attribute, so we need to remove this
- // attribute from the item.
- success = delete item[attribute];
- newValueOrValues = undefined; // used in the onSet Notification call below
-
- if(this.referenceIntegrity && oldValueOrValues){
- var oldValues = oldValueOrValues;
- if(!dojo.isArray(oldValues)){
- oldValues = [oldValues];
- }
- for(var i = 0; i < oldValues.length; i++){
- var value = oldValues[i];
- if(this.isItem(value)){
- this._removeReferenceFromMap(value, item, attribute);
- }
- }
- }
- }else{
- var newValueArray;
- if(dojo.isArray(newValueOrValues)){
- var newValues = newValueOrValues;
- // Unfortunately, it's not safe to just do this:
- // newValueArray = newValues;
- // Instead, we need to copy the array, which slice() does very nicely.
- // This is so that our internal data structure won't
- // get corrupted if the user mucks with the values array *after*
- // calling setValues().
- newValueArray = newValueOrValues.slice(0, newValueOrValues.length);
- }else{
- newValueArray = [newValueOrValues];
- }
-
- //We need to handle reference integrity if this is on.
- //In the case of set, we need to see if references were added or removed
- //and update the reference tracking map accordingly.
- if(this.referenceIntegrity){
- if(oldValueOrValues){
- var oldValues = oldValueOrValues;
- if(!dojo.isArray(oldValues)){
- oldValues = [oldValues];
- }
- //Use an associative map to determine what was added/removed from the list.
- //Should be O(n) performant. First look at all the old values and make a list of them
- //Then for any item not in the old list, we add it. If it was already present, we remove it.
- //Then we pass over the map and any references left it it need to be removed (IE, no match in
- //the new values list).
- var map = {};
- dojo.forEach(oldValues, function(possibleItem){
- if(this.isItem(possibleItem)){
- var id = this.getIdentity(possibleItem);
- map[id.toString()] = true;
- }
- }, this);
- dojo.forEach(newValueArray, function(possibleItem){
- if(this.isItem(possibleItem)){
- var id = this.getIdentity(possibleItem);
- if(map[id.toString()]){
- delete map[id.toString()];
- }else{
- this._addReferenceToMap(possibleItem, item, attribute);
- }
- }
- }, this);
- for(var rId in map){
- var removedItem;
- if(this._itemsByIdentity){
- removedItem = this._itemsByIdentity[rId];
- }else{
- removedItem = this._arrayOfAllItems[rId];
- }
- this._removeReferenceFromMap(removedItem, item, attribute);
- }
- }else{
- //Everything is new (no old values) so we have to just
- //insert all the references, if any.
- for(var i = 0; i < newValueArray.length; i++){
- var value = newValueArray[i];
- if(this.isItem(value)){
- this._addReferenceToMap(value, item, attribute);
- }
- }
- }
- }
- item[attribute] = newValueArray;
- success = true;
- }
-
- // Now we make the dojo.data.api.Notification call
- if(callOnSet){
- this.onSet(item, attribute, oldValueOrValues, newValueOrValues);
- }
- return success; // boolean
- },
-
- _addReferenceToMap: function(/*item*/ refItem, /*item*/ parentItem, /*string*/ attribute){
- // summary:
- // Method to add an reference map entry for an item and attribute.
- // description:
- // Method to add an reference map entry for an item and attribute. //
- // refItem:
- // The item that is referenced.
- // parentItem:
- // The item that holds the new reference to refItem.
- // attribute:
- // The attribute on parentItem that contains the new reference.
-
- var parentId = this.getIdentity(parentItem);
- var references = refItem[this._reverseRefMap];
-
- if(!references){
- references = refItem[this._reverseRefMap] = {};
- }
- var itemRef = references[parentId];
- if(!itemRef){
- itemRef = references[parentId] = {};
- }
- itemRef[attribute] = true;
- },
-
- _removeReferenceFromMap: function(/* item */ refItem, /* item */ parentItem, /*strin*/ attribute){
- // summary:
- // Method to remove an reference map entry for an item and attribute.
- // description:
- // Method to remove an reference map entry for an item and attribute. This will
- // also perform cleanup on the map such that if there are no more references at all to
- // the item, its reference object and entry are removed.
- //
- // refItem:
- // The item that is referenced.
- // parentItem:
- // The item holding a reference to refItem.
- // attribute:
- // The attribute on parentItem that contains the reference.
- var identity = this.getIdentity(parentItem);
- var references = refItem[this._reverseRefMap];
- var itemId;
- if(references){
- for(itemId in references){
- if(itemId == identity){
- delete references[itemId][attribute];
- if(this._isEmpty(references[itemId])){
- delete references[itemId];
- }
- }
- }
- if(this._isEmpty(references)){
- delete refItem[this._reverseRefMap];
- }
- }
- },
-
- _dumpReferenceMap: function(){
- // summary:
- // Function to dump the reverse reference map of all items in the store for debug purposes.
- // description:
- // Function to dump the reverse reference map of all items in the store for debug purposes.
- var i;
- for(i = 0; i < this._arrayOfAllItems.length; i++){
- var item = this._arrayOfAllItems[i];
- if(item && item[this._reverseRefMap]){
- console.log("Item: [" + this.getIdentity(item) + "] is referenced by: " + dojo.toJson(item[this._reverseRefMap]));
- }
- }
- },
-
- _getValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute){
- var valueOrValues = undefined;
- if(this.hasAttribute(item, attribute)){
- var valueArray = this.getValues(item, attribute);
- if(valueArray.length == 1){
- valueOrValues = valueArray[0];
- }else{
- valueOrValues = valueArray;
- }
- }
- return valueOrValues;
- },
-
- _flatten: function(/* anything */ value){
- if(this.isItem(value)){
- var item = value;
- // Given an item, return an serializable object that provides a
- // reference to the item.
- // For example, given kermit:
- // var kermit = store.newItem({id:2, name:"Kermit"});
- // we want to return
- // {_reference:2}
- var identity = this.getIdentity(item);
- var referenceObject = {_reference: identity};
- return referenceObject;
- }else{
- if(typeof value === "object"){
- for(var type in this._datatypeMap){
- var typeMap = this._datatypeMap[type];
- if(dojo.isObject(typeMap) && !dojo.isFunction(typeMap)){
- if(value instanceof typeMap.type){
- if(!typeMap.serialize){
- throw new Error("ItemFileWriteStore: No serializer defined for type mapping: [" + type + "]");
- }
- return {_type: type, _value: typeMap.serialize(value)};
- }
- } else if(value instanceof typeMap){
- //SImple mapping, therefore, return as a toString serialization.
- return {_type: type, _value: value.toString()};
- }
- }
- }
- return value;
- }
- },
-
- _getNewFileContentString: function(){
- // summary:
- // Generate a string that can be saved to a file.
- // The result should look similar to:
- // http://trac.dojotoolkit.org/browser/dojo/trunk/tests/data/countries.json
- var serializableStructure = {};
-
- var identifierAttribute = this._getIdentifierAttribute();
- if(identifierAttribute !== Number){
- serializableStructure.identifier = identifierAttribute;
- }
- if(this._labelAttr){
- serializableStructure.label = this._labelAttr;
- }
- serializableStructure.items = [];
- for(var i = 0; i < this._arrayOfAllItems.length; ++i){
- var item = this._arrayOfAllItems[i];
- if(item !== null){
- var serializableItem = {};
- for(var key in item){
- if(key !== this._storeRefPropName && key !== this._itemNumPropName && key !== this._reverseRefMap && key !== this._rootItemPropName){
- var attribute = key;
- var valueArray = this.getValues(item, attribute);
- if(valueArray.length == 1){
- serializableItem[attribute] = this._flatten(valueArray[0]);
- }else{
- var serializableArray = [];
- for(var j = 0; j < valueArray.length; ++j){
- serializableArray.push(this._flatten(valueArray[j]));
- serializableItem[attribute] = serializableArray;
- }
- }
- }
- }
- serializableStructure.items.push(serializableItem);
- }
- }
- var prettyPrint = true;
- return dojo.toJson(serializableStructure, prettyPrint);
- },
-
- _isEmpty: function(something){
- // summary:
- // Function to determine if an array or object has no properties or values.
- // something:
- // The array or object to examine.
- var empty = true;
- if(dojo.isObject(something)){
- var i;
- for(i in something){
- empty = false;
- break;
- }
- }else if(dojo.isArray(something)){
- if(something.length > 0){
- empty = false;
- }
- }
- return empty; //boolean
- },
-
- save: function(/* object */ keywordArgs){
- // summary: See dojo.data.api.Write.save()
- this._assert(!this._saveInProgress);
-
- // this._saveInProgress is set to true, briefly, from when save is first called to when it completes
- this._saveInProgress = true;
-
- var self = this;
- var saveCompleteCallback = function(){
- self._pending = {
- _newItems:{},
- _modifiedItems:{},
- _deletedItems:{}
- };
-
- self._saveInProgress = false; // must come after this._pending is cleared, but before any callbacks
- if(keywordArgs && keywordArgs.onComplete){
- var scope = keywordArgs.scope || dojo.global;
- keywordArgs.onComplete.call(scope);
- }
- };
- var saveFailedCallback = function(err){
- self._saveInProgress = false;
- if(keywordArgs && keywordArgs.onError){
- var scope = keywordArgs.scope || dojo.global;
- keywordArgs.onError.call(scope, err);
- }
- };
-
- if(this._saveEverything){
- var newFileContentString = this._getNewFileContentString();
- this._saveEverything(saveCompleteCallback, saveFailedCallback, newFileContentString);
- }
- if(this._saveCustom){
- this._saveCustom(saveCompleteCallback, saveFailedCallback);
- }
- if(!this._saveEverything && !this._saveCustom){
- // Looks like there is no user-defined save-handler function.
- // That's fine, it just means the datastore is acting as a "mock-write"
- // store -- changes get saved in memory but don't get saved to disk.
- saveCompleteCallback();
- }
- },
-
- revert: function(){
- // summary: See dojo.data.api.Write.revert()
- this._assert(!this._saveInProgress);
-
- var identity;
- for(identity in this._pending._modifiedItems){
- // find the original item and the modified item that replaced it
- var copyOfItemState = this._pending._modifiedItems[identity];
- var modifiedItem = null;
- if(this._itemsByIdentity){
- modifiedItem = this._itemsByIdentity[identity];
- }else{
- modifiedItem = this._arrayOfAllItems[identity];
- }
-
- // Restore the original item into a full-fledged item again, we want to try to
- // keep the same object instance as if we don't it, causes bugs like #9022.
- copyOfItemState[this._storeRefPropName] = this;
- for(key in modifiedItem){
- delete modifiedItem[key];
- }
- dojo.mixin(modifiedItem, copyOfItemState);
- }
- var deletedItem;
- for(identity in this._pending._deletedItems){
- deletedItem = this._pending._deletedItems[identity];
- deletedItem[this._storeRefPropName] = this;
- var index = deletedItem[this._itemNumPropName];
-
- //Restore the reverse refererence map, if any.
- if(deletedItem["backup_" + this._reverseRefMap]){
- deletedItem[this._reverseRefMap] = deletedItem["backup_" + this._reverseRefMap];
- delete deletedItem["backup_" + this._reverseRefMap];
- }
- this._arrayOfAllItems[index] = deletedItem;
- if(this._itemsByIdentity){
- this._itemsByIdentity[identity] = deletedItem;
- }
- if(deletedItem[this._rootItemPropName]){
- this._arrayOfTopLevelItems.push(deletedItem);
- }
- }
- //We have to pass through it again and restore the reference maps after all the
- //undeletes have occurred.
- for(identity in this._pending._deletedItems){
- deletedItem = this._pending._deletedItems[identity];
- if(deletedItem["backupRefs_" + this._reverseRefMap]){
- dojo.forEach(deletedItem["backupRefs_" + this._reverseRefMap], function(reference){
- var refItem;
- if(this._itemsByIdentity){
- refItem = this._itemsByIdentity[reference.id];
- }else{
- refItem = this._arrayOfAllItems[reference.id];
- }
- this._addReferenceToMap(refItem, deletedItem, reference.attr);
- }, this);
- delete deletedItem["backupRefs_" + this._reverseRefMap];
- }
- }
-
- for(identity in this._pending._newItems){
- var newItem = this._pending._newItems[identity];
- newItem[this._storeRefPropName] = null;
- // null out the new item, but don't change the array index so
- // so we can keep using _arrayOfAllItems.length.
- this._arrayOfAllItems[newItem[this._itemNumPropName]] = null;
- if(newItem[this._rootItemPropName]){
- this._removeArrayElement(this._arrayOfTopLevelItems, newItem);
- }
- if(this._itemsByIdentity){
- delete this._itemsByIdentity[identity];
- }
- }
-
- this._pending = {
- _newItems:{},
- _modifiedItems:{},
- _deletedItems:{}
- };
- return true; // boolean
- },
-
- isDirty: function(/* item? */ item){
- // summary: See dojo.data.api.Write.isDirty()
- if(item){
- // return true if the item is dirty
- var identity = this.getIdentity(item);
- return new Boolean(this._pending._newItems[identity] ||
- this._pending._modifiedItems[identity] ||
- this._pending._deletedItems[identity]).valueOf(); // boolean
- }else{
- // return true if the store is dirty -- which means return true
- // if there are any new items, dirty items, or modified items
- if(!this._isEmpty(this._pending._newItems) ||
- !this._isEmpty(this._pending._modifiedItems) ||
- !this._isEmpty(this._pending._deletedItems)){
- return true;
- }
- return false; // boolean
- }
- },
-
-/* dojo.data.api.Notification */
-
- onSet: function(/* item */ item,
- /*attribute-name-string*/ attribute,
- /*object | array*/ oldValue,
- /*object | array*/ newValue){
- // summary: See dojo.data.api.Notification.onSet()
-
- // No need to do anything. This method is here just so that the
- // client code can connect observers to it.
- },
-
- onNew: function(/* item */ newItem, /*object?*/ parentInfo){
- // summary: See dojo.data.api.Notification.onNew()
-
- // No need to do anything. This method is here just so that the
- // client code can connect observers to it.
- },
-
- onDelete: function(/* item */ deletedItem){
- // summary: See dojo.data.api.Notification.onDelete()
-
- // No need to do anything. This method is here just so that the
- // client code can connect observers to it.
- },
-
- close: function(/* object? */ request){
- // summary:
- // Over-ride of base close function of ItemFileReadStore to add in check for store state.
- // description:
- // Over-ride of base close function of ItemFileReadStore to add in check for store state.
- // If the store is still dirty (unsaved changes), then an error will be thrown instead of
- // clearing the internal state for reload from the url.
-
- //Clear if not dirty ... or throw an error
- if(this.clearOnClose){
- if(!this.isDirty()){
- this.inherited(arguments);
- }else{
- //Only throw an error if the store was dirty and we were loading from a url (cannot reload from url until state is saved).
- throw new Error("dojo.data.ItemFileWriteStore: There are unsaved changes present in the store. Please save or revert the changes before invoking close.");
- }
- }
- }
});
-}
-
-
-dojo.i18n._preloadLocalizations("dojo.nls.tt-rss-layer", ["ROOT","ar","ca","cs","da","de","de-de","el","en","en-gb","en-us","es","es-es","fi","fi-fi","fr","fr-fr","he","he-il","hu","it","it-it","ja","ja-jp","ko","ko-kr","nb","nl","nl-nl","pl","pt","pt-br","pt-pt","ru","sk","sl","sv","th","tr","xx","zh","zh-cn","zh-tw"]);
+},
+'*now':function(r){r(['dojo/i18n!*preload*dojo/nls/tt-rss-layer*["ar","ca","cs","da","de-de","el","en-gb","en-us","es-es","fi-fi","fr-fr","he-il","hu","it-it","ja-jp","ko-kr","nl-nl","nb","pl","pt-br","pt-pt","ru","sk","sl","sv","th","tr","zh-tw","zh-cn","ROOT"]']);}
+}});
+define("dojo/tt-rss-layer", [], 1);
diff --git a/lib/dojo/uacss.js b/lib/dojo/uacss.js
index 25b12f4bc..3b8a7c392 100644
--- a/lib/dojo/uacss.js
+++ b/lib/dojo/uacss.js
@@ -4,73 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.uacss"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.uacss"] = true;
-dojo.provide("dojo.uacss");
-
-
-(function(){
- // summary:
- // Applies pre-set CSS classes to the top-level HTML node, based on:
- // - browser (ex: dj_ie)
- // - browser version (ex: dj_ie6)
- // - box model (ex: dj_contentBox)
- // - text direction (ex: dijitRtl)
- //
- // In addition, browser, browser version, and box model are
- // combined with an RTL flag when browser text is RTL. ex: dj_ie-rtl.
-
- var d = dojo,
- html = d.doc.documentElement,
- ie = d.isIE,
- opera = d.isOpera,
- maj = Math.floor,
- ff = d.isFF,
- boxModel = d.boxModel.replace(/-/,''),
-
- classes = {
- dj_ie: ie,
- dj_ie6: maj(ie) == 6,
- dj_ie7: maj(ie) == 7,
- dj_ie8: maj(ie) == 8,
- dj_ie9: maj(ie) == 9,
- dj_quirks: d.isQuirks,
- dj_iequirks: ie && d.isQuirks,
-
- // NOTE: Opera not supported by dijit
- dj_opera: opera,
-
- dj_khtml: d.isKhtml,
-
- dj_webkit: d.isWebKit,
- dj_safari: d.isSafari,
- dj_chrome: d.isChrome,
-
- dj_gecko: d.isMozilla,
- dj_ff3: maj(ff) == 3
- }; // no dojo unsupported browsers
-
- classes["dj_" + boxModel] = true;
-
- // apply browser, browser version, and box model class names
- var classStr = "";
- for(var clz in classes){
- if(classes[clz]){
- classStr += clz + " ";
- }
- }
- html.className = d.trim(html.className + " " + classStr);
-
- // If RTL mode, then add dj_rtl flag plus repeat existing classes with -rtl extension.
- // We can't run the code below until the <body> tag has loaded (so we can check for dir=rtl).
- // Unshift() is to run sniff code before the parser.
- dojo._loaders.unshift(function(){
- if(!dojo._isBodyLtr()){
- var rtlClassStr = "dj_rtl dijitRtl " + classStr.replace(/ /g, "-rtl ")
- html.className = d.trim(html.className + " " + rtlClassStr);
- }
- });
-})();
-
-}
+//>>built
+define("dojo/uacss",["./dom-geometry","./_base/lang","./ready","./_base/sniff","./_base/window"],function(_1,_2,_3,_4,_5){var _6=_5.doc.documentElement,ie=_4("ie"),_7=_4("opera"),_8=Math.floor,ff=_4("ff"),_9=_1.boxModel.replace(/-/,""),_a={"dj_ie":ie,"dj_ie6":_8(ie)==6,"dj_ie7":_8(ie)==7,"dj_ie8":_8(ie)==8,"dj_ie9":_8(ie)==9,"dj_quirks":_4("quirks"),"dj_iequirks":ie&&_4("quirks"),"dj_opera":_7,"dj_khtml":_4("khtml"),"dj_webkit":_4("webkit"),"dj_safari":_4("safari"),"dj_chrome":_4("chrome"),"dj_gecko":_4("mozilla"),"dj_ff3":_8(ff)==3};_a["dj_"+_9]=true;var _b="";for(var _c in _a){if(_a[_c]){_b+=_c+" ";}}_6.className=_2.trim(_6.className+" "+_b);_3(90,function(){if(!_1.isBodyLtr()){var _d="dj_rtl dijitRtl "+_b.replace(/ /g,"-rtl ");_6.className=_2.trim(_6.className+" "+_d+"dj_rtl dijitRtl "+_b.replace(/ /g,"-rtl "));}});return _4;}); \ No newline at end of file
diff --git a/lib/dojo/uacss.js.uncompressed.js b/lib/dojo/uacss.js.uncompressed.js
new file mode 100644
index 000000000..ccef8672a
--- /dev/null
+++ b/lib/dojo/uacss.js.uncompressed.js
@@ -0,0 +1,66 @@
+define("dojo/uacss", ["./dom-geometry", "./_base/lang", "./ready", "./_base/sniff", "./_base/window"],
+ function(geometry, lang, ready, has, baseWindow){
+ // module:
+ // dojo/uacss
+ // summary:
+ // Applies pre-set CSS classes to the top-level HTML node, based on:
+ // - browser (ex: dj_ie)
+ // - browser version (ex: dj_ie6)
+ // - box model (ex: dj_contentBox)
+ // - text direction (ex: dijitRtl)
+ //
+ // In addition, browser, browser version, and box model are
+ // combined with an RTL flag when browser text is RTL. ex: dj_ie-rtl.
+
+ var
+ html = baseWindow.doc.documentElement,
+ ie = has("ie"),
+ opera = has("opera"),
+ maj = Math.floor,
+ ff = has("ff"),
+ boxModel = geometry.boxModel.replace(/-/,''),
+
+ classes = {
+ "dj_ie": ie,
+ "dj_ie6": maj(ie) == 6,
+ "dj_ie7": maj(ie) == 7,
+ "dj_ie8": maj(ie) == 8,
+ "dj_ie9": maj(ie) == 9,
+ "dj_quirks": has("quirks"),
+ "dj_iequirks": ie && has("quirks"),
+
+ // NOTE: Opera not supported by dijit
+ "dj_opera": opera,
+
+ "dj_khtml": has("khtml"),
+
+ "dj_webkit": has("webkit"),
+ "dj_safari": has("safari"),
+ "dj_chrome": has("chrome"),
+
+ "dj_gecko": has("mozilla"),
+ "dj_ff3": maj(ff) == 3
+ }; // no dojo unsupported browsers
+
+ classes["dj_" + boxModel] = true;
+
+ // apply browser, browser version, and box model class names
+ var classStr = "";
+ for(var clz in classes){
+ if(classes[clz]){
+ classStr += clz + " ";
+ }
+ }
+ html.className = lang.trim(html.className + " " + classStr);
+
+ // If RTL mode, then add dj_rtl flag plus repeat existing classes with -rtl extension.
+ // We can't run the code below until the <body> tag has loaded (so we can check for dir=rtl).
+ // priority is 90 to run ahead of parser priority of 100
+ ready(90, function(){
+ if(!geometry.isBodyLtr()){
+ var rtlClassStr = "dj_rtl dijitRtl " + classStr.replace(/ /g, "-rtl ");
+ html.className = lang.trim(html.className + " " + rtlClassStr + "dj_rtl dijitRtl " + classStr.replace(/ /g, "-rtl "));
+ }
+ });
+ return has;
+});
diff --git a/lib/dojo/window.js b/lib/dojo/window.js
index 4e363faba..dfa485a0c 100644
--- a/lib/dojo/window.js
+++ b/lib/dojo/window.js
@@ -4,142 +4,5 @@
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.window"] = true;
-dojo.provide("dojo.window");
-
-dojo.getObject("window", true, dojo);
-
-dojo.window.getBox = function(){
- // summary:
- // Returns the dimensions and scroll position of the viewable area of a browser window
-
- var scrollRoot = (dojo.doc.compatMode == 'BackCompat') ? dojo.body() : dojo.doc.documentElement;
-
- // get scroll position
- var scroll = dojo._docScroll(); // scrollRoot.scrollTop/Left should work
- return { w: scrollRoot.clientWidth, h: scrollRoot.clientHeight, l: scroll.x, t: scroll.y };
-};
-
-dojo.window.get = function(doc){
- // summary:
- // Get window object associated with document doc
-
- // In some IE versions (at least 6.0), document.parentWindow does not return a
- // reference to the real window object (maybe a copy), so we must fix it as well
- // We use IE specific execScript to attach the real window reference to
- // document._parentWindow for later use
- if(dojo.isIE && window !== document.parentWindow){
- /*
- In IE 6, only the variable "window" can be used to connect events (others
- may be only copies).
- */
- doc.parentWindow.execScript("document._parentWindow = window;", "Javascript");
- //to prevent memory leak, unset it after use
- //another possibility is to add an onUnload handler which seems overkill to me (liucougar)
- var win = doc._parentWindow;
- doc._parentWindow = null;
- return win; // Window
- }
-
- return doc.parentWindow || doc.defaultView; // Window
-};
-
-dojo.window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
- // summary:
- // Scroll the passed node into view, if it is not already.
-
- // don't rely on node.scrollIntoView working just because the function is there
-
- try{ // catch unexpected/unrecreatable errors (#7808) since we can recover using a semi-acceptable native method
- node = dojo.byId(node);
- var doc = node.ownerDocument || dojo.doc,
- body = doc.body || dojo.body(),
- html = doc.documentElement || body.parentNode,
- isIE = dojo.isIE, isWK = dojo.isWebKit;
- // if an untested browser, then use the native method
- if((!(dojo.isMoz || isIE || isWK || dojo.isOpera) || node == body || node == html) && (typeof node.scrollIntoView != "undefined")){
- node.scrollIntoView(false); // short-circuit to native if possible
- return;
- }
- var backCompat = doc.compatMode == 'BackCompat',
- clientAreaRoot = (isIE >= 9 && node.ownerDocument.parentWindow.frameElement)
- ? ((html.clientHeight > 0 && html.clientWidth > 0 && (body.clientHeight == 0 || body.clientWidth == 0 || body.clientHeight > html.clientHeight || body.clientWidth > html.clientWidth)) ? html : body)
- : (backCompat ? body : html),
- scrollRoot = isWK ? body : clientAreaRoot,
- rootWidth = clientAreaRoot.clientWidth,
- rootHeight = clientAreaRoot.clientHeight,
- rtl = !dojo._isBodyLtr(),
- nodePos = pos || dojo.position(node),
- el = node.parentNode,
- isFixed = function(el){
- return ((isIE <= 6 || (isIE && backCompat))? false : (dojo.style(el, 'position').toLowerCase() == "fixed"));
- };
- if(isFixed(node)){ return; } // nothing to do
-
- while(el){
- if(el == body){ el = scrollRoot; }
- var elPos = dojo.position(el),
- fixedPos = isFixed(el);
-
- if(el == scrollRoot){
- elPos.w = rootWidth; elPos.h = rootHeight;
- if(scrollRoot == html && isIE && rtl){ elPos.x += scrollRoot.offsetWidth-elPos.w; } // IE workaround where scrollbar causes negative x
- if(elPos.x < 0 || !isIE){ elPos.x = 0; } // IE can have values > 0
- if(elPos.y < 0 || !isIE){ elPos.y = 0; }
- }else{
- var pb = dojo._getPadBorderExtents(el);
- elPos.w -= pb.w; elPos.h -= pb.h; elPos.x += pb.l; elPos.y += pb.t;
- var clientSize = el.clientWidth,
- scrollBarSize = elPos.w - clientSize;
- if(clientSize > 0 && scrollBarSize > 0){
- elPos.w = clientSize;
- elPos.x += (rtl && (isIE || el.clientLeft > pb.l/*Chrome*/)) ? scrollBarSize : 0;
- }
- clientSize = el.clientHeight;
- scrollBarSize = elPos.h - clientSize;
- if(clientSize > 0 && scrollBarSize > 0){
- elPos.h = clientSize;
- }
- }
- if(fixedPos){ // bounded by viewport, not parents
- if(elPos.y < 0){
- elPos.h += elPos.y; elPos.y = 0;
- }
- if(elPos.x < 0){
- elPos.w += elPos.x; elPos.x = 0;
- }
- if(elPos.y + elPos.h > rootHeight){
- elPos.h = rootHeight - elPos.y;
- }
- if(elPos.x + elPos.w > rootWidth){
- elPos.w = rootWidth - elPos.x;
- }
- }
- // calculate overflow in all 4 directions
- var l = nodePos.x - elPos.x, // beyond left: < 0
- t = nodePos.y - Math.max(elPos.y, 0), // beyond top: < 0
- r = l + nodePos.w - elPos.w, // beyond right: > 0
- bot = t + nodePos.h - elPos.h; // beyond bottom: > 0
- if(r * l > 0){
- var s = Math[l < 0? "max" : "min"](l, r);
- if(rtl && ((isIE == 8 && !backCompat) || isIE >= 9)){ s = -s; }
- nodePos.x += el.scrollLeft;
- el.scrollLeft += s;
- nodePos.x -= el.scrollLeft;
- }
- if(bot * t > 0){
- nodePos.y += el.scrollTop;
- el.scrollTop += Math[t < 0? "max" : "min"](t, bot);
- nodePos.y -= el.scrollTop;
- }
- el = (el != scrollRoot) && !fixedPos && el.parentNode;
- }
- }catch(error){
- console.error('scrollIntoView: ' + error);
- node.scrollIntoView(false);
- }
-};
-
-}
+//>>built
+define("dojo/window",["./_base/lang","./_base/sniff","./_base/window","./dom","./dom-geometry","./dom-style"],function(_1,_2,_3,_4,_5,_6){var _7=_1.getObject("dojo.window",true);_7.getBox=function(){var _8=(_3.doc.compatMode=="BackCompat")?_3.body():_3.doc.documentElement,_9=_5.docScroll(),w,h;if(_2("touch")){var _a=_3.doc.parentWindow||_3.doc.defaultView;w=_a.innerWidth||_8.clientWidth;h=_a.innerHeight||_8.clientHeight;}else{w=_8.clientWidth;h=_8.clientHeight;}return {l:_9.x,t:_9.y,w:w,h:h};};_7.get=function(_b){if(_2("ie")&&_7!==document.parentWindow){_b.parentWindow.execScript("document._parentWindow = window;","Javascript");var _c=_b._parentWindow;_b._parentWindow=null;return _c;}return _b.parentWindow||_b.defaultView;};_7.scrollIntoView=function(_d,_e){try{_d=_4.byId(_d);var _f=_d.ownerDocument||_3.doc,_10=_f.body||_3.body(),_11=_f.documentElement||_10.parentNode,_12=_2("ie"),_13=_2("webkit");if((!(_2("mozilla")||_12||_13||_2("opera"))||_d==_10||_d==_11)&&(typeof _d.scrollIntoView!="undefined")){_d.scrollIntoView(false);return;}var _14=_f.compatMode=="BackCompat",_15=(_12>=9&&_d.ownerDocument.parentWindow.frameElement)?((_11.clientHeight>0&&_11.clientWidth>0&&(_10.clientHeight==0||_10.clientWidth==0||_10.clientHeight>_11.clientHeight||_10.clientWidth>_11.clientWidth))?_11:_10):(_14?_10:_11),_16=_13?_10:_15,_17=_15.clientWidth,_18=_15.clientHeight,rtl=!_5.isBodyLtr(),_19=_e||_5.position(_d),el=_d.parentNode,_1a=function(el){return ((_12<=6||(_12&&_14))?false:(_6.get(el,"position").toLowerCase()=="fixed"));};if(_1a(_d)){return;}while(el){if(el==_10){el=_16;}var _1b=_5.position(el),_1c=_1a(el);if(el==_16){_1b.w=_17;_1b.h=_18;if(_16==_11&&_12&&rtl){_1b.x+=_16.offsetWidth-_1b.w;}if(_1b.x<0||!_12){_1b.x=0;}if(_1b.y<0||!_12){_1b.y=0;}}else{var pb=_5.getPadBorderExtents(el);_1b.w-=pb.w;_1b.h-=pb.h;_1b.x+=pb.l;_1b.y+=pb.t;var _1d=el.clientWidth,_1e=_1b.w-_1d;if(_1d>0&&_1e>0){_1b.w=_1d;_1b.x+=(rtl&&(_12||el.clientLeft>pb.l))?_1e:0;}_1d=el.clientHeight;_1e=_1b.h-_1d;if(_1d>0&&_1e>0){_1b.h=_1d;}}if(_1c){if(_1b.y<0){_1b.h+=_1b.y;_1b.y=0;}if(_1b.x<0){_1b.w+=_1b.x;_1b.x=0;}if(_1b.y+_1b.h>_18){_1b.h=_18-_1b.y;}if(_1b.x+_1b.w>_17){_1b.w=_17-_1b.x;}}var l=_19.x-_1b.x,t=_19.y-Math.max(_1b.y,0),r=l+_19.w-_1b.w,bot=t+_19.h-_1b.h;if(r*l>0){var s=Math[l<0?"max":"min"](l,r);if(rtl&&((_12==8&&!_14)||_12>=9)){s=-s;}_19.x+=el.scrollLeft;el.scrollLeft+=s;_19.x-=el.scrollLeft;}if(bot*t>0){_19.y+=el.scrollTop;el.scrollTop+=Math[t<0?"max":"min"](t,bot);_19.y-=el.scrollTop;}el=(el!=_16)&&!_1c&&el.parentNode;}}catch(error){console.error("scrollIntoView: "+error);_d.scrollIntoView(false);}};return _7;}); \ No newline at end of file
diff --git a/lib/dojo/window.js.uncompressed.js b/lib/dojo/window.js.uncompressed.js
new file mode 100644
index 000000000..6b343adf9
--- /dev/null
+++ b/lib/dojo/window.js.uncompressed.js
@@ -0,0 +1,169 @@
+define("dojo/window", ["./_base/lang", "./_base/sniff", "./_base/window", "./dom", "./dom-geometry", "./dom-style"],
+ function(lang, has, baseWindow, dom, geom, style) {
+
+// module:
+// dojo/window
+// summary:
+// TODOC
+
+var window = lang.getObject("dojo.window", true);
+
+/*=====
+dojo.window = {
+ // summary:
+ // TODO
+};
+window = dojo.window;
+=====*/
+
+window.getBox = function(){
+ // summary:
+ // Returns the dimensions and scroll position of the viewable area of a browser window
+
+ var
+ scrollRoot = (baseWindow.doc.compatMode == 'BackCompat') ? baseWindow.body() : baseWindow.doc.documentElement,
+ // get scroll position
+ scroll = geom.docScroll(), // scrollRoot.scrollTop/Left should work
+ w, h;
+
+ if(has("touch")){ // if(scrollbars not supported)
+ var uiWindow = baseWindow.doc.parentWindow || baseWindow.doc.defaultView; // use UI window, not dojo.global window. baseWindow.doc.parentWindow probably not needed since it's not defined for webkit
+ // on mobile, scrollRoot.clientHeight <= uiWindow.innerHeight <= scrollRoot.offsetHeight, return uiWindow.innerHeight
+ w = uiWindow.innerWidth || scrollRoot.clientWidth; // || scrollRoot.clientXXX probably never evaluated
+ h = uiWindow.innerHeight || scrollRoot.clientHeight;
+ }else{
+ // on desktops, scrollRoot.clientHeight <= scrollRoot.offsetHeight <= uiWindow.innerHeight, return scrollRoot.clientHeight
+ // uiWindow.innerWidth/Height includes the scrollbar and cannot be used
+ w = scrollRoot.clientWidth;
+ h = scrollRoot.clientHeight;
+ }
+ return {
+ l: scroll.x,
+ t: scroll.y,
+ w: w,
+ h: h
+ };
+};
+
+window.get = function(doc){
+ // summary:
+ // Get window object associated with document doc
+
+ // In some IE versions (at least 6.0), document.parentWindow does not return a
+ // reference to the real window object (maybe a copy), so we must fix it as well
+ // We use IE specific execScript to attach the real window reference to
+ // document._parentWindow for later use
+ if(has("ie") && window !== document.parentWindow){
+ /*
+ In IE 6, only the variable "window" can be used to connect events (others
+ may be only copies).
+ */
+ doc.parentWindow.execScript("document._parentWindow = window;", "Javascript");
+ //to prevent memory leak, unset it after use
+ //another possibility is to add an onUnload handler which seems overkill to me (liucougar)
+ var win = doc._parentWindow;
+ doc._parentWindow = null;
+ return win; // Window
+ }
+
+ return doc.parentWindow || doc.defaultView; // Window
+};
+
+window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
+ // summary:
+ // Scroll the passed node into view, if it is not already.
+
+ // don't rely on node.scrollIntoView working just because the function is there
+
+ try{ // catch unexpected/unrecreatable errors (#7808) since we can recover using a semi-acceptable native method
+ node = dom.byId(node);
+ var doc = node.ownerDocument || baseWindow.doc,
+ body = doc.body || baseWindow.body(),
+ html = doc.documentElement || body.parentNode,
+ isIE = has("ie"), isWK = has("webkit");
+ // if an untested browser, then use the native method
+ if((!(has("mozilla") || isIE || isWK || has("opera")) || node == body || node == html) && (typeof node.scrollIntoView != "undefined")){
+ node.scrollIntoView(false); // short-circuit to native if possible
+ return;
+ }
+ var backCompat = doc.compatMode == 'BackCompat',
+ clientAreaRoot = (isIE >= 9 && node.ownerDocument.parentWindow.frameElement)
+ ? ((html.clientHeight > 0 && html.clientWidth > 0 && (body.clientHeight == 0 || body.clientWidth == 0 || body.clientHeight > html.clientHeight || body.clientWidth > html.clientWidth)) ? html : body)
+ : (backCompat ? body : html),
+ scrollRoot = isWK ? body : clientAreaRoot,
+ rootWidth = clientAreaRoot.clientWidth,
+ rootHeight = clientAreaRoot.clientHeight,
+ rtl = !geom.isBodyLtr(),
+ nodePos = pos || geom.position(node),
+ el = node.parentNode,
+ isFixed = function(el){
+ return ((isIE <= 6 || (isIE && backCompat))? false : (style.get(el, 'position').toLowerCase() == "fixed"));
+ };
+ if(isFixed(node)){ return; } // nothing to do
+
+ while(el){
+ if(el == body){ el = scrollRoot; }
+ var elPos = geom.position(el),
+ fixedPos = isFixed(el);
+
+ if(el == scrollRoot){
+ elPos.w = rootWidth; elPos.h = rootHeight;
+ if(scrollRoot == html && isIE && rtl){ elPos.x += scrollRoot.offsetWidth-elPos.w; } // IE workaround where scrollbar causes negative x
+ if(elPos.x < 0 || !isIE){ elPos.x = 0; } // IE can have values > 0
+ if(elPos.y < 0 || !isIE){ elPos.y = 0; }
+ }else{
+ var pb = geom.getPadBorderExtents(el);
+ elPos.w -= pb.w; elPos.h -= pb.h; elPos.x += pb.l; elPos.y += pb.t;
+ var clientSize = el.clientWidth,
+ scrollBarSize = elPos.w - clientSize;
+ if(clientSize > 0 && scrollBarSize > 0){
+ elPos.w = clientSize;
+ elPos.x += (rtl && (isIE || el.clientLeft > pb.l/*Chrome*/)) ? scrollBarSize : 0;
+ }
+ clientSize = el.clientHeight;
+ scrollBarSize = elPos.h - clientSize;
+ if(clientSize > 0 && scrollBarSize > 0){
+ elPos.h = clientSize;
+ }
+ }
+ if(fixedPos){ // bounded by viewport, not parents
+ if(elPos.y < 0){
+ elPos.h += elPos.y; elPos.y = 0;
+ }
+ if(elPos.x < 0){
+ elPos.w += elPos.x; elPos.x = 0;
+ }
+ if(elPos.y + elPos.h > rootHeight){
+ elPos.h = rootHeight - elPos.y;
+ }
+ if(elPos.x + elPos.w > rootWidth){
+ elPos.w = rootWidth - elPos.x;
+ }
+ }
+ // calculate overflow in all 4 directions
+ var l = nodePos.x - elPos.x, // beyond left: < 0
+ t = nodePos.y - Math.max(elPos.y, 0), // beyond top: < 0
+ r = l + nodePos.w - elPos.w, // beyond right: > 0
+ bot = t + nodePos.h - elPos.h; // beyond bottom: > 0
+ if(r * l > 0){
+ var s = Math[l < 0? "max" : "min"](l, r);
+ if(rtl && ((isIE == 8 && !backCompat) || isIE >= 9)){ s = -s; }
+ nodePos.x += el.scrollLeft;
+ el.scrollLeft += s;
+ nodePos.x -= el.scrollLeft;
+ }
+ if(bot * t > 0){
+ nodePos.y += el.scrollTop;
+ el.scrollTop += Math[t < 0? "max" : "min"](t, bot);
+ nodePos.y -= el.scrollTop;
+ }
+ el = (el != scrollRoot) && !fixedPos && el.parentNode;
+ }
+ }catch(error){
+ console.error('scrollIntoView: ' + error);
+ node.scrollIntoView(false);
+ }
+};
+
+return window;
+});
diff --git a/tt-rss.css b/tt-rss.css
index 30f94d288..b3ba4315f 100644
--- a/tt-rss.css
+++ b/tt-rss.css
@@ -1254,7 +1254,7 @@ div.fatalError textarea {
margin : 0px;
border-width : 0px;
white-space: nowrap;
- font-size : 12px;
+ font-size : 11px;
}
#header {